- Deprecated function: Use of "static" in callables is deprecated in Drupal\user\Entity\Role::postLoad() (line 172 of core/modules/user/src/Entity/Role.php).
Drupal\user\Entity\Role::postLoad(Object, Array) (Line: 423)
Drupal\Core\Entity\EntityStorageBase->postLoad(Array) (Line: 353)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 16)
Drupal\user\RoleStorage->isPermissionInRoles('access site in maintenance mode', Array) (Line: 112)
Drupal\Core\Session\UserSession->hasPermission('access site in maintenance mode') (Line: 105)
Drupal\Core\Session\AccountProxy->hasPermission('access site in maintenance mode') (Line: 83)
Drupal\redirect\RedirectChecker->canRedirect(Object) (Line: 120)
Drupal\redirect\EventSubscriber\RedirectRequestSubscriber->onKernelRequestCheckRedirect(Object, 'kernel.request', Object)
call_user_func(Array, Object, 'kernel.request', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.request') (Line: 145)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-5b8ca6ac-d74d-4b13-8154-cb45e47c31ad') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-5b8ca6ac-d74d-4b13-8154-cb45e47c31ad') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-5b8ca6ac-d74d-4b13-8154-cb45e47c31ad') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-5b8ca6ac-d74d-4b13-8154-cb45e47c31ad') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-1b15988d-8b6e-469f-badf-b7935b16550d') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-1b15988d-8b6e-469f-badf-b7935b16550d') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-1b15988d-8b6e-469f-badf-b7935b16550d') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-1b15988d-8b6e-469f-badf-b7935b16550d') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-833f2762-8cf8-4c06-a994-2a7289230eb8') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-833f2762-8cf8-4c06-a994-2a7289230eb8') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-833f2762-8cf8-4c06-a994-2a7289230eb8') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-833f2762-8cf8-4c06-a994-2a7289230eb8') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-4383749d-05ec-4f1e-80e2-0f08262e4e2f') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-4383749d-05ec-4f1e-80e2-0f08262e4e2f') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-4383749d-05ec-4f1e-80e2-0f08262e4e2f') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-4383749d-05ec-4f1e-80e2-0f08262e4e2f') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-409ffccc-5b28-4bad-a212-3f1ec091057c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-409ffccc-5b28-4bad-a212-3f1ec091057c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-409ffccc-5b28-4bad-a212-3f1ec091057c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-409ffccc-5b28-4bad-a212-3f1ec091057c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-0aae3884-2e7c-44a3-a6d8-ed33f734263a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-0aae3884-2e7c-44a3-a6d8-ed33f734263a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-0aae3884-2e7c-44a3-a6d8-ed33f734263a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-0aae3884-2e7c-44a3-a6d8-ed33f734263a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-eb9fe5c2-4266-422c-a208-b7265150d730') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-eb9fe5c2-4266-422c-a208-b7265150d730') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-eb9fe5c2-4266-422c-a208-b7265150d730') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-eb9fe5c2-4266-422c-a208-b7265150d730') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-9b66d42c-34ff-4eda-997a-1dcb59e00f18') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-9b66d42c-34ff-4eda-997a-1dcb59e00f18') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-9b66d42c-34ff-4eda-997a-1dcb59e00f18') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-9b66d42c-34ff-4eda-997a-1dcb59e00f18') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-333aaa03-824d-4ece-85d0-c7f40c2e4e4f') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-333aaa03-824d-4ece-85d0-c7f40c2e4e4f') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-333aaa03-824d-4ece-85d0-c7f40c2e4e4f') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-333aaa03-824d-4ece-85d0-c7f40c2e4e4f') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-64447f03-8bed-4202-bc70-bf86ca81bcd9') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-64447f03-8bed-4202-bc70-bf86ca81bcd9') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-64447f03-8bed-4202-bc70-bf86ca81bcd9') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-64447f03-8bed-4202-bc70-bf86ca81bcd9') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Return type of Drupal\google_analytics\Component\Render\GoogleAnalyticsJavaScriptSnippet::jsonSerialize() should either be compatible with JsonSerializable::jsonSerialize(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in include() (line 10 of modules/contrib/google_analytics/src/Component/Render/GoogleAnalyticsJavaScriptSnippet.php).
include('/var/www/vhosts/interactivechaos.ovh/httpdocs/modules/contrib/google_analytics/src/Component/Render/GoogleAnalyticsJavaScriptSnippet.php') (Line: 578)
Composer\Autoload\ClassLoader::Composer\Autoload\{closure}('/var/www/vhosts/interactivechaos.ovh/httpdocs/modules/contrib/google_analytics/src/Component/Render/GoogleAnalyticsJavaScriptSnippet.php') (Line: 432)
Composer\Autoload\ClassLoader->loadClass('Drupal\google_analytics\Component\Render\GoogleAnalyticsJavaScriptSnippet') (Line: 372)
google_analytics_page_attachments(Array) (Line: 313)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}(Object, 'google_analytics') (Line: 405)
Drupal\Core\Extension\ModuleHandler->invokeAllWith('page_attachments', Object) (Line: 310)
Drupal\Core\Render\MainContent\HtmlRenderer->invokePageAttachmentHooks(Array) (Line: 288)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Use of "static" in callables is deprecated in Drupal\user\Entity\Role::postLoad() (line 172 of core/modules/user/src/Entity/Role.php).
Drupal\user\Entity\Role::postLoad(Object, Array) (Line: 423)
Drupal\Core\Entity\EntityStorageBase->postLoad(Array) (Line: 353)
Drupal\Core\Entity\EntityStorageBase->loadMultiple() (Line: 126)
eu_cookie_compliance_page_attachments(Array) (Line: 313)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}(Object, 'eu_cookie_compliance') (Line: 405)
Drupal\Core\Extension\ModuleHandler->invokeAllWith('page_attachments', Object) (Line: 310)
Drupal\Core\Render\MainContent\HtmlRenderer->invokePageAttachmentHooks(Array) (Line: 288)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\views\ManyToOneHelper::$handler is deprecated in Drupal\views\ManyToOneHelper->__construct() (line 24 of core/modules/views/src/ManyToOneHelper.php).
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 51)
Drupal\views\Plugin\views\filter\ManyToOne->defineOptions() (Line: 117)
Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid->defineOptions() (Line: 141)
Drupal\views\Plugin\views\PluginBase->init(Object, Object, Array) (Line: 104)
Drupal\views\Plugin\views\HandlerBase->init(Object, Object, Array) (Line: 95)
Drupal\views\Plugin\views\filter\FilterPluginBase->init(Object, Object, Array) (Line: 44)
Drupal\views\Plugin\views\filter\InOperator->init(Object, Object, Array) (Line: 36)
Drupal\views\Plugin\views\filter\ManyToOne->init(Object, Object, Array) (Line: 98)
Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('filter') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('filter', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 2633)
Drupal\views\Plugin\views\display\DisplayPluginBase->viewExposedFormBlocks() (Line: 35)
Drupal\views\Plugin\Block\ViewsExposedFilterBlock->build() (Line: 171)
Drupal\block\BlockViewBuilder::preRender(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 160)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 159)
Drupal\Core\Render\Renderer->renderPlain(Array) (Line: 175)
Drupal\Core\Render\Renderer->renderPlaceholder('', Array) (Line: 665)
Drupal\Core\Render\Renderer->replacePlaceholders(Array) (Line: 550)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 148)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 147)
Drupal\Core\Render\Renderer->renderRoot(Array) (Line: 279)
Drupal\Core\Render\HtmlResponseAttachmentsProcessor->renderPlaceholders(Object) (Line: 71)
Drupal\big_pipe\Render\BigPipeResponseAttachmentsProcessor->processAttachments(Object) (Line: 45)
Drupal\Core\EventSubscriber\HtmlResponseSubscriber->onRespond(Object, 'kernel.response', Object)
call_user_func(Array, Object, 'kernel.response', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.response') (Line: 202)
Symfony\Component\HttpKernel\HttpKernel->filterResponse(Object, Object, 1) (Line: 190)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\views\ManyToOneHelper::$handler is deprecated in Drupal\views\ManyToOneHelper->__construct() (line 24 of core/modules/views/src/ManyToOneHelper.php).
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 51)
Drupal\views\Plugin\views\filter\ManyToOne->defineOptions() (Line: 117)
Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid->defineOptions() (Line: 228)
Drupal\views\Plugin\views\PluginBase->unpackOptions(Array, Array) (Line: 144)
Drupal\views\Plugin\views\PluginBase->init(Object, Object, Array) (Line: 104)
Drupal\views\Plugin\views\HandlerBase->init(Object, Object, Array) (Line: 95)
Drupal\views\Plugin\views\filter\FilterPluginBase->init(Object, Object, Array) (Line: 44)
Drupal\views\Plugin\views\filter\InOperator->init(Object, Object, Array) (Line: 36)
Drupal\views\Plugin\views\filter\ManyToOne->init(Object, Object, Array) (Line: 98)
Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('filter') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('filter', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 2633)
Drupal\views\Plugin\views\display\DisplayPluginBase->viewExposedFormBlocks() (Line: 35)
Drupal\views\Plugin\Block\ViewsExposedFilterBlock->build() (Line: 171)
Drupal\block\BlockViewBuilder::preRender(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 160)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 159)
Drupal\Core\Render\Renderer->renderPlain(Array) (Line: 175)
Drupal\Core\Render\Renderer->renderPlaceholder('', Array) (Line: 665)
Drupal\Core\Render\Renderer->replacePlaceholders(Array) (Line: 550)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 148)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 147)
Drupal\Core\Render\Renderer->renderRoot(Array) (Line: 279)
Drupal\Core\Render\HtmlResponseAttachmentsProcessor->renderPlaceholders(Object) (Line: 71)
Drupal\big_pipe\Render\BigPipeResponseAttachmentsProcessor->processAttachments(Object) (Line: 45)
Drupal\Core\EventSubscriber\HtmlResponseSubscriber->onRespond(Object, 'kernel.response', Object)
call_user_func(Array, Object, 'kernel.response', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.response') (Line: 202)
Symfony\Component\HttpKernel\HttpKernel->filterResponse(Object, Object, 1) (Line: 190)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\views\ManyToOneHelper::$handler is deprecated in Drupal\views\ManyToOneHelper->__construct() (line 24 of core/modules/views/src/ManyToOneHelper.php).
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 51)
Drupal\views\Plugin\views\filter\ManyToOne->defineOptions() (Line: 117)
Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid->defineOptions() (Line: 228)
Drupal\views\Plugin\views\PluginBase->unpackOptions(Array, Array) (Line: 110)
Drupal\views\Plugin\views\HandlerBase->init(Object, Object, Array) (Line: 95)
Drupal\views\Plugin\views\filter\FilterPluginBase->init(Object, Object, Array) (Line: 44)
Drupal\views\Plugin\views\filter\InOperator->init(Object, Object, Array) (Line: 36)
Drupal\views\Plugin\views\filter\ManyToOne->init(Object, Object, Array) (Line: 98)
Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('filter') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('filter', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 2633)
Drupal\views\Plugin\views\display\DisplayPluginBase->viewExposedFormBlocks() (Line: 35)
Drupal\views\Plugin\Block\ViewsExposedFilterBlock->build() (Line: 171)
Drupal\block\BlockViewBuilder::preRender(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 160)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 159)
Drupal\Core\Render\Renderer->renderPlain(Array) (Line: 175)
Drupal\Core\Render\Renderer->renderPlaceholder('', Array) (Line: 665)
Drupal\Core\Render\Renderer->replacePlaceholders(Array) (Line: 550)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 148)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 147)
Drupal\Core\Render\Renderer->renderRoot(Array) (Line: 279)
Drupal\Core\Render\HtmlResponseAttachmentsProcessor->renderPlaceholders(Object) (Line: 71)
Drupal\big_pipe\Render\BigPipeResponseAttachmentsProcessor->processAttachments(Object) (Line: 45)
Drupal\Core\EventSubscriber\HtmlResponseSubscriber->onRespond(Object, 'kernel.response', Object)
call_user_func(Array, Object, 'kernel.response', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.response') (Line: 202)
Symfony\Component\HttpKernel\HttpKernel->filterResponse(Object, Object, 1) (Line: 190)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\views\ManyToOneHelper::$handler is deprecated in Drupal\views\ManyToOneHelper->__construct() (line 24 of core/modules/views/src/ManyToOneHelper.php).
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 38)
Drupal\views\Plugin\views\filter\ManyToOne->init(Object, Object, Array) (Line: 98)
Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('filter') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('filter', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 2633)
Drupal\views\Plugin\views\display\DisplayPluginBase->viewExposedFormBlocks() (Line: 35)
Drupal\views\Plugin\Block\ViewsExposedFilterBlock->build() (Line: 171)
Drupal\block\BlockViewBuilder::preRender(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 160)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 159)
Drupal\Core\Render\Renderer->renderPlain(Array) (Line: 175)
Drupal\Core\Render\Renderer->renderPlaceholder('', Array) (Line: 665)
Drupal\Core\Render\Renderer->replacePlaceholders(Array) (Line: 550)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 148)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 147)
Drupal\Core\Render\Renderer->renderRoot(Array) (Line: 279)
Drupal\Core\Render\HtmlResponseAttachmentsProcessor->renderPlaceholders(Object) (Line: 71)
Drupal\big_pipe\Render\BigPipeResponseAttachmentsProcessor->processAttachments(Object) (Line: 45)
Drupal\Core\EventSubscriber\HtmlResponseSubscriber->onRespond(Object, 'kernel.response', Object)
call_user_func(Array, Object, 'kernel.response', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.response') (Line: 202)
Symfony\Component\HttpKernel\HttpKernel->filterResponse(Object, Object, 1) (Line: 190)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\views\ManyToOneHelper::$handler is deprecated in Drupal\views\ManyToOneHelper->__construct() (line 24 of core/modules/views/src/ManyToOneHelper.php).
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 51)
Drupal\views\Plugin\views\filter\ManyToOne->defineOptions() (Line: 117)
Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid->defineOptions() (Line: 141)
Drupal\views\Plugin\views\PluginBase->init(Object, Object, Array) (Line: 104)
Drupal\views\Plugin\views\HandlerBase->init(Object, Object, Array) (Line: 95)
Drupal\views\Plugin\views\filter\FilterPluginBase->init(Object, Object, Array) (Line: 44)
Drupal\views\Plugin\views\filter\InOperator->init(Object, Object, Array) (Line: 36)
Drupal\views\Plugin\views\filter\ManyToOne->init(Object, Object, Array) (Line: 98)
Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('filter') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('filter', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 2633)
Drupal\views\Plugin\views\display\DisplayPluginBase->viewExposedFormBlocks() (Line: 35)
Drupal\views\Plugin\Block\ViewsExposedFilterBlock->build() (Line: 171)
Drupal\block\BlockViewBuilder::preRender(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 160)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 159)
Drupal\Core\Render\Renderer->renderPlain(Array) (Line: 175)
Drupal\Core\Render\Renderer->renderPlaceholder('', Array) (Line: 665)
Drupal\Core\Render\Renderer->replacePlaceholders(Array) (Line: 550)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 148)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 147)
Drupal\Core\Render\Renderer->renderRoot(Array) (Line: 279)
Drupal\Core\Render\HtmlResponseAttachmentsProcessor->renderPlaceholders(Object) (Line: 71)
Drupal\big_pipe\Render\BigPipeResponseAttachmentsProcessor->processAttachments(Object) (Line: 45)
Drupal\Core\EventSubscriber\HtmlResponseSubscriber->onRespond(Object, 'kernel.response', Object)
call_user_func(Array, Object, 'kernel.response', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.response') (Line: 202)
Symfony\Component\HttpKernel\HttpKernel->filterResponse(Object, Object, 1) (Line: 190)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\views\ManyToOneHelper::$handler is deprecated in Drupal\views\ManyToOneHelper->__construct() (line 24 of core/modules/views/src/ManyToOneHelper.php).
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 51)
Drupal\views\Plugin\views\filter\ManyToOne->defineOptions() (Line: 117)
Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid->defineOptions() (Line: 228)
Drupal\views\Plugin\views\PluginBase->unpackOptions(Array, Array) (Line: 144)
Drupal\views\Plugin\views\PluginBase->init(Object, Object, Array) (Line: 104)
Drupal\views\Plugin\views\HandlerBase->init(Object, Object, Array) (Line: 95)
Drupal\views\Plugin\views\filter\FilterPluginBase->init(Object, Object, Array) (Line: 44)
Drupal\views\Plugin\views\filter\InOperator->init(Object, Object, Array) (Line: 36)
Drupal\views\Plugin\views\filter\ManyToOne->init(Object, Object, Array) (Line: 98)
Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('filter') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('filter', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 2633)
Drupal\views\Plugin\views\display\DisplayPluginBase->viewExposedFormBlocks() (Line: 35)
Drupal\views\Plugin\Block\ViewsExposedFilterBlock->build() (Line: 171)
Drupal\block\BlockViewBuilder::preRender(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 160)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 159)
Drupal\Core\Render\Renderer->renderPlain(Array) (Line: 175)
Drupal\Core\Render\Renderer->renderPlaceholder('', Array) (Line: 665)
Drupal\Core\Render\Renderer->replacePlaceholders(Array) (Line: 550)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 148)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 147)
Drupal\Core\Render\Renderer->renderRoot(Array) (Line: 279)
Drupal\Core\Render\HtmlResponseAttachmentsProcessor->renderPlaceholders(Object) (Line: 71)
Drupal\big_pipe\Render\BigPipeResponseAttachmentsProcessor->processAttachments(Object) (Line: 45)
Drupal\Core\EventSubscriber\HtmlResponseSubscriber->onRespond(Object, 'kernel.response', Object)
call_user_func(Array, Object, 'kernel.response', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.response') (Line: 202)
Symfony\Component\HttpKernel\HttpKernel->filterResponse(Object, Object, 1) (Line: 190)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\views\ManyToOneHelper::$handler is deprecated in Drupal\views\ManyToOneHelper->__construct() (line 24 of core/modules/views/src/ManyToOneHelper.php).
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 51)
Drupal\views\Plugin\views\filter\ManyToOne->defineOptions() (Line: 117)
Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid->defineOptions() (Line: 228)
Drupal\views\Plugin\views\PluginBase->unpackOptions(Array, Array) (Line: 110)
Drupal\views\Plugin\views\HandlerBase->init(Object, Object, Array) (Line: 95)
Drupal\views\Plugin\views\filter\FilterPluginBase->init(Object, Object, Array) (Line: 44)
Drupal\views\Plugin\views\filter\InOperator->init(Object, Object, Array) (Line: 36)
Drupal\views\Plugin\views\filter\ManyToOne->init(Object, Object, Array) (Line: 98)
Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('filter') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('filter', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 2633)
Drupal\views\Plugin\views\display\DisplayPluginBase->viewExposedFormBlocks() (Line: 35)
Drupal\views\Plugin\Block\ViewsExposedFilterBlock->build() (Line: 171)
Drupal\block\BlockViewBuilder::preRender(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 160)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 159)
Drupal\Core\Render\Renderer->renderPlain(Array) (Line: 175)
Drupal\Core\Render\Renderer->renderPlaceholder('', Array) (Line: 665)
Drupal\Core\Render\Renderer->replacePlaceholders(Array) (Line: 550)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 148)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 147)
Drupal\Core\Render\Renderer->renderRoot(Array) (Line: 279)
Drupal\Core\Render\HtmlResponseAttachmentsProcessor->renderPlaceholders(Object) (Line: 71)
Drupal\big_pipe\Render\BigPipeResponseAttachmentsProcessor->processAttachments(Object) (Line: 45)
Drupal\Core\EventSubscriber\HtmlResponseSubscriber->onRespond(Object, 'kernel.response', Object)
call_user_func(Array, Object, 'kernel.response', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.response') (Line: 202)
Symfony\Component\HttpKernel\HttpKernel->filterResponse(Object, Object, 1) (Line: 190)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\views\ManyToOneHelper::$handler is deprecated in Drupal\views\ManyToOneHelper->__construct() (line 24 of core/modules/views/src/ManyToOneHelper.php).
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 38)
Drupal\views\Plugin\views\filter\ManyToOne->init(Object, Object, Array) (Line: 98)
Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('filter') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('filter', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 2633)
Drupal\views\Plugin\views\display\DisplayPluginBase->viewExposedFormBlocks() (Line: 35)
Drupal\views\Plugin\Block\ViewsExposedFilterBlock->build() (Line: 171)
Drupal\block\BlockViewBuilder::preRender(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 160)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 159)
Drupal\Core\Render\Renderer->renderPlain(Array) (Line: 175)
Drupal\Core\Render\Renderer->renderPlaceholder('', Array) (Line: 665)
Drupal\Core\Render\Renderer->replacePlaceholders(Array) (Line: 550)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 148)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 147)
Drupal\Core\Render\Renderer->renderRoot(Array) (Line: 279)
Drupal\Core\Render\HtmlResponseAttachmentsProcessor->renderPlaceholders(Object) (Line: 71)
Drupal\big_pipe\Render\BigPipeResponseAttachmentsProcessor->processAttachments(Object) (Line: 45)
Drupal\Core\EventSubscriber\HtmlResponseSubscriber->onRespond(Object, 'kernel.response', Object)
call_user_func(Array, Object, 'kernel.response', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.response') (Line: 202)
Symfony\Component\HttpKernel\HttpKernel->filterResponse(Object, Object, 1) (Line: 190)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'taxonomy_term') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 228)
Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid->valueForm(Array, Object) (Line: 941)
Drupal\views\Plugin\views\filter\FilterPluginBase->buildExposedForm(Array, Object) (Line: 111)
Drupal\views\Form\ViewsExposedForm->buildForm(Array, Object)
call_user_func_array(Array, Array) (Line: 534)
Drupal\Core\Form\FormBuilder->retrieveForm('views_exposed_form', Object) (Line: 281)
Drupal\Core\Form\FormBuilder->buildForm('\Drupal\views\Form\ViewsExposedForm', Object) (Line: 134)
Drupal\views\Plugin\views\exposed_form\ExposedFormPluginBase->renderExposedForm(1) (Line: 2638)
Drupal\views\Plugin\views\display\DisplayPluginBase->viewExposedFormBlocks() (Line: 35)
Drupal\views\Plugin\Block\ViewsExposedFilterBlock->build() (Line: 171)
Drupal\block\BlockViewBuilder::preRender(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 160)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 159)
Drupal\Core\Render\Renderer->renderPlain(Array) (Line: 175)
Drupal\Core\Render\Renderer->renderPlaceholder('', Array) (Line: 665)
Drupal\Core\Render\Renderer->replacePlaceholders(Array) (Line: 550)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 148)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 147)
Drupal\Core\Render\Renderer->renderRoot(Array) (Line: 279)
Drupal\Core\Render\HtmlResponseAttachmentsProcessor->renderPlaceholders(Object) (Line: 71)
Drupal\big_pipe\Render\BigPipeResponseAttachmentsProcessor->processAttachments(Object) (Line: 45)
Drupal\Core\EventSubscriber\HtmlResponseSubscriber->onRespond(Object, 'kernel.response', Object)
call_user_func(Array, Object, 'kernel.response', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.response') (Line: 202)
Symfony\Component\HttpKernel\HttpKernel->filterResponse(Object, Object, 1) (Line: 190)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('taxonomy_term_access') (Line: 145)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 228)
Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid->valueForm(Array, Object) (Line: 941)
Drupal\views\Plugin\views\filter\FilterPluginBase->buildExposedForm(Array, Object) (Line: 111)
Drupal\views\Form\ViewsExposedForm->buildForm(Array, Object)
call_user_func_array(Array, Array) (Line: 534)
Drupal\Core\Form\FormBuilder->retrieveForm('views_exposed_form', Object) (Line: 281)
Drupal\Core\Form\FormBuilder->buildForm('\Drupal\views\Form\ViewsExposedForm', Object) (Line: 134)
Drupal\views\Plugin\views\exposed_form\ExposedFormPluginBase->renderExposedForm(1) (Line: 2638)
Drupal\views\Plugin\views\display\DisplayPluginBase->viewExposedFormBlocks() (Line: 35)
Drupal\views\Plugin\Block\ViewsExposedFilterBlock->build() (Line: 171)
Drupal\block\BlockViewBuilder::preRender(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 160)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 159)
Drupal\Core\Render\Renderer->renderPlain(Array) (Line: 175)
Drupal\Core\Render\Renderer->renderPlaceholder('', Array) (Line: 665)
Drupal\Core\Render\Renderer->replacePlaceholders(Array) (Line: 550)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 148)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 147)
Drupal\Core\Render\Renderer->renderRoot(Array) (Line: 279)
Drupal\Core\Render\HtmlResponseAttachmentsProcessor->renderPlaceholders(Object) (Line: 71)
Drupal\big_pipe\Render\BigPipeResponseAttachmentsProcessor->processAttachments(Object) (Line: 45)
Drupal\Core\EventSubscriber\HtmlResponseSubscriber->onRespond(Object, 'kernel.response', Object)
call_user_func(Array, Object, 'kernel.response', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.response') (Line: 202)
Symfony\Component\HttpKernel\HttpKernel->filterResponse(Object, Object, 1) (Line: 190)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'taxonomy_term') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 228)
Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid->valueForm(Array, Object) (Line: 941)
Drupal\views\Plugin\views\filter\FilterPluginBase->buildExposedForm(Array, Object) (Line: 111)
Drupal\views\Form\ViewsExposedForm->buildForm(Array, Object)
call_user_func_array(Array, Array) (Line: 534)
Drupal\Core\Form\FormBuilder->retrieveForm('views_exposed_form', Object) (Line: 281)
Drupal\Core\Form\FormBuilder->buildForm('\Drupal\views\Form\ViewsExposedForm', Object) (Line: 134)
Drupal\views\Plugin\views\exposed_form\ExposedFormPluginBase->renderExposedForm(1) (Line: 2638)
Drupal\views\Plugin\views\display\DisplayPluginBase->viewExposedFormBlocks() (Line: 35)
Drupal\views\Plugin\Block\ViewsExposedFilterBlock->build() (Line: 171)
Drupal\block\BlockViewBuilder::preRender(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 160)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 159)
Drupal\Core\Render\Renderer->renderPlain(Array) (Line: 175)
Drupal\Core\Render\Renderer->renderPlaceholder('', Array) (Line: 665)
Drupal\Core\Render\Renderer->replacePlaceholders(Array) (Line: 550)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 148)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 147)
Drupal\Core\Render\Renderer->renderRoot(Array) (Line: 279)
Drupal\Core\Render\HtmlResponseAttachmentsProcessor->renderPlaceholders(Object) (Line: 71)
Drupal\big_pipe\Render\BigPipeResponseAttachmentsProcessor->processAttachments(Object) (Line: 45)
Drupal\Core\EventSubscriber\HtmlResponseSubscriber->onRespond(Object, 'kernel.response', Object)
call_user_func(Array, Object, 'kernel.response', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.response') (Line: 202)
Symfony\Component\HttpKernel\HttpKernel->filterResponse(Object, Object, 1) (Line: 190)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('taxonomy_term_access') (Line: 145)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 228)
Drupal\taxonomy\Plugin\views\filter\TaxonomyIndexTid->valueForm(Array, Object) (Line: 941)
Drupal\views\Plugin\views\filter\FilterPluginBase->buildExposedForm(Array, Object) (Line: 111)
Drupal\views\Form\ViewsExposedForm->buildForm(Array, Object)
call_user_func_array(Array, Array) (Line: 534)
Drupal\Core\Form\FormBuilder->retrieveForm('views_exposed_form', Object) (Line: 281)
Drupal\Core\Form\FormBuilder->buildForm('\Drupal\views\Form\ViewsExposedForm', Object) (Line: 134)
Drupal\views\Plugin\views\exposed_form\ExposedFormPluginBase->renderExposedForm(1) (Line: 2638)
Drupal\views\Plugin\views\display\DisplayPluginBase->viewExposedFormBlocks() (Line: 35)
Drupal\views\Plugin\Block\ViewsExposedFilterBlock->build() (Line: 171)
Drupal\block\BlockViewBuilder::preRender(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 160)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 159)
Drupal\Core\Render\Renderer->renderPlain(Array) (Line: 175)
Drupal\Core\Render\Renderer->renderPlaceholder('', Array) (Line: 665)
Drupal\Core\Render\Renderer->replacePlaceholders(Array) (Line: 550)
Drupal\Core\Render\Renderer->doRender(Array, 1) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, 1) (Line: 148)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 147)
Drupal\Core\Render\Renderer->renderRoot(Array) (Line: 279)
Drupal\Core\Render\HtmlResponseAttachmentsProcessor->renderPlaceholders(Object) (Line: 71)
Drupal\big_pipe\Render\BigPipeResponseAttachmentsProcessor->processAttachments(Object) (Line: 45)
Drupal\Core\EventSubscriber\HtmlResponseSubscriber->onRespond(Object, 'kernel.response', Object)
call_user_func(Array, Object, 'kernel.response', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.response') (Line: 202)
Symfony\Component\HttpKernel\HttpKernel->filterResponse(Object, Object, 1) (Line: 190)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)