Las funciones, talvez es la parte más importante en un lenguaje de programación, de ahí, la importancia de saber cómo funcionan y como se pueden crear y usar. en microbit, las funciones son bloques que encajan en otros bloques. hay una gran variedad, clasificadas según la actividad que hacen. en este apartado veremos su rol y como crear y usar funciones.

 

Se puede generalizar que casi todos los bloques en Makecode son funciones. Para entender el rol de una función, vamos a ver un ejemplo práctico. Supongamos que tienes un proyecto donde es necesario mostrar el “nombre y edad” de una persona como el mostrado en el siguiente programa:

 


 

 

 

Mirando en los bloques podemos observar que, al mostrar el nombre y la edad, hay 3 sectores de bloques “muy similares” como mostrado en la siguiente imagen:

 


 

 

 

Aquí es donde son útiles las funciones, pues podemos organizar mejor el programa creando funciones para estos bloques similares. Para hacer esto, vaya a la caja de herramientas y de click en el botón: “Avanzado”, como mostrado en la siguiente imagen:

 


 

 

 

Después, de click en el botón: “Funciones”, como mostrado en la siguiente imagen:

 

 


 

 

 

Aparecerá una venta llamada: “Funciones”, con un botón llamado: “crear una función…”, como mostrado en la siguiente imagen:

 


 

 

 

Al dar click en el botón: “crear función”, aparecerá una ventana como la mostrada en la siguiente imagen:

 


| Clique na imagem para ampliar |

 

 

En esta ventana podemos dar un nombre a la función que se desea crear. Es importante dar el nombre de la función de acuerdo con la tarea que la función va a realizar. Por ejemplo, para los bloques:

 


 

 

 

Podemos dar un nombre como: “UsuarioMaria”. Cuando creamos una función, aparecerá en el editor de bloques, un bloque como muestra la siguiente imagen:

 


 

 

 

También, aparecerá un bloque en el menú: “funciones”, representando la función creada y anteponiendo la palabra: “llamada” al nombre dado a la función. Esto se repite por cada función creada. Observe la siguiente figura:

 


 

 

 

Así, cree 3 funciones como mostrado en la siguiente imagen:

 


 

 

 

Después, encaje en cada función los bloques correspondientes a cada usuario como mostrado en la siguiente imagen:

 

 


 

 

 

Y observe que en el menú: “funciones”, ahora aparecen 3 bloques con los respectivos nombres dados a cada función, antepuesto de la palabra: “llamada”, como se ve en la siguiente imagen:

 


 

 

Ahora, arrastre y encaje en el bloque: “para siempre”, estas funciones como mostrado en la siguiente imagen:

 


 

 

 

Podemos observar que este programa funciona igual al proyecto inicialmente propuesto, con la diferencia que ahora usamos funciones, permitiendo una mejor organización del proyecto. Cuando los proyectos son muy grandes, las funciones ayudan a organizar mejor los proyectos.

 

 

PASANDO PARAMETROS A FUNCIONES.

 

Talvez la ventaja más grande de las funciones está en el hecho de poderle pasar parámetros o datos a las funciones. Los “tipos” de datos que pueden ser pasados a una función, son los siguientes:

• Booleano.

• Numero.

• Texto.

• Array.

• LedSprite.

• Imagen.

Observa la ventana: “Editar función”, la cual tiene una opción: “Añadir un parámetro”, para agregar parámetros a la función, como mostrado en la siguiente imagen:

 


| Clique na imagem para ampliar |

 

 

Veamos los parámetros en la práctica. Tomemos como ejemplo el proyecto donde mostramos el “nombre y la edad” de los usuarios. Siendo así, podemos crear una función que reciba como parámetros el: “nombre” y la “edad”. Notemos que el dato: “nombre” es de tipo “texto” y el dato: “edad” es de tipo “entero”. Entonces vaya al menú: “funciones” y cree una función que reciba 2 parámetros (datos) como mostrado en la siguiente imagen:

 


| Clique na imagem para ampliar |

 

 

Ahora, en el menú: “funciones”, aparecerá una función llamada: “usuario”, la cual recibe 2 parámetros como mostrado en la siguiente imagen:

 


 

 

 

En el editor de bloque aparecerá un bloque llamado: “función usuario nombre edad”, como se puede ver en la siguiente imagen:

 


 

 

 

Ahora, llene la función con los bloques que mostraran el nombre y la edad como se observa en la siguiente imagen:

 


 

 

 

Para llevar los parámetros a los bloques que los usan, de click en el parámetro y arrástrelo hasta donde va a ser usado, como mostrado en la siguiente imagen:

 


 

 

 

Ahora podemos usar la función: “usuario” y enviar como parámetro un nombre y la edad como se muestra en el siguiente programa:

 


| Clique na imagem para ampliar |

 

 

Como se puede observar, la función cumple con su actividad como si estuviera en el bucle (loop) principal. Esto se debe a que cuando usamos cualquier función, el programa pasa el control del procesador a la función que llama (call) y se ejecutan las instrucciones y bloques de igual manera como si estuviera en el bucle principal. De ahí la gran potencia de las funciones, pues permiten organizar los programas de cualquier proyecto en actividades o funciones específicas y además podemos pasar parámetros aumentando más aun su rol.

Volviendo al proyecto inicial de mostrar nombres y edades, se puede construir un programa como el siguiente, pero usando funciones y parámetros:

 


| Clique na imagem para ampliar |

 

 

Al comparar los 2 modelos de programación, podemos sacar algunas conclusiones interesantes:

• Usando funciones el programa es más organizado.

• Usando funciones se reutiliza partes de bloques de un programa.

• Usando funciones se necesitan menos bloques de programa.

• Usando funciones podemos crear un programa similar al diagrama de actividades.

• Usando funciones hay menos riesgos de cometer errores de programación.

• Además, se pueden colapsar las funciones para tener una mejor visual en el editor de bloques.

La siguiente figura muestra el mismo programa sin funciones y con funciones:

 

 


| Clique na imagem para ampliar |

 

 

Para colapsar las funciones de click en el circulo mostrado a la derecha del nombre de la función. El siguiente programa es igual al mostrado anteriormente, pero con la función colapsada:

 


| Clique na imagem para ampliar |

 

 

Para volver a desplegar la función, de click en el circulo a la derecha del nombre de la función.

Al usar funciones, se adapta mejor un programa al diagrama de actividades. Por ejemplo, el diagrama de actividades para el proyecto visto, sería similar al siguiente:

 

 


 

 

 

Observando en el diagrama de actividades, vemos que estas se ejecutan en forma secuencial y siempre se repiten. Podemos hacer un programa que muestre las informaciones de usuario (nombre y edad) dependiendo de algo que suceda en la tarjeta microbit. El siguiente programa muestra el usuario, dependiendo si se presionó algún botón o si se ajito la tarjeta:

 


| Clique na imagem para ampliar |

 

 

El diagrama de atividades para este programa seria similar al seguinte:

 

 


| Clique na imagem para ampliar |

 

 

 

CLASIFICACION DE FUNCIONES.

 

El editor de bloques “Makecode” tiene disponibilidad de muchas funciones listas para ser usadas, organizadas por menús de acuerdo a su clase de actividad que realiza. Observa en la siguiente figura como están clasificadas las funciones:

 


 

 

 

Estas funciones están dirigidas a sacar el mejor provecho del hardware de la tarjeta microbit:

 

 


 

 

 

Además de las funciones encontradas en el menú, puedes ir al menú: “Extensiones” y encontrar funciones específicas para muchos propósitos:

 


 

 

 

Algunos textos llaman estas extensiones de: librerías o bibliotecas. La siguiente figura muestra estas extensiones de funciones clasificadas según algún propósito:

 


| Clique na imagem para ampliar |

 

 

Para usar cualquiera de estas extensiones o librerías, basta seleccionarla y automáticamente aparecerá en el menú.

 

 

DEVOLVIENDO UN DATO DESDE UNA FUNCIÓN.

 

Es posible devolver un dato desde una función. Se puede devolver cualquier tipo de dato: texto, numero, booleano, imagen, etc. Veamos un ejemplo práctico. Supongamos que queremos crear una función para calcular el porcentaje de un número. Así, necesitamos una función que reciba 2 parámetros, una para el numero a calcular y otra para el porcentaje. El siguiente programa muestra como calcular el porcentaje:

 


| Clique na imagem para ampliar |

 

 

Para hacer esto, cree una variable llamada: “resultado” y una función llamada: “porcentaje”. Llene la función como mostrado en el programa. Observe que primero multiplicamos el numero por el porcentaje y guardamos el resultado en la variable: “resultado”. Después, dividimos por 100 el resultado y volvemos a guardar el resultado en la variable: “resultado”. Después usamos el bloque: “devuelve” y como dato a devolver usamos la variable: “resultado”. Ahora, ya la podemos usar la función: “porcentaje” en el bucle (loop) principal y ver su funcionamiento. He creado una variable llamada: “resultado”, con fines didácticos, para acumular el valor de la operación de multiplicación, pero podemos también programar la función: “porcentaje”, como mostrado en el siguiente programa:

 


| Clique na imagem para ampliar |

 

 

Podemos presidir, es decir no usar la variable: “resultado”, para obtener el mismo resultado de los programas anteriores como muestra la siguiente imagen:

 


| Clique na imagem para ampliar |

 

 

Una función puede devolver cualquier tipo de datos. El bloque: “devuelve” nos permite hacer esto y la encontramos en el menú: “funciones” como muestra la siguiente imagen:

 


 

 

 

Todos los bloques con una forma arredondeada,

 


 

 

 

retornan o devuelven algún tipo de dato, como se muestra en los bloques de la siguiente imagen:

 


 

 

 

Los bloques con forma de rombo, también retornan un dato booleano (verdadero o falso).

 


 

 

Como conclusión, podemos notar que todos los bloques usados en programar la tarjeta microbit son funciones. Algunas no reciben parámetros, otras si, otras devuelven algún dato, otras no. Podemos crear o inventar nuestras propias funciones y dar a los proyectos mejor organización y legibilidad.

 

 

 

18.934MBMemory Usage39.8msRequest Duration
Joomla! Version5.2.3
PHP Version8.3.20
Identityguest
Response200
Templatecassiopeia
Database
Server
mysql
Version
10.5.22-MariaDB
Collation
latin1_swedish_ci
Conn Collation
utf8mb4_general_ci
$_GET
[]
$_POST
[]
$_SESSION
array:1 [ "joomla" => "***redacted***" ]
$_COOKIE
array:1 [ "c2123392c06423339225f3431360b7e6" => "dlk6h6qq8mi93414kshadhnlvp" ]
$_SERVER
array:52 [ "USER" => "apache" "HOME" => "/usr/share/httpd" "SCRIPT_NAME" => "/index.php" "RE...
session
array:3 [ "counter" => 4 "timer" => array:3 [ "start" => 1751697985 "last" => 1751697986...
registry
array:3 [ "data" => [] "initialized" => false "separator" => "." ]
user
array:21 [ "id" => 0 "name" => null "username" => null "email" => null "password" => "***r...
  • afterLoad (85.55KB) (317μs)
  • afterInitialise (1.14MB) (3.59ms)
  • afterRoute (123.27KB) (808μs)
  • beforeRenderComponent com_content (100.79KB) (423μs)
  • Before Access::preloadComponents (all components) (33.45KB) (202μs)
  • After Access::preloadComponents (all components) (107.06KB) (361μs)
  • Before Access::preloadPermissions (com_content) (1.57KB) (8μs)
  • After Access::preloadPermissions (com_content) (16.22MB) (19.49ms)
  • Before Access::getAssetRules (id:26961 name:com_content.article.30602) (514.65KB) (801μs)
  • After Access::getAssetRules (id:26961 name:com_content.article.30602) (7.38KB) (33μs)
  • afterRenderComponent com_content (438.08KB) (6.23ms)
  • afterDispatch (2.25KB) (48μs)
  • beforeRenderRawModule mod_articles_category (Banco de Circuitos) (358.44KB) (1.59ms)
  • afterRenderRawModule mod_articles_category (Banco de Circuitos) (79.43KB) (330μs)
  • beforeRenderRawModule mod_finder (Busca_inteligente) (5.9KB) (89μs)
  • afterRenderRawModule mod_finder (Busca_inteligente) (64.9KB) (1.13ms)
  • beforeRenderModule mod_articles_category (Banco de Circuitos) (9.27KB) (555μs)
  • afterRenderModule mod_articles_category (Banco de Circuitos) (5.47KB) (68μs)
  • beforeRenderModule mod_finder (Busca_inteligente) (6.21KB) (191μs)
  • afterRenderModule mod_finder (Busca_inteligente) (4.75KB) (50μs)
  • afterRender (285.92KB) (3.37ms)
  • 1 x After Access::preloadPermissions (com_content) (16.22MB) (48.98%)
    19.49ms
    1 x afterRenderComponent com_content (438.08KB) (15.64%)
    6.23ms
    1 x afterInitialise (1.14MB) (9.01%)
    3.59ms
    1 x afterRender (285.92KB) (8.46%)
    3.37ms
    1 x beforeRenderRawModule mod_articles_category (Banco de Circuitos) (358.44KB) (4%)
    1.59ms
    1 x afterRenderRawModule mod_finder (Busca_inteligente) (64.9KB) (2.85%)
    1.13ms
    1 x afterRoute (123.27KB) (2.03%)
    808μs
    1 x Before Access::getAssetRules (id:26961 name:com_content.article.30602) (514.65KB) (2.01%)
    801μs
    1 x beforeRenderModule mod_articles_category (Banco de Circuitos) (9.27KB) (1.39%)
    555μs
    1 x beforeRenderComponent com_content (100.79KB) (1.06%)
    423μs
    1 x After Access::preloadComponents (all components) (107.06KB) (0.91%)
    361μs
    1 x afterRenderRawModule mod_articles_category (Banco de Circuitos) (79.43KB) (0.83%)
    330μs
    1 x afterLoad (85.55KB) (0.8%)
    317μs
    1 x Before Access::preloadComponents (all components) (33.45KB) (0.51%)
    202μs
    1 x beforeRenderModule mod_finder (Busca_inteligente) (6.21KB) (0.48%)
    191μs
    1 x beforeRenderRawModule mod_finder (Busca_inteligente) (5.9KB) (0.22%)
    89μs
    1 x afterRenderModule mod_articles_category (Banco de Circuitos) (5.47KB) (0.17%)
    68μs
    1 x afterRenderModule mod_finder (Busca_inteligente) (4.75KB) (0.13%)
    50μs
    1 x afterDispatch (2.25KB) (0.12%)
    48μs
    1 x After Access::getAssetRules (id:26961 name:com_content.article.30602) (7.38KB) (0.08%)
    33μs
    1 x Before Access::preloadPermissions (com_content) (1.57KB) (0.02%)
    8μs
21 statements were executed, 5 of which were duplicates, 16 unique10.97ms1.63MB
  • SELECT @@SESSION.sql_mode;28μs968B/libraries/src/Session/MetadataManager.php:184Copy
  • SELECT `session_id` FROM `incbmx_session` WHERE `session_id` = :session_id LIMIT 154μs1.31KBParams/libraries/src/Session/MetadataManager.php:187Copy
  • UPDATE `incbmx_session` SET `guest` = :guest , `time` = :time , `userid` = :user_id , `username` = :username , `client_id` = :client_id WHERE `session_id` = :session_id50μs992BParams/libraries/src/Session/MetadataManager.php:316Copy
  • SELECT `id`,`rules` FROM `incbmx_viewlevels`45μs608B/libraries/src/Access/Access.php:955Copy
  • SELECT `b`.`id` FROM `incbmx_usergroups` AS `a` LEFT JOIN `incbmx_usergroups` AS `b` ON `b`.`lft` <= `a`.`lft` AND `b`.`rgt` >= `a`.`rgt` WHERE `a`.`id` = :guest66μs1.64KBParams/libraries/src/Access/Access.php:868Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`200μs3.98KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `id`,`name`,`rules`,`parent_id` FROM `incbmx_assets` WHERE `name` IN (:preparedArray1,:preparedArray2,:preparedArray3,:preparedArray4,:preparedArray5,:preparedArray6,:preparedArray7,:preparedArray8,:preparedArray9,:preparedArray10,:preparedArray11,:preparedArray12,:preparedArray13,:preparedArray14,:preparedArray15,:preparedArray16,:preparedArray17,:preparedArray18,:preparedArray19,:preparedArray20,:preparedArray21,:preparedArray22,:preparedArray23,:preparedArray24,:preparedArray25,:preparedArray26,:preparedArray27,:preparedArray28,:preparedArray29,:preparedArray30,:preparedArray31,:preparedArray32,:preparedArray33,:preparedArray34,:preparedArray35,:preparedArray36,:preparedArray37,:preparedArray38,:preparedArray39)211μs7.44KBParams/libraries/src/Access/Access.php:357Copy
  • SELECT `id`,`name`,`rules`,`parent_id` FROM `incbmx_assets` WHERE `name` LIKE :asset OR `name` = :extension OR `parent_id` = 07.95ms1.48MBParams/libraries/src/Access/Access.php:301Copy
  • SHOW FULL COLUMNS FROM `incbmx_content`345μs2.39KB/libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php:587Copy
  • UPDATE `incbmx_content` SET `hits` = (`hits` + 1) WHERE `id` = '30602'184μs48B/libraries/src/Table/Table.php:1348Copy
  • SELECT `a`.`id`,`a`.`asset_id`,`a`.`title`,`a`.`alias`,`a`.`introtext`,`a`.`fulltext`,`a`.`state`,`a`.`catid`,`a`.`created`,`a`.`created_by`,`a`.`created_by_alias`,`a`.`modified`,`a`.`modified_by`,`a`.`checked_out`,`a`.`checked_out_time`,`a`.`publish_up`,`a`.`publish_down`,`a`.`images`,`a`.`urls`,`a`.`attribs`,`a`.`version`,`a`.`ordering`,`a`.`metakey`,`a`.`metadesc`,`a`.`access`,`a`.`hits`,`a`.`metadata`,`a`.`featured`,`a`.`language`,`fp`.`featured_up`,`fp`.`featured_down`,`c`.`title` AS `category_title`,`c`.`alias` AS `category_alias`,`c`.`access` AS `category_access`,`c`.`language` AS `category_language`,`fp`.`ordering`,`u`.`name` AS `author`,`parent`.`title` AS `parent_title`,`parent`.`id` AS `parent_id`,`parent`.`path` AS `parent_route`,`parent`.`alias` AS `parent_alias`,`parent`.`language` AS `parent_language`,ROUND(`v`.`rating_sum` / `v`.`rating_count`, 1) AS `rating`,`v`.`rating_count` AS `rating_count` FROM `incbmx_content` AS `a` INNER JOIN `incbmx_categories` AS `c` ON `c`.`id` = `a`.`catid` LEFT JOIN `incbmx_content_frontpage` AS `fp` ON `fp`.`content_id` = `a`.`id` LEFT JOIN `incbmx_users` AS `u` ON `u`.`id` = `a`.`created_by` LEFT JOIN `incbmx_categories` AS `parent` ON `parent`.`id` = `c`.`parent_id` LEFT JOIN `incbmx_content_rating` AS `v` ON `a`.`id` = `v`.`content_id` WHERE ( (`a`.`id` = :pk AND `c`.`published` > 0) AND (`a`.`publish_up` IS NULL OR `a`.`publish_up` <= :publishUp)) AND (`a`.`publish_down` IS NULL OR `a`.`publish_down` >= :publishDown) AND `a`.`state` IN (:preparedArray1,:preparedArray2)162μs54.13KBParams/components/com_content/src/Model/ArticleModel.php:215Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1,:preparedArray2) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`177μs3.92KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `m`.`tag_id`,`t`.* FROM `incbmx_contentitem_tag_map` AS `m` INNER JOIN `incbmx_tags` AS `t` ON `m`.`tag_id` = `t`.`id` WHERE `m`.`type_alias` = :contentType AND `m`.`content_item_id` = :id AND `t`.`published` = 1 AND `t`.`access` IN (:preparedArray1,:preparedArray2)228μs3.98KBParams/libraries/src/Helper/TagsHelper.php:388Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1,:preparedArray2) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`160μs3.92KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT DISTINCT a.id, a.title, a.name, a.checked_out, a.checked_out_time, a.note, a.state, a.access, a.created_time, a.created_user_id, a.ordering, a.language, a.fieldparams, a.params, a.type, a.default_value, a.context, a.group_id, a.label, a.description, a.required, a.only_use_in_subform,l.title AS language_title, l.image AS language_image,uc.name AS editor,ag.title AS access_level,ua.name AS author_name,g.title AS group_title, g.access as group_access, g.state AS group_state, g.note as group_note FROM incbmx_fields AS a LEFT JOIN `incbmx_languages` AS l ON l.lang_code = a.language LEFT JOIN incbmx_users AS uc ON uc.id=a.checked_out LEFT JOIN incbmx_viewlevels AS ag ON ag.id = a.access LEFT JOIN incbmx_users AS ua ON ua.id = a.created_user_id LEFT JOIN incbmx_fields_groups AS g ON g.id = a.group_id LEFT JOIN `incbmx_fields_categories` AS fc ON fc.field_id = a.id WHERE ( (`a`.`context` = :context AND (`fc`.`category_id` IS NULL OR `fc`.`category_id` IN (:preparedArray1,:preparedArray2,:preparedArray3)) AND `a`.`access` IN (:preparedArray4,:preparedArray5)) AND (`a`.`group_id` = 0 OR `g`.`access` IN (:preparedArray6,:preparedArray7)) AND `a`.`state` = :state) AND (`a`.`group_id` = 0 OR `g`.`state` = :gstate) AND `a`.`only_use_in_subform` = :only_use_in_subform ORDER BY a.ordering ASC382μs4.81KBParams/libraries/src/MVC/Model/BaseDatabaseModel.php:164Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1,:preparedArray2) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`188μs3.92KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `name`,`element` FROM `incbmx_extensions` WHERE `type` = 'plugin' AND `folder` = 'finder' AND `enabled` = 1154μs1.89KB/administrator/components/com_finder/src/Helper/LanguageHelper.php:135Copy
  • SELECT `title` FROM `incbmx_finder_taxonomy` WHERE `parent_id` = 1 AND `state` = 1 AND `access` IN (1,5)91μs648B/administrator/components/com_finder/src/Indexer/Taxonomy.php:325Copy
  • SELECT * FROM `incbmx_schemaorg` WHERE `itemId` = :itemId AND `context` = :context65μs1.55KBParams/plugins/system/schemaorg/src/Extension/Schemaorg.php:403Copy
  • SELECT `a`.`id`,`a`.`asset_id`,`a`.`title`,`a`.`alias`,`a`.`introtext`,`a`.`fulltext`,`a`.`state`,`a`.`catid`,`a`.`created`,`a`.`created_by`,`a`.`created_by_alias`,`a`.`modified`,`a`.`modified_by`,`a`.`checked_out`,`a`.`checked_out_time`,`a`.`publish_up`,`a`.`publish_down`,`a`.`images`,`a`.`urls`,`a`.`attribs`,`a`.`version`,`a`.`ordering`,`a`.`metakey`,`a`.`metadesc`,`a`.`access`,`a`.`hits`,`a`.`metadata`,`a`.`featured`,`a`.`language`,`fp`.`featured_up`,`fp`.`featured_down`,`c`.`title` AS `category_title`,`c`.`alias` AS `category_alias`,`c`.`access` AS `category_access`,`c`.`language` AS `category_language`,`fp`.`ordering`,`u`.`name` AS `author`,`parent`.`title` AS `parent_title`,`parent`.`id` AS `parent_id`,`parent`.`path` AS `parent_route`,`parent`.`alias` AS `parent_alias`,`parent`.`language` AS `parent_language`,ROUND(`v`.`rating_sum` / `v`.`rating_count`, 1) AS `rating`,`v`.`rating_count` AS `rating_count` FROM `incbmx_content` AS `a` INNER JOIN `incbmx_categories` AS `c` ON `c`.`id` = `a`.`catid` LEFT JOIN `incbmx_content_frontpage` AS `fp` ON `fp`.`content_id` = `a`.`id` LEFT JOIN `incbmx_users` AS `u` ON `u`.`id` = `a`.`created_by` LEFT JOIN `incbmx_categories` AS `parent` ON `parent`.`id` = `c`.`parent_id` LEFT JOIN `incbmx_content_rating` AS `v` ON `a`.`id` = `v`.`content_id` WHERE ( (`a`.`id` = :pk AND `c`.`published` > 0) AND (`a`.`publish_up` IS NULL OR `a`.`publish_up` <= :publishUp)) AND (`a`.`publish_down` IS NULL OR `a`.`publish_down` >= :publishDown) AND `a`.`state` IN (:preparedArray1,:preparedArray2)158μs54.17KBParams/components/com_content/src/Model/ArticleModel.php:215Copy
  • SELECT SUM(CASE WHEN `a`.`next_execution` <= :now THEN 1 ELSE 0 END) AS due_count,SUM(CASE WHEN `a`.`locked` IS NULL THEN 0 ELSE 1 END) AS locked_count FROM `incbmx_scheduler_tasks` AS `a` WHERE `a`.`state` = 167μs1.37KBParams/administrator/components/com_scheduler/src/Model/TasksModel.php:465Copy