- 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\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: 54)
Drupal\views\Plugin\views\argument\ManyToOne->defineOptions() (Line: 141)
Drupal\views\Plugin\views\PluginBase->init(Object, Object, Array) (Line: 104)
Drupal\views\Plugin\views\HandlerBase->init(Object, Object, Array) (Line: 82)
Drupal\views\Plugin\views\argument\ArgumentPluginBase->init(Object, Object, Array) (Line: 33)
Drupal\views\Plugin\views\argument\ManyToOne->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('argument') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('argument', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 2318)
Drupal\views\Plugin\views\display\DisplayPluginBase->preExecute() (Line: 1697)
Drupal\views\ViewExecutable->preExecute(Array) (Line: 1632)
Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\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: 54)
Drupal\views\Plugin\views\argument\ManyToOne->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: 82)
Drupal\views\Plugin\views\argument\ArgumentPluginBase->init(Object, Object, Array) (Line: 33)
Drupal\views\Plugin\views\argument\ManyToOne->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('argument') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('argument', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 2318)
Drupal\views\Plugin\views\display\DisplayPluginBase->preExecute() (Line: 1697)
Drupal\views\ViewExecutable->preExecute(Array) (Line: 1632)
Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\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: 54)
Drupal\views\Plugin\views\argument\ManyToOne->defineOptions() (Line: 228)
Drupal\views\Plugin\views\PluginBase->unpackOptions(Array, Array) (Line: 110)
Drupal\views\Plugin\views\HandlerBase->init(Object, Object, Array) (Line: 82)
Drupal\views\Plugin\views\argument\ArgumentPluginBase->init(Object, Object, Array) (Line: 33)
Drupal\views\Plugin\views\argument\ManyToOne->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('argument') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('argument', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 2318)
Drupal\views\Plugin\views\display\DisplayPluginBase->preExecute() (Line: 1697)
Drupal\views\ViewExecutable->preExecute(Array) (Line: 1632)
Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\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: 35)
Drupal\views\Plugin\views\argument\ManyToOne->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('argument') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('argument', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 2318)
Drupal\views\Plugin\views\display\DisplayPluginBase->preExecute() (Line: 1697)
Drupal\views\ViewExecutable->preExecute(Array) (Line: 1632)
Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('views') (Line: 1316)
Drupal\views\Plugin\views\query\Sql->query() (Line: 1454)
Drupal\views\Plugin\views\query\Sql->build(Object) (Line: 1326)
Drupal\views\ViewExecutable->build() (Line: 392)
Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('views_substitutions', Array) (Line: 1418)
Drupal\views\Plugin\views\query\Sql->query() (Line: 1454)
Drupal\views\Plugin\views\query\Sql->build(Object) (Line: 1326)
Drupal\views\ViewExecutable->build() (Line: 392)
Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('views') (Line: 1316)
Drupal\views\Plugin\views\query\Sql->query(1) (Line: 1455)
Drupal\views\Plugin\views\query\Sql->build(Object) (Line: 1326)
Drupal\views\ViewExecutable->build() (Line: 392)
Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('views_substitutions', Array) (Line: 1418)
Drupal\views\Plugin\views\query\Sql->query(1) (Line: 1455)
Drupal\views\Plugin\views\query\Sql->build(Object) (Line: 1326)
Drupal\views\ViewExecutable->build() (Line: 392)
Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\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: 54)
Drupal\views\Plugin\views\argument\ManyToOne->defineOptions() (Line: 141)
Drupal\views\Plugin\views\PluginBase->init(Object, Object, Array) (Line: 104)
Drupal\views\Plugin\views\HandlerBase->init(Object, Object, Array) (Line: 82)
Drupal\views\Plugin\views\argument\ArgumentPluginBase->init(Object, Object, Array) (Line: 33)
Drupal\views\Plugin\views\argument\ManyToOne->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('argument') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('argument', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 1876)
Drupal\views\ViewExecutable->buildTitle() (Line: 338)
Drupal\views\Plugin\views\display\Feed->attachTo(Object, 'page_1', Array) (Line: 1733)
Drupal\views\ViewExecutable->attachDisplays() (Line: 1333)
Drupal\views\ViewExecutable->build() (Line: 392)
Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\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: 54)
Drupal\views\Plugin\views\argument\ManyToOne->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: 82)
Drupal\views\Plugin\views\argument\ArgumentPluginBase->init(Object, Object, Array) (Line: 33)
Drupal\views\Plugin\views\argument\ManyToOne->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('argument') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('argument', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 1876)
Drupal\views\ViewExecutable->buildTitle() (Line: 338)
Drupal\views\Plugin\views\display\Feed->attachTo(Object, 'page_1', Array) (Line: 1733)
Drupal\views\ViewExecutable->attachDisplays() (Line: 1333)
Drupal\views\ViewExecutable->build() (Line: 392)
Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\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: 54)
Drupal\views\Plugin\views\argument\ManyToOne->defineOptions() (Line: 228)
Drupal\views\Plugin\views\PluginBase->unpackOptions(Array, Array) (Line: 110)
Drupal\views\Plugin\views\HandlerBase->init(Object, Object, Array) (Line: 82)
Drupal\views\Plugin\views\argument\ArgumentPluginBase->init(Object, Object, Array) (Line: 33)
Drupal\views\Plugin\views\argument\ManyToOne->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('argument') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('argument', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 1876)
Drupal\views\ViewExecutable->buildTitle() (Line: 338)
Drupal\views\Plugin\views\display\Feed->attachTo(Object, 'page_1', Array) (Line: 1733)
Drupal\views\ViewExecutable->attachDisplays() (Line: 1333)
Drupal\views\ViewExecutable->build() (Line: 392)
Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\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: 35)
Drupal\views\Plugin\views\argument\ManyToOne->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('argument') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('argument', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 1876)
Drupal\views\ViewExecutable->buildTitle() (Line: 338)
Drupal\views\Plugin\views\display\Feed->attachTo(Object, 'page_1', Array) (Line: 1733)
Drupal\views\ViewExecutable->attachDisplays() (Line: 1333)
Drupal\views\ViewExecutable->build() (Line: 392)
Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'b61fe087-d3d8-4380-91bb-c1f556178ac0') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla calendario en la que se incluyen campos para el año y el número de mes:
El objetivo es añadir una columna con el año fiscal y otra con el mes fiscal. Para esto vamos a suponer que el mes en el que termina el año fiscal es marzo (tercer mes del año), lo que podremos modificar en cada bloque de código fácilmente.
Para el cálculo del año fiscal vamos a comparar el mes incluido en cada fila con el mes en el que termina el año fiscal: si es superior, sumaremos 1 al valor del año:
FY =
VAR
UltimoMes = 3
RETURN
'Calendar'[Año] +
IF(
MONTH('Calendar'[Date]) > UltimoMes;
1;
0
)
En el código anterior definimos la variable "UltimoMes" con el valor correspondiente al último mes del año fiscal (3) usando la función <a href="/dax/function/var">VAR</a>, y devolvemos el valor del campo <em>Año</em> sumándole 1 o no en función de que el mes de la fecha sea o no superior al último mes del año fiscal. Para esto extraemos el mes de la fecha con la función <a href="/dax/function/month">MONTH</a> y realizamos la comparación con <a href="/dax/function/if">IF</a>. En la imagen anterior se muestran fechas de marzo y abril para ver el salto de un período al otro.
Un par de notas interesantes: Los nombres de las variables no pueden contener espacios, guiones, vocales acentuadas... de ahí el nombre de "UltimoMes". Y observa que es posible incrustar una función (IF, en este caso) donde se espera un valor númerico (siempre que la función devuelva un valor adecuado).
Para añadir el mes fiscal, podemos restar al mes de la fecha (que extraeremos con la función <a href="/dax/function/month">MONTH</a>) el último mes del año fiscal. Esto devolverá un número positivo para los meses posteriores a éste (abril = 1, mayo = 2...), pero un número negativo o cero para los anteriores (enero = -2, febrero = -1 y marzo = 0). Para solucionar esto podemos simplemente calcular el módulo de la resta y 12 usando la función <a href="/dax/function/mod">MOD</a> y sumando 1 al resultado (el módulo devolverá cero para marzo, por ejemplo):
FM =
VAR
UltimoMes = 3
RETURN
MOD(MONTH('Calendar'[Date]) - UltimoMes; 12) + 1
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', 'b61fe087-d3d8-4380-91bb-c1f556178ac0') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla calendario en la que se incluyen campos para el año y el número de mes:
El objetivo es añadir una columna con el año fiscal y otra con el mes fiscal. Para esto vamos a suponer que el mes en el que termina el año fiscal es marzo (tercer mes del año), lo que podremos modificar en cada bloque de código fácilmente.
Para el cálculo del año fiscal vamos a comparar el mes incluido en cada fila con el mes en el que termina el año fiscal: si es superior, sumaremos 1 al valor del año:
FY =
VAR
UltimoMes = 3
RETURN
'Calendar'[Año] +
IF(
MONTH('Calendar'[Date]) > UltimoMes;
1;
0
)
En el código anterior definimos la variable "UltimoMes" con el valor correspondiente al último mes del año fiscal (3) usando la función <a href="/dax/function/var">VAR</a>, y devolvemos el valor del campo <em>Año</em> sumándole 1 o no en función de que el mes de la fecha sea o no superior al último mes del año fiscal. Para esto extraemos el mes de la fecha con la función <a href="/dax/function/month">MONTH</a> y realizamos la comparación con <a href="/dax/function/if">IF</a>. En la imagen anterior se muestran fechas de marzo y abril para ver el salto de un período al otro.
Un par de notas interesantes: Los nombres de las variables no pueden contener espacios, guiones, vocales acentuadas... de ahí el nombre de "UltimoMes". Y observa que es posible incrustar una función (IF, en este caso) donde se espera un valor númerico (siempre que la función devuelva un valor adecuado).
Para añadir el mes fiscal, podemos restar al mes de la fecha (que extraeremos con la función <a href="/dax/function/month">MONTH</a>) el último mes del año fiscal. Esto devolverá un número positivo para los meses posteriores a éste (abril = 1, mayo = 2...), pero un número negativo o cero para los anteriores (enero = -2, febrero = -1 y marzo = 0). Para solucionar esto podemos simplemente calcular el módulo de la resta y 12 usando la función <a href="/dax/function/mod">MOD</a> y sumando 1 al resultado (el módulo devolverá cero para marzo, por ejemplo):
FM =
VAR
UltimoMes = 3
RETURN
MOD(MONTH('Calendar'[Date]) - UltimoMes; 12) + 1
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', 'b61fe087-d3d8-4380-91bb-c1f556178ac0') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla calendario en la que se incluyen campos para el año y el número de mes:
El objetivo es añadir una columna con el año fiscal y otra con el mes fiscal. Para esto vamos a suponer que el mes en el que termina el año fiscal es marzo (tercer mes del año), lo que podremos modificar en cada bloque de código fácilmente.
Para el cálculo del año fiscal vamos a comparar el mes incluido en cada fila con el mes en el que termina el año fiscal: si es superior, sumaremos 1 al valor del año:
FY =
VAR
UltimoMes = 3
RETURN
'Calendar'[Año] +
IF(
MONTH('Calendar'[Date]) > UltimoMes;
1;
0
)
En el código anterior definimos la variable "UltimoMes" con el valor correspondiente al último mes del año fiscal (3) usando la función <a href="/dax/function/var">VAR</a>, y devolvemos el valor del campo <em>Año</em> sumándole 1 o no en función de que el mes de la fecha sea o no superior al último mes del año fiscal. Para esto extraemos el mes de la fecha con la función <a href="/dax/function/month">MONTH</a> y realizamos la comparación con <a href="/dax/function/if">IF</a>. En la imagen anterior se muestran fechas de marzo y abril para ver el salto de un período al otro.
Un par de notas interesantes: Los nombres de las variables no pueden contener espacios, guiones, vocales acentuadas... de ahí el nombre de "UltimoMes". Y observa que es posible incrustar una función (IF, en este caso) donde se espera un valor númerico (siempre que la función devuelva un valor adecuado).
Para añadir el mes fiscal, podemos restar al mes de la fecha (que extraeremos con la función <a href="/dax/function/month">MONTH</a>) el último mes del año fiscal. Esto devolverá un número positivo para los meses posteriores a éste (abril = 1, mayo = 2...), pero un número negativo o cero para los anteriores (enero = -2, febrero = -1 y marzo = 0). Para solucionar esto podemos simplemente calcular el módulo de la resta y 12 usando la función <a href="/dax/function/mod">MOD</a> y sumando 1 al resultado (el módulo devolverá cero para marzo, por ejemplo):
FM =
VAR
UltimoMes = 3
RETURN
MOD(MONTH('Calendar'[Date]) - UltimoMes; 12) + 1
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', 'b61fe087-d3d8-4380-91bb-c1f556178ac0') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla calendario en la que se incluyen campos para el año y el número de mes:
El objetivo es añadir una columna con el año fiscal y otra con el mes fiscal. Para esto vamos a suponer que el mes en el que termina el año fiscal es marzo (tercer mes del año), lo que podremos modificar en cada bloque de código fácilmente.
Para el cálculo del año fiscal vamos a comparar el mes incluido en cada fila con el mes en el que termina el año fiscal: si es superior, sumaremos 1 al valor del año:
FY =
VAR
UltimoMes = 3
RETURN
'Calendar'[Año] +
IF(
MONTH('Calendar'[Date]) > UltimoMes;
1;
0
)
En el código anterior definimos la variable "UltimoMes" con el valor correspondiente al último mes del año fiscal (3) usando la función <a href="/dax/function/var">VAR</a>, y devolvemos el valor del campo <em>Año</em> sumándole 1 o no en función de que el mes de la fecha sea o no superior al último mes del año fiscal. Para esto extraemos el mes de la fecha con la función <a href="/dax/function/month">MONTH</a> y realizamos la comparación con <a href="/dax/function/if">IF</a>. En la imagen anterior se muestran fechas de marzo y abril para ver el salto de un período al otro.
Un par de notas interesantes: Los nombres de las variables no pueden contener espacios, guiones, vocales acentuadas... de ahí el nombre de "UltimoMes". Y observa que es posible incrustar una función (IF, en este caso) donde se espera un valor númerico (siempre que la función devuelva un valor adecuado).
Para añadir el mes fiscal, podemos restar al mes de la fecha (que extraeremos con la función <a href="/dax/function/month">MONTH</a>) el último mes del año fiscal. Esto devolverá un número positivo para los meses posteriores a éste (abril = 1, mayo = 2...), pero un número negativo o cero para los anteriores (enero = -2, febrero = -1 y marzo = 0). Para solucionar esto podemos simplemente calcular el módulo de la resta y 12 usando la función <a href="/dax/function/mod">MOD</a> y sumando 1 al resultado (el módulo devolverá cero para marzo, por ejemplo):
FM =
VAR
UltimoMes = 3
RETURN
MOD(MONTH('Calendar'[Date]) - UltimoMes; 12) + 1
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', '91048b56-9864-408e-b66b-e30f09799deb') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla calendario en la que se incluyen campos para el año y el número de mes:
El objetivo es añadir una columna con el año fiscal y otra con el mes fiscal. Para esto vamos a suponer que el mes en el que termina el año fiscal es marzo (tercer mes del año), lo que podremos modificar en cada bloque de código fácilmente.
Para el cálculo del año fiscal vamos a comparar el mes incluido en cada fila con el mes en el que termina el año fiscal: si es superior, sumaremos 1 al valor del año:
FY =
VAR
UltimoMes = 3
RETURN
'Calendar'[Año] +
IF(
MONTH('Calendar'[Date]) > UltimoMes;
1;
0
)
En el código anterior definimos la variable "UltimoMes" con el valor correspondiente al último mes del año fiscal (3) usando la función <a href="/dax/function/var">VAR</a>, y devolvemos el valor del campo <em>Año</em> sumándole 1 o no en función de que el mes de la fecha sea o no superior al último mes del año fiscal. Para esto extraemos el mes de la fecha con la función <a href="/dax/function/month">MONTH</a> y realizamos la comparación con <a href="/dax/function/if">IF</a>. En la imagen anterior se muestran fechas de marzo y abril para ver el salto de un período al otro.
Un par de notas interesantes: Los nombres de las variables no pueden contener espacios, guiones, vocales acentuadas... de ahí el nombre de "UltimoMes". Y observa que es posible incrustar una función (IF, en este caso) donde se espera un valor númerico (siempre que la función devuelva un valor adecuado).
Para añadir el mes fiscal, podemos restar al mes de la fecha (que extraeremos con la función <a href="/dax/function/month">MONTH</a>) el último mes del año fiscal. Esto devolverá un número positivo para los meses posteriores a éste (abril = 1, mayo = 2...), pero un número negativo o cero para los anteriores (enero = -2, febrero = -1 y marzo = 0). Para solucionar esto podemos simplemente calcular el módulo de la resta y 12 usando la función <a href="/dax/function/mod">MOD</a> y sumando 1 al resultado (el módulo devolverá cero para marzo, por ejemplo):
FM =
VAR
UltimoMes = 3
RETURN
MOD(MONTH('Calendar'[Date]) - UltimoMes; 12) + 1
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', '91048b56-9864-408e-b66b-e30f09799deb') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla calendario en la que se incluyen campos para el año y el número de mes:
El objetivo es añadir una columna con el año fiscal y otra con el mes fiscal. Para esto vamos a suponer que el mes en el que termina el año fiscal es marzo (tercer mes del año), lo que podremos modificar en cada bloque de código fácilmente.
Para el cálculo del año fiscal vamos a comparar el mes incluido en cada fila con el mes en el que termina el año fiscal: si es superior, sumaremos 1 al valor del año:
FY =
VAR
UltimoMes = 3
RETURN
'Calendar'[Año] +
IF(
MONTH('Calendar'[Date]) > UltimoMes;
1;
0
)
En el código anterior definimos la variable "UltimoMes" con el valor correspondiente al último mes del año fiscal (3) usando la función <a href="/dax/function/var">VAR</a>, y devolvemos el valor del campo <em>Año</em> sumándole 1 o no en función de que el mes de la fecha sea o no superior al último mes del año fiscal. Para esto extraemos el mes de la fecha con la función <a href="/dax/function/month">MONTH</a> y realizamos la comparación con <a href="/dax/function/if">IF</a>. En la imagen anterior se muestran fechas de marzo y abril para ver el salto de un período al otro.
Un par de notas interesantes: Los nombres de las variables no pueden contener espacios, guiones, vocales acentuadas... de ahí el nombre de "UltimoMes". Y observa que es posible incrustar una función (IF, en este caso) donde se espera un valor númerico (siempre que la función devuelva un valor adecuado).
Para añadir el mes fiscal, podemos restar al mes de la fecha (que extraeremos con la función <a href="/dax/function/month">MONTH</a>) el último mes del año fiscal. Esto devolverá un número positivo para los meses posteriores a éste (abril = 1, mayo = 2...), pero un número negativo o cero para los anteriores (enero = -2, febrero = -1 y marzo = 0). Para solucionar esto podemos simplemente calcular el módulo de la resta y 12 usando la función <a href="/dax/function/mod">MOD</a> y sumando 1 al resultado (el módulo devolverá cero para marzo, por ejemplo):
FM =
VAR
UltimoMes = 3
RETURN
MOD(MONTH('Calendar'[Date]) - UltimoMes; 12) + 1
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', '91048b56-9864-408e-b66b-e30f09799deb') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla calendario en la que se incluyen campos para el año y el número de mes:
El objetivo es añadir una columna con el año fiscal y otra con el mes fiscal. Para esto vamos a suponer que el mes en el que termina el año fiscal es marzo (tercer mes del año), lo que podremos modificar en cada bloque de código fácilmente.
Para el cálculo del año fiscal vamos a comparar el mes incluido en cada fila con el mes en el que termina el año fiscal: si es superior, sumaremos 1 al valor del año:
FY =
VAR
UltimoMes = 3
RETURN
'Calendar'[Año] +
IF(
MONTH('Calendar'[Date]) > UltimoMes;
1;
0
)
En el código anterior definimos la variable "UltimoMes" con el valor correspondiente al último mes del año fiscal (3) usando la función <a href="/dax/function/var">VAR</a>, y devolvemos el valor del campo <em>Año</em> sumándole 1 o no en función de que el mes de la fecha sea o no superior al último mes del año fiscal. Para esto extraemos el mes de la fecha con la función <a href="/dax/function/month">MONTH</a> y realizamos la comparación con <a href="/dax/function/if">IF</a>. En la imagen anterior se muestran fechas de marzo y abril para ver el salto de un período al otro.
Un par de notas interesantes: Los nombres de las variables no pueden contener espacios, guiones, vocales acentuadas... de ahí el nombre de "UltimoMes". Y observa que es posible incrustar una función (IF, en este caso) donde se espera un valor númerico (siempre que la función devuelva un valor adecuado).
Para añadir el mes fiscal, podemos restar al mes de la fecha (que extraeremos con la función <a href="/dax/function/month">MONTH</a>) el último mes del año fiscal. Esto devolverá un número positivo para los meses posteriores a éste (abril = 1, mayo = 2...), pero un número negativo o cero para los anteriores (enero = -2, febrero = -1 y marzo = 0). Para solucionar esto podemos simplemente calcular el módulo de la resta y 12 usando la función <a href="/dax/function/mod">MOD</a> y sumando 1 al resultado (el módulo devolverá cero para marzo, por ejemplo):
FM =
VAR
UltimoMes = 3
RETURN
MOD(MONTH('Calendar'[Date]) - UltimoMes; 12) + 1
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', '91048b56-9864-408e-b66b-e30f09799deb') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla calendario en la que se incluyen campos para el año y el número de mes:
El objetivo es añadir una columna con el año fiscal y otra con el mes fiscal. Para esto vamos a suponer que el mes en el que termina el año fiscal es marzo (tercer mes del año), lo que podremos modificar en cada bloque de código fácilmente.
Para el cálculo del año fiscal vamos a comparar el mes incluido en cada fila con el mes en el que termina el año fiscal: si es superior, sumaremos 1 al valor del año:
FY =
VAR
UltimoMes = 3
RETURN
'Calendar'[Año] +
IF(
MONTH('Calendar'[Date]) > UltimoMes;
1;
0
)
En el código anterior definimos la variable "UltimoMes" con el valor correspondiente al último mes del año fiscal (3) usando la función <a href="/dax/function/var">VAR</a>, y devolvemos el valor del campo <em>Año</em> sumándole 1 o no en función de que el mes de la fecha sea o no superior al último mes del año fiscal. Para esto extraemos el mes de la fecha con la función <a href="/dax/function/month">MONTH</a> y realizamos la comparación con <a href="/dax/function/if">IF</a>. En la imagen anterior se muestran fechas de marzo y abril para ver el salto de un período al otro.
Un par de notas interesantes: Los nombres de las variables no pueden contener espacios, guiones, vocales acentuadas... de ahí el nombre de "UltimoMes". Y observa que es posible incrustar una función (IF, en este caso) donde se espera un valor númerico (siempre que la función devuelva un valor adecuado).
Para añadir el mes fiscal, podemos restar al mes de la fecha (que extraeremos con la función <a href="/dax/function/month">MONTH</a>) el último mes del año fiscal. Esto devolverá un número positivo para los meses posteriores a éste (abril = 1, mayo = 2...), pero un número negativo o cero para los anteriores (enero = -2, febrero = -1 y marzo = 0). Para solucionar esto podemos simplemente calcular el módulo de la resta y 12 usando la función <a href="/dax/function/mod">MOD</a> y sumando 1 al resultado (el módulo devolverá cero para marzo, por ejemplo):
FM =
VAR
UltimoMes = 3
RETURN
MOD(MONTH('Calendar'[Date]) - UltimoMes; 12) + 1
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', 'a3f6c097-0ac4-40e9-bade-3ad0519a03ea') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla calendario en la que se incluyen campos para el año y el número de mes:
El objetivo es añadir una columna con el año fiscal y otra con el mes fiscal. Para esto vamos a suponer que el mes en el que termina el año fiscal es marzo (tercer mes del año), lo que podremos modificar en cada bloque de código fácilmente.
Para el cálculo del año fiscal vamos a comparar el mes incluido en cada fila con el mes en el que termina el año fiscal: si es superior, sumaremos 1 al valor del año:
FY =
VAR
UltimoMes = 3
RETURN
'Calendar'[Año] +
IF(
MONTH('Calendar'[Date]) > UltimoMes;
1;
0
)
En el código anterior definimos la variable "UltimoMes" con el valor correspondiente al último mes del año fiscal (3) usando la función <a href="/dax/function/var">VAR</a>, y devolvemos el valor del campo <em>Año</em> sumándole 1 o no en función de que el mes de la fecha sea o no superior al último mes del año fiscal. Para esto extraemos el mes de la fecha con la función <a href="/dax/function/month">MONTH</a> y realizamos la comparación con <a href="/dax/function/if">IF</a>. En la imagen anterior se muestran fechas de marzo y abril para ver el salto de un período al otro.
Un par de notas interesantes: Los nombres de las variables no pueden contener espacios, guiones, vocales acentuadas... de ahí el nombre de "UltimoMes". Y observa que es posible incrustar una función (IF, en este caso) donde se espera un valor númerico (siempre que la función devuelva un valor adecuado).
Para añadir el mes fiscal, podemos restar al mes de la fecha (que extraeremos con la función <a href="/dax/function/month">MONTH</a>) el último mes del año fiscal. Esto devolverá un número positivo para los meses posteriores a éste (abril = 1, mayo = 2...), pero un número negativo o cero para los anteriores (enero = -2, febrero = -1 y marzo = 0). Para solucionar esto podemos simplemente calcular el módulo de la resta y 12 usando la función <a href="/dax/function/mod">MOD</a> y sumando 1 al resultado (el módulo devolverá cero para marzo, por ejemplo):
FM =
VAR
UltimoMes = 3
RETURN
MOD(MONTH('Calendar'[Date]) - UltimoMes; 12) + 1
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', 'a3f6c097-0ac4-40e9-bade-3ad0519a03ea') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla calendario en la que se incluyen campos para el año y el número de mes:
El objetivo es añadir una columna con el año fiscal y otra con el mes fiscal. Para esto vamos a suponer que el mes en el que termina el año fiscal es marzo (tercer mes del año), lo que podremos modificar en cada bloque de código fácilmente.
Para el cálculo del año fiscal vamos a comparar el mes incluido en cada fila con el mes en el que termina el año fiscal: si es superior, sumaremos 1 al valor del año:
FY =
VAR
UltimoMes = 3
RETURN
'Calendar'[Año] +
IF(
MONTH('Calendar'[Date]) > UltimoMes;
1;
0
)
En el código anterior definimos la variable "UltimoMes" con el valor correspondiente al último mes del año fiscal (3) usando la función <a href="/dax/function/var">VAR</a>, y devolvemos el valor del campo <em>Año</em> sumándole 1 o no en función de que el mes de la fecha sea o no superior al último mes del año fiscal. Para esto extraemos el mes de la fecha con la función <a href="/dax/function/month">MONTH</a> y realizamos la comparación con <a href="/dax/function/if">IF</a>. En la imagen anterior se muestran fechas de marzo y abril para ver el salto de un período al otro.
Un par de notas interesantes: Los nombres de las variables no pueden contener espacios, guiones, vocales acentuadas... de ahí el nombre de "UltimoMes". Y observa que es posible incrustar una función (IF, en este caso) donde se espera un valor númerico (siempre que la función devuelva un valor adecuado).
Para añadir el mes fiscal, podemos restar al mes de la fecha (que extraeremos con la función <a href="/dax/function/month">MONTH</a>) el último mes del año fiscal. Esto devolverá un número positivo para los meses posteriores a éste (abril = 1, mayo = 2...), pero un número negativo o cero para los anteriores (enero = -2, febrero = -1 y marzo = 0). Para solucionar esto podemos simplemente calcular el módulo de la resta y 12 usando la función <a href="/dax/function/mod">MOD</a> y sumando 1 al resultado (el módulo devolverá cero para marzo, por ejemplo):
FM =
VAR
UltimoMes = 3
RETURN
MOD(MONTH('Calendar'[Date]) - UltimoMes; 12) + 1
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', 'a3f6c097-0ac4-40e9-bade-3ad0519a03ea') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla calendario en la que se incluyen campos para el año y el número de mes:
El objetivo es añadir una columna con el año fiscal y otra con el mes fiscal. Para esto vamos a suponer que el mes en el que termina el año fiscal es marzo (tercer mes del año), lo que podremos modificar en cada bloque de código fácilmente.
Para el cálculo del año fiscal vamos a comparar el mes incluido en cada fila con el mes en el que termina el año fiscal: si es superior, sumaremos 1 al valor del año:
FY =
VAR
UltimoMes = 3
RETURN
'Calendar'[Año] +
IF(
MONTH('Calendar'[Date]) > UltimoMes;
1;
0
)
En el código anterior definimos la variable "UltimoMes" con el valor correspondiente al último mes del año fiscal (3) usando la función <a href="/dax/function/var">VAR</a>, y devolvemos el valor del campo <em>Año</em> sumándole 1 o no en función de que el mes de la fecha sea o no superior al último mes del año fiscal. Para esto extraemos el mes de la fecha con la función <a href="/dax/function/month">MONTH</a> y realizamos la comparación con <a href="/dax/function/if">IF</a>. En la imagen anterior se muestran fechas de marzo y abril para ver el salto de un período al otro.
Un par de notas interesantes: Los nombres de las variables no pueden contener espacios, guiones, vocales acentuadas... de ahí el nombre de "UltimoMes". Y observa que es posible incrustar una función (IF, en este caso) donde se espera un valor númerico (siempre que la función devuelva un valor adecuado).
Para añadir el mes fiscal, podemos restar al mes de la fecha (que extraeremos con la función <a href="/dax/function/month">MONTH</a>) el último mes del año fiscal. Esto devolverá un número positivo para los meses posteriores a éste (abril = 1, mayo = 2...), pero un número negativo o cero para los anteriores (enero = -2, febrero = -1 y marzo = 0). Para solucionar esto podemos simplemente calcular el módulo de la resta y 12 usando la función <a href="/dax/function/mod">MOD</a> y sumando 1 al resultado (el módulo devolverá cero para marzo, por ejemplo):
FM =
VAR
UltimoMes = 3
RETURN
MOD(MONTH('Calendar'[Date]) - UltimoMes; 12) + 1
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', 'a3f6c097-0ac4-40e9-bade-3ad0519a03ea') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla calendario en la que se incluyen campos para el año y el número de mes:
El objetivo es añadir una columna con el año fiscal y otra con el mes fiscal. Para esto vamos a suponer que el mes en el que termina el año fiscal es marzo (tercer mes del año), lo que podremos modificar en cada bloque de código fácilmente.
Para el cálculo del año fiscal vamos a comparar el mes incluido en cada fila con el mes en el que termina el año fiscal: si es superior, sumaremos 1 al valor del año:
FY =
VAR
UltimoMes = 3
RETURN
'Calendar'[Año] +
IF(
MONTH('Calendar'[Date]) > UltimoMes;
1;
0
)
En el código anterior definimos la variable "UltimoMes" con el valor correspondiente al último mes del año fiscal (3) usando la función <a href="/dax/function/var">VAR</a>, y devolvemos el valor del campo <em>Año</em> sumándole 1 o no en función de que el mes de la fecha sea o no superior al último mes del año fiscal. Para esto extraemos el mes de la fecha con la función <a href="/dax/function/month">MONTH</a> y realizamos la comparación con <a href="/dax/function/if">IF</a>. En la imagen anterior se muestran fechas de marzo y abril para ver el salto de un período al otro.
Un par de notas interesantes: Los nombres de las variables no pueden contener espacios, guiones, vocales acentuadas... de ahí el nombre de "UltimoMes". Y observa que es posible incrustar una función (IF, en este caso) donde se espera un valor númerico (siempre que la función devuelva un valor adecuado).
Para añadir el mes fiscal, podemos restar al mes de la fecha (que extraeremos con la función <a href="/dax/function/month">MONTH</a>) el último mes del año fiscal. Esto devolverá un número positivo para los meses posteriores a éste (abril = 1, mayo = 2...), pero un número negativo o cero para los anteriores (enero = -2, febrero = -1 y marzo = 0). Para solucionar esto podemos simplemente calcular el módulo de la resta y 12 usando la función <a href="/dax/function/mod">MOD</a> y sumando 1 al resultado (el módulo devolverá cero para marzo, por ejemplo):
FM =
VAR
UltimoMes = 3
RETURN
MOD(MONTH('Calendar'[Date]) - UltimoMes; 12) + 1
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', '96494bcb-fe75-421b-8f87-db56ee6f1d2b') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', '96494bcb-fe75-421b-8f87-db56ee6f1d2b') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', '96494bcb-fe75-421b-8f87-db56ee6f1d2b') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', '96494bcb-fe75-421b-8f87-db56ee6f1d2b') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', 'df216c47-c8c0-41eb-ab0a-991917599a9d') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', 'df216c47-c8c0-41eb-ab0a-991917599a9d') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', 'df216c47-c8c0-41eb-ab0a-991917599a9d') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', 'df216c47-c8c0-41eb-ab0a-991917599a9d') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', '3acd4fe9-c39b-4752-8526-ede313a7b2a0') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', '3acd4fe9-c39b-4752-8526-ede313a7b2a0') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', '3acd4fe9-c39b-4752-8526-ede313a7b2a0') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', '3acd4fe9-c39b-4752-8526-ede313a7b2a0') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', '7b547472-d0c6-41d8-8711-3a5192760aee') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', '7b547472-d0c6-41d8-8711-3a5192760aee') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', '7b547472-d0c6-41d8-8711-3a5192760aee') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', '7b547472-d0c6-41d8-8711-3a5192760aee') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', '390dbbbf-8984-403f-8733-8d3ee69b5dc7') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', '390dbbbf-8984-403f-8733-8d3ee69b5dc7') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', '390dbbbf-8984-403f-8733-8d3ee69b5dc7') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', '390dbbbf-8984-403f-8733-8d3ee69b5dc7') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', '79fc6517-49bf-471c-b440-a221ce20a369') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', '79fc6517-49bf-471c-b440-a221ce20a369') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', '79fc6517-49bf-471c-b440-a221ce20a369') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', '79fc6517-49bf-471c-b440-a221ce20a369') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', 'ed2d8e78-9985-4165-8118-f0824d06bd9b') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', 'ed2d8e78-9985-4165-8118-f0824d06bd9b') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', 'ed2d8e78-9985-4165-8118-f0824d06bd9b') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', 'ed2d8e78-9985-4165-8118-f0824d06bd9b') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', 'd918aa2a-faf7-41b9-9eab-c48896db8378') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', 'd918aa2a-faf7-41b9-9eab-c48896db8378') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', 'd918aa2a-faf7-41b9-9eab-c48896db8378') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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', 'd918aa2a-faf7-41b9-9eab-c48896db8378') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:
El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).
La resolución de este escenario incluye dos pasos:
1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:
2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.
1er paso
Para crear esta tabla intermedia podemos recurrir tanto a la función <a href="/dax/function/summarize">SUMMARIZE</a> como a <a href="/dax/function/summarizecolumns">SUMMARIZECOLUMNS</a> o <a href="/dax/function/groupby">GROUPBY</a>. Veamos los tres casos:
SUMMARIZE
El código sería el siguiente:
Max value per category summarize =
SUMMARIZE(
Data;
Data[Category];
"Max value"; MAX(Data[Value])
)
Básicamente estaríamos agregando el campo <em>Category</em> de la tabla <em>Data</em> para crear el campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> con la función <a href="/dax/function/max">MAX</a> una vez filtrado:
SUMMARIZECOLUMNS
En este segundo caso el código sería el siguiente:
Max value per category summarizecolumns =
SUMMARIZECOLUMNS(
Data[Category];
"Max value";
MAX(Data[Value])
)
Estamos agregando el campo <em>Data[Category]</em> y creando el nuevo campo <em>"Max value"</em> calculando el valor máximo del campo <em>Data[Value]</em> una vez filtrado, también con la función <a href="/dax/function/max">MAX</a>.
GROUPBY
Por último, utilizando la función <em>GROUPBY </em>el código quedaría de la siguiente forma:
Max value per category groupby =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
En este caso estamos agrupando la tabla <em>Data</em> según la columna <em>Data[Category]</em> y generando la columna "<em>Max value</em>" utilizando la función iterativa <a href="/dax/function/maxx">MAXX</a>.
2º paso
Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función <em>GROUPBY</em>), tendremos que volver a agregar la tabla sumando los valores de la columna <em>"Max value"</em>. En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:
SUMMARIZE
El código para esta primera función sería el siguiente:
Sum of max value per category =
SUMMARIZE(
'Max value per category groupby';
"Max"; SUM('Max value per category groupby'[Max value])
)
Es decir, estaríamos agregando la tabla intermedia creada, <em>Max value per category groupby</em>, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, <em>Max</em>, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:
Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.
Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")
SUMMARIZECOLUMNS
Con esta función, el código sería el siguiente:
Sum of max value per category =
SUMMARIZECOLUMNS(
"Max"; SUM('Max value per category groupby'[Max value])
)
Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo <em>Max</em> como la suma del campo <em>Max value</em> de la tabla intermedia. El resultado es el siguiente:
Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.
GROUPBY
En este último caso, el código sería el siguiente:
Sum of max value per category =
VAR Max_value_per_category =
GROUPBY(
Data;
Data[Category];
"Max value"; MAXX(CURRENTGROUP(); Data[Value])
)
RETURN
GROUPBY(
Max_value_per_category;
"Sum"; SUMX(CURRENTGROUP(); [Max value])
)
Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores <em>Max value</em> de forma iterativa. El resultado es el siguiente:
En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.
', '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: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->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/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', 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: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->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/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', 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: 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)