<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>qliksense - Qlik Sense - Обучение, учебник, онлайн курс</title>
	<atom:link href="https://qliksense.ivan-shamaev.ru/tag/qliksense/feed/" rel="self" type="application/rss+xml" />
	<link>https://qliksense.ivan-shamaev.ru/tag/qliksense/</link>
	<description>Qlik Sense на русском языке. Пошаговые уроки для изучения Клик Сенс</description>
	<lastBuildDate>Wed, 02 Dec 2020 20:04:56 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>

<image>
	<url>https://qliksense.ivan-shamaev.ru/wp-content/uploads/2018/07/QlikSense_ICON2-150x150.png</url>
	<title>qliksense - Qlik Sense - Обучение, учебник, онлайн курс</title>
	<link>https://qliksense.ivan-shamaev.ru/tag/qliksense/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>nebula.js &#8211; Qlik Sense API Javascript библиотека. Примеры</title>
		<link>https://qliksense.ivan-shamaev.ru/nebula-js-qlik-sense-api-javascript-library-examples/</link>
					<comments>https://qliksense.ivan-shamaev.ru/nebula-js-qlik-sense-api-javascript-library-examples/#respond</comments>
		
		<dc:creator><![CDATA[qliksense-expert]]></dc:creator>
		<pubDate>Wed, 25 Nov 2020 20:03:24 +0000</pubDate>
				<category><![CDATA[Уровень 2]]></category>
		<category><![CDATA[mashup]]></category>
		<category><![CDATA[nebula.js]]></category>
		<category><![CDATA[qlik api]]></category>
		<category><![CDATA[qlik sense]]></category>
		<category><![CDATA[qlik sense api]]></category>
		<category><![CDATA[Qlik Sense Mashup]]></category>
		<category><![CDATA[qliksense]]></category>
		<guid isPermaLink="false">https://qliksense.ivan-shamaev.ru/?p=2440</guid>

					<description><![CDATA[<p>Введение в nebula.js nebula.js представляет собой набор библиотек JavaScript, визуализаций и интерфейсов командной строки, которые помогают разработчикам создавать и интегрировать визуализации поверх ассоциативного движка Qlik. Коллекция организована в @nebula.jsрамках области в виде пакетов npm. Основной пакет @nebula.js/stardustсодержит API-интерфейсы для интеграции существующих визуализаций с гибридными приложениями, а также API-интерфейсы для создания пользовательских визуализаций. EMBEDDING VISUALIZATIONS.<a class="moretag" href="https://qliksense.ivan-shamaev.ru/nebula-js-qlik-sense-api-javascript-library-examples/"> Читать дальше&#8230;</a></p>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/nebula-js-qlik-sense-api-javascript-library-examples/">nebula.js &#8211; Qlik Sense API Javascript библиотека. Примеры</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1 id="introduction-to-nebulajs"><span>Введение в nebula.js</span></h1>
<p><code class="language-text">nebula.js</code><span> представляет собой набор библиотек JavaScript, визуализаций и интерфейсов командной строки, которые помогают разработчикам создавать и интегрировать визуализации поверх ассоциативного движка Qlik.</span></p>
<p><span>Коллекция организована в </span><code class="language-text">@nebula.js</code><span>рамках области в виде пакетов npm. Основной пакет </span><code class="language-text">@nebula.js/stardust</code><span>содержит API-интерфейсы для интеграции существующих визуализаций с гибридными приложениями, а также API-интерфейсы для создания пользовательских визуализаций.</span></p>
<h1><strong>EMBEDDING VISUALIZATIONS. ВСТРАИВАНИЕ ВИЗУАЛИЗАЦИЙ</strong></h1>
<h2>Configuration. Конфигурация</h2>
<p><span>Когда вы создаете веб-сайт, будь то сайт всей компании или небольшой личный проект, у вас, скорее всего, есть свои собственные рекомендации по дизайну, шаблоны и требования UX, и вы захотите применить эти рекомендации к тому, что вы с ним интегрируете; диаграммы должны использовать ваши цветовые схемы, шрифты, языковой стандарт и уважать любые ограничения, которые могут быть у вас на интерактивность. Вы также можете контролировать, как загружаются диаграммы и темы, в зависимости от того, подключено ли ваше решение к сети или нет.</span></p>
<p><span>Вы можете управлять большинством из них через </span><code class="language-text">Configuration</code><span>объект.</span></p>
<h3 id="temporary-config">В<span>ременный конфиг</span></h3>
<p><span></span><code class="language-text">Configuration</code><span>Объект является необязательным аргументом , который вы можете предоставить при инстанцировании </span><code class="language-text">embed</code><span>экземпляра:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">import { embed } from '@nebula.js/stardust';

const n = embed(enigmaApp, {
  context: {
    theme: 'dark',
  },
  types: [
    /* types */
  ],
});

n.render(/* chart 1*/);
n.render(/* chart 2*/);</pre>
<h3 id="reusable-config"><span>Многоразовая конфигурация</span></h3>
<p><span>Если вы работаете с несколькими приложениями или хотите иметь несколько разных конфигураций, вам может быть проще сначала создать конфигурации, а затем повторно использовать их.</span></p>
<p><span>Создайте файл, </span><code class="language-text">baseConfig</code><span>который выполняет тяжелую работу по регистрации типов и тем:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">const baseConfig = embed.createConfiguration({
  types: [
    /* register type once*/
  ],
  themes: [
    /* register themes once*/
  ],
});</pre>
<p><span>Создайте другую конфигурацию, которая наследуется от </span><code class="language-text">baseConfig</code><span>, примените </span><code class="language-text">'dark'</code><span>тему и установите ограничение, запрещающее выбор:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">const noSelectionDark = baseConfig.createConfiguration({
  context: {
    theme: 'dark',
    constraints: { select: true },
  },
});

// render chart with dark theme with no selections allowed
noSelectionDark(enigmaApp).render(/*chart config*/);
noSelectionDark(anotherEnigmaApp).render(/*chart config*/);</pre>
<p><span>Вы также можете напрямую привязать конфигурацию к приложению:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">const swedishPink = baseConfig(enigmaApp, {
  context: {
    theme: 'pinkish',
    language: 'sv-SE',
  },
});

swedishPink.render(/* chart config */);</pre>
<h3 id="registering-types"><span>Регистрация типов</span></h3>
<p><span>Перед визуализацией визуализации ее модуль необходимо загрузить и зарегистрировать. Вы можете загрузить необходимые модули из npm:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">$npm install @nebula.js/sn-bar-chart @nebula.js/sn-pie-chart</pre>
<p><span>А потом зарегистрируйте каждого </span><code class="language-text">type</code><span>индивидуально:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">import barchart from '@nebula.js/sn-bar-chart';
import piechart from '@nebula.js/sn-pie-chart';

embed.createConfiguration({
  types: [
    {
      name: 'bar',
      load: () =&gt; Promise.resolve(barchart),
    },
    {
      name: 'pie',
      load: () =&gt; Promise.resolve(piechart),
    },
  ],
});</pre>
<h3 id="loading-on-the-fly"><span>Загрузка на лету</span></h3>
<p><span>Если вы точно не знаете, какие типы вам нужны, и не хотите устанавливать все, чтобы уменьшить размер вашего пакета, вы можете загрузить визуализации во время выполнения, используя облегченный загрузчик определений асинхронных модулей, например </span><a href="https://github.com/d3/d3-require"><span>d3-require</span></a><span> .</span></p>
<p><span>Начнем с установки модуля:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">npm install d3-require</pre>
<p><span>а затем настройте его для загрузки модулей из CDN, например </span><code class="language-text">https://unpkg.com</code><span>, а также укажите псевдоним для использования локальной версии </span><code class="language-text">@nebula.js/stardust</code><span>:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">import { requireFrom } from 'd3-require';
import * as stardust from '@nebula.js/stardust';

const loadSnType = requireFrom((name) =&gt; `https://unpkg.com/@nebula.js/sn-${name}-chart`).alias({
  '@nebula.js/stardust': stardust,
});</pre>
<p><span>Затем вы можете настроить все типы, которые вы ожидаете использовать:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">const types = ['bar', 'line', 'pie', 'sankey'].map((t) =&gt; ({
  type: t,
  load: () =&gt; loadSnType(t),
}));
const baseConfig = stardust.embed.createConfiguration({ types });</pre>
<p><span>Тип загружается с удаленного URL-адреса при первом отображении:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">baseConfig(enigmaApp).render({
  type: 'bar',
  fields: ['Product', '=sum(Sales)'],
});</pre>
<h3 id="context"><span>Контекст</span></h3>
<p><span>При настройке конфигурации вы можете применить, </span><code class="language-text">context</code><span>который контролирует язык, тему и ограничения в каждой визуализации, которую вы визуализируете:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">embed.createConfiguration({
  context: {},
});</pre>
<h4 id="constraints"><span>Ограничения</span></h4>
<p><span>Ограничения позволяют указать визуализации на отключение определенных типов взаимодействий и поведения.</span></p>
<p><span>Вы можете применить три различных ограничения:</span></p>
<ul>
<li><code class="language-text">passive</code><span>: отключить такие взаимодействия, как всплывающие подсказки.</span></li>
<li><code class="language-text">active</code><span>: отключение взаимодействий, влияющих на состояние визуального представления, таких как масштабирование, прокрутка и т. д.</span></li>
<li><code class="language-text">select</code><span>: выключить выделение.</span></li>
</ul>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">{
  context: {
    constraints: {
      active: true,
      passive: true,
      select: true,
    },
  },
};</pre>
<p><code class="language-text">stardust</code><span> никоим образом не навязывает эти ограничения, вместо этого разработчик визуализации должен соблюдать и реализовывать их.</span></p>
<h4 id="language"><span>Язык</span></h4>
<p><code class="language-text">stardust</code><span> поддерживает 15 языков:</span></p>
<ul>
<li><code class="language-text">'en-US'</code><span> &#8211; Американский английский</span></li>
<li><code class="language-text">'sv-SE'</code><span> &#8211; шведский</span></li>
<li><code class="language-text">'it-IT'</code><span> &#8211; итальянский</span></li>
<li><code class="language-text">'zh-CN'</code><span> &#8211; Упрощенный китайский</span></li>
<li><code class="language-text">'zh-TW'</code><span> &#8211; Традиционный китайский</span></li>
<li><code class="language-text">'ko-KR'</code><span> &#8211; Корейский язык</span></li>
<li><code class="language-text">'de-DE'</code><span> &#8211; Немецкий</span></li>
<li><code class="language-text">'es-ES'</code><span> &#8211; Испанский</span></li>
<li><code class="language-text">'pt-BR'</code><span> &#8211; Бразильский португальский</span></li>
<li><code class="language-text">'ja-JP'</code><span> &#8211; Японский</span></li>
<li><code class="language-text">'fr-FR'</code><span> &#8211; Французкий язык</span></li>
<li><code class="language-text">'nl-NL'</code><span> &#8211; Голландский</span></li>
<li><code class="language-text">'tr-TR'</code><span> &#8211; Турецкий</span></li>
<li><code class="language-text">'pl-PL'</code><span> &#8211; польский</span></li>
<li><code class="language-text">'ru-RU'</code><span> &#8211; Русский</span></li>
</ul>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">{
  context: {
    language: 'sv-SE',
  },
};</pre>
<h4 id="theme"><span>Тема</span></h4>
<p><span>Из коробки доступны две основные темы: </span><code class="language-text">'light'</code><span>и </span><code class="language-text">'dark'</code><span>.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">{
  context: {
    theme: 'dark',
  }
};</pre>
<p><span>Светлая тема</span></p>
<p><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/theme_light_nebulajs.png"><img fetchpriority="high" decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/theme_light_nebulajs.png" alt="" width="524" height="436" class="aligncenter size-full wp-image-2442" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/theme_light_nebulajs.png 524w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/theme_light_nebulajs-300x250.png 300w" sizes="(max-width: 524px) 100vw, 524px" /></a></p>
<p><span>Темная тема</span></p>
<p><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/theme_dark_nebulajs.png"><img decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/theme_dark_nebulajs.png" alt="" width="523" height="434" class="aligncenter size-full wp-image-2443" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/theme_dark_nebulajs.png 523w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/theme_dark_nebulajs-300x249.png 300w" sizes="(max-width: 523px) 100vw, 523px" /><span></span></a></p>
<p><span>Вы также можете зарегистрировать собственные темы и применить одну из них в контексте:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">{
  themes: [{
    id: 'pinkish',
    load: () =&gt; Promise.resolve({
      palettes: {
        data: [{
          scale: [
            '#fac6e5',
            '#ff95d6',
            '#e76eb1',
            '#b44772',
          ],
        }]
      }
    })
  }],
  context: {
    theme: 'pinkish'
  }
};</pre>
<p><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/theme_pinkish_nebula.png"><img decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/theme_pinkish_nebula.png" alt="" width="500" height="359" class="aligncenter size-full wp-image-2445" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/theme_pinkish_nebula.png 500w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/theme_pinkish_nebula-300x215.png 300w" sizes="(max-width: 500px) 100vw, 500px" /></a></p>
<h2>Embedding visualizations. Встраивание визуализаций</h2>
<h3 data-testid="docs-header"><span>Встраивание визуализаций</span></h3>
<p><span>Вы можете встроить визуализацию двумя способами:</span></p>
<ol>
<li><span>На лету</span></li>
<li><span>Из существующего объекта</span></li>
</ol>
<p><span>Рендеринг выполняется с использованием </span><code class="language-text">render()</code><span>метода экземпляра, возвращаемого </span><code class="language-text">embed</code><span>функцией, который, как минимум, требует того, в который </span><code class="language-text">HTMLElement</code><span>вы хотите выполнить рендеринг:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">import { embed } from '@nebula.js/stardust';

const n = embed(enigmaApp);
n.render({
  element,
  // rest of the config
});</pre>
<h3 id="render-on-the-fly"><span>Рендеринг на лету</span></h3>
<p><span>При рендеринге визуализации на лету вам необходимо указать, что </span><code class="language-text">type</code><span> вы хотите визуализировать:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">n.render({
  element,
  type: 'barchart',
});</pre>
<p><span>Некоторые визуализации предъявляют минимальные требования к различным свойствам и / или данным, которые необходимо отображать, и в этом случае вы можете увидеть что-то вроде этого:</span></p>
<p><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/supernova_incomplete_nebulajs.png"><img loading="lazy" decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/supernova_incomplete_nebulajs.png" alt="" width="747" height="489" class="aligncenter size-full wp-image-2447" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/supernova_incomplete_nebulajs.png 747w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/supernova_incomplete_nebulajs-300x196.png 300w" sizes="(max-width: 747px) 100vw, 747px" /></a></p>
<p><span>Чтобы предоставить визуализацию исходные данные, добавьте в </span><code class="language-text">fields</code><span>свойство измерения и меры данных :</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">n.render({
  element,
  type: 'barchart',
  fields: ['Region', '=sum(Sales)'],
});</pre>
<p><span>Вы также можете изменить начальные свойства:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">n.render({
  element,
  type: 'barchart',
  fields: ['Product', '=sum(Sales)'],
  properties: {
    title: 'Sales by region',
  },
});</pre>
<p><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/barchart_nebula.png"><img loading="lazy" decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/barchart_nebula.png" alt="" width="773" height="529" class="aligncenter size-full wp-image-2448" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/barchart_nebula.png 773w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/barchart_nebula-300x205.png 300w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/barchart_nebula-768x526.png 768w" sizes="(max-width: 773px) 100vw, 773px" /></a></p>
<h2 id="render-from-existing-objects"><span>Рендеринг из существующих объектов</span></h2>
<p><span>Если вы уже создали общий объект в своем приложении и хотите его отобразить, вы можете сделать это, предоставив объекту </span><code class="language-text">id</code><span>:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">n.render({
  element,
  id: '&lt;ObjectID&gt;',
});</pre>
<h2>Current app selections. Выборки текущего приложения</h2>
<p><span>Важной частью Qlik является фильтрация данных с помощью выборок. Большинство диаграмм поддерживают выбор в данных, которые они отображают, которые затем отфильтровывают данные и влияют на другие диаграммы, подключенные к той же модели данных.</span></p>
<h3 id="current-app-selections-bar"><span>Панель выбора текущего приложения</span></h3>
<p><span>На панели выбора текущего приложения отображаются активные в данный момент выборки в указанном приложении. Для рендеринга этого бара вам сначала понадобится </span><code class="language-text">HTMLElement</code><span>:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">&lt;div class="curr-selections"&gt;&lt;/div&gt;</pre>
<p><span>Затем вы можете </span><code class="language-text">mount</code><span>выбрать пользовательский интерфейс в этом элементе:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">const n = embed(enigmaApp);

(await n.selections()).mount(document.querySelector('.curr-selections'));</pre>
<p><span>Без каких-либо выделений должно получиться так:</span></p>
<p><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/nebulajs_selectbar.png"><img loading="lazy" decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/nebulajs_selectbar.png" alt="" width="790" height="57" class="aligncenter size-full wp-image-2449" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/nebulajs_selectbar.png 790w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/nebulajs_selectbar-300x22.png 300w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/nebulajs_selectbar-768x55.png 768w" sizes="(max-width: 790px) 100vw, 790px" /></a></p>
<p><span>Когда вы начинаете применять выборки в различных диаграммах, пользовательский интерфейс обновляется, чтобы отразить текущее состояние:</span></p>
<p><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/selections_update.gif"><img loading="lazy" decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/selections_update.gif" alt="" width="792" height="520" class="aligncenter size-full wp-image-2450" /></a></p>
<h3 id="multiple-bars"><span>Несколько баров</span></h3>
<p><span>Если вы подключены к нескольким приложениям, вы можете отобразить текущий выбор в каждом из них, установив панель в разные элементы:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">(await embed(enigmaApp).selections()).mount(document.querySelector('.curr-selections'));

(await embed(anotherApp, { context: { theme: 'dark' } }).selections()).mount(
  document.querySelector('.another-curr-selections')
);</pre>
<p><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/selections_multiple_barchart_nebulajs.gif"><img loading="lazy" decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/selections_multiple_barchart_nebulajs.gif" alt="" width="1020" height="428" class="aligncenter size-full wp-image-2451" /></a></p>
<h1>DEVELOPING VISUALIZATIONS. РАЗРАБОТКА ВИЗУАЛИЗАЦИЙ</h1>
<h2>Visualization. Визуализация</h2>
<h3 id="whats-a-visualization"><span>Что такое визуализация</span></h3>
<p><span>Визуализация в контексте этого API представляет собой визуальный вывод некоторых базовых данных, хранящихся в ассоциативной модели данных Qlik. Это может быть почти все, что вы хотите, и оно традиционно разработано для отображения данных в форме диаграммы, таблицы, kpi и т. Д.</span></p>
<p><strong>Визуализация состоит из двух основных частей: </strong></p>
<ul>
<li><span>backend <em>Generic Object</em></span><span>, который описывает </span><em><span>свойства</span></em><span> этого визуализация и сохраняется в модели данных, </span></li>
<li><span>и внешний интерфейс визуальной части, которая производит рендеринг <em>layout</em>  </span><span>из <em>Generic Object</em></span><span>.</span></li>
</ul>
<h4 id="definition"><span>Определение</span></h4>
<p><span>Минимальная визуализация, которая не содержит никаких данных и ничего не отображает, выглядит так:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">export default function () {
  return {
    qae: {
      /* */
    },
    component() {},
  };
}</pre>
<p><span>Здесь </span><code class="language-text">component()</code><span>вы визуализируете визуальную часть, а </span><code class="language-text">qae</code><span>здесь вы определяете свойства и данные, обрабатываемые ассоциативным механизмом Qlik (QAE).</span></p>
<h2>Rendering. Рендеринг</h2>
<p><span>В </span><code class="language-text">component</code><span>части определения происходит весь рендеринг, это просто функция, которая ничего не возвращает:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">export default function () {
  return {
    component() {
      // rendering logic goes here
    },
  };
}</pre>
<p><span>Чтобы отрендерить что-то, что вам нужно для доступа к элементу DOM, которому назначена визуализация, вы можете сделать это, импортировав </span><code class="language-text">useElement</code><span> функцию:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">import { useElement } from '@nebula.js/stardust';</pre>
<p><span>Эта функция возвращает простой HTMLElement, который является вашей точкой входа в визуальный мир:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">component() {
  const element = useElement();
  element.innerHTML = 'Hello!';
}</pre>
<p><code class="language-text">useElement</code><span>&#8211; это одна из многих функций, которые удовлетворяют наиболее распространенные требования при разработке визуализации, они позволяют </span><em><span>подключаться</span></em><span> к ресурсам, предоставляемым обеими </span><code class="language-text">stardust</code><span>сторонами и ассоциативным движком Qlik.</span></p>
<h3 id="hooks">Hooks</h3>
<p><span>Если вы работали с </span><a href="https://reactjs.org/"><span>React,</span></a><span> вы могли узнать это как </span><em><span>хуки</span></em><span> . Хуки &#8211; это концепция, в которой упор делается на многократно используемые составные функции, а не на классические объектно-ориентированные классы и наследование. Хотя реализация полностью настраивается с использованием настраиваемых хуков, концепция и правила очень похожи, настолько, что вы можете прочитать </span><a href="https://reactjs.org/docs/hooks-intro.html"><span>документацию</span></a><span> по <a href="https://reactjs.org/docs/hooks-intro.html">крючкам React,</a> чтобы понять, как использовать собственные хуки stardust.</span></p>
<h4 id="useelement">useElement</h4>
<p><span>Вы уже видели </span><code class="language-text">useElement</code><span>крючок, его единственная цель &#8211; предоставить HTMLElement, к которому вы должны прикрепить свои собственные элементы, чтобы сделать ваш контент видимым, в следующем примере для элемента </span><code class="language-text">innerHTML</code><span>установлено значение </span><code class="language-text">Hello!</code><span>:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">component() {
  // get the element
  const element = useElement();
  // set element content
  element.innerHTML = 'Hello!';
}</pre>
<p><span>Однако статическая строка не даст многого, в большинстве случаев вы обновляете контент на основе ввода данных, состояния компонентов и взаимодействия с пользователем.</span></p>
<p><span></span><code class="language-text">component()</code><span>Функция выполняется каждый раз , когда что &#8211; то , что может быть связано с вашими изменениями рендеринга; тема, модель данных, выбор данных, состояние компонента и т. д. Таким образом, добавление и удаление прослушивателей событий, обновление узлов DOM и выборка данных не идеальны и могут быть довольно тяжелыми для производительности, если делать это каждый раз при </span><code class="language-text">component()</code><span>запуске. Вместо этого вы должны выполнять пакетные обновления с </span><code class="language-text">useEffect</code><span>.</span></p>
<h4 id="useeffect"><span>useEffect</span></h4>
<p><code class="language-text">useEffect</code><span>&#8211; это ловушка, которая принимает функцию обратного вызова, которая запускается только при изменении указанного вами значения. Это позволяет не только выполнять пакетные обновления, но и реализовывать собственную форму управления жизненным циклом в вашем компоненте.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">import { useEffect } from '@nebula.js/stardust';
// ...
component() {
  const element = useElement();

  useEffect(() =&gt; {
    // run only once when the component is created
    console.log('created');
  }, []);
}</pre>
<p><span>Добавление слушателей событий к элементу обычно выполняется только при запуске компонента, а затем удаляется при его уничтожении:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">component() {
  const element = useElement();

  useEffect(() =&gt; {
    const listener = () =&gt; {
      console.log('clicked');
    };

    element.addEventListener('click', listener);

    return () =&gt; {
      // clean-up
      element.removeEventListener('click', listener);
    };
  }, [element]);
}</pre>
<p><span>В предыдущем примере </span><code class="language-text">element</code><span>в качестве второго аргумента предоставляется наблюдаемое значение, поэтому эффект запускается только при </span><code class="language-text">element</code><span>изменении. Однако, поскольку </span><code class="language-text">element</code><span>никогда не изменяется для одного и того же компонента, обратный вызов запускается только один раз при создании компонента. Таким образом </span><code class="language-text">listener</code><span>, экземпляр может быть создан только один раз, и </span><code class="language-text">click</code><span>добавляется только один прослушиватель событий. Обратный вызов также возвращает функцию в конце, это функция очистки, которая выполняется при изменении любого из наблюдаемых значений или при уничтожении компонента. Здесь вы должны очистить все добавленные побочные эффекты, в этом случае прослушиватель событий удаляется, чтобы избежать утечки памяти.</span></p>
<h4 id="usestate"><span>useState</span></h4>
<p><span>Поскольку </span><code class="language-text">component()</code><span>это функция, а не экземпляр класса или объекта, вы не можете использовать его </span><code class="language-text">this</code><span>для хранения значений экземпляра, как в противном случае. Способ хранения состояния </span><code class="language-text">useState</code><span>:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">import { useState } from '@nebula.js/stardust';

export default function () {
  return {
    component() {
      const [count, setCount] = useState(0);
    },
  };
}</pre>
<p><code class="language-text">useState</code><span>возвращает кортеж, в котором первый элемент совпадает с начальным значением, указанным в качестве аргумента </span><code class="language-text">useState</code><span>, а второй элемент является функцией установки, с помощью которой вы можете изменить значение.</span></p>
<p><span>В следующем примере </span><code class="language-text">count</code><span>увеличивается на 1, когда пользователь нажимает </span><code class="language-text">element</code><span>:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">component() {
  const element = useElement();
  const [count, setCount] = useState(0);

  useEffect(() =&gt; {
    const listener = () =&gt; {
      setCount(count + 1);
    };

    element.addEventListener('click', listener);

    return () =&gt; {
      element.removeEventListener('click', listener);
    };
  }, [element]);
}</pre>
<p><span>Чтобы отобразить обновленное значение, вы можете добавить другое, </span><code class="language-text">useEffect</code><span>которое будет запускаться при </span><code class="language-text">count</code><span>изменении:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">const [count, setCount] = useState(0);
useEffect(() =&gt; {
  element.innerHTML = `Count: ${count}`;
}, [count]);</pre>
<h2>Configuring data. Конфигурирование данных</h2>
<p><span>В </span><code class="language-text">qae</code><span>разделе определения вы определяете свойства универсального объекта и форму данных, которые вы ожидаете использовать.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">{
  "qae": {
    "properties": {}
  }
}</pre>
<h3 id="generic-object"><span>Общий объект</span></h3>
<p><span>Каждая визуализация связана со всей моделью данных и ассоциативным механизмом Qlik через </span><em><span>универсальный объект</span></em><span> . Это объект JSON, содержащий </span><em><span>свойства, в</span></em><span> результате которых создается </span><em><span>макет</span></em><span> , описывающий состояние внутренней части визуализации.</span></p>
<p><span>Каждый раз, когда кто-то хочет визуализировать вашу визуализацию, в модели данных создается экземпляр универсального объекта. Если у создателя есть необходимые разрешения, он может сохранить и сохранить этот объект в своей модели данных.</span></p>
<h3 id="properties"><span>Свойства</span></h3>
<p><span>Какие свойства вы устанавливаете, полностью зависит от вас, однако это должен быть действительный объект JSON. Большинство свойств &#8211; это просто настройки, которые вы, возможно, захотите сохранить с течением времени. Если вы разрабатываете гистограмму, вы можете сохранить настройку, которая указывает, следует ли ее складывать или какой цвет должны иметь столбцы:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">{
  "isStacked": true,
  "barColor": "red"
}</pre>
<p><span>Эти свойства </span><em><span>статичны</span></em><span> , то, что входит, выходит точно так же. Истинная сила универсального объекта &#8211; это </span><em><span>динамические</span></em><span> свойства, которые вы можете установить, что позволяет вам использовать ассоциативный механизм Qlik и получать доступ к данным внутри него.</span></p>
<p><span>Динамические свойства имеют особую структуру, которая позволяет серверной части различать динамические и статические свойства. У них также есть соглашение об именах: все они начинаются с </span><code class="language-text">q</code><span>буквы, за которой следует заглавная буква, что позволяет людям и машинам легко различать два типа свойств.</span></p>
<p><span>Существует множество различных </span><a href="https://qlik.dev/apis/json-rpc/qix/schemas#%23%2Fdefinitions%2Fschemas"><span>предопределенных</span></a><span> динамических свойств для различных целей, например, вы можете использовать </span><a href="https://qlik.dev/apis/json-rpc/qix/schemas#%23%2Fdefinitions%2Fschemas%2Fentries%2FValueExpression"><span>ValueExpression</span></a><span> для выполнения простых вычислений:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">{
  "simpleMath": {
    "qValueExpression": {
      "qExpr": "1+1"
    }
  }
}</pre>
<h4 id="layout">Layout (Макет/Слой)</h4>
<p><span><em>layout </em>из Generic Object является результатом статических и динамических свойств. layout предыдущих свойств выглядит следующим образом:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">{
  "isStacked": true,
  "barColor": "red",
  "simpleMath": 2
}</pre>
<p><span>Обратите внимание, что статические свойства остаются точно такими же, в то время как динамическое свойство </span><code class=" language-text">simpleMath</code><span>теперь содержит вычисленный результат ValueExpression.</span></p>
<p><span>Большинство динамических свойств имеют определение ввода и соответствующий вывод макета; а </span><a href="https://qlik.dev/apis/json-rpc/qix/schemas#%23%2Fdefinitions%2Fschemas%2Fentries%2FListObjectDef"><span>ListObjectDef</span></a><span> приводит к </span><a href="https://qlik.dev/apis/json-rpc/qix/schemas#%23%2Fdefinitions%2Fschemas%2Fentries%2FListObject"><span>ListObject</span></a><span> , а </span><a href="https://qlik.dev/apis/json-rpc/qix/schemas#%23%2Fdefinitions%2Fschemas%2Fentries%2FSelectionObjectDef"><span>SelectionObjectDef</span></a><span> результаты в </span><a href="https://qlik.dev/apis/json-rpc/qix/schemas#%23%2Fdefinitions%2Fschemas%2Fentries%2FSelectionObject"><span>SelectionObject</span></a><span> , и так далее.</span></p>
<h3 id="data"><span>Данные</span></h3>
<p><span>Наиболее часто используемым определением свойства является </span><a href="https://qlik.dev/apis/json-rpc/qix/schemas#%23%2Fdefinitions%2Fschemas%2Fentries%2FHyperCubeDef"><span>HyperCubeDef</span></a><span> , это динамическое свойство, которое предоставляет вам данные из внутренней модели данных. Вы можете разместить это в корне объекта свойств или на более глубоком уровне, и у вас может быть столько, сколько вам нужно:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">{
  "qHyperCubeDef": {},
  "anotherOne": {
    "qHyperCubeDef": {},
    "andAThird": {
      "qHyperCubeDef": {}
    }
  }
}</pre>
<p><span>Основными входными данными HyperCubeDef являются </span><em><span>измерения</span></em><span> и </span><em><span>меры</span></em><span> :</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">{
  "qHyperCubeDef": {
    "qDimensions": [{ "qLibraryId": "hdg534" }],
    "qMeasures": [{ "qLibraryId": "gt5dgd" }]
  }
}</pre>
<p><span>В этом случае измерения и меры жестко запрограммированы на предопределенное значение, которое может существовать в определенной модели данных, что редко бывает тем, что вам нужно. Если вы разрабатываете диаграмму для использования другими с какой-либо моделью данных, которая вам нужна, чтобы можно было добавлять их динамически, вы можете сделать это, указав </span><em><span>целевые объекты данных</span></em><span> .</span></p>
<h4 id="data-targets"><span>Цели данных</span></h4>
<p><span>Целевой объект данных &#8211; это способ определить, где расположены динамические HyperCubeDef в свойствах универсального объекта. Хотя вы </span><code class=" language-text">stardust</code><span>можете просматривать свойства и находить все их использования </span><code class=" language-text">qHyperCubeDef</code><span>, вы можете не захотеть, чтобы все они были динамическими, или вы можете сгенерировать их только для внутреннего использования.</span></p>
<p><span>Вы указываете целевые объекты данных с помощью </span><code class=" language-text">data.targets</code><span>ключа </span><code class=" language-text">qae</code><span>, каждая цель должна иметь </span><code class=" language-text">path</code><span>ключ, который указывает путь JSON к HyperCubeDef из корня объекта свойств:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">qae: {
  properties: {
    qHyperCubeDef: {},
    my: {
      nested: {
        qHyperCubeDef: {}
      },
    }
  },
  data: {
    targets: [
      { path: '/qHyperCubeDef' },
      { path: '/my/nested/qHyperCubeDef' },
    ];
  }
}</pre>
<p><span>Вы можете для каждого целевого объекта данных указать дополнительные сведения, такие как максимальное / минимальное количество измерений и мер, и внести изменения при их добавлении.</span></p>
<p><span>Это полезно, когда вы знаете ограничения того, что может отображать диаграмма. Например, круговая диаграмма в основном используется, когда у нее есть ровно одно измерение и одна мера, но вы также можете реализовать поддержку второй меры. Это также избавляет вас от некоторой логики кода, поскольку </span><code class=" language-text">stardust</code><span>не пытается отобразить диаграмму, ограничения которой не были выполнены, а вместо этого показывает, что некоторые поля отсутствуют.</span></p>
<h4 id="field-limitations">Field limitations. <span>Ограничения поля</span></h4>
<p><span>Чтобы указать ограничения для измерений или показателей, добавьте каждый соответствующий тип поля как объект как часть целевого объекта данных:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">targets: [
  {
    path: '/qHyperCubeDef',
    dimensions: {
      min: 1,
      max: 1,
    },
    measures: {
      min: 1,
      max: 2,
    },
  },
];</pre>
<h3 id="field-modifications">Field modifications</h3>
<p><span>Вы также можете изменить добавленное или удаленное поле непосредственно перед тем, как изменение будет применено и отправлено на серверную часть, это полезно для таких вещей, как настройка сортировки при добавлении измерения или добавление дополнительных свойств, которые, как вы знаете, всегда необходимы.</span></p>
<p><span>Если вы, например, хотите убедиться, что нулевые значения подавляются, поскольку это не то, что вы можете визуализировать или представить в хорошем виде, вы можете установить, </span><code class=" language-text">qNullSuppression: true</code><span>когда добавляется измерение:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">dimensions: {
  added(dimension) {
    dimension.qNullSuppression = true;
  }
}</pre>
<h2>Consuming data. Потребление данных</h2>
<h3 id="access-layout">Access layout</h3>
<p><span>Вы можете получить доступ к <em>layout</em> Generic Object</span><span> через набор предопределенных hooks.</span></p>
<h4 id="uselayout">useLayout</h4>
<p><code class="language-text">useLayout</code><span> возвращает </span>evaluated layout свойств Generic Object:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">import { useLayout } from '@nebula.js/stardust';

export default function () {
  return {
    qae: {
      properties: {
        qHyperCubeDef: {},
        simpleMath: {
          qValueExpression: {
            qExpr: '1+1',
          },
        },
      },
    },
    component() {
      const layout = useLayout();
      console.log(layout); // { qHyperCube: {/* HyperCube Layout */}, simpleMath: 2 }
    },
  };
}</pre>
<p><span>Вы должны </span><code class="language-text">useEffect</code><span>при наблюдении изменений на </span><code class="language-text">layout</code><span>:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">const layout = useLayout();

useEffect(() =&gt; {
  // do some heavy update
}, [layout]);</pre>
<h4 id="useapplayout">useAppLayout</h4>
<p><code class="language-text">useAppLayout</code><span>возвращает </span><a href="https://qlik.dev/apis/json-rpc/qix/schemas#%23%2Fdefinitions%2Fschemas%2Fentries%2FNxAppLayout"><span>NxAppLayout,</span></a><span> к <a href="https://qlik.dev/apis/json-rpc/qix/schemas#%23%2Fdefinitions%2Fschemas%2Fentries%2FNxAppLayout">которому</a> вы в данный момент подключены:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">import { useAppLayout } from '@nebula.js/stardust';

export default function () {
  return {
    component() {
      const appLayout = useAppLayout();
      console.log(appLayout); // { qTitle: 'App title', qLocaleInfo: {/* */ } }
    },
  };
}</pre>
<p><span>Наиболее распространенный вариант использования макета приложения &#8211; это доступ, </span><code class="language-text">qLocaleInfo</code><span>который содержит сведения о локали, выбранные владельцем приложения и должен использоваться для форматирования чисел.</span></p>
<h3 id="models">Models. <span>Модели</span></h3>
<p><span>Помимо макетов приложения и универсального объекта, у вас есть полный доступ к API, созданным с помощью </span><code class="language-text">enigma.js</code><span>. Эти API-интерфейсы генерируются из схемы JSON-RPC и раскрывают всю мощь Associate Engine Qlik.</span></p>
<h4 id="usemodel"><span>useModel</span></h4>
<p><code class="language-text">useModel</code><span>возвращает сгенерированный API </span><a href="https://qlik.dev/apis/json-rpc/qix/genericobject#%23%2Fentries%2FGenericObject"><span>Generic Object</span></a><span> :</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">import { useModel } from '@nebula.js/stardust';

export default function () {
  return {
    component() {
      const model = useModel();
      model.getInfo().then((info) =&gt; {
        console.log(info);
      });
    },
  };
}</pre>
<p><span>Общие операции в этом API:</span></p>
<ul>
<li><span>делать выбор с помощью </span><code class="language-text">beginSelections</code><span>,  </span><code class="language-text">selectHyperCubeValues</code> и <code class="language-text">endSelections</code></li>
<li><span>получить больше данных с </span><code class="language-text">getHyperCubeData</code></li>
</ul>
<h4 id="useapp"><span>useApp</span></h4>
<p><code class="language-text">useApp</code><span>возвращает сгенерированный API <a href="https://qlik.dev/apis/json-rpc/qix/doc#%23%2Fentries%2FDoc">Doc</a>:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">import { useApp } from '@nebula.js/stardust';

export default function () {
  return {
    component() {
      const app = useApp();
      app.clearAll();
    },
  };
}</pre>
<p><span>Общие операции в этом API:</span></p>
<ul>
<li><span>изменять стек выбора с </span><code class="language-text">clearAll</code><span>,  </span><code class="language-text">back</code><span>,</span><code class="language-text">forward</code></li>
<li><span>создавать и применять закладки с помощью </span><code class="language-text">createBookmark</code> и <code class="language-text">applyBookmark</code></li>
</ul>
<h3 id="useglobal"><span>useGlobal</span></h3>
<p><code class="language-text">useGlobal</code><span>возвращает сгенерированный API </span><a href="https://qlik.dev/apis/json-rpc/qix/global#%23%2Fentries%2FGlobal"><span>Global</span></a><span> :</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">import { useGlobal } from '@nebula.js/stardust';

export default function () {
  return {
    component() {
      const g = useGlobal();
      g.engineVersion().then((v) =&gt; {
        console.log(v);
      });
    },
  };
}</pre>
<p><span>Общие операции в этом API:</span></p>
<ul>
<li><span>получить список приложений с </span><code class="language-text">getDocList</code></li>
</ul>
<h2>HyperCube introduction. Введение в HyperCube</h2>
<p><span>Это </span><code class="language-text">HyperCubeDef</code><span>фундаментальная структура, которую вы настраиваете, прежде чем вам будет предоставлен результат в виде файла </span><code class="language-text">HyperCube</code><span>. Не позволяйте имени пугать вас, хотя оно содержит множество свойств и может быть настроено разными способами, в своей основной форме оно напоминает простую таблицу со строками и столбцами.</span></p>
<h3 id="hypercubedef-configuration"><span>Конфигурация HyperCubeDef</span></h3>
<p><span>Не все свойства одинаково важны, и есть несколько ключевых, о которых нужно помнить при настройке </span><code class="language-text">HyperCubeDef</code><span>.</span></p>
<h4 id="qmode"><span>qMode</span></h4>
<p><span>Хотя вам может не потребоваться </span><code class="language-text">qMode</code><span>явно устанавливать, поскольку по умолчанию используется простейший режим </span><code class="language-text">'S'</code><span>, важно знать, какое влияние он оказывает на структуру данных.</span></p>
<p><code class="language-text">qMode: 'P'</code><span>, или </span><em><span>режим</span></em><span> сводной таблицы, дает вам структуру, подходящую для представления сводных таблиц с группами как в вертикальном, так и в горизонтальном направлениях, а также группы для всех показателей.</span></p>
<p><code class="language-text">qMode: 'T'</code><span>, или </span><em><span>древовидный режим</span></em><span> , дает вам структуру, напоминающую дерево и подходящую для визуализации древовидных визуализаций; древовидная карта, упаковка кругов, солнечные лучи, дендрограмма, решётка и т. д.</span></p>
<p><code class="language-text">qMode: 'S'</code><span>, или </span><em><span>прямой режим</span></em><span> , является самым простым из них и дает вам структуру данных, которая выглядит как простая таблица со строками и столбцами. Для простоты объяснения остальной части гиперкуба можно предположить, что он используется.</span></p>
<h4 id="qdimensions-and-qmeasures"><span>qDimensions и qMeasures</span></h4>
<p><code class="language-text">qDimensions</code><span>и </span><code class="language-text">qMeasures</code><span>являются столбцами вашей «таблицы», нет явного ограничения на их количество, которое вы можете добавить, но часто существует ограничение на количество измерений и мер, которые может обрабатывать определенная диаграмма, и вам нужно сохранить это количество из них в виду, когда вы укажете </span><code class="language-text">qInitialDataFetch</code><span>.</span></p>
<h4 id="qinitialdatafetch"><span>qInitialDataFetch</span></h4>
<p><span>Ассоциативный движок Qlik &#8211; это решение на основе памяти, что означает, что объем данных, которые он может обрабатывать, полностью зависит от ресурсов памяти, к которым у него есть доступ. Таким образом, он может содержать миллиарды значений данных, и поэтому количество строк в гиперкубе также потенциально может достигать миллиардов.</span></p>
<p><span>Чтобы избежать случаев, когда такие огромные объемы данных передаются в интерфейсную часть, гиперкуб по умолчанию вообще не включает никаких строк. Чтобы контролировать это, вы можете установить количество строк и столбцов, которое вы хотите изначально </span><code class="language-text">qInitialDataFetch</code><span>. Это свойство позволяет вам установить </span><em><span>страницы данных, которые</span></em><span> вы хотите извлечь из всего гиперкуба, поэтому вы можете, например, выбрать получение первых 50 строк:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">qHyperCubeDef: {
  qInitialDataFetch: [{ qLeft: 0, qTop: 0, qHeight: 50, qWidth: 4 }];
}</pre>
<p><span>Если вы думаете о прямой таблице как о сетке, из которой вы хотите извлечь некоторые данные, тогда </span><code class="language-text">qLeft</code><span>и </span><code class="language-text">qTop</code><span>&#8211; это верхний левый угол подмножества, которое вы хотите извлечь, а </span><code class="language-text">qHeight</code><span>и </span><code class="language-text">qWidth</code><span>&#8211; количество строк и столбцов.</span></p>
<p><span>Однако существует максимальный предел в 10 000 ячеек, которые вы можете извлечь за один раз, и это количество вызывает ошибку. Поэтому вам нужно следить за количеством столбцов может потребоваться для обеспечения общей не превышает 10 000. Если вы, например , знаете , что вы никогда не нужно больше , чем 4 колонки, то вы можете установить </span><code class="language-text">qHeight</code><span>на </span><code class="language-text">10000/4</code><span>:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">qInitialDataFetch: [{ qLeft: 0, qTop: 0, qHeight: 2500, qWidth: 4 }];</pre>
<p><span>Первоначальная выборка данных указывает только самую большую возможную часть всего гиперкуба в макете, если в гиперкубе всего 7 строк, вы не получите больше 7. Вы также можете динамически получать больше данных позже.</span></p>
<h3 id="consuming-the-hypercube"><span>Потребление HyperCube</span></h3>
<p><span>Выход, или </span><em><span>компоновка</span></em><span> , из </span><code class=" language-text">HyperCubeDef</code><span>является </span><a href="https://qlik.dev/apis/json-rpc/qix/schemas#%23%2Fdefinitions%2Fschemas%2Fentries%2FHyperCube"><span>гиперкубом</span></a><span> . В макете он расположен в том же месте, что и вы определили в своих свойствах, но без </span><code class=" language-text">Def</code><span>, например ввода:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">{
  properties: {
    qHyperCubeDef: {},
    another: {
      one: {
        qHyperCubeDef: {}
      }
    }
  }
}</pre>
<p><span>приводит к выводу:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">{
  layout: {
    qHyperCube: {},
    another: {
      one: {
        qHyperCube: {}
      }
    }
  }
}</pre>
<p><span>Рядом с </span><code class=" language-text">qDimensionInfo</code><span>и </span><code class=" language-text">qMeasureInfo</code><span>свойствами , которые содержат ваши размеры и меры, наиболее важную часть гиперкуба являются </span><em><span>страницы данных</span></em><span> .</span></p>
<h4 id="data-pages"><span>Страницы данных</span></h4>
<p><span>На страницах данных содержатся фактические значения данных гиперкуба, где именно и какая структура они имеют, зависит от </span><code class=" language-text">qMode</code><span>значения, которое вы установили ранее. Для режима </span><code class=" language-text">'S'</code><span>это место </span><code class=" language-text">qDataPages</code><span>, которое, в свою очередь, содержит </span><code class=" language-text">qArea</code><span>и </span><code class=" language-text">qMatrix</code><span>.</span></p>
<p><span>Предполагая, что гиперкуб содержит одно измерение, </span><em><span>название фильма</span></em><span> , и одну меру, </span><em><span>средний рейтинг</span></em><span> , содержимое может выглядеть следующим образом:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">qDataPages: [
  {
    qMatrix: [
      [
        // first row
        { qText: '2 Fast 2 Furious', qNum: 'NaN', qElemNumber: 447, qState: 'O' }, // NxCell
        { qText: '6.2', qNum: 6.2, qElemNumber: 0, qState: 'L' },
      ],
      [
        // second
        { qText: '2 Guns', qNum: 'NaN', qElemNumber: 681, qState: 'O' },
        { qText: '6.6', qNum: 6.6, qElemNumber: 0, qState: 'L' },
      ],
    ],
    qArea: { qTop: 0, qLeft: 0, qWidth: 2, qHeight: 2 },
  },
];</pre>
<p><span>Помимо текстовых и числовых значений, каждая </span><a href="https://qlik.dev/apis/json-rpc/qix/schemas#%23%2Fdefinitions%2Fschemas%2Fentries%2FNxCell"><span>ячейка NxCell</span></a><span> содержит </span><code class=" language-text">qElemNumber</code><span>свойство, известное как </span><em><span>ранг</span></em><span> . Ранг для ячейки измерения можно рассматривать как свойство, которое однозначно идентифицирует текстовое значение этой ячейки в своем поле во всей модели данных. Вы можете использовать это свойство для обеспечения единообразного поведения во всем приложении, вы можете, например, установить постоянный цвет значений измерения в поле, когда и где бы они ни использовались:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">// color scheme
const colors = ['#26A0A7', '#79D69F', '#F9EC86', '#EC983D'];

const cellColor = colors[cell.qElemNumber % colors.length];</pre>
<p><span>Это свойство также необходимо отслеживать, когда вы хотите сделать выбор в своей диаграмме.</span></p>
<h4 id="getting-more-data"><span>Получение дополнительных данных</span></h4>
<p><span>Из-за ограничения объема данных, которые вы можете получить в исходном макете, могут возникнуть ситуации, когда вам потребуется получить остальные данные, если вы хотите отобразить их больше. Вы можете сделать это с помощью методов, представленных в </span><em><span>модели</span></em><span> универсального объекта. Какой метод использовать, опять же, зависит </span><code class=" language-text">qMode</code><span>от гиперкуба, для </span><code class=" language-text">'S'</code><span>режима это </span><a href="https://qlik.dev/apis/json-rpc/qix/genericobject#%23%2Fentries%2FGenericObject%2Fentries%2FGetHyperCubeData"><span>GetHyperCubeData</span></a><span> .</span></p>
<p><span>При подкачке данных в прямом режиме вы должны начать с просмотра </span><code class=" language-text">qHyperCubeDef.qSize</code><span>свойства, которое содержит информацию о ширине и высоте полного гиперкуба. Исходя из этого, вы можете рассчитать количество страниц, которые вам нужно получить:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">import { useModel, useLayout, useEffect } from '@nebula.js/stardust';

const NUM_CELLS_PER_PAGE = 10000;
const MAX_PAGES = 10;
// ...
component() {
  const model = useModel();
  const layout = useLayout();

  useEffect(() =&gt; {
    const Y = layout.qHyperCube.qSize.qcy;
    const X = layout.qHyperCube.qSize.qcx;

    const HEIGHT_PER_PAGE = Math.ceil(NUM_CELLS_PER_PAGE / X);
    const NUM_PAGES = Math.floor(MAX_PAGES, Math.ceil(Y / HEIGHT_PER_PAGE));

    const pagesToFetch = [];
    for (let i = 0; i &lt; NUM_PAGES; i++) {
      pagesToFetch.push({ qLeft: 0, qTop: i * HEIGHT_PER_PAGE, qHeight: HEIGHT_PER_PAGE, qWidth: X });
    }

    Promise.all(pagesToFetch.map((page) =&gt; model.getHyperCubeData('/qHyperCubeDef', [page]))).then((pages) =&gt; {
      console.log(pages);
    });
  }, [layout]);

}</pre>
<p><span>Однако вы должны быть </span><strong><span>очень</span></strong><span> осторожны при динамической выборке таких данных, имейте в виду, что размер куба может исчисляться миллионами, выборка такого большого набора данных может занять время и создать очень плохое взаимодействие с пользователем. В предыдущем примере максимальное количество страниц установлено равным 10, так что всего выбирается не более 100 000 значений.</span></p>
<p><span>Вы также можете использовать другие методы, чтобы не получать все данные сразу. </span><em><span>Виртуальная прокрутка</span></em><span> в сочетании с регулированием каждого запроса может значительно повысить производительность. Вам также следует рассмотреть возможность использования сокращенного набора данных, если вам не нужны точные значения:</span></p>
<ul>
<li><a href="https://qlik.dev/apis/json-rpc/qix/genericobject#%23%2Fentries%2FGenericObject%2Fentries%2FGetHyperCubeBinnedData"><span>getHyperCubeBinnedData</span></a><span> связывает точки данных в группы и отлично подходит для тепловых карт и 2D-графиков плотности.</span></li>
<li><a href="https://qlik.dev/apis/json-rpc/qix/genericobject#%23%2Fentries%2FGenericObject%2Fentries%2FGetHyperCubeContinuousData"><span>getHyperCubeContinuousData</span></a><span> уменьшает количество точек в непрерывном измерении и отлично подходит для временных данных.</span></li>
<li><a href="https://qlik.dev/apis/json-rpc/qix/genericobject#%23%2Fentries%2FGenericObject%2Fentries%2FGetHyperCubeReducedData"><span>getHyperCubeReducedData</span></a><span> выполняет некоторую магию вейвлетов и отлично подходит для мини-диаграмм.</span></li>
</ul>
<h2>Selecting data. Выбор данных</h2>
<p><span>Выборка &#8211; это фундаментальная часть ассоциативного механизма Qlik. Все поля и связи между ними содержатся в ассоциативной модели. Когда вы применяете выбор, вы не только применяете фильтр в модели данных, но также демонстрируете связи между вашими источниками данных.</span></p>
<h3 id="applying-selections"><span>Applying selections. </span><span>Применение выделений</span></h3>
<p><span>Выборки можно применять с помощью методов, представленных в модели, возвращенной из </span><code class="language-text">useModel</code><span>хука.</span></p>
<p><span>Поскольку универсальный объект может содержать несколько гиперкубов, вам всегда нужно указать, какой гиперкуб вы хотите выбрать, указав его путь JSON в качестве первого аргумента:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">import { useModel } from '@nebula.js/stardust';
// ...
component() {
  const model = useModel();

  useEffect(() =&gt; {
    model.selectHyperCubeCells('/qHyperCubeDef', [1], []);
  }, [model])
}</pre>
<h3 id="selection-patterns"><span>Шаблоны выбора. Selection patterns</span></h3>
<p><span>Есть два разных шаблона выбора: мгновенный и модальный.</span></p>
<h4 id="instant-selections"><span>Мгновенный выбор. Instant selections</span></h4>
<p><span>Как видно из названия, этот тип шаблона является немедленным и фильтрует как источник выбора, так и все, на что он влияет.</span></p>
<p><span>В следующем примере, как только значение выбрано на гистограмме, фильтрация применяется мгновенно, и обе диаграммы немедленно обновляются отфильтрованными данными:</span></p>
<p><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/selections_instant_qlik_sense_nebula_js_nebulajs_api.gif"><img loading="lazy" decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/selections_instant_qlik_sense_nebula_js_nebulajs_api.gif" alt="" width="912" height="388" class="aligncenter size-full wp-image-2460" /></a></p>
<h4 id="modal-selections"><span>Модальный выбор. Modal selections</span></h4>
<p><span>Когда инициируется модальный выбор, источник выбора входит в форму модального состояния, которое позволяет пользователю изменять выбор до подтверждения изменений.</span></p>
<p><span>В следующем примере пользователь сначала выбирает одно значение на линейчатой ​​диаграмме, после чего другие диаграммы обновляются, как и раньше. Однако гистограмма по-прежнему содержит все доступные данные и позволяет пользователю выбрать другое значение перед подтверждением изменений и обновлением самой гистограммы:</span></p>
<p><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/selections_modal_qlik_sense_nebula_js_nebulajs_api.gif"><img loading="lazy" decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2020/11/selections_modal_qlik_sense_nebula_js_nebulajs_api.gif" alt="" width="912" height="388" class="aligncenter size-full wp-image-2462" /></a></p>
<p><span>Чтобы реализовать этот тип паттерна, вам необходимо выполнить несколько простых шагов </span><code class=" language-text">useSelections</code><span>в сочетании с </span><code class=" language-text">useModel</code><span>ними:</span></p>
<ol>
<li><span>Войдите в модальное состояние, позвонив </span><code class=" language-text">beginSelections</code><span>.</span></li>
<li><span>Выберите значения.</span></li>
<li><span>Обеспечьте визуальную обратную связь с пользователем о том, что было выбрано, например, изменив прозрачность выбранных значений.</span></li>
<li><span>Следите за выходом из модального состояния, чтобы сбросить визуальную обратную связь.</span></li>
</ol>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">import { useModel, useSelections, useElement } from '@nebula.js/stardust';
// ...
component() {
  const element = useElement();
  const model = useModel();
  const selections = useSelections();

  useEffect(() =&gt; {
    const clicked = () =&gt; {
      const clickedOnRow = 1;

      // 1. enter modal state if not already in it
      if (!selections.isActive()) {
        selections.beginSelections(['/qHyperCubeDef']);
      }
      // 2. select the clicked row
      model.selectHyperCubeCells('/qHyperCubeDef', [clickedOnRow], []);
    }

    element.addEventListener('click', clicked);
    return () =&gt; {
      element.removeEventListener('click', clicked);
    }
  }, [element, model, selections]);

  useEffect(() =&gt; {
    if (layout.qSelectionInfo.qInSelections) {
      // 3. update with visual feedback on active selections
      // YOUR CODE HERE
    } else {
      // 4. normal update
      // YOUR CODE HERE
    }
  }, [layout]);
}</pre>
<p>&nbsp;</p>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/nebula-js-qlik-sense-api-javascript-library-examples/">nebula.js &#8211; Qlik Sense API Javascript библиотека. Примеры</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://qliksense.ivan-shamaev.ru/nebula-js-qlik-sense-api-javascript-library-examples/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Урок 1. Регистрация в Qlik Sense Business Cloud. Как начать работать с Qlik в облачном сервисе?</title>
		<link>https://qliksense.ivan-shamaev.ru/registering-with-qlik-sense-business-cloud-how-start-with-qlik/</link>
					<comments>https://qliksense.ivan-shamaev.ru/registering-with-qlik-sense-business-cloud-how-start-with-qlik/#respond</comments>
		
		<dc:creator><![CDATA[qliksense-expert]]></dc:creator>
		<pubDate>Mon, 12 Oct 2020 20:15:52 +0000</pubDate>
				<category><![CDATA[Уровень 1]]></category>
		<category><![CDATA[Qlik]]></category>
		<category><![CDATA[QlikNews]]></category>
		<category><![CDATA[qliksense]]></category>
		<category><![CDATA[QlikSenseTutorial]]></category>
		<category><![CDATA[QlikTech]]></category>
		<category><![CDATA[QlikВидеоНаРусском]]></category>
		<category><![CDATA[QlikОбучение]]></category>
		<category><![CDATA[QlikУчебник]]></category>
		<category><![CDATA[кликсенс]]></category>
		<guid isPermaLink="false">https://qliksense.ivan-shamaev.ru/?p=2421</guid>

					<description><![CDATA[<p>Урок 1. Регистрация в Qlik Sense Business Cloud. Как начать работать с Qlik в облачном сервисе? В этом уроке будет описан процесс создания аккаунта в облачном сервисе Qlik Sense Business Cloud. https://t.me/qlik_insight &#8211; telegram канал &#8211; пишу про Qlik Sense как есть на самом деле, что-то критикую, что-то хвалю, делюсь<a class="moretag" href="https://qliksense.ivan-shamaev.ru/registering-with-qlik-sense-business-cloud-how-start-with-qlik/"> Читать дальше&#8230;</a></p>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/registering-with-qlik-sense-business-cloud-how-start-with-qlik/">Урок 1. Регистрация в Qlik Sense Business Cloud. Как начать работать с Qlik в облачном сервисе?</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><strong>Урок 1. Регистрация в Qlik Sense Business Cloud. Как начать работать с Qlik в облачном сервисе?</strong></p>
<p><span dir="auto" class="style-scope yt-formatted-string">В этом уроке будет описан процесс создания аккаунта в облачном сервисе Qlik Sense Business Cloud. </span></p>
<p><span style="color: #339966;"><strong><a href="https://t.me/qlik_insight" style="color: #339966;">https://t.me/qlik_insight</a></strong></span><span dir="auto" class="style-scope yt-formatted-string"> &#8211; telegram канал &#8211; пишу про Qlik Sense как есть на самом деле, что-то критикую, что-то хвалю, делюсь обучающими материалами. </span></p>
<p><iframe width="560" height="315" src="//www.youtube.com/embed/G_rflkDEn_4" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="allowfullscreen"></iframe></p>
<p>&nbsp;</p>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/registering-with-qlik-sense-business-cloud-how-start-with-qlik/">Урок 1. Регистрация в Qlik Sense Business Cloud. Как начать работать с Qlik в облачном сервисе?</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://qliksense.ivan-shamaev.ru/registering-with-qlik-sense-business-cloud-how-start-with-qlik/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>QS больше не бесплатный. Изменения в Qlik Sense Desktop в 2020 году</title>
		<link>https://qliksense.ivan-shamaev.ru/qs-is-no-longer-free-changes-to-qlik-sense-desktop-in-2020/</link>
					<comments>https://qliksense.ivan-shamaev.ru/qs-is-no-longer-free-changes-to-qlik-sense-desktop-in-2020/#comments</comments>
		
		<dc:creator><![CDATA[qliksense-expert]]></dc:creator>
		<pubDate>Thu, 05 Dec 2019 10:01:43 +0000</pubDate>
				<category><![CDATA[Новости Qlik Sense]]></category>
		<category><![CDATA[bad news]]></category>
		<category><![CDATA[qlik news]]></category>
		<category><![CDATA[qlik sense]]></category>
		<category><![CDATA[qlik sense desktop]]></category>
		<category><![CDATA[qliksense]]></category>
		<guid isPermaLink="false">https://qliksense.ivan-shamaev.ru/?p=2251</guid>

					<description><![CDATA[<p>Qlik Sense Desktop никуда не денется, но больше не будет бесплатным. УРА!!! UPDATE НОВОСТИ Следуя приведенному ниже заявлению, мы получили немало отзывов от увлеченных пользователей и партнеров Qlik, которые ежедневно получают большую выгоду от продуктов и услуг Qlik. В результате этого отзыва мы хотели бы поделиться с вами следующей информацией и<a class="moretag" href="https://qliksense.ivan-shamaev.ru/qs-is-no-longer-free-changes-to-qlik-sense-desktop-in-2020/"> Читать дальше&#8230;</a></p>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/qs-is-no-longer-free-changes-to-qlik-sense-desktop-in-2020/">QS больше не бесплатный. Изменения в Qlik Sense Desktop в 2020 году</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Qlik Sense Desktop никуда не денется, но <strong>больше не будет бесплатным</strong>.</p>
<hr />
<div></div>
<div><span style="color: #008000;"><strong>УРА!!! UPDATE НОВОСТИ</strong></span></div>
<div></div>
<div><span>Следуя приведенному ниже заявлению, мы получили немало отзывов от увлеченных пользователей и партнеров Qlik, которые ежедневно получают большую выгоду от продуктов и услуг Qlik. В результате этого отзыва мы хотели бы поделиться с вами следующей информацией и обновлениями, касающимися ключевых проблемных областей.</span></div>
<div></div>
<div><span><strong>API Developer доступ к инструменту разработки:</strong></span></div>
<ul>
<li>
<div><span>Мы понимаем, что Qlik Sense Desktop является неотъемлемой частью многих разработчиков API в нашем сообществе, и до июня 2020 года будет предоставлено решение, которое обеспечит аналогичную или лучшую возможность разработки с API-интерфейсами Qlik и будет передаваться через наше сообщество разработчиков Qlik, Qlik Branch.</span></div>
</li>
</ul>
<div><span><strong>Возможность легко пробовать Qlik Sense в течение продолжительных периодов времени:</strong></span></div>
<ul>
<li>
<div><span>Мы продолжим вкладывать средства в то, чтобы всем (не только пользователям Windows) было проще и быстрее опробовать Qlik Sense с помощью облачного пробного подхода с Qlik Sense Business. Мы понимаем, что не всегда возможно принять решение за 30 дней, поэтому пользователи пробной версии смогут продлить пробную версию на дополнительные 15 дней самостоятельно. Если для принятия решения требуется дополнительное время, испытания могут быть продлены еще больше, мы просим наших пользователей пробной версии взаимодействовать с продавцом, который может помочь с вашей оценкой Qlik Sense.</span></div>
</li>
</ul>
<div><span><strong>Возможность сохранять данные в автономном режиме при попытке (и использовании) Qlik Sense:</strong></span></div>
<ul>
<li>
<div><span>Мы выделили приоритет для <span style="color: #008000;"><strong>аутентификации Qlik Sense Desktop через облачные сервисы Qlik</strong></span>, что позволило бы пользователям Qlik Sense Business также использовать Qlik Sense Desktop. Это позволит платным и пробным пользователям сохранять свои данные локально, если они захотят.</span></div>
</li>
</ul>
<div><span><strong>Доступ к Qlik Sense для ключевых влияний и промоутеров Qlik:</strong></span></div>
<ul>
<li>
<div><span>Мы продолжим наши инвестиции в возможности электронной коммерции, чтобы мы могли предоставить более быстрый, простой и индивидуальный доступ к Qlik Sense. Эта возможность намного больше, чем просто покупка Qlik Sense с помощью кредитной карты, а также дает Qlik возможность эффективно обслуживать специальные группы с помощью таких программ, как наша <a href="https://www.qlik.com/us/company/academic-program" target="_blank" rel="noopener nofollow noreferrer">академическая программа</a> , гранты на <a href="https://www.qlik.com/us/company/academic-program" target="_blank" rel="noopener nofollow noreferrer">программы </a><a href="https://www.qlik.com/us/company/corporate-responsibility" target="_blank" rel="noopener nofollow noreferrer">корпоративной ответственности</a> и наша <a href="https://www.qlik.com/us/partners" target="_blank" rel="noopener nofollow noreferrer">партнерская программа</a> . <a href="https://www.qlik.com/us/company/academic-program" target="_blank" rel="noopener nofollow noreferrer"></a> <a href="https://www.qlik.com/us/company/corporate-responsibility" target="_blank" rel="noopener nofollow noreferrer"></a>  <a href="https://www.qlik.com/us/partners" target="_blank" rel="noopener nofollow noreferrer"></a></span></div>
</li>
</ul>
<div><span>Спасибо всем за постоянные отзывы, предложения и диалоги. Qlik очень благодарен за энергичное и страстное сообщество. Мы слушаем и ценим все отзывы.</span></div>
<hr />
<p>Чтобы адаптироваться к изменяющимся предпочтениям клиентов и в соответствии с отраслевой практикой корпоративных облачных поставщиков, Qlik отказывается от модели <strong>«freemium»</strong> для своих облачных и настольных версий Qlik Sense в пользу ограниченного по времени пробного периода. Это означает, что и Qlik Sense Cloud Basic, и Qlik Sense Desktop перестанут быть бесплатными. Важно отметить, что Qlik Sense Desktop останется поддерживаемой частью нашего семейства продуктов Qlik Sense.</p>
<p>Мы начали этот процесс в августе с запуска Qlik Sense Business и миграции пользователей Qlik Sense Cloud, а сейчас мы начинаем процесс для Qlik Sense Desktop. Мы знаем, что это изменение затронет многих пользователей Qlik Sense Desktop, поэтому мы будем постепенно осуществлять изменения в течение нескольких месяцев, чтобы вы могли запланировать работы по изменениям. Мы начнем с удаления загрузки с qlik.com продукта QS Desktop, затем Qlik Sense Desktop уведомит пользователей об изменениях и, в конце концов, бесплатное использование Qlik Sense Desktop прекратится.</p>
<p><span style="color: #008000;"><strong>Ключевые изменения и даты:</strong></span><br /><strong></strong></p>
<ul>
<li><strong>Декабрь 2019 &#8211; Январь 2020:</strong> бесплатные загрузки Qlik Sense Desktop будут удалены с веб-сайтов Qlik. В течение и после этого периода Qlik Sense Desktop будет по-прежнему доступен через сайт загрузки для клиентов. Если у вас нет доступа к сайту загрузки для клиентов, вы можете использовать эту временную ссылку для загрузки, чтобы получить самую последнюю версию Qlik Sense Desktop и продолжить бесплатное использование. В течение этого периода не будет никаких физических изменений в Qlik Sense Desktop.</li>
<li><strong>Февраль 2020 года.</strong> При запуске Qlik Sense Desktop на экран выводится предупреждение о предстоящих изменениях (и ссылка на эту публикацию). Это отображение будет создано во всех версиях Qlik Sense Desktop (включая ранее выпущенные версии). В настоящее время пользователи могут продолжать использовать Qlik Sense Desktop бесплатно, однако мы настоятельно рекомендуем пользователям начать переход на платную версию Qlik Sense, начав пробную версию Qlik Sense Business или проверив проверку подлинности Qlik Sense Desktop для Qlik Sense Enterprise в Windows.</li>
<li><strong>30 июня 2020 года.</strong> Бесплатный доступ к Qlik Sense Desktop прекратится. Чтобы продолжить использовать Qlik Sense Desktop, пользователи должны пройти аутентификацию в Qlik Sense Enterprise в Windows. Пользователи по-прежнему смогут получать доступ к приложению Qlik Sense (QVF) через свою локальную файловую систему и копировать файлы в другие выпуски Qlik Sense.</li>
<li><strong>После 30 июня 2020 года:</strong> Qlik Sense Desktop продолжит получать обновления и останется полностью поддерживаемым клиентом Qlik Sense платных развертываний с использованием Qlik Sense Enterprise в Windows.</li>
</ul>
<p><span style="color: #008000;"><strong>Вопросы и ответы:</strong></span></p>
<p><strong>Можно ли использовать Qlik Sense Business для разблокировки Qlik Sense Desktop?</strong></p>
<ul>
<li>Нет, в настоящее время единственным вариантом является проверка подлинности Qlik Sense Desktop в Qlik Sense Enterprise в Windows.</li>
</ul>
<p><strong>Могу ли я использовать более старую версию Qlik Sense Desktop и продолжить бесплатное использование?</strong></p>
<ul>
<li>Нет, все версии Qlik Sense Desktop больше не будут предоставлять бесплатный доступ после 30 июня 2020 года.</li>
</ul>
<p><strong>Могу ли я купить Qlik Sense Desktop как отдельную версию?</strong></p>
<ul>
<li>Нет, чтобы продолжать использовать Qlik Sense, вам необходимо подписаться на Qlik Sense Enterprise.</li>
</ul>
<p><strong>Могу ли я по-прежнему использовать Qlik Sense Desktop для разработки приложений и / или автономного доступа в рамках более широкого развертывания Qlik Sense Enterprise?</strong></p>
<ul>
<li>Да, однако, вы должны аутентифицировать Qlik Sense Desktop в Qlik Sense Enterprise в Windows .</li>
</ul>
<p><strong>Как мне попробовать Qlik Sense, если я не могу загрузить свои данные в облако?</strong></p>
<ul>
<li>Пожалуйста, свяжитесь с нашим отделом продаж, чтобы обсудить наши мульти-облачные возможности, которые предоставят вам выбор места хранения ваших данных.</li>
</ul>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/qs-is-no-longer-free-changes-to-qlik-sense-desktop-in-2020/">QS больше не бесплатный. Изменения в Qlik Sense Desktop в 2020 году</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://qliksense.ivan-shamaev.ru/qs-is-no-longer-free-changes-to-qlik-sense-desktop-in-2020/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Фишки (Tips &#038; Tricks) по Qlik Sense / QlikView. Секретные приемы Qlik</title>
		<link>https://qliksense.ivan-shamaev.ru/qlik-sense-secret-tips-tricks/</link>
					<comments>https://qliksense.ivan-shamaev.ru/qlik-sense-secret-tips-tricks/#respond</comments>
		
		<dc:creator><![CDATA[qliksense-expert]]></dc:creator>
		<pubDate>Wed, 07 Aug 2019 11:19:57 +0000</pubDate>
				<category><![CDATA[Уровень 1]]></category>
		<category><![CDATA[best practice]]></category>
		<category><![CDATA[Qlik]]></category>
		<category><![CDATA[qlik sense]]></category>
		<category><![CDATA[qliksense]]></category>
		<category><![CDATA[Фишки по Qlik Sense]]></category>
		<guid isPermaLink="false">https://qliksense.ivan-shamaev.ru/?p=1363</guid>

					<description><![CDATA[<p>Фишки по коду и выражениям (script &#38; expression) Количество выбранных элементов в измерении GetSelectedCount([Товар Название]) Количество возможных элементов в измерении GetPossibleCount([Товар Название]) Получить количество полей из таблицы модели =Count({1&#60;$Table={'Таблица Фактов'}&#62;} $Field) Переменная &#8220;Условие-проверка&#8221;, что приложение Qlik перегрузилось сегодня vAppReload =match(today(0),today(2)) Получить в скрипте текст, заключенный между символами Текст между символами:<a class="moretag" href="https://qliksense.ivan-shamaev.ru/qlik-sense-secret-tips-tricks/"> Читать дальше&#8230;</a></p>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/qlik-sense-secret-tips-tricks/">Фишки (Tips &#038; Tricks) по Qlik Sense / QlikView. Секретные приемы Qlik</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading"><strong>Фишки по коду и выражениям (script &amp; expression)</strong></h2>



<h3><strong>Количество выбранных элементов в измерении</strong></h3>
<pre class="EnlighterJSRAW" data-enlighter-language="null">GetSelectedCount([Товар Название])</pre>
<h3><strong>Количество возможных элементов в измерении</strong></h3>
<pre class="EnlighterJSRAW" data-enlighter-language="null">GetPossibleCount([Товар Название])</pre>
<h3><strong>Получить количество полей из таблицы модели</strong></h3>
<pre class="EnlighterJSRAW" data-enlighter-language="null">=Count({1&lt;$Table={'Таблица Фактов'}&gt;} $Field)</pre>
<h3><strong>Переменная &#8220;Условие-проверка&#8221;, что приложение Qlik перегрузилось сегодня</strong></h3>
<pre class="EnlighterJSRAW" data-enlighter-language="null">vAppReload
=match(today(0),today(2))</pre>
<h3><strong>Получить в скрипте текст, заключенный между символами</strong></h3>
<p><strong>Текст между символами:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">=TextBetween('lkj dsf 554 [Текст в квадратных скобках]','[',']')</pre>
<h3><strong>Как менять значения переменной по кругу при нажатии на кнопку</strong></h3>
<p><strong>Как менять значения переменной по кругу:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">=pick(match($(пПеременная),1,2,3,4,5,6),2,3,4,5,6,1)</pre>
<h3><strong>Сравнение поля с конкретным временем</strong></h3>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Time(Left([Время обработки],8))&gt;MakeTime(18,30,00)</pre>
<h3><strong>Время обновления файла</strong></h3>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Let vFileDateTimeModified = FileTime('C:\QS_QVD\Чеки.qvd');</pre>
<h3><strong>Выход из скрипта по условию</strong></h3>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Exit Script when a=1;</pre>
<h3><strong>Значение по умолчанию для конструкции Pick(Match())</strong></h3>
<p><strong>Pick &amp; Match &#8211; значение по-умолчанию, если не найдено условие</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Pick(Match(lower([Флаг]),'true','false')+1,'Не определено','Да','Нет') As [Какой-то аналитический признак]</pre>
<h3><strong>Проверка поля на пустоту в скрипте Qlik Sense</strong></h3>
<p><strong>Проверка поля на пустоту (вместо not IsNull and &lt;&gt;&#8221;)</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Len(Trim([Поле справочника]))=0</pre>
<h3><strong>Использование Match при наличии пустых значений в поле</strong></h3>
<p><strong>Наткнулся, что в Match не учитывает пустые значения (null).</strong> Т.е. условие в скрипте</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">UPPER([Ассортимент]) &lt;&gt; 'ВЕЛОСИПЕДЫ'</pre>
<p>не эквивалентно условию</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Match(UPPER([Ассортимент]),'ВЕЛОСИПЕДЫ')=0</pre>
<p>Решилось:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">RangeSum(0,Match(UPPER([Ассортимент]),'ВЕЛОСИПЕДЫ'))=0;</pre>
<p>Аналогично в <strong>WildMatch</strong></p>
<h3><strong>Сбросить фильтры по всем полям какой-то конкретной таблицы</strong></h3>
<p>Если Вам при расчете показателя необходимо сбросить фильтры по всем полям какой-то таблицы, то необходимо в приложении создать переменную пСброситьВыборкиПолейТаблицы:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">$(=CONCAT({1&lt;$Table = {'$1'}&gt;} DISTINCT '['&amp; $Field &amp;']=', ',') )</pre>
<p>Далее в выражении нужно записать следующую формулу (Выражение в таблице для расчета показателя &#8216;Текущий остаток&#8217;):</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">sum({&lt;$(пСброситьВыборкиПолейТаблицы(Календарь))&gt;} [Текущий остаток])</pre>



<h2 class="wp-block-heading"><strong>Tips &amp; Tricks по работе с визуализацией</strong></h2>



<p><strong>Редактирование таблицы в Qlik Sense с большим количеством столбцов</strong></p>
<p>В Qlik Sense все изменения производимые в столбцах мгновенно начинают отображаться в таблице (автоматическое применение изменений). Когда столбцов много, то любой update в колонках замедляет разработку фактически в несколько раз. Чтобы этого избежать, можно в условии вычисления всей таблицы поставить ноль, внести изменения и потом условие изменения убрать. Т.е. фактически отрубить автоматический расчет таблицы вручную.</p>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/qlik-sense-secret-tips-tricks/">Фишки (Tips &#038; Tricks) по Qlik Sense / QlikView. Секретные приемы Qlik</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://qliksense.ivan-shamaev.ru/qlik-sense-secret-tips-tricks/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Конструктор отчетов Qlik Sense. AdHoc Reporting. Гибкий отчет с измерениями и показателями</title>
		<link>https://qliksense.ivan-shamaev.ru/qlik-sense-report-designer-adhoc-flexible-report-with-dimension-and-metrics/</link>
					<comments>https://qliksense.ivan-shamaev.ru/qlik-sense-report-designer-adhoc-flexible-report-with-dimension-and-metrics/#comments</comments>
		
		<dc:creator><![CDATA[qliksense-expert]]></dc:creator>
		<pubDate>Sat, 22 Jun 2019 11:04:25 +0000</pubDate>
				<category><![CDATA[Уровень 1]]></category>
		<category><![CDATA[qlik adhoc report]]></category>
		<category><![CDATA[qlik sense]]></category>
		<category><![CDATA[qliksense]]></category>
		<category><![CDATA[конструктор отчетов]]></category>
		<guid isPermaLink="false">https://qliksense.ivan-shamaev.ru/?p=1187</guid>

					<description><![CDATA[<p>Что такое конструктор отчетов Qlik Sense (Qlik AdHoc Report)? В строгом смысле, Конструктор отчетов Qlik Sense &#8211; это отчет, который создается на лету и отображает информацию в виде таблицы, которая является результатом вопроса, который еще не был выведен в отдельный рабочий отчет. Существует ограничение на количество таких производственных отчетов и<a class="moretag" href="https://qliksense.ivan-shamaev.ru/qlik-sense-report-designer-adhoc-flexible-report-with-dimension-and-metrics/"> Читать дальше&#8230;</a></p>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/qlik-sense-report-designer-adhoc-flexible-report-with-dimension-and-metrics/">Конструктор отчетов Qlik Sense. AdHoc Reporting. Гибкий отчет с измерениями и показателями</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Что такое конструктор отчетов Qlik Sense (Qlik AdHoc Report)?</h2>



<p>В строгом смысле, <strong>Конструктор отчетов Qlik Sense</strong> &#8211; это отчет, который создается на лету и отображает информацию в виде таблицы, которая является результатом вопроса, который еще не был выведен в отдельный рабочий отчет. Существует ограничение на количество таких производственных отчетов и бизнес-вопросов, которые можно заранее предвидеть и разработать, чтобы пользователи могли обращаться к ним в любое время. В широком смысле, <strong>конструктор отчетов (adhoc report)</strong> &#8211; это просто способ ответить на непредвиденные вопросы.</p>



<p>Поскольку предприятия постоянно меняются, вопросы, которые люди хотят задавать относительно своих данных, постоянно меняются, поэтому любая система отчетности должна учитывать создание и запуск конструктора отчетов. Ключевым моментом является сделать этот процесс простым для обычного бизнес-пользователя, поскольку большинство специальных инструментов отчетов предназначены для использования экспертами по базам данных, что часто требует знания языка запросов, такого как SQL.</p>



<p>В этом разделе будет приведен пример создания такого отчета на базе стандартной функциональности Qlik Sense. При этом Вы сможете в конце раздела скачать рабочий пример и детально разобрать все мелочи. Также, <strong>если у Вас есть вопросы &#8211; оставляйте их в конце статьи &#8211; я постараюсь на них ответить.</strong></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>Конструктор отчетов Qlik Sense (Qlik AdHoc Report)</strong> &#8211; это отчет, в котором Вы выбираете измерения (аналитики, например, товары, контрагенты, периоды) и показатели (например, продажи шт. и продажи руб.)</p><cite>Qlik Sense Expert Russia AdHoc Report</cite></blockquote>



<p>Визуально конструктор отчетов будет выглядеть следующим образом:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1365" height="639" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/adhoc_report_dim_mesuare_qlik_sense_qliksense_flexible_report_custom.jpg" alt="" class="wp-image-1189" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/adhoc_report_dim_mesuare_qlik_sense_qliksense_flexible_report_custom.jpg 1365w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/adhoc_report_dim_mesuare_qlik_sense_qliksense_flexible_report_custom-300x140.jpg 300w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/adhoc_report_dim_mesuare_qlik_sense_qliksense_flexible_report_custom-768x360.jpg 768w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/adhoc_report_dim_mesuare_qlik_sense_qliksense_flexible_report_custom-1024x479.jpg 1024w" sizes="(max-width: 1365px) 100vw, 1365px" /><figcaption>Внешний вид конструктора отчетов Qlik Sense (AdHoc Report)</figcaption></figure>



<h2 class="wp-block-heading">Загрузка данных в модель (создание модели Qlik Sense для примера AdHoc Report)</h2>



<p>В качестве данных для нашей модели данных возьмем простой файл Excel с данными и напишем скрипт загрузки.</p>



<p><strong>Скачать файл Excel с данными для модели Qlik Sense:</strong></p>



<div class="wp-block-file"><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2018/10/QlikSense_SampleData_Example_Data_SetAnalysis.xlsx"><strong><span style="color:#005104" class="tadv-color">QlikSense SampleData Example</span></strong></a><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2018/10/QlikSense_SampleData_Example_Data_SetAnalysis.xlsx" class="wp-block-file__button" download><strong>Скачать</strong></a></div>



<p>Также нам понадобится специальная функция, которая была разработана мною. Грузить ее будем из текстового файла:</p>



<div class="wp-block-file"><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/Func.txt"><strong><span style="color:#005104" class="tadv-color">Func</span></strong></a><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/Func.txt" class="wp-block-file__button" download>Скачать</a></div>



<p><strong>В этом файле лежит вот такая функция:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">if(SubStringCount('|' &amp; Concat({$3} distinct [$1], '|') &amp; '|', '|$2|') and GetSelectedCount([$1],False(),'$3'),1,0)</pre>



<p>В рамках этой статьи я не буду рассматривать основы создания приложения Qlik Sense, описывать принципы обработки данных и освещать другие вопросы. Все это Вы найдете на моем сайте в других разделах. В этой статье я рассмотрю только аспекты создания конструктора отчетов.</p>



<p><strong>Пишем скрипт загрузки данных</strong>. У нас будет 4 раздела загрузки данных:</p>



<div class="wp-block-image"><figure class="aligncenter"><img loading="lazy" decoding="async" width="258" height="236" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/script_4_razdela_zagruzki_dannih.jpg" alt="" class="wp-image-1193"/><figcaption>Qlik Sense Script AdHoc Report Data Model</figcaption></figure></div>



<p><strong>Скрипт с Main (Переменные):</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SET ThousandSep=' ';
SET DecimalSep=',';
SET MoneyThousandSep=' ';
SET MoneyDecimalSep=',';
SET MoneyFormat='# ##0,00 ₽;-# ##0,00 ₽';
SET TimeFormat='h:mm:ss';
SET DateFormat='DD.MM.YYYY';
SET TimestampFormat='DD.MM.YYYY h:mm:ss[.fff]';
SET FirstWeekDay=0;
SET BrokenWeeks=1;
SET ReferenceDay=0;
SET FirstMonthOfYear=1;
SET CollationLocale='ru-RU';
SET CreateSearchIndexOnReload=1;
SET MonthNames='янв;фев;мар;апр;май;июн;июл;авг;сен;окт;ноя;дек';
SET LongMonthNames='января;февраля;марта;апреля;мая;июня;июля;августа;сентября;октября;ноября;декабря';
SET DayNames='пн;вт;ср;чт;пт;сб;вс';
SET LongDayNames='понедельник;вторник;среда;четверг;пятница;суббота;воскресенье';
SET NumericalAbbreviation='3:тыс;6:млн;9:млрд;12:трлн;15:P;18:E;21:Z;24:Y;-3:m;-6:μ;-9:n;-12:p;-15:f;-18:a;-21:z;-24:y';</pre>



<p><strong>Факты (загрузка данных из Excel):</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Факты:
LOAD
    Дата,
    Подразделение,
    Контрагент,
    Менеджер,
    Номенклатура,
    Продажи,
    Себестоимость,
    [Валовая прибыль]
FROM [lib://DataSource/QlikSense_SampleData_Example_Data_SetAnalysis.xlsx]
(ooxml, embedded labels, table is Data);</pre>



<p><strong>Календарь </strong>(на основе минимальной и максимальной дат формируем календарь &#8211; массив дат с месяцами, годами, кварталами и т.п.):</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// Получаем из поля Дата минимальное и максимальное значения
[TEMP Максимальная Минимальная Дата]:
LOAD
     Min(FieldValue('Дата',RecNo())) 	As [Минимальная Дата],
     Max(FieldValue('Дата',RecNo())) 	As [Максимальная Дата]
AutoGenerate FieldValueCount('Дата');

// Минимальную и максимальную даты помещаем в переменные, 
// для того, чтобы использовать их в условии While
Let пНачалоКалендаря_Число 	  = Num(Peek('Минимальная Дата', 0, 'TEMP Максимальная Минимальная Дата'));
Let пОкончаниеКалендаря_Число = Num(Peek('Максимальная Дата', 0, 'TEMP Максимальная Минимальная Дата'));

// Удаляем временную таблицу
DROP Table [TEMP Максимальная Минимальная Дата];  

// Создаем набор дат в промежутке от минимальной до максимальной даты
[TEMP Набор дат в интервале MinDate - MaxDate]:  
LOAD 
     Date($(пНачалоКалендаря_Число) + IterNo() - 1) as [TEMP Дата]
AutoGenerate 1
While $(пНачалоКалендаря_Число) + IterNo() -1 &lt;= $(пОкончаниеКалендаря_Число);  

// Формируем таблицу с календарем в моделе Qlik Sense
[Простой календарь QS]:  
Load 
     Date([TEMP Дата]) 													As Дата,
     Date([TEMP Дата],'DD MMMM YYYY')									As [Дата длинный месяц],
     Text(Date([TEMP Дата],'WWWW MMM YYYY'))							As [День недели МесяцГод],
     'Кв'&amp; Ceil(Num(Month([TEMP Дата]))/3)								As Квартал,
     'Кв'&amp; Ceil(Num(Month([TEMP Дата]))/3) &amp; '-' &amp; Year([TEMP Дата]) 	As КварталГод,
     Text(Date([TEMP Дата],'YYYY.MM')) 									As [Год Месяц],
     Text(Date([TEMP Дата],'MMM YYYY')) 								As [Месяц Год],
     Year([TEMP Дата]) 													As Год,
     Year([TEMP Дата])&amp;'.'&amp;Week([TEMP Дата])							As [Год Неделя],
     Week([TEMP Дата])													As Неделя,
     Day([TEMP Дата])													As День
Resident [TEMP Набор дат в интервале MinDate - MaxDate];

Drop Table [TEMP Набор дат в интервале MinDate - MaxDate];</pre>



<p><strong>AdHoc Конструктор отчетов</strong> &#8211; загружаем переменную из файла (формула для переменной с 3 параметрами). Плюс определяем набор измерений и показателей, которые будут доступны в нашем гибком конструкторе отчетов:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">//==========================================================
// Загрузка формулы CUSTOM VARIABLE
//==========================================================
AdHocFunc:
First 1
LOAD
    @1 AS ФормулаДляПеременной
FROM [lib://DataSource/Func.txt]
(txt, codepage is 28591, no labels, delimiter is '\t', msq);

LET vAdHocFunc = Peek('ФормулаДляПеременной',0,'AdHocFunc');

Drop Table AdHocFunc;

//==========================================================
// Формирование Data Island таблиц Измерений и Показателей
//==========================================================
[Измерения AdHoc]:
Load * Inline [
    Измерения
    Дата
    Дата длинный месяц
    День недели МесяцГод
    Квартал
    КварталГод
    Год Месяц в числах
    Месяц Год
    Год
    Год Неделя
    Неделя
    День
    Подразделение
    Контрагент
    Менеджер
    Номенклатура
];

[Показатели AdHoc]:
Load * Inline [
	Показатели
    Продажи
    Себестоимость
    Валовая прибыль
];</pre>



<p><strong>Загружаем данные и смотрим модель данных:</strong></p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="596" height="612" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/qlik_sense_adhoc_report_data_loading.jpg" alt="" class="wp-image-1197" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/qlik_sense_adhoc_report_data_loading.jpg 596w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/qlik_sense_adhoc_report_data_loading-292x300.jpg 292w" sizes="(max-width: 596px) 100vw, 596px" /><figcaption>Загрузили данные в модель</figcaption></figure>



<p>В модели данных у нас есть <strong>таблица фактов</strong>, которая связана по общему <strong>полю Дата</strong> с <strong>таблицей Календарь</strong>. Также в модели данных есть две таблицы, которые не имеют связей с другими таблицами (их называют <strong>data island</strong> &#8211; острова данных):</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="733" height="528" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/data_model_qlik_sense_adhoc.jpg" alt="" class="wp-image-1198" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/data_model_qlik_sense_adhoc.jpg 733w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/data_model_qlik_sense_adhoc-300x216.jpg 300w" sizes="(max-width: 733px) 100vw, 733px" /><figcaption>Qlik Sense Data Model AdHoc Analysis &#8211; Факты, Календарь, Показатели и Измерения (Data Island)</figcaption></figure>



<h2 class="wp-block-heading">Создание визуальной части приложения конструктора отчетов QlikSense</h2>



<p>Переходим к основной части. Создаем лист Конструктор отчетов:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="668" height="284" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/qliksense_sheet_adhoc_report.jpg" alt="" class="wp-image-1199" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/qliksense_sheet_adhoc_report.jpg 668w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/qliksense_sheet_adhoc_report-300x128.jpg 300w" sizes="(max-width: 668px) 100vw, 668px" /><figcaption>Лист в приложении Qlik Sense Конструктор отчетов (гибкие отчеты QS)</figcaption></figure>



<p>Слева располагаем фильтры с 2 таблицами (измерения и показатели &#8211; это как раз наши Data Island). Сверху накидываем фильтры для фильтрации модели данных (основные контекстные аналитики &#8211; Год, месяц, товары, клиенты и т.п.). На остальной части располагаем обычную прямую таблицу (как сделать Pivot и как с ним работать в режиме конструктора &#8211; объясню потом).</p>



<p><strong>Схема расположения фильтров и отчета на листе QS (можете как-то по-другому расположить &#8211; это всего лишь рекомендация):</strong></p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1024" height="451" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/adhoc_report_qliksense_konstruktor_otchetov_gibkie_otcheti_structura-1024x451.jpg" alt="" class="wp-image-1200" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/adhoc_report_qliksense_konstruktor_otchetov_gibkie_otcheti_structura-1024x451.jpg 1024w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/adhoc_report_qliksense_konstruktor_otchetov_gibkie_otcheti_structura-300x132.jpg 300w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/adhoc_report_qliksense_konstruktor_otchetov_gibkie_otcheti_structura-768x338.jpg 768w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/adhoc_report_qliksense_konstruktor_otchetov_gibkie_otcheti_structura.jpg 1365w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>1 &#8211; фильтры измерения и показатели, не влияют на модель данных; 2 &#8211; фильтрация модели данных; 3 &#8211; отчет с данными</figcaption></figure>



<h3 class="wp-block-heading">Настройка фильтров Измерения и Показатели</h3>



<p>Для того, чтобы отчет работал, нам необходимо создать Альтернативное состояние &#8220;Конструктор&#8221;:</p>



<div class="wp-block-image"><figure class="aligncenter"><img loading="lazy" decoding="async" width="306" height="334" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/alternative_states_konstructor.jpg" alt="" class="wp-image-1203" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/alternative_states_konstructor.jpg 306w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/alternative_states_konstructor-275x300.jpg 275w" sizes="(max-width: 306px) 100vw, 306px" /><figcaption>В режиме редактирования листа приложения &#8220;Основные элементы&#8221; -> &#8220;Другие состояния&#8221; -> &#8220;Создать&#8221;</figcaption></figure></div>



<p>После этого в фильтре для &#8220;измерений&#8221; и &#8220;показателей&#8221; указываем Другие состояния &#8220;Конструктор&#8221;:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1262" height="614" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/dim_mesures_konstructor_alternative_states.jpg" alt="" class="wp-image-1204" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/dim_mesures_konstructor_alternative_states.jpg 1262w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/dim_mesures_konstructor_alternative_states-300x146.jpg 300w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/dim_mesures_konstructor_alternative_states-768x374.jpg 768w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/dim_mesures_konstructor_alternative_states-1024x498.jpg 1024w" sizes="(max-width: 1262px) 100vw, 1262px" /><figcaption>Измерения и Показатели &#8211; Альтернативное состояние &#8220;Конструктор&#8221;</figcaption></figure>



<h3 class="wp-block-heading">Настройка отчета AdHoc в Qlik Sense &#8211; Прямая таблица</h3>



<p>После того, как вынесли элемент визуализации таблица на лист, создаем столбцы (выбираем измерения и создаем меры/показатели). После того, как Вы накидали все измерения и показатели из модели данных в таблицу, необходимо прописать условия отображения столбцов, отдельно для измерений и отдельно для показателей.</p>



<p><strong>Вставляем условие в поле:</strong></p>



<div class="wp-block-image"><figure class="aligncenter"><img loading="lazy" decoding="async" width="249" height="463" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/uslovie_dim_qliksense_adhoc.jpg" alt="" class="wp-image-1205" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/uslovie_dim_qliksense_adhoc.jpg 249w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/uslovie_dim_qliksense_adhoc-161x300.jpg 161w" sizes="(max-width: 249px) 100vw, 249px" /><figcaption>Условие вычисления измерения</figcaption></figure></div>



<p>Формула для вычисления (с использованием специальной переменной с параметром):</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">$(vAdHocFunc(Измерения,Год,Конструктор))</pre>



<p>Для Измерений условие будет выглядеть следующим образом (должно быть ОК):</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="942" height="630" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/formula_adhoc_report_dim_qliksense.jpg" alt="" class="wp-image-1206" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/formula_adhoc_report_dim_qliksense.jpg 942w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/formula_adhoc_report_dim_qliksense-300x201.jpg 300w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/formula_adhoc_report_dim_qliksense-768x514.jpg 768w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/formula_adhoc_report_dim_qliksense-360x240.jpg 360w" sizes="(max-width: 942px) 100vw, 942px" /></figure>



<p>Аналогично для показателей:</p>



<div class="wp-block-image"><figure class="aligncenter"><img loading="lazy" decoding="async" width="251" height="509" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/uslovie_measures_qliksense_adhoc.jpg" alt="" class="wp-image-1207" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/uslovie_measures_qliksense_adhoc.jpg 251w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/uslovie_measures_qliksense_adhoc-148x300.jpg 148w" sizes="(max-width: 251px) 100vw, 251px" /></figure></div>



<p>Формула:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">$(vAdHocFunc(Показатели,Продажи,Конструктор))</pre>



<p>Проверяем функцию (что отображается ОК):</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="984" height="609" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/formula_adhoc_report_measures_qliksense.jpg" alt="" class="wp-image-1208" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/formula_adhoc_report_measures_qliksense.jpg 984w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/formula_adhoc_report_measures_qliksense-300x186.jpg 300w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/formula_adhoc_report_measures_qliksense-768x475.jpg 768w" sizes="(max-width: 984px) 100vw, 984px" /></figure>



<h2 class="wp-block-heading">Как работать с конструктором отчетов Qlik Sense?</h2>



<p>Для того, чтобы отобразить нужные столбцы &#8211; выбираем измерения, показатели. Также можно отобразить данные по конкретному году, товару, клиенту (используйте верхние фильтры):</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1355" height="671" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/using_adhoc_report_konstruktor_otchetov_qliksense.jpg" alt="" class="wp-image-1210" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/using_adhoc_report_konstruktor_otchetov_qliksense.jpg 1355w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/using_adhoc_report_konstruktor_otchetov_qliksense-300x149.jpg 300w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/using_adhoc_report_konstruktor_otchetov_qliksense-768x380.jpg 768w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/using_adhoc_report_konstruktor_otchetov_qliksense-1024x507.jpg 1024w" sizes="(max-width: 1355px) 100vw, 1355px" /><figcaption>Пример: выбрал год, менеджера, подразделение, продажи и себестоимость</figcaption></figure>



<p>Для того, чтобы в отчете сохранить нужные настройки и всякий раз не выбирать измерения, показатели, можно создать множество закладок с выборками <strong>Измерение</strong> и <strong>Показатели</strong>. Для этого сверху кликните на значок <strong>&#8220;Закладка&#8221;</strong> и нажмите кнопку создать закладку: </p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1365" height="698" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/adhoc_zakladki_qliksense_konstruktor_otchetov.jpg" alt="" class="wp-image-1211" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/adhoc_zakladki_qliksense_konstruktor_otchetov.jpg 1365w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/adhoc_zakladki_qliksense_konstruktor_otchetov-300x153.jpg 300w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/adhoc_zakladki_qliksense_konstruktor_otchetov-768x393.jpg 768w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/adhoc_zakladki_qliksense_konstruktor_otchetov-1024x524.jpg 1024w" sizes="(max-width: 1365px) 100vw, 1365px" /><figcaption>Создание закладки-отчета в Qlik Sense в приложении Конструктор Отчетов</figcaption></figure>



<p>Теперь Вы сможете быстро выбрать из списка нужный Вам отчет. При этом Ваши коллеги смогут создавать отчеты, которые необходимы им независимо от Вас. Для активации закладки нужно кликнуть на значок <strong>&#8220;Закладки&#8221;</strong> и активировать нужный отчет.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1024" height="191" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/qliksense_bookmarks_adhoc_report-1024x191.jpg" alt="" class="wp-image-1212" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/qliksense_bookmarks_adhoc_report-1024x191.jpg 1024w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/qliksense_bookmarks_adhoc_report-300x56.jpg 300w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/qliksense_bookmarks_adhoc_report-768x144.jpg 768w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/qliksense_bookmarks_adhoc_report.jpg 1348w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Как выбрать уже созданную закладку с настройками отчета</figcaption></figure>



<h3 class="wp-block-heading">Дополнительные настройки конструктора отчетов Qlik Sense</h3>



<p>В настройках таблицы переходим на вкладку дополнительно и прописываем следующее:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1024" height="499" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/nastroika_adhoc_reports_qliksense-1024x499.jpg" alt="" class="wp-image-1215" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/nastroika_adhoc_reports_qliksense-1024x499.jpg 1024w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/nastroika_adhoc_reports_qliksense-300x146.jpg 300w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/nastroika_adhoc_reports_qliksense-768x375.jpg 768w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/nastroika_adhoc_reports_qliksense.jpg 1263w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Дополнительные условия отображения</figcaption></figure>



<p><strong>1. Снимаем галочку</strong></p>



<p><strong>2. Ставим условие для расчета таблицы</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">if(GetSelectedCount([Измерения],False(),'Конструктор') and GetSelectedCount([Показатели],False(),'Конструктор'),1,0)</pre>



<p><strong>3. Прописываем сообщение для пользователей</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Выберите, пожалуйста, измерения и показатели</pre>



<h2 class="wp-block-heading">Скачать приложение &#8220;Конструктор отчетов Qlik Sense&#8221; со всеми формулами</h2>



<p>Ссылка на скачивание приложения <strong>Qlik Sense</strong>. Буду благодарен, если поделитесь ссылками в социальных сетях на статью <img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<div class="wp-block-file"><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/AdHocAdvanced.qvf_.zip"><strong><span style="color:#005104" class="tadv-color">AdHoc Report Qlik Sense Advanced (Конструктор отчетов).qvf</span></strong></a><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/AdHocAdvanced.qvf_.zip" class="wp-block-file__button" download><strong>Скачать</strong></a></div>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/qlik-sense-report-designer-adhoc-flexible-report-with-dimension-and-metrics/">Конструктор отчетов Qlik Sense. AdHoc Reporting. Гибкий отчет с измерениями и показателями</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://qliksense.ivan-shamaev.ru/qlik-sense-report-designer-adhoc-flexible-report-with-dimension-and-metrics/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Этапы проекта Qlik Sense. Краткий обзор состава работ по проекту</title>
		<link>https://qliksense.ivan-shamaev.ru/etapi-proekta-qlik-sense-sostav-rabot-vnedrenie/</link>
					<comments>https://qliksense.ivan-shamaev.ru/etapi-proekta-qlik-sense-sostav-rabot-vnedrenie/#respond</comments>
		
		<dc:creator><![CDATA[qliksense-expert]]></dc:creator>
		<pubDate>Tue, 18 Jun 2019 20:57:30 +0000</pubDate>
				<category><![CDATA[Уровень 1]]></category>
		<category><![CDATA[Qlik]]></category>
		<category><![CDATA[Qlik Project Steps]]></category>
		<category><![CDATA[qlik sense]]></category>
		<category><![CDATA[qliksense]]></category>
		<category><![CDATA[Состав работ по проекту Qlik]]></category>
		<category><![CDATA[Требования внедрение проект]]></category>
		<category><![CDATA[Этапы проекта Qlik Sense]]></category>
		<guid isPermaLink="false">https://qliksense.ivan-shamaev.ru/?p=1150</guid>

					<description><![CDATA[<p>Введение Qlik Project Steps Qlik Sense &#8211; очень гибкая платформа создания отчетности. В ней нет ограничений на количество приложений, на количество отчетов, количество данных. Вы можете создать 1 большое приложение с множеством различных отчетов, либо создать много приложений, в каждом из которых будет 1-2 сложных по структуре или логике отчета.<a class="moretag" href="https://qliksense.ivan-shamaev.ru/etapi-proekta-qlik-sense-sostav-rabot-vnedrenie/"> Читать дальше&#8230;</a></p>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/etapi-proekta-qlik-sense-sostav-rabot-vnedrenie/">Этапы проекта Qlik Sense. Краткий обзор состава работ по проекту</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Введение Qlik Project Steps</h2>



<p><strong>Qlik Sense</strong> &#8211; очень гибкая платформа создания отчетности. В ней нет ограничений на количество приложений, на количество отчетов, количество данных. Вы можете создать 1 большое приложение с множеством различных отчетов, либо создать много приложений, в каждом из которых будет 1-2 сложных по структуре или логике отчета. Все зависит от Ваших потребностей. Единственно что нужно учитывать &#8211; это затраты на поддержку решений.</p>



<p>Также можно создать приложение Qlik Sense, в котором в библиотеке задать нужные измерения и показатели, а пользователи будут сами создавать простые отчеты, графики, дашборды, аналитические панели.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1024" height="657" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/08/Phases_of_Project_Management_Qlik_Sense_Ivan_Shamaev-1024x657.png" alt="" class="wp-image-1588" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/08/Phases_of_Project_Management_Qlik_Sense_Ivan_Shamaev-1024x657.png 1024w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/08/Phases_of_Project_Management_Qlik_Sense_Ivan_Shamaev-300x192.png 300w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/08/Phases_of_Project_Management_Qlik_Sense_Ivan_Shamaev-768x493.png 768w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/08/Phases_of_Project_Management_Qlik_Sense_Ivan_Shamaev.png 1278w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Этапы создания модели Qlik Sense</h2>



<p><strong><span style="color:#005104" class="tadv-color">Рассмотрим основные этапы создания модели Qlik Sense:</span></strong></p>



<p>Краткая схема создания приложения выглядит следующим образом:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2224" height="2240" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/11/Qlik_Sense_OverView_ETL.png" alt="" class="wp-image-2063" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/11/Qlik_Sense_OverView_ETL.png 2224w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/11/Qlik_Sense_OverView_ETL-150x150.png 150w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/11/Qlik_Sense_OverView_ETL-298x300.png 298w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/11/Qlik_Sense_OverView_ETL-768x774.png 768w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/11/Qlik_Sense_OverView_ETL-1017x1024.png 1017w" sizes="(max-width: 2224px) 100vw, 2224px" /></figure>



<p><strong><span style="background-color: #ffff00;">1.</span> Для того, чтобы создать аналитическую модель (Отчет, дашборд и т.п.) изначально необходимо получить требования от заказчика (выявить основные потребности).</strong> Вы проводите встречу с заказчиком, на которой записываете основные его желания, затем, обрабатывая первичные требования Вы задаете уточняющие вопросы заказчику. <br>Очень часто заказчики опускают нужные подробности, которые могут помочь в решении задачи. Делают они это зачастую не умышленно, а потому что для них это очевидно (каждый день с этим работают).</p>
<p>Иногда заказчик может опираться на вымышленные сущности, которых нет в учетных системах, либо они ведутся там очень и очень криво. Это все может привести к тому, что на пол пути Вы поймете, что разрабатываемый отчет довести до конца не получится. И ладно, если Вы на этот отчет потратили пол дня, а если Вы уже 2 недели что-то делаете и приходите в тупик?</p>
<p>Иногда заказчик хочет получить отчет, который можно получить из учетной системы. Он уже там есть, только заказчик про это не знает.</p>
<p><strong>Еще 1 совет</strong> &#8211; всегда стремитесь избегать в своей работе с данными, которые пользователи ведут в Excel! На этапе выявления требований стремитесь заставить заказчика отказаться от excel, Хотя бы в сторону MS Access. Ну или обязать заказчика разработать жесткую форму для ведения данных с проверками.</p>
<p><strong><span style="background-color: #ffff00;">2.</span> Дальше начинается работа с источниками данных.</strong> В идеале сначала проводится краткий аудит учетных систем на предмет того, как вводятся данные.</p>
<p>На этом этапе необходимо проработать перечень источников из которых Вы будете выгружать данные. Для этих работ целесообразно привлекать системных аналитиков или разработчиков учетных систем, которые знакомы со структурой базы данных, могут помочь написать тот или иной запрос. Иначе Вам придется самостоятельно изучить в лучшем случае документацию, в худшем случае учетную систему (со всеми ее странностями и кастомизациями).</p>
<p>На этом этапе необходимо проверить наличие в справочниках нужных атрибутов (согласно требованиям), наличие фактов, смоделировать (например в Excel) расчеты, которые нужно получить в рамках аналитической модели.<br>Для снижения риска проекта по Qlik Sense рекомендую делать на предварительной стадии прототип модели на очень ограниченном объеме данных, проверить структуру модели, те или иные гипотезы. <strong>Внимание:</strong> самое важное на первом и втором этапах не уйти глубоко в детали и не выдумать из небольшого, быстрого и полезного проекта <strong>ОГРОМНОГО МОНСТРА</strong>.</p>
<p>В ходе второго этапа (при аудите учетных систем) уточняется ТЗ и разрабатывается план проекта.</p>
<p><strong><span style="background-color: #ffff00;">3.</span>Выстраиваем структуру окружения QS Проекта на Windows Сервере. </strong>Если в рамках проекта планируется использовать <strong>Qlik Sense Desktop</strong> &#8211; то требуется одна архитектура организации окружения (с привлечением QlikView Desktop), если <strong>Qlik Sense Enterprice</strong> &#8211; то другая архитектура.</p>
<p>Здесь необходимо создать каталог папок, в которых будут храниться приложения/скрипты .qvs для выгрузки данных (Extractor),&nbsp; приложения/скрипты .qvs для трансформации данных (Transform), приложения/скрипты .qvs для сборки QVD для конечных аналитических приложений.</p>
<p><strong>Возможная структура папок для хранения QVD-файлов:</strong></p>
<ul style="list-style-type: circle;">
<li><span style="background-color: #ebebeb;"><strong>DataSource</strong></span><br>
<ul style="list-style-type: square;">
<li><strong>RawQVD</strong> &#8211; по каждой системе создается отдельная папка в директории RawQVD и в нее выгружаются таблицы.</li>
<li><strong>RawFiles </strong>&#8211; В этой директории хранятся файлы, которыми управляет отдел Qlik Sense. Это могут быть файлы с настройками, временные справочники Excel, специфические меппинги.</li>
<li><strong>DataTier1 </strong>&#8211; в этой директории находятся файлы QVD, которые прошли первичную обработку в процессах обработки данных. На этом этапе в документы добавляются товары, в справочники добавляются различные атрибуты, флаги. Производится расшифровка перечислений (например, для 1С Предприятия) и т.д. Обычно в DataTier1 данные хранятся также по папкам с названиями систем учета.</li>
<li><strong>DataTier2 </strong>&#8211; Агрегированные данные на основе данных DataTier1 из нескольких источников данных. Здесь QVD файлы группируются по тематике, например, продажи, остатки и т.д.</li>
<li><strong>DataTier3 </strong>&#8211;&nbsp;</li>
</ul>
</li>
</ul>
<p><strong><span style="background-color: #ffff00;">4.</span> На четвертом этапе идет основная работа с данными.</strong> Строится процесс выгрузки данных из источников. Это может быть одна база данных или несколько баз данных. При этом в качестве источника данных может выступать облачный сервис (<strong>bitrix24, amocrm, мойсклад</strong> и т.п.).</p>
<p><strong><span style="background-color: #ffff00;">4.1.</span> Разработка Extractor на Qlik</strong><br><strong></strong></p>
<p><strong>Виды Extractor (выгрузки)</strong></p>
<ol>
<li><strong>Выгрузка полной таблицы из базы данных и сохранение в формате QVD.</strong> Подходит для источников данных с небольшим объемом данных (нужно учитывать скорость наполнения базы данных, при этом объем транзакций год из года приростает), справочников из ERP систем. Данные выгружаются 1 в 1 с минимальными преобразованиями форматов, без агрегирования и доп.расчетов.</li>
<li><strong>Инкрементальная выгрузка данных из DataBase учетных систем.</strong> Здесь не всегда так просто. <strong>Во-первых,</strong> в учетной системе должны каким-то образом помечаться измененные записи, а также должна быть дата создания сущности. Для таких целей подойдут поля <em><strong>[Дата создания]</strong></em> и <em><strong>[Дата модификации]</strong></em>. Если нет полей, по которым можно было бы установить список измененных сущностей (документов, проводок), то придется делать инкрементальную загрузку по периодам (т.е. принимать, что данные в старом периоде, например, которые создавались больше года или полугода назад не изменяются). И перегружать только скользящий период год или полгода.<br>Почитать про инкрементальную загрузку можно здесь <a href="https://ivan-shamaev.ru/practical-issues-in-qlikview-part-2/#___Incremental_Load" target="_blank" rel="noopener noreferrer">https://ivan-shamaev.ru/practical-issues-in-qlikview-part-2/#___Incremental_Load</a><br><strong>Во-вторых,</strong> придется всегда иметь возможность выгрузить систему полностью (на случай, если все данные &#8220;испортились&#8221; по каким-то чрезвычайным причинам).<br><strong>В-третьих,</strong> инкрементальная загрузка требует больших трудозатрат в поддержке и разработке (но она дает выигрыш в скорости).</li>
</ol>
<p>Очень часто обычную и инкрементальную выгрузку данных комбинируют. Самые большие данные переводят на инкремент, данные не критичные &#8211; выгружают в полном объеме.</p>
<p><strong><span style="background-color: #ffff00;">4.2.</span> </strong>Итак, после того, как Вы выгрузили данные из базы данных или облачного сервиса в QVD файлы, затем необходимо эти данные обработать (очистить, рассчитать показатели, агрегировать, обогатить дополнительными атрибутами, разметить флагами и т.д.) и положить обработанные данные в отдельный слой (например, <strong>DataTier1</strong>). Эти трансформированные данные Вы загружайте непосредственно в саму модель Qlik Sense или создаете ещё один дополнительный слой данных со сложными расчетами для конкретной модели данных.</p>
<p>Самое главное &#8211; не дублировать одинаковые данные в слоях. При повышении уровня слоя данные должны агрегироваться (группироваться). Нижние слои являются более общими, верхние слои &#8211; конкретно для каждой модели данных (или по направлениям анализа).</p>
<p><strong><span style="background-color: #ffff00;">5.</span> Проектируем слои приложения.</strong> Вот пример структуры аналитического приложения Qlik Sense:</p>
<ul>
<li>Дашборд (KPI, тренды, сигналы)</li>
<li>Слой-аналитика (графики, диаграммы, пузырьки и т.п.)</li>
<li>Слой-гибкий анализ / конструктор отчетов (Ad-hoc анализ)</li>
<li>Слой детальные данные (Таблицы и сводные таблицы, подсвечиваемые поля, статические отчеты)</li>
</ul>
<p><strong>Лайфхак для прототипирования в небольших проектах:</strong> В качестве инструмента прототипирования для визуализации можно использовать сам Qlik Sense. При этом сложные вычисления Вы не прописываете, а заменяете константами. При этом Ваш прототип будет максимально приближен к функциональности конечного продукта <img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p><strong>Пример прототипа на Qlik Sense:</strong></p>
<p><img loading="lazy" decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/prototip_qliksense_project.jpg" alt="" width="1365" height="603" class="aligncenter size-full wp-image-1317" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/prototip_qliksense_project.jpg 1365w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/prototip_qliksense_project-300x133.jpg 300w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/prototip_qliksense_project-768x339.jpg 768w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/prototip_qliksense_project-1024x452.jpg 1024w" sizes="(max-width: 1365px) 100vw, 1365px" /></p>
<p><strong><span style="background-color: #ffff00;">6.</span> Успешность проекта</strong> зависит от правильности организации по нескольким направлениям -данные, скрипты (написание, комментарии и т.д.), организация ETL, методологии расчетов:</p>
<ul>
<li><strong>Качество данных</strong> &#8211; качество любого аналитического приложения в первую очередь зависит от того, насколько хорошо выстроены процессы фиксирования данных в учетных системах. Если в системах много дублей, много криво заполненных справочников, есть пустые документы, не проставлены те или иные атрибуты в справочниках, то очень много усилий придется потратить на то, чтобы собрать полноценную аналитическую модель с минимальными погрешностями в расчетах.</li>
<li><strong>Качество методологий учета, расчетов</strong> &#8211; прежде чем разрабатывать сложную модель для анализа или исследования данных, необходимо (хотя бы кратко) описать методологию расчетов. Можно все расчеты спроектировать в Excel и отдать его разработчику (иногда это самый подходящий и быстрый вариант). <br><strong>Что такое методология расчета?</strong> В первую очередь под этим я понимаю описание расчета того или иного показателя. Как в процессе расчета осуществляются группировки, как обрабатываем нули, как округлять данные, как обрабатывать деление на ноль и т.п. вопросы.<br>В случае расчета <strong>суммы продаж</strong> методология расчета не требуется, а вот в случае <strong>расчета сопоставимых продаж за период (Like-For-Like)</strong> &#8211; требуется, т.к. возникает очень много вопросов. Или например как посчитать <strong>ROI по мероприятию или по акции</strong>. Самым лучшим решением &#8211; это когда бизнес-пользователь проделывает в Excel расчеты руками на одном клиенте, 1 акции (т.е. берет ограниченный объем данных и на нем строит модель, корректирует методику, делает проверку, утверждает ее со своим руководством или владельцем бизнеса и только потом отдает на автоматизацию расчетов). Но этот идеальный случай встречается редко и зависит от вменяемости бизнес-пользователя.</li>
<li><strong>Качество окружения QS (скрипты, изменения, аудит изменений, анализ загрузки ресурсов и т.д.)</strong> &#8211; от того, насколько правильно структурировано пространство QS, зависят накладные расходы на поддержку решения Qlik Sense. Очень важно оставлять комментарии в скриптах, создать инструмент для отслеживания процессов загрузки данных. Если сразу придерживаться строгих правил порядка, то потом при быстром масштабировании Вам будет легче управлять всей инфраструктурой.</li>
</ul>



<h2 class="wp-block-heading">Qlik Deployment Framework</h2>



<div class="wp-block-file"><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/07/Qlik_Deployment_Framework_QlikView_Development_Guide.pdf">Qlik Deployment Framework QlikView Development Guide </a><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/07/Qlik_Deployment_Framework_QlikView_Development_Guide.pdf" class="wp-block-file__button" download>Скачать</a></div>



<h2 class="wp-block-heading">Размышления консультанта &#8220;ВСЛУХ&#8221;</h2>



<p><em>Возможно кому-то мои рассуждения покажутся &#8220;водой&#8221;, возможно кто-то сделает заметку, кто-то пройдет мимо, кто-то добавит в комментариях свои мысли. Главное &#8211; это просто мысли, мои заметки, которыми я хочу поделиться.</em></p>
<h3>Об отчетах</h3>
<p>В компании может быть все плохо, но отчеты об этом могут не говорить. Истинные проблемы начинают всплывать, когда компания начинает генерировать убытки.</p>
<p>В компании может быть 1-3 отчета и из них может быть многое понятно о текущих делах. А может быть десятки отчетов, из которых ничего не понятно (куда смотреть, с чем нужно работать, куда прикладывать усилия). Для работы с отчетами в таких случаях требуется штат аналитиков, которые будут сидеть и обрабатывать автоматически рассылаемые отчеты.</p>
<p>Направление аналитики должно спускаться сверху, причем именно верхнеуровневые показатели должны показываться руководству с графическими представлениями. Руководитель должен открыть дашборд или отчет и дать указание подчиненным руководителям или линейным сотрудникам, что необходимо улучшить в компании. Или какой фронт работы выполнить.</p>
<h3>Качество приложения Qlik Sense</h3>
<p><strong>Качество приложения Qlik Sense</strong> зависит напрямую от качества ваших учетных данных. Очень хорошие данные (структурированные, без мусора, без дублирования, без двоякости и т.п.) = <strong>ОТЛИЧНОЕ ПРИЛОЖЕНИЕ QLIK SENSE.</strong></p>
<p>Очень плохое качество данных (пропуски, дублирование, кривая инфа, несоответствия, пустоты, кривые справочники, кривые документы, 100500 способов представления одних и тех же отчетов, но с разными значениями) &#8211; <strong>ужасная аналитика, ужасный ETL, ужасное приложение, ужасный ROI от бизнес-аналитики?</strong></p>
<h3>Куча рассылаемых отчетов Excel &#8211; интерес руководителей, но не владельцев компании</h3>
<p><span style="font-size: inherit;">Согласитесь, что подделать сложный / запутанный отчет гораздо проще, чем манипулировать данными аналитических панелей. Любая прозрачность данных &#8220;больного бизнеса&#8221; &#8211; это риск для среднего и высшего руководства компании. Они понимают, что владельцы сразу же придут к ним, если у владельца будет под рукой удобный аналитический инструмент. </span></p>
<p>Исходя из этих предпосылок, можно предположить, что руководство (не владельцы) никогда не будут заинтересованы в разработке прозрачных дашбордов, с понятными и простыми сигналами &#8220;что не так&#8221; и &#8220;что нужно делать&#8221;. Они будут заинтересованы только в том, чтобы максимально неудобно представить данные, из которых сложно сделать &#8220;нужные выводы&#8221;.</p>
<p>Скорей всего это связано с тем, что люди, которые ставят ТЗ на разработку отчетов не имеют премий от прибыли компании, или от снижения издержек. Самая главная их задача &#8211; на совещаниях с умными лицами презентовать очередную порцию &#8220;умных отчетов&#8221;, чтобы их ценили за объемы аналитической работы.</p>
<p>Запомните &#8211; владельцам бизнеса нужен сигнал (светофор), чтобы понять, нужно ли кого-то пнуть, чтобы красный свет загорелся хотя бы на желтый, а в лучшем случае на зеленый.</p>
<p>Построить такой отчет очень сложно, т.к. нужно думать, гораздо проще придумать мудренную Excel с кучей столбцов и строк, которые зачастую между собой никак не коррелируют.</p>
<h3>Создавайте базу знаний о бизнес-процессах в компании, делайте внутреннюю wiki</h3>
<p>Очень часто и в разных компаниях видел ТЗ, в которых присутствует огромная куча различной терминологии, сокращений, формул, которые никак не расшифровываются и не поясняются развернуто.</p>
<p>Плюс очень часто в компании тот или иной бизнес-процесс может быть запутанным и нигде не описанным. Начиная разработку специалист шерстит всевозможные документы, письма, опрашивает коллег по тому или иному термину.</p>
<p>Приходит новый специалист и &#8220;исследовательская&#8221; работа повторяется снова.</p>
<p>Выход &#8211; создать внутреннюю базу знаний о бизнес-процессах в компании. Не называя имен компаний, я назову позитивные фишки, с которыми я встречался при устройстве в ту или иную компанию (ну или мои предположения, как это может выглядеть иначе в других компаниях):</p>
<ol>
<li>При выходе на работу Вам приходит ссылка на обзорный курс про особенности бизнеса (компании), особенности рынка. Описываются основные бизнес-процессы (укрупненным планом). Описываются основные бизнес-термины. После прохождения курса можно пройти более углубленный курс, например, по расчетам тех или иных показателей бизнеса.</li>
<li>Возможность поработать 1 день на передовой бизнеса (фронт-офис) или посетить демо фронт-офис, в котором &#8220;как в жизни&#8221; можно понять что и как происходит.</li>
<li>При выходе на работу в первый день Вам приходит ссылка на страницу в wiki, где в неформальном виде описана вся движуха в компании, отделы и т.п. Неформальный стиль изложения &#8211; легкость восприятия информации.</li>
<li>Схемы, блок-схемы, потоки данных &#8211; иными словами наглядность информации, что происходит в компании.</li>
<li>Наличии системы управления требованиями, культура написания ТЗ. Когда Вам приходится искать то или иное требование в почте &#8211; это самое плохое, что только можно представить. А еще хуже, когда часть находится в почте, часть в мессенджере, часть в системе управления проектами и т.д.</li>
<li>База знаний запросов к системам. Один раз написали запрос &#8211; сохранили в базу с осмысленным заголовком и описанием, дальше другой сотрудник может этим запросом воспользоваться (если у него есть доступ к БД).</li>
</ol>
<h3><span>Здравый смысл</span></h3>
<p>Оценивайте полученные результаты, показатели, отчеты на здравый смысл. Если Вы получили ROI = 500%, то очень вероятно стоит перепроверить (и желательно 2 раза) методику расчета показателя. Если показатель дает очень расплывчатый результат, то стоит ли этот показатель считать? Это как по популяции кроликов в южном округе оценивать спрос на мясо кроликов по стране. Проще потратить силы на отчет P&amp;L, и понять откуда приходят деньги и куда уходят, чем заниматься пространственной аналитикой.</p>
<p><strong>Методология расчета и реальная жизнь</strong></p>
<p>Просите методолога/заказчика на основе его алгоритма сделать предварительный расчет в Excel. Так Вы сможете оценить жизнеспособность методологии расчета.<br />Разработка отчета в Qlik = 60 часов (например), предварительный расчет в Excel = 4-8 часов (со сбором данных)</p>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/etapi-proekta-qlik-sense-sostav-rabot-vnedrenie/">Этапы проекта Qlik Sense. Краткий обзор состава работ по проекту</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://qliksense.ivan-shamaev.ru/etapi-proekta-qlik-sense-sostav-rabot-vnedrenie/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Простой календарь. Оптимизированный календарь. The Fastest Dynamic Calendar Qlik Sense</title>
		<link>https://qliksense.ivan-shamaev.ru/simple-advanced-calendar-fastest-dynamic-qliksense/</link>
					<comments>https://qliksense.ivan-shamaev.ru/simple-advanced-calendar-fastest-dynamic-qliksense/#comments</comments>
		
		<dc:creator><![CDATA[qliksense-expert]]></dc:creator>
		<pubDate>Tue, 11 Jun 2019 21:26:17 +0000</pubDate>
				<category><![CDATA[Уровень 1]]></category>
		<category><![CDATA[Calendar Qlik Sense]]></category>
		<category><![CDATA[Calendar QlikSense]]></category>
		<category><![CDATA[Fastest Dynamic Calendar]]></category>
		<category><![CDATA[qlik sense]]></category>
		<category><![CDATA[qlik календарь]]></category>
		<category><![CDATA[qliksense]]></category>
		<category><![CDATA[Календарь QlikSense]]></category>
		<category><![CDATA[Календарь Клик Сенс]]></category>
		<category><![CDATA[Календарь КликСенс]]></category>
		<category><![CDATA[Классический календарь Qlik Sense]]></category>
		<category><![CDATA[Оптимизированный календарь]]></category>
		<category><![CDATA[Простой календарь]]></category>
		<guid isPermaLink="false">https://qliksense.ivan-shamaev.ru/?p=1117</guid>

					<description><![CDATA[<p>Простой (классический) календарь Клик Сенс / Qlik Sense В рамках простого календаря Qlik Sense находится минимальная и максимальная даты и в цикле while создается календарь. Пример кода скрипта для создания календаря QlikSense: Результат работы скрипта: Оптимизированный календарь (ускоренное создание при большой таблице фактов). Advanced Calendar Тот же самый календарь, но<a class="moretag" href="https://qliksense.ivan-shamaev.ru/simple-advanced-calendar-fastest-dynamic-qliksense/"> Читать дальше&#8230;</a></p>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/simple-advanced-calendar-fastest-dynamic-qliksense/">Простой календарь. Оптимизированный календарь. The Fastest Dynamic Calendar Qlik Sense</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Простой (классический) календарь Клик Сенс / Qlik Sense</h2>



<p>В рамках простого календаря Qlik Sense находится минимальная и максимальная даты и в цикле while создается календарь.</p>



<p>Пример кода скрипта для создания календаря QlikSense:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// Получаем из таблицы фактов минимальную и максимальную даты
[TEMP Максимальная Минимальная Дата]:
LOAD min(Дата) 		As [Минимальная Дата],
     max(Дата) 		As [Максимальная Дата]
Resident [Таблица фактов];

// Минимальную и максимальную даты помещаем в переменные, 
// для того, чтобы использовать их в условии While
Let пНачалоКалендаря_Число 	  = Num(Peek('Минимальная Дата', 0, 'TEMP Максимальная Минимальная Дата'));
Let пОкончаниеКалендаря_Число = Num(Peek('Максимальная Дата', 0, 'TEMP Максимальная Минимальная Дата'));

// Удаляем временную таблицу
DROP Table [TEMP Максимальная Минимальная Дата];  

// Создаем набор дат в промежутке от минимальной до максимальной даты
[TEMP Набор дат в интервале MinDate - MaxDate]:  
LOAD 
     Date($(пНачалоКалендаря_Число) + IterNo() - 1) as [TEMP Дата]
AutoGenerate 1
While $(пНачалоКалендаря_Число) + IterNo() -1 &lt;= $(пОкончаниеКалендаря_Число);  

// Формируем таблицу с календарем в моделе Qlik Sense
[Простой календарь QS]:  
Load 
     Date([TEMP Дата]) 													As Дата,
     Date([TEMP Дата],'DD MMMM YYYY')									As [Дата длинный месяц],
     Text(Date([TEMP Дата],'WWWW MMM YYYY'))							As [День недели МесяцГод],
     'Кв'&amp; Ceil(Num(Month([TEMP Дата]))/3)								As Квартал,
     'Кв'&amp; Ceil(Num(Month([TEMP Дата]))/3) &amp; '-' &amp; Year([TEMP Дата]) 	As КварталГод,
     Text(Date([TEMP Дата],'YYYY.MM')) 									As [Год Месяц],
     Text(Date([TEMP Дата],'MMM YYYY')) 								As [Месяц Год],
     Year([TEMP Дата]) 													As Год,
     Year([TEMP Дата])&amp;'.'&amp;Week([TEMP Дата])							As [Год Неделя],
     Week([TEMP Дата])													As Неделя,
     Day([TEMP Дата])													As День
Resident [TEMP Набор дат в интервале MinDate - MaxDate];

Drop Table [TEMP Набор дат в интервале MinDate - MaxDate];</pre>



<p>Результат работы скрипта:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1186" height="533" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/simple_calendar_qliksense_ivan_shamaev_example_script_code.jpg" alt="" class="wp-image-1125" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/simple_calendar_qliksense_ivan_shamaev_example_script_code.jpg 1186w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/simple_calendar_qliksense_ivan_shamaev_example_script_code-300x135.jpg 300w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/simple_calendar_qliksense_ivan_shamaev_example_script_code-768x345.jpg 768w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/simple_calendar_qliksense_ivan_shamaev_example_script_code-1024x460.jpg 1024w" sizes="(max-width: 1186px) 100vw, 1186px" /><figcaption>Пример скрипта Клик Сенс для создания простого календаря в модели данных аналитического приложения</figcaption></figure>



<h2 class="wp-block-heading">Оптимизированный календарь (ускоренное создание при большой таблице фактов). Advanced Calendar</h2>



<p>Тот же самый календарь, но для ускоренной загрузки (если большая таблица фактов):</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// Получаем из поля Дата минимальное и максимальное значения
[TEMP Максимальная Минимальная Дата]:
LOAD
     Min(FieldValue('Дата',RecNo())) 	As [Минимальная Дата],
     Max(FieldValue('Дата',RecNo())) 	As [Максимальная Дата]
AutoGenerate FieldValueCount('Дата');

// Минимальную и максимальную даты помещаем в переменные, 
// для того, чтобы использовать их в условии While
Let пНачалоКалендаря_Число 	  = Num(Peek('Минимальная Дата', 0, 'TEMP Максимальная Минимальная Дата'));
Let пОкончаниеКалендаря_Число = Num(Peek('Максимальная Дата', 0, 'TEMP Максимальная Минимальная Дата'));

// Удаляем временную таблицу
DROP Table [TEMP Максимальная Минимальная Дата];  

// Создаем набор дат в промежутке от минимальной до максимальной даты
[TEMP Набор дат в интервале MinDate - MaxDate]:  
LOAD 
     Date($(пНачалоКалендаря_Число) + IterNo() - 1) as [TEMP Дата]
AutoGenerate 1
While $(пНачалоКалендаря_Число) + IterNo() -1 &lt;= $(пОкончаниеКалендаря_Число);  

// Формируем таблицу с календарем в моделе Qlik Sense
[Простой календарь QS]:  
Load 
     Date([TEMP Дата]) 													As Дата,
     Date([TEMP Дата],'DD MMMM YYYY')									As [Дата длинный месяц],
     Text(Date([TEMP Дата],'WWWW MMM YYYY'))							As [День недели МесяцГод],
     'Кв'&amp; Ceil(Num(Month([TEMP Дата]))/3)								As Квартал,
     'Кв'&amp; Ceil(Num(Month([TEMP Дата]))/3) &amp; '-' &amp; Year([TEMP Дата]) 	As КварталГод,
     Text(Date([TEMP Дата],'YYYY.MM')) 									As [Год Месяц],
     Text(Date([TEMP Дата],'MMM YYYY')) 								As [Месяц Год],
     Year([TEMP Дата]) 													As Год,
     Year([TEMP Дата])&amp;'.'&amp;Week([TEMP Дата])							As [Год Неделя],
     Week([TEMP Дата])													As Неделя,
     Day([TEMP Дата])													As День
Resident [TEMP Набор дат в интервале MinDate - MaxDate];

Drop Table [TEMP Набор дат в интервале MinDate - MaxDate];</pre>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/simple-advanced-calendar-fastest-dynamic-qliksense/">Простой календарь. Оптимизированный календарь. The Fastest Dynamic Calendar Qlik Sense</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://qliksense.ivan-shamaev.ru/simple-advanced-calendar-fastest-dynamic-qliksense/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Основы работы со временем. Примеры Топ функций по работе с timestamp. Хранение Time в QlikSense</title>
		<link>https://qliksense.ivan-shamaev.ru/basics-time-timestamp-functions-examples-cases-qlik-sense/</link>
					<comments>https://qliksense.ivan-shamaev.ru/basics-time-timestamp-functions-examples-cases-qlik-sense/#respond</comments>
		
		<dc:creator><![CDATA[qliksense-expert]]></dc:creator>
		<pubDate>Thu, 06 Jun 2019 05:47:56 +0000</pubDate>
				<category><![CDATA[Уровень 1]]></category>
		<category><![CDATA[qlik sense]]></category>
		<category><![CDATA[Qlik Sense для чайников]]></category>
		<category><![CDATA[qliksense]]></category>
		<category><![CDATA[timestamp]]></category>
		<category><![CDATA[дата время]]></category>
		<category><![CDATA[интервал времени Qlik Sense]]></category>
		<category><![CDATA[кликсенс]]></category>
		<category><![CDATA[разница по времени Qlik]]></category>
		<category><![CDATA[функции времени]]></category>
		<category><![CDATA[хранение времени в Qlik Sense]]></category>
		<guid isPermaLink="false">https://qliksense.ivan-shamaev.ru/?p=1105</guid>

					<description><![CDATA[<p>Хранение форматов TimeStamp и Time в Qlik Sense Использование формата Time и Timestamp в задачах бизнес-аналитики встречается не так часто, как задачи с датами. Однако, если такая задача появляется, то появляется очень много вопросов как сделать то или иное преобразование. В предыдущей главе учебника я описывал как хранится формат timestamp<a class="moretag" href="https://qliksense.ivan-shamaev.ru/basics-time-timestamp-functions-examples-cases-qlik-sense/"> Читать дальше&#8230;</a></p>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/basics-time-timestamp-functions-examples-cases-qlik-sense/">Основы работы со временем. Примеры Топ функций по работе с timestamp. Хранение Time в QlikSense</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Хранение форматов TimeStamp и Time в Qlik Sense</h2>



<p>Использование формата <strong>Time </strong>и <strong>Timestamp </strong>в задачах бизнес-аналитики встречается не так часто, как задачи с датами. Однако, если такая задача появляется, то появляется очень много вопросов как сделать то или иное преобразование.</p>



<p>В предыдущей главе учебника я описывал как хранится формат timestamp (из чего он состоит). В этом разделе я опишу дополнительно с помощью каких функций можно работать со значениями Time и Timestamp.</p>



<p>Итак, как мы выяснили раньше <strong>Timestamp </strong>&#8211; это дробное число, в котором целая часть &#8211; это <strong>дата</strong>, а дробная часть &#8211; это <strong>время </strong>(т.е. time). <strong>Все число</strong> &#8211; это дата время или timestamp.</p>



<p>Рассмотрим результат работы функции <strong>Now()</strong> и функций, которые изменяют либо формат отображения данных, либо само число:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1318" height="196" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/time_timestamp_qlik_sense_format_now_time_num_frac.jpg" alt="" class="wp-image-1141" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/time_timestamp_qlik_sense_format_now_time_num_frac.jpg 1318w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/time_timestamp_qlik_sense_format_now_time_num_frac-300x45.jpg 300w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/time_timestamp_qlik_sense_format_now_time_num_frac-768x114.jpg 768w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/06/time_timestamp_qlik_sense_format_now_time_num_frac-1024x152.jpg 1024w" sizes="(max-width: 1318px) 100vw, 1318px" /><figcaption>Qlik Sense Timestamp &amp; Time &#8211; результат преобразования различных функций</figcaption></figure>



<table width="457" style="width: 100%; height: 262px;">
<tbody>
<tr style="height: 27px;">
<td width="322" style="width: 67.2414%; height: 27px;"><strong>Now()</strong></td>
<td width="135" style="width: 31.3793%; height: 27px;">16.06.2019 15:03:57</td>
</tr>
<tr style="height: 27px;">
<td style="width: 67.2414%; height: 27px;"><strong>Num(Now())</strong></td>
<td style="width: 31.3793%; height: 27px;">43632,627743056</td>
</tr>
<tr style="height: 27px;">
<td style="width: 67.2414%; height: 27px;"><strong>Time(Now())</strong></td>
<td style="width: 31.3793%; height: 27px;">15:03:57</td>
</tr>
<tr style="height: 27px;">
<td style="width: 67.2414%; height: 27px;"><strong>Num(Time(Now()))</strong></td>
<td style="width: 31.3793%; height: 27px;">43632,627743056</td>
</tr>
<tr style="height: 50px;">
<td style="width: 67.2414%; height: 50px;"><strong>Time#(Now(),&#8217;DD.MM.YYYY h:mm:ss[.fff]&#8217;)</strong></td>
<td style="width: 31.3793%; height: 50px;">16.06.2019 15:03:57</td>
</tr>
<tr style="height: 50px;">
<td style="width: 67.2414%; height: 50px;"><strong>Num(Time#(Now(),&#8217;DD.MM.YYYY h:mm:ss[.fff]&#8217;))</strong></td>
<td style="width: 31.3793%; height: 50px;">0,627743056</td>
</tr>
<tr style="height: 27px;">
<td style="width: 67.2414%; height: 27px;"><strong>Frac(Now())</strong></td>
<td style="width: 31.3793%; height: 27px;">0,627743056</td>
</tr>
<tr style="height: 27px;">
<td style="width: 67.2414%; height: 27px;"><strong>Time(Frac(Now()))</strong></td>
<td style="width: 31.3793%; height: 27px;">15:03:57</td>
</tr>
</tbody>
</table>



<p>Изменение в дробной части влияет на время, изменение в целой части влияет на дату. Если Вам необходимо придумать модель Qlik Sense, в которой будет хитрым образом обрабатываться время &#8211; этих знаний будет достаточно для того, чтобы &#8220;изобрести&#8221; нужный Вам алгоритм.</p>



<h2 class="wp-block-heading">Топ функций в Qlik Sense для работы со временем</h2>



<p><strong>1. Now() &#8211;&nbsp;</strong>возвращает текущую Дату и текущее время (отображается в соответствии с системной переменной <span style="color: #008000; background-color: #ffff99;"><em><strong>SET TimestampFormat=&#8217;DD.MM.YYYY h:mm:ss[.fff]&#8217;;</strong></em></span> см. вкладку <strong>Main</strong> в скрипте).</p>
<p><strong>2. Time() и Time#() &#8211;&nbsp;</strong>аналог <em>Date()</em> и <em>Date#()</em>, только для времени). Time влияет только на отображение данных в модели, т.е. влияет только на формат отображения числа. <strong>Time#</strong> &#8211; сообщает Qlik в каком формате данные поступают на вход функции, результатом будет дробная часть (если формат определен корректно).</p>
<p><strong>3. Frac() и Num()&nbsp;</strong>&#8211; Frac() оставляет от числа с дробной частью только дробную часть, т.е. остается часть со временем. Num() меняет формат отображения дата время на числовой формат (см. пример вверху).&nbsp;</p>
<p><strong>4. ReloadTime()</strong></p>
<p><strong>5. MakeTime()</strong></p>
<p><strong>6. ConvertToLocalTime()</strong></p>
<p><strong>7. FileTime() &#8211;</strong> с помощью этой функции в скрипте можно получить дату и время обновления файла. Пример получения даты и времени обновления файла qvd:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Let vFileDateTimeModified = FileTime('C:\QlikSenseProject\SourceData\QVD\РегистрПродаж.qvd');</pre>
<p><strong>8. Timestamp() и Timestamp#()</strong></p>
<p><strong>9. Interval()</strong></p>



<h2 class="wp-block-heading">Примеры (кейсы) по работе с форматом Time &amp; TimeStamp</h2>



<h3 class="wp-block-heading">Qlik Sense &amp; MakeTime: Минута &#8211; Час в числовом выражении</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">MakeTime(0,1) = 0:01:00					//1 минута
Frac(MakeTime(0,1)) = 0,000694444		//1 минута в числовом выражении
Frac(MakeTime(0,1))*60 = 0,041666667	//1 час в числовом выражении
Frac(MakeTime(0,1))*60*24 = 1			//1 день = 1 в числовом выражении</pre>



<h3 class="wp-block-heading">Округление дата + время = TimeStamp до минуты</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Now()
Num(Now())
TimeStamp(Num(time(frac(floor(Now(),1/1440)),'hh:mm'))+floor(Now()))
Num(time(frac(floor(Now(),1/1440)),'hh:mm'))+floor(Now())</pre>



<p>Результат работы формул:</p>



<figure class="wp-block-video"><video autoplay controls loop src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/11/qliksense_qlikview_timestamp_okruglenie_do_minuti.mp4"></video></figure>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/basics-time-timestamp-functions-examples-cases-qlik-sense/">Основы работы со временем. Примеры Топ функций по работе с timestamp. Хранение Time в QlikSense</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://qliksense.ivan-shamaev.ru/basics-time-timestamp-functions-examples-cases-qlik-sense/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/11/qliksense_qlikview_timestamp_okruglenie_do_minuti.mp4" length="382725" type="video/mp4" />

			</item>
		<item>
		<title>PHP: Запись данных из скрипта Qlik Sense в MySQL</title>
		<link>https://qliksense.ivan-shamaev.ru/php-writing-data-from-a-qlik-sense-script-to-mysql/</link>
					<comments>https://qliksense.ivan-shamaev.ru/php-writing-data-from-a-qlik-sense-script-to-mysql/#respond</comments>
		
		<dc:creator><![CDATA[qliksense-expert]]></dc:creator>
		<pubDate>Wed, 22 May 2019 11:57:41 +0000</pubDate>
				<category><![CDATA[Qlik Sense Блог]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php & qlik sense]]></category>
		<category><![CDATA[qlik sense]]></category>
		<category><![CDATA[qliksense]]></category>
		<category><![CDATA[кликсенс]]></category>
		<guid isPermaLink="false">https://qliksense.ivan-shamaev.ru/?p=1040</guid>

					<description><![CDATA[<p>Привет! В этой статье я приведу пример PHP скрипта, который можно использовать для записи данных (каких то параметров) в базу данных MySQL. Для того, чтобы вызвать php-скрипт, его необходимо разместить на сайте или IIS сервере. Вызов из скрипта Qlik Sense осуществляется следующим образом: Замечание: в URL адресе не должно быть<a class="moretag" href="https://qliksense.ivan-shamaev.ru/php-writing-data-from-a-qlik-sense-script-to-mysql/"> Читать дальше&#8230;</a></p>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/php-writing-data-from-a-qlik-sense-script-to-mysql/">PHP: Запись данных из скрипта Qlik Sense в MySQL</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Привет!</p>



<p>В этой статье я приведу пример PHP скрипта, который можно использовать для записи данных (каких то параметров) в базу данных MySQL.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="php" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;?php

	//Получаем переменные из URL запроса
	if (isset($_GET['field1']) and isset($_GET['field2']) and isset($_GET['field3'])) {
		$field1 	= htmlspecialchars($_GET["field1"]);
		$field2 	= htmlspecialchars($_GET["field2"]);
		$field3 	= htmlspecialchars($_GET["field3"]);
	}
	else {
		err();
	}                                             

	// Задаем коннекшн
	mysql_connect('ip_server_adress', 'login', 'password');
	//Устанавливаем несколько кодировок, иногда чего-то нехватает, лучше перестраховаться множеством установок
	mysql_query("set collation_connection = 'utf8_general_ci'");
	mysql_query("set character_set_client='utf8'");
	mysql_query("set character_set_results='utf8'");
	mysql_query("set character_set_system='utf8'");
	mysql_query('SET names=utf8');
	mysql_select_db('database_name');

	header('Content-Type: text/csv; charset=utf-8');
	header('Content-Disposition: attachment; filename=result.txt');
	$result = mysql_query(
						"INSERT INTO `mysql_table_name` (`field1`, `field2`, `field3`) 
						VALUES ('".$field1."', '".$field2."', '".$field3."')"
					);
	
	// создаем указатель файла, подключенный к выходному потоку
	$output = fopen('php://output', 'w');

	fwrite($output, "result\r\n");

	if($result){

		fputs($output, "ok");
	}
	else {
		fputs($output, "not ok");
	};

?></pre>



<p>Для того, чтобы вызвать php-скрипт, его необходимо разместить на сайте или IIS сервере. Вызов из скрипта Qlik Sense осуществляется следующим образом:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">MySQL_Temp_Insert_Information:
LOAD result As MySQL_Temp_Insert_Information
FROM
[http://iis-server-website.ru/mysql/insert_info.php?field1=$(vField1)&amp;field2=$(vField2)&amp;field3=$(vField3)]
(txt, codepage is 1251, embedded labels, delimiter is '\t', msq);

DROP TABLE MySQL_Temp_Insert_Information;</pre>



<p><strong>Замечание:</strong> в URL адресе не должно быть пробелов, иначе QlikView или Qlik Sense выдаст ошибку. Не знаю почему такое происходит.</p>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/php-writing-data-from-a-qlik-sense-script-to-mysql/">PHP: Запись данных из скрипта Qlik Sense в MySQL</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://qliksense.ivan-shamaev.ru/php-writing-data-from-a-qlik-sense-script-to-mysql/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Сравнение двух периодов в Qlik Sense &#038; Date Picker</title>
		<link>https://qliksense.ivan-shamaev.ru/comparing-two-periods-date-picker/</link>
					<comments>https://qliksense.ivan-shamaev.ru/comparing-two-periods-date-picker/#respond</comments>
		
		<dc:creator><![CDATA[qliksense-expert]]></dc:creator>
		<pubDate>Sun, 07 Apr 2019 08:49:29 +0000</pubDate>
				<category><![CDATA[Qlik Sense Блог]]></category>
		<category><![CDATA[date picker]]></category>
		<category><![CDATA[Qlik]]></category>
		<category><![CDATA[qlik sense]]></category>
		<category><![CDATA[qliksense]]></category>
		<category><![CDATA[set analysys]]></category>
		<category><![CDATA[Альтернативные состояния]]></category>
		<category><![CDATA[сравнение двух периодов]]></category>
		<guid isPermaLink="false">https://qliksense.ivan-shamaev.ru/?p=920</guid>

					<description><![CDATA[<p>В этой статье будет разобран подход для сравнения продаж по двум периодам. В примере будут использованы: Set Analysis, Альтернативные состояния, Расширение Date Picker и Qlik Sense (версия Feb 2019). Генерация данных Qlik Sense Для начала сгенирируем данные для модели. Используем календарь Qlik Sense и генерацию элементов справочников в цикле: Загружаем<a class="moretag" href="https://qliksense.ivan-shamaev.ru/comparing-two-periods-date-picker/"> Читать дальше&#8230;</a></p>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/comparing-two-periods-date-picker/">Сравнение двух периодов в Qlik Sense &#038; Date Picker</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>В этой статье будет разобран подход для сравнения продаж по двум периодам. В примере будут использованы: Set Analysis, Альтернативные состояния, Расширение Date Picker и Qlik Sense (версия Feb 2019).</p>



<h2 class="wp-block-heading">Генерация данных Qlik Sense</h2>



<p>Для начала сгенирируем данные для модели. Используем календарь Qlik Sense и генерацию элементов справочников в цикле:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SET ThousandSep=' ';
SET DecimalSep=',';
SET MoneyThousandSep=' ';
SET MoneyDecimalSep=',';
SET MoneyFormat='# ##0,00 ₽;-# ##0,00 ₽';
SET TimeFormat='h:mm:ss';
SET DateFormat='DD.MM.YYYY';
SET TimestampFormat='DD.MM.YYYY h:mm:ss[.fff]';
SET FirstWeekDay=0;
SET BrokenWeeks=1;
SET ReferenceDay=0;
SET FirstMonthOfYear=1;
SET CollationLocale='ru-RU';
SET CreateSearchIndexOnReload=1;
SET MonthNames='янв;фев;мар;апр;май;июн;июл;авг;сент;окт;ноя;дек';
SET LongMonthNames='январь;февраль;март;апрель;май;июнь;июль;август;сентябрь;октябрь;ноябрь;декабрь';
SET DayNames='пн;вт;ср;чт;пт;сб;вс';
SET LongDayNames='понедельник;вторник;среда;четверг;пятница;суббота;воскресенье';
SET NumericalAbbreviation='3:тыс.;6:млн.;9:млрд.;12:трлн.;15:P;18:E;21:Z;24:Y;-3:m;-6:μ;-9:n;-12:p;-15:f;-18:a;-21:z;-24:y';

//Формирование календаря
QuartersMap:  
MAPPING
LOAD rowno() as Month,  
     'Кв.' &amp; Ceil (rowno()/3) as Quarter  
AUTOGENERATE (12);

Let varMinDate 	= Num(MakeDate(2017,1,1));
Let varMaxDate 	= Num(Today());
      
TempCalendar:  
LOAD $(varMinDate) + Iterno()-1 As Num,  
     Date($(varMinDate) + IterNo() - 1) as TempDate
AutoGenerate 1
While $(varMinDate) + IterNo() -1 &lt;= $(varMaxDate);  
      
Календарь:  
Load 
     Date(TempDate) 															As Дата,
     week(TempDate) 															As Неделя,
     Month(TempDate) 															As Месяц,
     Text(SubField(Date(TempDate,'DD MMMM YYYY'),' ',2))						As МесяцПолный,
     ApplyMap('QuartersMap', month(TempDate), Null()) 							As Квартал,
     Year(TempDate) 															As Год,
     Day(TempDate) 																As НомерДень,
     Week(weekstart(TempDate)) &amp; '-' &amp; WeekYear(TempDate) 						As НеделяГод,
     Month(TempDate) &amp; '-' &amp; Year(TempDate) 									As МесяцГод,
     ApplyMap('QuartersMap', month(TempDate), Null()) &amp; '-' &amp; Year(TempDate) 	As КварталГод,
     WeekDay(TempDate)													 		As ДеньНедели
Resident TempCalendar  
Order By TempDate ASC;

Drop Table TempCalendar;

// Генерация справочников
For i=1 to 15
  Контрагенты:
  Load
       $(i)	As [Контрагент ID],
       'Контрагент $(i)' As [Контрагент Наименование]
  AutoGenerate 1;
Next i

For i=1 to 20
  Товары:
  Load
       $(i)	As [Товар ID],
       'Товар $(i)' As [Товар Наименование]
  AutoGenerate 1;
Next i

GenerateFact:
LOAD [Контрагент ID]
Resident Контрагенты;

JOIN (GenerateFact)
LOAD [Товар ID]
Resident Товары;

JOIN (GenerateFact)
LOAD Дата
Resident Календарь;

NoConcatenate
Fact:
LOAD 
     [Контрагент ID], 
     [Товар ID], 
     Дата,
     Rand()*(Rand() + Rand()*Rand())*(4000-4000*Rand()) + Rand()*100 - Rand()*50 as Продажи
Resident GenerateFact;

DROP Table GenerateFact;</pre>



<p>Загружаем данные, получится такая вот модель Qlik Sense:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="632" height="541" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/04/qliksense_compare_two_period_sales.jpg" alt="" class="wp-image-923" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/04/qliksense_compare_two_period_sales.jpg 632w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/04/qliksense_compare_two_period_sales-300x257.jpg 300w" sizes="(max-width: 632px) 100vw, 632px" /></figure>



<h2 class="wp-block-heading">Создаем панель сравнения продаж по двум периодам</h2>



<p>Первым шагом необходимо создать 2 состояния в режиме правки листа (Основные элементы -&gt; Другие состояния):</p>



<ul class="wp-block-list"><li><em>ВыборкаДаты1</em></li><li><em>ВыборкаДаты2</em></li></ul>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="308" height="393" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/04/qliksense_alternativnie_sostoyaniya_compare.jpg" alt="" class="wp-image-925" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/04/qliksense_alternativnie_sostoyaniya_compare.jpg 308w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/04/qliksense_alternativnie_sostoyaniya_compare-235x300.jpg 235w" sizes="(max-width: 308px) 100vw, 308px" /></figure>



<p>Затем используем элемент Qlik Dashboard bundle -&gt; Date Picker (выбираем дату и в свойствах &#8220;Другие состояния&#8221; выбираем ВыборкаДаты1). Создаем два элемента Date Picker (второй настраиваем с состоянием ВыборкаДаты2):</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1024" height="718" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/04/qlik_sense_date_picker-1024x718.jpg" alt="" class="wp-image-927" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/04/qlik_sense_date_picker-1024x718.jpg 1024w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/04/qlik_sense_date_picker-300x210.jpg 300w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/04/qlik_sense_date_picker-768x538.jpg 768w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/04/qlik_sense_date_picker.jpg 1037w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Затем формируем таблицу: в измерении Контрагент, в мерах создаем следующие выражения:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="616" height="555" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/04/qlik_sense_table_settings.jpg" alt="" class="wp-image-928" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/04/qlik_sense_table_settings.jpg 616w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/04/qlik_sense_table_settings-300x270.jpg 300w" sizes="(max-width: 616px) 100vw, 616px" /></figure>



<p><strong>Выражение 1:</strong></p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="389" height="79" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/04/qliksense_compare_expression_1.jpg" alt="" class="wp-image-929" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/04/qliksense_compare_expression_1.jpg 389w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/04/qliksense_compare_expression_1-300x61.jpg 300w" sizes="(max-width: 389px) 100vw, 389px" /></figure>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">sum({&lt;Дата=[ВыборкаДаты1]::Дата>} [Продажи])</pre>



<p><strong>Метка для выражения 1:</strong></p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="573" height="82" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/04/qliksense_compare_label_1.jpg" alt="" class="wp-image-930" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/04/qliksense_compare_label_1.jpg 573w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/04/qliksense_compare_label_1-300x43.jpg 300w" sizes="(max-width: 573px) 100vw, 573px" /></figure>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">='Продажи '&amp;min({[ВыборкаДаты1]} Дата)&amp;' - '&amp;max({[ВыборкаДаты1]} Дата)</pre>



<p>Для выражения 2 делаем все по аналогии, только используем состояние <strong>[ВыборкаДаты2]</strong>.</p>



<h2 class="wp-block-heading">Скачать пример Qlik Sense со сравнением двух периодов</h2>



<div class="wp-block-file"><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/04/Сравнение-двух-периодов-в-Qlik-Sense.zip">Сравнение двух периодов в Qlik Sense </a><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/04/Сравнение-двух-периодов-в-Qlik-Sense.zip" class="wp-block-file__button" download>Скачать</a></div>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/comparing-two-periods-date-picker/">Сравнение двух периодов в Qlik Sense &#038; Date Picker</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://qliksense.ivan-shamaev.ru/comparing-two-periods-date-picker/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
