- 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::$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', 'f128504b-25ee-439e-b5e9-54ad261050fe') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de ventas, <em>Sales</em>, en la que se incluye un campo con la referencia del día de la orden de venta, <em>OrderDateKey</em>, y otro con la referencia del día del envío del producto, <em>ShipDateKey</em>. Hay, por supuesto, una tabla conteniendo el calendario, <em>Calendar</em> en la que se especifica el día de la semana de cada fecha en el campo <em>DayName</em>. Entre ambas tablas, <em>Sales</em> y <em>Calendar</em>, existe una relación de tipo muchos a uno entre los campos <em>OrderDateKey </em>y <em>DateKey</em>, respectivamente.
El objetivo es averiguar cuántas ventas se realizan por día de la semana y cuántos envíos de productos se realizan por día de la semana.
Podríamos pensar que para esto bastaría generar sendas tablas con visualizaciones llevando a éstas el campo <em>'Calendar'[DayName]</em> (a ambas tablas) y los campos <em>OrderDateKey </em>y <em>ShipDateKey</em> de la tabla <em>Sales</em> (un campo a cada tabla), asegurándonos de que se aplique un recuento sobre estos últimos dos campos. El resultado sería el siguiente:
Aun cuando los días no se muestran en orden, comprobamos que ambas visualizaciones muestran exactamente la misma información, lo que no es coherente con los datos de los que disponemos. El motivo de este aparente error es que ambas visualizaciones son generadas utilizando la misma relación entre las dos tablas -la relación que une los ya mencionados campos <em>Sales[OrderDateKey]</em> y <em>Calendar[DateKey]-</em> por lo que, con independencia del campo del que partamos en la tabla <em>Sales</em> (<em>OrderDateKey</em> o <em>ShipDateKey</em>), el registro de destino en la tabla <em>Calendar</em> es siempre el mismo y, consecuentemente, el día de la semana asignado es también el mismo.
Lo que necesitamos es crear estas tablas utilizando dos relaciones distintas: una -la que utilizaremos para generar la tabla con el número de ventas según el día en que ésta se realiza- será la relación que ya existe entre los campos <em>Sales[OrderDate]</em> y <em>Calendar[DateKey]</em>. La segunda -a usar en la tabla que incluirá información relativa al número de envíos por día de la semana- deberá unir los campos <em>Sales[ShipDateKey]</em> y <em>Calendar[DateKey].</em>
Creamos, por lo tanto, esta segunda relación entre las tablas <em>Sales</em> y <em>Calendar</em>. Como solo puede existir una relación activa entre dos tablas, esta segunda relación se mostrará desactivada, aunque podrá ser utilizada en las funciones DAX que la requieran:
Vamos a generar a continuación las dos tablas utilizando la función <a href="/dax/function/summarize">SUMMARIZE</a>, Esta función nos permitirá resumir el campo de fecha que nos interese de la tabla de ventas (realizando un recuento del mismo) para cada uno de los valores que tome el campo remoto <em>Calendar[DayName]</em>. Así, para la tabla que deberá mostrar el número de órdenes de venta por día de la semana, la función a utilizar sería:
Tabla intermedia = SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of orders"; COUNT(Sales[OrderDateKey])
);
Es decir, estaríamos generando una tabla a partir de la tabla <em>Sales</em>, agrupando los resultados por los valores del campo remoto <em>'Calendar'[DayName]</em> y totalizando el campo <em>Sales[OrderDateKey]</em> contando sus registros y dando a este campo de agregación, en este ejemplo, el nombre <em>Number of orders</em>.
Para la primera de las tablas a generar, esto ya sería suficiente. Pero vamos a generalizar el resultado para poder aplicar el mismo código a la segunda tabla a generar sin tener que realizar grandes modificaciones. Para esto tendríamos que añadir al código generado la opción de especificar la relación a usar, para lo que utilizaremos la función <a href="/dax/function/userelationship">USERELATIONSHIP</a>. Esta función se aplica como un filtro a una tabla, por lo que podemos recurrir a la función <a href="/dax/function/calculatetable">CALCULATETABLE</a> para modificar la tabla intermedia con el filtro en cuestión. El código sería algo como:
Tabla final = CALCULATETABLE(
Tabla intermedia;
USERELATIONSHIP(relación-a-usar)
)
El código para generar la primera tabla (recordemos que es la tabla que muestra el número de órdenes de venta por día de la semana) sería, por lo tanto:
Number of order dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of order dates"; COUNT(Sales[OrderDateKey])
);
USERELATIONSHIP(Sales[OrderDateKey]; 'Calendar'[DateKey])
)
La relación a usar es la activa, por lo que, tal y como se ha dicho, esta parte es redundante. Pero nos permite generar la segunda tabla con una mínima modificación del código:
Number of ship dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of ship dates"; COUNT(Sales[ShipDateKey])
);
USERELATIONSHIP(Sales[ShipDateKey]; 'Calendar'[DateKey])
)
En esta segunda versión, la única diferencia es el origen de la relación a usar: <em>Sales[ShipDateKey]</em> en lugar del campo por defecto <em>Sales[OrderDateKey]</em>.
Las tablas generadas podrían ser usada en nuevos cálculos pero, en este ejemplo, vamos a crear tablas calculadas. Para la primera el resultado sería el siguiente:
Y para la segunda sería el siguiente:
Comprobamos ahora cómo ambas tablas muestran información diferente, tal y como era de esperar.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
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', 'f128504b-25ee-439e-b5e9-54ad261050fe') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de ventas, <em>Sales</em>, en la que se incluye un campo con la referencia del día de la orden de venta, <em>OrderDateKey</em>, y otro con la referencia del día del envío del producto, <em>ShipDateKey</em>. Hay, por supuesto, una tabla conteniendo el calendario, <em>Calendar</em> en la que se especifica el día de la semana de cada fecha en el campo <em>DayName</em>. Entre ambas tablas, <em>Sales</em> y <em>Calendar</em>, existe una relación de tipo muchos a uno entre los campos <em>OrderDateKey </em>y <em>DateKey</em>, respectivamente.
El objetivo es averiguar cuántas ventas se realizan por día de la semana y cuántos envíos de productos se realizan por día de la semana.
Podríamos pensar que para esto bastaría generar sendas tablas con visualizaciones llevando a éstas el campo <em>'Calendar'[DayName]</em> (a ambas tablas) y los campos <em>OrderDateKey </em>y <em>ShipDateKey</em> de la tabla <em>Sales</em> (un campo a cada tabla), asegurándonos de que se aplique un recuento sobre estos últimos dos campos. El resultado sería el siguiente:
Aun cuando los días no se muestran en orden, comprobamos que ambas visualizaciones muestran exactamente la misma información, lo que no es coherente con los datos de los que disponemos. El motivo de este aparente error es que ambas visualizaciones son generadas utilizando la misma relación entre las dos tablas -la relación que une los ya mencionados campos <em>Sales[OrderDateKey]</em> y <em>Calendar[DateKey]-</em> por lo que, con independencia del campo del que partamos en la tabla <em>Sales</em> (<em>OrderDateKey</em> o <em>ShipDateKey</em>), el registro de destino en la tabla <em>Calendar</em> es siempre el mismo y, consecuentemente, el día de la semana asignado es también el mismo.
Lo que necesitamos es crear estas tablas utilizando dos relaciones distintas: una -la que utilizaremos para generar la tabla con el número de ventas según el día en que ésta se realiza- será la relación que ya existe entre los campos <em>Sales[OrderDate]</em> y <em>Calendar[DateKey]</em>. La segunda -a usar en la tabla que incluirá información relativa al número de envíos por día de la semana- deberá unir los campos <em>Sales[ShipDateKey]</em> y <em>Calendar[DateKey].</em>
Creamos, por lo tanto, esta segunda relación entre las tablas <em>Sales</em> y <em>Calendar</em>. Como solo puede existir una relación activa entre dos tablas, esta segunda relación se mostrará desactivada, aunque podrá ser utilizada en las funciones DAX que la requieran:
Vamos a generar a continuación las dos tablas utilizando la función <a href="/dax/function/summarize">SUMMARIZE</a>, Esta función nos permitirá resumir el campo de fecha que nos interese de la tabla de ventas (realizando un recuento del mismo) para cada uno de los valores que tome el campo remoto <em>Calendar[DayName]</em>. Así, para la tabla que deberá mostrar el número de órdenes de venta por día de la semana, la función a utilizar sería:
Tabla intermedia = SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of orders"; COUNT(Sales[OrderDateKey])
);
Es decir, estaríamos generando una tabla a partir de la tabla <em>Sales</em>, agrupando los resultados por los valores del campo remoto <em>'Calendar'[DayName]</em> y totalizando el campo <em>Sales[OrderDateKey]</em> contando sus registros y dando a este campo de agregación, en este ejemplo, el nombre <em>Number of orders</em>.
Para la primera de las tablas a generar, esto ya sería suficiente. Pero vamos a generalizar el resultado para poder aplicar el mismo código a la segunda tabla a generar sin tener que realizar grandes modificaciones. Para esto tendríamos que añadir al código generado la opción de especificar la relación a usar, para lo que utilizaremos la función <a href="/dax/function/userelationship">USERELATIONSHIP</a>. Esta función se aplica como un filtro a una tabla, por lo que podemos recurrir a la función <a href="/dax/function/calculatetable">CALCULATETABLE</a> para modificar la tabla intermedia con el filtro en cuestión. El código sería algo como:
Tabla final = CALCULATETABLE(
Tabla intermedia;
USERELATIONSHIP(relación-a-usar)
)
El código para generar la primera tabla (recordemos que es la tabla que muestra el número de órdenes de venta por día de la semana) sería, por lo tanto:
Number of order dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of order dates"; COUNT(Sales[OrderDateKey])
);
USERELATIONSHIP(Sales[OrderDateKey]; 'Calendar'[DateKey])
)
La relación a usar es la activa, por lo que, tal y como se ha dicho, esta parte es redundante. Pero nos permite generar la segunda tabla con una mínima modificación del código:
Number of ship dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of ship dates"; COUNT(Sales[ShipDateKey])
);
USERELATIONSHIP(Sales[ShipDateKey]; 'Calendar'[DateKey])
)
En esta segunda versión, la única diferencia es el origen de la relación a usar: <em>Sales[ShipDateKey]</em> en lugar del campo por defecto <em>Sales[OrderDateKey]</em>.
Las tablas generadas podrían ser usada en nuevos cálculos pero, en este ejemplo, vamos a crear tablas calculadas. Para la primera el resultado sería el siguiente:
Y para la segunda sería el siguiente:
Comprobamos ahora cómo ambas tablas muestran información diferente, tal y como era de esperar.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
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', 'f128504b-25ee-439e-b5e9-54ad261050fe') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de ventas, <em>Sales</em>, en la que se incluye un campo con la referencia del día de la orden de venta, <em>OrderDateKey</em>, y otro con la referencia del día del envío del producto, <em>ShipDateKey</em>. Hay, por supuesto, una tabla conteniendo el calendario, <em>Calendar</em> en la que se especifica el día de la semana de cada fecha en el campo <em>DayName</em>. Entre ambas tablas, <em>Sales</em> y <em>Calendar</em>, existe una relación de tipo muchos a uno entre los campos <em>OrderDateKey </em>y <em>DateKey</em>, respectivamente.
El objetivo es averiguar cuántas ventas se realizan por día de la semana y cuántos envíos de productos se realizan por día de la semana.
Podríamos pensar que para esto bastaría generar sendas tablas con visualizaciones llevando a éstas el campo <em>'Calendar'[DayName]</em> (a ambas tablas) y los campos <em>OrderDateKey </em>y <em>ShipDateKey</em> de la tabla <em>Sales</em> (un campo a cada tabla), asegurándonos de que se aplique un recuento sobre estos últimos dos campos. El resultado sería el siguiente:
Aun cuando los días no se muestran en orden, comprobamos que ambas visualizaciones muestran exactamente la misma información, lo que no es coherente con los datos de los que disponemos. El motivo de este aparente error es que ambas visualizaciones son generadas utilizando la misma relación entre las dos tablas -la relación que une los ya mencionados campos <em>Sales[OrderDateKey]</em> y <em>Calendar[DateKey]-</em> por lo que, con independencia del campo del que partamos en la tabla <em>Sales</em> (<em>OrderDateKey</em> o <em>ShipDateKey</em>), el registro de destino en la tabla <em>Calendar</em> es siempre el mismo y, consecuentemente, el día de la semana asignado es también el mismo.
Lo que necesitamos es crear estas tablas utilizando dos relaciones distintas: una -la que utilizaremos para generar la tabla con el número de ventas según el día en que ésta se realiza- será la relación que ya existe entre los campos <em>Sales[OrderDate]</em> y <em>Calendar[DateKey]</em>. La segunda -a usar en la tabla que incluirá información relativa al número de envíos por día de la semana- deberá unir los campos <em>Sales[ShipDateKey]</em> y <em>Calendar[DateKey].</em>
Creamos, por lo tanto, esta segunda relación entre las tablas <em>Sales</em> y <em>Calendar</em>. Como solo puede existir una relación activa entre dos tablas, esta segunda relación se mostrará desactivada, aunque podrá ser utilizada en las funciones DAX que la requieran:
Vamos a generar a continuación las dos tablas utilizando la función <a href="/dax/function/summarize">SUMMARIZE</a>, Esta función nos permitirá resumir el campo de fecha que nos interese de la tabla de ventas (realizando un recuento del mismo) para cada uno de los valores que tome el campo remoto <em>Calendar[DayName]</em>. Así, para la tabla que deberá mostrar el número de órdenes de venta por día de la semana, la función a utilizar sería:
Tabla intermedia = SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of orders"; COUNT(Sales[OrderDateKey])
);
Es decir, estaríamos generando una tabla a partir de la tabla <em>Sales</em>, agrupando los resultados por los valores del campo remoto <em>'Calendar'[DayName]</em> y totalizando el campo <em>Sales[OrderDateKey]</em> contando sus registros y dando a este campo de agregación, en este ejemplo, el nombre <em>Number of orders</em>.
Para la primera de las tablas a generar, esto ya sería suficiente. Pero vamos a generalizar el resultado para poder aplicar el mismo código a la segunda tabla a generar sin tener que realizar grandes modificaciones. Para esto tendríamos que añadir al código generado la opción de especificar la relación a usar, para lo que utilizaremos la función <a href="/dax/function/userelationship">USERELATIONSHIP</a>. Esta función se aplica como un filtro a una tabla, por lo que podemos recurrir a la función <a href="/dax/function/calculatetable">CALCULATETABLE</a> para modificar la tabla intermedia con el filtro en cuestión. El código sería algo como:
Tabla final = CALCULATETABLE(
Tabla intermedia;
USERELATIONSHIP(relación-a-usar)
)
El código para generar la primera tabla (recordemos que es la tabla que muestra el número de órdenes de venta por día de la semana) sería, por lo tanto:
Number of order dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of order dates"; COUNT(Sales[OrderDateKey])
);
USERELATIONSHIP(Sales[OrderDateKey]; 'Calendar'[DateKey])
)
La relación a usar es la activa, por lo que, tal y como se ha dicho, esta parte es redundante. Pero nos permite generar la segunda tabla con una mínima modificación del código:
Number of ship dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of ship dates"; COUNT(Sales[ShipDateKey])
);
USERELATIONSHIP(Sales[ShipDateKey]; 'Calendar'[DateKey])
)
En esta segunda versión, la única diferencia es el origen de la relación a usar: <em>Sales[ShipDateKey]</em> en lugar del campo por defecto <em>Sales[OrderDateKey]</em>.
Las tablas generadas podrían ser usada en nuevos cálculos pero, en este ejemplo, vamos a crear tablas calculadas. Para la primera el resultado sería el siguiente:
Y para la segunda sería el siguiente:
Comprobamos ahora cómo ambas tablas muestran información diferente, tal y como era de esperar.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
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', 'f128504b-25ee-439e-b5e9-54ad261050fe') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de ventas, <em>Sales</em>, en la que se incluye un campo con la referencia del día de la orden de venta, <em>OrderDateKey</em>, y otro con la referencia del día del envío del producto, <em>ShipDateKey</em>. Hay, por supuesto, una tabla conteniendo el calendario, <em>Calendar</em> en la que se especifica el día de la semana de cada fecha en el campo <em>DayName</em>. Entre ambas tablas, <em>Sales</em> y <em>Calendar</em>, existe una relación de tipo muchos a uno entre los campos <em>OrderDateKey </em>y <em>DateKey</em>, respectivamente.
El objetivo es averiguar cuántas ventas se realizan por día de la semana y cuántos envíos de productos se realizan por día de la semana.
Podríamos pensar que para esto bastaría generar sendas tablas con visualizaciones llevando a éstas el campo <em>'Calendar'[DayName]</em> (a ambas tablas) y los campos <em>OrderDateKey </em>y <em>ShipDateKey</em> de la tabla <em>Sales</em> (un campo a cada tabla), asegurándonos de que se aplique un recuento sobre estos últimos dos campos. El resultado sería el siguiente:
Aun cuando los días no se muestran en orden, comprobamos que ambas visualizaciones muestran exactamente la misma información, lo que no es coherente con los datos de los que disponemos. El motivo de este aparente error es que ambas visualizaciones son generadas utilizando la misma relación entre las dos tablas -la relación que une los ya mencionados campos <em>Sales[OrderDateKey]</em> y <em>Calendar[DateKey]-</em> por lo que, con independencia del campo del que partamos en la tabla <em>Sales</em> (<em>OrderDateKey</em> o <em>ShipDateKey</em>), el registro de destino en la tabla <em>Calendar</em> es siempre el mismo y, consecuentemente, el día de la semana asignado es también el mismo.
Lo que necesitamos es crear estas tablas utilizando dos relaciones distintas: una -la que utilizaremos para generar la tabla con el número de ventas según el día en que ésta se realiza- será la relación que ya existe entre los campos <em>Sales[OrderDate]</em> y <em>Calendar[DateKey]</em>. La segunda -a usar en la tabla que incluirá información relativa al número de envíos por día de la semana- deberá unir los campos <em>Sales[ShipDateKey]</em> y <em>Calendar[DateKey].</em>
Creamos, por lo tanto, esta segunda relación entre las tablas <em>Sales</em> y <em>Calendar</em>. Como solo puede existir una relación activa entre dos tablas, esta segunda relación se mostrará desactivada, aunque podrá ser utilizada en las funciones DAX que la requieran:
Vamos a generar a continuación las dos tablas utilizando la función <a href="/dax/function/summarize">SUMMARIZE</a>, Esta función nos permitirá resumir el campo de fecha que nos interese de la tabla de ventas (realizando un recuento del mismo) para cada uno de los valores que tome el campo remoto <em>Calendar[DayName]</em>. Así, para la tabla que deberá mostrar el número de órdenes de venta por día de la semana, la función a utilizar sería:
Tabla intermedia = SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of orders"; COUNT(Sales[OrderDateKey])
);
Es decir, estaríamos generando una tabla a partir de la tabla <em>Sales</em>, agrupando los resultados por los valores del campo remoto <em>'Calendar'[DayName]</em> y totalizando el campo <em>Sales[OrderDateKey]</em> contando sus registros y dando a este campo de agregación, en este ejemplo, el nombre <em>Number of orders</em>.
Para la primera de las tablas a generar, esto ya sería suficiente. Pero vamos a generalizar el resultado para poder aplicar el mismo código a la segunda tabla a generar sin tener que realizar grandes modificaciones. Para esto tendríamos que añadir al código generado la opción de especificar la relación a usar, para lo que utilizaremos la función <a href="/dax/function/userelationship">USERELATIONSHIP</a>. Esta función se aplica como un filtro a una tabla, por lo que podemos recurrir a la función <a href="/dax/function/calculatetable">CALCULATETABLE</a> para modificar la tabla intermedia con el filtro en cuestión. El código sería algo como:
Tabla final = CALCULATETABLE(
Tabla intermedia;
USERELATIONSHIP(relación-a-usar)
)
El código para generar la primera tabla (recordemos que es la tabla que muestra el número de órdenes de venta por día de la semana) sería, por lo tanto:
Number of order dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of order dates"; COUNT(Sales[OrderDateKey])
);
USERELATIONSHIP(Sales[OrderDateKey]; 'Calendar'[DateKey])
)
La relación a usar es la activa, por lo que, tal y como se ha dicho, esta parte es redundante. Pero nos permite generar la segunda tabla con una mínima modificación del código:
Number of ship dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of ship dates"; COUNT(Sales[ShipDateKey])
);
USERELATIONSHIP(Sales[ShipDateKey]; 'Calendar'[DateKey])
)
En esta segunda versión, la única diferencia es el origen de la relación a usar: <em>Sales[ShipDateKey]</em> en lugar del campo por defecto <em>Sales[OrderDateKey]</em>.
Las tablas generadas podrían ser usada en nuevos cálculos pero, en este ejemplo, vamos a crear tablas calculadas. Para la primera el resultado sería el siguiente:
Y para la segunda sería el siguiente:
Comprobamos ahora cómo ambas tablas muestran información diferente, tal y como era de esperar.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
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', '98de9281-933c-4b25-9406-4c1639992fd0') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de ventas, <em>Sales</em>, en la que se incluye un campo con la referencia del día de la orden de venta, <em>OrderDateKey</em>, y otro con la referencia del día del envío del producto, <em>ShipDateKey</em>. Hay, por supuesto, una tabla conteniendo el calendario, <em>Calendar</em> en la que se especifica el día de la semana de cada fecha en el campo <em>DayName</em>. Entre ambas tablas, <em>Sales</em> y <em>Calendar</em>, existe una relación de tipo muchos a uno entre los campos <em>OrderDateKey </em>y <em>DateKey</em>, respectivamente.
El objetivo es averiguar cuántas ventas se realizan por día de la semana y cuántos envíos de productos se realizan por día de la semana.
Podríamos pensar que para esto bastaría generar sendas tablas con visualizaciones llevando a éstas el campo <em>'Calendar'[DayName]</em> (a ambas tablas) y los campos <em>OrderDateKey </em>y <em>ShipDateKey</em> de la tabla <em>Sales</em> (un campo a cada tabla), asegurándonos de que se aplique un recuento sobre estos últimos dos campos. El resultado sería el siguiente:
Aun cuando los días no se muestran en orden, comprobamos que ambas visualizaciones muestran exactamente la misma información, lo que no es coherente con los datos de los que disponemos. El motivo de este aparente error es que ambas visualizaciones son generadas utilizando la misma relación entre las dos tablas -la relación que une los ya mencionados campos <em>Sales[OrderDateKey]</em> y <em>Calendar[DateKey]-</em> por lo que, con independencia del campo del que partamos en la tabla <em>Sales</em> (<em>OrderDateKey</em> o <em>ShipDateKey</em>), el registro de destino en la tabla <em>Calendar</em> es siempre el mismo y, consecuentemente, el día de la semana asignado es también el mismo.
Lo que necesitamos es crear estas tablas utilizando dos relaciones distintas: una -la que utilizaremos para generar la tabla con el número de ventas según el día en que ésta se realiza- será la relación que ya existe entre los campos <em>Sales[OrderDate]</em> y <em>Calendar[DateKey]</em>. La segunda -a usar en la tabla que incluirá información relativa al número de envíos por día de la semana- deberá unir los campos <em>Sales[ShipDateKey]</em> y <em>Calendar[DateKey].</em>
Creamos, por lo tanto, esta segunda relación entre las tablas <em>Sales</em> y <em>Calendar</em>. Como solo puede existir una relación activa entre dos tablas, esta segunda relación se mostrará desactivada, aunque podrá ser utilizada en las funciones DAX que la requieran:
Vamos a generar a continuación las dos tablas utilizando la función <a href="/dax/function/summarize">SUMMARIZE</a>, Esta función nos permitirá resumir el campo de fecha que nos interese de la tabla de ventas (realizando un recuento del mismo) para cada uno de los valores que tome el campo remoto <em>Calendar[DayName]</em>. Así, para la tabla que deberá mostrar el número de órdenes de venta por día de la semana, la función a utilizar sería:
Tabla intermedia = SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of orders"; COUNT(Sales[OrderDateKey])
);
Es decir, estaríamos generando una tabla a partir de la tabla <em>Sales</em>, agrupando los resultados por los valores del campo remoto <em>'Calendar'[DayName]</em> y totalizando el campo <em>Sales[OrderDateKey]</em> contando sus registros y dando a este campo de agregación, en este ejemplo, el nombre <em>Number of orders</em>.
Para la primera de las tablas a generar, esto ya sería suficiente. Pero vamos a generalizar el resultado para poder aplicar el mismo código a la segunda tabla a generar sin tener que realizar grandes modificaciones. Para esto tendríamos que añadir al código generado la opción de especificar la relación a usar, para lo que utilizaremos la función <a href="/dax/function/userelationship">USERELATIONSHIP</a>. Esta función se aplica como un filtro a una tabla, por lo que podemos recurrir a la función <a href="/dax/function/calculatetable">CALCULATETABLE</a> para modificar la tabla intermedia con el filtro en cuestión. El código sería algo como:
Tabla final = CALCULATETABLE(
Tabla intermedia;
USERELATIONSHIP(relación-a-usar)
)
El código para generar la primera tabla (recordemos que es la tabla que muestra el número de órdenes de venta por día de la semana) sería, por lo tanto:
Number of order dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of order dates"; COUNT(Sales[OrderDateKey])
);
USERELATIONSHIP(Sales[OrderDateKey]; 'Calendar'[DateKey])
)
La relación a usar es la activa, por lo que, tal y como se ha dicho, esta parte es redundante. Pero nos permite generar la segunda tabla con una mínima modificación del código:
Number of ship dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of ship dates"; COUNT(Sales[ShipDateKey])
);
USERELATIONSHIP(Sales[ShipDateKey]; 'Calendar'[DateKey])
)
En esta segunda versión, la única diferencia es el origen de la relación a usar: <em>Sales[ShipDateKey]</em> en lugar del campo por defecto <em>Sales[OrderDateKey]</em>.
Las tablas generadas podrían ser usada en nuevos cálculos pero, en este ejemplo, vamos a crear tablas calculadas. Para la primera el resultado sería el siguiente:
Y para la segunda sería el siguiente:
Comprobamos ahora cómo ambas tablas muestran información diferente, tal y como era de esperar.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
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', '98de9281-933c-4b25-9406-4c1639992fd0') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de ventas, <em>Sales</em>, en la que se incluye un campo con la referencia del día de la orden de venta, <em>OrderDateKey</em>, y otro con la referencia del día del envío del producto, <em>ShipDateKey</em>. Hay, por supuesto, una tabla conteniendo el calendario, <em>Calendar</em> en la que se especifica el día de la semana de cada fecha en el campo <em>DayName</em>. Entre ambas tablas, <em>Sales</em> y <em>Calendar</em>, existe una relación de tipo muchos a uno entre los campos <em>OrderDateKey </em>y <em>DateKey</em>, respectivamente.
El objetivo es averiguar cuántas ventas se realizan por día de la semana y cuántos envíos de productos se realizan por día de la semana.
Podríamos pensar que para esto bastaría generar sendas tablas con visualizaciones llevando a éstas el campo <em>'Calendar'[DayName]</em> (a ambas tablas) y los campos <em>OrderDateKey </em>y <em>ShipDateKey</em> de la tabla <em>Sales</em> (un campo a cada tabla), asegurándonos de que se aplique un recuento sobre estos últimos dos campos. El resultado sería el siguiente:
Aun cuando los días no se muestran en orden, comprobamos que ambas visualizaciones muestran exactamente la misma información, lo que no es coherente con los datos de los que disponemos. El motivo de este aparente error es que ambas visualizaciones son generadas utilizando la misma relación entre las dos tablas -la relación que une los ya mencionados campos <em>Sales[OrderDateKey]</em> y <em>Calendar[DateKey]-</em> por lo que, con independencia del campo del que partamos en la tabla <em>Sales</em> (<em>OrderDateKey</em> o <em>ShipDateKey</em>), el registro de destino en la tabla <em>Calendar</em> es siempre el mismo y, consecuentemente, el día de la semana asignado es también el mismo.
Lo que necesitamos es crear estas tablas utilizando dos relaciones distintas: una -la que utilizaremos para generar la tabla con el número de ventas según el día en que ésta se realiza- será la relación que ya existe entre los campos <em>Sales[OrderDate]</em> y <em>Calendar[DateKey]</em>. La segunda -a usar en la tabla que incluirá información relativa al número de envíos por día de la semana- deberá unir los campos <em>Sales[ShipDateKey]</em> y <em>Calendar[DateKey].</em>
Creamos, por lo tanto, esta segunda relación entre las tablas <em>Sales</em> y <em>Calendar</em>. Como solo puede existir una relación activa entre dos tablas, esta segunda relación se mostrará desactivada, aunque podrá ser utilizada en las funciones DAX que la requieran:
Vamos a generar a continuación las dos tablas utilizando la función <a href="/dax/function/summarize">SUMMARIZE</a>, Esta función nos permitirá resumir el campo de fecha que nos interese de la tabla de ventas (realizando un recuento del mismo) para cada uno de los valores que tome el campo remoto <em>Calendar[DayName]</em>. Así, para la tabla que deberá mostrar el número de órdenes de venta por día de la semana, la función a utilizar sería:
Tabla intermedia = SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of orders"; COUNT(Sales[OrderDateKey])
);
Es decir, estaríamos generando una tabla a partir de la tabla <em>Sales</em>, agrupando los resultados por los valores del campo remoto <em>'Calendar'[DayName]</em> y totalizando el campo <em>Sales[OrderDateKey]</em> contando sus registros y dando a este campo de agregación, en este ejemplo, el nombre <em>Number of orders</em>.
Para la primera de las tablas a generar, esto ya sería suficiente. Pero vamos a generalizar el resultado para poder aplicar el mismo código a la segunda tabla a generar sin tener que realizar grandes modificaciones. Para esto tendríamos que añadir al código generado la opción de especificar la relación a usar, para lo que utilizaremos la función <a href="/dax/function/userelationship">USERELATIONSHIP</a>. Esta función se aplica como un filtro a una tabla, por lo que podemos recurrir a la función <a href="/dax/function/calculatetable">CALCULATETABLE</a> para modificar la tabla intermedia con el filtro en cuestión. El código sería algo como:
Tabla final = CALCULATETABLE(
Tabla intermedia;
USERELATIONSHIP(relación-a-usar)
)
El código para generar la primera tabla (recordemos que es la tabla que muestra el número de órdenes de venta por día de la semana) sería, por lo tanto:
Number of order dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of order dates"; COUNT(Sales[OrderDateKey])
);
USERELATIONSHIP(Sales[OrderDateKey]; 'Calendar'[DateKey])
)
La relación a usar es la activa, por lo que, tal y como se ha dicho, esta parte es redundante. Pero nos permite generar la segunda tabla con una mínima modificación del código:
Number of ship dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of ship dates"; COUNT(Sales[ShipDateKey])
);
USERELATIONSHIP(Sales[ShipDateKey]; 'Calendar'[DateKey])
)
En esta segunda versión, la única diferencia es el origen de la relación a usar: <em>Sales[ShipDateKey]</em> en lugar del campo por defecto <em>Sales[OrderDateKey]</em>.
Las tablas generadas podrían ser usada en nuevos cálculos pero, en este ejemplo, vamos a crear tablas calculadas. Para la primera el resultado sería el siguiente:
Y para la segunda sería el siguiente:
Comprobamos ahora cómo ambas tablas muestran información diferente, tal y como era de esperar.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
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', '98de9281-933c-4b25-9406-4c1639992fd0') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de ventas, <em>Sales</em>, en la que se incluye un campo con la referencia del día de la orden de venta, <em>OrderDateKey</em>, y otro con la referencia del día del envío del producto, <em>ShipDateKey</em>. Hay, por supuesto, una tabla conteniendo el calendario, <em>Calendar</em> en la que se especifica el día de la semana de cada fecha en el campo <em>DayName</em>. Entre ambas tablas, <em>Sales</em> y <em>Calendar</em>, existe una relación de tipo muchos a uno entre los campos <em>OrderDateKey </em>y <em>DateKey</em>, respectivamente.
El objetivo es averiguar cuántas ventas se realizan por día de la semana y cuántos envíos de productos se realizan por día de la semana.
Podríamos pensar que para esto bastaría generar sendas tablas con visualizaciones llevando a éstas el campo <em>'Calendar'[DayName]</em> (a ambas tablas) y los campos <em>OrderDateKey </em>y <em>ShipDateKey</em> de la tabla <em>Sales</em> (un campo a cada tabla), asegurándonos de que se aplique un recuento sobre estos últimos dos campos. El resultado sería el siguiente:
Aun cuando los días no se muestran en orden, comprobamos que ambas visualizaciones muestran exactamente la misma información, lo que no es coherente con los datos de los que disponemos. El motivo de este aparente error es que ambas visualizaciones son generadas utilizando la misma relación entre las dos tablas -la relación que une los ya mencionados campos <em>Sales[OrderDateKey]</em> y <em>Calendar[DateKey]-</em> por lo que, con independencia del campo del que partamos en la tabla <em>Sales</em> (<em>OrderDateKey</em> o <em>ShipDateKey</em>), el registro de destino en la tabla <em>Calendar</em> es siempre el mismo y, consecuentemente, el día de la semana asignado es también el mismo.
Lo que necesitamos es crear estas tablas utilizando dos relaciones distintas: una -la que utilizaremos para generar la tabla con el número de ventas según el día en que ésta se realiza- será la relación que ya existe entre los campos <em>Sales[OrderDate]</em> y <em>Calendar[DateKey]</em>. La segunda -a usar en la tabla que incluirá información relativa al número de envíos por día de la semana- deberá unir los campos <em>Sales[ShipDateKey]</em> y <em>Calendar[DateKey].</em>
Creamos, por lo tanto, esta segunda relación entre las tablas <em>Sales</em> y <em>Calendar</em>. Como solo puede existir una relación activa entre dos tablas, esta segunda relación se mostrará desactivada, aunque podrá ser utilizada en las funciones DAX que la requieran:
Vamos a generar a continuación las dos tablas utilizando la función <a href="/dax/function/summarize">SUMMARIZE</a>, Esta función nos permitirá resumir el campo de fecha que nos interese de la tabla de ventas (realizando un recuento del mismo) para cada uno de los valores que tome el campo remoto <em>Calendar[DayName]</em>. Así, para la tabla que deberá mostrar el número de órdenes de venta por día de la semana, la función a utilizar sería:
Tabla intermedia = SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of orders"; COUNT(Sales[OrderDateKey])
);
Es decir, estaríamos generando una tabla a partir de la tabla <em>Sales</em>, agrupando los resultados por los valores del campo remoto <em>'Calendar'[DayName]</em> y totalizando el campo <em>Sales[OrderDateKey]</em> contando sus registros y dando a este campo de agregación, en este ejemplo, el nombre <em>Number of orders</em>.
Para la primera de las tablas a generar, esto ya sería suficiente. Pero vamos a generalizar el resultado para poder aplicar el mismo código a la segunda tabla a generar sin tener que realizar grandes modificaciones. Para esto tendríamos que añadir al código generado la opción de especificar la relación a usar, para lo que utilizaremos la función <a href="/dax/function/userelationship">USERELATIONSHIP</a>. Esta función se aplica como un filtro a una tabla, por lo que podemos recurrir a la función <a href="/dax/function/calculatetable">CALCULATETABLE</a> para modificar la tabla intermedia con el filtro en cuestión. El código sería algo como:
Tabla final = CALCULATETABLE(
Tabla intermedia;
USERELATIONSHIP(relación-a-usar)
)
El código para generar la primera tabla (recordemos que es la tabla que muestra el número de órdenes de venta por día de la semana) sería, por lo tanto:
Number of order dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of order dates"; COUNT(Sales[OrderDateKey])
);
USERELATIONSHIP(Sales[OrderDateKey]; 'Calendar'[DateKey])
)
La relación a usar es la activa, por lo que, tal y como se ha dicho, esta parte es redundante. Pero nos permite generar la segunda tabla con una mínima modificación del código:
Number of ship dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of ship dates"; COUNT(Sales[ShipDateKey])
);
USERELATIONSHIP(Sales[ShipDateKey]; 'Calendar'[DateKey])
)
En esta segunda versión, la única diferencia es el origen de la relación a usar: <em>Sales[ShipDateKey]</em> en lugar del campo por defecto <em>Sales[OrderDateKey]</em>.
Las tablas generadas podrían ser usada en nuevos cálculos pero, en este ejemplo, vamos a crear tablas calculadas. Para la primera el resultado sería el siguiente:
Y para la segunda sería el siguiente:
Comprobamos ahora cómo ambas tablas muestran información diferente, tal y como era de esperar.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
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', '98de9281-933c-4b25-9406-4c1639992fd0') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de ventas, <em>Sales</em>, en la que se incluye un campo con la referencia del día de la orden de venta, <em>OrderDateKey</em>, y otro con la referencia del día del envío del producto, <em>ShipDateKey</em>. Hay, por supuesto, una tabla conteniendo el calendario, <em>Calendar</em> en la que se especifica el día de la semana de cada fecha en el campo <em>DayName</em>. Entre ambas tablas, <em>Sales</em> y <em>Calendar</em>, existe una relación de tipo muchos a uno entre los campos <em>OrderDateKey </em>y <em>DateKey</em>, respectivamente.
El objetivo es averiguar cuántas ventas se realizan por día de la semana y cuántos envíos de productos se realizan por día de la semana.
Podríamos pensar que para esto bastaría generar sendas tablas con visualizaciones llevando a éstas el campo <em>'Calendar'[DayName]</em> (a ambas tablas) y los campos <em>OrderDateKey </em>y <em>ShipDateKey</em> de la tabla <em>Sales</em> (un campo a cada tabla), asegurándonos de que se aplique un recuento sobre estos últimos dos campos. El resultado sería el siguiente:
Aun cuando los días no se muestran en orden, comprobamos que ambas visualizaciones muestran exactamente la misma información, lo que no es coherente con los datos de los que disponemos. El motivo de este aparente error es que ambas visualizaciones son generadas utilizando la misma relación entre las dos tablas -la relación que une los ya mencionados campos <em>Sales[OrderDateKey]</em> y <em>Calendar[DateKey]-</em> por lo que, con independencia del campo del que partamos en la tabla <em>Sales</em> (<em>OrderDateKey</em> o <em>ShipDateKey</em>), el registro de destino en la tabla <em>Calendar</em> es siempre el mismo y, consecuentemente, el día de la semana asignado es también el mismo.
Lo que necesitamos es crear estas tablas utilizando dos relaciones distintas: una -la que utilizaremos para generar la tabla con el número de ventas según el día en que ésta se realiza- será la relación que ya existe entre los campos <em>Sales[OrderDate]</em> y <em>Calendar[DateKey]</em>. La segunda -a usar en la tabla que incluirá información relativa al número de envíos por día de la semana- deberá unir los campos <em>Sales[ShipDateKey]</em> y <em>Calendar[DateKey].</em>
Creamos, por lo tanto, esta segunda relación entre las tablas <em>Sales</em> y <em>Calendar</em>. Como solo puede existir una relación activa entre dos tablas, esta segunda relación se mostrará desactivada, aunque podrá ser utilizada en las funciones DAX que la requieran:
Vamos a generar a continuación las dos tablas utilizando la función <a href="/dax/function/summarize">SUMMARIZE</a>, Esta función nos permitirá resumir el campo de fecha que nos interese de la tabla de ventas (realizando un recuento del mismo) para cada uno de los valores que tome el campo remoto <em>Calendar[DayName]</em>. Así, para la tabla que deberá mostrar el número de órdenes de venta por día de la semana, la función a utilizar sería:
Tabla intermedia = SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of orders"; COUNT(Sales[OrderDateKey])
);
Es decir, estaríamos generando una tabla a partir de la tabla <em>Sales</em>, agrupando los resultados por los valores del campo remoto <em>'Calendar'[DayName]</em> y totalizando el campo <em>Sales[OrderDateKey]</em> contando sus registros y dando a este campo de agregación, en este ejemplo, el nombre <em>Number of orders</em>.
Para la primera de las tablas a generar, esto ya sería suficiente. Pero vamos a generalizar el resultado para poder aplicar el mismo código a la segunda tabla a generar sin tener que realizar grandes modificaciones. Para esto tendríamos que añadir al código generado la opción de especificar la relación a usar, para lo que utilizaremos la función <a href="/dax/function/userelationship">USERELATIONSHIP</a>. Esta función se aplica como un filtro a una tabla, por lo que podemos recurrir a la función <a href="/dax/function/calculatetable">CALCULATETABLE</a> para modificar la tabla intermedia con el filtro en cuestión. El código sería algo como:
Tabla final = CALCULATETABLE(
Tabla intermedia;
USERELATIONSHIP(relación-a-usar)
)
El código para generar la primera tabla (recordemos que es la tabla que muestra el número de órdenes de venta por día de la semana) sería, por lo tanto:
Number of order dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of order dates"; COUNT(Sales[OrderDateKey])
);
USERELATIONSHIP(Sales[OrderDateKey]; 'Calendar'[DateKey])
)
La relación a usar es la activa, por lo que, tal y como se ha dicho, esta parte es redundante. Pero nos permite generar la segunda tabla con una mínima modificación del código:
Number of ship dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of ship dates"; COUNT(Sales[ShipDateKey])
);
USERELATIONSHIP(Sales[ShipDateKey]; 'Calendar'[DateKey])
)
En esta segunda versión, la única diferencia es el origen de la relación a usar: <em>Sales[ShipDateKey]</em> en lugar del campo por defecto <em>Sales[OrderDateKey]</em>.
Las tablas generadas podrían ser usada en nuevos cálculos pero, en este ejemplo, vamos a crear tablas calculadas. Para la primera el resultado sería el siguiente:
Y para la segunda sería el siguiente:
Comprobamos ahora cómo ambas tablas muestran información diferente, tal y como era de esperar.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
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', 'b1a04b30-5291-4893-a67e-f63ba97d58c6') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de ventas, <em>Sales</em>, en la que se incluye un campo con la referencia del día de la orden de venta, <em>OrderDateKey</em>, y otro con la referencia del día del envío del producto, <em>ShipDateKey</em>. Hay, por supuesto, una tabla conteniendo el calendario, <em>Calendar</em> en la que se especifica el día de la semana de cada fecha en el campo <em>DayName</em>. Entre ambas tablas, <em>Sales</em> y <em>Calendar</em>, existe una relación de tipo muchos a uno entre los campos <em>OrderDateKey </em>y <em>DateKey</em>, respectivamente.
El objetivo es averiguar cuántas ventas se realizan por día de la semana y cuántos envíos de productos se realizan por día de la semana.
Podríamos pensar que para esto bastaría generar sendas tablas con visualizaciones llevando a éstas el campo <em>'Calendar'[DayName]</em> (a ambas tablas) y los campos <em>OrderDateKey </em>y <em>ShipDateKey</em> de la tabla <em>Sales</em> (un campo a cada tabla), asegurándonos de que se aplique un recuento sobre estos últimos dos campos. El resultado sería el siguiente:
Aun cuando los días no se muestran en orden, comprobamos que ambas visualizaciones muestran exactamente la misma información, lo que no es coherente con los datos de los que disponemos. El motivo de este aparente error es que ambas visualizaciones son generadas utilizando la misma relación entre las dos tablas -la relación que une los ya mencionados campos <em>Sales[OrderDateKey]</em> y <em>Calendar[DateKey]-</em> por lo que, con independencia del campo del que partamos en la tabla <em>Sales</em> (<em>OrderDateKey</em> o <em>ShipDateKey</em>), el registro de destino en la tabla <em>Calendar</em> es siempre el mismo y, consecuentemente, el día de la semana asignado es también el mismo.
Lo que necesitamos es crear estas tablas utilizando dos relaciones distintas: una -la que utilizaremos para generar la tabla con el número de ventas según el día en que ésta se realiza- será la relación que ya existe entre los campos <em>Sales[OrderDate]</em> y <em>Calendar[DateKey]</em>. La segunda -a usar en la tabla que incluirá información relativa al número de envíos por día de la semana- deberá unir los campos <em>Sales[ShipDateKey]</em> y <em>Calendar[DateKey].</em>
Creamos, por lo tanto, esta segunda relación entre las tablas <em>Sales</em> y <em>Calendar</em>. Como solo puede existir una relación activa entre dos tablas, esta segunda relación se mostrará desactivada, aunque podrá ser utilizada en las funciones DAX que la requieran:
Vamos a generar a continuación las dos tablas utilizando la función <a href="/dax/function/summarize">SUMMARIZE</a>, Esta función nos permitirá resumir el campo de fecha que nos interese de la tabla de ventas (realizando un recuento del mismo) para cada uno de los valores que tome el campo remoto <em>Calendar[DayName]</em>. Así, para la tabla que deberá mostrar el número de órdenes de venta por día de la semana, la función a utilizar sería:
Tabla intermedia = SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of orders"; COUNT(Sales[OrderDateKey])
);
Es decir, estaríamos generando una tabla a partir de la tabla <em>Sales</em>, agrupando los resultados por los valores del campo remoto <em>'Calendar'[DayName]</em> y totalizando el campo <em>Sales[OrderDateKey]</em> contando sus registros y dando a este campo de agregación, en este ejemplo, el nombre <em>Number of orders</em>.
Para la primera de las tablas a generar, esto ya sería suficiente. Pero vamos a generalizar el resultado para poder aplicar el mismo código a la segunda tabla a generar sin tener que realizar grandes modificaciones. Para esto tendríamos que añadir al código generado la opción de especificar la relación a usar, para lo que utilizaremos la función <a href="/dax/function/userelationship">USERELATIONSHIP</a>. Esta función se aplica como un filtro a una tabla, por lo que podemos recurrir a la función <a href="/dax/function/calculatetable">CALCULATETABLE</a> para modificar la tabla intermedia con el filtro en cuestión. El código sería algo como:
Tabla final = CALCULATETABLE(
Tabla intermedia;
USERELATIONSHIP(relación-a-usar)
)
El código para generar la primera tabla (recordemos que es la tabla que muestra el número de órdenes de venta por día de la semana) sería, por lo tanto:
Number of order dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of order dates"; COUNT(Sales[OrderDateKey])
);
USERELATIONSHIP(Sales[OrderDateKey]; 'Calendar'[DateKey])
)
La relación a usar es la activa, por lo que, tal y como se ha dicho, esta parte es redundante. Pero nos permite generar la segunda tabla con una mínima modificación del código:
Number of ship dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of ship dates"; COUNT(Sales[ShipDateKey])
);
USERELATIONSHIP(Sales[ShipDateKey]; 'Calendar'[DateKey])
)
En esta segunda versión, la única diferencia es el origen de la relación a usar: <em>Sales[ShipDateKey]</em> en lugar del campo por defecto <em>Sales[OrderDateKey]</em>.
Las tablas generadas podrían ser usada en nuevos cálculos pero, en este ejemplo, vamos a crear tablas calculadas. Para la primera el resultado sería el siguiente:
Y para la segunda sería el siguiente:
Comprobamos ahora cómo ambas tablas muestran información diferente, tal y como era de esperar.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
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', 'b1a04b30-5291-4893-a67e-f63ba97d58c6') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de ventas, <em>Sales</em>, en la que se incluye un campo con la referencia del día de la orden de venta, <em>OrderDateKey</em>, y otro con la referencia del día del envío del producto, <em>ShipDateKey</em>. Hay, por supuesto, una tabla conteniendo el calendario, <em>Calendar</em> en la que se especifica el día de la semana de cada fecha en el campo <em>DayName</em>. Entre ambas tablas, <em>Sales</em> y <em>Calendar</em>, existe una relación de tipo muchos a uno entre los campos <em>OrderDateKey </em>y <em>DateKey</em>, respectivamente.
El objetivo es averiguar cuántas ventas se realizan por día de la semana y cuántos envíos de productos se realizan por día de la semana.
Podríamos pensar que para esto bastaría generar sendas tablas con visualizaciones llevando a éstas el campo <em>'Calendar'[DayName]</em> (a ambas tablas) y los campos <em>OrderDateKey </em>y <em>ShipDateKey</em> de la tabla <em>Sales</em> (un campo a cada tabla), asegurándonos de que se aplique un recuento sobre estos últimos dos campos. El resultado sería el siguiente:
Aun cuando los días no se muestran en orden, comprobamos que ambas visualizaciones muestran exactamente la misma información, lo que no es coherente con los datos de los que disponemos. El motivo de este aparente error es que ambas visualizaciones son generadas utilizando la misma relación entre las dos tablas -la relación que une los ya mencionados campos <em>Sales[OrderDateKey]</em> y <em>Calendar[DateKey]-</em> por lo que, con independencia del campo del que partamos en la tabla <em>Sales</em> (<em>OrderDateKey</em> o <em>ShipDateKey</em>), el registro de destino en la tabla <em>Calendar</em> es siempre el mismo y, consecuentemente, el día de la semana asignado es también el mismo.
Lo que necesitamos es crear estas tablas utilizando dos relaciones distintas: una -la que utilizaremos para generar la tabla con el número de ventas según el día en que ésta se realiza- será la relación que ya existe entre los campos <em>Sales[OrderDate]</em> y <em>Calendar[DateKey]</em>. La segunda -a usar en la tabla que incluirá información relativa al número de envíos por día de la semana- deberá unir los campos <em>Sales[ShipDateKey]</em> y <em>Calendar[DateKey].</em>
Creamos, por lo tanto, esta segunda relación entre las tablas <em>Sales</em> y <em>Calendar</em>. Como solo puede existir una relación activa entre dos tablas, esta segunda relación se mostrará desactivada, aunque podrá ser utilizada en las funciones DAX que la requieran:
Vamos a generar a continuación las dos tablas utilizando la función <a href="/dax/function/summarize">SUMMARIZE</a>, Esta función nos permitirá resumir el campo de fecha que nos interese de la tabla de ventas (realizando un recuento del mismo) para cada uno de los valores que tome el campo remoto <em>Calendar[DayName]</em>. Así, para la tabla que deberá mostrar el número de órdenes de venta por día de la semana, la función a utilizar sería:
Tabla intermedia = SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of orders"; COUNT(Sales[OrderDateKey])
);
Es decir, estaríamos generando una tabla a partir de la tabla <em>Sales</em>, agrupando los resultados por los valores del campo remoto <em>'Calendar'[DayName]</em> y totalizando el campo <em>Sales[OrderDateKey]</em> contando sus registros y dando a este campo de agregación, en este ejemplo, el nombre <em>Number of orders</em>.
Para la primera de las tablas a generar, esto ya sería suficiente. Pero vamos a generalizar el resultado para poder aplicar el mismo código a la segunda tabla a generar sin tener que realizar grandes modificaciones. Para esto tendríamos que añadir al código generado la opción de especificar la relación a usar, para lo que utilizaremos la función <a href="/dax/function/userelationship">USERELATIONSHIP</a>. Esta función se aplica como un filtro a una tabla, por lo que podemos recurrir a la función <a href="/dax/function/calculatetable">CALCULATETABLE</a> para modificar la tabla intermedia con el filtro en cuestión. El código sería algo como:
Tabla final = CALCULATETABLE(
Tabla intermedia;
USERELATIONSHIP(relación-a-usar)
)
El código para generar la primera tabla (recordemos que es la tabla que muestra el número de órdenes de venta por día de la semana) sería, por lo tanto:
Number of order dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of order dates"; COUNT(Sales[OrderDateKey])
);
USERELATIONSHIP(Sales[OrderDateKey]; 'Calendar'[DateKey])
)
La relación a usar es la activa, por lo que, tal y como se ha dicho, esta parte es redundante. Pero nos permite generar la segunda tabla con una mínima modificación del código:
Number of ship dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of ship dates"; COUNT(Sales[ShipDateKey])
);
USERELATIONSHIP(Sales[ShipDateKey]; 'Calendar'[DateKey])
)
En esta segunda versión, la única diferencia es el origen de la relación a usar: <em>Sales[ShipDateKey]</em> en lugar del campo por defecto <em>Sales[OrderDateKey]</em>.
Las tablas generadas podrían ser usada en nuevos cálculos pero, en este ejemplo, vamos a crear tablas calculadas. Para la primera el resultado sería el siguiente:
Y para la segunda sería el siguiente:
Comprobamos ahora cómo ambas tablas muestran información diferente, tal y como era de esperar.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
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', 'b1a04b30-5291-4893-a67e-f63ba97d58c6') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de ventas, <em>Sales</em>, en la que se incluye un campo con la referencia del día de la orden de venta, <em>OrderDateKey</em>, y otro con la referencia del día del envío del producto, <em>ShipDateKey</em>. Hay, por supuesto, una tabla conteniendo el calendario, <em>Calendar</em> en la que se especifica el día de la semana de cada fecha en el campo <em>DayName</em>. Entre ambas tablas, <em>Sales</em> y <em>Calendar</em>, existe una relación de tipo muchos a uno entre los campos <em>OrderDateKey </em>y <em>DateKey</em>, respectivamente.
El objetivo es averiguar cuántas ventas se realizan por día de la semana y cuántos envíos de productos se realizan por día de la semana.
Podríamos pensar que para esto bastaría generar sendas tablas con visualizaciones llevando a éstas el campo <em>'Calendar'[DayName]</em> (a ambas tablas) y los campos <em>OrderDateKey </em>y <em>ShipDateKey</em> de la tabla <em>Sales</em> (un campo a cada tabla), asegurándonos de que se aplique un recuento sobre estos últimos dos campos. El resultado sería el siguiente:
Aun cuando los días no se muestran en orden, comprobamos que ambas visualizaciones muestran exactamente la misma información, lo que no es coherente con los datos de los que disponemos. El motivo de este aparente error es que ambas visualizaciones son generadas utilizando la misma relación entre las dos tablas -la relación que une los ya mencionados campos <em>Sales[OrderDateKey]</em> y <em>Calendar[DateKey]-</em> por lo que, con independencia del campo del que partamos en la tabla <em>Sales</em> (<em>OrderDateKey</em> o <em>ShipDateKey</em>), el registro de destino en la tabla <em>Calendar</em> es siempre el mismo y, consecuentemente, el día de la semana asignado es también el mismo.
Lo que necesitamos es crear estas tablas utilizando dos relaciones distintas: una -la que utilizaremos para generar la tabla con el número de ventas según el día en que ésta se realiza- será la relación que ya existe entre los campos <em>Sales[OrderDate]</em> y <em>Calendar[DateKey]</em>. La segunda -a usar en la tabla que incluirá información relativa al número de envíos por día de la semana- deberá unir los campos <em>Sales[ShipDateKey]</em> y <em>Calendar[DateKey].</em>
Creamos, por lo tanto, esta segunda relación entre las tablas <em>Sales</em> y <em>Calendar</em>. Como solo puede existir una relación activa entre dos tablas, esta segunda relación se mostrará desactivada, aunque podrá ser utilizada en las funciones DAX que la requieran:
Vamos a generar a continuación las dos tablas utilizando la función <a href="/dax/function/summarize">SUMMARIZE</a>, Esta función nos permitirá resumir el campo de fecha que nos interese de la tabla de ventas (realizando un recuento del mismo) para cada uno de los valores que tome el campo remoto <em>Calendar[DayName]</em>. Así, para la tabla que deberá mostrar el número de órdenes de venta por día de la semana, la función a utilizar sería:
Tabla intermedia = SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of orders"; COUNT(Sales[OrderDateKey])
);
Es decir, estaríamos generando una tabla a partir de la tabla <em>Sales</em>, agrupando los resultados por los valores del campo remoto <em>'Calendar'[DayName]</em> y totalizando el campo <em>Sales[OrderDateKey]</em> contando sus registros y dando a este campo de agregación, en este ejemplo, el nombre <em>Number of orders</em>.
Para la primera de las tablas a generar, esto ya sería suficiente. Pero vamos a generalizar el resultado para poder aplicar el mismo código a la segunda tabla a generar sin tener que realizar grandes modificaciones. Para esto tendríamos que añadir al código generado la opción de especificar la relación a usar, para lo que utilizaremos la función <a href="/dax/function/userelationship">USERELATIONSHIP</a>. Esta función se aplica como un filtro a una tabla, por lo que podemos recurrir a la función <a href="/dax/function/calculatetable">CALCULATETABLE</a> para modificar la tabla intermedia con el filtro en cuestión. El código sería algo como:
Tabla final = CALCULATETABLE(
Tabla intermedia;
USERELATIONSHIP(relación-a-usar)
)
El código para generar la primera tabla (recordemos que es la tabla que muestra el número de órdenes de venta por día de la semana) sería, por lo tanto:
Number of order dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of order dates"; COUNT(Sales[OrderDateKey])
);
USERELATIONSHIP(Sales[OrderDateKey]; 'Calendar'[DateKey])
)
La relación a usar es la activa, por lo que, tal y como se ha dicho, esta parte es redundante. Pero nos permite generar la segunda tabla con una mínima modificación del código:
Number of ship dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of ship dates"; COUNT(Sales[ShipDateKey])
);
USERELATIONSHIP(Sales[ShipDateKey]; 'Calendar'[DateKey])
)
En esta segunda versión, la única diferencia es el origen de la relación a usar: <em>Sales[ShipDateKey]</em> en lugar del campo por defecto <em>Sales[OrderDateKey]</em>.
Las tablas generadas podrían ser usada en nuevos cálculos pero, en este ejemplo, vamos a crear tablas calculadas. Para la primera el resultado sería el siguiente:
Y para la segunda sería el siguiente:
Comprobamos ahora cómo ambas tablas muestran información diferente, tal y como era de esperar.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
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', 'b1a04b30-5291-4893-a67e-f63ba97d58c6') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de ventas, <em>Sales</em>, en la que se incluye un campo con la referencia del día de la orden de venta, <em>OrderDateKey</em>, y otro con la referencia del día del envío del producto, <em>ShipDateKey</em>. Hay, por supuesto, una tabla conteniendo el calendario, <em>Calendar</em> en la que se especifica el día de la semana de cada fecha en el campo <em>DayName</em>. Entre ambas tablas, <em>Sales</em> y <em>Calendar</em>, existe una relación de tipo muchos a uno entre los campos <em>OrderDateKey </em>y <em>DateKey</em>, respectivamente.
El objetivo es averiguar cuántas ventas se realizan por día de la semana y cuántos envíos de productos se realizan por día de la semana.
Podríamos pensar que para esto bastaría generar sendas tablas con visualizaciones llevando a éstas el campo <em>'Calendar'[DayName]</em> (a ambas tablas) y los campos <em>OrderDateKey </em>y <em>ShipDateKey</em> de la tabla <em>Sales</em> (un campo a cada tabla), asegurándonos de que se aplique un recuento sobre estos últimos dos campos. El resultado sería el siguiente:
Aun cuando los días no se muestran en orden, comprobamos que ambas visualizaciones muestran exactamente la misma información, lo que no es coherente con los datos de los que disponemos. El motivo de este aparente error es que ambas visualizaciones son generadas utilizando la misma relación entre las dos tablas -la relación que une los ya mencionados campos <em>Sales[OrderDateKey]</em> y <em>Calendar[DateKey]-</em> por lo que, con independencia del campo del que partamos en la tabla <em>Sales</em> (<em>OrderDateKey</em> o <em>ShipDateKey</em>), el registro de destino en la tabla <em>Calendar</em> es siempre el mismo y, consecuentemente, el día de la semana asignado es también el mismo.
Lo que necesitamos es crear estas tablas utilizando dos relaciones distintas: una -la que utilizaremos para generar la tabla con el número de ventas según el día en que ésta se realiza- será la relación que ya existe entre los campos <em>Sales[OrderDate]</em> y <em>Calendar[DateKey]</em>. La segunda -a usar en la tabla que incluirá información relativa al número de envíos por día de la semana- deberá unir los campos <em>Sales[ShipDateKey]</em> y <em>Calendar[DateKey].</em>
Creamos, por lo tanto, esta segunda relación entre las tablas <em>Sales</em> y <em>Calendar</em>. Como solo puede existir una relación activa entre dos tablas, esta segunda relación se mostrará desactivada, aunque podrá ser utilizada en las funciones DAX que la requieran:
Vamos a generar a continuación las dos tablas utilizando la función <a href="/dax/function/summarize">SUMMARIZE</a>, Esta función nos permitirá resumir el campo de fecha que nos interese de la tabla de ventas (realizando un recuento del mismo) para cada uno de los valores que tome el campo remoto <em>Calendar[DayName]</em>. Así, para la tabla que deberá mostrar el número de órdenes de venta por día de la semana, la función a utilizar sería:
Tabla intermedia = SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of orders"; COUNT(Sales[OrderDateKey])
);
Es decir, estaríamos generando una tabla a partir de la tabla <em>Sales</em>, agrupando los resultados por los valores del campo remoto <em>'Calendar'[DayName]</em> y totalizando el campo <em>Sales[OrderDateKey]</em> contando sus registros y dando a este campo de agregación, en este ejemplo, el nombre <em>Number of orders</em>.
Para la primera de las tablas a generar, esto ya sería suficiente. Pero vamos a generalizar el resultado para poder aplicar el mismo código a la segunda tabla a generar sin tener que realizar grandes modificaciones. Para esto tendríamos que añadir al código generado la opción de especificar la relación a usar, para lo que utilizaremos la función <a href="/dax/function/userelationship">USERELATIONSHIP</a>. Esta función se aplica como un filtro a una tabla, por lo que podemos recurrir a la función <a href="/dax/function/calculatetable">CALCULATETABLE</a> para modificar la tabla intermedia con el filtro en cuestión. El código sería algo como:
Tabla final = CALCULATETABLE(
Tabla intermedia;
USERELATIONSHIP(relación-a-usar)
)
El código para generar la primera tabla (recordemos que es la tabla que muestra el número de órdenes de venta por día de la semana) sería, por lo tanto:
Number of order dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of order dates"; COUNT(Sales[OrderDateKey])
);
USERELATIONSHIP(Sales[OrderDateKey]; 'Calendar'[DateKey])
)
La relación a usar es la activa, por lo que, tal y como se ha dicho, esta parte es redundante. Pero nos permite generar la segunda tabla con una mínima modificación del código:
Number of ship dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of ship dates"; COUNT(Sales[ShipDateKey])
);
USERELATIONSHIP(Sales[ShipDateKey]; 'Calendar'[DateKey])
)
En esta segunda versión, la única diferencia es el origen de la relación a usar: <em>Sales[ShipDateKey]</em> en lugar del campo por defecto <em>Sales[OrderDateKey]</em>.
Las tablas generadas podrían ser usada en nuevos cálculos pero, en este ejemplo, vamos a crear tablas calculadas. Para la primera el resultado sería el siguiente:
Y para la segunda sería el siguiente:
Comprobamos ahora cómo ambas tablas muestran información diferente, tal y como era de esperar.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
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', '34c3d0ca-e85c-43ef-98b7-7a614efafe4e') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de ventas, <em>Sales</em>, en la que se incluye un campo con la referencia del día de la orden de venta, <em>OrderDateKey</em>, y otro con la referencia del día del envío del producto, <em>ShipDateKey</em>. Hay, por supuesto, una tabla conteniendo el calendario, <em>Calendar</em> en la que se especifica el día de la semana de cada fecha en el campo <em>DayName</em>. Entre ambas tablas, <em>Sales</em> y <em>Calendar</em>, existe una relación de tipo muchos a uno entre los campos <em>OrderDateKey </em>y <em>DateKey</em>, respectivamente.
El objetivo es averiguar cuántas ventas se realizan por día de la semana y cuántos envíos de productos se realizan por día de la semana.
Podríamos pensar que para esto bastaría generar sendas tablas con visualizaciones llevando a éstas el campo <em>'Calendar'[DayName]</em> (a ambas tablas) y los campos <em>OrderDateKey </em>y <em>ShipDateKey</em> de la tabla <em>Sales</em> (un campo a cada tabla), asegurándonos de que se aplique un recuento sobre estos últimos dos campos. El resultado sería el siguiente:
Aun cuando los días no se muestran en orden, comprobamos que ambas visualizaciones muestran exactamente la misma información, lo que no es coherente con los datos de los que disponemos. El motivo de este aparente error es que ambas visualizaciones son generadas utilizando la misma relación entre las dos tablas -la relación que une los ya mencionados campos <em>Sales[OrderDateKey]</em> y <em>Calendar[DateKey]-</em> por lo que, con independencia del campo del que partamos en la tabla <em>Sales</em> (<em>OrderDateKey</em> o <em>ShipDateKey</em>), el registro de destino en la tabla <em>Calendar</em> es siempre el mismo y, consecuentemente, el día de la semana asignado es también el mismo.
Lo que necesitamos es crear estas tablas utilizando dos relaciones distintas: una -la que utilizaremos para generar la tabla con el número de ventas según el día en que ésta se realiza- será la relación que ya existe entre los campos <em>Sales[OrderDate]</em> y <em>Calendar[DateKey]</em>. La segunda -a usar en la tabla que incluirá información relativa al número de envíos por día de la semana- deberá unir los campos <em>Sales[ShipDateKey]</em> y <em>Calendar[DateKey].</em>
Creamos, por lo tanto, esta segunda relación entre las tablas <em>Sales</em> y <em>Calendar</em>. Como solo puede existir una relación activa entre dos tablas, esta segunda relación se mostrará desactivada, aunque podrá ser utilizada en las funciones DAX que la requieran:
Vamos a generar a continuación las dos tablas utilizando la función <a href="/dax/function/summarize">SUMMARIZE</a>, Esta función nos permitirá resumir el campo de fecha que nos interese de la tabla de ventas (realizando un recuento del mismo) para cada uno de los valores que tome el campo remoto <em>Calendar[DayName]</em>. Así, para la tabla que deberá mostrar el número de órdenes de venta por día de la semana, la función a utilizar sería:
Tabla intermedia = SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of orders"; COUNT(Sales[OrderDateKey])
);
Es decir, estaríamos generando una tabla a partir de la tabla <em>Sales</em>, agrupando los resultados por los valores del campo remoto <em>'Calendar'[DayName]</em> y totalizando el campo <em>Sales[OrderDateKey]</em> contando sus registros y dando a este campo de agregación, en este ejemplo, el nombre <em>Number of orders</em>.
Para la primera de las tablas a generar, esto ya sería suficiente. Pero vamos a generalizar el resultado para poder aplicar el mismo código a la segunda tabla a generar sin tener que realizar grandes modificaciones. Para esto tendríamos que añadir al código generado la opción de especificar la relación a usar, para lo que utilizaremos la función <a href="/dax/function/userelationship">USERELATIONSHIP</a>. Esta función se aplica como un filtro a una tabla, por lo que podemos recurrir a la función <a href="/dax/function/calculatetable">CALCULATETABLE</a> para modificar la tabla intermedia con el filtro en cuestión. El código sería algo como:
Tabla final = CALCULATETABLE(
Tabla intermedia;
USERELATIONSHIP(relación-a-usar)
)
El código para generar la primera tabla (recordemos que es la tabla que muestra el número de órdenes de venta por día de la semana) sería, por lo tanto:
Number of order dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of order dates"; COUNT(Sales[OrderDateKey])
);
USERELATIONSHIP(Sales[OrderDateKey]; 'Calendar'[DateKey])
)
La relación a usar es la activa, por lo que, tal y como se ha dicho, esta parte es redundante. Pero nos permite generar la segunda tabla con una mínima modificación del código:
Number of ship dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of ship dates"; COUNT(Sales[ShipDateKey])
);
USERELATIONSHIP(Sales[ShipDateKey]; 'Calendar'[DateKey])
)
En esta segunda versión, la única diferencia es el origen de la relación a usar: <em>Sales[ShipDateKey]</em> en lugar del campo por defecto <em>Sales[OrderDateKey]</em>.
Las tablas generadas podrían ser usada en nuevos cálculos pero, en este ejemplo, vamos a crear tablas calculadas. Para la primera el resultado sería el siguiente:
Y para la segunda sería el siguiente:
Comprobamos ahora cómo ambas tablas muestran información diferente, tal y como era de esperar.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
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', '34c3d0ca-e85c-43ef-98b7-7a614efafe4e') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de ventas, <em>Sales</em>, en la que se incluye un campo con la referencia del día de la orden de venta, <em>OrderDateKey</em>, y otro con la referencia del día del envío del producto, <em>ShipDateKey</em>. Hay, por supuesto, una tabla conteniendo el calendario, <em>Calendar</em> en la que se especifica el día de la semana de cada fecha en el campo <em>DayName</em>. Entre ambas tablas, <em>Sales</em> y <em>Calendar</em>, existe una relación de tipo muchos a uno entre los campos <em>OrderDateKey </em>y <em>DateKey</em>, respectivamente.
El objetivo es averiguar cuántas ventas se realizan por día de la semana y cuántos envíos de productos se realizan por día de la semana.
Podríamos pensar que para esto bastaría generar sendas tablas con visualizaciones llevando a éstas el campo <em>'Calendar'[DayName]</em> (a ambas tablas) y los campos <em>OrderDateKey </em>y <em>ShipDateKey</em> de la tabla <em>Sales</em> (un campo a cada tabla), asegurándonos de que se aplique un recuento sobre estos últimos dos campos. El resultado sería el siguiente:
Aun cuando los días no se muestran en orden, comprobamos que ambas visualizaciones muestran exactamente la misma información, lo que no es coherente con los datos de los que disponemos. El motivo de este aparente error es que ambas visualizaciones son generadas utilizando la misma relación entre las dos tablas -la relación que une los ya mencionados campos <em>Sales[OrderDateKey]</em> y <em>Calendar[DateKey]-</em> por lo que, con independencia del campo del que partamos en la tabla <em>Sales</em> (<em>OrderDateKey</em> o <em>ShipDateKey</em>), el registro de destino en la tabla <em>Calendar</em> es siempre el mismo y, consecuentemente, el día de la semana asignado es también el mismo.
Lo que necesitamos es crear estas tablas utilizando dos relaciones distintas: una -la que utilizaremos para generar la tabla con el número de ventas según el día en que ésta se realiza- será la relación que ya existe entre los campos <em>Sales[OrderDate]</em> y <em>Calendar[DateKey]</em>. La segunda -a usar en la tabla que incluirá información relativa al número de envíos por día de la semana- deberá unir los campos <em>Sales[ShipDateKey]</em> y <em>Calendar[DateKey].</em>
Creamos, por lo tanto, esta segunda relación entre las tablas <em>Sales</em> y <em>Calendar</em>. Como solo puede existir una relación activa entre dos tablas, esta segunda relación se mostrará desactivada, aunque podrá ser utilizada en las funciones DAX que la requieran:
Vamos a generar a continuación las dos tablas utilizando la función <a href="/dax/function/summarize">SUMMARIZE</a>, Esta función nos permitirá resumir el campo de fecha que nos interese de la tabla de ventas (realizando un recuento del mismo) para cada uno de los valores que tome el campo remoto <em>Calendar[DayName]</em>. Así, para la tabla que deberá mostrar el número de órdenes de venta por día de la semana, la función a utilizar sería:
Tabla intermedia = SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of orders"; COUNT(Sales[OrderDateKey])
);
Es decir, estaríamos generando una tabla a partir de la tabla <em>Sales</em>, agrupando los resultados por los valores del campo remoto <em>'Calendar'[DayName]</em> y totalizando el campo <em>Sales[OrderDateKey]</em> contando sus registros y dando a este campo de agregación, en este ejemplo, el nombre <em>Number of orders</em>.
Para la primera de las tablas a generar, esto ya sería suficiente. Pero vamos a generalizar el resultado para poder aplicar el mismo código a la segunda tabla a generar sin tener que realizar grandes modificaciones. Para esto tendríamos que añadir al código generado la opción de especificar la relación a usar, para lo que utilizaremos la función <a href="/dax/function/userelationship">USERELATIONSHIP</a>. Esta función se aplica como un filtro a una tabla, por lo que podemos recurrir a la función <a href="/dax/function/calculatetable">CALCULATETABLE</a> para modificar la tabla intermedia con el filtro en cuestión. El código sería algo como:
Tabla final = CALCULATETABLE(
Tabla intermedia;
USERELATIONSHIP(relación-a-usar)
)
El código para generar la primera tabla (recordemos que es la tabla que muestra el número de órdenes de venta por día de la semana) sería, por lo tanto:
Number of order dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of order dates"; COUNT(Sales[OrderDateKey])
);
USERELATIONSHIP(Sales[OrderDateKey]; 'Calendar'[DateKey])
)
La relación a usar es la activa, por lo que, tal y como se ha dicho, esta parte es redundante. Pero nos permite generar la segunda tabla con una mínima modificación del código:
Number of ship dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of ship dates"; COUNT(Sales[ShipDateKey])
);
USERELATIONSHIP(Sales[ShipDateKey]; 'Calendar'[DateKey])
)
En esta segunda versión, la única diferencia es el origen de la relación a usar: <em>Sales[ShipDateKey]</em> en lugar del campo por defecto <em>Sales[OrderDateKey]</em>.
Las tablas generadas podrían ser usada en nuevos cálculos pero, en este ejemplo, vamos a crear tablas calculadas. Para la primera el resultado sería el siguiente:
Y para la segunda sería el siguiente:
Comprobamos ahora cómo ambas tablas muestran información diferente, tal y como era de esperar.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
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', '34c3d0ca-e85c-43ef-98b7-7a614efafe4e') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de ventas, <em>Sales</em>, en la que se incluye un campo con la referencia del día de la orden de venta, <em>OrderDateKey</em>, y otro con la referencia del día del envío del producto, <em>ShipDateKey</em>. Hay, por supuesto, una tabla conteniendo el calendario, <em>Calendar</em> en la que se especifica el día de la semana de cada fecha en el campo <em>DayName</em>. Entre ambas tablas, <em>Sales</em> y <em>Calendar</em>, existe una relación de tipo muchos a uno entre los campos <em>OrderDateKey </em>y <em>DateKey</em>, respectivamente.
El objetivo es averiguar cuántas ventas se realizan por día de la semana y cuántos envíos de productos se realizan por día de la semana.
Podríamos pensar que para esto bastaría generar sendas tablas con visualizaciones llevando a éstas el campo <em>'Calendar'[DayName]</em> (a ambas tablas) y los campos <em>OrderDateKey </em>y <em>ShipDateKey</em> de la tabla <em>Sales</em> (un campo a cada tabla), asegurándonos de que se aplique un recuento sobre estos últimos dos campos. El resultado sería el siguiente:
Aun cuando los días no se muestran en orden, comprobamos que ambas visualizaciones muestran exactamente la misma información, lo que no es coherente con los datos de los que disponemos. El motivo de este aparente error es que ambas visualizaciones son generadas utilizando la misma relación entre las dos tablas -la relación que une los ya mencionados campos <em>Sales[OrderDateKey]</em> y <em>Calendar[DateKey]-</em> por lo que, con independencia del campo del que partamos en la tabla <em>Sales</em> (<em>OrderDateKey</em> o <em>ShipDateKey</em>), el registro de destino en la tabla <em>Calendar</em> es siempre el mismo y, consecuentemente, el día de la semana asignado es también el mismo.
Lo que necesitamos es crear estas tablas utilizando dos relaciones distintas: una -la que utilizaremos para generar la tabla con el número de ventas según el día en que ésta se realiza- será la relación que ya existe entre los campos <em>Sales[OrderDate]</em> y <em>Calendar[DateKey]</em>. La segunda -a usar en la tabla que incluirá información relativa al número de envíos por día de la semana- deberá unir los campos <em>Sales[ShipDateKey]</em> y <em>Calendar[DateKey].</em>
Creamos, por lo tanto, esta segunda relación entre las tablas <em>Sales</em> y <em>Calendar</em>. Como solo puede existir una relación activa entre dos tablas, esta segunda relación se mostrará desactivada, aunque podrá ser utilizada en las funciones DAX que la requieran:
Vamos a generar a continuación las dos tablas utilizando la función <a href="/dax/function/summarize">SUMMARIZE</a>, Esta función nos permitirá resumir el campo de fecha que nos interese de la tabla de ventas (realizando un recuento del mismo) para cada uno de los valores que tome el campo remoto <em>Calendar[DayName]</em>. Así, para la tabla que deberá mostrar el número de órdenes de venta por día de la semana, la función a utilizar sería:
Tabla intermedia = SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of orders"; COUNT(Sales[OrderDateKey])
);
Es decir, estaríamos generando una tabla a partir de la tabla <em>Sales</em>, agrupando los resultados por los valores del campo remoto <em>'Calendar'[DayName]</em> y totalizando el campo <em>Sales[OrderDateKey]</em> contando sus registros y dando a este campo de agregación, en este ejemplo, el nombre <em>Number of orders</em>.
Para la primera de las tablas a generar, esto ya sería suficiente. Pero vamos a generalizar el resultado para poder aplicar el mismo código a la segunda tabla a generar sin tener que realizar grandes modificaciones. Para esto tendríamos que añadir al código generado la opción de especificar la relación a usar, para lo que utilizaremos la función <a href="/dax/function/userelationship">USERELATIONSHIP</a>. Esta función se aplica como un filtro a una tabla, por lo que podemos recurrir a la función <a href="/dax/function/calculatetable">CALCULATETABLE</a> para modificar la tabla intermedia con el filtro en cuestión. El código sería algo como:
Tabla final = CALCULATETABLE(
Tabla intermedia;
USERELATIONSHIP(relación-a-usar)
)
El código para generar la primera tabla (recordemos que es la tabla que muestra el número de órdenes de venta por día de la semana) sería, por lo tanto:
Number of order dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of order dates"; COUNT(Sales[OrderDateKey])
);
USERELATIONSHIP(Sales[OrderDateKey]; 'Calendar'[DateKey])
)
La relación a usar es la activa, por lo que, tal y como se ha dicho, esta parte es redundante. Pero nos permite generar la segunda tabla con una mínima modificación del código:
Number of ship dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of ship dates"; COUNT(Sales[ShipDateKey])
);
USERELATIONSHIP(Sales[ShipDateKey]; 'Calendar'[DateKey])
)
En esta segunda versión, la única diferencia es el origen de la relación a usar: <em>Sales[ShipDateKey]</em> en lugar del campo por defecto <em>Sales[OrderDateKey]</em>.
Las tablas generadas podrían ser usada en nuevos cálculos pero, en este ejemplo, vamos a crear tablas calculadas. Para la primera el resultado sería el siguiente:
Y para la segunda sería el siguiente:
Comprobamos ahora cómo ambas tablas muestran información diferente, tal y como era de esperar.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
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', '34c3d0ca-e85c-43ef-98b7-7a614efafe4e') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de ventas, <em>Sales</em>, en la que se incluye un campo con la referencia del día de la orden de venta, <em>OrderDateKey</em>, y otro con la referencia del día del envío del producto, <em>ShipDateKey</em>. Hay, por supuesto, una tabla conteniendo el calendario, <em>Calendar</em> en la que se especifica el día de la semana de cada fecha en el campo <em>DayName</em>. Entre ambas tablas, <em>Sales</em> y <em>Calendar</em>, existe una relación de tipo muchos a uno entre los campos <em>OrderDateKey </em>y <em>DateKey</em>, respectivamente.
El objetivo es averiguar cuántas ventas se realizan por día de la semana y cuántos envíos de productos se realizan por día de la semana.
Podríamos pensar que para esto bastaría generar sendas tablas con visualizaciones llevando a éstas el campo <em>'Calendar'[DayName]</em> (a ambas tablas) y los campos <em>OrderDateKey </em>y <em>ShipDateKey</em> de la tabla <em>Sales</em> (un campo a cada tabla), asegurándonos de que se aplique un recuento sobre estos últimos dos campos. El resultado sería el siguiente:
Aun cuando los días no se muestran en orden, comprobamos que ambas visualizaciones muestran exactamente la misma información, lo que no es coherente con los datos de los que disponemos. El motivo de este aparente error es que ambas visualizaciones son generadas utilizando la misma relación entre las dos tablas -la relación que une los ya mencionados campos <em>Sales[OrderDateKey]</em> y <em>Calendar[DateKey]-</em> por lo que, con independencia del campo del que partamos en la tabla <em>Sales</em> (<em>OrderDateKey</em> o <em>ShipDateKey</em>), el registro de destino en la tabla <em>Calendar</em> es siempre el mismo y, consecuentemente, el día de la semana asignado es también el mismo.
Lo que necesitamos es crear estas tablas utilizando dos relaciones distintas: una -la que utilizaremos para generar la tabla con el número de ventas según el día en que ésta se realiza- será la relación que ya existe entre los campos <em>Sales[OrderDate]</em> y <em>Calendar[DateKey]</em>. La segunda -a usar en la tabla que incluirá información relativa al número de envíos por día de la semana- deberá unir los campos <em>Sales[ShipDateKey]</em> y <em>Calendar[DateKey].</em>
Creamos, por lo tanto, esta segunda relación entre las tablas <em>Sales</em> y <em>Calendar</em>. Como solo puede existir una relación activa entre dos tablas, esta segunda relación se mostrará desactivada, aunque podrá ser utilizada en las funciones DAX que la requieran:
Vamos a generar a continuación las dos tablas utilizando la función <a href="/dax/function/summarize">SUMMARIZE</a>, Esta función nos permitirá resumir el campo de fecha que nos interese de la tabla de ventas (realizando un recuento del mismo) para cada uno de los valores que tome el campo remoto <em>Calendar[DayName]</em>. Así, para la tabla que deberá mostrar el número de órdenes de venta por día de la semana, la función a utilizar sería:
Tabla intermedia = SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of orders"; COUNT(Sales[OrderDateKey])
);
Es decir, estaríamos generando una tabla a partir de la tabla <em>Sales</em>, agrupando los resultados por los valores del campo remoto <em>'Calendar'[DayName]</em> y totalizando el campo <em>Sales[OrderDateKey]</em> contando sus registros y dando a este campo de agregación, en este ejemplo, el nombre <em>Number of orders</em>.
Para la primera de las tablas a generar, esto ya sería suficiente. Pero vamos a generalizar el resultado para poder aplicar el mismo código a la segunda tabla a generar sin tener que realizar grandes modificaciones. Para esto tendríamos que añadir al código generado la opción de especificar la relación a usar, para lo que utilizaremos la función <a href="/dax/function/userelationship">USERELATIONSHIP</a>. Esta función se aplica como un filtro a una tabla, por lo que podemos recurrir a la función <a href="/dax/function/calculatetable">CALCULATETABLE</a> para modificar la tabla intermedia con el filtro en cuestión. El código sería algo como:
Tabla final = CALCULATETABLE(
Tabla intermedia;
USERELATIONSHIP(relación-a-usar)
)
El código para generar la primera tabla (recordemos que es la tabla que muestra el número de órdenes de venta por día de la semana) sería, por lo tanto:
Number of order dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of order dates"; COUNT(Sales[OrderDateKey])
);
USERELATIONSHIP(Sales[OrderDateKey]; 'Calendar'[DateKey])
)
La relación a usar es la activa, por lo que, tal y como se ha dicho, esta parte es redundante. Pero nos permite generar la segunda tabla con una mínima modificación del código:
Number of ship dates per day of week =
CALCULATETABLE(
SUMMARIZE(
Sales;
'Calendar'[DayName];
"Number of ship dates"; COUNT(Sales[ShipDateKey])
);
USERELATIONSHIP(Sales[ShipDateKey]; 'Calendar'[DateKey])
)
En esta segunda versión, la única diferencia es el origen de la relación a usar: <em>Sales[ShipDateKey]</em> en lugar del campo por defecto <em>Sales[OrderDateKey]</em>.
Las tablas generadas podrían ser usada en nuevos cálculos pero, en este ejemplo, vamos a crear tablas calculadas. Para la primera el resultado sería el siguiente:
Y para la segunda sería el siguiente:
Comprobamos ahora cómo ambas tablas muestran información diferente, tal y como era de esperar.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
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)
- Deprecated function: Creation of dynamic property Drupal\views\ManyToOneHelper::$handler is deprecated in Drupal\views\ManyToOneHelper->__construct() (line 24 of core/modules/views/src/ManyToOneHelper.php).
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 51)
Drupal\views\Plugin\views\filter\ManyToOne->defineOptions() (Line: 117)
Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid->defineOptions() (Line: 141)
Drupal\views\Plugin\views\PluginBase->init(Object, Object, Array) (Line: 104)
Drupal\views\Plugin\views\HandlerBase->init(Object, Object, Array) (Line: 95)
Drupal\views\Plugin\views\filter\FilterPluginBase->init(Object, Object, Array) (Line: 44)
Drupal\views\Plugin\views\filter\InOperator->init(Object, Object, Array) (Line: 36)
Drupal\views\Plugin\views\filter\ManyToOne->init(Object, Object, Array) (Line: 98)
Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('filter') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('filter', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 2633)
Drupal\views\Plugin\views\display\DisplayPluginBase->viewExposedFormBlocks() (Line: 35)
Drupal\views\Plugin\Block\ViewsExposedFilterBlock->build() (Line: 171)
Drupal\block\BlockViewBuilder::preRender(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, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 160)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 159)
Drupal\Core\Render\Renderer->renderPlain(Array) (Line: 175)
Drupal\Core\Render\Renderer->renderPlaceholder('', Array) (Line: 665)
Drupal\Core\Render\Renderer->replacePlaceholders(Array) (Line: 550)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 148)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 147)
Drupal\Core\Render\Renderer->renderRoot(Array) (Line: 279)
Drupal\Core\Render\HtmlResponseAttachmentsProcessor->renderPlaceholders(Object) (Line: 71)
Drupal\big_pipe\Render\BigPipeResponseAttachmentsProcessor->processAttachments(Object) (Line: 45)
Drupal\Core\EventSubscriber\HtmlResponseSubscriber->onRespond(Object, 'kernel.response', Object)
call_user_func(Array, Object, 'kernel.response', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.response') (Line: 202)
Symfony\Component\HttpKernel\HttpKernel->filterResponse(Object, Object, 1) (Line: 190)
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\views\ManyToOneHelper::$handler is deprecated in Drupal\views\ManyToOneHelper->__construct() (line 24 of core/modules/views/src/ManyToOneHelper.php).
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 51)
Drupal\views\Plugin\views\filter\ManyToOne->defineOptions() (Line: 117)
Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid->defineOptions() (Line: 228)
Drupal\views\Plugin\views\PluginBase->unpackOptions(Array, Array) (Line: 144)
Drupal\views\Plugin\views\PluginBase->init(Object, Object, Array) (Line: 104)
Drupal\views\Plugin\views\HandlerBase->init(Object, Object, Array) (Line: 95)
Drupal\views\Plugin\views\filter\FilterPluginBase->init(Object, Object, Array) (Line: 44)
Drupal\views\Plugin\views\filter\InOperator->init(Object, Object, Array) (Line: 36)
Drupal\views\Plugin\views\filter\ManyToOne->init(Object, Object, Array) (Line: 98)
Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('filter') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('filter', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 2633)
Drupal\views\Plugin\views\display\DisplayPluginBase->viewExposedFormBlocks() (Line: 35)
Drupal\views\Plugin\Block\ViewsExposedFilterBlock->build() (Line: 171)
Drupal\block\BlockViewBuilder::preRender(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, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 160)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 159)
Drupal\Core\Render\Renderer->renderPlain(Array) (Line: 175)
Drupal\Core\Render\Renderer->renderPlaceholder('', Array) (Line: 665)
Drupal\Core\Render\Renderer->replacePlaceholders(Array) (Line: 550)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 148)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 147)
Drupal\Core\Render\Renderer->renderRoot(Array) (Line: 279)
Drupal\Core\Render\HtmlResponseAttachmentsProcessor->renderPlaceholders(Object) (Line: 71)
Drupal\big_pipe\Render\BigPipeResponseAttachmentsProcessor->processAttachments(Object) (Line: 45)
Drupal\Core\EventSubscriber\HtmlResponseSubscriber->onRespond(Object, 'kernel.response', Object)
call_user_func(Array, Object, 'kernel.response', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.response') (Line: 202)
Symfony\Component\HttpKernel\HttpKernel->filterResponse(Object, Object, 1) (Line: 190)
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\views\ManyToOneHelper::$handler is deprecated in Drupal\views\ManyToOneHelper->__construct() (line 24 of core/modules/views/src/ManyToOneHelper.php).
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 51)
Drupal\views\Plugin\views\filter\ManyToOne->defineOptions() (Line: 117)
Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid->defineOptions() (Line: 228)
Drupal\views\Plugin\views\PluginBase->unpackOptions(Array, Array) (Line: 110)
Drupal\views\Plugin\views\HandlerBase->init(Object, Object, Array) (Line: 95)
Drupal\views\Plugin\views\filter\FilterPluginBase->init(Object, Object, Array) (Line: 44)
Drupal\views\Plugin\views\filter\InOperator->init(Object, Object, Array) (Line: 36)
Drupal\views\Plugin\views\filter\ManyToOne->init(Object, Object, Array) (Line: 98)
Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('filter') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('filter', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 2633)
Drupal\views\Plugin\views\display\DisplayPluginBase->viewExposedFormBlocks() (Line: 35)
Drupal\views\Plugin\Block\ViewsExposedFilterBlock->build() (Line: 171)
Drupal\block\BlockViewBuilder::preRender(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, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 160)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 159)
Drupal\Core\Render\Renderer->renderPlain(Array) (Line: 175)
Drupal\Core\Render\Renderer->renderPlaceholder('', Array) (Line: 665)
Drupal\Core\Render\Renderer->replacePlaceholders(Array) (Line: 550)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 148)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 147)
Drupal\Core\Render\Renderer->renderRoot(Array) (Line: 279)
Drupal\Core\Render\HtmlResponseAttachmentsProcessor->renderPlaceholders(Object) (Line: 71)
Drupal\big_pipe\Render\BigPipeResponseAttachmentsProcessor->processAttachments(Object) (Line: 45)
Drupal\Core\EventSubscriber\HtmlResponseSubscriber->onRespond(Object, 'kernel.response', Object)
call_user_func(Array, Object, 'kernel.response', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.response') (Line: 202)
Symfony\Component\HttpKernel\HttpKernel->filterResponse(Object, Object, 1) (Line: 190)
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\views\ManyToOneHelper::$handler is deprecated in Drupal\views\ManyToOneHelper->__construct() (line 24 of core/modules/views/src/ManyToOneHelper.php).
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 38)
Drupal\views\Plugin\views\filter\ManyToOne->init(Object, Object, Array) (Line: 98)
Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('filter') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('filter', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 2633)
Drupal\views\Plugin\views\display\DisplayPluginBase->viewExposedFormBlocks() (Line: 35)
Drupal\views\Plugin\Block\ViewsExposedFilterBlock->build() (Line: 171)
Drupal\block\BlockViewBuilder::preRender(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, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 160)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 159)
Drupal\Core\Render\Renderer->renderPlain(Array) (Line: 175)
Drupal\Core\Render\Renderer->renderPlaceholder('', Array) (Line: 665)
Drupal\Core\Render\Renderer->replacePlaceholders(Array) (Line: 550)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 148)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 147)
Drupal\Core\Render\Renderer->renderRoot(Array) (Line: 279)
Drupal\Core\Render\HtmlResponseAttachmentsProcessor->renderPlaceholders(Object) (Line: 71)
Drupal\big_pipe\Render\BigPipeResponseAttachmentsProcessor->processAttachments(Object) (Line: 45)
Drupal\Core\EventSubscriber\HtmlResponseSubscriber->onRespond(Object, 'kernel.response', Object)
call_user_func(Array, Object, 'kernel.response', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.response') (Line: 202)
Symfony\Component\HttpKernel\HttpKernel->filterResponse(Object, Object, 1) (Line: 190)
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', 'taxonomy_term') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 228)
Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid->valueForm(Array, Object) (Line: 941)
Drupal\views\Plugin\views\filter\FilterPluginBase->buildExposedForm(Array, Object) (Line: 111)
Drupal\views\Form\ViewsExposedForm->buildForm(Array, Object)
call_user_func_array(Array, Array) (Line: 534)
Drupal\Core\Form\FormBuilder->retrieveForm('views_exposed_form', Object) (Line: 281)
Drupal\Core\Form\FormBuilder->buildForm('\Drupal\views\Form\ViewsExposedForm', Object) (Line: 134)
Drupal\views\Plugin\views\exposed_form\ExposedFormPluginBase->renderExposedForm(1) (Line: 2638)
Drupal\views\Plugin\views\display\DisplayPluginBase->viewExposedFormBlocks() (Line: 35)
Drupal\views\Plugin\Block\ViewsExposedFilterBlock->build() (Line: 171)
Drupal\block\BlockViewBuilder::preRender(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, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 160)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 159)
Drupal\Core\Render\Renderer->renderPlain(Array) (Line: 175)
Drupal\Core\Render\Renderer->renderPlaceholder('', Array) (Line: 665)
Drupal\Core\Render\Renderer->replacePlaceholders(Array) (Line: 550)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 148)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 147)
Drupal\Core\Render\Renderer->renderRoot(Array) (Line: 279)
Drupal\Core\Render\HtmlResponseAttachmentsProcessor->renderPlaceholders(Object) (Line: 71)
Drupal\big_pipe\Render\BigPipeResponseAttachmentsProcessor->processAttachments(Object) (Line: 45)
Drupal\Core\EventSubscriber\HtmlResponseSubscriber->onRespond(Object, 'kernel.response', Object)
call_user_func(Array, Object, 'kernel.response', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.response') (Line: 202)
Symfony\Component\HttpKernel\HttpKernel->filterResponse(Object, Object, 1) (Line: 190)
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('taxonomy_term_access') (Line: 145)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 228)
Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid->valueForm(Array, Object) (Line: 941)
Drupal\views\Plugin\views\filter\FilterPluginBase->buildExposedForm(Array, Object) (Line: 111)
Drupal\views\Form\ViewsExposedForm->buildForm(Array, Object)
call_user_func_array(Array, Array) (Line: 534)
Drupal\Core\Form\FormBuilder->retrieveForm('views_exposed_form', Object) (Line: 281)
Drupal\Core\Form\FormBuilder->buildForm('\Drupal\views\Form\ViewsExposedForm', Object) (Line: 134)
Drupal\views\Plugin\views\exposed_form\ExposedFormPluginBase->renderExposedForm(1) (Line: 2638)
Drupal\views\Plugin\views\display\DisplayPluginBase->viewExposedFormBlocks() (Line: 35)
Drupal\views\Plugin\Block\ViewsExposedFilterBlock->build() (Line: 171)
Drupal\block\BlockViewBuilder::preRender(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, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 160)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 159)
Drupal\Core\Render\Renderer->renderPlain(Array) (Line: 175)
Drupal\Core\Render\Renderer->renderPlaceholder('', Array) (Line: 665)
Drupal\Core\Render\Renderer->replacePlaceholders(Array) (Line: 550)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 148)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 147)
Drupal\Core\Render\Renderer->renderRoot(Array) (Line: 279)
Drupal\Core\Render\HtmlResponseAttachmentsProcessor->renderPlaceholders(Object) (Line: 71)
Drupal\big_pipe\Render\BigPipeResponseAttachmentsProcessor->processAttachments(Object) (Line: 45)
Drupal\Core\EventSubscriber\HtmlResponseSubscriber->onRespond(Object, 'kernel.response', Object)
call_user_func(Array, Object, 'kernel.response', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.response') (Line: 202)
Symfony\Component\HttpKernel\HttpKernel->filterResponse(Object, Object, 1) (Line: 190)
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)