- Deprecated function: Use of "static" in callables is deprecated in Drupal\user\Entity\Role::postLoad() (line 172 of core/modules/user/src/Entity/Role.php).
Drupal\user\Entity\Role::postLoad(Object, Array) (Line: 423)
Drupal\Core\Entity\EntityStorageBase->postLoad(Array) (Line: 353)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 16)
Drupal\user\RoleStorage->isPermissionInRoles('access site in maintenance mode', Array) (Line: 112)
Drupal\Core\Session\UserSession->hasPermission('access site in maintenance mode') (Line: 105)
Drupal\Core\Session\AccountProxy->hasPermission('access site in maintenance mode') (Line: 83)
Drupal\redirect\RedirectChecker->canRedirect(Object) (Line: 120)
Drupal\redirect\EventSubscriber\RedirectRequestSubscriber->onKernelRequestCheckRedirect(Object, 'kernel.request', Object)
call_user_func(Array, Object, 'kernel.request', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.request') (Line: 145)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('views') (Line: 1316)
Drupal\views\Plugin\views\query\Sql->query() (Line: 1454)
Drupal\views\Plugin\views\query\Sql->build(Object) (Line: 1326)
Drupal\views\ViewExecutable->build() (Line: 392)
Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('views_substitutions', Array) (Line: 1418)
Drupal\views\Plugin\views\query\Sql->query() (Line: 1454)
Drupal\views\Plugin\views\query\Sql->build(Object) (Line: 1326)
Drupal\views\ViewExecutable->build() (Line: 392)
Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('views') (Line: 1316)
Drupal\views\Plugin\views\query\Sql->query(1) (Line: 1455)
Drupal\views\Plugin\views\query\Sql->build(Object) (Line: 1326)
Drupal\views\ViewExecutable->build() (Line: 392)
Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('views_substitutions', Array) (Line: 1418)
Drupal\views\Plugin\views\query\Sql->query(1) (Line: 1455)
Drupal\views\Plugin\views\query\Sql->build(Object) (Line: 1326)
Drupal\views\ViewExecutable->build() (Line: 392)
Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('node_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 1616)
Drupal\views\Plugin\views\query\Sql->loadEntities(Array) (Line: 1541)
Drupal\views\Plugin\views\query\Sql->execute(Object) (Line: 1431)
Drupal\views\ViewExecutable->execute(NULL) (Line: 1459)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-a21b1839-0cd0-4f1f-85f1-7158ebf94b7c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> conteniendo un campo <em>Amount</em> con las cifras de ventas, y un campo <em>Order Date</em> conteniendo la fecha de venta. El objetivo es crear una función de consulta que sume las ventas entre dos fechas que se pasen como argumentos.
El primer paso será filtrar la tabla <em>Sales</em> de forma que solo se consideren aquellos registros en los que el campo <em>Order Date</em> se encuentre entre las dos fechas que pasemos a la función. Para esto podemos usar la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a> que nos permite imponer una condición y filtrar la tabla de forma que solo se devuelvan aquellos registros que la cumplan. Su sintaxis es la siguiente:
Table.SelectRows(
table as table,
condition as function
) as table
La condición debe ser una función que devuelva un booleano. En nuestro caso, la condición a satisfacer es (si suponemos que los parámetros de la función que reciben las fechas de comienzo y finalización son startDate y endDate respectivamente):
[Order Date] >= startDate and [Order Date] <= endDate
por lo que podríamos escribir ya una primera versión de nuestra consulta (todavía sin devolver la suma de ventas):
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate)
in
FilteredRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0003.png"></a>
Se han fijado como fechas el 1 y el 30 de junio de 2016 solo para probar el código.
Vemos que los 18 registros devueltos contienen en la columna Order Date una fecha correspondiente a junio de 2016.
Una vez filtrada la tabla, deberemos seleccionar la columna <em>Amount</em>, lo que podemos conseguir extrayendo la columna en cuestión con la función <a href="/es/m/function/tablecolumn">Table.Column</a>, que devuelve la columna que se indique con formato de lista:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount")
in
Amount
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0004.png"></a>
Por último, para sumar los valores de la lista la función adecuada es <a href="/es/m/function/listsum">List.Sum</a>:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0005.png"></a>
Si queremos convertir esta consulta en una función de consulta, añadimos la cabecera adecuada y eliminamos las dos primeras fórmulas de paso que inicializan las fechas:
(startDate as date, endDate as date) as number =>
let
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0007.png"></a>
Damos a la consulta un nombre adecuado (<em>SalesInPeriod</em>, por ejemplo) y la invocamos para probarla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0006.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-a21b1839-0cd0-4f1f-85f1-7158ebf94b7c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> conteniendo un campo <em>Amount</em> con las cifras de ventas, y un campo <em>Order Date</em> conteniendo la fecha de venta. El objetivo es crear una función de consulta que sume las ventas entre dos fechas que se pasen como argumentos.
El primer paso será filtrar la tabla <em>Sales</em> de forma que solo se consideren aquellos registros en los que el campo <em>Order Date</em> se encuentre entre las dos fechas que pasemos a la función. Para esto podemos usar la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a> que nos permite imponer una condición y filtrar la tabla de forma que solo se devuelvan aquellos registros que la cumplan. Su sintaxis es la siguiente:
Table.SelectRows(
table as table,
condition as function
) as table
La condición debe ser una función que devuelva un booleano. En nuestro caso, la condición a satisfacer es (si suponemos que los parámetros de la función que reciben las fechas de comienzo y finalización son startDate y endDate respectivamente):
[Order Date] >= startDate and [Order Date] <= endDate
por lo que podríamos escribir ya una primera versión de nuestra consulta (todavía sin devolver la suma de ventas):
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate)
in
FilteredRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0003.png"></a>
Se han fijado como fechas el 1 y el 30 de junio de 2016 solo para probar el código.
Vemos que los 18 registros devueltos contienen en la columna Order Date una fecha correspondiente a junio de 2016.
Una vez filtrada la tabla, deberemos seleccionar la columna <em>Amount</em>, lo que podemos conseguir extrayendo la columna en cuestión con la función <a href="/es/m/function/tablecolumn">Table.Column</a>, que devuelve la columna que se indique con formato de lista:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount")
in
Amount
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0004.png"></a>
Por último, para sumar los valores de la lista la función adecuada es <a href="/es/m/function/listsum">List.Sum</a>:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0005.png"></a>
Si queremos convertir esta consulta en una función de consulta, añadimos la cabecera adecuada y eliminamos las dos primeras fórmulas de paso que inicializan las fechas:
(startDate as date, endDate as date) as number =>
let
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0007.png"></a>
Damos a la consulta un nombre adecuado (<em>SalesInPeriod</em>, por ejemplo) y la invocamos para probarla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0006.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-a21b1839-0cd0-4f1f-85f1-7158ebf94b7c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> conteniendo un campo <em>Amount</em> con las cifras de ventas, y un campo <em>Order Date</em> conteniendo la fecha de venta. El objetivo es crear una función de consulta que sume las ventas entre dos fechas que se pasen como argumentos.
El primer paso será filtrar la tabla <em>Sales</em> de forma que solo se consideren aquellos registros en los que el campo <em>Order Date</em> se encuentre entre las dos fechas que pasemos a la función. Para esto podemos usar la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a> que nos permite imponer una condición y filtrar la tabla de forma que solo se devuelvan aquellos registros que la cumplan. Su sintaxis es la siguiente:
Table.SelectRows(
table as table,
condition as function
) as table
La condición debe ser una función que devuelva un booleano. En nuestro caso, la condición a satisfacer es (si suponemos que los parámetros de la función que reciben las fechas de comienzo y finalización son startDate y endDate respectivamente):
[Order Date] >= startDate and [Order Date] <= endDate
por lo que podríamos escribir ya una primera versión de nuestra consulta (todavía sin devolver la suma de ventas):
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate)
in
FilteredRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0003.png"></a>
Se han fijado como fechas el 1 y el 30 de junio de 2016 solo para probar el código.
Vemos que los 18 registros devueltos contienen en la columna Order Date una fecha correspondiente a junio de 2016.
Una vez filtrada la tabla, deberemos seleccionar la columna <em>Amount</em>, lo que podemos conseguir extrayendo la columna en cuestión con la función <a href="/es/m/function/tablecolumn">Table.Column</a>, que devuelve la columna que se indique con formato de lista:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount")
in
Amount
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0004.png"></a>
Por último, para sumar los valores de la lista la función adecuada es <a href="/es/m/function/listsum">List.Sum</a>:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0005.png"></a>
Si queremos convertir esta consulta en una función de consulta, añadimos la cabecera adecuada y eliminamos las dos primeras fórmulas de paso que inicializan las fechas:
(startDate as date, endDate as date) as number =>
let
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0007.png"></a>
Damos a la consulta un nombre adecuado (<em>SalesInPeriod</em>, por ejemplo) y la invocamos para probarla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0006.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-a21b1839-0cd0-4f1f-85f1-7158ebf94b7c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> conteniendo un campo <em>Amount</em> con las cifras de ventas, y un campo <em>Order Date</em> conteniendo la fecha de venta. El objetivo es crear una función de consulta que sume las ventas entre dos fechas que se pasen como argumentos.
El primer paso será filtrar la tabla <em>Sales</em> de forma que solo se consideren aquellos registros en los que el campo <em>Order Date</em> se encuentre entre las dos fechas que pasemos a la función. Para esto podemos usar la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a> que nos permite imponer una condición y filtrar la tabla de forma que solo se devuelvan aquellos registros que la cumplan. Su sintaxis es la siguiente:
Table.SelectRows(
table as table,
condition as function
) as table
La condición debe ser una función que devuelva un booleano. En nuestro caso, la condición a satisfacer es (si suponemos que los parámetros de la función que reciben las fechas de comienzo y finalización son startDate y endDate respectivamente):
[Order Date] >= startDate and [Order Date] <= endDate
por lo que podríamos escribir ya una primera versión de nuestra consulta (todavía sin devolver la suma de ventas):
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate)
in
FilteredRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0003.png"></a>
Se han fijado como fechas el 1 y el 30 de junio de 2016 solo para probar el código.
Vemos que los 18 registros devueltos contienen en la columna Order Date una fecha correspondiente a junio de 2016.
Una vez filtrada la tabla, deberemos seleccionar la columna <em>Amount</em>, lo que podemos conseguir extrayendo la columna en cuestión con la función <a href="/es/m/function/tablecolumn">Table.Column</a>, que devuelve la columna que se indique con formato de lista:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount")
in
Amount
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0004.png"></a>
Por último, para sumar los valores de la lista la función adecuada es <a href="/es/m/function/listsum">List.Sum</a>:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0005.png"></a>
Si queremos convertir esta consulta en una función de consulta, añadimos la cabecera adecuada y eliminamos las dos primeras fórmulas de paso que inicializan las fechas:
(startDate as date, endDate as date) as number =>
let
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0007.png"></a>
Damos a la consulta un nombre adecuado (<em>SalesInPeriod</em>, por ejemplo) y la invocamos para probarla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0006.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-82bed51c-68d0-4c8b-b904-e2ad8abed1b9') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> conteniendo un campo <em>Amount</em> con las cifras de ventas, y un campo <em>Order Date</em> conteniendo la fecha de venta. El objetivo es crear una función de consulta que sume las ventas entre dos fechas que se pasen como argumentos.
El primer paso será filtrar la tabla <em>Sales</em> de forma que solo se consideren aquellos registros en los que el campo <em>Order Date</em> se encuentre entre las dos fechas que pasemos a la función. Para esto podemos usar la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a> que nos permite imponer una condición y filtrar la tabla de forma que solo se devuelvan aquellos registros que la cumplan. Su sintaxis es la siguiente:
Table.SelectRows(
table as table,
condition as function
) as table
La condición debe ser una función que devuelva un booleano. En nuestro caso, la condición a satisfacer es (si suponemos que los parámetros de la función que reciben las fechas de comienzo y finalización son startDate y endDate respectivamente):
[Order Date] >= startDate and [Order Date] <= endDate
por lo que podríamos escribir ya una primera versión de nuestra consulta (todavía sin devolver la suma de ventas):
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate)
in
FilteredRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0003.png"></a>
Se han fijado como fechas el 1 y el 30 de junio de 2016 solo para probar el código.
Vemos que los 18 registros devueltos contienen en la columna Order Date una fecha correspondiente a junio de 2016.
Una vez filtrada la tabla, deberemos seleccionar la columna <em>Amount</em>, lo que podemos conseguir extrayendo la columna en cuestión con la función <a href="/es/m/function/tablecolumn">Table.Column</a>, que devuelve la columna que se indique con formato de lista:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount")
in
Amount
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0004.png"></a>
Por último, para sumar los valores de la lista la función adecuada es <a href="/es/m/function/listsum">List.Sum</a>:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0005.png"></a>
Si queremos convertir esta consulta en una función de consulta, añadimos la cabecera adecuada y eliminamos las dos primeras fórmulas de paso que inicializan las fechas:
(startDate as date, endDate as date) as number =>
let
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0007.png"></a>
Damos a la consulta un nombre adecuado (<em>SalesInPeriod</em>, por ejemplo) y la invocamos para probarla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0006.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-82bed51c-68d0-4c8b-b904-e2ad8abed1b9') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> conteniendo un campo <em>Amount</em> con las cifras de ventas, y un campo <em>Order Date</em> conteniendo la fecha de venta. El objetivo es crear una función de consulta que sume las ventas entre dos fechas que se pasen como argumentos.
El primer paso será filtrar la tabla <em>Sales</em> de forma que solo se consideren aquellos registros en los que el campo <em>Order Date</em> se encuentre entre las dos fechas que pasemos a la función. Para esto podemos usar la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a> que nos permite imponer una condición y filtrar la tabla de forma que solo se devuelvan aquellos registros que la cumplan. Su sintaxis es la siguiente:
Table.SelectRows(
table as table,
condition as function
) as table
La condición debe ser una función que devuelva un booleano. En nuestro caso, la condición a satisfacer es (si suponemos que los parámetros de la función que reciben las fechas de comienzo y finalización son startDate y endDate respectivamente):
[Order Date] >= startDate and [Order Date] <= endDate
por lo que podríamos escribir ya una primera versión de nuestra consulta (todavía sin devolver la suma de ventas):
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate)
in
FilteredRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0003.png"></a>
Se han fijado como fechas el 1 y el 30 de junio de 2016 solo para probar el código.
Vemos que los 18 registros devueltos contienen en la columna Order Date una fecha correspondiente a junio de 2016.
Una vez filtrada la tabla, deberemos seleccionar la columna <em>Amount</em>, lo que podemos conseguir extrayendo la columna en cuestión con la función <a href="/es/m/function/tablecolumn">Table.Column</a>, que devuelve la columna que se indique con formato de lista:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount")
in
Amount
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0004.png"></a>
Por último, para sumar los valores de la lista la función adecuada es <a href="/es/m/function/listsum">List.Sum</a>:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0005.png"></a>
Si queremos convertir esta consulta en una función de consulta, añadimos la cabecera adecuada y eliminamos las dos primeras fórmulas de paso que inicializan las fechas:
(startDate as date, endDate as date) as number =>
let
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0007.png"></a>
Damos a la consulta un nombre adecuado (<em>SalesInPeriod</em>, por ejemplo) y la invocamos para probarla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0006.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-82bed51c-68d0-4c8b-b904-e2ad8abed1b9') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> conteniendo un campo <em>Amount</em> con las cifras de ventas, y un campo <em>Order Date</em> conteniendo la fecha de venta. El objetivo es crear una función de consulta que sume las ventas entre dos fechas que se pasen como argumentos.
El primer paso será filtrar la tabla <em>Sales</em> de forma que solo se consideren aquellos registros en los que el campo <em>Order Date</em> se encuentre entre las dos fechas que pasemos a la función. Para esto podemos usar la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a> que nos permite imponer una condición y filtrar la tabla de forma que solo se devuelvan aquellos registros que la cumplan. Su sintaxis es la siguiente:
Table.SelectRows(
table as table,
condition as function
) as table
La condición debe ser una función que devuelva un booleano. En nuestro caso, la condición a satisfacer es (si suponemos que los parámetros de la función que reciben las fechas de comienzo y finalización son startDate y endDate respectivamente):
[Order Date] >= startDate and [Order Date] <= endDate
por lo que podríamos escribir ya una primera versión de nuestra consulta (todavía sin devolver la suma de ventas):
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate)
in
FilteredRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0003.png"></a>
Se han fijado como fechas el 1 y el 30 de junio de 2016 solo para probar el código.
Vemos que los 18 registros devueltos contienen en la columna Order Date una fecha correspondiente a junio de 2016.
Una vez filtrada la tabla, deberemos seleccionar la columna <em>Amount</em>, lo que podemos conseguir extrayendo la columna en cuestión con la función <a href="/es/m/function/tablecolumn">Table.Column</a>, que devuelve la columna que se indique con formato de lista:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount")
in
Amount
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0004.png"></a>
Por último, para sumar los valores de la lista la función adecuada es <a href="/es/m/function/listsum">List.Sum</a>:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0005.png"></a>
Si queremos convertir esta consulta en una función de consulta, añadimos la cabecera adecuada y eliminamos las dos primeras fórmulas de paso que inicializan las fechas:
(startDate as date, endDate as date) as number =>
let
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0007.png"></a>
Damos a la consulta un nombre adecuado (<em>SalesInPeriod</em>, por ejemplo) y la invocamos para probarla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0006.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-82bed51c-68d0-4c8b-b904-e2ad8abed1b9') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> conteniendo un campo <em>Amount</em> con las cifras de ventas, y un campo <em>Order Date</em> conteniendo la fecha de venta. El objetivo es crear una función de consulta que sume las ventas entre dos fechas que se pasen como argumentos.
El primer paso será filtrar la tabla <em>Sales</em> de forma que solo se consideren aquellos registros en los que el campo <em>Order Date</em> se encuentre entre las dos fechas que pasemos a la función. Para esto podemos usar la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a> que nos permite imponer una condición y filtrar la tabla de forma que solo se devuelvan aquellos registros que la cumplan. Su sintaxis es la siguiente:
Table.SelectRows(
table as table,
condition as function
) as table
La condición debe ser una función que devuelva un booleano. En nuestro caso, la condición a satisfacer es (si suponemos que los parámetros de la función que reciben las fechas de comienzo y finalización son startDate y endDate respectivamente):
[Order Date] >= startDate and [Order Date] <= endDate
por lo que podríamos escribir ya una primera versión de nuestra consulta (todavía sin devolver la suma de ventas):
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate)
in
FilteredRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0003.png"></a>
Se han fijado como fechas el 1 y el 30 de junio de 2016 solo para probar el código.
Vemos que los 18 registros devueltos contienen en la columna Order Date una fecha correspondiente a junio de 2016.
Una vez filtrada la tabla, deberemos seleccionar la columna <em>Amount</em>, lo que podemos conseguir extrayendo la columna en cuestión con la función <a href="/es/m/function/tablecolumn">Table.Column</a>, que devuelve la columna que se indique con formato de lista:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount")
in
Amount
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0004.png"></a>
Por último, para sumar los valores de la lista la función adecuada es <a href="/es/m/function/listsum">List.Sum</a>:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0005.png"></a>
Si queremos convertir esta consulta en una función de consulta, añadimos la cabecera adecuada y eliminamos las dos primeras fórmulas de paso que inicializan las fechas:
(startDate as date, endDate as date) as number =>
let
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0007.png"></a>
Damos a la consulta un nombre adecuado (<em>SalesInPeriod</em>, por ejemplo) y la invocamos para probarla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0006.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-5d0304c0-570d-45b8-9694-beed60bae2c8') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> conteniendo un campo <em>Amount</em> con las cifras de ventas, y un campo <em>Order Date</em> conteniendo la fecha de venta. El objetivo es crear una función de consulta que sume las ventas entre dos fechas que se pasen como argumentos.
El primer paso será filtrar la tabla <em>Sales</em> de forma que solo se consideren aquellos registros en los que el campo <em>Order Date</em> se encuentre entre las dos fechas que pasemos a la función. Para esto podemos usar la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a> que nos permite imponer una condición y filtrar la tabla de forma que solo se devuelvan aquellos registros que la cumplan. Su sintaxis es la siguiente:
Table.SelectRows(
table as table,
condition as function
) as table
La condición debe ser una función que devuelva un booleano. En nuestro caso, la condición a satisfacer es (si suponemos que los parámetros de la función que reciben las fechas de comienzo y finalización son startDate y endDate respectivamente):
[Order Date] >= startDate and [Order Date] <= endDate
por lo que podríamos escribir ya una primera versión de nuestra consulta (todavía sin devolver la suma de ventas):
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate)
in
FilteredRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0003.png"></a>
Se han fijado como fechas el 1 y el 30 de junio de 2016 solo para probar el código.
Vemos que los 18 registros devueltos contienen en la columna Order Date una fecha correspondiente a junio de 2016.
Una vez filtrada la tabla, deberemos seleccionar la columna <em>Amount</em>, lo que podemos conseguir extrayendo la columna en cuestión con la función <a href="/es/m/function/tablecolumn">Table.Column</a>, que devuelve la columna que se indique con formato de lista:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount")
in
Amount
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0004.png"></a>
Por último, para sumar los valores de la lista la función adecuada es <a href="/es/m/function/listsum">List.Sum</a>:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0005.png"></a>
Si queremos convertir esta consulta en una función de consulta, añadimos la cabecera adecuada y eliminamos las dos primeras fórmulas de paso que inicializan las fechas:
(startDate as date, endDate as date) as number =>
let
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0007.png"></a>
Damos a la consulta un nombre adecuado (<em>SalesInPeriod</em>, por ejemplo) y la invocamos para probarla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0006.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-5d0304c0-570d-45b8-9694-beed60bae2c8') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> conteniendo un campo <em>Amount</em> con las cifras de ventas, y un campo <em>Order Date</em> conteniendo la fecha de venta. El objetivo es crear una función de consulta que sume las ventas entre dos fechas que se pasen como argumentos.
El primer paso será filtrar la tabla <em>Sales</em> de forma que solo se consideren aquellos registros en los que el campo <em>Order Date</em> se encuentre entre las dos fechas que pasemos a la función. Para esto podemos usar la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a> que nos permite imponer una condición y filtrar la tabla de forma que solo se devuelvan aquellos registros que la cumplan. Su sintaxis es la siguiente:
Table.SelectRows(
table as table,
condition as function
) as table
La condición debe ser una función que devuelva un booleano. En nuestro caso, la condición a satisfacer es (si suponemos que los parámetros de la función que reciben las fechas de comienzo y finalización son startDate y endDate respectivamente):
[Order Date] >= startDate and [Order Date] <= endDate
por lo que podríamos escribir ya una primera versión de nuestra consulta (todavía sin devolver la suma de ventas):
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate)
in
FilteredRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0003.png"></a>
Se han fijado como fechas el 1 y el 30 de junio de 2016 solo para probar el código.
Vemos que los 18 registros devueltos contienen en la columna Order Date una fecha correspondiente a junio de 2016.
Una vez filtrada la tabla, deberemos seleccionar la columna <em>Amount</em>, lo que podemos conseguir extrayendo la columna en cuestión con la función <a href="/es/m/function/tablecolumn">Table.Column</a>, que devuelve la columna que se indique con formato de lista:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount")
in
Amount
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0004.png"></a>
Por último, para sumar los valores de la lista la función adecuada es <a href="/es/m/function/listsum">List.Sum</a>:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0005.png"></a>
Si queremos convertir esta consulta en una función de consulta, añadimos la cabecera adecuada y eliminamos las dos primeras fórmulas de paso que inicializan las fechas:
(startDate as date, endDate as date) as number =>
let
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0007.png"></a>
Damos a la consulta un nombre adecuado (<em>SalesInPeriod</em>, por ejemplo) y la invocamos para probarla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0006.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-5d0304c0-570d-45b8-9694-beed60bae2c8') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> conteniendo un campo <em>Amount</em> con las cifras de ventas, y un campo <em>Order Date</em> conteniendo la fecha de venta. El objetivo es crear una función de consulta que sume las ventas entre dos fechas que se pasen como argumentos.
El primer paso será filtrar la tabla <em>Sales</em> de forma que solo se consideren aquellos registros en los que el campo <em>Order Date</em> se encuentre entre las dos fechas que pasemos a la función. Para esto podemos usar la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a> que nos permite imponer una condición y filtrar la tabla de forma que solo se devuelvan aquellos registros que la cumplan. Su sintaxis es la siguiente:
Table.SelectRows(
table as table,
condition as function
) as table
La condición debe ser una función que devuelva un booleano. En nuestro caso, la condición a satisfacer es (si suponemos que los parámetros de la función que reciben las fechas de comienzo y finalización son startDate y endDate respectivamente):
[Order Date] >= startDate and [Order Date] <= endDate
por lo que podríamos escribir ya una primera versión de nuestra consulta (todavía sin devolver la suma de ventas):
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate)
in
FilteredRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0003.png"></a>
Se han fijado como fechas el 1 y el 30 de junio de 2016 solo para probar el código.
Vemos que los 18 registros devueltos contienen en la columna Order Date una fecha correspondiente a junio de 2016.
Una vez filtrada la tabla, deberemos seleccionar la columna <em>Amount</em>, lo que podemos conseguir extrayendo la columna en cuestión con la función <a href="/es/m/function/tablecolumn">Table.Column</a>, que devuelve la columna que se indique con formato de lista:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount")
in
Amount
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0004.png"></a>
Por último, para sumar los valores de la lista la función adecuada es <a href="/es/m/function/listsum">List.Sum</a>:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0005.png"></a>
Si queremos convertir esta consulta en una función de consulta, añadimos la cabecera adecuada y eliminamos las dos primeras fórmulas de paso que inicializan las fechas:
(startDate as date, endDate as date) as number =>
let
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0007.png"></a>
Damos a la consulta un nombre adecuado (<em>SalesInPeriod</em>, por ejemplo) y la invocamos para probarla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0006.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-5d0304c0-570d-45b8-9694-beed60bae2c8') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> conteniendo un campo <em>Amount</em> con las cifras de ventas, y un campo <em>Order Date</em> conteniendo la fecha de venta. El objetivo es crear una función de consulta que sume las ventas entre dos fechas que se pasen como argumentos.
El primer paso será filtrar la tabla <em>Sales</em> de forma que solo se consideren aquellos registros en los que el campo <em>Order Date</em> se encuentre entre las dos fechas que pasemos a la función. Para esto podemos usar la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a> que nos permite imponer una condición y filtrar la tabla de forma que solo se devuelvan aquellos registros que la cumplan. Su sintaxis es la siguiente:
Table.SelectRows(
table as table,
condition as function
) as table
La condición debe ser una función que devuelva un booleano. En nuestro caso, la condición a satisfacer es (si suponemos que los parámetros de la función que reciben las fechas de comienzo y finalización son startDate y endDate respectivamente):
[Order Date] >= startDate and [Order Date] <= endDate
por lo que podríamos escribir ya una primera versión de nuestra consulta (todavía sin devolver la suma de ventas):
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate)
in
FilteredRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0003.png"></a>
Se han fijado como fechas el 1 y el 30 de junio de 2016 solo para probar el código.
Vemos que los 18 registros devueltos contienen en la columna Order Date una fecha correspondiente a junio de 2016.
Una vez filtrada la tabla, deberemos seleccionar la columna <em>Amount</em>, lo que podemos conseguir extrayendo la columna en cuestión con la función <a href="/es/m/function/tablecolumn">Table.Column</a>, que devuelve la columna que se indique con formato de lista:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount")
in
Amount
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0004.png"></a>
Por último, para sumar los valores de la lista la función adecuada es <a href="/es/m/function/listsum">List.Sum</a>:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0005.png"></a>
Si queremos convertir esta consulta en una función de consulta, añadimos la cabecera adecuada y eliminamos las dos primeras fórmulas de paso que inicializan las fechas:
(startDate as date, endDate as date) as number =>
let
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0007.png"></a>
Damos a la consulta un nombre adecuado (<em>SalesInPeriod</em>, por ejemplo) y la invocamos para probarla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0006.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-32b27825-2a9c-4ef1-bfa6-84ce09ec5f34') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> conteniendo un campo <em>Amount</em> con las cifras de ventas, y un campo <em>Order Date</em> conteniendo la fecha de venta. El objetivo es crear una función de consulta que sume las ventas entre dos fechas que se pasen como argumentos.
El primer paso será filtrar la tabla <em>Sales</em> de forma que solo se consideren aquellos registros en los que el campo <em>Order Date</em> se encuentre entre las dos fechas que pasemos a la función. Para esto podemos usar la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a> que nos permite imponer una condición y filtrar la tabla de forma que solo se devuelvan aquellos registros que la cumplan. Su sintaxis es la siguiente:
Table.SelectRows(
table as table,
condition as function
) as table
La condición debe ser una función que devuelva un booleano. En nuestro caso, la condición a satisfacer es (si suponemos que los parámetros de la función que reciben las fechas de comienzo y finalización son startDate y endDate respectivamente):
[Order Date] >= startDate and [Order Date] <= endDate
por lo que podríamos escribir ya una primera versión de nuestra consulta (todavía sin devolver la suma de ventas):
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate)
in
FilteredRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0003.png"></a>
Se han fijado como fechas el 1 y el 30 de junio de 2016 solo para probar el código.
Vemos que los 18 registros devueltos contienen en la columna Order Date una fecha correspondiente a junio de 2016.
Una vez filtrada la tabla, deberemos seleccionar la columna <em>Amount</em>, lo que podemos conseguir extrayendo la columna en cuestión con la función <a href="/es/m/function/tablecolumn">Table.Column</a>, que devuelve la columna que se indique con formato de lista:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount")
in
Amount
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0004.png"></a>
Por último, para sumar los valores de la lista la función adecuada es <a href="/es/m/function/listsum">List.Sum</a>:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0005.png"></a>
Si queremos convertir esta consulta en una función de consulta, añadimos la cabecera adecuada y eliminamos las dos primeras fórmulas de paso que inicializan las fechas:
(startDate as date, endDate as date) as number =>
let
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0007.png"></a>
Damos a la consulta un nombre adecuado (<em>SalesInPeriod</em>, por ejemplo) y la invocamos para probarla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0006.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-32b27825-2a9c-4ef1-bfa6-84ce09ec5f34') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> conteniendo un campo <em>Amount</em> con las cifras de ventas, y un campo <em>Order Date</em> conteniendo la fecha de venta. El objetivo es crear una función de consulta que sume las ventas entre dos fechas que se pasen como argumentos.
El primer paso será filtrar la tabla <em>Sales</em> de forma que solo se consideren aquellos registros en los que el campo <em>Order Date</em> se encuentre entre las dos fechas que pasemos a la función. Para esto podemos usar la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a> que nos permite imponer una condición y filtrar la tabla de forma que solo se devuelvan aquellos registros que la cumplan. Su sintaxis es la siguiente:
Table.SelectRows(
table as table,
condition as function
) as table
La condición debe ser una función que devuelva un booleano. En nuestro caso, la condición a satisfacer es (si suponemos que los parámetros de la función que reciben las fechas de comienzo y finalización son startDate y endDate respectivamente):
[Order Date] >= startDate and [Order Date] <= endDate
por lo que podríamos escribir ya una primera versión de nuestra consulta (todavía sin devolver la suma de ventas):
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate)
in
FilteredRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0003.png"></a>
Se han fijado como fechas el 1 y el 30 de junio de 2016 solo para probar el código.
Vemos que los 18 registros devueltos contienen en la columna Order Date una fecha correspondiente a junio de 2016.
Una vez filtrada la tabla, deberemos seleccionar la columna <em>Amount</em>, lo que podemos conseguir extrayendo la columna en cuestión con la función <a href="/es/m/function/tablecolumn">Table.Column</a>, que devuelve la columna que se indique con formato de lista:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount")
in
Amount
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0004.png"></a>
Por último, para sumar los valores de la lista la función adecuada es <a href="/es/m/function/listsum">List.Sum</a>:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0005.png"></a>
Si queremos convertir esta consulta en una función de consulta, añadimos la cabecera adecuada y eliminamos las dos primeras fórmulas de paso que inicializan las fechas:
(startDate as date, endDate as date) as number =>
let
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0007.png"></a>
Damos a la consulta un nombre adecuado (<em>SalesInPeriod</em>, por ejemplo) y la invocamos para probarla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0006.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-32b27825-2a9c-4ef1-bfa6-84ce09ec5f34') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> conteniendo un campo <em>Amount</em> con las cifras de ventas, y un campo <em>Order Date</em> conteniendo la fecha de venta. El objetivo es crear una función de consulta que sume las ventas entre dos fechas que se pasen como argumentos.
El primer paso será filtrar la tabla <em>Sales</em> de forma que solo se consideren aquellos registros en los que el campo <em>Order Date</em> se encuentre entre las dos fechas que pasemos a la función. Para esto podemos usar la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a> que nos permite imponer una condición y filtrar la tabla de forma que solo se devuelvan aquellos registros que la cumplan. Su sintaxis es la siguiente:
Table.SelectRows(
table as table,
condition as function
) as table
La condición debe ser una función que devuelva un booleano. En nuestro caso, la condición a satisfacer es (si suponemos que los parámetros de la función que reciben las fechas de comienzo y finalización son startDate y endDate respectivamente):
[Order Date] >= startDate and [Order Date] <= endDate
por lo que podríamos escribir ya una primera versión de nuestra consulta (todavía sin devolver la suma de ventas):
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate)
in
FilteredRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0003.png"></a>
Se han fijado como fechas el 1 y el 30 de junio de 2016 solo para probar el código.
Vemos que los 18 registros devueltos contienen en la columna Order Date una fecha correspondiente a junio de 2016.
Una vez filtrada la tabla, deberemos seleccionar la columna <em>Amount</em>, lo que podemos conseguir extrayendo la columna en cuestión con la función <a href="/es/m/function/tablecolumn">Table.Column</a>, que devuelve la columna que se indique con formato de lista:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount")
in
Amount
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0004.png"></a>
Por último, para sumar los valores de la lista la función adecuada es <a href="/es/m/function/listsum">List.Sum</a>:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0005.png"></a>
Si queremos convertir esta consulta en una función de consulta, añadimos la cabecera adecuada y eliminamos las dos primeras fórmulas de paso que inicializan las fechas:
(startDate as date, endDate as date) as number =>
let
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0007.png"></a>
Damos a la consulta un nombre adecuado (<em>SalesInPeriod</em>, por ejemplo) y la invocamos para probarla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0006.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-32b27825-2a9c-4ef1-bfa6-84ce09ec5f34') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> conteniendo un campo <em>Amount</em> con las cifras de ventas, y un campo <em>Order Date</em> conteniendo la fecha de venta. El objetivo es crear una función de consulta que sume las ventas entre dos fechas que se pasen como argumentos.
El primer paso será filtrar la tabla <em>Sales</em> de forma que solo se consideren aquellos registros en los que el campo <em>Order Date</em> se encuentre entre las dos fechas que pasemos a la función. Para esto podemos usar la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a> que nos permite imponer una condición y filtrar la tabla de forma que solo se devuelvan aquellos registros que la cumplan. Su sintaxis es la siguiente:
Table.SelectRows(
table as table,
condition as function
) as table
La condición debe ser una función que devuelva un booleano. En nuestro caso, la condición a satisfacer es (si suponemos que los parámetros de la función que reciben las fechas de comienzo y finalización son startDate y endDate respectivamente):
[Order Date] >= startDate and [Order Date] <= endDate
por lo que podríamos escribir ya una primera versión de nuestra consulta (todavía sin devolver la suma de ventas):
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate)
in
FilteredRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0003.png"></a>
Se han fijado como fechas el 1 y el 30 de junio de 2016 solo para probar el código.
Vemos que los 18 registros devueltos contienen en la columna Order Date una fecha correspondiente a junio de 2016.
Una vez filtrada la tabla, deberemos seleccionar la columna <em>Amount</em>, lo que podemos conseguir extrayendo la columna en cuestión con la función <a href="/es/m/function/tablecolumn">Table.Column</a>, que devuelve la columna que se indique con formato de lista:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount")
in
Amount
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0004.png"></a>
Por último, para sumar los valores de la lista la función adecuada es <a href="/es/m/function/listsum">List.Sum</a>:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0005.png"></a>
Si queremos convertir esta consulta en una función de consulta, añadimos la cabecera adecuada y eliminamos las dos primeras fórmulas de paso que inicializan las fechas:
(startDate as date, endDate as date) as number =>
let
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0007.png"></a>
Damos a la consulta un nombre adecuado (<em>SalesInPeriod</em>, por ejemplo) y la invocamos para probarla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0006.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-d8f99066-fecc-47bc-8de1-262e4e883a2b') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> conteniendo un campo <em>Amount</em> con las cifras de ventas, y un campo <em>Order Date</em> conteniendo la fecha de venta. El objetivo es crear una función de consulta que sume las ventas entre dos fechas que se pasen como argumentos.
El primer paso será filtrar la tabla <em>Sales</em> de forma que solo se consideren aquellos registros en los que el campo <em>Order Date</em> se encuentre entre las dos fechas que pasemos a la función. Para esto podemos usar la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a> que nos permite imponer una condición y filtrar la tabla de forma que solo se devuelvan aquellos registros que la cumplan. Su sintaxis es la siguiente:
Table.SelectRows(
table as table,
condition as function
) as table
La condición debe ser una función que devuelva un booleano. En nuestro caso, la condición a satisfacer es (si suponemos que los parámetros de la función que reciben las fechas de comienzo y finalización son startDate y endDate respectivamente):
[Order Date] >= startDate and [Order Date] <= endDate
por lo que podríamos escribir ya una primera versión de nuestra consulta (todavía sin devolver la suma de ventas):
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate)
in
FilteredRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0003.png"></a>
Se han fijado como fechas el 1 y el 30 de junio de 2016 solo para probar el código.
Vemos que los 18 registros devueltos contienen en la columna Order Date una fecha correspondiente a junio de 2016.
Una vez filtrada la tabla, deberemos seleccionar la columna <em>Amount</em>, lo que podemos conseguir extrayendo la columna en cuestión con la función <a href="/es/m/function/tablecolumn">Table.Column</a>, que devuelve la columna que se indique con formato de lista:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount")
in
Amount
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0004.png"></a>
Por último, para sumar los valores de la lista la función adecuada es <a href="/es/m/function/listsum">List.Sum</a>:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0005.png"></a>
Si queremos convertir esta consulta en una función de consulta, añadimos la cabecera adecuada y eliminamos las dos primeras fórmulas de paso que inicializan las fechas:
(startDate as date, endDate as date) as number =>
let
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0007.png"></a>
Damos a la consulta un nombre adecuado (<em>SalesInPeriod</em>, por ejemplo) y la invocamos para probarla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0006.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-d8f99066-fecc-47bc-8de1-262e4e883a2b') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> conteniendo un campo <em>Amount</em> con las cifras de ventas, y un campo <em>Order Date</em> conteniendo la fecha de venta. El objetivo es crear una función de consulta que sume las ventas entre dos fechas que se pasen como argumentos.
El primer paso será filtrar la tabla <em>Sales</em> de forma que solo se consideren aquellos registros en los que el campo <em>Order Date</em> se encuentre entre las dos fechas que pasemos a la función. Para esto podemos usar la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a> que nos permite imponer una condición y filtrar la tabla de forma que solo se devuelvan aquellos registros que la cumplan. Su sintaxis es la siguiente:
Table.SelectRows(
table as table,
condition as function
) as table
La condición debe ser una función que devuelva un booleano. En nuestro caso, la condición a satisfacer es (si suponemos que los parámetros de la función que reciben las fechas de comienzo y finalización son startDate y endDate respectivamente):
[Order Date] >= startDate and [Order Date] <= endDate
por lo que podríamos escribir ya una primera versión de nuestra consulta (todavía sin devolver la suma de ventas):
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate)
in
FilteredRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0003.png"></a>
Se han fijado como fechas el 1 y el 30 de junio de 2016 solo para probar el código.
Vemos que los 18 registros devueltos contienen en la columna Order Date una fecha correspondiente a junio de 2016.
Una vez filtrada la tabla, deberemos seleccionar la columna <em>Amount</em>, lo que podemos conseguir extrayendo la columna en cuestión con la función <a href="/es/m/function/tablecolumn">Table.Column</a>, que devuelve la columna que se indique con formato de lista:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount")
in
Amount
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0004.png"></a>
Por último, para sumar los valores de la lista la función adecuada es <a href="/es/m/function/listsum">List.Sum</a>:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0005.png"></a>
Si queremos convertir esta consulta en una función de consulta, añadimos la cabecera adecuada y eliminamos las dos primeras fórmulas de paso que inicializan las fechas:
(startDate as date, endDate as date) as number =>
let
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0007.png"></a>
Damos a la consulta un nombre adecuado (<em>SalesInPeriod</em>, por ejemplo) y la invocamos para probarla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0006.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-d8f99066-fecc-47bc-8de1-262e4e883a2b') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> conteniendo un campo <em>Amount</em> con las cifras de ventas, y un campo <em>Order Date</em> conteniendo la fecha de venta. El objetivo es crear una función de consulta que sume las ventas entre dos fechas que se pasen como argumentos.
El primer paso será filtrar la tabla <em>Sales</em> de forma que solo se consideren aquellos registros en los que el campo <em>Order Date</em> se encuentre entre las dos fechas que pasemos a la función. Para esto podemos usar la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a> que nos permite imponer una condición y filtrar la tabla de forma que solo se devuelvan aquellos registros que la cumplan. Su sintaxis es la siguiente:
Table.SelectRows(
table as table,
condition as function
) as table
La condición debe ser una función que devuelva un booleano. En nuestro caso, la condición a satisfacer es (si suponemos que los parámetros de la función que reciben las fechas de comienzo y finalización son startDate y endDate respectivamente):
[Order Date] >= startDate and [Order Date] <= endDate
por lo que podríamos escribir ya una primera versión de nuestra consulta (todavía sin devolver la suma de ventas):
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate)
in
FilteredRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0003.png"></a>
Se han fijado como fechas el 1 y el 30 de junio de 2016 solo para probar el código.
Vemos que los 18 registros devueltos contienen en la columna Order Date una fecha correspondiente a junio de 2016.
Una vez filtrada la tabla, deberemos seleccionar la columna <em>Amount</em>, lo que podemos conseguir extrayendo la columna en cuestión con la función <a href="/es/m/function/tablecolumn">Table.Column</a>, que devuelve la columna que se indique con formato de lista:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount")
in
Amount
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0004.png"></a>
Por último, para sumar los valores de la lista la función adecuada es <a href="/es/m/function/listsum">List.Sum</a>:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0005.png"></a>
Si queremos convertir esta consulta en una función de consulta, añadimos la cabecera adecuada y eliminamos las dos primeras fórmulas de paso que inicializan las fechas:
(startDate as date, endDate as date) as number =>
let
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0007.png"></a>
Damos a la consulta un nombre adecuado (<em>SalesInPeriod</em>, por ejemplo) y la invocamos para probarla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0006.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-d8f99066-fecc-47bc-8de1-262e4e883a2b') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> conteniendo un campo <em>Amount</em> con las cifras de ventas, y un campo <em>Order Date</em> conteniendo la fecha de venta. El objetivo es crear una función de consulta que sume las ventas entre dos fechas que se pasen como argumentos.
El primer paso será filtrar la tabla <em>Sales</em> de forma que solo se consideren aquellos registros en los que el campo <em>Order Date</em> se encuentre entre las dos fechas que pasemos a la función. Para esto podemos usar la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a> que nos permite imponer una condición y filtrar la tabla de forma que solo se devuelvan aquellos registros que la cumplan. Su sintaxis es la siguiente:
Table.SelectRows(
table as table,
condition as function
) as table
La condición debe ser una función que devuelva un booleano. En nuestro caso, la condición a satisfacer es (si suponemos que los parámetros de la función que reciben las fechas de comienzo y finalización son startDate y endDate respectivamente):
[Order Date] >= startDate and [Order Date] <= endDate
por lo que podríamos escribir ya una primera versión de nuestra consulta (todavía sin devolver la suma de ventas):
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate)
in
FilteredRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0003.png"></a>
Se han fijado como fechas el 1 y el 30 de junio de 2016 solo para probar el código.
Vemos que los 18 registros devueltos contienen en la columna Order Date una fecha correspondiente a junio de 2016.
Una vez filtrada la tabla, deberemos seleccionar la columna <em>Amount</em>, lo que podemos conseguir extrayendo la columna en cuestión con la función <a href="/es/m/function/tablecolumn">Table.Column</a>, que devuelve la columna que se indique con formato de lista:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount")
in
Amount
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0004.png"></a>
Por último, para sumar los valores de la lista la función adecuada es <a href="/es/m/function/listsum">List.Sum</a>:
let
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0005.png"></a>
Si queremos convertir esta consulta en una función de consulta, añadimos la cabecera adecuada y eliminamos las dos primeras fórmulas de paso que inicializan las fechas:
(startDate as date, endDate as date) as number =>
let
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0007.png"></a>
Damos a la consulta un nombre adecuado (<em>SalesInPeriod</em>, por ejemplo) y la invocamos para probarla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0006.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-6d867266-8f46-40cb-883c-d5682a3ae9a6') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objetivo de este escenario es crear una función de consulta que reciba un texto de entrada y devuelva otro texto formado por las iniciales de las palabras que formaban el texto de entrada (suponiendo que éstas están separadas por un espacio en blanco).
Lo primero que tenemos que hacer es dividir el texto que reciba la función en palabras y almacenarlas en forma de lista. La función <a href="/es/m/function/texttolist">Text.ToList</a> no es -a pesar de lo que su nombre pueda hacernos pensar- la opción correcta, pues esta función devuelve una lista formada por todos los caracteres del texto que se le pasa como argumento.
Por el contrario, es la función <a href="/es/m/function/textsplit">Text.Split</a> la que nos permite dividir un texto en palabras pudiendo especificar el separador entre ellas. Para probar esta función vamos a crear una nueva consulta en blanco con el siguiente código:
let
text = "Microsoft Power BI Desktop",
words = Text.Split(text, " ")
in
words
El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0001.png"></a>
Efectivamente, este resultado es el que esperábamos.
Ahora viene el proceso más complejo: Queremos recorrer la lista de palabras extrayendo el primer carácter (lo que vamos a conseguir con la función <a href="/es/m/function/textstart">Text.Start</a>) y acumulando estos caracteres en un único texto. Este comportamiento es el que ofrece la función <a href="/es/m/function/listaccumulate">List.Accumulate</a>. Probémosla en la <em>Consulta1 </em>anterior modificando su código:
let
text = "Microsoft Power BI Desktop",
words = Text.Split(text, " "),
acronym = List.Accumulate(
words,
"",
(acronym, word) => acronym & Text.Start(word, 1)
)
in
acronym
El primer argumento de <a href="/es/m/function/listaccumulate">List.Accumulate</a> es la lista a recorrer. El segundo es el primer valor del que partir. En nuestro caso queremos ir acumulando las primeras letras, pero la primera letra queremos añadirla a una cadena de texto vacía, de ahí el valor "" usado. El tercer argumento es la función acumulativa a usar: la nuestra va a recibir el resultado que se haya acumulado hasta el momento (argumento acronym) y la nueva palabra (argumento word) y va a devolver la concatenación del acumulado y la primera letra de la nueva palabra. Este resultado es el que se considerará como "acumulado" en la siguiente iteración.
Por último, para convertir nuestra consulta en una función de consulta, no tenemos más que añadir la cabecera correcta y eliminar la primera fórmula de paso en la que inicializábamos la variable text:
(text as text) as text =>
let
words = Text.Split(text, " "),
acronym = List.Accumulate(
words,
"",
(acronym, word) => acronym & Text.Start(word, 1)
)
in
acronym
Podemos dar a la función un nombre adecuado (acronym, por ejemplo) e invocarla para confirmar que devuelve el resultado que queríamos:
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-6d867266-8f46-40cb-883c-d5682a3ae9a6') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objetivo de este escenario es crear una función de consulta que reciba un texto de entrada y devuelva otro texto formado por las iniciales de las palabras que formaban el texto de entrada (suponiendo que éstas están separadas por un espacio en blanco).
Lo primero que tenemos que hacer es dividir el texto que reciba la función en palabras y almacenarlas en forma de lista. La función <a href="/es/m/function/texttolist">Text.ToList</a> no es -a pesar de lo que su nombre pueda hacernos pensar- la opción correcta, pues esta función devuelve una lista formada por todos los caracteres del texto que se le pasa como argumento.
Por el contrario, es la función <a href="/es/m/function/textsplit">Text.Split</a> la que nos permite dividir un texto en palabras pudiendo especificar el separador entre ellas. Para probar esta función vamos a crear una nueva consulta en blanco con el siguiente código:
let
text = "Microsoft Power BI Desktop",
words = Text.Split(text, " ")
in
words
El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0001.png"></a>
Efectivamente, este resultado es el que esperábamos.
Ahora viene el proceso más complejo: Queremos recorrer la lista de palabras extrayendo el primer carácter (lo que vamos a conseguir con la función <a href="/es/m/function/textstart">Text.Start</a>) y acumulando estos caracteres en un único texto. Este comportamiento es el que ofrece la función <a href="/es/m/function/listaccumulate">List.Accumulate</a>. Probémosla en la <em>Consulta1 </em>anterior modificando su código:
let
text = "Microsoft Power BI Desktop",
words = Text.Split(text, " "),
acronym = List.Accumulate(
words,
"",
(acronym, word) => acronym & Text.Start(word, 1)
)
in
acronym
El primer argumento de <a href="/es/m/function/listaccumulate">List.Accumulate</a> es la lista a recorrer. El segundo es el primer valor del que partir. En nuestro caso queremos ir acumulando las primeras letras, pero la primera letra queremos añadirla a una cadena de texto vacía, de ahí el valor "" usado. El tercer argumento es la función acumulativa a usar: la nuestra va a recibir el resultado que se haya acumulado hasta el momento (argumento acronym) y la nueva palabra (argumento word) y va a devolver la concatenación del acumulado y la primera letra de la nueva palabra. Este resultado es el que se considerará como "acumulado" en la siguiente iteración.
Por último, para convertir nuestra consulta en una función de consulta, no tenemos más que añadir la cabecera correcta y eliminar la primera fórmula de paso en la que inicializábamos la variable text:
(text as text) as text =>
let
words = Text.Split(text, " "),
acronym = List.Accumulate(
words,
"",
(acronym, word) => acronym & Text.Start(word, 1)
)
in
acronym
Podemos dar a la función un nombre adecuado (acronym, por ejemplo) e invocarla para confirmar que devuelve el resultado que queríamos:
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-6d867266-8f46-40cb-883c-d5682a3ae9a6') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objetivo de este escenario es crear una función de consulta que reciba un texto de entrada y devuelva otro texto formado por las iniciales de las palabras que formaban el texto de entrada (suponiendo que éstas están separadas por un espacio en blanco).
Lo primero que tenemos que hacer es dividir el texto que reciba la función en palabras y almacenarlas en forma de lista. La función <a href="/es/m/function/texttolist">Text.ToList</a> no es -a pesar de lo que su nombre pueda hacernos pensar- la opción correcta, pues esta función devuelve una lista formada por todos los caracteres del texto que se le pasa como argumento.
Por el contrario, es la función <a href="/es/m/function/textsplit">Text.Split</a> la que nos permite dividir un texto en palabras pudiendo especificar el separador entre ellas. Para probar esta función vamos a crear una nueva consulta en blanco con el siguiente código:
let
text = "Microsoft Power BI Desktop",
words = Text.Split(text, " ")
in
words
El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0001.png"></a>
Efectivamente, este resultado es el que esperábamos.
Ahora viene el proceso más complejo: Queremos recorrer la lista de palabras extrayendo el primer carácter (lo que vamos a conseguir con la función <a href="/es/m/function/textstart">Text.Start</a>) y acumulando estos caracteres en un único texto. Este comportamiento es el que ofrece la función <a href="/es/m/function/listaccumulate">List.Accumulate</a>. Probémosla en la <em>Consulta1 </em>anterior modificando su código:
let
text = "Microsoft Power BI Desktop",
words = Text.Split(text, " "),
acronym = List.Accumulate(
words,
"",
(acronym, word) => acronym & Text.Start(word, 1)
)
in
acronym
El primer argumento de <a href="/es/m/function/listaccumulate">List.Accumulate</a> es la lista a recorrer. El segundo es el primer valor del que partir. En nuestro caso queremos ir acumulando las primeras letras, pero la primera letra queremos añadirla a una cadena de texto vacía, de ahí el valor "" usado. El tercer argumento es la función acumulativa a usar: la nuestra va a recibir el resultado que se haya acumulado hasta el momento (argumento acronym) y la nueva palabra (argumento word) y va a devolver la concatenación del acumulado y la primera letra de la nueva palabra. Este resultado es el que se considerará como "acumulado" en la siguiente iteración.
Por último, para convertir nuestra consulta en una función de consulta, no tenemos más que añadir la cabecera correcta y eliminar la primera fórmula de paso en la que inicializábamos la variable text:
(text as text) as text =>
let
words = Text.Split(text, " "),
acronym = List.Accumulate(
words,
"",
(acronym, word) => acronym & Text.Start(word, 1)
)
in
acronym
Podemos dar a la función un nombre adecuado (acronym, por ejemplo) e invocarla para confirmar que devuelve el resultado que queríamos:
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-6d867266-8f46-40cb-883c-d5682a3ae9a6') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objetivo de este escenario es crear una función de consulta que reciba un texto de entrada y devuelva otro texto formado por las iniciales de las palabras que formaban el texto de entrada (suponiendo que éstas están separadas por un espacio en blanco).
Lo primero que tenemos que hacer es dividir el texto que reciba la función en palabras y almacenarlas en forma de lista. La función <a href="/es/m/function/texttolist">Text.ToList</a> no es -a pesar de lo que su nombre pueda hacernos pensar- la opción correcta, pues esta función devuelve una lista formada por todos los caracteres del texto que se le pasa como argumento.
Por el contrario, es la función <a href="/es/m/function/textsplit">Text.Split</a> la que nos permite dividir un texto en palabras pudiendo especificar el separador entre ellas. Para probar esta función vamos a crear una nueva consulta en blanco con el siguiente código:
let
text = "Microsoft Power BI Desktop",
words = Text.Split(text, " ")
in
words
El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0001.png"></a>
Efectivamente, este resultado es el que esperábamos.
Ahora viene el proceso más complejo: Queremos recorrer la lista de palabras extrayendo el primer carácter (lo que vamos a conseguir con la función <a href="/es/m/function/textstart">Text.Start</a>) y acumulando estos caracteres en un único texto. Este comportamiento es el que ofrece la función <a href="/es/m/function/listaccumulate">List.Accumulate</a>. Probémosla en la <em>Consulta1 </em>anterior modificando su código:
let
text = "Microsoft Power BI Desktop",
words = Text.Split(text, " "),
acronym = List.Accumulate(
words,
"",
(acronym, word) => acronym & Text.Start(word, 1)
)
in
acronym
El primer argumento de <a href="/es/m/function/listaccumulate">List.Accumulate</a> es la lista a recorrer. El segundo es el primer valor del que partir. En nuestro caso queremos ir acumulando las primeras letras, pero la primera letra queremos añadirla a una cadena de texto vacía, de ahí el valor "" usado. El tercer argumento es la función acumulativa a usar: la nuestra va a recibir el resultado que se haya acumulado hasta el momento (argumento acronym) y la nueva palabra (argumento word) y va a devolver la concatenación del acumulado y la primera letra de la nueva palabra. Este resultado es el que se considerará como "acumulado" en la siguiente iteración.
Por último, para convertir nuestra consulta en una función de consulta, no tenemos más que añadir la cabecera correcta y eliminar la primera fórmula de paso en la que inicializábamos la variable text:
(text as text) as text =>
let
words = Text.Split(text, " "),
acronym = List.Accumulate(
words,
"",
(acronym, word) => acronym & Text.Start(word, 1)
)
in
acronym
Podemos dar a la función un nombre adecuado (acronym, por ejemplo) e invocarla para confirmar que devuelve el resultado que queríamos:
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-fb87303b-a0a4-4534-9e35-49416cdddf62') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> que contiene en el campo <em>Amount</em> la cifra de ventas y en el campo <em>Customer Id</em> una referencia al cliente asociado.
El objetivo es obtener una función de consulta que reciba un número n como argumento y devuelva una tabla conteniendo los n clientes con mayor facturación, ordenada de mayor a menor facturación. Esta tabla deberá tener dos columnas con información del identificador del cliente y la suma de sus compras.
Para empezar a trabajar en la consulta, supongamos que queremos extraer 5 clientes. El primer paso consiste en calcular, para cada cliente, sus ventas (posteriormente ordenaremos esta tabla y seleccionaremos el número de filas que nos interesa).
Para esto, el lenguaje M nos ofrece la función <a href="/es/m/function/tablegroup">Table.Group</a>, que agrega una tabla según un campo, y añade columnas calculadas adicionales obtenidas tras realizar esta agregación.
En nuestro caso queremos agrupar la tabla de ventas según el campo <em>Customer Id</em> y queremos añadir una nueva columna (a la que podemos llamar <em>Total Sales</em>) que contenga la suma de ventas de cada cliente identificado.
La función <a href="/es/m/function/tablegroup">Table.Group</a> requiere tres argumentos principales: la tabla a agregar (Sales), el campo (o los campos) según los cuales se va a realizar la agregación (Customer Id) y una lista conteniendo información sobre las columnas a crear: para cada una habrá que añadir una lista con el nombre de la columna y la función que va a determinar los valores de la misma (es decir, su <em>función generadora</em>). Nosotros solo queremos crear una columna, de forma que, parcialmente en pseudo-código, nuestra fórmula de paso sería la siguiente:
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", función-generadora, type number}
}
)
Nuestra función generadora deberá sumar los valores de la columna <em>Amount</em> (recordemos que, cuando se aplique nuestra función generadora, la tabla va a estar filtrada según el valor de <em>Customer Id</em> que se esté considerando). Para realizar esta suma podemos usar la función <a href="/es/m/function/listsum">List.Sum</a>, lo que significa que nuestra función generadora puede ser la siguiente:
each List.Sum([Amount])
Nuestra consulta quedaría, por lo tanto, del siguiente modo:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
)
in
GroupedRows
Obsérvese que en el bloque que especifica la creación de la columna <em>Total Sales</em> se ha añadido como tercer argumento el tipo de la columna a crear:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0008.png"></a>
Ahora viene la parte más sencilla: ordenar y seleccionar las primeras filas. Para ordenar la tabla vamos a usar la función <a href="/es/m/function/tablesort">Table.Sort</a>. Esta función recibe una tabla y los criterios de ordenación, devolviendo la tabla ordenada. En nuestro escenario el criterio de ordenación viene determinado por el contenido de la columna <em>Total Sales</em>, y queremos que la ordenación sea descendente, lo que quiere decir que nuestra función de paso podría ser la siguiente:
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
)
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0009.png"></a>
Vemos en la imagen anterior que los clientes ya se muestran ordenados según su facturación.
Para quedarnos con las primeras numberOfCustomers filas, no tenemos más que recurrir a la función <a href="/es/m/function/tablefirstn">Table.FirstN</a>, con lo que nuestra consulta quedaría así:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0010.png"></a>
Ahora, para convertir nuestra consulta en una función de consulta, añadimos la cabecera y eliminamos la fórmula de paso que asigna el valor 5 a la variable numberOfCustomers:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
Le damos un nombre apropiado (<em>TopCustomers</em>, por ejemplo) y la invocamos para ver el resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
(en la imagen anterior se muestra el resultado de pasar a la función el número 3 como argumento)
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-fb87303b-a0a4-4534-9e35-49416cdddf62') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> que contiene en el campo <em>Amount</em> la cifra de ventas y en el campo <em>Customer Id</em> una referencia al cliente asociado.
El objetivo es obtener una función de consulta que reciba un número n como argumento y devuelva una tabla conteniendo los n clientes con mayor facturación, ordenada de mayor a menor facturación. Esta tabla deberá tener dos columnas con información del identificador del cliente y la suma de sus compras.
Para empezar a trabajar en la consulta, supongamos que queremos extraer 5 clientes. El primer paso consiste en calcular, para cada cliente, sus ventas (posteriormente ordenaremos esta tabla y seleccionaremos el número de filas que nos interesa).
Para esto, el lenguaje M nos ofrece la función <a href="/es/m/function/tablegroup">Table.Group</a>, que agrega una tabla según un campo, y añade columnas calculadas adicionales obtenidas tras realizar esta agregación.
En nuestro caso queremos agrupar la tabla de ventas según el campo <em>Customer Id</em> y queremos añadir una nueva columna (a la que podemos llamar <em>Total Sales</em>) que contenga la suma de ventas de cada cliente identificado.
La función <a href="/es/m/function/tablegroup">Table.Group</a> requiere tres argumentos principales: la tabla a agregar (Sales), el campo (o los campos) según los cuales se va a realizar la agregación (Customer Id) y una lista conteniendo información sobre las columnas a crear: para cada una habrá que añadir una lista con el nombre de la columna y la función que va a determinar los valores de la misma (es decir, su <em>función generadora</em>). Nosotros solo queremos crear una columna, de forma que, parcialmente en pseudo-código, nuestra fórmula de paso sería la siguiente:
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", función-generadora, type number}
}
)
Nuestra función generadora deberá sumar los valores de la columna <em>Amount</em> (recordemos que, cuando se aplique nuestra función generadora, la tabla va a estar filtrada según el valor de <em>Customer Id</em> que se esté considerando). Para realizar esta suma podemos usar la función <a href="/es/m/function/listsum">List.Sum</a>, lo que significa que nuestra función generadora puede ser la siguiente:
each List.Sum([Amount])
Nuestra consulta quedaría, por lo tanto, del siguiente modo:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
)
in
GroupedRows
Obsérvese que en el bloque que especifica la creación de la columna <em>Total Sales</em> se ha añadido como tercer argumento el tipo de la columna a crear:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0008.png"></a>
Ahora viene la parte más sencilla: ordenar y seleccionar las primeras filas. Para ordenar la tabla vamos a usar la función <a href="/es/m/function/tablesort">Table.Sort</a>. Esta función recibe una tabla y los criterios de ordenación, devolviendo la tabla ordenada. En nuestro escenario el criterio de ordenación viene determinado por el contenido de la columna <em>Total Sales</em>, y queremos que la ordenación sea descendente, lo que quiere decir que nuestra función de paso podría ser la siguiente:
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
)
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0009.png"></a>
Vemos en la imagen anterior que los clientes ya se muestran ordenados según su facturación.
Para quedarnos con las primeras numberOfCustomers filas, no tenemos más que recurrir a la función <a href="/es/m/function/tablefirstn">Table.FirstN</a>, con lo que nuestra consulta quedaría así:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0010.png"></a>
Ahora, para convertir nuestra consulta en una función de consulta, añadimos la cabecera y eliminamos la fórmula de paso que asigna el valor 5 a la variable numberOfCustomers:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
Le damos un nombre apropiado (<em>TopCustomers</em>, por ejemplo) y la invocamos para ver el resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
(en la imagen anterior se muestra el resultado de pasar a la función el número 3 como argumento)
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-fb87303b-a0a4-4534-9e35-49416cdddf62') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> que contiene en el campo <em>Amount</em> la cifra de ventas y en el campo <em>Customer Id</em> una referencia al cliente asociado.
El objetivo es obtener una función de consulta que reciba un número n como argumento y devuelva una tabla conteniendo los n clientes con mayor facturación, ordenada de mayor a menor facturación. Esta tabla deberá tener dos columnas con información del identificador del cliente y la suma de sus compras.
Para empezar a trabajar en la consulta, supongamos que queremos extraer 5 clientes. El primer paso consiste en calcular, para cada cliente, sus ventas (posteriormente ordenaremos esta tabla y seleccionaremos el número de filas que nos interesa).
Para esto, el lenguaje M nos ofrece la función <a href="/es/m/function/tablegroup">Table.Group</a>, que agrega una tabla según un campo, y añade columnas calculadas adicionales obtenidas tras realizar esta agregación.
En nuestro caso queremos agrupar la tabla de ventas según el campo <em>Customer Id</em> y queremos añadir una nueva columna (a la que podemos llamar <em>Total Sales</em>) que contenga la suma de ventas de cada cliente identificado.
La función <a href="/es/m/function/tablegroup">Table.Group</a> requiere tres argumentos principales: la tabla a agregar (Sales), el campo (o los campos) según los cuales se va a realizar la agregación (Customer Id) y una lista conteniendo información sobre las columnas a crear: para cada una habrá que añadir una lista con el nombre de la columna y la función que va a determinar los valores de la misma (es decir, su <em>función generadora</em>). Nosotros solo queremos crear una columna, de forma que, parcialmente en pseudo-código, nuestra fórmula de paso sería la siguiente:
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", función-generadora, type number}
}
)
Nuestra función generadora deberá sumar los valores de la columna <em>Amount</em> (recordemos que, cuando se aplique nuestra función generadora, la tabla va a estar filtrada según el valor de <em>Customer Id</em> que se esté considerando). Para realizar esta suma podemos usar la función <a href="/es/m/function/listsum">List.Sum</a>, lo que significa que nuestra función generadora puede ser la siguiente:
each List.Sum([Amount])
Nuestra consulta quedaría, por lo tanto, del siguiente modo:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
)
in
GroupedRows
Obsérvese que en el bloque que especifica la creación de la columna <em>Total Sales</em> se ha añadido como tercer argumento el tipo de la columna a crear:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0008.png"></a>
Ahora viene la parte más sencilla: ordenar y seleccionar las primeras filas. Para ordenar la tabla vamos a usar la función <a href="/es/m/function/tablesort">Table.Sort</a>. Esta función recibe una tabla y los criterios de ordenación, devolviendo la tabla ordenada. En nuestro escenario el criterio de ordenación viene determinado por el contenido de la columna <em>Total Sales</em>, y queremos que la ordenación sea descendente, lo que quiere decir que nuestra función de paso podría ser la siguiente:
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
)
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0009.png"></a>
Vemos en la imagen anterior que los clientes ya se muestran ordenados según su facturación.
Para quedarnos con las primeras numberOfCustomers filas, no tenemos más que recurrir a la función <a href="/es/m/function/tablefirstn">Table.FirstN</a>, con lo que nuestra consulta quedaría así:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0010.png"></a>
Ahora, para convertir nuestra consulta en una función de consulta, añadimos la cabecera y eliminamos la fórmula de paso que asigna el valor 5 a la variable numberOfCustomers:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
Le damos un nombre apropiado (<em>TopCustomers</em>, por ejemplo) y la invocamos para ver el resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
(en la imagen anterior se muestra el resultado de pasar a la función el número 3 como argumento)
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-fb87303b-a0a4-4534-9e35-49416cdddf62') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> que contiene en el campo <em>Amount</em> la cifra de ventas y en el campo <em>Customer Id</em> una referencia al cliente asociado.
El objetivo es obtener una función de consulta que reciba un número n como argumento y devuelva una tabla conteniendo los n clientes con mayor facturación, ordenada de mayor a menor facturación. Esta tabla deberá tener dos columnas con información del identificador del cliente y la suma de sus compras.
Para empezar a trabajar en la consulta, supongamos que queremos extraer 5 clientes. El primer paso consiste en calcular, para cada cliente, sus ventas (posteriormente ordenaremos esta tabla y seleccionaremos el número de filas que nos interesa).
Para esto, el lenguaje M nos ofrece la función <a href="/es/m/function/tablegroup">Table.Group</a>, que agrega una tabla según un campo, y añade columnas calculadas adicionales obtenidas tras realizar esta agregación.
En nuestro caso queremos agrupar la tabla de ventas según el campo <em>Customer Id</em> y queremos añadir una nueva columna (a la que podemos llamar <em>Total Sales</em>) que contenga la suma de ventas de cada cliente identificado.
La función <a href="/es/m/function/tablegroup">Table.Group</a> requiere tres argumentos principales: la tabla a agregar (Sales), el campo (o los campos) según los cuales se va a realizar la agregación (Customer Id) y una lista conteniendo información sobre las columnas a crear: para cada una habrá que añadir una lista con el nombre de la columna y la función que va a determinar los valores de la misma (es decir, su <em>función generadora</em>). Nosotros solo queremos crear una columna, de forma que, parcialmente en pseudo-código, nuestra fórmula de paso sería la siguiente:
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", función-generadora, type number}
}
)
Nuestra función generadora deberá sumar los valores de la columna <em>Amount</em> (recordemos que, cuando se aplique nuestra función generadora, la tabla va a estar filtrada según el valor de <em>Customer Id</em> que se esté considerando). Para realizar esta suma podemos usar la función <a href="/es/m/function/listsum">List.Sum</a>, lo que significa que nuestra función generadora puede ser la siguiente:
each List.Sum([Amount])
Nuestra consulta quedaría, por lo tanto, del siguiente modo:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
)
in
GroupedRows
Obsérvese que en el bloque que especifica la creación de la columna <em>Total Sales</em> se ha añadido como tercer argumento el tipo de la columna a crear:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0008.png"></a>
Ahora viene la parte más sencilla: ordenar y seleccionar las primeras filas. Para ordenar la tabla vamos a usar la función <a href="/es/m/function/tablesort">Table.Sort</a>. Esta función recibe una tabla y los criterios de ordenación, devolviendo la tabla ordenada. En nuestro escenario el criterio de ordenación viene determinado por el contenido de la columna <em>Total Sales</em>, y queremos que la ordenación sea descendente, lo que quiere decir que nuestra función de paso podría ser la siguiente:
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
)
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0009.png"></a>
Vemos en la imagen anterior que los clientes ya se muestran ordenados según su facturación.
Para quedarnos con las primeras numberOfCustomers filas, no tenemos más que recurrir a la función <a href="/es/m/function/tablefirstn">Table.FirstN</a>, con lo que nuestra consulta quedaría así:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0010.png"></a>
Ahora, para convertir nuestra consulta en una función de consulta, añadimos la cabecera y eliminamos la fórmula de paso que asigna el valor 5 a la variable numberOfCustomers:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
Le damos un nombre apropiado (<em>TopCustomers</em>, por ejemplo) y la invocamos para ver el resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
(en la imagen anterior se muestra el resultado de pasar a la función el número 3 como argumento)
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-22d1b4bd-e6c7-4a64-99fe-6ce9b956ca6e') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> que contiene en el campo <em>Amount</em> la cifra de ventas y en el campo <em>Customer Id</em> una referencia al cliente asociado.
El objetivo es obtener una función de consulta que reciba un número n como argumento y devuelva una tabla conteniendo los n clientes con mayor facturación, ordenada de mayor a menor facturación. Esta tabla deberá tener dos columnas con información del identificador del cliente y la suma de sus compras.
Para empezar a trabajar en la consulta, supongamos que queremos extraer 5 clientes. El primer paso consiste en calcular, para cada cliente, sus ventas (posteriormente ordenaremos esta tabla y seleccionaremos el número de filas que nos interesa).
Para esto, el lenguaje M nos ofrece la función <a href="/es/m/function/tablegroup">Table.Group</a>, que agrega una tabla según un campo, y añade columnas calculadas adicionales obtenidas tras realizar esta agregación.
En nuestro caso queremos agrupar la tabla de ventas según el campo <em>Customer Id</em> y queremos añadir una nueva columna (a la que podemos llamar <em>Total Sales</em>) que contenga la suma de ventas de cada cliente identificado.
La función <a href="/es/m/function/tablegroup">Table.Group</a> requiere tres argumentos principales: la tabla a agregar (Sales), el campo (o los campos) según los cuales se va a realizar la agregación (Customer Id) y una lista conteniendo información sobre las columnas a crear: para cada una habrá que añadir una lista con el nombre de la columna y la función que va a determinar los valores de la misma (es decir, su <em>función generadora</em>). Nosotros solo queremos crear una columna, de forma que, parcialmente en pseudo-código, nuestra fórmula de paso sería la siguiente:
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", función-generadora, type number}
}
)
Nuestra función generadora deberá sumar los valores de la columna <em>Amount</em> (recordemos que, cuando se aplique nuestra función generadora, la tabla va a estar filtrada según el valor de <em>Customer Id</em> que se esté considerando). Para realizar esta suma podemos usar la función <a href="/es/m/function/listsum">List.Sum</a>, lo que significa que nuestra función generadora puede ser la siguiente:
each List.Sum([Amount])
Nuestra consulta quedaría, por lo tanto, del siguiente modo:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
)
in
GroupedRows
Obsérvese que en el bloque que especifica la creación de la columna <em>Total Sales</em> se ha añadido como tercer argumento el tipo de la columna a crear:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0008.png"></a>
Ahora viene la parte más sencilla: ordenar y seleccionar las primeras filas. Para ordenar la tabla vamos a usar la función <a href="/es/m/function/tablesort">Table.Sort</a>. Esta función recibe una tabla y los criterios de ordenación, devolviendo la tabla ordenada. En nuestro escenario el criterio de ordenación viene determinado por el contenido de la columna <em>Total Sales</em>, y queremos que la ordenación sea descendente, lo que quiere decir que nuestra función de paso podría ser la siguiente:
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
)
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0009.png"></a>
Vemos en la imagen anterior que los clientes ya se muestran ordenados según su facturación.
Para quedarnos con las primeras numberOfCustomers filas, no tenemos más que recurrir a la función <a href="/es/m/function/tablefirstn">Table.FirstN</a>, con lo que nuestra consulta quedaría así:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0010.png"></a>
Ahora, para convertir nuestra consulta en una función de consulta, añadimos la cabecera y eliminamos la fórmula de paso que asigna el valor 5 a la variable numberOfCustomers:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
Le damos un nombre apropiado (<em>TopCustomers</em>, por ejemplo) y la invocamos para ver el resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
(en la imagen anterior se muestra el resultado de pasar a la función el número 3 como argumento)
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-22d1b4bd-e6c7-4a64-99fe-6ce9b956ca6e') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> que contiene en el campo <em>Amount</em> la cifra de ventas y en el campo <em>Customer Id</em> una referencia al cliente asociado.
El objetivo es obtener una función de consulta que reciba un número n como argumento y devuelva una tabla conteniendo los n clientes con mayor facturación, ordenada de mayor a menor facturación. Esta tabla deberá tener dos columnas con información del identificador del cliente y la suma de sus compras.
Para empezar a trabajar en la consulta, supongamos que queremos extraer 5 clientes. El primer paso consiste en calcular, para cada cliente, sus ventas (posteriormente ordenaremos esta tabla y seleccionaremos el número de filas que nos interesa).
Para esto, el lenguaje M nos ofrece la función <a href="/es/m/function/tablegroup">Table.Group</a>, que agrega una tabla según un campo, y añade columnas calculadas adicionales obtenidas tras realizar esta agregación.
En nuestro caso queremos agrupar la tabla de ventas según el campo <em>Customer Id</em> y queremos añadir una nueva columna (a la que podemos llamar <em>Total Sales</em>) que contenga la suma de ventas de cada cliente identificado.
La función <a href="/es/m/function/tablegroup">Table.Group</a> requiere tres argumentos principales: la tabla a agregar (Sales), el campo (o los campos) según los cuales se va a realizar la agregación (Customer Id) y una lista conteniendo información sobre las columnas a crear: para cada una habrá que añadir una lista con el nombre de la columna y la función que va a determinar los valores de la misma (es decir, su <em>función generadora</em>). Nosotros solo queremos crear una columna, de forma que, parcialmente en pseudo-código, nuestra fórmula de paso sería la siguiente:
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", función-generadora, type number}
}
)
Nuestra función generadora deberá sumar los valores de la columna <em>Amount</em> (recordemos que, cuando se aplique nuestra función generadora, la tabla va a estar filtrada según el valor de <em>Customer Id</em> que se esté considerando). Para realizar esta suma podemos usar la función <a href="/es/m/function/listsum">List.Sum</a>, lo que significa que nuestra función generadora puede ser la siguiente:
each List.Sum([Amount])
Nuestra consulta quedaría, por lo tanto, del siguiente modo:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
)
in
GroupedRows
Obsérvese que en el bloque que especifica la creación de la columna <em>Total Sales</em> se ha añadido como tercer argumento el tipo de la columna a crear:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0008.png"></a>
Ahora viene la parte más sencilla: ordenar y seleccionar las primeras filas. Para ordenar la tabla vamos a usar la función <a href="/es/m/function/tablesort">Table.Sort</a>. Esta función recibe una tabla y los criterios de ordenación, devolviendo la tabla ordenada. En nuestro escenario el criterio de ordenación viene determinado por el contenido de la columna <em>Total Sales</em>, y queremos que la ordenación sea descendente, lo que quiere decir que nuestra función de paso podría ser la siguiente:
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
)
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0009.png"></a>
Vemos en la imagen anterior que los clientes ya se muestran ordenados según su facturación.
Para quedarnos con las primeras numberOfCustomers filas, no tenemos más que recurrir a la función <a href="/es/m/function/tablefirstn">Table.FirstN</a>, con lo que nuestra consulta quedaría así:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0010.png"></a>
Ahora, para convertir nuestra consulta en una función de consulta, añadimos la cabecera y eliminamos la fórmula de paso que asigna el valor 5 a la variable numberOfCustomers:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
Le damos un nombre apropiado (<em>TopCustomers</em>, por ejemplo) y la invocamos para ver el resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
(en la imagen anterior se muestra el resultado de pasar a la función el número 3 como argumento)
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-22d1b4bd-e6c7-4a64-99fe-6ce9b956ca6e') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> que contiene en el campo <em>Amount</em> la cifra de ventas y en el campo <em>Customer Id</em> una referencia al cliente asociado.
El objetivo es obtener una función de consulta que reciba un número n como argumento y devuelva una tabla conteniendo los n clientes con mayor facturación, ordenada de mayor a menor facturación. Esta tabla deberá tener dos columnas con información del identificador del cliente y la suma de sus compras.
Para empezar a trabajar en la consulta, supongamos que queremos extraer 5 clientes. El primer paso consiste en calcular, para cada cliente, sus ventas (posteriormente ordenaremos esta tabla y seleccionaremos el número de filas que nos interesa).
Para esto, el lenguaje M nos ofrece la función <a href="/es/m/function/tablegroup">Table.Group</a>, que agrega una tabla según un campo, y añade columnas calculadas adicionales obtenidas tras realizar esta agregación.
En nuestro caso queremos agrupar la tabla de ventas según el campo <em>Customer Id</em> y queremos añadir una nueva columna (a la que podemos llamar <em>Total Sales</em>) que contenga la suma de ventas de cada cliente identificado.
La función <a href="/es/m/function/tablegroup">Table.Group</a> requiere tres argumentos principales: la tabla a agregar (Sales), el campo (o los campos) según los cuales se va a realizar la agregación (Customer Id) y una lista conteniendo información sobre las columnas a crear: para cada una habrá que añadir una lista con el nombre de la columna y la función que va a determinar los valores de la misma (es decir, su <em>función generadora</em>). Nosotros solo queremos crear una columna, de forma que, parcialmente en pseudo-código, nuestra fórmula de paso sería la siguiente:
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", función-generadora, type number}
}
)
Nuestra función generadora deberá sumar los valores de la columna <em>Amount</em> (recordemos que, cuando se aplique nuestra función generadora, la tabla va a estar filtrada según el valor de <em>Customer Id</em> que se esté considerando). Para realizar esta suma podemos usar la función <a href="/es/m/function/listsum">List.Sum</a>, lo que significa que nuestra función generadora puede ser la siguiente:
each List.Sum([Amount])
Nuestra consulta quedaría, por lo tanto, del siguiente modo:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
)
in
GroupedRows
Obsérvese que en el bloque que especifica la creación de la columna <em>Total Sales</em> se ha añadido como tercer argumento el tipo de la columna a crear:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0008.png"></a>
Ahora viene la parte más sencilla: ordenar y seleccionar las primeras filas. Para ordenar la tabla vamos a usar la función <a href="/es/m/function/tablesort">Table.Sort</a>. Esta función recibe una tabla y los criterios de ordenación, devolviendo la tabla ordenada. En nuestro escenario el criterio de ordenación viene determinado por el contenido de la columna <em>Total Sales</em>, y queremos que la ordenación sea descendente, lo que quiere decir que nuestra función de paso podría ser la siguiente:
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
)
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0009.png"></a>
Vemos en la imagen anterior que los clientes ya se muestran ordenados según su facturación.
Para quedarnos con las primeras numberOfCustomers filas, no tenemos más que recurrir a la función <a href="/es/m/function/tablefirstn">Table.FirstN</a>, con lo que nuestra consulta quedaría así:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0010.png"></a>
Ahora, para convertir nuestra consulta en una función de consulta, añadimos la cabecera y eliminamos la fórmula de paso que asigna el valor 5 a la variable numberOfCustomers:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
Le damos un nombre apropiado (<em>TopCustomers</em>, por ejemplo) y la invocamos para ver el resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
(en la imagen anterior se muestra el resultado de pasar a la función el número 3 como argumento)
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-22d1b4bd-e6c7-4a64-99fe-6ce9b956ca6e') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> que contiene en el campo <em>Amount</em> la cifra de ventas y en el campo <em>Customer Id</em> una referencia al cliente asociado.
El objetivo es obtener una función de consulta que reciba un número n como argumento y devuelva una tabla conteniendo los n clientes con mayor facturación, ordenada de mayor a menor facturación. Esta tabla deberá tener dos columnas con información del identificador del cliente y la suma de sus compras.
Para empezar a trabajar en la consulta, supongamos que queremos extraer 5 clientes. El primer paso consiste en calcular, para cada cliente, sus ventas (posteriormente ordenaremos esta tabla y seleccionaremos el número de filas que nos interesa).
Para esto, el lenguaje M nos ofrece la función <a href="/es/m/function/tablegroup">Table.Group</a>, que agrega una tabla según un campo, y añade columnas calculadas adicionales obtenidas tras realizar esta agregación.
En nuestro caso queremos agrupar la tabla de ventas según el campo <em>Customer Id</em> y queremos añadir una nueva columna (a la que podemos llamar <em>Total Sales</em>) que contenga la suma de ventas de cada cliente identificado.
La función <a href="/es/m/function/tablegroup">Table.Group</a> requiere tres argumentos principales: la tabla a agregar (Sales), el campo (o los campos) según los cuales se va a realizar la agregación (Customer Id) y una lista conteniendo información sobre las columnas a crear: para cada una habrá que añadir una lista con el nombre de la columna y la función que va a determinar los valores de la misma (es decir, su <em>función generadora</em>). Nosotros solo queremos crear una columna, de forma que, parcialmente en pseudo-código, nuestra fórmula de paso sería la siguiente:
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", función-generadora, type number}
}
)
Nuestra función generadora deberá sumar los valores de la columna <em>Amount</em> (recordemos que, cuando se aplique nuestra función generadora, la tabla va a estar filtrada según el valor de <em>Customer Id</em> que se esté considerando). Para realizar esta suma podemos usar la función <a href="/es/m/function/listsum">List.Sum</a>, lo que significa que nuestra función generadora puede ser la siguiente:
each List.Sum([Amount])
Nuestra consulta quedaría, por lo tanto, del siguiente modo:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
)
in
GroupedRows
Obsérvese que en el bloque que especifica la creación de la columna <em>Total Sales</em> se ha añadido como tercer argumento el tipo de la columna a crear:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0008.png"></a>
Ahora viene la parte más sencilla: ordenar y seleccionar las primeras filas. Para ordenar la tabla vamos a usar la función <a href="/es/m/function/tablesort">Table.Sort</a>. Esta función recibe una tabla y los criterios de ordenación, devolviendo la tabla ordenada. En nuestro escenario el criterio de ordenación viene determinado por el contenido de la columna <em>Total Sales</em>, y queremos que la ordenación sea descendente, lo que quiere decir que nuestra función de paso podría ser la siguiente:
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
)
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0009.png"></a>
Vemos en la imagen anterior que los clientes ya se muestran ordenados según su facturación.
Para quedarnos con las primeras numberOfCustomers filas, no tenemos más que recurrir a la función <a href="/es/m/function/tablefirstn">Table.FirstN</a>, con lo que nuestra consulta quedaría así:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0010.png"></a>
Ahora, para convertir nuestra consulta en una función de consulta, añadimos la cabecera y eliminamos la fórmula de paso que asigna el valor 5 a la variable numberOfCustomers:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
Le damos un nombre apropiado (<em>TopCustomers</em>, por ejemplo) y la invocamos para ver el resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
(en la imagen anterior se muestra el resultado de pasar a la función el número 3 como argumento)
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-54f96f44-a649-4cf4-820d-fdeeca8af025') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> que contiene en el campo <em>Amount</em> la cifra de ventas y en el campo <em>Customer Id</em> una referencia al cliente asociado.
El objetivo es obtener una función de consulta que reciba un número n como argumento y devuelva una tabla conteniendo los n clientes con mayor facturación, ordenada de mayor a menor facturación. Esta tabla deberá tener dos columnas con información del identificador del cliente y la suma de sus compras.
Para empezar a trabajar en la consulta, supongamos que queremos extraer 5 clientes. El primer paso consiste en calcular, para cada cliente, sus ventas (posteriormente ordenaremos esta tabla y seleccionaremos el número de filas que nos interesa).
Para esto, el lenguaje M nos ofrece la función <a href="/es/m/function/tablegroup">Table.Group</a>, que agrega una tabla según un campo, y añade columnas calculadas adicionales obtenidas tras realizar esta agregación.
En nuestro caso queremos agrupar la tabla de ventas según el campo <em>Customer Id</em> y queremos añadir una nueva columna (a la que podemos llamar <em>Total Sales</em>) que contenga la suma de ventas de cada cliente identificado.
La función <a href="/es/m/function/tablegroup">Table.Group</a> requiere tres argumentos principales: la tabla a agregar (Sales), el campo (o los campos) según los cuales se va a realizar la agregación (Customer Id) y una lista conteniendo información sobre las columnas a crear: para cada una habrá que añadir una lista con el nombre de la columna y la función que va a determinar los valores de la misma (es decir, su <em>función generadora</em>). Nosotros solo queremos crear una columna, de forma que, parcialmente en pseudo-código, nuestra fórmula de paso sería la siguiente:
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", función-generadora, type number}
}
)
Nuestra función generadora deberá sumar los valores de la columna <em>Amount</em> (recordemos que, cuando se aplique nuestra función generadora, la tabla va a estar filtrada según el valor de <em>Customer Id</em> que se esté considerando). Para realizar esta suma podemos usar la función <a href="/es/m/function/listsum">List.Sum</a>, lo que significa que nuestra función generadora puede ser la siguiente:
each List.Sum([Amount])
Nuestra consulta quedaría, por lo tanto, del siguiente modo:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
)
in
GroupedRows
Obsérvese que en el bloque que especifica la creación de la columna <em>Total Sales</em> se ha añadido como tercer argumento el tipo de la columna a crear:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0008.png"></a>
Ahora viene la parte más sencilla: ordenar y seleccionar las primeras filas. Para ordenar la tabla vamos a usar la función <a href="/es/m/function/tablesort">Table.Sort</a>. Esta función recibe una tabla y los criterios de ordenación, devolviendo la tabla ordenada. En nuestro escenario el criterio de ordenación viene determinado por el contenido de la columna <em>Total Sales</em>, y queremos que la ordenación sea descendente, lo que quiere decir que nuestra función de paso podría ser la siguiente:
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
)
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0009.png"></a>
Vemos en la imagen anterior que los clientes ya se muestran ordenados según su facturación.
Para quedarnos con las primeras numberOfCustomers filas, no tenemos más que recurrir a la función <a href="/es/m/function/tablefirstn">Table.FirstN</a>, con lo que nuestra consulta quedaría así:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0010.png"></a>
Ahora, para convertir nuestra consulta en una función de consulta, añadimos la cabecera y eliminamos la fórmula de paso que asigna el valor 5 a la variable numberOfCustomers:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
Le damos un nombre apropiado (<em>TopCustomers</em>, por ejemplo) y la invocamos para ver el resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
(en la imagen anterior se muestra el resultado de pasar a la función el número 3 como argumento)
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-54f96f44-a649-4cf4-820d-fdeeca8af025') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> que contiene en el campo <em>Amount</em> la cifra de ventas y en el campo <em>Customer Id</em> una referencia al cliente asociado.
El objetivo es obtener una función de consulta que reciba un número n como argumento y devuelva una tabla conteniendo los n clientes con mayor facturación, ordenada de mayor a menor facturación. Esta tabla deberá tener dos columnas con información del identificador del cliente y la suma de sus compras.
Para empezar a trabajar en la consulta, supongamos que queremos extraer 5 clientes. El primer paso consiste en calcular, para cada cliente, sus ventas (posteriormente ordenaremos esta tabla y seleccionaremos el número de filas que nos interesa).
Para esto, el lenguaje M nos ofrece la función <a href="/es/m/function/tablegroup">Table.Group</a>, que agrega una tabla según un campo, y añade columnas calculadas adicionales obtenidas tras realizar esta agregación.
En nuestro caso queremos agrupar la tabla de ventas según el campo <em>Customer Id</em> y queremos añadir una nueva columna (a la que podemos llamar <em>Total Sales</em>) que contenga la suma de ventas de cada cliente identificado.
La función <a href="/es/m/function/tablegroup">Table.Group</a> requiere tres argumentos principales: la tabla a agregar (Sales), el campo (o los campos) según los cuales se va a realizar la agregación (Customer Id) y una lista conteniendo información sobre las columnas a crear: para cada una habrá que añadir una lista con el nombre de la columna y la función que va a determinar los valores de la misma (es decir, su <em>función generadora</em>). Nosotros solo queremos crear una columna, de forma que, parcialmente en pseudo-código, nuestra fórmula de paso sería la siguiente:
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", función-generadora, type number}
}
)
Nuestra función generadora deberá sumar los valores de la columna <em>Amount</em> (recordemos que, cuando se aplique nuestra función generadora, la tabla va a estar filtrada según el valor de <em>Customer Id</em> que se esté considerando). Para realizar esta suma podemos usar la función <a href="/es/m/function/listsum">List.Sum</a>, lo que significa que nuestra función generadora puede ser la siguiente:
each List.Sum([Amount])
Nuestra consulta quedaría, por lo tanto, del siguiente modo:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
)
in
GroupedRows
Obsérvese que en el bloque que especifica la creación de la columna <em>Total Sales</em> se ha añadido como tercer argumento el tipo de la columna a crear:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0008.png"></a>
Ahora viene la parte más sencilla: ordenar y seleccionar las primeras filas. Para ordenar la tabla vamos a usar la función <a href="/es/m/function/tablesort">Table.Sort</a>. Esta función recibe una tabla y los criterios de ordenación, devolviendo la tabla ordenada. En nuestro escenario el criterio de ordenación viene determinado por el contenido de la columna <em>Total Sales</em>, y queremos que la ordenación sea descendente, lo que quiere decir que nuestra función de paso podría ser la siguiente:
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
)
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0009.png"></a>
Vemos en la imagen anterior que los clientes ya se muestran ordenados según su facturación.
Para quedarnos con las primeras numberOfCustomers filas, no tenemos más que recurrir a la función <a href="/es/m/function/tablefirstn">Table.FirstN</a>, con lo que nuestra consulta quedaría así:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0010.png"></a>
Ahora, para convertir nuestra consulta en una función de consulta, añadimos la cabecera y eliminamos la fórmula de paso que asigna el valor 5 a la variable numberOfCustomers:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
Le damos un nombre apropiado (<em>TopCustomers</em>, por ejemplo) y la invocamos para ver el resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
(en la imagen anterior se muestra el resultado de pasar a la función el número 3 como argumento)
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-54f96f44-a649-4cf4-820d-fdeeca8af025') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> que contiene en el campo <em>Amount</em> la cifra de ventas y en el campo <em>Customer Id</em> una referencia al cliente asociado.
El objetivo es obtener una función de consulta que reciba un número n como argumento y devuelva una tabla conteniendo los n clientes con mayor facturación, ordenada de mayor a menor facturación. Esta tabla deberá tener dos columnas con información del identificador del cliente y la suma de sus compras.
Para empezar a trabajar en la consulta, supongamos que queremos extraer 5 clientes. El primer paso consiste en calcular, para cada cliente, sus ventas (posteriormente ordenaremos esta tabla y seleccionaremos el número de filas que nos interesa).
Para esto, el lenguaje M nos ofrece la función <a href="/es/m/function/tablegroup">Table.Group</a>, que agrega una tabla según un campo, y añade columnas calculadas adicionales obtenidas tras realizar esta agregación.
En nuestro caso queremos agrupar la tabla de ventas según el campo <em>Customer Id</em> y queremos añadir una nueva columna (a la que podemos llamar <em>Total Sales</em>) que contenga la suma de ventas de cada cliente identificado.
La función <a href="/es/m/function/tablegroup">Table.Group</a> requiere tres argumentos principales: la tabla a agregar (Sales), el campo (o los campos) según los cuales se va a realizar la agregación (Customer Id) y una lista conteniendo información sobre las columnas a crear: para cada una habrá que añadir una lista con el nombre de la columna y la función que va a determinar los valores de la misma (es decir, su <em>función generadora</em>). Nosotros solo queremos crear una columna, de forma que, parcialmente en pseudo-código, nuestra fórmula de paso sería la siguiente:
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", función-generadora, type number}
}
)
Nuestra función generadora deberá sumar los valores de la columna <em>Amount</em> (recordemos que, cuando se aplique nuestra función generadora, la tabla va a estar filtrada según el valor de <em>Customer Id</em> que se esté considerando). Para realizar esta suma podemos usar la función <a href="/es/m/function/listsum">List.Sum</a>, lo que significa que nuestra función generadora puede ser la siguiente:
each List.Sum([Amount])
Nuestra consulta quedaría, por lo tanto, del siguiente modo:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
)
in
GroupedRows
Obsérvese que en el bloque que especifica la creación de la columna <em>Total Sales</em> se ha añadido como tercer argumento el tipo de la columna a crear:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0008.png"></a>
Ahora viene la parte más sencilla: ordenar y seleccionar las primeras filas. Para ordenar la tabla vamos a usar la función <a href="/es/m/function/tablesort">Table.Sort</a>. Esta función recibe una tabla y los criterios de ordenación, devolviendo la tabla ordenada. En nuestro escenario el criterio de ordenación viene determinado por el contenido de la columna <em>Total Sales</em>, y queremos que la ordenación sea descendente, lo que quiere decir que nuestra función de paso podría ser la siguiente:
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
)
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0009.png"></a>
Vemos en la imagen anterior que los clientes ya se muestran ordenados según su facturación.
Para quedarnos con las primeras numberOfCustomers filas, no tenemos más que recurrir a la función <a href="/es/m/function/tablefirstn">Table.FirstN</a>, con lo que nuestra consulta quedaría así:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0010.png"></a>
Ahora, para convertir nuestra consulta en una función de consulta, añadimos la cabecera y eliminamos la fórmula de paso que asigna el valor 5 a la variable numberOfCustomers:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
Le damos un nombre apropiado (<em>TopCustomers</em>, por ejemplo) y la invocamos para ver el resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
(en la imagen anterior se muestra el resultado de pasar a la función el número 3 como argumento)
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-54f96f44-a649-4cf4-820d-fdeeca8af025') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> que contiene en el campo <em>Amount</em> la cifra de ventas y en el campo <em>Customer Id</em> una referencia al cliente asociado.
El objetivo es obtener una función de consulta que reciba un número n como argumento y devuelva una tabla conteniendo los n clientes con mayor facturación, ordenada de mayor a menor facturación. Esta tabla deberá tener dos columnas con información del identificador del cliente y la suma de sus compras.
Para empezar a trabajar en la consulta, supongamos que queremos extraer 5 clientes. El primer paso consiste en calcular, para cada cliente, sus ventas (posteriormente ordenaremos esta tabla y seleccionaremos el número de filas que nos interesa).
Para esto, el lenguaje M nos ofrece la función <a href="/es/m/function/tablegroup">Table.Group</a>, que agrega una tabla según un campo, y añade columnas calculadas adicionales obtenidas tras realizar esta agregación.
En nuestro caso queremos agrupar la tabla de ventas según el campo <em>Customer Id</em> y queremos añadir una nueva columna (a la que podemos llamar <em>Total Sales</em>) que contenga la suma de ventas de cada cliente identificado.
La función <a href="/es/m/function/tablegroup">Table.Group</a> requiere tres argumentos principales: la tabla a agregar (Sales), el campo (o los campos) según los cuales se va a realizar la agregación (Customer Id) y una lista conteniendo información sobre las columnas a crear: para cada una habrá que añadir una lista con el nombre de la columna y la función que va a determinar los valores de la misma (es decir, su <em>función generadora</em>). Nosotros solo queremos crear una columna, de forma que, parcialmente en pseudo-código, nuestra fórmula de paso sería la siguiente:
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", función-generadora, type number}
}
)
Nuestra función generadora deberá sumar los valores de la columna <em>Amount</em> (recordemos que, cuando se aplique nuestra función generadora, la tabla va a estar filtrada según el valor de <em>Customer Id</em> que se esté considerando). Para realizar esta suma podemos usar la función <a href="/es/m/function/listsum">List.Sum</a>, lo que significa que nuestra función generadora puede ser la siguiente:
each List.Sum([Amount])
Nuestra consulta quedaría, por lo tanto, del siguiente modo:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
)
in
GroupedRows
Obsérvese que en el bloque que especifica la creación de la columna <em>Total Sales</em> se ha añadido como tercer argumento el tipo de la columna a crear:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0008.png"></a>
Ahora viene la parte más sencilla: ordenar y seleccionar las primeras filas. Para ordenar la tabla vamos a usar la función <a href="/es/m/function/tablesort">Table.Sort</a>. Esta función recibe una tabla y los criterios de ordenación, devolviendo la tabla ordenada. En nuestro escenario el criterio de ordenación viene determinado por el contenido de la columna <em>Total Sales</em>, y queremos que la ordenación sea descendente, lo que quiere decir que nuestra función de paso podría ser la siguiente:
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
)
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0009.png"></a>
Vemos en la imagen anterior que los clientes ya se muestran ordenados según su facturación.
Para quedarnos con las primeras numberOfCustomers filas, no tenemos más que recurrir a la función <a href="/es/m/function/tablefirstn">Table.FirstN</a>, con lo que nuestra consulta quedaría así:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0010.png"></a>
Ahora, para convertir nuestra consulta en una función de consulta, añadimos la cabecera y eliminamos la fórmula de paso que asigna el valor 5 a la variable numberOfCustomers:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
Le damos un nombre apropiado (<em>TopCustomers</em>, por ejemplo) y la invocamos para ver el resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
(en la imagen anterior se muestra el resultado de pasar a la función el número 3 como argumento)
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-05a4e35a-71f2-407c-8d22-338089a35642') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> que contiene en el campo <em>Amount</em> la cifra de ventas y en el campo <em>Customer Id</em> una referencia al cliente asociado.
El objetivo es obtener una función de consulta que reciba un número n como argumento y devuelva una tabla conteniendo los n clientes con mayor facturación, ordenada de mayor a menor facturación. Esta tabla deberá tener dos columnas con información del identificador del cliente y la suma de sus compras.
Para empezar a trabajar en la consulta, supongamos que queremos extraer 5 clientes. El primer paso consiste en calcular, para cada cliente, sus ventas (posteriormente ordenaremos esta tabla y seleccionaremos el número de filas que nos interesa).
Para esto, el lenguaje M nos ofrece la función <a href="/es/m/function/tablegroup">Table.Group</a>, que agrega una tabla según un campo, y añade columnas calculadas adicionales obtenidas tras realizar esta agregación.
En nuestro caso queremos agrupar la tabla de ventas según el campo <em>Customer Id</em> y queremos añadir una nueva columna (a la que podemos llamar <em>Total Sales</em>) que contenga la suma de ventas de cada cliente identificado.
La función <a href="/es/m/function/tablegroup">Table.Group</a> requiere tres argumentos principales: la tabla a agregar (Sales), el campo (o los campos) según los cuales se va a realizar la agregación (Customer Id) y una lista conteniendo información sobre las columnas a crear: para cada una habrá que añadir una lista con el nombre de la columna y la función que va a determinar los valores de la misma (es decir, su <em>función generadora</em>). Nosotros solo queremos crear una columna, de forma que, parcialmente en pseudo-código, nuestra fórmula de paso sería la siguiente:
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", función-generadora, type number}
}
)
Nuestra función generadora deberá sumar los valores de la columna <em>Amount</em> (recordemos que, cuando se aplique nuestra función generadora, la tabla va a estar filtrada según el valor de <em>Customer Id</em> que se esté considerando). Para realizar esta suma podemos usar la función <a href="/es/m/function/listsum">List.Sum</a>, lo que significa que nuestra función generadora puede ser la siguiente:
each List.Sum([Amount])
Nuestra consulta quedaría, por lo tanto, del siguiente modo:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
)
in
GroupedRows
Obsérvese que en el bloque que especifica la creación de la columna <em>Total Sales</em> se ha añadido como tercer argumento el tipo de la columna a crear:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0008.png"></a>
Ahora viene la parte más sencilla: ordenar y seleccionar las primeras filas. Para ordenar la tabla vamos a usar la función <a href="/es/m/function/tablesort">Table.Sort</a>. Esta función recibe una tabla y los criterios de ordenación, devolviendo la tabla ordenada. En nuestro escenario el criterio de ordenación viene determinado por el contenido de la columna <em>Total Sales</em>, y queremos que la ordenación sea descendente, lo que quiere decir que nuestra función de paso podría ser la siguiente:
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
)
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0009.png"></a>
Vemos en la imagen anterior que los clientes ya se muestran ordenados según su facturación.
Para quedarnos con las primeras numberOfCustomers filas, no tenemos más que recurrir a la función <a href="/es/m/function/tablefirstn">Table.FirstN</a>, con lo que nuestra consulta quedaría así:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0010.png"></a>
Ahora, para convertir nuestra consulta en una función de consulta, añadimos la cabecera y eliminamos la fórmula de paso que asigna el valor 5 a la variable numberOfCustomers:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
Le damos un nombre apropiado (<em>TopCustomers</em>, por ejemplo) y la invocamos para ver el resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
(en la imagen anterior se muestra el resultado de pasar a la función el número 3 como argumento)
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-05a4e35a-71f2-407c-8d22-338089a35642') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> que contiene en el campo <em>Amount</em> la cifra de ventas y en el campo <em>Customer Id</em> una referencia al cliente asociado.
El objetivo es obtener una función de consulta que reciba un número n como argumento y devuelva una tabla conteniendo los n clientes con mayor facturación, ordenada de mayor a menor facturación. Esta tabla deberá tener dos columnas con información del identificador del cliente y la suma de sus compras.
Para empezar a trabajar en la consulta, supongamos que queremos extraer 5 clientes. El primer paso consiste en calcular, para cada cliente, sus ventas (posteriormente ordenaremos esta tabla y seleccionaremos el número de filas que nos interesa).
Para esto, el lenguaje M nos ofrece la función <a href="/es/m/function/tablegroup">Table.Group</a>, que agrega una tabla según un campo, y añade columnas calculadas adicionales obtenidas tras realizar esta agregación.
En nuestro caso queremos agrupar la tabla de ventas según el campo <em>Customer Id</em> y queremos añadir una nueva columna (a la que podemos llamar <em>Total Sales</em>) que contenga la suma de ventas de cada cliente identificado.
La función <a href="/es/m/function/tablegroup">Table.Group</a> requiere tres argumentos principales: la tabla a agregar (Sales), el campo (o los campos) según los cuales se va a realizar la agregación (Customer Id) y una lista conteniendo información sobre las columnas a crear: para cada una habrá que añadir una lista con el nombre de la columna y la función que va a determinar los valores de la misma (es decir, su <em>función generadora</em>). Nosotros solo queremos crear una columna, de forma que, parcialmente en pseudo-código, nuestra fórmula de paso sería la siguiente:
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", función-generadora, type number}
}
)
Nuestra función generadora deberá sumar los valores de la columna <em>Amount</em> (recordemos que, cuando se aplique nuestra función generadora, la tabla va a estar filtrada según el valor de <em>Customer Id</em> que se esté considerando). Para realizar esta suma podemos usar la función <a href="/es/m/function/listsum">List.Sum</a>, lo que significa que nuestra función generadora puede ser la siguiente:
each List.Sum([Amount])
Nuestra consulta quedaría, por lo tanto, del siguiente modo:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
)
in
GroupedRows
Obsérvese que en el bloque que especifica la creación de la columna <em>Total Sales</em> se ha añadido como tercer argumento el tipo de la columna a crear:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0008.png"></a>
Ahora viene la parte más sencilla: ordenar y seleccionar las primeras filas. Para ordenar la tabla vamos a usar la función <a href="/es/m/function/tablesort">Table.Sort</a>. Esta función recibe una tabla y los criterios de ordenación, devolviendo la tabla ordenada. En nuestro escenario el criterio de ordenación viene determinado por el contenido de la columna <em>Total Sales</em>, y queremos que la ordenación sea descendente, lo que quiere decir que nuestra función de paso podría ser la siguiente:
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
)
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0009.png"></a>
Vemos en la imagen anterior que los clientes ya se muestran ordenados según su facturación.
Para quedarnos con las primeras numberOfCustomers filas, no tenemos más que recurrir a la función <a href="/es/m/function/tablefirstn">Table.FirstN</a>, con lo que nuestra consulta quedaría así:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0010.png"></a>
Ahora, para convertir nuestra consulta en una función de consulta, añadimos la cabecera y eliminamos la fórmula de paso que asigna el valor 5 a la variable numberOfCustomers:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
Le damos un nombre apropiado (<em>TopCustomers</em>, por ejemplo) y la invocamos para ver el resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
(en la imagen anterior se muestra el resultado de pasar a la función el número 3 como argumento)
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-05a4e35a-71f2-407c-8d22-338089a35642') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> que contiene en el campo <em>Amount</em> la cifra de ventas y en el campo <em>Customer Id</em> una referencia al cliente asociado.
El objetivo es obtener una función de consulta que reciba un número n como argumento y devuelva una tabla conteniendo los n clientes con mayor facturación, ordenada de mayor a menor facturación. Esta tabla deberá tener dos columnas con información del identificador del cliente y la suma de sus compras.
Para empezar a trabajar en la consulta, supongamos que queremos extraer 5 clientes. El primer paso consiste en calcular, para cada cliente, sus ventas (posteriormente ordenaremos esta tabla y seleccionaremos el número de filas que nos interesa).
Para esto, el lenguaje M nos ofrece la función <a href="/es/m/function/tablegroup">Table.Group</a>, que agrega una tabla según un campo, y añade columnas calculadas adicionales obtenidas tras realizar esta agregación.
En nuestro caso queremos agrupar la tabla de ventas según el campo <em>Customer Id</em> y queremos añadir una nueva columna (a la que podemos llamar <em>Total Sales</em>) que contenga la suma de ventas de cada cliente identificado.
La función <a href="/es/m/function/tablegroup">Table.Group</a> requiere tres argumentos principales: la tabla a agregar (Sales), el campo (o los campos) según los cuales se va a realizar la agregación (Customer Id) y una lista conteniendo información sobre las columnas a crear: para cada una habrá que añadir una lista con el nombre de la columna y la función que va a determinar los valores de la misma (es decir, su <em>función generadora</em>). Nosotros solo queremos crear una columna, de forma que, parcialmente en pseudo-código, nuestra fórmula de paso sería la siguiente:
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", función-generadora, type number}
}
)
Nuestra función generadora deberá sumar los valores de la columna <em>Amount</em> (recordemos que, cuando se aplique nuestra función generadora, la tabla va a estar filtrada según el valor de <em>Customer Id</em> que se esté considerando). Para realizar esta suma podemos usar la función <a href="/es/m/function/listsum">List.Sum</a>, lo que significa que nuestra función generadora puede ser la siguiente:
each List.Sum([Amount])
Nuestra consulta quedaría, por lo tanto, del siguiente modo:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
)
in
GroupedRows
Obsérvese que en el bloque que especifica la creación de la columna <em>Total Sales</em> se ha añadido como tercer argumento el tipo de la columna a crear:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0008.png"></a>
Ahora viene la parte más sencilla: ordenar y seleccionar las primeras filas. Para ordenar la tabla vamos a usar la función <a href="/es/m/function/tablesort">Table.Sort</a>. Esta función recibe una tabla y los criterios de ordenación, devolviendo la tabla ordenada. En nuestro escenario el criterio de ordenación viene determinado por el contenido de la columna <em>Total Sales</em>, y queremos que la ordenación sea descendente, lo que quiere decir que nuestra función de paso podría ser la siguiente:
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
)
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0009.png"></a>
Vemos en la imagen anterior que los clientes ya se muestran ordenados según su facturación.
Para quedarnos con las primeras numberOfCustomers filas, no tenemos más que recurrir a la función <a href="/es/m/function/tablefirstn">Table.FirstN</a>, con lo que nuestra consulta quedaría así:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0010.png"></a>
Ahora, para convertir nuestra consulta en una función de consulta, añadimos la cabecera y eliminamos la fórmula de paso que asigna el valor 5 a la variable numberOfCustomers:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
Le damos un nombre apropiado (<em>TopCustomers</em>, por ejemplo) y la invocamos para ver el resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
(en la imagen anterior se muestra el resultado de pasar a la función el número 3 como argumento)
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-05a4e35a-71f2-407c-8d22-338089a35642') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla <em>Sales</em> que contiene en el campo <em>Amount</em> la cifra de ventas y en el campo <em>Customer Id</em> una referencia al cliente asociado.
El objetivo es obtener una función de consulta que reciba un número n como argumento y devuelva una tabla conteniendo los n clientes con mayor facturación, ordenada de mayor a menor facturación. Esta tabla deberá tener dos columnas con información del identificador del cliente y la suma de sus compras.
Para empezar a trabajar en la consulta, supongamos que queremos extraer 5 clientes. El primer paso consiste en calcular, para cada cliente, sus ventas (posteriormente ordenaremos esta tabla y seleccionaremos el número de filas que nos interesa).
Para esto, el lenguaje M nos ofrece la función <a href="/es/m/function/tablegroup">Table.Group</a>, que agrega una tabla según un campo, y añade columnas calculadas adicionales obtenidas tras realizar esta agregación.
En nuestro caso queremos agrupar la tabla de ventas según el campo <em>Customer Id</em> y queremos añadir una nueva columna (a la que podemos llamar <em>Total Sales</em>) que contenga la suma de ventas de cada cliente identificado.
La función <a href="/es/m/function/tablegroup">Table.Group</a> requiere tres argumentos principales: la tabla a agregar (Sales), el campo (o los campos) según los cuales se va a realizar la agregación (Customer Id) y una lista conteniendo información sobre las columnas a crear: para cada una habrá que añadir una lista con el nombre de la columna y la función que va a determinar los valores de la misma (es decir, su <em>función generadora</em>). Nosotros solo queremos crear una columna, de forma que, parcialmente en pseudo-código, nuestra fórmula de paso sería la siguiente:
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", función-generadora, type number}
}
)
Nuestra función generadora deberá sumar los valores de la columna <em>Amount</em> (recordemos que, cuando se aplique nuestra función generadora, la tabla va a estar filtrada según el valor de <em>Customer Id</em> que se esté considerando). Para realizar esta suma podemos usar la función <a href="/es/m/function/listsum">List.Sum</a>, lo que significa que nuestra función generadora puede ser la siguiente:
each List.Sum([Amount])
Nuestra consulta quedaría, por lo tanto, del siguiente modo:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
)
in
GroupedRows
Obsérvese que en el bloque que especifica la creación de la columna <em>Total Sales</em> se ha añadido como tercer argumento el tipo de la columna a crear:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0008.png"></a>
Ahora viene la parte más sencilla: ordenar y seleccionar las primeras filas. Para ordenar la tabla vamos a usar la función <a href="/es/m/function/tablesort">Table.Sort</a>. Esta función recibe una tabla y los criterios de ordenación, devolviendo la tabla ordenada. En nuestro escenario el criterio de ordenación viene determinado por el contenido de la columna <em>Total Sales</em>, y queremos que la ordenación sea descendente, lo que quiere decir que nuestra función de paso podría ser la siguiente:
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
)
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0009.png"></a>
Vemos en la imagen anterior que los clientes ya se muestran ordenados según su facturación.
Para quedarnos con las primeras numberOfCustomers filas, no tenemos más que recurrir a la función <a href="/es/m/function/tablefirstn">Table.FirstN</a>, con lo que nuestra consulta quedaría así:
let
numberOfCustomers = 5,
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0010.png"></a>
Ahora, para convertir nuestra consulta en una función de consulta, añadimos la cabecera y eliminamos la fórmula de paso que asigna el valor 5 a la variable numberOfCustomers:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
Le damos un nombre apropiado (<em>TopCustomers</em>, por ejemplo) y la invocamos para ver el resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
(en la imagen anterior se muestra el resultado de pasar a la función el número 3 como argumento)
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-e5ee336f-7817-42a1-806d-ed8000f3d298') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este caso partimos de una única tabla, <em>Sales</em>, conteniendo información de ventas. Entre otros, encontramos en ella el campo <em>Order Priority</em> conteniendo la prioridad de la compra (<em>Low</em>, <em>Medium</em>, <em>High</em> o <em>Critical</em>) y el campo <em>Amount</em> con información del importe de cada venta. Queremos obtener una tabla que muestre las ventas medias por prioridad pero considerando solo las ventas superiores a 3.000 €. Y queremos que la tabla resultante se muestre ordenada de mayor a menor según dicho valor.
Empezamos filtrando la tabla de ventas de forma que solo incluya ventas cuyos importes sean superiores a los 3.000 € indicados, para lo que hacemos uso de la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a>:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000)
in
FilterByValue
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0014.png"></a>
A continuación, queremos agrupar el resultado en función de los valores que tome el campo <em>Order Priority</em>, cosa que podemos conseguir con la función <a href="/es/m/function/tablegroup">Table.Group</a>. Esta función agrupa según el campo o los campos que indiquemos, y permite añadir al resultado columnas calculadas:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000),
GroupByPriority = Table.Group(
FilterByValue,
{"Order Priority"},
{
{"Avg Sales", each List.Average([Amount]), type number}
}
)
in
GroupByPriority
Obsérvese que se ha agrupado la tabla contenida en FilterByValue según el campo <em>Order Priority</em>, y al resultado le hemos añadido una columna calculada que recibe el nombre de <em>Avg Sales</em>, y cuyos valores son el resultado de calcular el valor medio de la columna <em>Amount</em>. Este valor medio lo hemos obtenido usando la función <a href="/es/m/function/listaverage">List.Average</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0015.png"></a>
Por último solo resta ordenar el resultado según las ventas medias. La función que nos permite ordenar una tabla es <a href="/es/m/function/tablesort">Table.Sort</a>, y podemos especificar el campo o los campos según los cuales realizar la ordenación, y si ésta debe ser ascendente o descendente. La fórmula de paso sería la siguiente:
Table.Sort(GroupByPriority,{{"Avg Sales", Order.Descending}})
Nuestra consulta quedaría del siguiente modo:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000),
GroupByPriority = Table.Group(
FilterByValue,
{"Order Priority"},
{
{"Avg Sales", each List.Average([Amount]), type number}
}
),
SortByValue = Table.Sort(GroupByPriority,{{"Avg Sales", Order.Descending}})
in
SortByValue
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0016.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-e5ee336f-7817-42a1-806d-ed8000f3d298') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este caso partimos de una única tabla, <em>Sales</em>, conteniendo información de ventas. Entre otros, encontramos en ella el campo <em>Order Priority</em> conteniendo la prioridad de la compra (<em>Low</em>, <em>Medium</em>, <em>High</em> o <em>Critical</em>) y el campo <em>Amount</em> con información del importe de cada venta. Queremos obtener una tabla que muestre las ventas medias por prioridad pero considerando solo las ventas superiores a 3.000 €. Y queremos que la tabla resultante se muestre ordenada de mayor a menor según dicho valor.
Empezamos filtrando la tabla de ventas de forma que solo incluya ventas cuyos importes sean superiores a los 3.000 € indicados, para lo que hacemos uso de la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a>:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000)
in
FilterByValue
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0014.png"></a>
A continuación, queremos agrupar el resultado en función de los valores que tome el campo <em>Order Priority</em>, cosa que podemos conseguir con la función <a href="/es/m/function/tablegroup">Table.Group</a>. Esta función agrupa según el campo o los campos que indiquemos, y permite añadir al resultado columnas calculadas:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000),
GroupByPriority = Table.Group(
FilterByValue,
{"Order Priority"},
{
{"Avg Sales", each List.Average([Amount]), type number}
}
)
in
GroupByPriority
Obsérvese que se ha agrupado la tabla contenida en FilterByValue según el campo <em>Order Priority</em>, y al resultado le hemos añadido una columna calculada que recibe el nombre de <em>Avg Sales</em>, y cuyos valores son el resultado de calcular el valor medio de la columna <em>Amount</em>. Este valor medio lo hemos obtenido usando la función <a href="/es/m/function/listaverage">List.Average</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0015.png"></a>
Por último solo resta ordenar el resultado según las ventas medias. La función que nos permite ordenar una tabla es <a href="/es/m/function/tablesort">Table.Sort</a>, y podemos especificar el campo o los campos según los cuales realizar la ordenación, y si ésta debe ser ascendente o descendente. La fórmula de paso sería la siguiente:
Table.Sort(GroupByPriority,{{"Avg Sales", Order.Descending}})
Nuestra consulta quedaría del siguiente modo:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000),
GroupByPriority = Table.Group(
FilterByValue,
{"Order Priority"},
{
{"Avg Sales", each List.Average([Amount]), type number}
}
),
SortByValue = Table.Sort(GroupByPriority,{{"Avg Sales", Order.Descending}})
in
SortByValue
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0016.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-e5ee336f-7817-42a1-806d-ed8000f3d298') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este caso partimos de una única tabla, <em>Sales</em>, conteniendo información de ventas. Entre otros, encontramos en ella el campo <em>Order Priority</em> conteniendo la prioridad de la compra (<em>Low</em>, <em>Medium</em>, <em>High</em> o <em>Critical</em>) y el campo <em>Amount</em> con información del importe de cada venta. Queremos obtener una tabla que muestre las ventas medias por prioridad pero considerando solo las ventas superiores a 3.000 €. Y queremos que la tabla resultante se muestre ordenada de mayor a menor según dicho valor.
Empezamos filtrando la tabla de ventas de forma que solo incluya ventas cuyos importes sean superiores a los 3.000 € indicados, para lo que hacemos uso de la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a>:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000)
in
FilterByValue
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0014.png"></a>
A continuación, queremos agrupar el resultado en función de los valores que tome el campo <em>Order Priority</em>, cosa que podemos conseguir con la función <a href="/es/m/function/tablegroup">Table.Group</a>. Esta función agrupa según el campo o los campos que indiquemos, y permite añadir al resultado columnas calculadas:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000),
GroupByPriority = Table.Group(
FilterByValue,
{"Order Priority"},
{
{"Avg Sales", each List.Average([Amount]), type number}
}
)
in
GroupByPriority
Obsérvese que se ha agrupado la tabla contenida en FilterByValue según el campo <em>Order Priority</em>, y al resultado le hemos añadido una columna calculada que recibe el nombre de <em>Avg Sales</em>, y cuyos valores son el resultado de calcular el valor medio de la columna <em>Amount</em>. Este valor medio lo hemos obtenido usando la función <a href="/es/m/function/listaverage">List.Average</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0015.png"></a>
Por último solo resta ordenar el resultado según las ventas medias. La función que nos permite ordenar una tabla es <a href="/es/m/function/tablesort">Table.Sort</a>, y podemos especificar el campo o los campos según los cuales realizar la ordenación, y si ésta debe ser ascendente o descendente. La fórmula de paso sería la siguiente:
Table.Sort(GroupByPriority,{{"Avg Sales", Order.Descending}})
Nuestra consulta quedaría del siguiente modo:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000),
GroupByPriority = Table.Group(
FilterByValue,
{"Order Priority"},
{
{"Avg Sales", each List.Average([Amount]), type number}
}
),
SortByValue = Table.Sort(GroupByPriority,{{"Avg Sales", Order.Descending}})
in
SortByValue
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0016.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-e5ee336f-7817-42a1-806d-ed8000f3d298') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este caso partimos de una única tabla, <em>Sales</em>, conteniendo información de ventas. Entre otros, encontramos en ella el campo <em>Order Priority</em> conteniendo la prioridad de la compra (<em>Low</em>, <em>Medium</em>, <em>High</em> o <em>Critical</em>) y el campo <em>Amount</em> con información del importe de cada venta. Queremos obtener una tabla que muestre las ventas medias por prioridad pero considerando solo las ventas superiores a 3.000 €. Y queremos que la tabla resultante se muestre ordenada de mayor a menor según dicho valor.
Empezamos filtrando la tabla de ventas de forma que solo incluya ventas cuyos importes sean superiores a los 3.000 € indicados, para lo que hacemos uso de la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a>:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000)
in
FilterByValue
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0014.png"></a>
A continuación, queremos agrupar el resultado en función de los valores que tome el campo <em>Order Priority</em>, cosa que podemos conseguir con la función <a href="/es/m/function/tablegroup">Table.Group</a>. Esta función agrupa según el campo o los campos que indiquemos, y permite añadir al resultado columnas calculadas:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000),
GroupByPriority = Table.Group(
FilterByValue,
{"Order Priority"},
{
{"Avg Sales", each List.Average([Amount]), type number}
}
)
in
GroupByPriority
Obsérvese que se ha agrupado la tabla contenida en FilterByValue según el campo <em>Order Priority</em>, y al resultado le hemos añadido una columna calculada que recibe el nombre de <em>Avg Sales</em>, y cuyos valores son el resultado de calcular el valor medio de la columna <em>Amount</em>. Este valor medio lo hemos obtenido usando la función <a href="/es/m/function/listaverage">List.Average</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0015.png"></a>
Por último solo resta ordenar el resultado según las ventas medias. La función que nos permite ordenar una tabla es <a href="/es/m/function/tablesort">Table.Sort</a>, y podemos especificar el campo o los campos según los cuales realizar la ordenación, y si ésta debe ser ascendente o descendente. La fórmula de paso sería la siguiente:
Table.Sort(GroupByPriority,{{"Avg Sales", Order.Descending}})
Nuestra consulta quedaría del siguiente modo:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000),
GroupByPriority = Table.Group(
FilterByValue,
{"Order Priority"},
{
{"Avg Sales", each List.Average([Amount]), type number}
}
),
SortByValue = Table.Sort(GroupByPriority,{{"Avg Sales", Order.Descending}})
in
SortByValue
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0016.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-588a4328-04a7-4dd9-b4ba-b1f88a426bbf') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este caso partimos de una única tabla, <em>Sales</em>, conteniendo información de ventas. Entre otros, encontramos en ella el campo <em>Order Priority</em> conteniendo la prioridad de la compra (<em>Low</em>, <em>Medium</em>, <em>High</em> o <em>Critical</em>) y el campo <em>Amount</em> con información del importe de cada venta. Queremos obtener una tabla que muestre las ventas medias por prioridad pero considerando solo las ventas superiores a 3.000 €. Y queremos que la tabla resultante se muestre ordenada de mayor a menor según dicho valor.
Empezamos filtrando la tabla de ventas de forma que solo incluya ventas cuyos importes sean superiores a los 3.000 € indicados, para lo que hacemos uso de la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a>:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000)
in
FilterByValue
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0014.png"></a>
A continuación, queremos agrupar el resultado en función de los valores que tome el campo <em>Order Priority</em>, cosa que podemos conseguir con la función <a href="/es/m/function/tablegroup">Table.Group</a>. Esta función agrupa según el campo o los campos que indiquemos, y permite añadir al resultado columnas calculadas:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000),
GroupByPriority = Table.Group(
FilterByValue,
{"Order Priority"},
{
{"Avg Sales", each List.Average([Amount]), type number}
}
)
in
GroupByPriority
Obsérvese que se ha agrupado la tabla contenida en FilterByValue según el campo <em>Order Priority</em>, y al resultado le hemos añadido una columna calculada que recibe el nombre de <em>Avg Sales</em>, y cuyos valores son el resultado de calcular el valor medio de la columna <em>Amount</em>. Este valor medio lo hemos obtenido usando la función <a href="/es/m/function/listaverage">List.Average</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0015.png"></a>
Por último solo resta ordenar el resultado según las ventas medias. La función que nos permite ordenar una tabla es <a href="/es/m/function/tablesort">Table.Sort</a>, y podemos especificar el campo o los campos según los cuales realizar la ordenación, y si ésta debe ser ascendente o descendente. La fórmula de paso sería la siguiente:
Table.Sort(GroupByPriority,{{"Avg Sales", Order.Descending}})
Nuestra consulta quedaría del siguiente modo:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000),
GroupByPriority = Table.Group(
FilterByValue,
{"Order Priority"},
{
{"Avg Sales", each List.Average([Amount]), type number}
}
),
SortByValue = Table.Sort(GroupByPriority,{{"Avg Sales", Order.Descending}})
in
SortByValue
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0016.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-588a4328-04a7-4dd9-b4ba-b1f88a426bbf') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este caso partimos de una única tabla, <em>Sales</em>, conteniendo información de ventas. Entre otros, encontramos en ella el campo <em>Order Priority</em> conteniendo la prioridad de la compra (<em>Low</em>, <em>Medium</em>, <em>High</em> o <em>Critical</em>) y el campo <em>Amount</em> con información del importe de cada venta. Queremos obtener una tabla que muestre las ventas medias por prioridad pero considerando solo las ventas superiores a 3.000 €. Y queremos que la tabla resultante se muestre ordenada de mayor a menor según dicho valor.
Empezamos filtrando la tabla de ventas de forma que solo incluya ventas cuyos importes sean superiores a los 3.000 € indicados, para lo que hacemos uso de la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a>:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000)
in
FilterByValue
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0014.png"></a>
A continuación, queremos agrupar el resultado en función de los valores que tome el campo <em>Order Priority</em>, cosa que podemos conseguir con la función <a href="/es/m/function/tablegroup">Table.Group</a>. Esta función agrupa según el campo o los campos que indiquemos, y permite añadir al resultado columnas calculadas:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000),
GroupByPriority = Table.Group(
FilterByValue,
{"Order Priority"},
{
{"Avg Sales", each List.Average([Amount]), type number}
}
)
in
GroupByPriority
Obsérvese que se ha agrupado la tabla contenida en FilterByValue según el campo <em>Order Priority</em>, y al resultado le hemos añadido una columna calculada que recibe el nombre de <em>Avg Sales</em>, y cuyos valores son el resultado de calcular el valor medio de la columna <em>Amount</em>. Este valor medio lo hemos obtenido usando la función <a href="/es/m/function/listaverage">List.Average</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0015.png"></a>
Por último solo resta ordenar el resultado según las ventas medias. La función que nos permite ordenar una tabla es <a href="/es/m/function/tablesort">Table.Sort</a>, y podemos especificar el campo o los campos según los cuales realizar la ordenación, y si ésta debe ser ascendente o descendente. La fórmula de paso sería la siguiente:
Table.Sort(GroupByPriority,{{"Avg Sales", Order.Descending}})
Nuestra consulta quedaría del siguiente modo:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000),
GroupByPriority = Table.Group(
FilterByValue,
{"Order Priority"},
{
{"Avg Sales", each List.Average([Amount]), type number}
}
),
SortByValue = Table.Sort(GroupByPriority,{{"Avg Sales", Order.Descending}})
in
SortByValue
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0016.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-588a4328-04a7-4dd9-b4ba-b1f88a426bbf') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este caso partimos de una única tabla, <em>Sales</em>, conteniendo información de ventas. Entre otros, encontramos en ella el campo <em>Order Priority</em> conteniendo la prioridad de la compra (<em>Low</em>, <em>Medium</em>, <em>High</em> o <em>Critical</em>) y el campo <em>Amount</em> con información del importe de cada venta. Queremos obtener una tabla que muestre las ventas medias por prioridad pero considerando solo las ventas superiores a 3.000 €. Y queremos que la tabla resultante se muestre ordenada de mayor a menor según dicho valor.
Empezamos filtrando la tabla de ventas de forma que solo incluya ventas cuyos importes sean superiores a los 3.000 € indicados, para lo que hacemos uso de la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a>:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000)
in
FilterByValue
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0014.png"></a>
A continuación, queremos agrupar el resultado en función de los valores que tome el campo <em>Order Priority</em>, cosa que podemos conseguir con la función <a href="/es/m/function/tablegroup">Table.Group</a>. Esta función agrupa según el campo o los campos que indiquemos, y permite añadir al resultado columnas calculadas:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000),
GroupByPriority = Table.Group(
FilterByValue,
{"Order Priority"},
{
{"Avg Sales", each List.Average([Amount]), type number}
}
)
in
GroupByPriority
Obsérvese que se ha agrupado la tabla contenida en FilterByValue según el campo <em>Order Priority</em>, y al resultado le hemos añadido una columna calculada que recibe el nombre de <em>Avg Sales</em>, y cuyos valores son el resultado de calcular el valor medio de la columna <em>Amount</em>. Este valor medio lo hemos obtenido usando la función <a href="/es/m/function/listaverage">List.Average</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0015.png"></a>
Por último solo resta ordenar el resultado según las ventas medias. La función que nos permite ordenar una tabla es <a href="/es/m/function/tablesort">Table.Sort</a>, y podemos especificar el campo o los campos según los cuales realizar la ordenación, y si ésta debe ser ascendente o descendente. La fórmula de paso sería la siguiente:
Table.Sort(GroupByPriority,{{"Avg Sales", Order.Descending}})
Nuestra consulta quedaría del siguiente modo:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000),
GroupByPriority = Table.Group(
FilterByValue,
{"Order Priority"},
{
{"Avg Sales", each List.Average([Amount]), type number}
}
),
SortByValue = Table.Sort(GroupByPriority,{{"Avg Sales", Order.Descending}})
in
SortByValue
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0016.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-588a4328-04a7-4dd9-b4ba-b1f88a426bbf') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este caso partimos de una única tabla, <em>Sales</em>, conteniendo información de ventas. Entre otros, encontramos en ella el campo <em>Order Priority</em> conteniendo la prioridad de la compra (<em>Low</em>, <em>Medium</em>, <em>High</em> o <em>Critical</em>) y el campo <em>Amount</em> con información del importe de cada venta. Queremos obtener una tabla que muestre las ventas medias por prioridad pero considerando solo las ventas superiores a 3.000 €. Y queremos que la tabla resultante se muestre ordenada de mayor a menor según dicho valor.
Empezamos filtrando la tabla de ventas de forma que solo incluya ventas cuyos importes sean superiores a los 3.000 € indicados, para lo que hacemos uso de la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a>:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000)
in
FilterByValue
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0014.png"></a>
A continuación, queremos agrupar el resultado en función de los valores que tome el campo <em>Order Priority</em>, cosa que podemos conseguir con la función <a href="/es/m/function/tablegroup">Table.Group</a>. Esta función agrupa según el campo o los campos que indiquemos, y permite añadir al resultado columnas calculadas:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000),
GroupByPriority = Table.Group(
FilterByValue,
{"Order Priority"},
{
{"Avg Sales", each List.Average([Amount]), type number}
}
)
in
GroupByPriority
Obsérvese que se ha agrupado la tabla contenida en FilterByValue según el campo <em>Order Priority</em>, y al resultado le hemos añadido una columna calculada que recibe el nombre de <em>Avg Sales</em>, y cuyos valores son el resultado de calcular el valor medio de la columna <em>Amount</em>. Este valor medio lo hemos obtenido usando la función <a href="/es/m/function/listaverage">List.Average</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0015.png"></a>
Por último solo resta ordenar el resultado según las ventas medias. La función que nos permite ordenar una tabla es <a href="/es/m/function/tablesort">Table.Sort</a>, y podemos especificar el campo o los campos según los cuales realizar la ordenación, y si ésta debe ser ascendente o descendente. La fórmula de paso sería la siguiente:
Table.Sort(GroupByPriority,{{"Avg Sales", Order.Descending}})
Nuestra consulta quedaría del siguiente modo:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000),
GroupByPriority = Table.Group(
FilterByValue,
{"Order Priority"},
{
{"Avg Sales", each List.Average([Amount]), type number}
}
),
SortByValue = Table.Sort(GroupByPriority,{{"Avg Sales", Order.Descending}})
in
SortByValue
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0016.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-2699f7e5-dfc9-471a-a237-c5423ae02008') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este caso partimos de una única tabla, <em>Sales</em>, conteniendo información de ventas. Entre otros, encontramos en ella el campo <em>Order Priority</em> conteniendo la prioridad de la compra (<em>Low</em>, <em>Medium</em>, <em>High</em> o <em>Critical</em>) y el campo <em>Amount</em> con información del importe de cada venta. Queremos obtener una tabla que muestre las ventas medias por prioridad pero considerando solo las ventas superiores a 3.000 €. Y queremos que la tabla resultante se muestre ordenada de mayor a menor según dicho valor.
Empezamos filtrando la tabla de ventas de forma que solo incluya ventas cuyos importes sean superiores a los 3.000 € indicados, para lo que hacemos uso de la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a>:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000)
in
FilterByValue
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0014.png"></a>
A continuación, queremos agrupar el resultado en función de los valores que tome el campo <em>Order Priority</em>, cosa que podemos conseguir con la función <a href="/es/m/function/tablegroup">Table.Group</a>. Esta función agrupa según el campo o los campos que indiquemos, y permite añadir al resultado columnas calculadas:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000),
GroupByPriority = Table.Group(
FilterByValue,
{"Order Priority"},
{
{"Avg Sales", each List.Average([Amount]), type number}
}
)
in
GroupByPriority
Obsérvese que se ha agrupado la tabla contenida en FilterByValue según el campo <em>Order Priority</em>, y al resultado le hemos añadido una columna calculada que recibe el nombre de <em>Avg Sales</em>, y cuyos valores son el resultado de calcular el valor medio de la columna <em>Amount</em>. Este valor medio lo hemos obtenido usando la función <a href="/es/m/function/listaverage">List.Average</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0015.png"></a>
Por último solo resta ordenar el resultado según las ventas medias. La función que nos permite ordenar una tabla es <a href="/es/m/function/tablesort">Table.Sort</a>, y podemos especificar el campo o los campos según los cuales realizar la ordenación, y si ésta debe ser ascendente o descendente. La fórmula de paso sería la siguiente:
Table.Sort(GroupByPriority,{{"Avg Sales", Order.Descending}})
Nuestra consulta quedaría del siguiente modo:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000),
GroupByPriority = Table.Group(
FilterByValue,
{"Order Priority"},
{
{"Avg Sales", each List.Average([Amount]), type number}
}
),
SortByValue = Table.Sort(GroupByPriority,{{"Avg Sales", Order.Descending}})
in
SortByValue
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0016.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-2699f7e5-dfc9-471a-a237-c5423ae02008') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este caso partimos de una única tabla, <em>Sales</em>, conteniendo información de ventas. Entre otros, encontramos en ella el campo <em>Order Priority</em> conteniendo la prioridad de la compra (<em>Low</em>, <em>Medium</em>, <em>High</em> o <em>Critical</em>) y el campo <em>Amount</em> con información del importe de cada venta. Queremos obtener una tabla que muestre las ventas medias por prioridad pero considerando solo las ventas superiores a 3.000 €. Y queremos que la tabla resultante se muestre ordenada de mayor a menor según dicho valor.
Empezamos filtrando la tabla de ventas de forma que solo incluya ventas cuyos importes sean superiores a los 3.000 € indicados, para lo que hacemos uso de la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a>:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000)
in
FilterByValue
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0014.png"></a>
A continuación, queremos agrupar el resultado en función de los valores que tome el campo <em>Order Priority</em>, cosa que podemos conseguir con la función <a href="/es/m/function/tablegroup">Table.Group</a>. Esta función agrupa según el campo o los campos que indiquemos, y permite añadir al resultado columnas calculadas:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000),
GroupByPriority = Table.Group(
FilterByValue,
{"Order Priority"},
{
{"Avg Sales", each List.Average([Amount]), type number}
}
)
in
GroupByPriority
Obsérvese que se ha agrupado la tabla contenida en FilterByValue según el campo <em>Order Priority</em>, y al resultado le hemos añadido una columna calculada que recibe el nombre de <em>Avg Sales</em>, y cuyos valores son el resultado de calcular el valor medio de la columna <em>Amount</em>. Este valor medio lo hemos obtenido usando la función <a href="/es/m/function/listaverage">List.Average</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0015.png"></a>
Por último solo resta ordenar el resultado según las ventas medias. La función que nos permite ordenar una tabla es <a href="/es/m/function/tablesort">Table.Sort</a>, y podemos especificar el campo o los campos según los cuales realizar la ordenación, y si ésta debe ser ascendente o descendente. La fórmula de paso sería la siguiente:
Table.Sort(GroupByPriority,{{"Avg Sales", Order.Descending}})
Nuestra consulta quedaría del siguiente modo:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000),
GroupByPriority = Table.Group(
FilterByValue,
{"Order Priority"},
{
{"Avg Sales", each List.Average([Amount]), type number}
}
),
SortByValue = Table.Sort(GroupByPriority,{{"Avg Sales", Order.Descending}})
in
SortByValue
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0016.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-2699f7e5-dfc9-471a-a237-c5423ae02008') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este caso partimos de una única tabla, <em>Sales</em>, conteniendo información de ventas. Entre otros, encontramos en ella el campo <em>Order Priority</em> conteniendo la prioridad de la compra (<em>Low</em>, <em>Medium</em>, <em>High</em> o <em>Critical</em>) y el campo <em>Amount</em> con información del importe de cada venta. Queremos obtener una tabla que muestre las ventas medias por prioridad pero considerando solo las ventas superiores a 3.000 €. Y queremos que la tabla resultante se muestre ordenada de mayor a menor según dicho valor.
Empezamos filtrando la tabla de ventas de forma que solo incluya ventas cuyos importes sean superiores a los 3.000 € indicados, para lo que hacemos uso de la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a>:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000)
in
FilterByValue
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0014.png"></a>
A continuación, queremos agrupar el resultado en función de los valores que tome el campo <em>Order Priority</em>, cosa que podemos conseguir con la función <a href="/es/m/function/tablegroup">Table.Group</a>. Esta función agrupa según el campo o los campos que indiquemos, y permite añadir al resultado columnas calculadas:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000),
GroupByPriority = Table.Group(
FilterByValue,
{"Order Priority"},
{
{"Avg Sales", each List.Average([Amount]), type number}
}
)
in
GroupByPriority
Obsérvese que se ha agrupado la tabla contenida en FilterByValue según el campo <em>Order Priority</em>, y al resultado le hemos añadido una columna calculada que recibe el nombre de <em>Avg Sales</em>, y cuyos valores son el resultado de calcular el valor medio de la columna <em>Amount</em>. Este valor medio lo hemos obtenido usando la función <a href="/es/m/function/listaverage">List.Average</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0015.png"></a>
Por último solo resta ordenar el resultado según las ventas medias. La función que nos permite ordenar una tabla es <a href="/es/m/function/tablesort">Table.Sort</a>, y podemos especificar el campo o los campos según los cuales realizar la ordenación, y si ésta debe ser ascendente o descendente. La fórmula de paso sería la siguiente:
Table.Sort(GroupByPriority,{{"Avg Sales", Order.Descending}})
Nuestra consulta quedaría del siguiente modo:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000),
GroupByPriority = Table.Group(
FilterByValue,
{"Order Priority"},
{
{"Avg Sales", each List.Average([Amount]), type number}
}
),
SortByValue = Table.Sort(GroupByPriority,{{"Avg Sales", Order.Descending}})
in
SortByValue
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0016.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-2699f7e5-dfc9-471a-a237-c5423ae02008') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este caso partimos de una única tabla, <em>Sales</em>, conteniendo información de ventas. Entre otros, encontramos en ella el campo <em>Order Priority</em> conteniendo la prioridad de la compra (<em>Low</em>, <em>Medium</em>, <em>High</em> o <em>Critical</em>) y el campo <em>Amount</em> con información del importe de cada venta. Queremos obtener una tabla que muestre las ventas medias por prioridad pero considerando solo las ventas superiores a 3.000 €. Y queremos que la tabla resultante se muestre ordenada de mayor a menor según dicho valor.
Empezamos filtrando la tabla de ventas de forma que solo incluya ventas cuyos importes sean superiores a los 3.000 € indicados, para lo que hacemos uso de la función <a href="/es/m/function/tableselectrows">Table.SelectRows</a>:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000)
in
FilterByValue
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0014.png"></a>
A continuación, queremos agrupar el resultado en función de los valores que tome el campo <em>Order Priority</em>, cosa que podemos conseguir con la función <a href="/es/m/function/tablegroup">Table.Group</a>. Esta función agrupa según el campo o los campos que indiquemos, y permite añadir al resultado columnas calculadas:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000),
GroupByPriority = Table.Group(
FilterByValue,
{"Order Priority"},
{
{"Avg Sales", each List.Average([Amount]), type number}
}
)
in
GroupByPriority
Obsérvese que se ha agrupado la tabla contenida en FilterByValue según el campo <em>Order Priority</em>, y al resultado le hemos añadido una columna calculada que recibe el nombre de <em>Avg Sales</em>, y cuyos valores son el resultado de calcular el valor medio de la columna <em>Amount</em>. Este valor medio lo hemos obtenido usando la función <a href="/es/m/function/listaverage">List.Average</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0015.png"></a>
Por último solo resta ordenar el resultado según las ventas medias. La función que nos permite ordenar una tabla es <a href="/es/m/function/tablesort">Table.Sort</a>, y podemos especificar el campo o los campos según los cuales realizar la ordenación, y si ésta debe ser ascendente o descendente. La fórmula de paso sería la siguiente:
Table.Sort(GroupByPriority,{{"Avg Sales", Order.Descending}})
Nuestra consulta quedaría del siguiente modo:
let
FilterByValue = Table.SelectRows(Sales, each [Amount] >= 3000),
GroupByPriority = Table.Group(
FilterByValue,
{"Order Priority"},
{
{"Avg Sales", each List.Average([Amount]), type number}
}
),
SortByValue = Table.Sort(GroupByPriority,{{"Avg Sales", Order.Descending}})
in
SortByValue
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0016.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-05a4e35a-71f2-407c-8d22-338089a35642') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Este escenario es continuación de <a href="/es/m/scenario/identificacion-de-los-clientes-con-mayor-facturacion">Identificación de los clientes con mayor facturación</a>. El objetivo ahora es obtener -también como función de consulta- las ventas realizadas a los n clientes con mayor facturación.
En aquel escenario terminábamos con la siguiente consulta:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
El resultado-una vez invocada la función- era una tabla con dos columnas: El identificador del cliente y las ventas de dicho cliente. Por ejemplo, si invocábamos la función pasando el número 3 como argumento, la tabla obtenida era la siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
Si duplicamos la consulta y damos a la nueva un nombre apropiado (<em>SalesTopCustomers</em>, por ejemplo), tendríamos que añadir un paso que sume la columna <em>Total Sales</em>, para lo que basta con usar la función <a href="/es/m/function/tablecolumn">Table.Column</a> para seleccionar la columna, y <a href="/es/m/function/listsum">List.Sum</a> nuevamente, para sumarla. Es decir:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers),
SalesTopNRows = Table.Column(TopNRows, "Total Sales"),
TotalSales = List.Sum(SalesTopNRows)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0012.png"></a>
Si invocamos la función pasando 3 como argumento, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0013.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-05a4e35a-71f2-407c-8d22-338089a35642') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Este escenario es continuación de <a href="/es/m/scenario/identificacion-de-los-clientes-con-mayor-facturacion">Identificación de los clientes con mayor facturación</a>. El objetivo ahora es obtener -también como función de consulta- las ventas realizadas a los n clientes con mayor facturación.
En aquel escenario terminábamos con la siguiente consulta:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
El resultado-una vez invocada la función- era una tabla con dos columnas: El identificador del cliente y las ventas de dicho cliente. Por ejemplo, si invocábamos la función pasando el número 3 como argumento, la tabla obtenida era la siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
Si duplicamos la consulta y damos a la nueva un nombre apropiado (<em>SalesTopCustomers</em>, por ejemplo), tendríamos que añadir un paso que sume la columna <em>Total Sales</em>, para lo que basta con usar la función <a href="/es/m/function/tablecolumn">Table.Column</a> para seleccionar la columna, y <a href="/es/m/function/listsum">List.Sum</a> nuevamente, para sumarla. Es decir:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers),
SalesTopNRows = Table.Column(TopNRows, "Total Sales"),
TotalSales = List.Sum(SalesTopNRows)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0012.png"></a>
Si invocamos la función pasando 3 como argumento, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0013.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-05a4e35a-71f2-407c-8d22-338089a35642') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Este escenario es continuación de <a href="/es/m/scenario/identificacion-de-los-clientes-con-mayor-facturacion">Identificación de los clientes con mayor facturación</a>. El objetivo ahora es obtener -también como función de consulta- las ventas realizadas a los n clientes con mayor facturación.
En aquel escenario terminábamos con la siguiente consulta:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
El resultado-una vez invocada la función- era una tabla con dos columnas: El identificador del cliente y las ventas de dicho cliente. Por ejemplo, si invocábamos la función pasando el número 3 como argumento, la tabla obtenida era la siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
Si duplicamos la consulta y damos a la nueva un nombre apropiado (<em>SalesTopCustomers</em>, por ejemplo), tendríamos que añadir un paso que sume la columna <em>Total Sales</em>, para lo que basta con usar la función <a href="/es/m/function/tablecolumn">Table.Column</a> para seleccionar la columna, y <a href="/es/m/function/listsum">List.Sum</a> nuevamente, para sumarla. Es decir:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers),
SalesTopNRows = Table.Column(TopNRows, "Total Sales"),
TotalSales = List.Sum(SalesTopNRows)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0012.png"></a>
Si invocamos la función pasando 3 como argumento, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0013.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-05a4e35a-71f2-407c-8d22-338089a35642') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Este escenario es continuación de <a href="/es/m/scenario/identificacion-de-los-clientes-con-mayor-facturacion">Identificación de los clientes con mayor facturación</a>. El objetivo ahora es obtener -también como función de consulta- las ventas realizadas a los n clientes con mayor facturación.
En aquel escenario terminábamos con la siguiente consulta:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
El resultado-una vez invocada la función- era una tabla con dos columnas: El identificador del cliente y las ventas de dicho cliente. Por ejemplo, si invocábamos la función pasando el número 3 como argumento, la tabla obtenida era la siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
Si duplicamos la consulta y damos a la nueva un nombre apropiado (<em>SalesTopCustomers</em>, por ejemplo), tendríamos que añadir un paso que sume la columna <em>Total Sales</em>, para lo que basta con usar la función <a href="/es/m/function/tablecolumn">Table.Column</a> para seleccionar la columna, y <a href="/es/m/function/listsum">List.Sum</a> nuevamente, para sumarla. Es decir:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers),
SalesTopNRows = Table.Column(TopNRows, "Total Sales"),
TotalSales = List.Sum(SalesTopNRows)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0012.png"></a>
Si invocamos la función pasando 3 como argumento, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0013.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-c7f8c7ca-3766-4bd5-8db3-bef67b56d8ce') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Este escenario es continuación de <a href="/es/m/scenario/identificacion-de-los-clientes-con-mayor-facturacion">Identificación de los clientes con mayor facturación</a>. El objetivo ahora es obtener -también como función de consulta- las ventas realizadas a los n clientes con mayor facturación.
En aquel escenario terminábamos con la siguiente consulta:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
El resultado-una vez invocada la función- era una tabla con dos columnas: El identificador del cliente y las ventas de dicho cliente. Por ejemplo, si invocábamos la función pasando el número 3 como argumento, la tabla obtenida era la siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
Si duplicamos la consulta y damos a la nueva un nombre apropiado (<em>SalesTopCustomers</em>, por ejemplo), tendríamos que añadir un paso que sume la columna <em>Total Sales</em>, para lo que basta con usar la función <a href="/es/m/function/tablecolumn">Table.Column</a> para seleccionar la columna, y <a href="/es/m/function/listsum">List.Sum</a> nuevamente, para sumarla. Es decir:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers),
SalesTopNRows = Table.Column(TopNRows, "Total Sales"),
TotalSales = List.Sum(SalesTopNRows)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0012.png"></a>
Si invocamos la función pasando 3 como argumento, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0013.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-c7f8c7ca-3766-4bd5-8db3-bef67b56d8ce') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Este escenario es continuación de <a href="/es/m/scenario/identificacion-de-los-clientes-con-mayor-facturacion">Identificación de los clientes con mayor facturación</a>. El objetivo ahora es obtener -también como función de consulta- las ventas realizadas a los n clientes con mayor facturación.
En aquel escenario terminábamos con la siguiente consulta:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
El resultado-una vez invocada la función- era una tabla con dos columnas: El identificador del cliente y las ventas de dicho cliente. Por ejemplo, si invocábamos la función pasando el número 3 como argumento, la tabla obtenida era la siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
Si duplicamos la consulta y damos a la nueva un nombre apropiado (<em>SalesTopCustomers</em>, por ejemplo), tendríamos que añadir un paso que sume la columna <em>Total Sales</em>, para lo que basta con usar la función <a href="/es/m/function/tablecolumn">Table.Column</a> para seleccionar la columna, y <a href="/es/m/function/listsum">List.Sum</a> nuevamente, para sumarla. Es decir:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers),
SalesTopNRows = Table.Column(TopNRows, "Total Sales"),
TotalSales = List.Sum(SalesTopNRows)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0012.png"></a>
Si invocamos la función pasando 3 como argumento, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0013.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-c7f8c7ca-3766-4bd5-8db3-bef67b56d8ce') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Este escenario es continuación de <a href="/es/m/scenario/identificacion-de-los-clientes-con-mayor-facturacion">Identificación de los clientes con mayor facturación</a>. El objetivo ahora es obtener -también como función de consulta- las ventas realizadas a los n clientes con mayor facturación.
En aquel escenario terminábamos con la siguiente consulta:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
El resultado-una vez invocada la función- era una tabla con dos columnas: El identificador del cliente y las ventas de dicho cliente. Por ejemplo, si invocábamos la función pasando el número 3 como argumento, la tabla obtenida era la siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
Si duplicamos la consulta y damos a la nueva un nombre apropiado (<em>SalesTopCustomers</em>, por ejemplo), tendríamos que añadir un paso que sume la columna <em>Total Sales</em>, para lo que basta con usar la función <a href="/es/m/function/tablecolumn">Table.Column</a> para seleccionar la columna, y <a href="/es/m/function/listsum">List.Sum</a> nuevamente, para sumarla. Es decir:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers),
SalesTopNRows = Table.Column(TopNRows, "Total Sales"),
TotalSales = List.Sum(SalesTopNRows)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0012.png"></a>
Si invocamos la función pasando 3 como argumento, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0013.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-c7f8c7ca-3766-4bd5-8db3-bef67b56d8ce') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Este escenario es continuación de <a href="/es/m/scenario/identificacion-de-los-clientes-con-mayor-facturacion">Identificación de los clientes con mayor facturación</a>. El objetivo ahora es obtener -también como función de consulta- las ventas realizadas a los n clientes con mayor facturación.
En aquel escenario terminábamos con la siguiente consulta:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
El resultado-una vez invocada la función- era una tabla con dos columnas: El identificador del cliente y las ventas de dicho cliente. Por ejemplo, si invocábamos la función pasando el número 3 como argumento, la tabla obtenida era la siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
Si duplicamos la consulta y damos a la nueva un nombre apropiado (<em>SalesTopCustomers</em>, por ejemplo), tendríamos que añadir un paso que sume la columna <em>Total Sales</em>, para lo que basta con usar la función <a href="/es/m/function/tablecolumn">Table.Column</a> para seleccionar la columna, y <a href="/es/m/function/listsum">List.Sum</a> nuevamente, para sumarla. Es decir:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers),
SalesTopNRows = Table.Column(TopNRows, "Total Sales"),
TotalSales = List.Sum(SalesTopNRows)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0012.png"></a>
Si invocamos la función pasando 3 como argumento, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0013.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-56d4c1c6-8e96-4a9f-9a0c-d1979fab9048') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Este escenario es continuación de <a href="/es/m/scenario/identificacion-de-los-clientes-con-mayor-facturacion">Identificación de los clientes con mayor facturación</a>. El objetivo ahora es obtener -también como función de consulta- las ventas realizadas a los n clientes con mayor facturación.
En aquel escenario terminábamos con la siguiente consulta:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
El resultado-una vez invocada la función- era una tabla con dos columnas: El identificador del cliente y las ventas de dicho cliente. Por ejemplo, si invocábamos la función pasando el número 3 como argumento, la tabla obtenida era la siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
Si duplicamos la consulta y damos a la nueva un nombre apropiado (<em>SalesTopCustomers</em>, por ejemplo), tendríamos que añadir un paso que sume la columna <em>Total Sales</em>, para lo que basta con usar la función <a href="/es/m/function/tablecolumn">Table.Column</a> para seleccionar la columna, y <a href="/es/m/function/listsum">List.Sum</a> nuevamente, para sumarla. Es decir:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers),
SalesTopNRows = Table.Column(TopNRows, "Total Sales"),
TotalSales = List.Sum(SalesTopNRows)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0012.png"></a>
Si invocamos la función pasando 3 como argumento, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0013.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-56d4c1c6-8e96-4a9f-9a0c-d1979fab9048') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Este escenario es continuación de <a href="/es/m/scenario/identificacion-de-los-clientes-con-mayor-facturacion">Identificación de los clientes con mayor facturación</a>. El objetivo ahora es obtener -también como función de consulta- las ventas realizadas a los n clientes con mayor facturación.
En aquel escenario terminábamos con la siguiente consulta:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
El resultado-una vez invocada la función- era una tabla con dos columnas: El identificador del cliente y las ventas de dicho cliente. Por ejemplo, si invocábamos la función pasando el número 3 como argumento, la tabla obtenida era la siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
Si duplicamos la consulta y damos a la nueva un nombre apropiado (<em>SalesTopCustomers</em>, por ejemplo), tendríamos que añadir un paso que sume la columna <em>Total Sales</em>, para lo que basta con usar la función <a href="/es/m/function/tablecolumn">Table.Column</a> para seleccionar la columna, y <a href="/es/m/function/listsum">List.Sum</a> nuevamente, para sumarla. Es decir:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers),
SalesTopNRows = Table.Column(TopNRows, "Total Sales"),
TotalSales = List.Sum(SalesTopNRows)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0012.png"></a>
Si invocamos la función pasando 3 como argumento, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0013.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-56d4c1c6-8e96-4a9f-9a0c-d1979fab9048') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Este escenario es continuación de <a href="/es/m/scenario/identificacion-de-los-clientes-con-mayor-facturacion">Identificación de los clientes con mayor facturación</a>. El objetivo ahora es obtener -también como función de consulta- las ventas realizadas a los n clientes con mayor facturación.
En aquel escenario terminábamos con la siguiente consulta:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
El resultado-una vez invocada la función- era una tabla con dos columnas: El identificador del cliente y las ventas de dicho cliente. Por ejemplo, si invocábamos la función pasando el número 3 como argumento, la tabla obtenida era la siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
Si duplicamos la consulta y damos a la nueva un nombre apropiado (<em>SalesTopCustomers</em>, por ejemplo), tendríamos que añadir un paso que sume la columna <em>Total Sales</em>, para lo que basta con usar la función <a href="/es/m/function/tablecolumn">Table.Column</a> para seleccionar la columna, y <a href="/es/m/function/listsum">List.Sum</a> nuevamente, para sumarla. Es decir:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers),
SalesTopNRows = Table.Column(TopNRows, "Total Sales"),
TotalSales = List.Sum(SalesTopNRows)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0012.png"></a>
Si invocamos la función pasando 3 como argumento, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0013.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-56d4c1c6-8e96-4a9f-9a0c-d1979fab9048') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Este escenario es continuación de <a href="/es/m/scenario/identificacion-de-los-clientes-con-mayor-facturacion">Identificación de los clientes con mayor facturación</a>. El objetivo ahora es obtener -también como función de consulta- las ventas realizadas a los n clientes con mayor facturación.
En aquel escenario terminábamos con la siguiente consulta:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers)
in
TopNRows
El resultado-una vez invocada la función- era una tabla con dos columnas: El identificador del cliente y las ventas de dicho cliente. Por ejemplo, si invocábamos la función pasando el número 3 como argumento, la tabla obtenida era la siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0011.png"></a>
Si duplicamos la consulta y damos a la nueva un nombre apropiado (<em>SalesTopCustomers</em>, por ejemplo), tendríamos que añadir un paso que sume la columna <em>Total Sales</em>, para lo que basta con usar la función <a href="/es/m/function/tablecolumn">Table.Column</a> para seleccionar la columna, y <a href="/es/m/function/listsum">List.Sum</a> nuevamente, para sumarla. Es decir:
(numberOfCustomers as number) =>
let
GroupedRows = Table.Group(
Sales,
"Customer Id",
{
{"Total Sales", each List.Sum([Amount]), type number}
}
),
SortedRows = Table.Sort(
GroupedRows,
{
{"Total Sales", Order.Descending}
}
),
TopNRows = Table.FirstN(SortedRows, numberOfCustomers),
SalesTopNRows = Table.Column(TopNRows, "Total Sales"),
TotalSales = List.Sum(SalesTopNRows)
in
TotalSales
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0012.png"></a>
Si invocamos la función pasando 3 como argumento, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2023-02/escenario_m_0013.png"></a>', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 934)
Drupal\views\Plugin\views\field\EntityField->render_item(0, Array) (Line: 1171)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender(Object) (Line: 238)
template_preprocess_views_view_field(Array, 'views_view_field', Array)
call_user_func_array('template_preprocess_views_view_field', Array) (Line: 287)
Drupal\Core\Theme\ThemeManager->render('views_view_field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 1748)
Drupal\views\Plugin\views\field\FieldPluginBase->theme(Object) (Line: 774)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 713)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields(Array) (Line: 579)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping(Array, Array, 1) (Line: 467)
Drupal\views\Plugin\views\style\StylePluginBase->render(Array) (Line: 2169)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1538)
Drupal\views\ViewExecutable->render() (Line: 199)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_2', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Return type of Drupal\google_analytics\Component\Render\GoogleAnalyticsJavaScriptSnippet::jsonSerialize() should either be compatible with JsonSerializable::jsonSerialize(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in include() (line 10 of modules/contrib/google_analytics/src/Component/Render/GoogleAnalyticsJavaScriptSnippet.php).
include('/var/www/vhosts/interactivechaos.ovh/httpdocs/modules/contrib/google_analytics/src/Component/Render/GoogleAnalyticsJavaScriptSnippet.php') (Line: 578)
Composer\Autoload\ClassLoader::Composer\Autoload\{closure}('/var/www/vhosts/interactivechaos.ovh/httpdocs/modules/contrib/google_analytics/src/Component/Render/GoogleAnalyticsJavaScriptSnippet.php') (Line: 432)
Composer\Autoload\ClassLoader->loadClass('Drupal\google_analytics\Component\Render\GoogleAnalyticsJavaScriptSnippet') (Line: 372)
google_analytics_page_attachments(Array) (Line: 313)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}(Object, 'google_analytics') (Line: 405)
Drupal\Core\Extension\ModuleHandler->invokeAllWith('page_attachments', Object) (Line: 310)
Drupal\Core\Render\MainContent\HtmlRenderer->invokePageAttachmentHooks(Array) (Line: 288)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Use of "static" in callables is deprecated in Drupal\user\Entity\Role::postLoad() (line 172 of core/modules/user/src/Entity/Role.php).
Drupal\user\Entity\Role::postLoad(Object, Array) (Line: 423)
Drupal\Core\Entity\EntityStorageBase->postLoad(Array) (Line: 353)
Drupal\Core\Entity\EntityStorageBase->loadMultiple() (Line: 126)
eu_cookie_compliance_page_attachments(Array) (Line: 313)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}(Object, 'eu_cookie_compliance') (Line: 405)
Drupal\Core\Extension\ModuleHandler->invokeAllWith('page_attachments', Object) (Line: 310)
Drupal\Core\Render\MainContent\HtmlRenderer->invokePageAttachmentHooks(Array) (Line: 288)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)