<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.dote.ru/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.dote.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lan</id>
		<title>DevelopmenOnTheEdge - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.dote.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lan"/>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Lan"/>
		<updated>2026-06-21T05:02:37Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.23.3</generator>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_BE4_%D0%B8_BE-SQL</id>
		<title>Сборка BE4 и BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_BE4_%D0%B8_BE-SQL"/>
				<updated>2016-08-16T08:25:04Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: /* Сборка версии BE4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Сборка BE-SQL ==&lt;br /&gt;
&lt;br /&gt;
BE-SQL — полноценный Maven-проект. Смотрите настройку доступа в Maven [https://sites.google.com/a/developmentontheedge.com/wiki/home/sistemnoe-administrirovanie/maven-repozitorij-nexus во внутренней вики]. Все этапы сборки выполняются с помощью maven, включая компиляцию javacc-грамматики. Для сборки новой версии:&lt;br /&gt;
&lt;br /&gt;
* Выкачать проект dote/dote_modules&lt;br /&gt;
* Зайти в dote_modules/sql&lt;br /&gt;
* Изменить номер версии в pom.xml:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;version&amp;gt;0.0.24&amp;lt;/version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Запустить mvn deploy.&lt;br /&gt;
&lt;br /&gt;
После этого новая версия попадёт в Nexus-репозиторий и будет доступна для других разработчиков. Деплоить одну и ту же версию дважды не выйдет. Если что-то пошло не так, увеличивайте номер версии снова и деплойте заново.&lt;br /&gt;
&lt;br /&gt;
Чтобы воспользоваться новой версией BE-SQL в BE4, вам придётся выпустить также новую версию BE4 с обновлёнными зависимостями (см. ниже).&lt;br /&gt;
&lt;br /&gt;
== Структура BE4 ==&lt;br /&gt;
&lt;br /&gt;
Проект BE4 состоит из двух частей. Исходный код по историческим причинам лежит вместе, но разделён по проектам:&lt;br /&gt;
&lt;br /&gt;
* BE4 Core: ядро BE4, необходимое для работы через [[Использование ant|Ant]]. Состоит из пакетов (включая подпакеты):&lt;br /&gt;
** com.beanexplorer.enterprise.be4core&lt;br /&gt;
** com.beanexplorer.enterprise.metadata&lt;br /&gt;
* BE Eclipse IDE: плагины для Eclipse, реализующие пользовательский интерфейс. Включает в себя все остальные пакеты и зависит от BE4 Core.&lt;br /&gt;
&lt;br /&gt;
BE4 Core содержит меньше зависимостей и является полноценным Maven-проектом (все зависимости есть в Maven). Pom-файл расположен в be4/pom/pom.xml.&lt;br /&gt;
&lt;br /&gt;
BE Eclipse IDE собирается через Eclipse с помощью Ivy. При этом некоторые зависимости присутствуют явно в виде jar (каталоги be4/lib и be4/plugins — кое-что из BioUML), но большая часть зависимостей выкачивается автоматом через Ivy. Конфигурация ivy в be4/src/ivy.xml. Проект в Eclipse настроен так, что зависимости скачиваются в каталог be4/dep и потом оттуда используются. По факту с точки зрения сборки BE Eclipse IDE включает в себя BE4 Core.&lt;br /&gt;
&lt;br /&gt;
== Добавление/обновление зависимости в BE4 ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим как обновить версию зависимости BE4 на примере BE-SQL. Предположим, требуется обновить версию BE-SQL с 0.0.24 на 0.0.25.&lt;br /&gt;
&lt;br /&gt;
1. Обновите версию в be4/pom/pom.xml (необходимо для сборки BE4 Core; этот шаг не нужен для зависимостей, которые требуются только BE Eclipse IDE):&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
   &amp;lt;groupId&amp;gt;com.developmentontheedge&amp;lt;/groupId&amp;gt;&lt;br /&gt;
   &amp;lt;artifactId&amp;gt;sql&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
   &amp;lt;version&amp;gt;0.0.24&amp;lt;/version&amp;gt; --&amp;gt; 0.0.25&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Обновите версию в be4/src/ivy.xml (необходимо для компиляции BE Eclipse IDE)&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency org=&amp;quot;com.developmentontheedge&amp;quot; name=&amp;quot;sql&amp;quot; rev=&amp;quot;0.0.24&amp;quot; /&amp;gt;&lt;br /&gt;
  --&amp;gt;&lt;br /&gt;
  &amp;lt;dependency org=&amp;quot;com.developmentontheedge&amp;quot; name=&amp;quot;sql&amp;quot; rev=&amp;quot;0.0.25&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Обновите версию в be4/META-INF/MANIFEST.MF в разделе Bundle-ClassPath (необходимо для работы BE Eclipse IDE):&lt;br /&gt;
&lt;br /&gt;
 dep/sql-0.0.24.jar, --&amp;gt;  dep/sql-0.0.25.jar,&lt;br /&gt;
&lt;br /&gt;
Следует делать все изменения одновременно. Даже если вы не используете Eclipse-версию, пользователи Eclipse могут пострадать, если ограничиться первым пунктом.&lt;br /&gt;
&lt;br /&gt;
После любых изменений зависимостей, как и после изменений исходного кода, необходимо выпустить новую версию BE4, чтобы другие пользователи могли увидеть ваши изменения (см. ниже). Исключение составляют только пользователи BE Eclipse IDE, которые не обновляются с Update-site, а используют режим с двумя Eclipse-инсталляциями. Желательно со временем перевести этих пользователей на Eclipse Update site.&lt;br /&gt;
&lt;br /&gt;
== Сборка версии BE4 ==&lt;br /&gt;
&lt;br /&gt;
Предположим, последняя выпущенная версия 0.1.46 и мы хотим выпустить версию 0.1.47.&lt;br /&gt;
&lt;br /&gt;
1. Сборка Maven-артефакта. Аналогично BE-SQL: идём в файл be4/pom/pom.xml, меняем версию &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;version&amp;gt;0.1.46&amp;lt;/version&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;version&amp;gt;0.1.47&amp;lt;/version&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; и запускаем команду mvn deploy. После этого BE4 попадает в Nexus.&lt;br /&gt;
&lt;br /&gt;
2. Обновление версии по умолчанию. Ant-скрипты по умолчанию пользуются версией BE4, которая указана в файле be4/src/be4version.properties, который выглядит так:&lt;br /&gt;
&lt;br /&gt;
 BE4_VER=0.1.46&lt;br /&gt;
&lt;br /&gt;
Чтобы все пользователи перешли на новую версию, замените здесь на 0.1.47 и закоммитьте. Если вдруг в новой версии обнаружатся критические проблемы, достаточно будет просто вернуть здесь версию на стабильную. Также при запуске любого ant-таргета можно указать версию явно. Например, так: &amp;lt;code&amp;gt;ant -DBE4_VER=0.1.46&amp;lt;/code&amp;gt;. Таким образом можно сравнивать поведение в разных версиях.&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что хотя Java-код BE4 используется из стабильных сборок, опубликованных через Maven (код из Git не используется), ftl-макросы используются из be4/macro. Поэтому там ошибки повлияют на работу коллег.&lt;br /&gt;
&lt;br /&gt;
3. Обновление Eclipse Update Site. Для этого делаются следующие шаги:&lt;br /&gt;
&lt;br /&gt;
3.1. Обновляем версию в be4/META-INF/MANIFEST.INF в строчке Bundle-Version:&lt;br /&gt;
&lt;br /&gt;
 Bundle-Version: 0.1.46&lt;br /&gt;
&lt;br /&gt;
3.2. Импортируем в Eclipse проекты be4/.project, be4/com.beanexplorer.be4.feature/.project, be4/com.beanexplorer.be4.site/.project&lt;br /&gt;
&lt;br /&gt;
3.3. Открываем /com.beanexplorer.be4.feature/feature.xml в Feature Manifest Editor. &lt;br /&gt;
&lt;br /&gt;
3.4. Во вкладке Overflow меняем версию 0.1.46.qualifier на 0.1.47.qualifier.&lt;br /&gt;
&lt;br /&gt;
3.5. Во вкладке Plugins нажимаем правой кнопкой на com.beanexplorer.enterprise.eclipse, Synchronize Versions, Copy versions from plug-in and fragment manifests, Finish&lt;br /&gt;
&lt;br /&gt;
3.6. Сохраняем feature.xml (обязательно сейчас, не позже!)&lt;br /&gt;
&lt;br /&gt;
3.7. Открываем /com.beanexplorer.be4.site/site.xml в Site Manifest Editor&lt;br /&gt;
&lt;br /&gt;
3.8. Во вкладке Site Map разворачиваем beanexplorer4 и удаляем features/com.beanexplorer.be4.feature_0.1.46.qualifier.jar. Затем нажимаем Add feature, пишем com.beanexplorer и выбираем в списке com.beanexplorer.be4.feature.&lt;br /&gt;
&lt;br /&gt;
3.9. Сохраняем и нажимаем Build All.&lt;br /&gt;
&lt;br /&gt;
3.10. После этого каталог be4/com.beanexplorer.be4.site является полноценным update site'ом Eclipse. Скопируйте его в \\logrus.dote.ru\pub2\be4\com.beanexplorer.be4.site (лучше старую версию переименовать, чтобы если что можно было откатиться.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_BE4_%D0%B8_BE-SQL</id>
		<title>Сборка BE4 и BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_BE4_%D0%B8_BE-SQL"/>
				<updated>2016-08-16T08:17:29Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Сборка BE-SQL ==&lt;br /&gt;
&lt;br /&gt;
BE-SQL — полноценный Maven-проект. Смотрите настройку доступа в Maven [https://sites.google.com/a/developmentontheedge.com/wiki/home/sistemnoe-administrirovanie/maven-repozitorij-nexus во внутренней вики]. Все этапы сборки выполняются с помощью maven, включая компиляцию javacc-грамматики. Для сборки новой версии:&lt;br /&gt;
&lt;br /&gt;
* Выкачать проект dote/dote_modules&lt;br /&gt;
* Зайти в dote_modules/sql&lt;br /&gt;
* Изменить номер версии в pom.xml:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;version&amp;gt;0.0.24&amp;lt;/version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Запустить mvn deploy.&lt;br /&gt;
&lt;br /&gt;
После этого новая версия попадёт в Nexus-репозиторий и будет доступна для других разработчиков. Деплоить одну и ту же версию дважды не выйдет. Если что-то пошло не так, увеличивайте номер версии снова и деплойте заново.&lt;br /&gt;
&lt;br /&gt;
Чтобы воспользоваться новой версией BE-SQL в BE4, вам придётся выпустить также новую версию BE4 с обновлёнными зависимостями (см. ниже).&lt;br /&gt;
&lt;br /&gt;
== Структура BE4 ==&lt;br /&gt;
&lt;br /&gt;
Проект BE4 состоит из двух частей. Исходный код по историческим причинам лежит вместе, но разделён по проектам:&lt;br /&gt;
&lt;br /&gt;
* BE4 Core: ядро BE4, необходимое для работы через [[Использование ant|Ant]]. Состоит из пакетов (включая подпакеты):&lt;br /&gt;
** com.beanexplorer.enterprise.be4core&lt;br /&gt;
** com.beanexplorer.enterprise.metadata&lt;br /&gt;
* BE Eclipse IDE: плагины для Eclipse, реализующие пользовательский интерфейс. Включает в себя все остальные пакеты и зависит от BE4 Core.&lt;br /&gt;
&lt;br /&gt;
BE4 Core содержит меньше зависимостей и является полноценным Maven-проектом (все зависимости есть в Maven). Pom-файл расположен в be4/pom/pom.xml.&lt;br /&gt;
&lt;br /&gt;
BE Eclipse IDE собирается через Eclipse с помощью Ivy. При этом некоторые зависимости присутствуют явно в виде jar (каталоги be4/lib и be4/plugins — кое-что из BioUML), но большая часть зависимостей выкачивается автоматом через Ivy. Конфигурация ivy в be4/src/ivy.xml. Проект в Eclipse настроен так, что зависимости скачиваются в каталог be4/dep и потом оттуда используются. По факту с точки зрения сборки BE Eclipse IDE включает в себя BE4 Core.&lt;br /&gt;
&lt;br /&gt;
== Добавление/обновление зависимости в BE4 ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим как обновить версию зависимости BE4 на примере BE-SQL. Предположим, требуется обновить версию BE-SQL с 0.0.24 на 0.0.25.&lt;br /&gt;
&lt;br /&gt;
1. Обновите версию в be4/pom/pom.xml (необходимо для сборки BE4 Core; этот шаг не нужен для зависимостей, которые требуются только BE Eclipse IDE):&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
   &amp;lt;groupId&amp;gt;com.developmentontheedge&amp;lt;/groupId&amp;gt;&lt;br /&gt;
   &amp;lt;artifactId&amp;gt;sql&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
   &amp;lt;version&amp;gt;0.0.24&amp;lt;/version&amp;gt; --&amp;gt; 0.0.25&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Обновите версию в be4/src/ivy.xml (необходимо для компиляции BE Eclipse IDE)&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency org=&amp;quot;com.developmentontheedge&amp;quot; name=&amp;quot;sql&amp;quot; rev=&amp;quot;0.0.24&amp;quot; /&amp;gt;&lt;br /&gt;
  --&amp;gt;&lt;br /&gt;
  &amp;lt;dependency org=&amp;quot;com.developmentontheedge&amp;quot; name=&amp;quot;sql&amp;quot; rev=&amp;quot;0.0.25&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Обновите версию в be4/META-INF/MANIFEST.MF в разделе Bundle-ClassPath (необходимо для работы BE Eclipse IDE):&lt;br /&gt;
&lt;br /&gt;
 dep/sql-0.0.24.jar, --&amp;gt;  dep/sql-0.0.25.jar,&lt;br /&gt;
&lt;br /&gt;
Следует делать все изменения одновременно. Даже если вы не используете Eclipse-версию, пользователи Eclipse могут пострадать, если ограничиться первым пунктом.&lt;br /&gt;
&lt;br /&gt;
После любых изменений зависимостей, как и после изменений исходного кода, необходимо выпустить новую версию BE4, чтобы другие пользователи могли увидеть ваши изменения (см. ниже). Исключение составляют только пользователи BE Eclipse IDE, которые не обновляются с Update-site, а используют режим с двумя Eclipse-инсталляциями. Желательно со временем перевести этих пользователей на Eclipse Update site.&lt;br /&gt;
&lt;br /&gt;
== Сборка версии BE4 ==&lt;br /&gt;
&lt;br /&gt;
Предположим, последняя выпущенная версия 0.1.46 и мы хотим выпустить версию 0.1.47.&lt;br /&gt;
&lt;br /&gt;
1. Сборка Maven-артефакта. Аналогично BE-SQL: идём в файл be4/pom/pom.xml, меняем версию &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;version&amp;gt;0.1.46&amp;lt;/version&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;version&amp;gt;0.1.47&amp;lt;/version&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; и запускаем команду mvn deploy. После этого BE4 попадает в Nexus.&lt;br /&gt;
&lt;br /&gt;
2. Обновление версии по умолчанию. Ant-скрипты по умолчанию пользуются версией BE4, которая указана в файле be4/src/be4version.properties, который выглядит так:&lt;br /&gt;
&lt;br /&gt;
 BE4_VER=0.1.46&lt;br /&gt;
&lt;br /&gt;
Чтобы все пользователи перешли на новую версию, замените здесь на 0.1.47 и закоммитьте. Если вдруг в новой версии обнаружатся критические проблемы, достаточно будет просто вернуть здесь версию на стабильную. Также при запуске любого ant-таргета можно указать версию явно. Например, так: &amp;lt;code&amp;gt;ant -DBE4_VER=0.1.46&amp;lt;/code&amp;gt;. Таким образом можно сравнивать поведение в разных версиях.&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что хотя Java-код BE4 используется из стабильных сборок, опубликованных через Maven (код из Git не используется), ftl-макросы используются из be4/macro. Поэтому там ошибки повлияют на работу коллег.&lt;br /&gt;
&lt;br /&gt;
3. Обновление Eclipse Update Site. Для этого делаются следующие шаги:&lt;br /&gt;
&lt;br /&gt;
3.1. Обновляем версию в be4/META-INF/MANIFEST.INF в строчке Bundle-Version:&lt;br /&gt;
&lt;br /&gt;
 Bundle-Version: 0.1.46&lt;br /&gt;
&lt;br /&gt;
3.2. Импортируем в Eclipse проекты be4/.project, be4/com.beanexplorer.be4.feature/.project, be4/com.beanexplorer.be4.site/.project&lt;br /&gt;
&lt;br /&gt;
3.3.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_BE4_%D0%B8_BE-SQL</id>
		<title>Сборка BE4 и BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_BE4_%D0%B8_BE-SQL"/>
				<updated>2016-08-16T07:50:50Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Сборка BE-SQL ==&lt;br /&gt;
&lt;br /&gt;
BE-SQL — полноценный Maven-проект. Смотрите настройку доступа в Maven [https://sites.google.com/a/developmentontheedge.com/wiki/home/sistemnoe-administrirovanie/maven-repozitorij-nexus во внутренней вики]. Все этапы сборки выполняются с помощью maven, включая компиляцию javacc-грамматики. Для сборки новой версии:&lt;br /&gt;
&lt;br /&gt;
* Выкачать проект dote/dote_modules&lt;br /&gt;
* Зайти в dote_modules/sql&lt;br /&gt;
* Изменить номер версии в pom.xml:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;version&amp;gt;0.0.24&amp;lt;/version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Запустить mvn deploy.&lt;br /&gt;
&lt;br /&gt;
Деплоить одну и ту же версию дважды не выйдет. Если что-то пошло не так, увеличивайте номер версии снова и деплойте заново.&lt;br /&gt;
&lt;br /&gt;
Чтобы воспользоваться новой версией BE-SQL в BE4, вам придётся выпустить также новую версию BE4 с обновлёнными зависимостями (см. ниже).&lt;br /&gt;
&lt;br /&gt;
== Структура BE4 ==&lt;br /&gt;
&lt;br /&gt;
Проект BE4 состоит из двух частей. Исходный код по историческим причинам лежит вместе, но разделён по проектам:&lt;br /&gt;
&lt;br /&gt;
* BE4 Core: ядро BE4, необходимое для работы через [[Использование ant|Ant]]. Состоит из пакетов (включая подпакеты):&lt;br /&gt;
** com.beanexplorer.enterprise.be4core&lt;br /&gt;
** com.beanexplorer.enterprise.metadata&lt;br /&gt;
* BE Eclipse IDE: плагины для Eclipse, реализующие пользовательский интерфейс. Включает в себя все остальные пакеты и зависит от BE4 Core.&lt;br /&gt;
&lt;br /&gt;
BE4 Core содержит меньше зависимостей и является полноценным Maven-проектом (все зависимости есть в Maven). Pom-файл расположен в be4/pom/pom.xml.&lt;br /&gt;
&lt;br /&gt;
BE Eclipse IDE собирается через Eclipse с помощью Ivy. При этом некоторые зависимости присутствуют явно в виде jar (каталоги be4/lib и be4/plugins — кое-что из BioUML), но большая часть зависимостей выкачивается автоматом через Ivy. Конфигурация ivy в be4/src/ivy.xml. Проект в Eclipse настроен так, что зависимости скачиваются в каталог be4/dep и потом оттуда используются. По факту с точки зрения сборки BE Eclipse IDE включает в себя BE4 Core.&lt;br /&gt;
&lt;br /&gt;
== Добавление/обновление зависимости в BE4 ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим как обновить версию зависимости BE4 на примере BE-SQL. Предположим, требуется обновить версию BE-SQL с 0.0.24 на 0.0.25.&lt;br /&gt;
&lt;br /&gt;
1. Обновите версию в be4/pom/pom.xml (этот шаг не нужен для зависимостей, которые требуются):&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
   &amp;lt;groupId&amp;gt;com.developmentontheedge&amp;lt;/groupId&amp;gt;&lt;br /&gt;
   &amp;lt;artifactId&amp;gt;sql&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
   &amp;lt;version&amp;gt;0.0.24&amp;lt;/version&amp;gt; --&amp;gt; 0.0.25&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Обновите версию в be4/src/ivy.xml&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency org=&amp;quot;com.developmentontheedge&amp;quot; name=&amp;quot;sql&amp;quot; rev=&amp;quot;0.0.24&amp;quot; /&amp;gt;&lt;br /&gt;
  --&amp;gt;&lt;br /&gt;
  &amp;lt;dependency org=&amp;quot;com.developmentontheedge&amp;quot; name=&amp;quot;sql&amp;quot; rev=&amp;quot;0.0.25&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Обновите версию в be4/META-INF/MANIFEST.MF в разделе Bundle-ClassPath:&lt;br /&gt;
&lt;br /&gt;
 dep/sql-0.0.24.jar, --&amp;gt;  dep/sql-0.0.25.jar,&lt;br /&gt;
&lt;br /&gt;
Следует делать все изменения одновременно. Даже если вы не используете Eclipse-версию, пользователи Eclipse могут пострадать, если ограничиться первым пунктом.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_BE4_%D0%B8_BE-SQL</id>
		<title>Сборка BE4 и BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_BE4_%D0%B8_BE-SQL"/>
				<updated>2016-08-16T07:23:56Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: Новая страница: «== Сборка BE-SQL ==  BE-SQL — полноценный Maven-проект. Смотрите настройку доступа в Maven [https://sites.google…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Сборка BE-SQL ==&lt;br /&gt;
&lt;br /&gt;
BE-SQL — полноценный Maven-проект. Смотрите настройку доступа в Maven [https://sites.google.com/a/developmentontheedge.com/wiki/home/sistemnoe-administrirovanie/maven-repozitorij-nexus во внутренней вики]. Все этапы сборки выполняются с помощью maven, включая компиляцию javacc-грамматики. Для сборки новой версии:&lt;br /&gt;
&lt;br /&gt;
* Выкачать проект dote/dote_modules&lt;br /&gt;
* Зайти в dote_modules/sql&lt;br /&gt;
* Изменить номер версии в pom.xml:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;version&amp;gt;0.0.24&amp;lt;/version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Запустить mvn deploy.&lt;br /&gt;
&lt;br /&gt;
Деплоить одну и ту же версию дважды не выйдет. Если что-то пошло не так, увеличивайте номер версии снова и деплойте заново.&lt;br /&gt;
&lt;br /&gt;
Чтобы воспользоваться новой версией BE-SQL в BE4, вам придётся выпустить также новую версию BE4 с обновлёнными зависимостями (см. ниже).&lt;br /&gt;
&lt;br /&gt;
== Структура BE4 ==&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0</id>
		<title>Заглавная страница</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0"/>
				<updated>2016-08-16T07:20:01Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== BeanExplorer4 ===&lt;br /&gt;
* [[BeanExplorer4]]&lt;br /&gt;
** [[Для разработчиков BE4]]&lt;br /&gt;
* [[Установка BeanExplorer4]] (для пользователей)&lt;br /&gt;
* [[Компиляция и запуск BeanExplorer4]] (для разработчиков)&lt;br /&gt;
* [[Сборка BE4 и BE-SQL]] (для разработчиков)&lt;br /&gt;
* [[Использование ant]]&lt;br /&gt;
* [[Поддержка СУБД]]&lt;br /&gt;
* [[Типы колонок]]&lt;br /&gt;
* [[Структура проекта]]&lt;br /&gt;
* [[Usecases|Usecases с картиночками]]&lt;br /&gt;
* [[JavaScript Debugger]]&lt;br /&gt;
* [[Extras]]&lt;br /&gt;
* [[Entity template|Шаблоны для сущностей]]&lt;br /&gt;
&lt;br /&gt;
=== Freemarker ===&lt;br /&gt;
* [[Freemarker]]&lt;br /&gt;
* [[Встроенные функции]]&lt;br /&gt;
* [[Макросы]]&lt;br /&gt;
* [[Объекты]]&lt;br /&gt;
* [[Пользовательские макросы]]&lt;br /&gt;
* [[Создание своих макросов]]&lt;br /&gt;
* [[Built-ins]]&lt;br /&gt;
&lt;br /&gt;
=== BeanExplorer5 ===&lt;br /&gt;
* [[:Category:BeanExplorer5|Категория BeanExplorer5]]&lt;br /&gt;
* [[BeanExplorer5|BeanExplorer5]]&lt;br /&gt;
* [[BeanExplorer5 API|BeanExplorer5 API]]&lt;br /&gt;
* [[BE-SQL|SQL-диалект BeanExplorer5]]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Внешние ссылки ===&lt;br /&gt;
* BeanExplorer4 на Edge Wiki [https://sites.google.com/a/developmentontheedge.com/wiki/home/proektnaadokumentacia/beanexplorer4]&lt;br /&gt;
----&lt;br /&gt;
Количество статей в вики: '''[[:Special:Statistics|{{NUMBEROFARTICLES}}]]'''.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0_BeanExplorer4</id>
		<title>Установка BeanExplorer4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0_BeanExplorer4"/>
				<updated>2016-06-21T11:05:07Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Для установки BeanExplorer4 надо иметь установленный Eclipse Luna и воспользоваться Eclipse Update Site по следующему адресу:&lt;br /&gt;
&lt;br /&gt;
\\logrus.dote.ru\pub2\be4\com.beanexplorer.be4.site &lt;br /&gt;
&lt;br /&gt;
Help -&amp;gt; Install New Software -&amp;gt; Add..., указать любое имя и этот путь:&lt;br /&gt;
&lt;br /&gt;
[[Файл:BE4InstallationUpdateSite.png]]&lt;br /&gt;
&lt;br /&gt;
Если ничего не видно, снять галочку Group items by category. Должно быть такое окошко:&lt;br /&gt;
&lt;br /&gt;
[[Файл:BE4InstallationInstall.png]]&lt;br /&gt;
&lt;br /&gt;
Выделить BeanExplorer4Feature, нажать Next, со всем согласиться, установить и перезапустить Eclipse.&lt;br /&gt;
&lt;br /&gt;
После установки можно почитать [[BeanExplorer4|вводную статью про BeanExplorer4]].&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer4</id>
		<title>BeanExplorer4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer4"/>
				<updated>2016-06-21T11:04:36Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Как начать работу с BeanExplorer 4 ==&lt;br /&gt;
Для установки: смотрите «[[Установка BeanExplorer4]]».&lt;br /&gt;
&lt;br /&gt;
Есть три способа начать работать с проектом BeanExplorer 4.&lt;br /&gt;
# Взять готовый проект. В таком случае просто откройте перспективу BeanExplorer, сделайте импорт проекта обычным способом, а затем кликните на проект или project.yaml правой кнопкой мыши (во view Project Explorer) и выберите &amp;quot;BeanExplorer -&amp;gt; Open BeanExplorer Project&amp;quot;. Проект появится во view с названием Model.&lt;br /&gt;
# Преобразовать старый BeanExplorer-проект. Для этого выберите File-&amp;gt;New-&amp;gt;Project..., BeanExplorer-&amp;gt;New BeanExplorer Project Using Database Connection (более короткий способ это сделать - это выбрать пункт меню BeanExplorer-&amp;gt;Quick Load Using Database Connection, если уже есть профиль для подключения к базе данных). Если нет ни одного профиля для подключения к СУБД, его надо создать, нажав &amp;quot;Create a new connection profile&amp;quot; и введя всю необходимую информацию для подключения, а также выбрав JDBC драйвер. Пароль обязательно сохранить. Можно это [[BeanExplorer4#Как создать новый профиль подключения к БД|сделать до начала создания проекта, обычными средставми Eclipse DTP]]. После нажатия на кнопку &amp;quot;Finish&amp;quot; загруженный проект должен отобразиться во view &amp;quot;Model&amp;quot;. Преобразование может быть неточным и придётся его доделывать вручную. Кроме того, не сохранятся никакие M4 макросы.&lt;br /&gt;
# Создать новый проект.&lt;br /&gt;
#* File -&amp;gt; New -&amp;gt; Project...&lt;br /&gt;
#* BeanExplorer -&amp;gt; BeanExplorer Project, Next&lt;br /&gt;
#* Ввести имя проекта, изначальный список ролей, допустимых в проекте, и набор поддерживаемых языков (роли и языки всегда можно будет добавить ещё).&lt;br /&gt;
#* Выбрать набор используемых модулей и фитч. Модули аналогичны самим BeanExplorer4 проектам. Модуль 'beanexplorer' всегда добавляется в проект безусловно, поэтому его нельзя выбрать самому.&lt;br /&gt;
#* Заполнить параметры подключения к базе данных. У нас в проектах всегда используются connection profiles и Eclipse DTP, поэтому для начала работы с BeanExplorer4 сначала необходимо создать базу данных и connection profile для её использования. Тестовый пользователь - одновременно и администратор базы данных и пользователь-администратор из создаваемого BeanExplorer4 приложения.&lt;br /&gt;
# Создать новый проект возможно и из консоли. Для этого запускается Ant target с именем 'wizard' (зайти в консоли в папку 'be4/src' и напечатать 'ant wizard', если у вас установлен Ant).&lt;br /&gt;
&lt;br /&gt;
== Описание по каждому редактору и view ==&lt;br /&gt;
* Model (view). Дерево проекта.&lt;br /&gt;
* Properties (view). Свойства выделенного в дереве проекта элемента.&lt;br /&gt;
* Documentation (view). Документация к выделенному в дереве проекта элементу.&lt;br /&gt;
* Tasks (view). Отображает все маркеры @todo и @check, найденные в документации ко всем элементам проекта и при необходимости скачивает задачи с ERP или Bugzilla. Для того, чтобы связать открытый проект с ERP, необходимо в его свойствах (Properties view!) заполнить поле 'ERP project identifier'. Аналогично для связи с Bugzilla имеется поле 'Bugzilla product name'. Помимо этих полей потребуеются логин и пароль, которые возможно ввести на странице BeanExplorer в настройках (Window-&amp;gt;Preferences) (если они не введены, при попытке подключиться к ERP или Bugzilla BeanExplorer4 предложит вам ввести их в диалоговом окошке). Для того, чтобы связать какое-нибудь задание из документации с багом в Bugzilla или ERP, в начале его текста нужно указать номер бага с префиксом 'bug' или 'erp' соответственно: например, в тексте документации будет &amp;quot;@todo bug12345 исправить систему подсчёта X&amp;quot;.&lt;br /&gt;
* Security (view). Таблица с правами ролей для каждого запроса и каждой операции. Реагирует на то, какой редактор открыт или какой элемент в дереве проектов выбран, и в соответствии с последним выбранным элементов фильтрует таблицу. Если в дереве проектов выбран модуль, то будут отображаться только операции и запросы из этого модуля, если entity, то отображаются только те операции и запросы, что относятся к данной entity. Фильтр по ролям позволяет выбрать все операции и запросы, которые может выполнять выбранная роль.&lt;br /&gt;
* Diagram (editor). Редактор диаграмм. Позволяет открывать .dml файлы и редактировать несколько их видов. Диаграммы каждого вида возможно создать пустыми выбором соответствующего пункта в основном меню BeanExplorer (BeanExplorer-&amp;gt;Create *** Diagram/Board). Поддерживаемые виды диаграмм:&lt;br /&gt;
** ER модели. Могут быть открыты посредством клика на модуль и выбора &amp;quot;Create Diagram From This Module&amp;quot;.&lt;br /&gt;
** EPC (Event-Process Chain) диаграммы.&lt;br /&gt;
** CFF (Cross-Functional Flowchart) диаграммы.&lt;br /&gt;
** Planning boards - доски с задачами.&lt;br /&gt;
* Diagram Layout (view). Позволяет перераспределить элементы ER диаграмы. Всегда относится к диаграмме из редактора ER, которым пользовались последним.&lt;br /&gt;
* SQL Editor (editor). Позволяет редактировать SQL запросы - открывается при клике на запросы в дереве проекта. Почти то же самое, что и SQL редактор из Eclipse DTP. Позволяет запускать SQL запросы (правый щелчок мышью-&amp;gt;Execute All). Отличается от оригинального тем, что, во-первых, не сохраняет изменения в файл (при попытке сохранить изменения окажутся в модели BeanExplorer 4), а, во-вторых, позволяет запускать SQL с учётом макропроцессора FreeMarker и [https://sites.google.com/a/developmentontheedge.com/wiki/home/proektnaadokumentacia/beanexplorer/beanexplorerdocrus плейсхолдеров BeanExplorer] (правый щелчок мышью-&amp;gt;Run или &amp;quot;Run BeanExplorer SQL Query&amp;quot; на toolbar'е).&lt;br /&gt;
* Query Executor (view).&lt;br /&gt;
** Позволяет определить контекст выполнения SQL запроса - посредством выбора своих параметров запроса или сессии (при этом запрос пока выполняется только под администратором).&lt;br /&gt;
** Позволяет посмотреть результаты запуска SQL запроса. Автоматически активируется при SQL запросе. Позволяет посмотреть результаты запроса как в виде простой таблицы, так и в виде HTML после обработки в BeanExplorer, а также посмотреть обработанные представления запроса — после макропроцессора FreeMarker и в чистом SQL виде.&lt;br /&gt;
* JavaScript Editor (editor). Позволяет редактировать JavaScript скрипты - открывается при клике на JavaScript/server операции в дереве проекта. Почти то же самое, что и обычный JavaScript редактор из Eclipse JSDT. Отличается тем, что позволяет запускать Rhino JavaScript (&amp;quot;Run JavaScript&amp;quot; на toolbar'е или &amp;quot;Execute&amp;quot; в Operation Parameters view). Результат вызова операции открывается в браузере.&lt;br /&gt;
* Operation Parameters (view). Позволяет определить контекст выполнения JavaScript/server операции посредством задания параметров и выбранных строчек. Также позволяет выбрать метод для запуска: getParameters(), invoke() или getRedirectURL() (последний пока не поддерживается).&lt;br /&gt;
* Localization (view). [[Localizations|Локализация]], относящаяся к выделенному в дереве проектов элементу. Отображается при выборе entity, operation или query.&lt;br /&gt;
&lt;br /&gt;
== Основная информация для понимания BeanExplorer 4 ==&lt;br /&gt;
# Основное представление проекта BeanExplorer 4 - это не база данных, не YAML проект, а дерево проекта в Model view. При открытии BeanExplorer 4 проекта, он оказывается в Model view. И только при сохранении он сериализуется в YAML&lt;br /&gt;
# Основные простейшие действия с проектом - создание/удаление сущностей (entities), операций (operation) и запросов (query) - делаются из контекстного меню (pop-up) в Model view.&lt;br /&gt;
# Если с каким-нибудь узлом дерева проекта может быть связан редактор, то при выделении этого узла открывается редактор. Например, для JavaScript/server операции открывается JavaScript редактор, для 1D запроса - SQL редактор, для custom step - текстовый редактор, для Java операции открывается Java редактор (если .java файл с соответствующим именем находится в рабочем пространстве Eclipse). Некоторые редакторы при сохранении никак не меняют файлы - файлы будут изменены только при сохранении проекта.&lt;br /&gt;
# У большинство элементов из дерева проекта есть свойства, которые возможно редактировать в Properties view.&lt;br /&gt;
# Для любого подключения к базе данных необходим connection profile ([http://help.eclipse.org/helios/index.jsp?topic=%2Forg.eclipse.datatools.connectivity.doc.user%2Fdoc%2Fhtml%2Fasc1229700343352.html в документации по Kepler]). При импорте готового проекта connection profile создаётся автоматически, однако вручную всё же необходимо выбрать к нему JDBC Connector (если СУБД для подключения используется впервые). Connection Profile необходим как для SQL запросов из обычного SQL редактора Eclipse DTP, так и для запросов BeanExplorer. Настройки connection profiles находятся в разделе проекта &amp;quot;Connection profiles&amp;quot;, в &amp;quot;папочках&amp;quot; Local и Remote. Эти настройки сохраняются в XML при сохранении BeanExplorer 4 проекта, а при его открытии воссоздаются, и если Eclipse DTP не имеет connection profiles с соответствующими именами, то они будут созданы. Конкретнее - эти настройки хранятся в двух файлах: connectionProfiles.local.xml и connectionProfiles.remote.xml, причём предполагается, что .local вписан в .gitignore, а .remote - нет. Для возможности подключиться к базе данных всегда должен быть выбран в качестве текущего какой-нибудь connection profile. Выбирается он в свойствах проекта (Properties view, &amp;quot;Connection profile name&amp;quot;) - в соответствующем combo box отображаются только те профили, которые есть в Local или Remote. Добавить новый connection profile в проект BeanExplorer 4 возможно через контекстное меню (для этого его сначала необходимо создать в Data Source Explorer view (из Eclipse DTP)).&lt;br /&gt;
&lt;br /&gt;
== Работа с BeanExplorer 4 для аналитиков ==&lt;br /&gt;
Для некоторых типов элементов из дерева проектов возможно приписывать комментарии/документацию. На данный момент это следующие типы элементов:&lt;br /&gt;
* проект,&lt;br /&gt;
* модули (в т.ч. application),&lt;br /&gt;
* сущности (entities - всё, что находится внутри модуля в папках Collections, Dictionaries, Tables, Generic Collections, Metadata),&lt;br /&gt;
* операции,&lt;br /&gt;
* запросы.&lt;br /&gt;
Документация отображается в Documentation view. Если в документации элемента есть маркер @todo или @check, то строка с этим маркером окажется и в другом view: Tasks. При клике на какую-либо строчку из Tasks будет выделен соответствующий ей элемент в Model view.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Analyst1.png]]&lt;br /&gt;
&lt;br /&gt;
=== Возможности назначения ролей ===&lt;br /&gt;
* Все роли перечислены в свойствах проекта. При клике на список ролей (&amp;quot;Project roles&amp;quot; в Properties view при выбранно проекте) появляется панель, позволяющая добавлять роли.&lt;br /&gt;
* Для операций и запросов роли назначаются во view Security.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Analyst2.png]]&lt;br /&gt;
&lt;br /&gt;
== Usecases ==&lt;br /&gt;
Перенесены [[Usecases|сюда]].&lt;br /&gt;
&lt;br /&gt;
== Компиляция и запуск Eclipse с плагином BeanExplorer4 ==&lt;br /&gt;
Здесь: [[Компиляция и запуск BeanExplorer4]] (инструкции для тех, кто запускает Eclipse BeanExplorer4 из под другого экземпляра Eclipse).&lt;br /&gt;
&lt;br /&gt;
== Структура проекта BeanExplorer 4 ==&lt;br /&gt;
[[Структура проекта|Структура]] проекта BeanExplorer 4&lt;br /&gt;
&lt;br /&gt;
== Процесс разработки ==&lt;br /&gt;
=== Использование Ant ===&lt;br /&gt;
[[Использование ant|Использование Ant]]&lt;br /&gt;
&lt;br /&gt;
=== Использование шаблонов Freemarker ===&lt;br /&gt;
Использование шаблонов [[Freemarker|Freemarker]]&lt;br /&gt;
&lt;br /&gt;
=== JavaScript Debugger ===&lt;br /&gt;
Текущее состояние [[JavaScript Debugger|JavaScript Debugger]]&lt;br /&gt;
&lt;br /&gt;
=== Поддержка СУБД ===&lt;br /&gt;
Поддержка [[Поддержка СУБД|различных СУБД]]&lt;br /&gt;
&lt;br /&gt;
== Полезная информация, которая может помочь при работе с BeanExplorer 4 ==&lt;br /&gt;
=== Как устанавливать плагины/фитчи из архива ===&lt;br /&gt;
# Заходим в... Help-&amp;gt;Install New Software. Add...-&amp;gt;Archive... выбрать архив, OK.&lt;br /&gt;
# Снять галочку &amp;quot;Group items by category&amp;quot;, если не видно пунктов для установки. Это может занять продолжительное время, т.к. с основного репозитория Eclipse будут скачиваться недостающие плагины.&lt;br /&gt;
&lt;br /&gt;
=== Где взять редактор YAML ===&lt;br /&gt;
Update site: &amp;lt;code&amp;gt;http://dadacoalition.org/yedit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Site: [https://code.google.com/p/yedit/ https://code.google.com/p/yedit/])&lt;br /&gt;
&lt;br /&gt;
=== Где взять редактор FreeMarker ===&lt;br /&gt;
Update site: &amp;lt;code&amp;gt;http://download.jboss.org/jbosstools/updates/stable/kepler/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или:&lt;br /&gt;
&lt;br /&gt;
Help-&amp;gt;Eclipse Marketplace... ищем &amp;quot;JBoss Tools&amp;quot;, жмём Install у JBoss Tools (Kepler), снимаем галочку со всего и выбираем JBoss Tools (Kepler)-&amp;gt;FreeMarker IDE.&lt;br /&gt;
&lt;br /&gt;
=== Как настроить Tomcat для возможности подгрузить изменения в class-файлах. ===&lt;br /&gt;
1. Add the following lines into /conf/tomcat-users.xml (inside the root element &amp;lt;tomcat-users&amp;gt;):&lt;br /&gt;
 &amp;lt;role rolename=&amp;quot;manager-script&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;user username=&amp;quot;tomcat&amp;quot; password=&amp;quot;tomcat&amp;quot; roles=&amp;quot;manager-script&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Create /conf/Catalina/localhost/manager.xml with the following content:&lt;br /&gt;
 &amp;lt;Context privileged=&amp;quot;true&amp;quot; antiResourceLocking=&amp;quot;false&amp;quot;&lt;br /&gt;
          docBase=&amp;quot;${catalina.home}/webapps/manager&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Valve className=&amp;quot;org.apache.catalina.valves.RemoteAddrValve&amp;quot;&lt;br /&gt;
         allow=&amp;quot;127\.0\.0\.1&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/Context&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подробнее [http://tomcat.apache.org/tomcat-7.0-doc/manager-howto.html здесь] и [http://www.mulesoft.com/tcat/tomcat-reload здесь].&lt;br /&gt;
&lt;br /&gt;
3. You can change the username or the password, but you should ensure that your connection profile uses these username and password. Beside this you can change the URL that will be called to refresh Tomcat. Note that this action uses the Tomcat application name from the connection profile. Tomcat path should be set too.&lt;br /&gt;
&lt;br /&gt;
=== Как создать новый профиль подключения к БД ===&lt;br /&gt;
* Переключиться в перспективу Database Development. (В Eclipse почти в правом верхнем углу нажать квадратную кнопку с плюсиком &amp;quot;Open Perspective&amp;quot; и выбрать там &amp;quot;Database Development&amp;quot;).&lt;br /&gt;
* Во view Data Source Explorer кликнуть правой кнопкой мыши на Database Connections, New....&lt;br /&gt;
* Выбрать в диалоговом окне тип используемой БД (напр., PostgreSQL), ввести нормальное имя для подключения (например, &amp;quot;condo&amp;quot;), Next.&lt;br /&gt;
* Ввести параметры подключения, их можно узнать у администратора БД. При первом создании профиля подключения с данным типом СУБД необходимо выбрать драйвер СУБД (для этого нажать круглишок с плюсиком у combo &amp;quot;Driver&amp;quot;, а в появившемся диалоге на второй вкладке обычно необходимо удалить выбранный драйвер и выбрать свой - мы для удобство поместили все драйвера в папку lib из be4).&lt;br /&gt;
* Next, Finish.&lt;br /&gt;
* Новый профиль появится в списке Database Connections во view Data Source Explorer.&lt;br /&gt;
&lt;br /&gt;
= Для разработчиков =&lt;br /&gt;
[[Для разработчиков BE4|Сюда]]&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%A4%D0%B0%D0%B9%D0%BB:BE4InstallationInstall.png</id>
		<title>Файл:BE4InstallationInstall.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%A4%D0%B0%D0%B9%D0%BB:BE4InstallationInstall.png"/>
				<updated>2016-06-21T11:03:53Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%A4%D0%B0%D0%B9%D0%BB:BE4InstallationUpdateSite.png</id>
		<title>Файл:BE4InstallationUpdateSite.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%A4%D0%B0%D0%B9%D0%BB:BE4InstallationUpdateSite.png"/>
				<updated>2016-06-21T11:03:35Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0_BeanExplorer4</id>
		<title>Установка BeanExplorer4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0_BeanExplorer4"/>
				<updated>2016-06-21T11:03:14Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: Новая страница: «Для установки BeanExplorer4 надо иметь установленный Eclipse Luna и воспользоваться Eclipse Update Site по с…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Для установки BeanExplorer4 надо иметь установленный Eclipse Luna и воспользоваться Eclipse Update Site по следующему адресу:&lt;br /&gt;
&lt;br /&gt;
\\logrus.dote.ru\pub2\be4\com.beanexplorer.be4.site &lt;br /&gt;
&lt;br /&gt;
Help -&amp;gt; Install New Software -&amp;gt; Add..., указать любое имя и этот путь:&lt;br /&gt;
&lt;br /&gt;
[[Файл:BE4InstallationUpdateSite.png]]&lt;br /&gt;
&lt;br /&gt;
Если ничего не видно, снять галочку Group items by category. Должно быть такое окошко:&lt;br /&gt;
&lt;br /&gt;
[[Файл:BE4InstallationInstall.png]]&lt;br /&gt;
&lt;br /&gt;
Выделить BeanExplorer4Feature, нажать Next, со всем согласиться, установить и перезапустить Eclipse.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0</id>
		<title>Заглавная страница</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0"/>
				<updated>2016-06-21T10:58:01Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== BeanExplorer4 ===&lt;br /&gt;
* [[BeanExplorer4]]&lt;br /&gt;
** [[Для разработчиков BE4]]&lt;br /&gt;
* [[Установка BeanExplorer4]] (для пользователей)&lt;br /&gt;
* [[Компиляция и запуск BeanExplorer4]] (для разработчиков)&lt;br /&gt;
* [[Использование ant]]&lt;br /&gt;
* [[Поддержка СУБД]]&lt;br /&gt;
* [[Типы колонок]]&lt;br /&gt;
* [[Структура проекта]]&lt;br /&gt;
* [[Usecases|Usecases с картиночками]]&lt;br /&gt;
* [[JavaScript Debugger]]&lt;br /&gt;
* [[Extras]]&lt;br /&gt;
* [[Entity template|Шаблоны для сущностей]]&lt;br /&gt;
&lt;br /&gt;
=== Freemarker ===&lt;br /&gt;
* [[Freemarker]]&lt;br /&gt;
* [[Встроенные функции]]&lt;br /&gt;
* [[Макросы]]&lt;br /&gt;
* [[Объекты]]&lt;br /&gt;
* [[Пользовательские макросы]]&lt;br /&gt;
* [[Создание своих макросов]]&lt;br /&gt;
* [[Built-ins]]&lt;br /&gt;
&lt;br /&gt;
=== BeanExplorer5 ===&lt;br /&gt;
* [[:Category:BeanExplorer5|Категория BeanExplorer5]]&lt;br /&gt;
* [[BeanExplorer5|BeanExplorer5]]&lt;br /&gt;
* [[BeanExplorer5 API|BeanExplorer5 API]]&lt;br /&gt;
* [[BE-SQL|SQL-диалект BeanExplorer5]]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Внешние ссылки ===&lt;br /&gt;
* BeanExplorer4 на Edge Wiki [https://sites.google.com/a/developmentontheedge.com/wiki/home/proektnaadokumentacia/beanexplorer4]&lt;br /&gt;
----&lt;br /&gt;
Количество статей в вики: '''[[:Special:Statistics|{{NUMBEROFARTICLES}}]]'''.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_ant</id>
		<title>Использование ant</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_ant"/>
				<updated>2016-06-01T06:35:40Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: /* Инструментарий */ BE4_SQL_CONSOLE&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Помимо использования IDE основной be4-функционал доступен с помощью ant-таргетов.&lt;br /&gt;
&lt;br /&gt;
=== Стандартные таргеты ===&lt;br /&gt;
&lt;br /&gt;
В проектах на be4 определены следующие ant-таргеты:&lt;br /&gt;
* '''be.validate''' — валидация [[Project|проекта]] (вычитывание всех файлов, базовые проверки на корректность, исполнение всего [[Freemarker]]; никаких обращений к базе не делается)&lt;br /&gt;
* '''be.update''' — инкрементальное обновление схемы, метаданных и локализаций. Если обновление схемы может привести к потере данных, операция будет отклонена. Для принудительного выполнения определите BE4_FORCE_UPDATE=true&lt;br /&gt;
* '''be.meta''' — инкрементальное обновление метаданных (включая roles, icons, references, page customizations, pages)&lt;br /&gt;
* '''be.locale''' — инкрементальное обновление локализаций&lt;br /&gt;
* '''be.ddl''' — инкрементальное обновление схемы. Для принудительного выполнения определите BE4_FORCE_UPDATE=true. Для обновления схемы клонированных таблиц используйте BE4_CLONES=true.&lt;br /&gt;
* '''be.ddl.check''' — вывод SQL-предложений, которые потребуются для инкрементального обновления схемы. Никаких изменений в базу не вносится. Для учёта клонированных таблиц используйте BE4_CLONES=true.&lt;br /&gt;
* '''setup.db''' — полное разворачивание базы с нуля (как в BE)&lt;br /&gt;
* '''setup.meta''' — полное внесение метаданных и локализаций&lt;br /&gt;
* '''setup.just.meta''' — полное внесение метаданных&lt;br /&gt;
* '''setup.locale''' — полное внесение локализаций&lt;br /&gt;
* '''setup.adhoc''' — выполнение одного или нескольких FTL-скриптов из custom steps (передаются параметром -DA_SCRIPT='script1;script2'). Можно запускать скрипты из модуля (-DA_SCRIPT='realty:dictionaries') либо из всех модулей, где такой скрипт есть (-DA_SCRIPT='all:dictionaries')&lt;br /&gt;
* '''main''' (таргет по умолчанию) — сборка war&lt;br /&gt;
&lt;br /&gt;
=== Переменные ===&lt;br /&gt;
Имеются следующие BE4-специфичные переменные&lt;br /&gt;
* '''BE4_DIR''' — каталог с проектом be4 (без него ничего не заработает)&lt;br /&gt;
* '''BE4_PROFILE''' — если задано, указывает профиль соединения к базе данных (из connectionProfiles.*.yaml), который необходимо использовать.&lt;br /&gt;
* '''BE4_LOG_DIR''' — если задано, данный каталог будет использован для логирования BE4-операций.&lt;br /&gt;
* '''BE4_DEBUG''' — если &amp;quot;true&amp;quot;, будет выводиться дополнительная отладочная информация в stderr.&lt;br /&gt;
* '''BE4_FORCE_UPDATE''' — если &amp;quot;true&amp;quot;, будут выполняться потенциально опасные изменения в схеме базы данных (которые могут привести к потере пользовательских данных).&lt;br /&gt;
* '''BE4_CLONES''' — если &amp;quot;true&amp;quot;, изменения схемы коснутся также клонированных таблиц (у которых численный суффикс добавлен к имени таблицы).&lt;br /&gt;
* '''BE4_UNLOCK_PROTECTED_PROFILE''' — если &amp;quot;true&amp;quot;, защищённый (protected) [[BeConnectionProfile|профиль соединения]] будет использоваться без дополнительных подтверждений.&lt;br /&gt;
&lt;br /&gt;
* '''BE4_&amp;amp;lt;имя_модуля&amp;amp;gt;''' — если true, то будут использованы метаданные из BE4-модуля (BE4-модуль должен существовать), иначе — из старого BE-модуля с тем же именем.&lt;br /&gt;
&lt;br /&gt;
Только с таргетом be.validate:&lt;br /&gt;
* '''BE4_SKIP_VALIDATION'''=true — если задано, пропустить собственно валидацию (но прочие команды из списка ниже будут выполняться).&lt;br /&gt;
* '''BE4_RDBMS'''=mysql/postgres/oracle/db2/sqlserver/m4 — если задано, валидация будет выполняться с использованием соответствующей СУБД (это может повлиять на выполнение условных секций в FTL, результат разворачивания макросов, включения extras и т. д.).&lt;br /&gt;
* '''BE4_CHECK_QUERY'''=&amp;quot;entity.query&amp;quot; — если задано, текст указанного запроса после выполнения FTL будет выведен на экран). Если указана фиктивная BE4_RDBMS=m4, на место СУБД-специфичных FTL-функций будут подставлены соответствующие m4-функции (может пригодиться для обратного портирования кода в m4).&lt;br /&gt;
* '''BE4_CHECK_DDL'''=entity — если задано, DDL, необходимый для создания указанной сущности будет выведен на экран. Если указана фиктивная BE4_RDBMS=m4, будет сгенерирован соответствующий m4-код (может пригодиться для обратного портирования кода в m4).&lt;br /&gt;
* '''BE4_CHECK_ROLES'''=true — если задано, на экран будет выведен список ролей проекта, действующий в данных условиях. Может пригодиться, если часть ролей устанавливается условно через extras и хочется проверить, правильно ли отработали условия.&lt;br /&gt;
* '''BE4_CREATE_PROFILE_PROPERTIES'''=&amp;lt;file_path&amp;gt; — создаёт файл properties со свойствами профиля соединения и проекта, который может пригодиться для старой системы тестирования.&lt;br /&gt;
* '''BE4_SAVE'''=true — если задано, проект будет пересохранён (только основной проект, без учёта подключенных модулей) с помощью той же процедуры, как при сохранении через Eclipse. Могут быть отсортированы или переформатированы некоторые элементы проекта.&lt;br /&gt;
&lt;br /&gt;
=== Задачи ===&lt;br /&gt;
При редактировании ant-скриптов можно использовать следующие задачи (tasks):&lt;br /&gt;
* '''be4.db''' — создание базы по BE4-проекту. Параметры:&lt;br /&gt;
:* modules: если true, будут использованы BE4-модули&lt;br /&gt;
&lt;br /&gt;
* '''be4.meta''' — синхронизация. Параметры:&lt;br /&gt;
:* modules: если true, будут использованы BE4-модули&lt;br /&gt;
:* mode: режим синхронизации (all, meta, locale, ddl, ddl_clones, security). Если установлено -DBE4_CLONES=true, то режим ddl превращается сам в ddl_clones (добавляется обновление схемы клонированных таблиц).&lt;br /&gt;
&lt;br /&gt;
* '''be4.data''' — выполнение скрипта или набора скриптов. Параметры:&lt;br /&gt;
:* scriptName: имена скриптов через точку с запятой. Можно написать moduleName:scriptName для выполнения скрипта из модуля, либо all:scriptName для выполнения скрипта с таким именем из всех модулей.&lt;br /&gt;
&lt;br /&gt;
* '''be4.validate''' — валидировать BE4-проект и (для немодульного проекта) заполнить свойства ANT из модели&lt;br /&gt;
:* modules: если true, будут подключены BE4-модули. Рекомендуется ставить в true всегда кроме каких-то частных случаев, когда важна производительность.&lt;br /&gt;
&lt;br /&gt;
* '''be4.tools''' — дополнительный инструментарий BE4.&lt;br /&gt;
&lt;br /&gt;
У всех задач есть общие параметры:&lt;br /&gt;
* projectPath (обязательно) — путь к проекту&lt;br /&gt;
* logDir — каталог для логирования (переопределяет переменную BE4_LOG_DIR)&lt;br /&gt;
* useMeta — экспериментальная опция: использовать базовые beanexplorer-метаданные из YAML-проекта beanexplorer_meta без вычитывания базы инициализированной через m4.&lt;br /&gt;
&lt;br /&gt;
=== Инструментарий ===&lt;br /&gt;
Для технических операций имеется специальная ant-задача '''be4.tools'''. По умолчанию эта задача не соответствует никакому ant-таргету. Если она требуется, можно создать таргет, например, так:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;target name=&amp;quot;be.tools&amp;quot; depends=&amp;quot;be4_settings&amp;quot;&amp;gt;&amp;lt;be4.tools projectPath=&amp;quot;${project.home}&amp;quot;/&amp;gt;&amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для пользования инструментами необходимо задавать дополнительные свойства:&lt;br /&gt;
* '''BE4_DUMP_TABLES'''=&amp;quot;таблица1,таблица2,...&amp;quot; — сдампить из базы соответствующей текущему connection-profile заданные таблицы в новый yaml-проект (будет создан подкаталог yamlDump в текущем каталоге). Может пригодиться для создания болванки при переносе таблиц из m4 в yaml. Пример:&lt;br /&gt;
 ant be.tools -DBE4_PROFILE=foo -DBE4_DUMP_TABLES=users,queries,operations&lt;br /&gt;
&lt;br /&gt;
:В дампе присутствуют все [[Query|представления]], [[Operation|операции]] и схемы указанных [[Entity|сущностей]], а также сообщения [[EntityLocalizations|локализации]] с таким же entityName. Кроме того, содерижмое сущностей с типом dictionary (в которых менее 10000 строк) дампится в ftl-скрипты, которые автоматически подключены из dictionaries.ftl.&lt;br /&gt;
&lt;br /&gt;
* '''BE4_SQL_CONSOLE'''=true — включить FTL/SQL-консоль в контексте текущего проекта и выбранного профиля соединения. Далее можно в интерактивном режиме вводить FTL, который будет преобразовываться в SQL и выполняться. Если просто хочется выполнить FTL, можно начинать с комментария //. К примеру, если хотим проверить как раскрывается макрос:&lt;br /&gt;
&lt;br /&gt;
 Enter FTL/SQL (use 'quit' to exit):&lt;br /&gt;
 //${CRM_AGE('date', 'date2')}&lt;br /&gt;
 SQL&amp;gt; //            CAST(EXTRACT(YEAR FROM AGE(date2,date)) AS INTEGER)&lt;br /&gt;
&lt;br /&gt;
:Если комментарий не использовать, запрос выполнится (выводится до 20 строк результата):&lt;br /&gt;
&lt;br /&gt;
 Enter FTL/SQL (use 'quit' to exit):&lt;br /&gt;
 SELECT * FROM entities LIMIT 5;&lt;br /&gt;
 SQL&amp;gt; SELECT * FROM entities LIMIT 5;&lt;br /&gt;
 | name                  | displayname           | primarykeycolumn | type              | entitymodel | origin       |&lt;br /&gt;
 |-----------------------|-----------------------|------------------|-------------------|-------------|--------------|&lt;br /&gt;
 | operations_per_status | operations_per_status | ID               | metadata          | null        | beanexplorer |&lt;br /&gt;
 | jsprograms            | jsprograms            | publicID         | metadata          | null        | beanexplorer |&lt;br /&gt;
 | operationExtension    | operationExtension    | ID               | metadata          | null        | beanexplorer |&lt;br /&gt;
 | pageCustomisation     | pageCustomisation     | ID               | metadata          | null        | beanexplorer |&lt;br /&gt;
 | icons                 | Icons                 | ID               | genericCollection | null        | beanexplorer |&lt;br /&gt;
&lt;br /&gt;
Для компиляции самого BE4 (в объёме необходимом для последующего использования вышеуказанных ant-таргетов) необходимо набрать ant в каталоге be4/src. Не требуется никаких внешних зависимостей.&lt;br /&gt;
&lt;br /&gt;
== Использование вне приложений ==&lt;br /&gt;
Следующие цели можно запускать без какого-либо приложения, т.е. досаточно просто зайти в папку be4/src и написать &amp;quot;ant someTarget&amp;quot;:&lt;br /&gt;
* '''wizard''' — позволяет генерировать новые BE4 приложения. Функционал аналогичен функционалу создания нового приложения в BEclipse (File → New → Project → BeanExplorer → BeanExplorer Project), однако все данные вводятся в консоли, а не в GUI.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BE-SQL</id>
		<title>BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BE-SQL"/>
				<updated>2016-05-04T06:08:31Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: /* Что точно не работает пока */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BE-SQL''' — диалект SQL, который поддерживается BeanExplorer SQL Parser. Поддерживаются только запросы SELECT. Больше всего он похож на PostgreSQL, но некоторые конструкции из других диалектов тоже поддерживаются. Он также должен понимать различные BE-специфичные теги вроде &amp;lt;if&amp;gt;, &amp;lt;unless&amp;gt; и т. д. В данный момент находится в разработке: не все реальные запросы из проектов успешно разбираются BE-SQL.&lt;br /&gt;
&lt;br /&gt;
Соответствие FreeMarker-конструкций и BE-SQL конструкций:&lt;br /&gt;
&lt;br /&gt;
* chr(...) — CHR() или CHAR()&lt;br /&gt;
* concat(...) — CONCAT() или ||&lt;br /&gt;
* coalesce(...) — COALESCE() или IFNULL()&lt;br /&gt;
* round(...) — ROUND()&lt;br /&gt;
* length(...) — LENGTH() или LEN()&lt;br /&gt;
* lpad(...) — LPAD()&lt;br /&gt;
* replace(...) — REPLACE()&lt;br /&gt;
* substring(...) — SUBSTR() или SUBSTRING()&lt;br /&gt;
* if(...) — IF() (может транслироваться в предложение CASE WHEN ...)&lt;br /&gt;
* ?dateFormat — FORMAT_DATE()&lt;br /&gt;
* ?dateTimeFormat — FORMAT_DATETIME()&lt;br /&gt;
* ?dateFormatRus — FORMAT_DATE_RUS()&lt;br /&gt;
* ?asInt — CAST(x AS BIGINT), TO_NUMBER(x)&lt;br /&gt;
* ?asVarChar — CAST(x AS CHAR), CAST(x AS VARCHAR), TO_CHAR(x)&lt;br /&gt;
* ?asDate — CAST(x AS DATE), TO_DATE(x)&lt;br /&gt;
* ?asPK — CAST(x AS KEY), TO_KEY(x)&lt;br /&gt;
* ?lower — LOWER()&lt;br /&gt;
* ?upper — UPPER()&lt;br /&gt;
* ?monthStart — DATE_TRUNC('MONTH', x)&lt;br /&gt;
* ?yearStart — DATE_TRUNC('YEAR', x)&lt;br /&gt;
* ?year — YEAR(), EXTRACT(YEAR FROM x)&lt;br /&gt;
* ?month — MONTH(), EXTRACT(MONTH FROM x)&lt;br /&gt;
* ?day — DAY(), EXTRACT(DAY FROM x)&lt;br /&gt;
* ?indexOf — INSTR(string, subString) или POSITION(subString IN string)&lt;br /&gt;
* ?str — просто пишите в 'одинарных кавычках', экранируйте одинарную кавычку с помощью '\'&lt;br /&gt;
* ?quote — просто пишите в &amp;quot;двойных кавычках&amp;quot; или в `обратных кавычках`, оба варианта должны сработать и транслироваться при необходимости&lt;br /&gt;
* currentDateTime — CURRENT_TIMESTAMP или NOW()&lt;br /&gt;
* currentDate — CURRENT_DATE&lt;br /&gt;
* addMonths(date,mon) — ADD_MONTHS(date, mon)&lt;br /&gt;
* addDays(date, days) — ADD_DAYS(date, days)&lt;br /&gt;
* addMillis(date, ms) — ADD_MILLIS(date, ms)&lt;br /&gt;
* fromFakeTable — FROM DUAL или можно не писать FROM вообще&lt;br /&gt;
&lt;br /&gt;
Для ограничения количества записей можно просто писать SELECT ... LIMIT 1: это транслируется в соответствующий диалект SQL.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых SQL-функций ===&lt;br /&gt;
&lt;br /&gt;
В скобках указываются синонимы&lt;br /&gt;
&lt;br /&gt;
 CONCAT, COALESCE (IFNULL), COUNT, SUM, MAX, MIN, SUBSTR (SUBSTRING), LENGTH (LEN), UPPER, LOWER, CHR (CHAR), TO_CHAR, TO_NUMBER, TO_DATE, TO_KEY,&lt;br /&gt;
 REPLACE, RTRIM, LTRIM, TRIM, LPAD, ROUND, TRUNC (TRUNCATE), INSTR (STRPOS), IF, NOW, FORMAT_DATE (=TO_CHAR(x, 'YYYY-MM-DD')), YEAR, MONTH, DAY, &lt;br /&gt;
 FORMAT_DATETIME (=TO_CHAR(x, 'YYYY-MM-DD HH24:MI:SS')), FORMAT_DATE_RUS (=TO_CHAR(x, 'DD.MM.YYYY')), FORMAT_DATE_RUS_SHORT (=TO_CHAR(x, 'DD.MM.YY')), &lt;br /&gt;
 FORMAT_MONTHYEAR(=TO_CHAR(x, 'month YYYY')), DATE_TRUNC, POSITION, DATE_ADD, ADD_MONTHS, ADD_DAYS, ADD_MILLIS, LAST_DAY, TIMESTAMPDIFF, YEARDIFF, &lt;br /&gt;
 MONTHDIFF, DAYDIFF, HOURDIFF, MINUTEDIFF, SECONDDIFF, LEAST, GREATEST, GROUPING, ROW_NUMBER, RANK.&lt;br /&gt;
&lt;br /&gt;
=== Функции для работы с датами и временем ===&lt;br /&gt;
&lt;br /&gt;
==== Форматирование даты ====&lt;br /&gt;
&lt;br /&gt;
Для форматирования даты в строку можно использовать &amp;lt;code&amp;gt;TO_CHAR(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;DATE_FORMAT(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt;. Строка формата должна быть одной из предопределённых констант из списка, иначе будет ошибка:&lt;br /&gt;
&lt;br /&gt;
* 'YYYY-MM-DD' или '%Y-%m-%d' (также можно использовать функцию FORMAT_DATE())&lt;br /&gt;
* 'YYYY-MM-DD HH24:MI:SS' или '%Y-%m-%d %H:%i:%S' (также можно использовать функцию FORMAT_DATETIME())&lt;br /&gt;
* 'DD.MM.YYYY' или '%d.%m.%Y' (также можно использовать функцию FORMAT_DATE_RUS())&lt;br /&gt;
* 'DD.MM.YY' или '%d.%m.%y' (также можно использовать функцию FORMAT_DATE_RUS_SHORT())&lt;br /&gt;
* 'month YYYY' или '%M %Y' (также можно использовать функцию FORMAT_MONTHYEAR())&lt;br /&gt;
* 'YYYY' или '%Y'&lt;br /&gt;
* 'MM' или '%m'&lt;br /&gt;
* 'DD' или '%d'&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATE(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATE&lt;br /&gt;
 ----------------------- -----------&lt;br /&gt;
 2016-03-04 11:12:38.360 2016-03-04&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATETIME(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATETIME&lt;br /&gt;
 ----------------------- -------------------&lt;br /&gt;
 2016-03-04 11:12:38.360 2016-03-04 11:12:38&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATE_RUS(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATE_RUS&lt;br /&gt;
 ----------------------- ---------------&lt;br /&gt;
 2016-03-04 11:12:38.360 04.03.2016&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATE_RUS_SHORT(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATE_RUS_SHORT&lt;br /&gt;
 ----------------------- ---------------------&lt;br /&gt;
 2016-03-04 11:12:38.360 04.03.16&lt;br /&gt;
&lt;br /&gt;
 SELECT TO_CHAR(NOW(), 'YYYY');&lt;br /&gt;
 -&amp;gt; 2016&lt;br /&gt;
&lt;br /&gt;
Для получения числа, месяца или года заданной даты в виде числа используются функции &amp;lt;code&amp;gt;DAY(дата)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MONTH(дата)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;YEAR(дата)&amp;lt;/code&amp;gt; соответственно:&lt;br /&gt;
&lt;br /&gt;
 SELECT YEAR(CURRENT_DATE);&lt;br /&gt;
 -&amp;gt; 2016&lt;br /&gt;
&lt;br /&gt;
Аналогично можно использовать &amp;lt;code&amp;gt;EXTRACT(YEAR FROM CURRENT_DATE)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Разница между датами ====&lt;br /&gt;
&lt;br /&gt;
Для получения разницы между датами в годах, месяцах, днях, часах, минутах или секундах используются следующие функции:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;YEARDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(YEAR FROM AGE(endDate, startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;MONTHDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(MONTH FROM AGE(endDate, startDate)) + 12 * EXTRACT(YEAR FROM AGE(endDate, startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;DAYDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(DAY FROM(endDate - startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;HOURDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;FLOOR(EXTRACT(EPOCH FROM(endDate - startDate)) / 3600)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;MINUTEDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;FLOOR(EXTRACT(EPOCH FROM(endDate - startDate)) / 60)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;SECONDDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(EPOCH FROM(endDate - startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 SELECT EXTRACT(YEAR FROM AGE('2015-05-01', '2013-02-01'));&lt;br /&gt;
 -&amp;gt; 2&lt;br /&gt;
&lt;br /&gt;
 SELECT YEARDIFF('2013-02-01', '2015-05-01');&lt;br /&gt;
 -&amp;gt; 2&lt;br /&gt;
&lt;br /&gt;
 SELECT MONTHDIFF('2013-02-01', '2015-05-01');&lt;br /&gt;
 -&amp;gt; 27&lt;br /&gt;
&lt;br /&gt;
Также можно использовать функцию &amp;lt;code&amp;gt;TIMESTAMPDIFF(&amp;lt;интервал&amp;gt;, startDate, endDate)&amp;lt;/code&amp;gt;, где в качестве интервала должно быть YEAR, MONTH, DAY, HOUR, MINUTE или SECOND.&lt;br /&gt;
&lt;br /&gt;
 SELECT TIMESTAMPDIFF(DAY, '2016-01-01', '2017-01-01');&lt;br /&gt;
 -&amp;gt; 366&lt;br /&gt;
&lt;br /&gt;
 SELECT TIMESTAMPDIFF(SECOND, '2016-01-01', '2016-01-02' );&lt;br /&gt;
 -&amp;gt; 86400&lt;br /&gt;
&lt;br /&gt;
==== Добавление интервала к дате ====&lt;br /&gt;
&lt;br /&gt;
Для добавления к дате месяцев, дней или миллисекунд используются функции &amp;lt;code&amp;gt;ADD_MONTHS(дата, количество)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ADD_DAYS(дата, количество)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ADD_MILLIS(дата, количество)&amp;lt;/code&amp;gt; соответственно:&lt;br /&gt;
&lt;br /&gt;
 SELECT CURRENT_DATE, ADD_MONTHS(CURRENT_DATE, 2);&lt;br /&gt;
 &lt;br /&gt;
 CURRENT_DATE ADD_MONTHS&lt;br /&gt;
 ------------ ----------&lt;br /&gt;
 2016-03-04   2016-05-04&lt;br /&gt;
&lt;br /&gt;
 SELECT CURRENT_DATE, ADD_DAYS(CURRENT_DATE, 7);&lt;br /&gt;
 &lt;br /&gt;
 CURRENT_DATE ADD_DAYS&lt;br /&gt;
 ------------ ----------&lt;br /&gt;
 2016-03-04   2016-03-11&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), ADD_MILLIS(NOW(), 3000);&lt;br /&gt;
 &lt;br /&gt;
 NOW                     ADD_MILLIS&lt;br /&gt;
 ----------------------- ----------------------- &lt;br /&gt;
 2016-03-04 11:12:38.360 2016-03-04 11:12:41.360&lt;br /&gt;
&lt;br /&gt;
==== Последний день месяца ====&lt;br /&gt;
&lt;br /&gt;
Для получения последнего дня месяца используется функция &amp;lt;code&amp;gt;LAST_DAY(дата)&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 SELECT CURRENT_DATE, LAST_DAY(CURRENT_DATE) &amp;quot;Last&amp;quot;, LAST_DAY(CURRENT_DATE) - CURRENT_DATE &amp;quot;Days Left&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 CURRENT_DATE Last       Days Left&lt;br /&gt;
 ------------ ---------- ---------&lt;br /&gt;
 2016-03-04   2016-03-31        27&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых операций ===&lt;br /&gt;
&lt;br /&gt;
 +, -, *, /, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, = (или ==), != (или &amp;lt;&amp;gt;), || (конкатенация строк), OR, AND (или &amp;amp;&amp;amp;), NOT (или !), LIKE, FLOOR, MOD (или %),&lt;br /&gt;
 &amp;amp; (побитовое и), | (побитовое или)&lt;br /&gt;
&lt;br /&gt;
=== Что точно не работает пока ===&lt;br /&gt;
&lt;br /&gt;
Использование этих возможностей скорее всего приведёт к ошибке валидации. В некоторых случаях к некорректному переформатированию в другом движке.&lt;br /&gt;
&lt;br /&gt;
* BE-теги &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; в некоторых нетривиальных местах. Так как в BE-SQL строится синтаксическое дерево, подобные теги нельзя размещать где угодно. Точно работает &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; в следующих местах:&lt;br /&gt;
** В списке колонок (&amp;lt;code&amp;gt;SELECT a, &amp;lt;if ...&amp;gt;b,&amp;lt;/if&amp;gt; c FROM table&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для UNION SELECT (&amp;lt;code&amp;gt;SELECT a FROM table &amp;lt;if ...&amp;gt;UNION SELECT b FROM table&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;, а также &amp;lt;code&amp;gt;&amp;lt;if ...&amp;gt;SELECT a FROM table UNION&amp;lt;/if&amp;gt; SELECT b FROM table&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для всего предложения WHERE (&amp;lt;code&amp;gt;SELECT a FROM table &amp;lt;if ...&amp;gt;WHERE b = c&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для всего предложения ORDER BY (&amp;lt;code&amp;gt;SELECT a FROM table &amp;lt;if ...&amp;gt;ORDER BY b&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для одной (не самой первой) из веток CASE WHEN (&amp;lt;code&amp;gt;SELECT CASE WHEN x &amp;gt; 5 THEN 'a' &amp;lt;if ...&amp;gt;WHEN x &amp;gt; 10 THEN 'b'&amp;lt;/if&amp;gt;ELSE 'c' END FROM table&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для одного или нескольких предложений JOIN (&amp;lt;code&amp;gt;SELECT a FROM table &amp;lt;if ...&amp;gt;JOIN table2 ON (...) JOIN table3 ON (...)&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для фрагмента булевого выражения, начинающегося с AND или OR (&amp;lt;code&amp;gt;SELECT a FROM table WHERE x &amp;gt; 2 &amp;lt;if ...&amp;gt;AND y &amp;gt; 3&amp;lt;/if&amp;gt;&amp;lt;if ...&amp;gt;OR z &amp;gt; 4&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для фрагмента конкатенации строк через ||, начинающегося с || (&amp;lt;code&amp;gt;SELECT a || b &amp;lt;if ...&amp;gt;|| c || d&amp;lt;/if&amp;gt; || e&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для простого выражения, обязательно с альтернативой (&amp;lt;code&amp;gt;SELECT a FROM table WHERE x &amp;gt; &amp;lt;if ...&amp;gt;5&amp;lt;else&amp;gt;6&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Внутри строкового литерала (&amp;lt;code&amp;gt;'&amp;lt;a href=&amp;quot;/test?&amp;lt;if parameter='xyz'&amp;gt;xyz=true&amp;amp;&amp;lt;/if&amp;gt;abc=true&amp;quot;&amp;gt;'&amp;lt;/code&amp;gt;)&lt;br /&gt;
* genericRef, joinGenericRef&lt;br /&gt;
&lt;br /&gt;
=== Создание макросов ===&lt;br /&gt;
&lt;br /&gt;
Предусмотрена возможность создания собственных макросов. Определение макроса начинается с &amp;lt;code&amp;gt;MACRO&amp;lt;/code&amp;gt;. За ним идет имя макроса и список аргументов в скобках, который может состоять из обязательных и следующих за ними аргументов с заданным по умолчанию значением. В случае отсутствия аргументов скобки нужно оставить пустыми. Далее следуют выражения, которые будут подставляться при вызове макроса, в их числе могут быть другие макросы, подстановки параметров, условные выражения. Заканчивается определение ключевым словом &amp;lt;code&amp;gt;END&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 MACRO MY_MACRO(arg1, arg2='000000')&lt;br /&gt;
 CONCAT(SUBSTR(arg1, 1, 5 ), arg2)&lt;br /&gt;
 END&lt;br /&gt;
&lt;br /&gt;
Вызываются макросы как обычные функции:&lt;br /&gt;
&lt;br /&gt;
 SELECT MY_MACRO(code) FROM table t;&lt;br /&gt;
&lt;br /&gt;
Такой запрос будет преобразован в &amp;lt;code&amp;gt;SELECT CONCAT(SUBSTR(code, 1, 5 ), '000000') FROM table t&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BE-SQL</id>
		<title>BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BE-SQL"/>
				<updated>2016-05-04T06:06:46Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: /* Список всех поддерживаемых операций */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BE-SQL''' — диалект SQL, который поддерживается BeanExplorer SQL Parser. Поддерживаются только запросы SELECT. Больше всего он похож на PostgreSQL, но некоторые конструкции из других диалектов тоже поддерживаются. Он также должен понимать различные BE-специфичные теги вроде &amp;lt;if&amp;gt;, &amp;lt;unless&amp;gt; и т. д. В данный момент находится в разработке: не все реальные запросы из проектов успешно разбираются BE-SQL.&lt;br /&gt;
&lt;br /&gt;
Соответствие FreeMarker-конструкций и BE-SQL конструкций:&lt;br /&gt;
&lt;br /&gt;
* chr(...) — CHR() или CHAR()&lt;br /&gt;
* concat(...) — CONCAT() или ||&lt;br /&gt;
* coalesce(...) — COALESCE() или IFNULL()&lt;br /&gt;
* round(...) — ROUND()&lt;br /&gt;
* length(...) — LENGTH() или LEN()&lt;br /&gt;
* lpad(...) — LPAD()&lt;br /&gt;
* replace(...) — REPLACE()&lt;br /&gt;
* substring(...) — SUBSTR() или SUBSTRING()&lt;br /&gt;
* if(...) — IF() (может транслироваться в предложение CASE WHEN ...)&lt;br /&gt;
* ?dateFormat — FORMAT_DATE()&lt;br /&gt;
* ?dateTimeFormat — FORMAT_DATETIME()&lt;br /&gt;
* ?dateFormatRus — FORMAT_DATE_RUS()&lt;br /&gt;
* ?asInt — CAST(x AS BIGINT), TO_NUMBER(x)&lt;br /&gt;
* ?asVarChar — CAST(x AS CHAR), CAST(x AS VARCHAR), TO_CHAR(x)&lt;br /&gt;
* ?asDate — CAST(x AS DATE), TO_DATE(x)&lt;br /&gt;
* ?asPK — CAST(x AS KEY), TO_KEY(x)&lt;br /&gt;
* ?lower — LOWER()&lt;br /&gt;
* ?upper — UPPER()&lt;br /&gt;
* ?monthStart — DATE_TRUNC('MONTH', x)&lt;br /&gt;
* ?yearStart — DATE_TRUNC('YEAR', x)&lt;br /&gt;
* ?year — YEAR(), EXTRACT(YEAR FROM x)&lt;br /&gt;
* ?month — MONTH(), EXTRACT(MONTH FROM x)&lt;br /&gt;
* ?day — DAY(), EXTRACT(DAY FROM x)&lt;br /&gt;
* ?indexOf — INSTR(string, subString) или POSITION(subString IN string)&lt;br /&gt;
* ?str — просто пишите в 'одинарных кавычках', экранируйте одинарную кавычку с помощью '\'&lt;br /&gt;
* ?quote — просто пишите в &amp;quot;двойных кавычках&amp;quot; или в `обратных кавычках`, оба варианта должны сработать и транслироваться при необходимости&lt;br /&gt;
* currentDateTime — CURRENT_TIMESTAMP или NOW()&lt;br /&gt;
* currentDate — CURRENT_DATE&lt;br /&gt;
* addMonths(date,mon) — ADD_MONTHS(date, mon)&lt;br /&gt;
* addDays(date, days) — ADD_DAYS(date, days)&lt;br /&gt;
* addMillis(date, ms) — ADD_MILLIS(date, ms)&lt;br /&gt;
* fromFakeTable — FROM DUAL или можно не писать FROM вообще&lt;br /&gt;
&lt;br /&gt;
Для ограничения количества записей можно просто писать SELECT ... LIMIT 1: это транслируется в соответствующий диалект SQL.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых SQL-функций ===&lt;br /&gt;
&lt;br /&gt;
В скобках указываются синонимы&lt;br /&gt;
&lt;br /&gt;
 CONCAT, COALESCE (IFNULL), COUNT, SUM, MAX, MIN, SUBSTR (SUBSTRING), LENGTH (LEN), UPPER, LOWER, CHR (CHAR), TO_CHAR, TO_NUMBER, TO_DATE, TO_KEY,&lt;br /&gt;
 REPLACE, RTRIM, LTRIM, TRIM, LPAD, ROUND, TRUNC (TRUNCATE), INSTR (STRPOS), IF, NOW, FORMAT_DATE (=TO_CHAR(x, 'YYYY-MM-DD')), YEAR, MONTH, DAY, &lt;br /&gt;
 FORMAT_DATETIME (=TO_CHAR(x, 'YYYY-MM-DD HH24:MI:SS')), FORMAT_DATE_RUS (=TO_CHAR(x, 'DD.MM.YYYY')), FORMAT_DATE_RUS_SHORT (=TO_CHAR(x, 'DD.MM.YY')), &lt;br /&gt;
 FORMAT_MONTHYEAR(=TO_CHAR(x, 'month YYYY')), DATE_TRUNC, POSITION, DATE_ADD, ADD_MONTHS, ADD_DAYS, ADD_MILLIS, LAST_DAY, TIMESTAMPDIFF, YEARDIFF, &lt;br /&gt;
 MONTHDIFF, DAYDIFF, HOURDIFF, MINUTEDIFF, SECONDDIFF, LEAST, GREATEST, GROUPING, ROW_NUMBER, RANK.&lt;br /&gt;
&lt;br /&gt;
=== Функции для работы с датами и временем ===&lt;br /&gt;
&lt;br /&gt;
==== Форматирование даты ====&lt;br /&gt;
&lt;br /&gt;
Для форматирования даты в строку можно использовать &amp;lt;code&amp;gt;TO_CHAR(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;DATE_FORMAT(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt;. Строка формата должна быть одной из предопределённых констант из списка, иначе будет ошибка:&lt;br /&gt;
&lt;br /&gt;
* 'YYYY-MM-DD' или '%Y-%m-%d' (также можно использовать функцию FORMAT_DATE())&lt;br /&gt;
* 'YYYY-MM-DD HH24:MI:SS' или '%Y-%m-%d %H:%i:%S' (также можно использовать функцию FORMAT_DATETIME())&lt;br /&gt;
* 'DD.MM.YYYY' или '%d.%m.%Y' (также можно использовать функцию FORMAT_DATE_RUS())&lt;br /&gt;
* 'DD.MM.YY' или '%d.%m.%y' (также можно использовать функцию FORMAT_DATE_RUS_SHORT())&lt;br /&gt;
* 'month YYYY' или '%M %Y' (также можно использовать функцию FORMAT_MONTHYEAR())&lt;br /&gt;
* 'YYYY' или '%Y'&lt;br /&gt;
* 'MM' или '%m'&lt;br /&gt;
* 'DD' или '%d'&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATE(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATE&lt;br /&gt;
 ----------------------- -----------&lt;br /&gt;
 2016-03-04 11:12:38.360 2016-03-04&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATETIME(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATETIME&lt;br /&gt;
 ----------------------- -------------------&lt;br /&gt;
 2016-03-04 11:12:38.360 2016-03-04 11:12:38&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATE_RUS(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATE_RUS&lt;br /&gt;
 ----------------------- ---------------&lt;br /&gt;
 2016-03-04 11:12:38.360 04.03.2016&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATE_RUS_SHORT(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATE_RUS_SHORT&lt;br /&gt;
 ----------------------- ---------------------&lt;br /&gt;
 2016-03-04 11:12:38.360 04.03.16&lt;br /&gt;
&lt;br /&gt;
 SELECT TO_CHAR(NOW(), 'YYYY');&lt;br /&gt;
 -&amp;gt; 2016&lt;br /&gt;
&lt;br /&gt;
Для получения числа, месяца или года заданной даты в виде числа используются функции &amp;lt;code&amp;gt;DAY(дата)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MONTH(дата)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;YEAR(дата)&amp;lt;/code&amp;gt; соответственно:&lt;br /&gt;
&lt;br /&gt;
 SELECT YEAR(CURRENT_DATE);&lt;br /&gt;
 -&amp;gt; 2016&lt;br /&gt;
&lt;br /&gt;
Аналогично можно использовать &amp;lt;code&amp;gt;EXTRACT(YEAR FROM CURRENT_DATE)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Разница между датами ====&lt;br /&gt;
&lt;br /&gt;
Для получения разницы между датами в годах, месяцах, днях, часах, минутах или секундах используются следующие функции:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;YEARDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(YEAR FROM AGE(endDate, startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;MONTHDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(MONTH FROM AGE(endDate, startDate)) + 12 * EXTRACT(YEAR FROM AGE(endDate, startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;DAYDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(DAY FROM(endDate - startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;HOURDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;FLOOR(EXTRACT(EPOCH FROM(endDate - startDate)) / 3600)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;MINUTEDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;FLOOR(EXTRACT(EPOCH FROM(endDate - startDate)) / 60)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;SECONDDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(EPOCH FROM(endDate - startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 SELECT EXTRACT(YEAR FROM AGE('2015-05-01', '2013-02-01'));&lt;br /&gt;
 -&amp;gt; 2&lt;br /&gt;
&lt;br /&gt;
 SELECT YEARDIFF('2013-02-01', '2015-05-01');&lt;br /&gt;
 -&amp;gt; 2&lt;br /&gt;
&lt;br /&gt;
 SELECT MONTHDIFF('2013-02-01', '2015-05-01');&lt;br /&gt;
 -&amp;gt; 27&lt;br /&gt;
&lt;br /&gt;
Также можно использовать функцию &amp;lt;code&amp;gt;TIMESTAMPDIFF(&amp;lt;интервал&amp;gt;, startDate, endDate)&amp;lt;/code&amp;gt;, где в качестве интервала должно быть YEAR, MONTH, DAY, HOUR, MINUTE или SECOND.&lt;br /&gt;
&lt;br /&gt;
 SELECT TIMESTAMPDIFF(DAY, '2016-01-01', '2017-01-01');&lt;br /&gt;
 -&amp;gt; 366&lt;br /&gt;
&lt;br /&gt;
 SELECT TIMESTAMPDIFF(SECOND, '2016-01-01', '2016-01-02' );&lt;br /&gt;
 -&amp;gt; 86400&lt;br /&gt;
&lt;br /&gt;
==== Добавление интервала к дате ====&lt;br /&gt;
&lt;br /&gt;
Для добавления к дате месяцев, дней или миллисекунд используются функции &amp;lt;code&amp;gt;ADD_MONTHS(дата, количество)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ADD_DAYS(дата, количество)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ADD_MILLIS(дата, количество)&amp;lt;/code&amp;gt; соответственно:&lt;br /&gt;
&lt;br /&gt;
 SELECT CURRENT_DATE, ADD_MONTHS(CURRENT_DATE, 2);&lt;br /&gt;
 &lt;br /&gt;
 CURRENT_DATE ADD_MONTHS&lt;br /&gt;
 ------------ ----------&lt;br /&gt;
 2016-03-04   2016-05-04&lt;br /&gt;
&lt;br /&gt;
 SELECT CURRENT_DATE, ADD_DAYS(CURRENT_DATE, 7);&lt;br /&gt;
 &lt;br /&gt;
 CURRENT_DATE ADD_DAYS&lt;br /&gt;
 ------------ ----------&lt;br /&gt;
 2016-03-04   2016-03-11&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), ADD_MILLIS(NOW(), 3000);&lt;br /&gt;
 &lt;br /&gt;
 NOW                     ADD_MILLIS&lt;br /&gt;
 ----------------------- ----------------------- &lt;br /&gt;
 2016-03-04 11:12:38.360 2016-03-04 11:12:41.360&lt;br /&gt;
&lt;br /&gt;
==== Последний день месяца ====&lt;br /&gt;
&lt;br /&gt;
Для получения последнего дня месяца используется функция &amp;lt;code&amp;gt;LAST_DAY(дата)&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 SELECT CURRENT_DATE, LAST_DAY(CURRENT_DATE) &amp;quot;Last&amp;quot;, LAST_DAY(CURRENT_DATE) - CURRENT_DATE &amp;quot;Days Left&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 CURRENT_DATE Last       Days Left&lt;br /&gt;
 ------------ ---------- ---------&lt;br /&gt;
 2016-03-04   2016-03-31        27&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых операций ===&lt;br /&gt;
&lt;br /&gt;
 +, -, *, /, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, = (или ==), != (или &amp;lt;&amp;gt;), || (конкатенация строк), OR, AND (или &amp;amp;&amp;amp;), NOT (или !), LIKE, FLOOR, MOD (или %),&lt;br /&gt;
 &amp;amp; (побитовое и), | (побитовое или)&lt;br /&gt;
&lt;br /&gt;
=== Что точно не работает пока ===&lt;br /&gt;
&lt;br /&gt;
Использование этих возможностей скорее всего приведёт к ошибке валидации. В некоторых случаях к некорректному переформатированию в другом движке.&lt;br /&gt;
&lt;br /&gt;
* BE-теги &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; в некоторых нетривиальных местах. Так как в BE-SQL строится синтаксическое дерево, подобные теги нельзя размещать где угодно. Точно работает &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; в следующих местах:&lt;br /&gt;
** В списке колонок (&amp;lt;code&amp;gt;SELECT a, &amp;lt;if ...&amp;gt;b,&amp;lt;/if&amp;gt; c FROM table&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для UNION SELECT (&amp;lt;code&amp;gt;SELECT a FROM table &amp;lt;if ...&amp;gt;UNION SELECT b FROM table&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;, а также &amp;lt;code&amp;gt;&amp;lt;if ...&amp;gt;SELECT a FROM table UNION&amp;lt;/if&amp;gt; SELECT b FROM table&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для всего предложения WHERE (&amp;lt;code&amp;gt;SELECT a FROM table &amp;lt;if ...&amp;gt;WHERE b = c&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для всего предложения ORDER BY (&amp;lt;code&amp;gt;SELECT a FROM table &amp;lt;if ...&amp;gt;ORDER BY b&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для одной (не самой первой) из веток CASE WHEN (&amp;lt;code&amp;gt;SELECT CASE WHEN x &amp;gt; 5 THEN 'a' &amp;lt;if ...&amp;gt;WHEN x &amp;gt; 10 THEN 'b'&amp;lt;/if&amp;gt;ELSE 'c' END FROM table&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для одного или нескольких предложений JOIN (&amp;lt;code&amp;gt;SELECT a FROM table &amp;lt;if ...&amp;gt;JOIN table2 ON (...) JOIN table3 ON (...)&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для фрагмента булевого выражения, начинающегося с AND или OR (&amp;lt;code&amp;gt;SELECT a FROM table WHERE x &amp;gt; 2 &amp;lt;if ...&amp;gt;AND y &amp;gt; 3&amp;lt;/if&amp;gt;&amp;lt;if ...&amp;gt;OR z &amp;gt; 4&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для простого выражения, обязательно с альтернативой (&amp;lt;code&amp;gt;SELECT a FROM table WHERE x &amp;gt; &amp;lt;if ...&amp;gt;5&amp;lt;else&amp;gt;6&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Внутри строкового литерала (&amp;lt;code&amp;gt;'&amp;lt;a href=&amp;quot;/test?&amp;lt;if parameter='xyz'&amp;gt;xyz=true&amp;amp;&amp;lt;/if&amp;gt;abc=true&amp;quot;&amp;gt;'&amp;lt;/code&amp;gt;)&lt;br /&gt;
* genericRef, joinGenericRef&lt;br /&gt;
&lt;br /&gt;
=== Создание макросов ===&lt;br /&gt;
&lt;br /&gt;
Предусмотрена возможность создания собственных макросов. Определение макроса начинается с &amp;lt;code&amp;gt;MACRO&amp;lt;/code&amp;gt;. За ним идет имя макроса и список аргументов в скобках, который может состоять из обязательных и следующих за ними аргументов с заданным по умолчанию значением. В случае отсутствия аргументов скобки нужно оставить пустыми. Далее следуют выражения, которые будут подставляться при вызове макроса, в их числе могут быть другие макросы, подстановки параметров, условные выражения. Заканчивается определение ключевым словом &amp;lt;code&amp;gt;END&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 MACRO MY_MACRO(arg1, arg2='000000')&lt;br /&gt;
 CONCAT(SUBSTR(arg1, 1, 5 ), arg2)&lt;br /&gt;
 END&lt;br /&gt;
&lt;br /&gt;
Вызываются макросы как обычные функции:&lt;br /&gt;
&lt;br /&gt;
 SELECT MY_MACRO(code) FROM table t;&lt;br /&gt;
&lt;br /&gt;
Такой запрос будет преобразован в &amp;lt;code&amp;gt;SELECT CONCAT(SUBSTR(code, 1, 5 ), '000000') FROM table t&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BE-SQL</id>
		<title>BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BE-SQL"/>
				<updated>2016-05-04T06:06:35Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: /* Список всех поддерживаемых операций */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BE-SQL''' — диалект SQL, который поддерживается BeanExplorer SQL Parser. Поддерживаются только запросы SELECT. Больше всего он похож на PostgreSQL, но некоторые конструкции из других диалектов тоже поддерживаются. Он также должен понимать различные BE-специфичные теги вроде &amp;lt;if&amp;gt;, &amp;lt;unless&amp;gt; и т. д. В данный момент находится в разработке: не все реальные запросы из проектов успешно разбираются BE-SQL.&lt;br /&gt;
&lt;br /&gt;
Соответствие FreeMarker-конструкций и BE-SQL конструкций:&lt;br /&gt;
&lt;br /&gt;
* chr(...) — CHR() или CHAR()&lt;br /&gt;
* concat(...) — CONCAT() или ||&lt;br /&gt;
* coalesce(...) — COALESCE() или IFNULL()&lt;br /&gt;
* round(...) — ROUND()&lt;br /&gt;
* length(...) — LENGTH() или LEN()&lt;br /&gt;
* lpad(...) — LPAD()&lt;br /&gt;
* replace(...) — REPLACE()&lt;br /&gt;
* substring(...) — SUBSTR() или SUBSTRING()&lt;br /&gt;
* if(...) — IF() (может транслироваться в предложение CASE WHEN ...)&lt;br /&gt;
* ?dateFormat — FORMAT_DATE()&lt;br /&gt;
* ?dateTimeFormat — FORMAT_DATETIME()&lt;br /&gt;
* ?dateFormatRus — FORMAT_DATE_RUS()&lt;br /&gt;
* ?asInt — CAST(x AS BIGINT), TO_NUMBER(x)&lt;br /&gt;
* ?asVarChar — CAST(x AS CHAR), CAST(x AS VARCHAR), TO_CHAR(x)&lt;br /&gt;
* ?asDate — CAST(x AS DATE), TO_DATE(x)&lt;br /&gt;
* ?asPK — CAST(x AS KEY), TO_KEY(x)&lt;br /&gt;
* ?lower — LOWER()&lt;br /&gt;
* ?upper — UPPER()&lt;br /&gt;
* ?monthStart — DATE_TRUNC('MONTH', x)&lt;br /&gt;
* ?yearStart — DATE_TRUNC('YEAR', x)&lt;br /&gt;
* ?year — YEAR(), EXTRACT(YEAR FROM x)&lt;br /&gt;
* ?month — MONTH(), EXTRACT(MONTH FROM x)&lt;br /&gt;
* ?day — DAY(), EXTRACT(DAY FROM x)&lt;br /&gt;
* ?indexOf — INSTR(string, subString) или POSITION(subString IN string)&lt;br /&gt;
* ?str — просто пишите в 'одинарных кавычках', экранируйте одинарную кавычку с помощью '\'&lt;br /&gt;
* ?quote — просто пишите в &amp;quot;двойных кавычках&amp;quot; или в `обратных кавычках`, оба варианта должны сработать и транслироваться при необходимости&lt;br /&gt;
* currentDateTime — CURRENT_TIMESTAMP или NOW()&lt;br /&gt;
* currentDate — CURRENT_DATE&lt;br /&gt;
* addMonths(date,mon) — ADD_MONTHS(date, mon)&lt;br /&gt;
* addDays(date, days) — ADD_DAYS(date, days)&lt;br /&gt;
* addMillis(date, ms) — ADD_MILLIS(date, ms)&lt;br /&gt;
* fromFakeTable — FROM DUAL или можно не писать FROM вообще&lt;br /&gt;
&lt;br /&gt;
Для ограничения количества записей можно просто писать SELECT ... LIMIT 1: это транслируется в соответствующий диалект SQL.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых SQL-функций ===&lt;br /&gt;
&lt;br /&gt;
В скобках указываются синонимы&lt;br /&gt;
&lt;br /&gt;
 CONCAT, COALESCE (IFNULL), COUNT, SUM, MAX, MIN, SUBSTR (SUBSTRING), LENGTH (LEN), UPPER, LOWER, CHR (CHAR), TO_CHAR, TO_NUMBER, TO_DATE, TO_KEY,&lt;br /&gt;
 REPLACE, RTRIM, LTRIM, TRIM, LPAD, ROUND, TRUNC (TRUNCATE), INSTR (STRPOS), IF, NOW, FORMAT_DATE (=TO_CHAR(x, 'YYYY-MM-DD')), YEAR, MONTH, DAY, &lt;br /&gt;
 FORMAT_DATETIME (=TO_CHAR(x, 'YYYY-MM-DD HH24:MI:SS')), FORMAT_DATE_RUS (=TO_CHAR(x, 'DD.MM.YYYY')), FORMAT_DATE_RUS_SHORT (=TO_CHAR(x, 'DD.MM.YY')), &lt;br /&gt;
 FORMAT_MONTHYEAR(=TO_CHAR(x, 'month YYYY')), DATE_TRUNC, POSITION, DATE_ADD, ADD_MONTHS, ADD_DAYS, ADD_MILLIS, LAST_DAY, TIMESTAMPDIFF, YEARDIFF, &lt;br /&gt;
 MONTHDIFF, DAYDIFF, HOURDIFF, MINUTEDIFF, SECONDDIFF, LEAST, GREATEST, GROUPING, ROW_NUMBER, RANK.&lt;br /&gt;
&lt;br /&gt;
=== Функции для работы с датами и временем ===&lt;br /&gt;
&lt;br /&gt;
==== Форматирование даты ====&lt;br /&gt;
&lt;br /&gt;
Для форматирования даты в строку можно использовать &amp;lt;code&amp;gt;TO_CHAR(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;DATE_FORMAT(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt;. Строка формата должна быть одной из предопределённых констант из списка, иначе будет ошибка:&lt;br /&gt;
&lt;br /&gt;
* 'YYYY-MM-DD' или '%Y-%m-%d' (также можно использовать функцию FORMAT_DATE())&lt;br /&gt;
* 'YYYY-MM-DD HH24:MI:SS' или '%Y-%m-%d %H:%i:%S' (также можно использовать функцию FORMAT_DATETIME())&lt;br /&gt;
* 'DD.MM.YYYY' или '%d.%m.%Y' (также можно использовать функцию FORMAT_DATE_RUS())&lt;br /&gt;
* 'DD.MM.YY' или '%d.%m.%y' (также можно использовать функцию FORMAT_DATE_RUS_SHORT())&lt;br /&gt;
* 'month YYYY' или '%M %Y' (также можно использовать функцию FORMAT_MONTHYEAR())&lt;br /&gt;
* 'YYYY' или '%Y'&lt;br /&gt;
* 'MM' или '%m'&lt;br /&gt;
* 'DD' или '%d'&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATE(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATE&lt;br /&gt;
 ----------------------- -----------&lt;br /&gt;
 2016-03-04 11:12:38.360 2016-03-04&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATETIME(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATETIME&lt;br /&gt;
 ----------------------- -------------------&lt;br /&gt;
 2016-03-04 11:12:38.360 2016-03-04 11:12:38&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATE_RUS(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATE_RUS&lt;br /&gt;
 ----------------------- ---------------&lt;br /&gt;
 2016-03-04 11:12:38.360 04.03.2016&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATE_RUS_SHORT(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATE_RUS_SHORT&lt;br /&gt;
 ----------------------- ---------------------&lt;br /&gt;
 2016-03-04 11:12:38.360 04.03.16&lt;br /&gt;
&lt;br /&gt;
 SELECT TO_CHAR(NOW(), 'YYYY');&lt;br /&gt;
 -&amp;gt; 2016&lt;br /&gt;
&lt;br /&gt;
Для получения числа, месяца или года заданной даты в виде числа используются функции &amp;lt;code&amp;gt;DAY(дата)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MONTH(дата)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;YEAR(дата)&amp;lt;/code&amp;gt; соответственно:&lt;br /&gt;
&lt;br /&gt;
 SELECT YEAR(CURRENT_DATE);&lt;br /&gt;
 -&amp;gt; 2016&lt;br /&gt;
&lt;br /&gt;
Аналогично можно использовать &amp;lt;code&amp;gt;EXTRACT(YEAR FROM CURRENT_DATE)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Разница между датами ====&lt;br /&gt;
&lt;br /&gt;
Для получения разницы между датами в годах, месяцах, днях, часах, минутах или секундах используются следующие функции:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;YEARDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(YEAR FROM AGE(endDate, startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;MONTHDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(MONTH FROM AGE(endDate, startDate)) + 12 * EXTRACT(YEAR FROM AGE(endDate, startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;DAYDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(DAY FROM(endDate - startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;HOURDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;FLOOR(EXTRACT(EPOCH FROM(endDate - startDate)) / 3600)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;MINUTEDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;FLOOR(EXTRACT(EPOCH FROM(endDate - startDate)) / 60)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;SECONDDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(EPOCH FROM(endDate - startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 SELECT EXTRACT(YEAR FROM AGE('2015-05-01', '2013-02-01'));&lt;br /&gt;
 -&amp;gt; 2&lt;br /&gt;
&lt;br /&gt;
 SELECT YEARDIFF('2013-02-01', '2015-05-01');&lt;br /&gt;
 -&amp;gt; 2&lt;br /&gt;
&lt;br /&gt;
 SELECT MONTHDIFF('2013-02-01', '2015-05-01');&lt;br /&gt;
 -&amp;gt; 27&lt;br /&gt;
&lt;br /&gt;
Также можно использовать функцию &amp;lt;code&amp;gt;TIMESTAMPDIFF(&amp;lt;интервал&amp;gt;, startDate, endDate)&amp;lt;/code&amp;gt;, где в качестве интервала должно быть YEAR, MONTH, DAY, HOUR, MINUTE или SECOND.&lt;br /&gt;
&lt;br /&gt;
 SELECT TIMESTAMPDIFF(DAY, '2016-01-01', '2017-01-01');&lt;br /&gt;
 -&amp;gt; 366&lt;br /&gt;
&lt;br /&gt;
 SELECT TIMESTAMPDIFF(SECOND, '2016-01-01', '2016-01-02' );&lt;br /&gt;
 -&amp;gt; 86400&lt;br /&gt;
&lt;br /&gt;
==== Добавление интервала к дате ====&lt;br /&gt;
&lt;br /&gt;
Для добавления к дате месяцев, дней или миллисекунд используются функции &amp;lt;code&amp;gt;ADD_MONTHS(дата, количество)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ADD_DAYS(дата, количество)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ADD_MILLIS(дата, количество)&amp;lt;/code&amp;gt; соответственно:&lt;br /&gt;
&lt;br /&gt;
 SELECT CURRENT_DATE, ADD_MONTHS(CURRENT_DATE, 2);&lt;br /&gt;
 &lt;br /&gt;
 CURRENT_DATE ADD_MONTHS&lt;br /&gt;
 ------------ ----------&lt;br /&gt;
 2016-03-04   2016-05-04&lt;br /&gt;
&lt;br /&gt;
 SELECT CURRENT_DATE, ADD_DAYS(CURRENT_DATE, 7);&lt;br /&gt;
 &lt;br /&gt;
 CURRENT_DATE ADD_DAYS&lt;br /&gt;
 ------------ ----------&lt;br /&gt;
 2016-03-04   2016-03-11&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), ADD_MILLIS(NOW(), 3000);&lt;br /&gt;
 &lt;br /&gt;
 NOW                     ADD_MILLIS&lt;br /&gt;
 ----------------------- ----------------------- &lt;br /&gt;
 2016-03-04 11:12:38.360 2016-03-04 11:12:41.360&lt;br /&gt;
&lt;br /&gt;
==== Последний день месяца ====&lt;br /&gt;
&lt;br /&gt;
Для получения последнего дня месяца используется функция &amp;lt;code&amp;gt;LAST_DAY(дата)&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 SELECT CURRENT_DATE, LAST_DAY(CURRENT_DATE) &amp;quot;Last&amp;quot;, LAST_DAY(CURRENT_DATE) - CURRENT_DATE &amp;quot;Days Left&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 CURRENT_DATE Last       Days Left&lt;br /&gt;
 ------------ ---------- ---------&lt;br /&gt;
 2016-03-04   2016-03-31        27&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых операций ===&lt;br /&gt;
&lt;br /&gt;
 +, -, *, /, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, = (или ==), != (или &amp;lt;&amp;gt;), || (конкатенация строк), OR, AND (или &amp;amp;&amp;amp;), NOT (или !), LIKE, FLOOR, MOD (или %), &amp;amp; (побитовое и), | (побитовое или)&lt;br /&gt;
&lt;br /&gt;
=== Что точно не работает пока ===&lt;br /&gt;
&lt;br /&gt;
Использование этих возможностей скорее всего приведёт к ошибке валидации. В некоторых случаях к некорректному переформатированию в другом движке.&lt;br /&gt;
&lt;br /&gt;
* BE-теги &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; в некоторых нетривиальных местах. Так как в BE-SQL строится синтаксическое дерево, подобные теги нельзя размещать где угодно. Точно работает &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; в следующих местах:&lt;br /&gt;
** В списке колонок (&amp;lt;code&amp;gt;SELECT a, &amp;lt;if ...&amp;gt;b,&amp;lt;/if&amp;gt; c FROM table&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для UNION SELECT (&amp;lt;code&amp;gt;SELECT a FROM table &amp;lt;if ...&amp;gt;UNION SELECT b FROM table&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;, а также &amp;lt;code&amp;gt;&amp;lt;if ...&amp;gt;SELECT a FROM table UNION&amp;lt;/if&amp;gt; SELECT b FROM table&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для всего предложения WHERE (&amp;lt;code&amp;gt;SELECT a FROM table &amp;lt;if ...&amp;gt;WHERE b = c&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для всего предложения ORDER BY (&amp;lt;code&amp;gt;SELECT a FROM table &amp;lt;if ...&amp;gt;ORDER BY b&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для одной (не самой первой) из веток CASE WHEN (&amp;lt;code&amp;gt;SELECT CASE WHEN x &amp;gt; 5 THEN 'a' &amp;lt;if ...&amp;gt;WHEN x &amp;gt; 10 THEN 'b'&amp;lt;/if&amp;gt;ELSE 'c' END FROM table&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для одного или нескольких предложений JOIN (&amp;lt;code&amp;gt;SELECT a FROM table &amp;lt;if ...&amp;gt;JOIN table2 ON (...) JOIN table3 ON (...)&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для фрагмента булевого выражения, начинающегося с AND или OR (&amp;lt;code&amp;gt;SELECT a FROM table WHERE x &amp;gt; 2 &amp;lt;if ...&amp;gt;AND y &amp;gt; 3&amp;lt;/if&amp;gt;&amp;lt;if ...&amp;gt;OR z &amp;gt; 4&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для простого выражения, обязательно с альтернативой (&amp;lt;code&amp;gt;SELECT a FROM table WHERE x &amp;gt; &amp;lt;if ...&amp;gt;5&amp;lt;else&amp;gt;6&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Внутри строкового литерала (&amp;lt;code&amp;gt;'&amp;lt;a href=&amp;quot;/test?&amp;lt;if parameter='xyz'&amp;gt;xyz=true&amp;amp;&amp;lt;/if&amp;gt;abc=true&amp;quot;&amp;gt;'&amp;lt;/code&amp;gt;)&lt;br /&gt;
* genericRef, joinGenericRef&lt;br /&gt;
&lt;br /&gt;
=== Создание макросов ===&lt;br /&gt;
&lt;br /&gt;
Предусмотрена возможность создания собственных макросов. Определение макроса начинается с &amp;lt;code&amp;gt;MACRO&amp;lt;/code&amp;gt;. За ним идет имя макроса и список аргументов в скобках, который может состоять из обязательных и следующих за ними аргументов с заданным по умолчанию значением. В случае отсутствия аргументов скобки нужно оставить пустыми. Далее следуют выражения, которые будут подставляться при вызове макроса, в их числе могут быть другие макросы, подстановки параметров, условные выражения. Заканчивается определение ключевым словом &amp;lt;code&amp;gt;END&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 MACRO MY_MACRO(arg1, arg2='000000')&lt;br /&gt;
 CONCAT(SUBSTR(arg1, 1, 5 ), arg2)&lt;br /&gt;
 END&lt;br /&gt;
&lt;br /&gt;
Вызываются макросы как обычные функции:&lt;br /&gt;
&lt;br /&gt;
 SELECT MY_MACRO(code) FROM table t;&lt;br /&gt;
&lt;br /&gt;
Такой запрос будет преобразован в &amp;lt;code&amp;gt;SELECT CONCAT(SUBSTR(code, 1, 5 ), '000000') FROM table t&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BE-SQL</id>
		<title>BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BE-SQL"/>
				<updated>2016-05-04T06:04:51Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: /* Что точно не работает пока */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BE-SQL''' — диалект SQL, который поддерживается BeanExplorer SQL Parser. Поддерживаются только запросы SELECT. Больше всего он похож на PostgreSQL, но некоторые конструкции из других диалектов тоже поддерживаются. Он также должен понимать различные BE-специфичные теги вроде &amp;lt;if&amp;gt;, &amp;lt;unless&amp;gt; и т. д. В данный момент находится в разработке: не все реальные запросы из проектов успешно разбираются BE-SQL.&lt;br /&gt;
&lt;br /&gt;
Соответствие FreeMarker-конструкций и BE-SQL конструкций:&lt;br /&gt;
&lt;br /&gt;
* chr(...) — CHR() или CHAR()&lt;br /&gt;
* concat(...) — CONCAT() или ||&lt;br /&gt;
* coalesce(...) — COALESCE() или IFNULL()&lt;br /&gt;
* round(...) — ROUND()&lt;br /&gt;
* length(...) — LENGTH() или LEN()&lt;br /&gt;
* lpad(...) — LPAD()&lt;br /&gt;
* replace(...) — REPLACE()&lt;br /&gt;
* substring(...) — SUBSTR() или SUBSTRING()&lt;br /&gt;
* if(...) — IF() (может транслироваться в предложение CASE WHEN ...)&lt;br /&gt;
* ?dateFormat — FORMAT_DATE()&lt;br /&gt;
* ?dateTimeFormat — FORMAT_DATETIME()&lt;br /&gt;
* ?dateFormatRus — FORMAT_DATE_RUS()&lt;br /&gt;
* ?asInt — CAST(x AS BIGINT), TO_NUMBER(x)&lt;br /&gt;
* ?asVarChar — CAST(x AS CHAR), CAST(x AS VARCHAR), TO_CHAR(x)&lt;br /&gt;
* ?asDate — CAST(x AS DATE), TO_DATE(x)&lt;br /&gt;
* ?asPK — CAST(x AS KEY), TO_KEY(x)&lt;br /&gt;
* ?lower — LOWER()&lt;br /&gt;
* ?upper — UPPER()&lt;br /&gt;
* ?monthStart — DATE_TRUNC('MONTH', x)&lt;br /&gt;
* ?yearStart — DATE_TRUNC('YEAR', x)&lt;br /&gt;
* ?year — YEAR(), EXTRACT(YEAR FROM x)&lt;br /&gt;
* ?month — MONTH(), EXTRACT(MONTH FROM x)&lt;br /&gt;
* ?day — DAY(), EXTRACT(DAY FROM x)&lt;br /&gt;
* ?indexOf — INSTR(string, subString) или POSITION(subString IN string)&lt;br /&gt;
* ?str — просто пишите в 'одинарных кавычках', экранируйте одинарную кавычку с помощью '\'&lt;br /&gt;
* ?quote — просто пишите в &amp;quot;двойных кавычках&amp;quot; или в `обратных кавычках`, оба варианта должны сработать и транслироваться при необходимости&lt;br /&gt;
* currentDateTime — CURRENT_TIMESTAMP или NOW()&lt;br /&gt;
* currentDate — CURRENT_DATE&lt;br /&gt;
* addMonths(date,mon) — ADD_MONTHS(date, mon)&lt;br /&gt;
* addDays(date, days) — ADD_DAYS(date, days)&lt;br /&gt;
* addMillis(date, ms) — ADD_MILLIS(date, ms)&lt;br /&gt;
* fromFakeTable — FROM DUAL или можно не писать FROM вообще&lt;br /&gt;
&lt;br /&gt;
Для ограничения количества записей можно просто писать SELECT ... LIMIT 1: это транслируется в соответствующий диалект SQL.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых SQL-функций ===&lt;br /&gt;
&lt;br /&gt;
В скобках указываются синонимы&lt;br /&gt;
&lt;br /&gt;
 CONCAT, COALESCE (IFNULL), COUNT, SUM, MAX, MIN, SUBSTR (SUBSTRING), LENGTH (LEN), UPPER, LOWER, CHR (CHAR), TO_CHAR, TO_NUMBER, TO_DATE, TO_KEY,&lt;br /&gt;
 REPLACE, RTRIM, LTRIM, TRIM, LPAD, ROUND, TRUNC (TRUNCATE), INSTR (STRPOS), IF, NOW, FORMAT_DATE (=TO_CHAR(x, 'YYYY-MM-DD')), YEAR, MONTH, DAY, &lt;br /&gt;
 FORMAT_DATETIME (=TO_CHAR(x, 'YYYY-MM-DD HH24:MI:SS')), FORMAT_DATE_RUS (=TO_CHAR(x, 'DD.MM.YYYY')), FORMAT_DATE_RUS_SHORT (=TO_CHAR(x, 'DD.MM.YY')), &lt;br /&gt;
 FORMAT_MONTHYEAR(=TO_CHAR(x, 'month YYYY')), DATE_TRUNC, POSITION, DATE_ADD, ADD_MONTHS, ADD_DAYS, ADD_MILLIS, LAST_DAY, TIMESTAMPDIFF, YEARDIFF, &lt;br /&gt;
 MONTHDIFF, DAYDIFF, HOURDIFF, MINUTEDIFF, SECONDDIFF, LEAST, GREATEST, GROUPING, ROW_NUMBER, RANK.&lt;br /&gt;
&lt;br /&gt;
=== Функции для работы с датами и временем ===&lt;br /&gt;
&lt;br /&gt;
==== Форматирование даты ====&lt;br /&gt;
&lt;br /&gt;
Для форматирования даты в строку можно использовать &amp;lt;code&amp;gt;TO_CHAR(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;DATE_FORMAT(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt;. Строка формата должна быть одной из предопределённых констант из списка, иначе будет ошибка:&lt;br /&gt;
&lt;br /&gt;
* 'YYYY-MM-DD' или '%Y-%m-%d' (также можно использовать функцию FORMAT_DATE())&lt;br /&gt;
* 'YYYY-MM-DD HH24:MI:SS' или '%Y-%m-%d %H:%i:%S' (также можно использовать функцию FORMAT_DATETIME())&lt;br /&gt;
* 'DD.MM.YYYY' или '%d.%m.%Y' (также можно использовать функцию FORMAT_DATE_RUS())&lt;br /&gt;
* 'DD.MM.YY' или '%d.%m.%y' (также можно использовать функцию FORMAT_DATE_RUS_SHORT())&lt;br /&gt;
* 'month YYYY' или '%M %Y' (также можно использовать функцию FORMAT_MONTHYEAR())&lt;br /&gt;
* 'YYYY' или '%Y'&lt;br /&gt;
* 'MM' или '%m'&lt;br /&gt;
* 'DD' или '%d'&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATE(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATE&lt;br /&gt;
 ----------------------- -----------&lt;br /&gt;
 2016-03-04 11:12:38.360 2016-03-04&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATETIME(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATETIME&lt;br /&gt;
 ----------------------- -------------------&lt;br /&gt;
 2016-03-04 11:12:38.360 2016-03-04 11:12:38&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATE_RUS(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATE_RUS&lt;br /&gt;
 ----------------------- ---------------&lt;br /&gt;
 2016-03-04 11:12:38.360 04.03.2016&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATE_RUS_SHORT(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATE_RUS_SHORT&lt;br /&gt;
 ----------------------- ---------------------&lt;br /&gt;
 2016-03-04 11:12:38.360 04.03.16&lt;br /&gt;
&lt;br /&gt;
 SELECT TO_CHAR(NOW(), 'YYYY');&lt;br /&gt;
 -&amp;gt; 2016&lt;br /&gt;
&lt;br /&gt;
Для получения числа, месяца или года заданной даты в виде числа используются функции &amp;lt;code&amp;gt;DAY(дата)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MONTH(дата)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;YEAR(дата)&amp;lt;/code&amp;gt; соответственно:&lt;br /&gt;
&lt;br /&gt;
 SELECT YEAR(CURRENT_DATE);&lt;br /&gt;
 -&amp;gt; 2016&lt;br /&gt;
&lt;br /&gt;
Аналогично можно использовать &amp;lt;code&amp;gt;EXTRACT(YEAR FROM CURRENT_DATE)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Разница между датами ====&lt;br /&gt;
&lt;br /&gt;
Для получения разницы между датами в годах, месяцах, днях, часах, минутах или секундах используются следующие функции:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;YEARDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(YEAR FROM AGE(endDate, startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;MONTHDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(MONTH FROM AGE(endDate, startDate)) + 12 * EXTRACT(YEAR FROM AGE(endDate, startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;DAYDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(DAY FROM(endDate - startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;HOURDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;FLOOR(EXTRACT(EPOCH FROM(endDate - startDate)) / 3600)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;MINUTEDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;FLOOR(EXTRACT(EPOCH FROM(endDate - startDate)) / 60)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;SECONDDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(EPOCH FROM(endDate - startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 SELECT EXTRACT(YEAR FROM AGE('2015-05-01', '2013-02-01'));&lt;br /&gt;
 -&amp;gt; 2&lt;br /&gt;
&lt;br /&gt;
 SELECT YEARDIFF('2013-02-01', '2015-05-01');&lt;br /&gt;
 -&amp;gt; 2&lt;br /&gt;
&lt;br /&gt;
 SELECT MONTHDIFF('2013-02-01', '2015-05-01');&lt;br /&gt;
 -&amp;gt; 27&lt;br /&gt;
&lt;br /&gt;
Также можно использовать функцию &amp;lt;code&amp;gt;TIMESTAMPDIFF(&amp;lt;интервал&amp;gt;, startDate, endDate)&amp;lt;/code&amp;gt;, где в качестве интервала должно быть YEAR, MONTH, DAY, HOUR, MINUTE или SECOND.&lt;br /&gt;
&lt;br /&gt;
 SELECT TIMESTAMPDIFF(DAY, '2016-01-01', '2017-01-01');&lt;br /&gt;
 -&amp;gt; 366&lt;br /&gt;
&lt;br /&gt;
 SELECT TIMESTAMPDIFF(SECOND, '2016-01-01', '2016-01-02' );&lt;br /&gt;
 -&amp;gt; 86400&lt;br /&gt;
&lt;br /&gt;
==== Добавление интервала к дате ====&lt;br /&gt;
&lt;br /&gt;
Для добавления к дате месяцев, дней или миллисекунд используются функции &amp;lt;code&amp;gt;ADD_MONTHS(дата, количество)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ADD_DAYS(дата, количество)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ADD_MILLIS(дата, количество)&amp;lt;/code&amp;gt; соответственно:&lt;br /&gt;
&lt;br /&gt;
 SELECT CURRENT_DATE, ADD_MONTHS(CURRENT_DATE, 2);&lt;br /&gt;
 &lt;br /&gt;
 CURRENT_DATE ADD_MONTHS&lt;br /&gt;
 ------------ ----------&lt;br /&gt;
 2016-03-04   2016-05-04&lt;br /&gt;
&lt;br /&gt;
 SELECT CURRENT_DATE, ADD_DAYS(CURRENT_DATE, 7);&lt;br /&gt;
 &lt;br /&gt;
 CURRENT_DATE ADD_DAYS&lt;br /&gt;
 ------------ ----------&lt;br /&gt;
 2016-03-04   2016-03-11&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), ADD_MILLIS(NOW(), 3000);&lt;br /&gt;
 &lt;br /&gt;
 NOW                     ADD_MILLIS&lt;br /&gt;
 ----------------------- ----------------------- &lt;br /&gt;
 2016-03-04 11:12:38.360 2016-03-04 11:12:41.360&lt;br /&gt;
&lt;br /&gt;
==== Последний день месяца ====&lt;br /&gt;
&lt;br /&gt;
Для получения последнего дня месяца используется функция &amp;lt;code&amp;gt;LAST_DAY(дата)&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 SELECT CURRENT_DATE, LAST_DAY(CURRENT_DATE) &amp;quot;Last&amp;quot;, LAST_DAY(CURRENT_DATE) - CURRENT_DATE &amp;quot;Days Left&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 CURRENT_DATE Last       Days Left&lt;br /&gt;
 ------------ ---------- ---------&lt;br /&gt;
 2016-03-04   2016-03-31        27&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых операций ===&lt;br /&gt;
&lt;br /&gt;
 +, -, *, /, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, = (или ==), != (или &amp;lt;&amp;gt;), || (конкатенация строк), OR, AND (или &amp;amp;&amp;amp;), NOT (или !), LIKE, FLOOR, MOD (или %).&lt;br /&gt;
&lt;br /&gt;
=== Что точно не работает пока ===&lt;br /&gt;
&lt;br /&gt;
Использование этих возможностей скорее всего приведёт к ошибке валидации. В некоторых случаях к некорректному переформатированию в другом движке.&lt;br /&gt;
&lt;br /&gt;
* BE-теги &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; в некоторых нетривиальных местах. Так как в BE-SQL строится синтаксическое дерево, подобные теги нельзя размещать где угодно. Точно работает &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; в следующих местах:&lt;br /&gt;
** В списке колонок (&amp;lt;code&amp;gt;SELECT a, &amp;lt;if ...&amp;gt;b,&amp;lt;/if&amp;gt; c FROM table&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для UNION SELECT (&amp;lt;code&amp;gt;SELECT a FROM table &amp;lt;if ...&amp;gt;UNION SELECT b FROM table&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;, а также &amp;lt;code&amp;gt;&amp;lt;if ...&amp;gt;SELECT a FROM table UNION&amp;lt;/if&amp;gt; SELECT b FROM table&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для всего предложения WHERE (&amp;lt;code&amp;gt;SELECT a FROM table &amp;lt;if ...&amp;gt;WHERE b = c&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для всего предложения ORDER BY (&amp;lt;code&amp;gt;SELECT a FROM table &amp;lt;if ...&amp;gt;ORDER BY b&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для одной (не самой первой) из веток CASE WHEN (&amp;lt;code&amp;gt;SELECT CASE WHEN x &amp;gt; 5 THEN 'a' &amp;lt;if ...&amp;gt;WHEN x &amp;gt; 10 THEN 'b'&amp;lt;/if&amp;gt;ELSE 'c' END FROM table&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для одного или нескольких предложений JOIN (&amp;lt;code&amp;gt;SELECT a FROM table &amp;lt;if ...&amp;gt;JOIN table2 ON (...) JOIN table3 ON (...)&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для фрагмента булевого выражения, начинающегося с AND или OR (&amp;lt;code&amp;gt;SELECT a FROM table WHERE x &amp;gt; 2 &amp;lt;if ...&amp;gt;AND y &amp;gt; 3&amp;lt;/if&amp;gt;&amp;lt;if ...&amp;gt;OR z &amp;gt; 4&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для простого выражения, обязательно с альтернативой (&amp;lt;code&amp;gt;SELECT a FROM table WHERE x &amp;gt; &amp;lt;if ...&amp;gt;5&amp;lt;else&amp;gt;6&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Внутри строкового литерала (&amp;lt;code&amp;gt;'&amp;lt;a href=&amp;quot;/test?&amp;lt;if parameter='xyz'&amp;gt;xyz=true&amp;amp;&amp;lt;/if&amp;gt;abc=true&amp;quot;&amp;gt;'&amp;lt;/code&amp;gt;)&lt;br /&gt;
* genericRef, joinGenericRef&lt;br /&gt;
&lt;br /&gt;
=== Создание макросов ===&lt;br /&gt;
&lt;br /&gt;
Предусмотрена возможность создания собственных макросов. Определение макроса начинается с &amp;lt;code&amp;gt;MACRO&amp;lt;/code&amp;gt;. За ним идет имя макроса и список аргументов в скобках, который может состоять из обязательных и следующих за ними аргументов с заданным по умолчанию значением. В случае отсутствия аргументов скобки нужно оставить пустыми. Далее следуют выражения, которые будут подставляться при вызове макроса, в их числе могут быть другие макросы, подстановки параметров, условные выражения. Заканчивается определение ключевым словом &amp;lt;code&amp;gt;END&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 MACRO MY_MACRO(arg1, arg2='000000')&lt;br /&gt;
 CONCAT(SUBSTR(arg1, 1, 5 ), arg2)&lt;br /&gt;
 END&lt;br /&gt;
&lt;br /&gt;
Вызываются макросы как обычные функции:&lt;br /&gt;
&lt;br /&gt;
 SELECT MY_MACRO(code) FROM table t;&lt;br /&gt;
&lt;br /&gt;
Такой запрос будет преобразован в &amp;lt;code&amp;gt;SELECT CONCAT(SUBSTR(code, 1, 5 ), '000000') FROM table t&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/TableRef</id>
		<title>TableRef</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/TableRef"/>
				<updated>2016-03-30T04:05:34Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ElementType|com.beanexplorer.enterprise.metadata.model.TableRef|нет|да}}&lt;br /&gt;
&lt;br /&gt;
'''Ссылка на ключ в другой таблице''' (TableRef) позволяет устанавливать вспомогательные связи между таблицами, которые могут использоваться [[Operation|операциями]], например, для заполнения выпадающих списков. Связь имеет следующие свойства:&lt;br /&gt;
&lt;br /&gt;
* tableFrom: исходная сущность. Это та [[Entity|сущность]], в которой связь объявлена.&lt;br /&gt;
* columnFrom: исходная колонка. В данном случае это псевдо-колонка (например, kladr::search::street). Если вы хотите установить связь к существующей колонке, это необходимо сделать непосредственно в [[ColumnDef|определении колонки]].&lt;br /&gt;
* tableTo: целевая сущность.&lt;br /&gt;
* columnTo: целевая колонка. Может быть не указана, тогда автоматически используется первичный ключ целевой сущности.&lt;br /&gt;
* view: имя [[Query|представления]] в целевой сущности, которое используется для выбора элементов. По умолчанию — *** Selection view ***.&lt;br /&gt;
&lt;br /&gt;
Ссылки располагаются в дереве проекта в папке References внутри сущности. Имя ссылки формируется автоматически по имени колонки и целевой сущности.&lt;br /&gt;
&lt;br /&gt;
Ссылки сериализуются в [[yaml]]-файл сущности в секцию references. В качестве ключа указывается columnFrom. Свойства tableTo и columnTo сериализуются в одно поле to через точку. Если кроме поля to ничего нет, можно имя поля опустить.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
 users:&lt;br /&gt;
   references:&lt;br /&gt;
     kladr::search::city:&lt;br /&gt;
       to: addresses.dummy&lt;br /&gt;
       view: City from KLADR&lt;br /&gt;
Здесь создаётся ссылка с tableFrom = users, columnFrom = kladr::search::city, tableTo = addresses, columnTo = dummy, view = City from KLADR (такое представление должно существовать в сущности addresses, иначе будет предупреждение при [[синхронизация|синхронизации]]).&lt;br /&gt;
&lt;br /&gt;
 buildings:&lt;br /&gt;
   references:&lt;br /&gt;
     buildingID: buildings&lt;br /&gt;
Здесь создаётся ссылка с tableFrom = buildings, columnFrom = buildingID, tableTo = buildings, columnTo = ID (первичный ключ у таблицы buildings), view = *** Selection view *** (по умолчанию).&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/Extras</id>
		<title>Extras</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/Extras"/>
				<updated>2016-03-30T04:05:16Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Extras''' — способ задания условий, по которым данный элемент [[Project|проекта]] будет использоваться. На данный момент поддерживается для следующих типов элементов:&lt;br /&gt;
* [[Entity|Сущность (entity)]]&lt;br /&gt;
* [[Query|Представление (query)]]&lt;br /&gt;
* [[Operation|Операция (operation)]]&lt;br /&gt;
* [[ColumnDef|Определение колонки (columnDef)]]&lt;br /&gt;
* [[IndexDef|Определение индекса (indexDef)]]&lt;br /&gt;
* [[Role|Роль (role)]]&lt;br /&gt;
* [[Daemon|Демон (daemon)]]&lt;br /&gt;
* [[TableRef|Ссылка на другую колонку (tableRef)]]&lt;br /&gt;
&lt;br /&gt;
Extras — набор текстовых строк, представляющих собой условия. Если строк несколько, требуется соблюдение всех условий сразу.&lt;br /&gt;
&lt;br /&gt;
Каждая строка имеет следующий формат:&lt;br /&gt;
 [!]&amp;lt;prefix&amp;gt;:&amp;lt;value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Восклицательный знак означает отрицание (элемент доступен в случае, если условие не выполнено). Определены следующие префиксы:&lt;br /&gt;
* '''db''' — используется ли данный движок СУБД. Возможные значения value: db2, mysql, oracle, sqlserver, postgres&lt;br /&gt;
* '''dbcap''' — обладает ли движок СУБД определённой функциональностью. На данный момент возможны следующие значения:&lt;br /&gt;
** '''fnindex''' — поддерживаются ли функциональные индексы&lt;br /&gt;
** '''customincrement''' — поддерживается ли создание autoincrement-колонки, начинающейся с определённого значения&lt;br /&gt;
** '''gencolumn''' — поддерживаются ли вычислимые колонки. Если да, можно использовать в качестве default value колонки что-то типа generic(ID)&lt;br /&gt;
* '''module''' — присутствует ли в проекте [[Module|модуль]] с данным именем.&lt;br /&gt;
* '''feature''' — подключена ли указанная фича.&lt;br /&gt;
* '''extra''' — доступен ли указанный extras в указанном модуле (формат: &amp;lt;code&amp;gt;extra:moduleName::extraName&amp;lt;/code&amp;gt;). Может потребоваться, если надо проверить extras, объявленный для другого модуля.&lt;br /&gt;
* '''var''' — определена ли указанная переменная или равна ли она заданному значению. К примеру &amp;lt;code&amp;gt;var:REGION=54&amp;lt;/code&amp;gt; выполняется, если определена переменная REGION и её значение — 54.&lt;br /&gt;
&lt;br /&gt;
Также в модулях в качестве extras может встречаться просто строка. Если та же строка определена в проекте приложения в секции данного модуля, то этот extras выполняется.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_ant</id>
		<title>Использование ant</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_ant"/>
				<updated>2016-03-29T06:48:57Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: /* Инструментарий */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Помимо использования IDE основной be4-функционал доступен с помощью ant-таргетов.&lt;br /&gt;
&lt;br /&gt;
=== Стандартные таргеты ===&lt;br /&gt;
&lt;br /&gt;
В проектах на be4 определены следующие ant-таргеты:&lt;br /&gt;
* '''be.validate''' — валидация [[Project|проекта]] (вычитывание всех файлов, базовые проверки на корректность, исполнение всего [[Freemarker]]; никаких обращений к базе не делается)&lt;br /&gt;
* '''be.update''' — инкрементальное обновление схемы, метаданных и локализаций. Если обновление схемы может привести к потере данных, операция будет отклонена. Для принудительного выполнения определите BE4_FORCE_UPDATE=true&lt;br /&gt;
* '''be.meta''' — инкрементальное обновление метаданных (включая roles, icons, references, page customizations, pages)&lt;br /&gt;
* '''be.locale''' — инкрементальное обновление локализаций&lt;br /&gt;
* '''be.ddl''' — инкрементальное обновление схемы. Для принудительного выполнения определите BE4_FORCE_UPDATE=true. Для обновления схемы клонированных таблиц используйте BE4_CLONES=true.&lt;br /&gt;
* '''be.ddl.check''' — вывод SQL-предложений, которые потребуются для инкрементального обновления схемы. Никаких изменений в базу не вносится. Для учёта клонированных таблиц используйте BE4_CLONES=true.&lt;br /&gt;
* '''setup.db''' — полное разворачивание базы с нуля (как в BE)&lt;br /&gt;
* '''setup.meta''' — полное внесение метаданных и локализаций&lt;br /&gt;
* '''setup.just.meta''' — полное внесение метаданных&lt;br /&gt;
* '''setup.locale''' — полное внесение локализаций&lt;br /&gt;
* '''setup.adhoc''' — выполнение одного или нескольких FTL-скриптов из custom steps (передаются параметром -DA_SCRIPT='script1;script2'). Можно запускать скрипты из модуля (-DA_SCRIPT='realty:dictionaries') либо из всех модулей, где такой скрипт есть (-DA_SCRIPT='all:dictionaries')&lt;br /&gt;
* '''main''' (таргет по умолчанию) — сборка war&lt;br /&gt;
&lt;br /&gt;
=== Переменные ===&lt;br /&gt;
Имеются следующие BE4-специфичные переменные&lt;br /&gt;
* '''BE4_DIR''' — каталог с проектом be4 (без него ничего не заработает)&lt;br /&gt;
* '''BE4_PROFILE''' — если задано, указывает профиль соединения к базе данных (из connectionProfiles.*.yaml), который необходимо использовать.&lt;br /&gt;
* '''BE4_LOG_DIR''' — если задано, данный каталог будет использован для логирования BE4-операций.&lt;br /&gt;
* '''BE4_DEBUG''' — если &amp;quot;true&amp;quot;, будет выводиться дополнительная отладочная информация в stderr.&lt;br /&gt;
* '''BE4_FORCE_UPDATE''' — если &amp;quot;true&amp;quot;, будут выполняться потенциально опасные изменения в схеме базы данных (которые могут привести к потере пользовательских данных).&lt;br /&gt;
* '''BE4_CLONES''' — если &amp;quot;true&amp;quot;, изменения схемы коснутся также клонированных таблиц (у которых численный суффикс добавлен к имени таблицы).&lt;br /&gt;
* '''BE4_UNLOCK_PROTECTED_PROFILE''' — если &amp;quot;true&amp;quot;, защищённый (protected) [[BeConnectionProfile|профиль соединения]] будет использоваться без дополнительных подтверждений.&lt;br /&gt;
&lt;br /&gt;
* '''BE4_&amp;amp;lt;имя_модуля&amp;amp;gt;''' — если true, то будут использованы метаданные из BE4-модуля (BE4-модуль должен существовать), иначе — из старого BE-модуля с тем же именем.&lt;br /&gt;
&lt;br /&gt;
Только с таргетом be.validate:&lt;br /&gt;
* '''BE4_SKIP_VALIDATION'''=true — если задано, пропустить собственно валидацию (но прочие команды из списка ниже будут выполняться).&lt;br /&gt;
* '''BE4_RDBMS'''=mysql/postgres/oracle/db2/sqlserver/m4 — если задано, валидация будет выполняться с использованием соответствующей СУБД (это может повлиять на выполнение условных секций в FTL, результат разворачивания макросов, включения extras и т. д.).&lt;br /&gt;
* '''BE4_CHECK_QUERY'''=&amp;quot;entity.query&amp;quot; — если задано, текст указанного запроса после выполнения FTL будет выведен на экран). Если указана фиктивная BE4_RDBMS=m4, на место СУБД-специфичных FTL-функций будут подставлены соответствующие m4-функции (может пригодиться для обратного портирования кода в m4).&lt;br /&gt;
* '''BE4_CHECK_DDL'''=entity — если задано, DDL, необходимый для создания указанной сущности будет выведен на экран. Если указана фиктивная BE4_RDBMS=m4, будет сгенерирован соответствующий m4-код (может пригодиться для обратного портирования кода в m4).&lt;br /&gt;
* '''BE4_CHECK_ROLES'''=true — если задано, на экран будет выведен список ролей проекта, действующий в данных условиях. Может пригодиться, если часть ролей устанавливается условно через extras и хочется проверить, правильно ли отработали условия.&lt;br /&gt;
* '''BE4_CREATE_PROFILE_PROPERTIES'''=&amp;lt;file_path&amp;gt; — создаёт файл properties со свойствами профиля соединения и проекта, который может пригодиться для старой системы тестирования.&lt;br /&gt;
* '''BE4_SAVE'''=true — если задано, проект будет пересохранён (только основной проект, без учёта подключенных модулей) с помощью той же процедуры, как при сохранении через Eclipse. Могут быть отсортированы или переформатированы некоторые элементы проекта.&lt;br /&gt;
&lt;br /&gt;
=== Задачи ===&lt;br /&gt;
При редактировании ant-скриптов можно использовать следующие задачи (tasks):&lt;br /&gt;
* '''be4.db''' — создание базы по BE4-проекту. Параметры:&lt;br /&gt;
:* modules: если true, будут использованы BE4-модули&lt;br /&gt;
&lt;br /&gt;
* '''be4.meta''' — синхронизация. Параметры:&lt;br /&gt;
:* modules: если true, будут использованы BE4-модули&lt;br /&gt;
:* mode: режим синхронизации (all, meta, locale, ddl, ddl_clones, security). Если установлено -DBE4_CLONES=true, то режим ddl превращается сам в ddl_clones (добавляется обновление схемы клонированных таблиц).&lt;br /&gt;
&lt;br /&gt;
* '''be4.data''' — выполнение скрипта или набора скриптов. Параметры:&lt;br /&gt;
:* scriptName: имена скриптов через точку с запятой. Можно написать moduleName:scriptName для выполнения скрипта из модуля, либо all:scriptName для выполнения скрипта с таким именем из всех модулей.&lt;br /&gt;
&lt;br /&gt;
* '''be4.validate''' — валидировать BE4-проект и (для немодульного проекта) заполнить свойства ANT из модели&lt;br /&gt;
:* modules: если true, будут подключены BE4-модули. Рекомендуется ставить в true всегда кроме каких-то частных случаев, когда важна производительность.&lt;br /&gt;
&lt;br /&gt;
* '''be4.tools''' — дополнительный инструментарий BE4.&lt;br /&gt;
&lt;br /&gt;
У всех задач есть общие параметры:&lt;br /&gt;
* projectPath (обязательно) — путь к проекту&lt;br /&gt;
* logDir — каталог для логирования (переопределяет переменную BE4_LOG_DIR)&lt;br /&gt;
* useMeta — экспериментальная опция: использовать базовые beanexplorer-метаданные из YAML-проекта beanexplorer_meta без вычитывания базы инициализированной через m4.&lt;br /&gt;
&lt;br /&gt;
=== Инструментарий ===&lt;br /&gt;
Для технических операций имеется специальная ant-задача '''be4.tools'''. По умолчанию эта задача не соответствует никакому ant-таргету. Если она требуется, можно создать таргет, например, так:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;target name=&amp;quot;be.tools&amp;quot; depends=&amp;quot;be4_settings&amp;quot;&amp;gt;&amp;lt;be4.tools projectPath=&amp;quot;${project.home}&amp;quot;/&amp;gt;&amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для пользования инструментами необходимо задавать дополнительные свойства:&lt;br /&gt;
* '''BE4_DUMP_TABLES'''=&amp;quot;таблица1,таблица2,...&amp;quot; — сдампить из базы соответствующей текущему connection-profile заданные таблицы в новый yaml-проект (будет создан подкаталог yamlDump в текущем каталоге). Может пригодиться для создания болванки при переносе таблиц из m4 в yaml. Пример:&lt;br /&gt;
 ant be.tools -DBE4_PROFILE=foo -DBE4_DUMP_TABLES=users,queries,operations&lt;br /&gt;
&lt;br /&gt;
:В дампе присутствуют все [[Query|представления]], [[Operation|операции]] и схемы указанных [[Entity|сущностей]], а также сообщения [[EntityLocalizations|локализации]] с таким же entityName. Кроме того, содерижмое сущностей с типом dictionary (в которых менее 10000 строк) дампится в ftl-скрипты, которые автоматически подключены из dictionaries.ftl.&lt;br /&gt;
&lt;br /&gt;
Для компиляции самого BE4 (в объёме необходимом для последующего использования вышеуказанных ant-таргетов) необходимо набрать ant в каталоге be4/src. Не требуется никаких внешних зависимостей.&lt;br /&gt;
&lt;br /&gt;
== Использование вне приложений ==&lt;br /&gt;
Следующие цели можно запускать без какого-либо приложения, т.е. досаточно просто зайти в папку be4/src и написать &amp;quot;ant someTarget&amp;quot;:&lt;br /&gt;
* '''wizard''' — позволяет генерировать новые BE4 приложения. Функционал аналогичен функционалу создания нового приложения в BEclipse (File → New → Project → BeanExplorer → BeanExplorer Project), однако все данные вводятся в консоли, а не в GUI.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_ant</id>
		<title>Использование ant</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_ant"/>
				<updated>2016-03-29T06:46:55Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: /* Переменные */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Помимо использования IDE основной be4-функционал доступен с помощью ant-таргетов.&lt;br /&gt;
&lt;br /&gt;
=== Стандартные таргеты ===&lt;br /&gt;
&lt;br /&gt;
В проектах на be4 определены следующие ant-таргеты:&lt;br /&gt;
* '''be.validate''' — валидация [[Project|проекта]] (вычитывание всех файлов, базовые проверки на корректность, исполнение всего [[Freemarker]]; никаких обращений к базе не делается)&lt;br /&gt;
* '''be.update''' — инкрементальное обновление схемы, метаданных и локализаций. Если обновление схемы может привести к потере данных, операция будет отклонена. Для принудительного выполнения определите BE4_FORCE_UPDATE=true&lt;br /&gt;
* '''be.meta''' — инкрементальное обновление метаданных (включая roles, icons, references, page customizations, pages)&lt;br /&gt;
* '''be.locale''' — инкрементальное обновление локализаций&lt;br /&gt;
* '''be.ddl''' — инкрементальное обновление схемы. Для принудительного выполнения определите BE4_FORCE_UPDATE=true. Для обновления схемы клонированных таблиц используйте BE4_CLONES=true.&lt;br /&gt;
* '''be.ddl.check''' — вывод SQL-предложений, которые потребуются для инкрементального обновления схемы. Никаких изменений в базу не вносится. Для учёта клонированных таблиц используйте BE4_CLONES=true.&lt;br /&gt;
* '''setup.db''' — полное разворачивание базы с нуля (как в BE)&lt;br /&gt;
* '''setup.meta''' — полное внесение метаданных и локализаций&lt;br /&gt;
* '''setup.just.meta''' — полное внесение метаданных&lt;br /&gt;
* '''setup.locale''' — полное внесение локализаций&lt;br /&gt;
* '''setup.adhoc''' — выполнение одного или нескольких FTL-скриптов из custom steps (передаются параметром -DA_SCRIPT='script1;script2'). Можно запускать скрипты из модуля (-DA_SCRIPT='realty:dictionaries') либо из всех модулей, где такой скрипт есть (-DA_SCRIPT='all:dictionaries')&lt;br /&gt;
* '''main''' (таргет по умолчанию) — сборка war&lt;br /&gt;
&lt;br /&gt;
=== Переменные ===&lt;br /&gt;
Имеются следующие BE4-специфичные переменные&lt;br /&gt;
* '''BE4_DIR''' — каталог с проектом be4 (без него ничего не заработает)&lt;br /&gt;
* '''BE4_PROFILE''' — если задано, указывает профиль соединения к базе данных (из connectionProfiles.*.yaml), который необходимо использовать.&lt;br /&gt;
* '''BE4_LOG_DIR''' — если задано, данный каталог будет использован для логирования BE4-операций.&lt;br /&gt;
* '''BE4_DEBUG''' — если &amp;quot;true&amp;quot;, будет выводиться дополнительная отладочная информация в stderr.&lt;br /&gt;
* '''BE4_FORCE_UPDATE''' — если &amp;quot;true&amp;quot;, будут выполняться потенциально опасные изменения в схеме базы данных (которые могут привести к потере пользовательских данных).&lt;br /&gt;
* '''BE4_CLONES''' — если &amp;quot;true&amp;quot;, изменения схемы коснутся также клонированных таблиц (у которых численный суффикс добавлен к имени таблицы).&lt;br /&gt;
* '''BE4_UNLOCK_PROTECTED_PROFILE''' — если &amp;quot;true&amp;quot;, защищённый (protected) [[BeConnectionProfile|профиль соединения]] будет использоваться без дополнительных подтверждений.&lt;br /&gt;
&lt;br /&gt;
* '''BE4_&amp;amp;lt;имя_модуля&amp;amp;gt;''' — если true, то будут использованы метаданные из BE4-модуля (BE4-модуль должен существовать), иначе — из старого BE-модуля с тем же именем.&lt;br /&gt;
&lt;br /&gt;
Только с таргетом be.validate:&lt;br /&gt;
* '''BE4_SKIP_VALIDATION'''=true — если задано, пропустить собственно валидацию (но прочие команды из списка ниже будут выполняться).&lt;br /&gt;
* '''BE4_RDBMS'''=mysql/postgres/oracle/db2/sqlserver/m4 — если задано, валидация будет выполняться с использованием соответствующей СУБД (это может повлиять на выполнение условных секций в FTL, результат разворачивания макросов, включения extras и т. д.).&lt;br /&gt;
* '''BE4_CHECK_QUERY'''=&amp;quot;entity.query&amp;quot; — если задано, текст указанного запроса после выполнения FTL будет выведен на экран). Если указана фиктивная BE4_RDBMS=m4, на место СУБД-специфичных FTL-функций будут подставлены соответствующие m4-функции (может пригодиться для обратного портирования кода в m4).&lt;br /&gt;
* '''BE4_CHECK_DDL'''=entity — если задано, DDL, необходимый для создания указанной сущности будет выведен на экран. Если указана фиктивная BE4_RDBMS=m4, будет сгенерирован соответствующий m4-код (может пригодиться для обратного портирования кода в m4).&lt;br /&gt;
* '''BE4_CHECK_ROLES'''=true — если задано, на экран будет выведен список ролей проекта, действующий в данных условиях. Может пригодиться, если часть ролей устанавливается условно через extras и хочется проверить, правильно ли отработали условия.&lt;br /&gt;
* '''BE4_CREATE_PROFILE_PROPERTIES'''=&amp;lt;file_path&amp;gt; — создаёт файл properties со свойствами профиля соединения и проекта, который может пригодиться для старой системы тестирования.&lt;br /&gt;
* '''BE4_SAVE'''=true — если задано, проект будет пересохранён (только основной проект, без учёта подключенных модулей) с помощью той же процедуры, как при сохранении через Eclipse. Могут быть отсортированы или переформатированы некоторые элементы проекта.&lt;br /&gt;
&lt;br /&gt;
=== Задачи ===&lt;br /&gt;
При редактировании ant-скриптов можно использовать следующие задачи (tasks):&lt;br /&gt;
* '''be4.db''' — создание базы по BE4-проекту. Параметры:&lt;br /&gt;
:* modules: если true, будут использованы BE4-модули&lt;br /&gt;
&lt;br /&gt;
* '''be4.meta''' — синхронизация. Параметры:&lt;br /&gt;
:* modules: если true, будут использованы BE4-модули&lt;br /&gt;
:* mode: режим синхронизации (all, meta, locale, ddl, ddl_clones, security). Если установлено -DBE4_CLONES=true, то режим ddl превращается сам в ddl_clones (добавляется обновление схемы клонированных таблиц).&lt;br /&gt;
&lt;br /&gt;
* '''be4.data''' — выполнение скрипта или набора скриптов. Параметры:&lt;br /&gt;
:* scriptName: имена скриптов через точку с запятой. Можно написать moduleName:scriptName для выполнения скрипта из модуля, либо all:scriptName для выполнения скрипта с таким именем из всех модулей.&lt;br /&gt;
&lt;br /&gt;
* '''be4.validate''' — валидировать BE4-проект и (для немодульного проекта) заполнить свойства ANT из модели&lt;br /&gt;
:* modules: если true, будут подключены BE4-модули. Рекомендуется ставить в true всегда кроме каких-то частных случаев, когда важна производительность.&lt;br /&gt;
&lt;br /&gt;
* '''be4.tools''' — дополнительный инструментарий BE4.&lt;br /&gt;
&lt;br /&gt;
У всех задач есть общие параметры:&lt;br /&gt;
* projectPath (обязательно) — путь к проекту&lt;br /&gt;
* logDir — каталог для логирования (переопределяет переменную BE4_LOG_DIR)&lt;br /&gt;
* useMeta — экспериментальная опция: использовать базовые beanexplorer-метаданные из YAML-проекта beanexplorer_meta без вычитывания базы инициализированной через m4.&lt;br /&gt;
&lt;br /&gt;
=== Инструментарий ===&lt;br /&gt;
Для технических операций имеется специальная ant-задача '''be4.tools'''. По умолчанию эта задача не соответствует никакому ant-таргету. Если она требуется, можно создать таргет, например, так:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;target name=&amp;quot;be.tools&amp;quot; depends=&amp;quot;be4_settings&amp;quot;&amp;gt;&amp;lt;be4.tools projectPath=&amp;quot;${project.home}&amp;quot;/&amp;gt;&amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для пользования инструментами необходимо задавать дополнительные свойства:&lt;br /&gt;
* '''BE4_DUMP_TABLES'''=&amp;quot;таблица1,таблица2,...&amp;quot; — сдампить из базы соответствующей текущему connection-profile заданные таблицы в новый yaml-проект (будет создан подкаталог yamlDump в текущем каталоге). Может пригодиться для создания болванки при переносе таблиц из m4 в yaml. Пример:&lt;br /&gt;
 ant be.tools -DBE4_PROFILE=foo -DBE4_DUMP_TABLES=users,queries,operations&lt;br /&gt;
&lt;br /&gt;
:В дампе присутствуют все [[Query|представления]], [[Operation|операции]] и схемы указанных [[Entity|сущностей]], а также сообщения [[EntityLocalizations|локализации]] с таким же entityName.&lt;br /&gt;
&lt;br /&gt;
Для компиляции самого BE4 (в объёме необходимом для последующего использования вышеуказанных ant-таргетов) необходимо набрать ant в каталоге be4/src. Не требуется никаких внешних зависимостей.&lt;br /&gt;
&lt;br /&gt;
== Использование вне приложений ==&lt;br /&gt;
Следующие цели можно запускать без какого-либо приложения, т.е. досаточно просто зайти в папку be4/src и написать &amp;quot;ant someTarget&amp;quot;:&lt;br /&gt;
* '''wizard''' — позволяет генерировать новые BE4 приложения. Функционал аналогичен функционалу создания нового приложения в BEclipse (File → New → Project → BeanExplorer → BeanExplorer Project), однако все данные вводятся в консоли, а не в GUI.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_ant</id>
		<title>Использование ant</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_ant"/>
				<updated>2016-03-29T06:45:37Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: /* Стандартные таргеты */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Помимо использования IDE основной be4-функционал доступен с помощью ant-таргетов.&lt;br /&gt;
&lt;br /&gt;
=== Стандартные таргеты ===&lt;br /&gt;
&lt;br /&gt;
В проектах на be4 определены следующие ant-таргеты:&lt;br /&gt;
* '''be.validate''' — валидация [[Project|проекта]] (вычитывание всех файлов, базовые проверки на корректность, исполнение всего [[Freemarker]]; никаких обращений к базе не делается)&lt;br /&gt;
* '''be.update''' — инкрементальное обновление схемы, метаданных и локализаций. Если обновление схемы может привести к потере данных, операция будет отклонена. Для принудительного выполнения определите BE4_FORCE_UPDATE=true&lt;br /&gt;
* '''be.meta''' — инкрементальное обновление метаданных (включая roles, icons, references, page customizations, pages)&lt;br /&gt;
* '''be.locale''' — инкрементальное обновление локализаций&lt;br /&gt;
* '''be.ddl''' — инкрементальное обновление схемы. Для принудительного выполнения определите BE4_FORCE_UPDATE=true. Для обновления схемы клонированных таблиц используйте BE4_CLONES=true.&lt;br /&gt;
* '''be.ddl.check''' — вывод SQL-предложений, которые потребуются для инкрементального обновления схемы. Никаких изменений в базу не вносится. Для учёта клонированных таблиц используйте BE4_CLONES=true.&lt;br /&gt;
* '''setup.db''' — полное разворачивание базы с нуля (как в BE)&lt;br /&gt;
* '''setup.meta''' — полное внесение метаданных и локализаций&lt;br /&gt;
* '''setup.just.meta''' — полное внесение метаданных&lt;br /&gt;
* '''setup.locale''' — полное внесение локализаций&lt;br /&gt;
* '''setup.adhoc''' — выполнение одного или нескольких FTL-скриптов из custom steps (передаются параметром -DA_SCRIPT='script1;script2'). Можно запускать скрипты из модуля (-DA_SCRIPT='realty:dictionaries') либо из всех модулей, где такой скрипт есть (-DA_SCRIPT='all:dictionaries')&lt;br /&gt;
* '''main''' (таргет по умолчанию) — сборка war&lt;br /&gt;
&lt;br /&gt;
=== Переменные ===&lt;br /&gt;
Имеются следующие BE4-специфичные переменные&lt;br /&gt;
* '''BE4_DIR''' — каталог с проектом be4 (без него ничего не заработает)&lt;br /&gt;
* '''BE4_PROFILE''' — если задано, указывает профиль соединения к базе данных (из connectionProfiles.*.yaml), который необходимо использовать.&lt;br /&gt;
* '''BE4_LOG_DIR''' — если задано, данный каталог будет использован для логирования BE4-операций.&lt;br /&gt;
* '''BE4_DEBUG''' — если &amp;quot;true&amp;quot;, будет выводиться дополнительная отладочная информация в stderr.&lt;br /&gt;
* '''BE4_FORCE_UPDATE''' — если &amp;quot;true&amp;quot;, будут выполняться потенциально опасные изменения в схеме базы данных (которые могут привести к потере пользовательских данных).&lt;br /&gt;
* '''BE4_UNLOCK_PROTECTED_PROFILE''' — если &amp;quot;true&amp;quot;, защищённый (protected) [[BeConnectionProfile|профиль соединения]] будет использоваться без дополнительных подтверждений.&lt;br /&gt;
&lt;br /&gt;
* '''BE4_&amp;amp;lt;имя_модуля&amp;amp;gt;''' — если true, то будут использованы метаданные из BE4-модуля (BE4-модуль должен существовать), иначе — из старого BE-модуля с тем же именем.&lt;br /&gt;
&lt;br /&gt;
Только с таргетом be.validate:&lt;br /&gt;
* '''BE4_SKIP_VALIDATION'''=true — если задано, пропустить собственно валидацию (но прочие команды из списка ниже будут выполняться).&lt;br /&gt;
* '''BE4_RDBMS'''=mysql/postgres/oracle/db2/sqlserver/m4 — если задано, валидация будет выполняться с использованием соответствующей СУБД (это может повлиять на выполнение условных секций в FTL, результат разворачивания макросов, включения extras и т. д.).&lt;br /&gt;
* '''BE4_CHECK_QUERY'''=&amp;quot;entity.query&amp;quot; — если задано, текст указанного запроса после выполнения FTL будет выведен на экран). Если указана фиктивная BE4_RDBMS=m4, на место СУБД-специфичных FTL-функций будут подставлены соответствующие m4-функции (может пригодиться для обратного портирования кода в m4).&lt;br /&gt;
* '''BE4_CHECK_DDL'''=entity — если задано, DDL, необходимый для создания указанной сущности будет выведен на экран. Если указана фиктивная BE4_RDBMS=m4, будет сгенерирован соответствующий m4-код (может пригодиться для обратного портирования кода в m4).&lt;br /&gt;
* '''BE4_CHECK_ROLES'''=true — если задано, на экран будет выведен список ролей проекта, действующий в данных условиях. Может пригодиться, если часть ролей устанавливается условно через extras и хочется проверить, правильно ли отработали условия.&lt;br /&gt;
* '''BE4_CREATE_PROFILE_PROPERTIES'''=&amp;lt;file_path&amp;gt; — создаёт файл properties со свойствами профиля соединения и проекта, который может пригодиться для старой системы тестирования.&lt;br /&gt;
* '''BE4_SAVE'''=true — если задано, проект будет пересохранён (только основной проект, без учёта подключенных модулей) с помощью той же процедуры, как при сохранении через Eclipse. Могут быть отсортированы или переформатированы некоторые элементы проекта.&lt;br /&gt;
&lt;br /&gt;
=== Задачи ===&lt;br /&gt;
При редактировании ant-скриптов можно использовать следующие задачи (tasks):&lt;br /&gt;
* '''be4.db''' — создание базы по BE4-проекту. Параметры:&lt;br /&gt;
:* modules: если true, будут использованы BE4-модули&lt;br /&gt;
&lt;br /&gt;
* '''be4.meta''' — синхронизация. Параметры:&lt;br /&gt;
:* modules: если true, будут использованы BE4-модули&lt;br /&gt;
:* mode: режим синхронизации (all, meta, locale, ddl, ddl_clones, security). Если установлено -DBE4_CLONES=true, то режим ddl превращается сам в ddl_clones (добавляется обновление схемы клонированных таблиц).&lt;br /&gt;
&lt;br /&gt;
* '''be4.data''' — выполнение скрипта или набора скриптов. Параметры:&lt;br /&gt;
:* scriptName: имена скриптов через точку с запятой. Можно написать moduleName:scriptName для выполнения скрипта из модуля, либо all:scriptName для выполнения скрипта с таким именем из всех модулей.&lt;br /&gt;
&lt;br /&gt;
* '''be4.validate''' — валидировать BE4-проект и (для немодульного проекта) заполнить свойства ANT из модели&lt;br /&gt;
:* modules: если true, будут подключены BE4-модули. Рекомендуется ставить в true всегда кроме каких-то частных случаев, когда важна производительность.&lt;br /&gt;
&lt;br /&gt;
* '''be4.tools''' — дополнительный инструментарий BE4.&lt;br /&gt;
&lt;br /&gt;
У всех задач есть общие параметры:&lt;br /&gt;
* projectPath (обязательно) — путь к проекту&lt;br /&gt;
* logDir — каталог для логирования (переопределяет переменную BE4_LOG_DIR)&lt;br /&gt;
* useMeta — экспериментальная опция: использовать базовые beanexplorer-метаданные из YAML-проекта beanexplorer_meta без вычитывания базы инициализированной через m4.&lt;br /&gt;
&lt;br /&gt;
=== Инструментарий ===&lt;br /&gt;
Для технических операций имеется специальная ant-задача '''be4.tools'''. По умолчанию эта задача не соответствует никакому ant-таргету. Если она требуется, можно создать таргет, например, так:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;target name=&amp;quot;be.tools&amp;quot; depends=&amp;quot;be4_settings&amp;quot;&amp;gt;&amp;lt;be4.tools projectPath=&amp;quot;${project.home}&amp;quot;/&amp;gt;&amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для пользования инструментами необходимо задавать дополнительные свойства:&lt;br /&gt;
* '''BE4_DUMP_TABLES'''=&amp;quot;таблица1,таблица2,...&amp;quot; — сдампить из базы соответствующей текущему connection-profile заданные таблицы в новый yaml-проект (будет создан подкаталог yamlDump в текущем каталоге). Может пригодиться для создания болванки при переносе таблиц из m4 в yaml. Пример:&lt;br /&gt;
 ant be.tools -DBE4_PROFILE=foo -DBE4_DUMP_TABLES=users,queries,operations&lt;br /&gt;
&lt;br /&gt;
:В дампе присутствуют все [[Query|представления]], [[Operation|операции]] и схемы указанных [[Entity|сущностей]], а также сообщения [[EntityLocalizations|локализации]] с таким же entityName.&lt;br /&gt;
&lt;br /&gt;
Для компиляции самого BE4 (в объёме необходимом для последующего использования вышеуказанных ant-таргетов) необходимо набрать ant в каталоге be4/src. Не требуется никаких внешних зависимостей.&lt;br /&gt;
&lt;br /&gt;
== Использование вне приложений ==&lt;br /&gt;
Следующие цели можно запускать без какого-либо приложения, т.е. досаточно просто зайти в папку be4/src и написать &amp;quot;ant someTarget&amp;quot;:&lt;br /&gt;
* '''wizard''' — позволяет генерировать новые BE4 приложения. Функционал аналогичен функционалу создания нового приложения в BEclipse (File → New → Project → BeanExplorer → BeanExplorer Project), однако все данные вводятся в консоли, а не в GUI.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_ant</id>
		<title>Использование ant</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_ant"/>
				<updated>2016-03-29T06:44:47Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: /* Задачи */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Помимо использования IDE основной be4-функционал доступен с помощью ant-таргетов.&lt;br /&gt;
&lt;br /&gt;
=== Стандартные таргеты ===&lt;br /&gt;
&lt;br /&gt;
В проектах на be4 определены следующие ant-таргеты:&lt;br /&gt;
* '''be.validate''' — валидация [[Project|проекта]] (вычитывание всех файлов, базовые проверки на корректность, исполнение всего [[Freemarker]]; никаких обращений к базе не делается)&lt;br /&gt;
* '''be.update''' — инкрементальное обновление схемы, метаданных и локализаций. Если обновление схемы может привести к потере данных, операция будет отклонена. Для принудительного выполнения определите BE4_FORCE_UPDATE=true&lt;br /&gt;
* '''be.meta''' — инкрементальное обновление метаданных (включая roles, icons, references, page customizations, pages)&lt;br /&gt;
* '''be.locale''' — инкрементальное обновление локализаций&lt;br /&gt;
* '''be.ddl''' — инкрементальное обновление схемы. Для принудительного выполнения определите BE4_FORCE_UPDATE=true.&lt;br /&gt;
* '''be.ddl.check''' — вывод SQL-предложений, которые потребуются для инкрементального обновления схемы. Никаких изменений в базу не вносится.&lt;br /&gt;
* '''setup.db''' — полное разворачивание базы с нуля (как в BE)&lt;br /&gt;
* '''setup.meta''' — полное внесение метаданных и локализаций&lt;br /&gt;
* '''setup.just.meta''' — полное внесение метаданных&lt;br /&gt;
* '''setup.locale''' — полное внесение локализаций&lt;br /&gt;
* '''setup.adhoc''' — выполнение одного или нескольких FTL-скриптов из custom steps (передаются параметром -DA_SCRIPT='script1;script2'). Можно запускать скрипты из модуля (-DA_SCRIPT='realty:dictionaries') либо из всех модулей, где такой скрипт есть (-DA_SCRIPT='all:dictionaries')&lt;br /&gt;
* '''main''' (таргет по умолчанию) — сборка war&lt;br /&gt;
&lt;br /&gt;
=== Переменные ===&lt;br /&gt;
Имеются следующие BE4-специфичные переменные&lt;br /&gt;
* '''BE4_DIR''' — каталог с проектом be4 (без него ничего не заработает)&lt;br /&gt;
* '''BE4_PROFILE''' — если задано, указывает профиль соединения к базе данных (из connectionProfiles.*.yaml), который необходимо использовать.&lt;br /&gt;
* '''BE4_LOG_DIR''' — если задано, данный каталог будет использован для логирования BE4-операций.&lt;br /&gt;
* '''BE4_DEBUG''' — если &amp;quot;true&amp;quot;, будет выводиться дополнительная отладочная информация в stderr.&lt;br /&gt;
* '''BE4_FORCE_UPDATE''' — если &amp;quot;true&amp;quot;, будут выполняться потенциально опасные изменения в схеме базы данных (которые могут привести к потере пользовательских данных).&lt;br /&gt;
* '''BE4_UNLOCK_PROTECTED_PROFILE''' — если &amp;quot;true&amp;quot;, защищённый (protected) [[BeConnectionProfile|профиль соединения]] будет использоваться без дополнительных подтверждений.&lt;br /&gt;
&lt;br /&gt;
* '''BE4_&amp;amp;lt;имя_модуля&amp;amp;gt;''' — если true, то будут использованы метаданные из BE4-модуля (BE4-модуль должен существовать), иначе — из старого BE-модуля с тем же именем.&lt;br /&gt;
&lt;br /&gt;
Только с таргетом be.validate:&lt;br /&gt;
* '''BE4_SKIP_VALIDATION'''=true — если задано, пропустить собственно валидацию (но прочие команды из списка ниже будут выполняться).&lt;br /&gt;
* '''BE4_RDBMS'''=mysql/postgres/oracle/db2/sqlserver/m4 — если задано, валидация будет выполняться с использованием соответствующей СУБД (это может повлиять на выполнение условных секций в FTL, результат разворачивания макросов, включения extras и т. д.).&lt;br /&gt;
* '''BE4_CHECK_QUERY'''=&amp;quot;entity.query&amp;quot; — если задано, текст указанного запроса после выполнения FTL будет выведен на экран). Если указана фиктивная BE4_RDBMS=m4, на место СУБД-специфичных FTL-функций будут подставлены соответствующие m4-функции (может пригодиться для обратного портирования кода в m4).&lt;br /&gt;
* '''BE4_CHECK_DDL'''=entity — если задано, DDL, необходимый для создания указанной сущности будет выведен на экран. Если указана фиктивная BE4_RDBMS=m4, будет сгенерирован соответствующий m4-код (может пригодиться для обратного портирования кода в m4).&lt;br /&gt;
* '''BE4_CHECK_ROLES'''=true — если задано, на экран будет выведен список ролей проекта, действующий в данных условиях. Может пригодиться, если часть ролей устанавливается условно через extras и хочется проверить, правильно ли отработали условия.&lt;br /&gt;
* '''BE4_CREATE_PROFILE_PROPERTIES'''=&amp;lt;file_path&amp;gt; — создаёт файл properties со свойствами профиля соединения и проекта, который может пригодиться для старой системы тестирования.&lt;br /&gt;
* '''BE4_SAVE'''=true — если задано, проект будет пересохранён (только основной проект, без учёта подключенных модулей) с помощью той же процедуры, как при сохранении через Eclipse. Могут быть отсортированы или переформатированы некоторые элементы проекта.&lt;br /&gt;
&lt;br /&gt;
=== Задачи ===&lt;br /&gt;
При редактировании ant-скриптов можно использовать следующие задачи (tasks):&lt;br /&gt;
* '''be4.db''' — создание базы по BE4-проекту. Параметры:&lt;br /&gt;
:* modules: если true, будут использованы BE4-модули&lt;br /&gt;
&lt;br /&gt;
* '''be4.meta''' — синхронизация. Параметры:&lt;br /&gt;
:* modules: если true, будут использованы BE4-модули&lt;br /&gt;
:* mode: режим синхронизации (all, meta, locale, ddl, ddl_clones, security). Если установлено -DBE4_CLONES=true, то режим ddl превращается сам в ddl_clones (добавляется обновление схемы клонированных таблиц).&lt;br /&gt;
&lt;br /&gt;
* '''be4.data''' — выполнение скрипта или набора скриптов. Параметры:&lt;br /&gt;
:* scriptName: имена скриптов через точку с запятой. Можно написать moduleName:scriptName для выполнения скрипта из модуля, либо all:scriptName для выполнения скрипта с таким именем из всех модулей.&lt;br /&gt;
&lt;br /&gt;
* '''be4.validate''' — валидировать BE4-проект и (для немодульного проекта) заполнить свойства ANT из модели&lt;br /&gt;
:* modules: если true, будут подключены BE4-модули. Рекомендуется ставить в true всегда кроме каких-то частных случаев, когда важна производительность.&lt;br /&gt;
&lt;br /&gt;
* '''be4.tools''' — дополнительный инструментарий BE4.&lt;br /&gt;
&lt;br /&gt;
У всех задач есть общие параметры:&lt;br /&gt;
* projectPath (обязательно) — путь к проекту&lt;br /&gt;
* logDir — каталог для логирования (переопределяет переменную BE4_LOG_DIR)&lt;br /&gt;
* useMeta — экспериментальная опция: использовать базовые beanexplorer-метаданные из YAML-проекта beanexplorer_meta без вычитывания базы инициализированной через m4.&lt;br /&gt;
&lt;br /&gt;
=== Инструментарий ===&lt;br /&gt;
Для технических операций имеется специальная ant-задача '''be4.tools'''. По умолчанию эта задача не соответствует никакому ant-таргету. Если она требуется, можно создать таргет, например, так:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;target name=&amp;quot;be.tools&amp;quot; depends=&amp;quot;be4_settings&amp;quot;&amp;gt;&amp;lt;be4.tools projectPath=&amp;quot;${project.home}&amp;quot;/&amp;gt;&amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для пользования инструментами необходимо задавать дополнительные свойства:&lt;br /&gt;
* '''BE4_DUMP_TABLES'''=&amp;quot;таблица1,таблица2,...&amp;quot; — сдампить из базы соответствующей текущему connection-profile заданные таблицы в новый yaml-проект (будет создан подкаталог yamlDump в текущем каталоге). Может пригодиться для создания болванки при переносе таблиц из m4 в yaml. Пример:&lt;br /&gt;
 ant be.tools -DBE4_PROFILE=foo -DBE4_DUMP_TABLES=users,queries,operations&lt;br /&gt;
&lt;br /&gt;
:В дампе присутствуют все [[Query|представления]], [[Operation|операции]] и схемы указанных [[Entity|сущностей]], а также сообщения [[EntityLocalizations|локализации]] с таким же entityName.&lt;br /&gt;
&lt;br /&gt;
Для компиляции самого BE4 (в объёме необходимом для последующего использования вышеуказанных ant-таргетов) необходимо набрать ant в каталоге be4/src. Не требуется никаких внешних зависимостей.&lt;br /&gt;
&lt;br /&gt;
== Использование вне приложений ==&lt;br /&gt;
Следующие цели можно запускать без какого-либо приложения, т.е. досаточно просто зайти в папку be4/src и написать &amp;quot;ant someTarget&amp;quot;:&lt;br /&gt;
* '''wizard''' — позволяет генерировать новые BE4 приложения. Функционал аналогичен функционалу создания нового приложения в BEclipse (File → New → Project → BeanExplorer → BeanExplorer Project), однако все данные вводятся в консоли, а не в GUI.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BE-SQL</id>
		<title>BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BE-SQL"/>
				<updated>2016-03-28T04:51:22Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: /* Что точно не работает пока */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BE-SQL''' — диалект SQL, который поддерживается BeanExplorer SQL Parser. Поддерживаются только запросы SELECT. Больше всего он похож на PostgreSQL, но некоторые конструкции из других диалектов тоже поддерживаются. Он также должен понимать различные BE-специфичные теги вроде &amp;lt;if&amp;gt;, &amp;lt;unless&amp;gt; и т. д. В данный момент находится в разработке: не все реальные запросы из проектов успешно разбираются BE-SQL.&lt;br /&gt;
&lt;br /&gt;
Соответствие FreeMarker-конструкций и BE-SQL конструкций:&lt;br /&gt;
&lt;br /&gt;
* chr(...) — CHR() или CHAR()&lt;br /&gt;
* concat(...) — CONCAT() или ||&lt;br /&gt;
* coalesce(...) — COALESCE() или IFNULL()&lt;br /&gt;
* round(...) — ROUND()&lt;br /&gt;
* length(...) — LENGTH() или LEN()&lt;br /&gt;
* lpad(...) — LPAD()&lt;br /&gt;
* replace(...) — REPLACE()&lt;br /&gt;
* substring(...) — SUBSTR() или SUBSTRING()&lt;br /&gt;
* if(...) — IF() (может транслироваться в предложение CASE WHEN ...)&lt;br /&gt;
* ?dateFormat — FORMAT_DATE()&lt;br /&gt;
* ?dateTimeFormat — FORMAT_DATETIME()&lt;br /&gt;
* ?dateFormatRus — FORMAT_DATE_RUS()&lt;br /&gt;
* ?asInt — CAST(x AS BIGINT), TO_NUMBER(x)&lt;br /&gt;
* ?asVarChar — CAST(x AS CHAR), CAST(x AS VARCHAR), TO_CHAR(x)&lt;br /&gt;
* ?asDate — CAST(x AS DATE), TO_DATE(x)&lt;br /&gt;
* ?asPK — CAST(x AS KEY), TO_KEY(x)&lt;br /&gt;
* ?lower — LOWER()&lt;br /&gt;
* ?upper — UPPER()&lt;br /&gt;
* ?monthStart — DATE_TRUNC('MONTH', x)&lt;br /&gt;
* ?yearStart — DATE_TRUNC('YEAR', x)&lt;br /&gt;
* ?year — YEAR(), EXTRACT(YEAR FROM x)&lt;br /&gt;
* ?month — MONTH(), EXTRACT(MONTH FROM x)&lt;br /&gt;
* ?day — DAY(), EXTRACT(DAY FROM x)&lt;br /&gt;
* ?indexOf — INSTR(string, subString) или POSITION(subString IN string)&lt;br /&gt;
* ?str — просто пишите в 'одинарных кавычках', экранируйте одинарную кавычку с помощью '\'&lt;br /&gt;
* ?quote — просто пишите в &amp;quot;двойных кавычках&amp;quot; или в `обратных кавычках`, оба варианта должны сработать и транслироваться при необходимости&lt;br /&gt;
* currentDateTime — CURRENT_TIMESTAMP или NOW()&lt;br /&gt;
* currentDate — CURRENT_DATE&lt;br /&gt;
* addMonths(date,mon) — ADD_MONTHS(date, mon)&lt;br /&gt;
* addDays(date, days) — ADD_DAYS(date, days)&lt;br /&gt;
* addMillis(date, ms) — ADD_MILLIS(date, ms)&lt;br /&gt;
* fromFakeTable — FROM DUAL или можно не писать FROM вообще&lt;br /&gt;
&lt;br /&gt;
Для ограничения количества записей можно просто писать SELECT ... LIMIT 1: это транслируется в соответствующий диалект SQL.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых SQL-функций ===&lt;br /&gt;
&lt;br /&gt;
В скобках указываются синонимы&lt;br /&gt;
&lt;br /&gt;
 CONCAT, COALESCE (IFNULL), COUNT, SUM, MAX, MIN, SUBSTR (SUBSTRING), LENGTH (LEN), UPPER, LOWER, CHR (CHAR), TO_CHAR, TO_NUMBER, TO_DATE, TO_KEY,&lt;br /&gt;
 REPLACE, RTRIM, LTRIM, TRIM, LPAD, ROUND, TRUNC (TRUNCATE), INSTR (STRPOS), IF, NOW, FORMAT_DATE (=TO_CHAR(x, 'YYYY-MM-DD')), YEAR, MONTH, DAY, &lt;br /&gt;
 FORMAT_DATETIME (=TO_CHAR(x, 'YYYY-MM-DD HH24:MI:SS')), FORMAT_DATE_RUS (=TO_CHAR(x, 'DD.MM.YYYY')), FORMAT_DATE_RUS_SHORT (=TO_CHAR(x, 'DD.MM.YY')), &lt;br /&gt;
 FORMAT_MONTHYEAR(=TO_CHAR(x, 'month YYYY')), DATE_TRUNC, POSITION, DATE_ADD, ADD_MONTHS, ADD_DAYS, ADD_MILLIS, LAST_DAY, TIMESTAMPDIFF, YEARDIFF, &lt;br /&gt;
 MONTHDIFF, DAYDIFF, HOURDIFF, MINUTEDIFF, SECONDDIFF, LEAST, GREATEST, GROUPING, ROW_NUMBER, RANK.&lt;br /&gt;
&lt;br /&gt;
=== Функции для работы с датами и временем ===&lt;br /&gt;
&lt;br /&gt;
==== Форматирование даты ====&lt;br /&gt;
&lt;br /&gt;
Для форматирования даты в строку можно использовать &amp;lt;code&amp;gt;TO_CHAR(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;DATE_FORMAT(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt;. Строка формата должна быть одной из предопределённых констант из списка, иначе будет ошибка:&lt;br /&gt;
&lt;br /&gt;
* 'YYYY-MM-DD' или '%Y-%m-%d' (также можно использовать функцию FORMAT_DATE())&lt;br /&gt;
* 'YYYY-MM-DD HH24:MI:SS' или '%Y-%m-%d %H:%i:%S' (также можно использовать функцию FORMAT_DATETIME())&lt;br /&gt;
* 'DD.MM.YYYY' или '%d.%m.%Y' (также можно использовать функцию FORMAT_DATE_RUS())&lt;br /&gt;
* 'DD.MM.YY' или '%d.%m.%y' (также можно использовать функцию FORMAT_DATE_RUS_SHORT())&lt;br /&gt;
* 'month YYYY' или '%M %Y' (также можно использовать функцию FORMAT_MONTHYEAR())&lt;br /&gt;
* 'YYYY' или '%Y'&lt;br /&gt;
* 'MM' или '%m'&lt;br /&gt;
* 'DD' или '%d'&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATE(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATE&lt;br /&gt;
 ----------------------- -----------&lt;br /&gt;
 2016-03-04 11:12:38.360 2016-03-04&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATETIME(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATETIME&lt;br /&gt;
 ----------------------- -------------------&lt;br /&gt;
 2016-03-04 11:12:38.360 2016-03-04 11:12:38&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATE_RUS(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATE_RUS&lt;br /&gt;
 ----------------------- ---------------&lt;br /&gt;
 2016-03-04 11:12:38.360 04.03.2016&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATE_RUS_SHORT(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATE_RUS_SHORT&lt;br /&gt;
 ----------------------- ---------------------&lt;br /&gt;
 2016-03-04 11:12:38.360 04.03.16&lt;br /&gt;
&lt;br /&gt;
 SELECT TO_CHAR(NOW(), 'YYYY');&lt;br /&gt;
 -&amp;gt; 2016&lt;br /&gt;
&lt;br /&gt;
Для получения числа, месяца или года заданной даты в виде числа используются функции &amp;lt;code&amp;gt;DAY(дата)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MONTH(дата)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;YEAR(дата)&amp;lt;/code&amp;gt; соответственно:&lt;br /&gt;
&lt;br /&gt;
 SELECT YEAR(CURRENT_DATE);&lt;br /&gt;
 -&amp;gt; 2016&lt;br /&gt;
&lt;br /&gt;
Аналогично можно использовать &amp;lt;code&amp;gt;EXTRACT(YEAR FROM CURRENT_DATE)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Разница между датами ====&lt;br /&gt;
&lt;br /&gt;
Для получения разницы между датами в годах, месяцах, днях, часах, минутах или секундах используются следующие функции:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;YEARDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(YEAR FROM AGE(endDate, startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;MONTHDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(MONTH FROM AGE(endDate, startDate)) + 12 * EXTRACT(YEAR FROM AGE(endDate, startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;DAYDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(DAY FROM(endDate - startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;HOURDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;FLOOR(EXTRACT(EPOCH FROM(endDate - startDate)) / 3600)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;MINUTEDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;FLOOR(EXTRACT(EPOCH FROM(endDate - startDate)) / 60)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;SECONDDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(EPOCH FROM(endDate - startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 SELECT EXTRACT(YEAR FROM AGE('2015-05-01', '2013-02-01'));&lt;br /&gt;
 -&amp;gt; 2&lt;br /&gt;
&lt;br /&gt;
 SELECT YEARDIFF('2013-02-01', '2015-05-01');&lt;br /&gt;
 -&amp;gt; 2&lt;br /&gt;
&lt;br /&gt;
 SELECT MONTHDIFF('2013-02-01', '2015-05-01');&lt;br /&gt;
 -&amp;gt; 27&lt;br /&gt;
&lt;br /&gt;
Также можно использовать функцию &amp;lt;code&amp;gt;TIMESTAMPDIFF(&amp;lt;интервал&amp;gt;, startDate, endDate)&amp;lt;/code&amp;gt;, где в качестве интервала должно быть YEAR, MONTH, DAY, HOUR, MINUTE или SECOND.&lt;br /&gt;
&lt;br /&gt;
 SELECT TIMESTAMPDIFF(DAY, '2016-01-01', '2017-01-01');&lt;br /&gt;
 -&amp;gt; 366&lt;br /&gt;
&lt;br /&gt;
 SELECT TIMESTAMPDIFF(SECOND, '2016-01-01', '2016-01-02' );&lt;br /&gt;
 -&amp;gt; 86400&lt;br /&gt;
&lt;br /&gt;
==== Добавление интервала к дате ====&lt;br /&gt;
&lt;br /&gt;
Для добавления к дате месяцев, дней или миллисекунд используются функции &amp;lt;code&amp;gt;ADD_MONTHS(дата, количество)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ADD_DAYS(дата, количество)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ADD_MILLIS(дата, количество)&amp;lt;/code&amp;gt; соответственно:&lt;br /&gt;
&lt;br /&gt;
 SELECT CURRENT_DATE, ADD_MONTHS(CURRENT_DATE, 2);&lt;br /&gt;
 &lt;br /&gt;
 CURRENT_DATE ADD_MONTHS&lt;br /&gt;
 ------------ ----------&lt;br /&gt;
 2016-03-04   2016-05-04&lt;br /&gt;
&lt;br /&gt;
 SELECT CURRENT_DATE, ADD_DAYS(CURRENT_DATE, 7);&lt;br /&gt;
 &lt;br /&gt;
 CURRENT_DATE ADD_DAYS&lt;br /&gt;
 ------------ ----------&lt;br /&gt;
 2016-03-04   2016-03-11&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), ADD_MILLIS(NOW(), 3000);&lt;br /&gt;
 &lt;br /&gt;
 NOW                     ADD_MILLIS&lt;br /&gt;
 ----------------------- ----------------------- &lt;br /&gt;
 2016-03-04 11:12:38.360 2016-03-04 11:12:41.360&lt;br /&gt;
&lt;br /&gt;
==== Последний день месяца ====&lt;br /&gt;
&lt;br /&gt;
Для получения последнего дня месяца используется функция &amp;lt;code&amp;gt;LAST_DAY(дата)&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 SELECT CURRENT_DATE, LAST_DAY(CURRENT_DATE) &amp;quot;Last&amp;quot;, LAST_DAY(CURRENT_DATE) - CURRENT_DATE &amp;quot;Days Left&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 CURRENT_DATE Last       Days Left&lt;br /&gt;
 ------------ ---------- ---------&lt;br /&gt;
 2016-03-04   2016-03-31        27&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых операций ===&lt;br /&gt;
&lt;br /&gt;
 +, -, *, /, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, = (или ==), != (или &amp;lt;&amp;gt;), || (конкатенация строк), OR, AND (или &amp;amp;&amp;amp;), NOT (или !), LIKE, FLOOR, MOD (или %).&lt;br /&gt;
&lt;br /&gt;
=== Что точно не работает пока ===&lt;br /&gt;
&lt;br /&gt;
Использование этих возможностей скорее всего приведёт к ошибке валидации. В некоторых случаях к некорректному переформатированию в другом движке.&lt;br /&gt;
&lt;br /&gt;
* BE-теги &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; в некоторых нетривиальных местах. Так как в BE-SQL строится синтаксическое дерево, подобные теги нельзя размещать где угодно. Точно работает &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; в следующих местах:&lt;br /&gt;
** В списке колонок (&amp;lt;code&amp;gt;SELECT a, &amp;lt;if ...&amp;gt;b,&amp;lt;/if&amp;gt; c FROM table&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для UNION SELECT (&amp;lt;code&amp;gt;SELECT a FROM table &amp;lt;if ...&amp;gt;UNION SELECT b FROM table&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;, а также &amp;lt;code&amp;gt;&amp;lt;if ...&amp;gt;SELECT a FROM table UNION&amp;lt;/if&amp;gt; SELECT b FROM table&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для всего предложения WHERE (&amp;lt;code&amp;gt;SELECT a FROM table &amp;lt;if ...&amp;gt;WHERE b = c&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для всего предложения ORDER BY (&amp;lt;code&amp;gt;SELECT a FROM table &amp;lt;if ...&amp;gt;ORDER BY b&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для одной (не самой первой) из веток CASE WHEN (&amp;lt;code&amp;gt;SELECT CASE WHEN x &amp;gt; 5 THEN 'a' &amp;lt;if ...&amp;gt;WHEN x &amp;gt; 10 THEN 'b'&amp;lt;/if&amp;gt;ELSE 'c' END FROM table&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для одного или нескольких предложений JOIN (&amp;lt;code&amp;gt;SELECT a FROM table &amp;lt;if ...&amp;gt;JOIN table2 ON (...) JOIN table3 ON (...)&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для фрагмента булевого выражения, начинающегося с AND или OR (&amp;lt;code&amp;gt;SELECT a FROM table WHERE x &amp;gt; 2 &amp;lt;if ...&amp;gt;AND y &amp;gt; 3&amp;lt;/if&amp;gt;&amp;lt;if ...&amp;gt;OR z &amp;gt; 4&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для простого выражения, обязательно с альтернативой (&amp;lt;code&amp;gt;SELECT a FROM table WHERE x &amp;gt; &amp;lt;if ...&amp;gt;5&amp;lt;else&amp;gt;6&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Не работают строковые литералы, содержащие обратный слэш и литералы вида &amp;lt;code&amp;gt;E'\r\n'&amp;lt;/code&amp;gt;&lt;br /&gt;
* genericRef, joinGenericRef&lt;br /&gt;
&lt;br /&gt;
=== Создание макросов ===&lt;br /&gt;
&lt;br /&gt;
Предусмотрена возможность создания собственных макросов. Определение макроса начинается с &amp;lt;code&amp;gt;MACRO&amp;lt;/code&amp;gt;. За ним идет имя макроса и список аргументов в скобках, который может состоять из обязательных и следующих за ними аргументов с заданным по умолчанию значением. В случае отсутствия аргументов скобки нужно оставить пустыми. Далее следуют выражения, которые будут подставляться при вызове макроса, в их числе могут быть другие макросы, подстановки параметров, условные выражения. Заканчивается определение ключевым словом &amp;lt;code&amp;gt;END&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 MACRO MY_MACRO(arg1, arg2='000000')&lt;br /&gt;
 CONCAT(SUBSTR(arg1, 1, 5 ), arg2)&lt;br /&gt;
 END&lt;br /&gt;
&lt;br /&gt;
Вызываются макросы как обычные функции:&lt;br /&gt;
&lt;br /&gt;
 SELECT MY_MACRO(code) FROM table t;&lt;br /&gt;
&lt;br /&gt;
Такой запрос будет преобразован в &amp;lt;code&amp;gt;SELECT CONCAT(SUBSTR(code, 1, 5 ), '000000') FROM table t&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BE-SQL</id>
		<title>BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BE-SQL"/>
				<updated>2016-03-22T07:59:20Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: /* Список всех поддерживаемых SQL-функций */ + LTRIM, RTRIM&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BE-SQL''' — диалект SQL, который поддерживается BeanExplorer SQL Parser. Поддерживаются только запросы SELECT. Больше всего он похож на PostgreSQL, но некоторые конструкции из других диалектов тоже поддерживаются. Он также должен понимать различные BE-специфичные теги вроде &amp;lt;if&amp;gt;, &amp;lt;unless&amp;gt; и т. д. В данный момент находится в разработке: не все реальные запросы из проектов успешно разбираются BE-SQL.&lt;br /&gt;
&lt;br /&gt;
Соответствие FreeMarker-конструкций и BE-SQL конструкций:&lt;br /&gt;
&lt;br /&gt;
* chr(...) — CHR() или CHAR()&lt;br /&gt;
* concat(...) — CONCAT() или ||&lt;br /&gt;
* coalesce(...) — COALESCE() или IFNULL()&lt;br /&gt;
* round(...) — ROUND()&lt;br /&gt;
* length(...) — LENGTH() или LEN()&lt;br /&gt;
* lpad(...) — LPAD()&lt;br /&gt;
* replace(...) — REPLACE()&lt;br /&gt;
* substring(...) — SUBSTR() или SUBSTRING()&lt;br /&gt;
* if(...) — IF() (может транслироваться в предложение CASE WHEN ...)&lt;br /&gt;
* ?dateFormat — FORMAT_DATE()&lt;br /&gt;
* ?dateTimeFormat — FORMAT_DATETIME()&lt;br /&gt;
* ?dateFormatRus — FORMAT_DATE_RUS()&lt;br /&gt;
* ?asInt — CAST(x AS BIGINT), TO_NUMBER(x)&lt;br /&gt;
* ?asVarChar — CAST(x AS CHAR), CAST(x AS VARCHAR), TO_CHAR(x)&lt;br /&gt;
* ?asDate — CAST(x AS DATE), TO_DATE(x)&lt;br /&gt;
* ?asPK — CAST(x AS KEY), TO_KEY(x)&lt;br /&gt;
* ?lower — LOWER()&lt;br /&gt;
* ?upper — UPPER()&lt;br /&gt;
* ?monthStart — DATE_TRUNC('MONTH', x)&lt;br /&gt;
* ?yearStart — DATE_TRUNC('YEAR', x)&lt;br /&gt;
* ?year — YEAR(), EXTRACT(YEAR FROM x)&lt;br /&gt;
* ?month — MONTH(), EXTRACT(MONTH FROM x)&lt;br /&gt;
* ?day — DAY(), EXTRACT(DAY FROM x)&lt;br /&gt;
* ?indexOf — INSTR(string, subString) или POSITION(subString IN string)&lt;br /&gt;
* ?str — просто пишите в 'одинарных кавычках', экранируйте одинарную кавычку с помощью '\'&lt;br /&gt;
* ?quote — просто пишите в &amp;quot;двойных кавычках&amp;quot; или в `обратных кавычках`, оба варианта должны сработать и транслироваться при необходимости&lt;br /&gt;
* currentDateTime — CURRENT_TIMESTAMP или NOW()&lt;br /&gt;
* currentDate — CURRENT_DATE&lt;br /&gt;
* addMonths(date,mon) — ADD_MONTHS(date, mon)&lt;br /&gt;
* addDays(date, days) — ADD_DAYS(date, days)&lt;br /&gt;
* addMillis(date, ms) — ADD_MILLIS(date, ms)&lt;br /&gt;
* fromFakeTable — FROM DUAL или можно не писать FROM вообще&lt;br /&gt;
&lt;br /&gt;
Для ограничения количества записей можно просто писать SELECT ... LIMIT 1: это транслируется в соответствующий диалект SQL.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых SQL-функций ===&lt;br /&gt;
&lt;br /&gt;
В скобках указываются синонимы&lt;br /&gt;
&lt;br /&gt;
 CONCAT, COALESCE (IFNULL), COUNT, SUM, MAX, MIN, SUBSTR (SUBSTRING), LENGTH (LEN), UPPER, LOWER, CHR (CHAR), TO_CHAR, TO_NUMBER, TO_DATE, TO_KEY,&lt;br /&gt;
 REPLACE, RTRIM, LTRIM, LPAD, ROUND, TRUNC (TRUNCATE), INSTR (STRPOS), IF, NOW, FORMAT_DATE (=TO_CHAR(x, 'YYYY-MM-DD')), YEAR, MONTH, DAY, &lt;br /&gt;
 FORMAT_DATETIME (=TO_CHAR(x, 'YYYY-MM-DD HH24:MI:SS')), FORMAT_DATE_RUS (=TO_CHAR(x, 'DD.MM.YYYY')), FORMAT_DATE_RUS_SHORT (=TO_CHAR(x, 'DD.MM.YY')), &lt;br /&gt;
 DATE_TRUNC, POSITION, DATE_ADD, ADD_MONTHS, ADD_DAYS, ADD_MILLIS, LAST_DAY, TIMESTAMPDIFF, YEARDIFF, MONTHDIFF, DAYDIFF, HOURDIFF, MINUTEDIFF, SECONDDIFF.&lt;br /&gt;
&lt;br /&gt;
=== Функции для работы с датами и временем ===&lt;br /&gt;
&lt;br /&gt;
==== Форматирование даты ====&lt;br /&gt;
&lt;br /&gt;
Для форматирования даты в строку можно использовать &amp;lt;code&amp;gt;TO_CHAR(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;DATE_FORMAT(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt;. Строка формата должна быть одной из предопределённых констант из списка, иначе будет ошибка:&lt;br /&gt;
&lt;br /&gt;
* 'YYYY-MM-DD' или '%Y-%m-%d' (также можно использовать функцию FORMAT_DATE())&lt;br /&gt;
* 'YYYY-MM-DD HH24:MI:SS' или '%Y-%m-%d %H:%i:%S' (также можно использовать функцию FORMAT_DATETIME())&lt;br /&gt;
* 'DD.MM.YYYY' или '%d.%m.%Y' (также можно использовать функцию FORMAT_DATE_RUS())&lt;br /&gt;
* 'DD.MM.YY' или '%d.%m.%y' (также можно использовать функцию FORMAT_DATE_RUS_SHORT())&lt;br /&gt;
* 'YYYY' или '%Y'&lt;br /&gt;
* 'MM' или '%m'&lt;br /&gt;
* 'DD' или '%d'&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATE(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATE&lt;br /&gt;
 ----------------------- -----------&lt;br /&gt;
 2016-03-04 11:12:38.360 2016-03-04&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATETIME(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATETIME&lt;br /&gt;
 ----------------------- -------------------&lt;br /&gt;
 2016-03-04 11:12:38.360 2016-03-04 11:12:38&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATE_RUS(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATE_RUS&lt;br /&gt;
 ----------------------- ---------------&lt;br /&gt;
 2016-03-04 11:12:38.360 04.03.2016&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATE_RUS_SHORT(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATE_RUS_SHORT&lt;br /&gt;
 ----------------------- ---------------------&lt;br /&gt;
 2016-03-04 11:12:38.360 04.03.16&lt;br /&gt;
&lt;br /&gt;
 SELECT TO_CHAR(NOW(), 'YYYY');&lt;br /&gt;
 -&amp;gt; 2016&lt;br /&gt;
&lt;br /&gt;
Для получения числа, месяца или года заданной даты в виде числа используются функции &amp;lt;code&amp;gt;DAY(дата)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MONTH(дата)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;YEAR(дата)&amp;lt;/code&amp;gt; соответственно:&lt;br /&gt;
&lt;br /&gt;
 SELECT YEAR(CURRENT_DATE);&lt;br /&gt;
 -&amp;gt; 2016&lt;br /&gt;
&lt;br /&gt;
Аналогично можно использовать &amp;lt;code&amp;gt;EXTRACT(YEAR FROM CURRENT_DATE)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Разница между датами ====&lt;br /&gt;
&lt;br /&gt;
Для получения разницы между датами в годах, месяцах, днях, часах, минутах или секундах используются следующие функции:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;YEARDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(YEAR FROM AGE(endDate, startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;MONTHDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(MONTH FROM AGE(endDate, startDate)) + 12 * EXTRACT(YEAR FROM AGE(endDate, startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;DAYDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(DAY FROM(endDate - startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;HOURDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;FLOOR(EXTRACT(EPOCH FROM(endDate - startDate)) / 3600)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;MINUTEDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;FLOOR(EXTRACT(EPOCH FROM(endDate - startDate)) / 60)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;SECONDDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(EPOCH FROM(endDate - startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 SELECT EXTRACT(YEAR FROM AGE('2015-05-01', '2013-02-01'));&lt;br /&gt;
 -&amp;gt; 2&lt;br /&gt;
&lt;br /&gt;
 SELECT YEARDIFF('2013-02-01', '2015-05-01');&lt;br /&gt;
 -&amp;gt; 2&lt;br /&gt;
&lt;br /&gt;
 SELECT MONTHDIFF('2013-02-01', '2015-05-01');&lt;br /&gt;
 -&amp;gt; 27&lt;br /&gt;
&lt;br /&gt;
Также можно использовать функцию &amp;lt;code&amp;gt;TIMESTAMPDIFF(&amp;lt;интервал&amp;gt;, startDate, endDate)&amp;lt;/code&amp;gt;, где в качестве интервала должно быть YEAR, MONTH, DAY, HOUR, MINUTE или SECOND.&lt;br /&gt;
&lt;br /&gt;
 SELECT TIMESTAMPDIFF(DAY, '2016-01-01', '2017-01-01');&lt;br /&gt;
 -&amp;gt; 366&lt;br /&gt;
&lt;br /&gt;
 SELECT TIMESTAMPDIFF(SECOND, '2016-01-01', '2016-01-02' );&lt;br /&gt;
 -&amp;gt; 86400&lt;br /&gt;
&lt;br /&gt;
==== Добавление интервала к дате ====&lt;br /&gt;
&lt;br /&gt;
Для добавления к дате месяцев, дней или миллисекунд используются функции &amp;lt;code&amp;gt;ADD_MONTHS(дата, количество)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ADD_DAYS(дата, количество)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ADD_MILLIS(дата, количество)&amp;lt;/code&amp;gt; соответственно:&lt;br /&gt;
&lt;br /&gt;
 SELECT CURRENT_DATE, ADD_MONTHS(CURRENT_DATE, 2);&lt;br /&gt;
 &lt;br /&gt;
 CURRENT_DATE ADD_MONTHS&lt;br /&gt;
 ------------ ----------&lt;br /&gt;
 2016-03-04   2016-05-04&lt;br /&gt;
&lt;br /&gt;
 SELECT CURRENT_DATE, ADD_DAYS(CURRENT_DATE, 7);&lt;br /&gt;
 &lt;br /&gt;
 CURRENT_DATE ADD_DAYS&lt;br /&gt;
 ------------ ----------&lt;br /&gt;
 2016-03-04   2016-03-11&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), ADD_MILLIS(NOW(), 3000);&lt;br /&gt;
 &lt;br /&gt;
 NOW                     ADD_MILLIS&lt;br /&gt;
 ----------------------- ----------------------- &lt;br /&gt;
 2016-03-04 11:12:38.360 2016-03-04 11:12:41.360&lt;br /&gt;
&lt;br /&gt;
==== Последний день месяца ====&lt;br /&gt;
&lt;br /&gt;
Для получения последнего дня месяца используется функция &amp;lt;code&amp;gt;LAST_DAY(дата)&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 SELECT CURRENT_DATE, LAST_DAY(CURRENT_DATE) &amp;quot;Last&amp;quot;, LAST_DAY(CURRENT_DATE) - CURRENT_DATE &amp;quot;Days Left&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 CURRENT_DATE Last       Days Left&lt;br /&gt;
 ------------ ---------- ---------&lt;br /&gt;
 2016-03-04   2016-03-31        27&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых операций ===&lt;br /&gt;
&lt;br /&gt;
 +, -, *, /, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, = (или ==), != (или &amp;lt;&amp;gt;), || (конкатенация строк), OR, AND (или &amp;amp;&amp;amp;), NOT (или !), LIKE, FLOOR.&lt;br /&gt;
&lt;br /&gt;
=== Что точно не работает пока ===&lt;br /&gt;
&lt;br /&gt;
Использование этих возможностей скорее всего приведёт к ошибке валидации. В некоторых случаях к некорректному переформатированию в другом движке.&lt;br /&gt;
&lt;br /&gt;
* BE-теги &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; в JOIN/ORDER BY/GROUP BY и других нетривиальных местах&lt;br /&gt;
* genericRef, joinGenericRef&lt;br /&gt;
&lt;br /&gt;
=== Создание макросов ===&lt;br /&gt;
&lt;br /&gt;
Предусмотрена возможность создания собственных макросов. Определение макроса начинается с &amp;lt;code&amp;gt;MACRO&amp;lt;/code&amp;gt;. За ним идет имя макроса и список аргументов в скобках, который может состоять из обязательных и следующих за ними аргументов с заданным по умолчанию значением. В случае отсутствия аргументов скобки нужно оставить пустыми. Далее следуют выражения, которые будут подставляться при вызове макроса, в их числе могут быть другие макросы, подстановки параметров, условные выражения. Заканчивается определение ключевым словом &amp;lt;code&amp;gt;END&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 MACRO MY_MACRO(arg1, arg2='000000')&lt;br /&gt;
 CONCAT(SUBSTR(arg1, 1, 5 ), arg2)&lt;br /&gt;
 END&lt;br /&gt;
&lt;br /&gt;
Вызываются макросы как обычные функции:&lt;br /&gt;
&lt;br /&gt;
 SELECT MY_MACRO(code) FROM table t;&lt;br /&gt;
&lt;br /&gt;
Такой запрос будет преобразован в &amp;lt;code&amp;gt;SELECT CONCAT(SUBSTR(code, 1, 5 ), '000000') FROM table t&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_ant</id>
		<title>Использование ant</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_ant"/>
				<updated>2016-03-15T07:24:57Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: /* Переменные */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Помимо использования IDE основной be4-функционал доступен с помощью ant-таргетов.&lt;br /&gt;
&lt;br /&gt;
=== Стандартные таргеты ===&lt;br /&gt;
&lt;br /&gt;
В проектах на be4 определены следующие ant-таргеты:&lt;br /&gt;
* '''be.validate''' — валидация [[Project|проекта]] (вычитывание всех файлов, базовые проверки на корректность, исполнение всего [[Freemarker]]; никаких обращений к базе не делается)&lt;br /&gt;
* '''be.update''' — инкрементальное обновление схемы, метаданных и локализаций. Если обновление схемы может привести к потере данных, операция будет отклонена. Для принудительного выполнения определите BE4_FORCE_UPDATE=true&lt;br /&gt;
* '''be.meta''' — инкрементальное обновление метаданных (включая roles, icons, references, page customizations, pages)&lt;br /&gt;
* '''be.locale''' — инкрементальное обновление локализаций&lt;br /&gt;
* '''be.ddl''' — инкрементальное обновление схемы. Для принудительного выполнения определите BE4_FORCE_UPDATE=true.&lt;br /&gt;
* '''be.ddl.check''' — вывод SQL-предложений, которые потребуются для инкрементального обновления схемы. Никаких изменений в базу не вносится.&lt;br /&gt;
* '''setup.db''' — полное разворачивание базы с нуля (как в BE)&lt;br /&gt;
* '''setup.meta''' — полное внесение метаданных и локализаций&lt;br /&gt;
* '''setup.just.meta''' — полное внесение метаданных&lt;br /&gt;
* '''setup.locale''' — полное внесение локализаций&lt;br /&gt;
* '''setup.adhoc''' — выполнение одного или нескольких FTL-скриптов из custom steps (передаются параметром -DA_SCRIPT='script1;script2'). Можно запускать скрипты из модуля (-DA_SCRIPT='realty:dictionaries') либо из всех модулей, где такой скрипт есть (-DA_SCRIPT='all:dictionaries')&lt;br /&gt;
* '''main''' (таргет по умолчанию) — сборка war&lt;br /&gt;
&lt;br /&gt;
=== Переменные ===&lt;br /&gt;
Имеются следующие BE4-специфичные переменные&lt;br /&gt;
* '''BE4_DIR''' — каталог с проектом be4 (без него ничего не заработает)&lt;br /&gt;
* '''BE4_PROFILE''' — если задано, указывает профиль соединения к базе данных (из connectionProfiles.*.yaml), который необходимо использовать.&lt;br /&gt;
* '''BE4_LOG_DIR''' — если задано, данный каталог будет использован для логирования BE4-операций.&lt;br /&gt;
* '''BE4_DEBUG''' — если &amp;quot;true&amp;quot;, будет выводиться дополнительная отладочная информация в stderr.&lt;br /&gt;
* '''BE4_FORCE_UPDATE''' — если &amp;quot;true&amp;quot;, будут выполняться потенциально опасные изменения в схеме базы данных (которые могут привести к потере пользовательских данных).&lt;br /&gt;
* '''BE4_UNLOCK_PROTECTED_PROFILE''' — если &amp;quot;true&amp;quot;, защищённый (protected) [[BeConnectionProfile|профиль соединения]] будет использоваться без дополнительных подтверждений.&lt;br /&gt;
&lt;br /&gt;
* '''BE4_&amp;amp;lt;имя_модуля&amp;amp;gt;''' — если true, то будут использованы метаданные из BE4-модуля (BE4-модуль должен существовать), иначе — из старого BE-модуля с тем же именем.&lt;br /&gt;
&lt;br /&gt;
Только с таргетом be.validate:&lt;br /&gt;
* '''BE4_SKIP_VALIDATION'''=true — если задано, пропустить собственно валидацию (но прочие команды из списка ниже будут выполняться).&lt;br /&gt;
* '''BE4_RDBMS'''=mysql/postgres/oracle/db2/sqlserver/m4 — если задано, валидация будет выполняться с использованием соответствующей СУБД (это может повлиять на выполнение условных секций в FTL, результат разворачивания макросов, включения extras и т. д.).&lt;br /&gt;
* '''BE4_CHECK_QUERY'''=&amp;quot;entity.query&amp;quot; — если задано, текст указанного запроса после выполнения FTL будет выведен на экран). Если указана фиктивная BE4_RDBMS=m4, на место СУБД-специфичных FTL-функций будут подставлены соответствующие m4-функции (может пригодиться для обратного портирования кода в m4).&lt;br /&gt;
* '''BE4_CHECK_DDL'''=entity — если задано, DDL, необходимый для создания указанной сущности будет выведен на экран. Если указана фиктивная BE4_RDBMS=m4, будет сгенерирован соответствующий m4-код (может пригодиться для обратного портирования кода в m4).&lt;br /&gt;
* '''BE4_CHECK_ROLES'''=true — если задано, на экран будет выведен список ролей проекта, действующий в данных условиях. Может пригодиться, если часть ролей устанавливается условно через extras и хочется проверить, правильно ли отработали условия.&lt;br /&gt;
* '''BE4_CREATE_PROFILE_PROPERTIES'''=&amp;lt;file_path&amp;gt; — создаёт файл properties со свойствами профиля соединения и проекта, который может пригодиться для старой системы тестирования.&lt;br /&gt;
* '''BE4_SAVE'''=true — если задано, проект будет пересохранён (только основной проект, без учёта подключенных модулей) с помощью той же процедуры, как при сохранении через Eclipse. Могут быть отсортированы или переформатированы некоторые элементы проекта.&lt;br /&gt;
&lt;br /&gt;
=== Задачи ===&lt;br /&gt;
При редактировании ant-скриптов можно использовать следующие задачи (tasks):&lt;br /&gt;
* '''be4.db''' — создание базы по BE4-проекту. Параметры:&lt;br /&gt;
:* modules: если true, будут использованы BE4-модули&lt;br /&gt;
&lt;br /&gt;
* '''be4.meta''' — синхронизация. Параметры:&lt;br /&gt;
:* modules: если true, будут использованы BE4-модули&lt;br /&gt;
:* mode: режим синхронизации (all, meta, locale, ddl, security)&lt;br /&gt;
&lt;br /&gt;
* '''be4.data''' — выполнение скрипта или набора скриптов. Параметры:&lt;br /&gt;
:* scriptName: имена скриптов через точку с запятой. Можно написать moduleName:scriptName для выполнения скрипта из модуля, либо all:scriptName для выполнения скрипта с таким именем из всех модулей.&lt;br /&gt;
&lt;br /&gt;
* '''be4.validate''' — валидировать BE4-проект и (для немодульного проекта) заполнить свойства ANT из модели&lt;br /&gt;
:* modules: если true, будут подключены BE4-модули. Рекомендуется ставить в true всегда кроме каких-то частных случаев, когда важна производительность.&lt;br /&gt;
&lt;br /&gt;
* '''be4.tools''' — дополнительный инструментарий BE4.&lt;br /&gt;
&lt;br /&gt;
У всех задач есть общие параметры:&lt;br /&gt;
* projectPath (обязательно) — путь к проекту&lt;br /&gt;
* logDir — каталог для логирования (переопределяет переменную BE4_LOG_DIR)&lt;br /&gt;
* useMeta — экспериментальная опция: использовать базовые beanexplorer-метаданные из YAML-проекта beanexplorer_meta без вычитывания базы инициализированной через m4.&lt;br /&gt;
&lt;br /&gt;
=== Инструментарий ===&lt;br /&gt;
Для технических операций имеется специальная ant-задача '''be4.tools'''. По умолчанию эта задача не соответствует никакому ant-таргету. Если она требуется, можно создать таргет, например, так:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;target name=&amp;quot;be.tools&amp;quot; depends=&amp;quot;be4_settings&amp;quot;&amp;gt;&amp;lt;be4.tools projectPath=&amp;quot;${project.home}&amp;quot;/&amp;gt;&amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для пользования инструментами необходимо задавать дополнительные свойства:&lt;br /&gt;
* '''BE4_DUMP_TABLES'''=&amp;quot;таблица1,таблица2,...&amp;quot; — сдампить из базы соответствующей текущему connection-profile заданные таблицы в новый yaml-проект (будет создан подкаталог yamlDump в текущем каталоге). Может пригодиться для создания болванки при переносе таблиц из m4 в yaml. Пример:&lt;br /&gt;
 ant be.tools -DBE4_PROFILE=foo -DBE4_DUMP_TABLES=users,queries,operations&lt;br /&gt;
&lt;br /&gt;
:В дампе присутствуют все [[Query|представления]], [[Operation|операции]] и схемы указанных [[Entity|сущностей]], а также сообщения [[EntityLocalizations|локализации]] с таким же entityName.&lt;br /&gt;
&lt;br /&gt;
Для компиляции самого BE4 (в объёме необходимом для последующего использования вышеуказанных ant-таргетов) необходимо набрать ant в каталоге be4/src. Не требуется никаких внешних зависимостей.&lt;br /&gt;
&lt;br /&gt;
== Использование вне приложений ==&lt;br /&gt;
Следующие цели можно запускать без какого-либо приложения, т.е. досаточно просто зайти в папку be4/src и написать &amp;quot;ant someTarget&amp;quot;:&lt;br /&gt;
* '''wizard''' — позволяет генерировать новые BE4 приложения. Функционал аналогичен функционалу создания нового приложения в BEclipse (File → New → Project → BeanExplorer → BeanExplorer Project), однако все данные вводятся в консоли, а не в GUI.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BE-SQL</id>
		<title>BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BE-SQL"/>
				<updated>2016-02-09T10:59:14Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: /* Список всех поддерживаемых SQL-функций */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BE-SQL''' — диалект SQL, который поддерживается BeanExplorer SQL Parser. Поддерживаются только запросы SELECT. Больше всего он похож на PostgreSQL, но некоторые конструкции из других диалектов тоже поддерживаются. Он также должен понимать различные BE-специфичные теги вроде &amp;lt;if&amp;gt;, &amp;lt;unless&amp;gt; и т. д. В данный момент находится в разработке: не все реальные запросы из проектов успешно разбираются BE-SQL.&lt;br /&gt;
&lt;br /&gt;
Соответствие FreeMarker-конструкций и BE-SQL конструкций:&lt;br /&gt;
&lt;br /&gt;
* chr(...) — CHR() или CHAR()&lt;br /&gt;
* concat(...) — CONCAT() или ||&lt;br /&gt;
* coalesce(...) — COALESCE() или IFNULL()&lt;br /&gt;
* round(...) — ROUND()&lt;br /&gt;
* length(...) — LENGTH() или LEN()&lt;br /&gt;
* lpad(...) — LPAD()&lt;br /&gt;
* replace(...) — REPLACE()&lt;br /&gt;
* substring(...) — SUBSTR() или SUBSTRING()&lt;br /&gt;
* if(...) — IF() (может транслироваться в предложение CASE WHEN ...)&lt;br /&gt;
* ?dateFormat — FORMAT_DATE()&lt;br /&gt;
* ?dateTimeFormat — FORMAT_DATETIME()&lt;br /&gt;
* ?dateFormatRus — FORMAT_DATE_RUS()&lt;br /&gt;
* ?asInt — CAST(x AS BIGINT), TO_NUMBER(x)&lt;br /&gt;
* ?asVarChar — CAST(x AS CHAR), CAST(x AS VARCHAR), TO_CHAR(x)&lt;br /&gt;
* ?asDate — CAST(x AS DATE), TO_DATE(x)&lt;br /&gt;
* ?lower — LOWER()&lt;br /&gt;
* ?upper — UPPER()&lt;br /&gt;
* ?monthStart — DATE_TRUNC('MONTH', x)&lt;br /&gt;
* ?yearStart — DATE_TRUNC('YEAR', x)&lt;br /&gt;
* ?indexOf — INSTR(string, subString) или POSITION(subString IN string)&lt;br /&gt;
* ?str — просто пишите в 'одинарных кавычках', экранируйте одинарную кавычку с помощью '\'&lt;br /&gt;
* ?quote — просто пишите в &amp;quot;двойных кавычках&amp;quot; или в `обратных кавычках`, оба варианта должны сработать и транслироваться при необходимости&lt;br /&gt;
* currentDateTime — CURRENT_DATETIME или NOW()&lt;br /&gt;
* currentDate — CURRENT_DATE&lt;br /&gt;
* addMonths(date,mon) — ADD_MONTHS(date, mon)&lt;br /&gt;
* addDays(date, days) — ADD_DAYS(date, days)&lt;br /&gt;
* addMillis(date, ms) — ADD_MILLIS(date, ms)&lt;br /&gt;
* fromFakeTable — FROM DUAL или можно не писать FROM вообще&lt;br /&gt;
&lt;br /&gt;
Для ограничения количества записей можно просто писать SELECT ... LIMIT 1: это транслируется в соответствующий диалект SQL.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых SQL-функций ===&lt;br /&gt;
&lt;br /&gt;
В скобках указываются синонимы&lt;br /&gt;
&lt;br /&gt;
 CONCAT, COALESCE (IFNULL), COUNT, SUM, MAX, MIN, SUBSTR (SUBSTRING), LENGTH (LEN), UPPER, LOWER, CHR (CHAR), TO_CHAR, TO_NUMBER, TO_DATE,&lt;br /&gt;
 REPLACE, LPAD, ROUND, TRUNC (TRUNCATE), IF, NOW, FORMAT_DATE (=TO_CHAR(x, 'YYYY-MM-DD')), FORMAT_DATETIME (=TO_CHAR(x, 'YYYY-MM-DD HH24:MI:SS')),&lt;br /&gt;
 FORMAT_DATE_RUS (=TO_CHAR(x, 'DD.MM.YYYY')), FORMAT_DATE_RUS_SHORT (=TO_CHAR(x, 'DD.MM.YY')), YEAR, MONTH, DAY, DATE_TRUNC, &lt;br /&gt;
 INSTR, DATE_ADD, ADD_MONTHS, ADD_DAYS, ADD_MILLIS, LAST_DAY, YEAR_DIFF.&lt;br /&gt;
&lt;br /&gt;
=== Форматирование даты ===&lt;br /&gt;
&lt;br /&gt;
Для форматирования даты в строку можно использовать &amp;lt;code&amp;gt;TO_CHAR(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;DATE_FORMAT(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt;. Строка формата должна быть одной из предопределённых констант из списка, иначе будет ошибка:&lt;br /&gt;
&lt;br /&gt;
* 'YYYY-MM-DD' или '%Y-%m-%d' (также можно использовать функцию FORMAT_DATE())&lt;br /&gt;
* 'YYYY-MM-DD HH24:MI:SS' или '%Y-%m-%d %H:%i:%S' (также можно использовать функцию FORMAT_DATETIME())&lt;br /&gt;
* 'DD.MM.YYYY' или '%d.%m.%Y' (также можно использовать функцию FORMAT_DATE_RUS())&lt;br /&gt;
* 'DD.MM.YY' или '%d.%m.%y' (также можно использовать функцию FORMAT_DATE_RUS_SHORT())&lt;br /&gt;
* 'YYYY' или '%Y'&lt;br /&gt;
* 'MM' или '%m'&lt;br /&gt;
* 'DD' или '%d'&lt;br /&gt;
&lt;br /&gt;
Заметьте, что функция YEAR(дата) возвращает число, а TO_CHAR(дата, 'YYYY') — строку. Аналогично MONTH и DAY.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых операций ===&lt;br /&gt;
&lt;br /&gt;
 +, -, *, /, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, = (или ==), != (или &amp;lt;&amp;gt;), || (конкатенация строк), OR, AND (или &amp;amp;&amp;amp;), NOT (или !), LIKE.&lt;br /&gt;
&lt;br /&gt;
=== Что точно не работает пока ===&lt;br /&gt;
&lt;br /&gt;
Использование этих возможностей скорее всего приведёт к ошибке валидации. В некоторых случаях к некорректному переформатированию в другом движке.&lt;br /&gt;
&lt;br /&gt;
* BE-теги &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; в JOIN/ORDER BY/GROUP BY и других нетривиальных местах&lt;br /&gt;
* ?asPK, genericRef, joinGenericRef, indexOf&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BE-SQL</id>
		<title>BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BE-SQL"/>
				<updated>2015-12-23T06:16:03Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BE-SQL''' — диалект SQL, который поддерживается BeanExplorer SQL Parser. Поддерживаются только запросы SELECT. Больше всего он похож на PostgreSQL, но некоторые конструкции из других диалектов тоже поддерживаются. Он также должен понимать различные BE-специфичные теги вроде &amp;lt;if&amp;gt;, &amp;lt;unless&amp;gt; и т. д. В данный момент находится в разработке: не все реальные запросы из проектов успешно разбираются BE-SQL.&lt;br /&gt;
&lt;br /&gt;
Соответствие FreeMarker-конструкций и BE-SQL конструкций:&lt;br /&gt;
&lt;br /&gt;
* chr(...) — CHR() или CHAR()&lt;br /&gt;
* concat(...) — CONCAT() или ||&lt;br /&gt;
* coalesce(...) — COALESCE() или IFNULL()&lt;br /&gt;
* round(...) — ROUND()&lt;br /&gt;
* length(...) — LENGTH() или LEN()&lt;br /&gt;
* lpad(...) — LPAD()&lt;br /&gt;
* replace(...) — REPLACE()&lt;br /&gt;
* substring(...) — SUBSTR() или SUBSTRING()&lt;br /&gt;
* if(...) — IF() (может транслироваться в предложение CASE WHEN ...)&lt;br /&gt;
* ?dateFormat — FORMAT_DATE()&lt;br /&gt;
* ?dateTimeFormat — FORMAT_DATETIME()&lt;br /&gt;
* ?dateFormatRus — FORMAT_DATE_RUS()&lt;br /&gt;
* ?asInt — CAST(x AS BIGINT), TO_NUMBER(x)&lt;br /&gt;
* ?asVarChar — CAST(x AS CHAR), CAST(x AS VARCHAR), TO_CHAR(x)&lt;br /&gt;
* ?asDate — CAST(x AS DATE), TO_DATE(x)&lt;br /&gt;
* ?lower — LOWER()&lt;br /&gt;
* ?upper — UPPER()&lt;br /&gt;
* ?monthStart — DATE_TRUNC('MONTH', x)&lt;br /&gt;
* ?yearStart — DATE_TRUNC('YEAR', x)&lt;br /&gt;
* ?indexOf — INSTR(string, subString) или POSITION(subString IN string)&lt;br /&gt;
* ?str — просто пишите в 'одинарных кавычках', экранируйте одинарную кавычку с помощью '\'&lt;br /&gt;
* ?quote — просто пишите в &amp;quot;двойных кавычках&amp;quot; или в `обратных кавычках`, оба варианта должны сработать и транслироваться при необходимости&lt;br /&gt;
* currentDateTime — CURRENT_DATETIME или NOW()&lt;br /&gt;
* currentDate — CURRENT_DATE&lt;br /&gt;
* addMonths(date,mon) — ADD_MONTHS(date, mon)&lt;br /&gt;
* addDays(date, days) — ADD_DAYS(date, days)&lt;br /&gt;
* addMillis(date, ms) — ADD_MILLIS(date, ms)&lt;br /&gt;
* fromFakeTable — FROM DUAL или можно не писать FROM вообще&lt;br /&gt;
&lt;br /&gt;
Для ограничения количества записей можно просто писать SELECT ... LIMIT 1: это транслируется в соответствующий диалект SQL.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых SQL-функций ===&lt;br /&gt;
&lt;br /&gt;
В скобках указываются синонимы&lt;br /&gt;
&lt;br /&gt;
 CONCAT, COALESCE (IFNULL), COUNT, SUM, MAX, MIN, SUBSTR (SUBSTRING), LENGTH (LEN), UPPER, LOWER, CHR (CHAR), TO_CHAR, TO_NUMBER, TO_DATE,&lt;br /&gt;
 REPLACE, LPAD, ROUND, TRUNC (TRUNCATE), IF, NOW, FORMAT_DATE (=TO_CHAR(x, 'YYYY-MM-DD')), FORMAT_DATETIME (=TO_CHAR(x, 'YYYY-MM-DD HH24:MI:SS')),&lt;br /&gt;
 FORMAT_DATE_RUS (=TO_CHAR(x, 'DD.MM.YYYY')), FORMAT_DATE_RUS_SHORT (=TO_CHAR(x, 'DD.MM.YY')), YEAR, MONTH, DAY, DATE_TRUNC, &lt;br /&gt;
 INSTR, DATE_ADD, ADD_MONTHS, ADD_DAYS, ADD_MILLIS.&lt;br /&gt;
&lt;br /&gt;
=== Форматирование даты ===&lt;br /&gt;
&lt;br /&gt;
Для форматирования даты в строку можно использовать &amp;lt;code&amp;gt;TO_CHAR(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;DATE_FORMAT(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt;. Строка формата должна быть одной из предопределённых констант из списка, иначе будет ошибка:&lt;br /&gt;
&lt;br /&gt;
* 'YYYY-MM-DD' или '%Y-%m-%d' (также можно использовать функцию FORMAT_DATE())&lt;br /&gt;
* 'YYYY-MM-DD HH24:MI:SS' или '%Y-%m-%d %H:%i:%S' (также можно использовать функцию FORMAT_DATETIME())&lt;br /&gt;
* 'DD.MM.YYYY' или '%d.%m.%Y' (также можно использовать функцию FORMAT_DATE_RUS())&lt;br /&gt;
* 'DD.MM.YY' или '%d.%m.%y' (также можно использовать функцию FORMAT_DATE_RUS_SHORT())&lt;br /&gt;
* 'YYYY' или '%Y'&lt;br /&gt;
* 'MM' или '%m'&lt;br /&gt;
* 'DD' или '%d'&lt;br /&gt;
&lt;br /&gt;
Заметьте, что функция YEAR(дата) возвращает число, а TO_CHAR(дата, 'YYYY') — строку. Аналогично MONTH и DAY.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых операций ===&lt;br /&gt;
&lt;br /&gt;
 +, -, *, /, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, = (или ==), != (или &amp;lt;&amp;gt;), || (конкатенация строк), OR, AND (или &amp;amp;&amp;amp;), NOT (или !), LIKE.&lt;br /&gt;
&lt;br /&gt;
=== Что точно не работает пока ===&lt;br /&gt;
&lt;br /&gt;
Использование этих возможностей скорее всего приведёт к ошибке валидации. В некоторых случаях к некорректному переформатированию в другом движке.&lt;br /&gt;
&lt;br /&gt;
* BE-теги &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; в JOIN/ORDER BY/GROUP BY и других нетривиальных местах&lt;br /&gt;
* ?asPK, genericRef, joinGenericRef, indexOf&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BE-SQL</id>
		<title>BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BE-SQL"/>
				<updated>2015-12-01T03:49:49Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: /* Список всех поддерживаемых операций */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BE-SQL''' — диалект SQL, который поддерживается BeanExplorer SQL Parser. Поддерживаются только запросы SELECT. Больше всего он похож на PostgreSQL, но некоторые конструкции из других диалектов тоже поддерживаются. Он также должен понимать различные BE-специфичные теги вроде &amp;lt;if&amp;gt;, &amp;lt;unless&amp;gt; и т. д. В данный момент находится в разработке: не все реальные запросы из проектов успешно разбираются BE-SQL.&lt;br /&gt;
&lt;br /&gt;
Соответствие FreeMarker-конструкций и BE-SQL конструкций:&lt;br /&gt;
&lt;br /&gt;
* chr(...) — CHR() или CHAR()&lt;br /&gt;
* concat(...) — CONCAT() или ||&lt;br /&gt;
* coalesce(...) — COALESCE() или IFNULL()&lt;br /&gt;
* round(...) — ROUND()&lt;br /&gt;
* length(...) — LENGTH() или LEN()&lt;br /&gt;
* lpad(...) — LPAD()&lt;br /&gt;
* replace(...) — REPLACE()&lt;br /&gt;
* substring(...) — SUBSTR() или SUBSTRING()&lt;br /&gt;
* if(...) — IF() (может транслироваться в предложение CASE WHEN ...)&lt;br /&gt;
* ?dateFormat — FORMAT_DATE()&lt;br /&gt;
* ?dateTimeFormat — FORMAT_DATETIME()&lt;br /&gt;
* ?dateFormatRus — FORMAT_DATE_RUS()&lt;br /&gt;
* ?asInt — CAST(x AS BIGINT), TO_NUMBER(x)&lt;br /&gt;
* ?asVarChar — CAST(x AS CHAR), CAST(x AS VARCHAR), TO_CHAR(x)&lt;br /&gt;
* ?asDate — CAST(x AS DATE), TO_DATE(x)&lt;br /&gt;
* ?lower — LOWER()&lt;br /&gt;
* ?upper — UPPER()&lt;br /&gt;
* ?str — просто пишите в 'одинарных кавычках', экранируйте одинарную кавычку с помощью '\'&lt;br /&gt;
* ?quote — просто пишите в &amp;quot;двойных кавычках&amp;quot; или в `обратных кавычках`, оба варианта должны сработать и транслироваться при необходимости&lt;br /&gt;
* currentDateTime — CURRENT_DATETIME или NOW()&lt;br /&gt;
* currentDate — CURRENT_DATE&lt;br /&gt;
* fromFakeTable — FROM DUAL или можно не писать FROM вообще&lt;br /&gt;
&lt;br /&gt;
Для ограничения количества записей можно просто писать SELECT ... LIMIT 1: это транслируется в соответствующий диалект SQL.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых SQL-функций ===&lt;br /&gt;
&lt;br /&gt;
В скобках указываются синонимы&lt;br /&gt;
&lt;br /&gt;
 CONCAT, COALESCE (IFNULL), COUNT, SUM, MAX, MIN, SUBSTR (SUBSTRING), LENGTH (LEN), UPPER, LOWER, CHR (CHAR), TO_CHAR, TO_NUMBER, TO_DATE,&lt;br /&gt;
 REPLACE, LPAD, ROUND, TRUNC (TRUNCATE), IF, NOW, FORMAT_DATE (=TO_CHAR(x, 'YYYY-MM-DD')), FORMAT_DATETIME (=TO_CHAR(x, 'YYYY-MM-DD HH24:MI:SS')),&lt;br /&gt;
 FORMAT_DATE_RUS (=TO_CHAR(x, 'DD.MM.YYYY')), FORMAT_DATE_RUS_SHORT (=TO_CHAR(x, 'DD.MM.YY')), YEAR, MONTH, DAY.&lt;br /&gt;
&lt;br /&gt;
=== Форматирование даты ===&lt;br /&gt;
&lt;br /&gt;
Для форматирования даты в строку можно использовать &amp;lt;code&amp;gt;TO_CHAR(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;DATE_FORMAT(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt;. Строка формата должна быть одной из предопределённых констант из списка, иначе будет ошибка:&lt;br /&gt;
&lt;br /&gt;
* 'YYYY-MM-DD' или '%Y-%m-%d' (также можно использовать функцию FORMAT_DATE())&lt;br /&gt;
* 'YYYY-MM-DD HH24:MI:SS' или '%Y-%m-%d %H:%i:%S' (также можно использовать функцию FORMAT_DATETIME())&lt;br /&gt;
* 'DD.MM.YYYY' или '%d.%m.%Y' (также можно использовать функцию FORMAT_DATE_RUS())&lt;br /&gt;
* 'DD.MM.YY' или '%d.%m.%y' (также можно использовать функцию FORMAT_DATE_RUS_SHORT())&lt;br /&gt;
* 'YYYY' или '%Y'&lt;br /&gt;
* 'MM' или '%m'&lt;br /&gt;
* 'DD' или '%d'&lt;br /&gt;
&lt;br /&gt;
Заметьте, что функция YEAR(дата) возвращает число, а TO_CHAR(дата, 'YYYY') — строку. Аналогично MONTH и DAY.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых операций ===&lt;br /&gt;
&lt;br /&gt;
 +, -, *, /, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, = (или ==), != (или &amp;lt;&amp;gt;), || (конкатенация строк), OR, AND (или &amp;amp;&amp;amp;), NOT (или !), LIKE.&lt;br /&gt;
&lt;br /&gt;
=== Что точно не работает пока ===&lt;br /&gt;
&lt;br /&gt;
Использование этих возможностей скорее всего приведёт к ошибке валидации. В некоторых случаях к некорректному переформатированию в другом движке.&lt;br /&gt;
&lt;br /&gt;
* BE-теги &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; в JOIN/ORDER BY/GROUP BY и других нетривиальных местах&lt;br /&gt;
* ?asPK, genericRef, joinGenericRef, indexOf&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BE-SQL</id>
		<title>BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BE-SQL"/>
				<updated>2015-11-30T05:41:22Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BE-SQL''' — диалект SQL, который поддерживается BeanExplorer SQL Parser. Поддерживаются только запросы SELECT. Больше всего он похож на PostgreSQL, но некоторые конструкции из других диалектов тоже поддерживаются. Он также должен понимать различные BE-специфичные теги вроде &amp;lt;if&amp;gt;, &amp;lt;unless&amp;gt; и т. д. В данный момент находится в разработке: не все реальные запросы из проектов успешно разбираются BE-SQL.&lt;br /&gt;
&lt;br /&gt;
Соответствие FreeMarker-конструкций и BE-SQL конструкций:&lt;br /&gt;
&lt;br /&gt;
* chr(...) — CHR() или CHAR()&lt;br /&gt;
* concat(...) — CONCAT() или ||&lt;br /&gt;
* coalesce(...) — COALESCE() или IFNULL()&lt;br /&gt;
* round(...) — ROUND()&lt;br /&gt;
* length(...) — LENGTH() или LEN()&lt;br /&gt;
* lpad(...) — LPAD()&lt;br /&gt;
* replace(...) — REPLACE()&lt;br /&gt;
* substring(...) — SUBSTR() или SUBSTRING()&lt;br /&gt;
* if(...) — IF() (может транслироваться в предложение CASE WHEN ...)&lt;br /&gt;
* ?dateFormat — FORMAT_DATE()&lt;br /&gt;
* ?dateTimeFormat — FORMAT_DATETIME()&lt;br /&gt;
* ?dateFormatRus — FORMAT_DATE_RUS()&lt;br /&gt;
* ?asInt — CAST(x AS BIGINT), TO_NUMBER(x)&lt;br /&gt;
* ?asVarChar — CAST(x AS CHAR), CAST(x AS VARCHAR), TO_CHAR(x)&lt;br /&gt;
* ?asDate — CAST(x AS DATE), TO_DATE(x)&lt;br /&gt;
* ?lower — LOWER()&lt;br /&gt;
* ?upper — UPPER()&lt;br /&gt;
* ?str — просто пишите в 'одинарных кавычках', экранируйте одинарную кавычку с помощью '\'&lt;br /&gt;
* ?quote — просто пишите в &amp;quot;двойных кавычках&amp;quot; или в `обратных кавычках`, оба варианта должны сработать и транслироваться при необходимости&lt;br /&gt;
* currentDateTime — CURRENT_DATETIME или NOW()&lt;br /&gt;
* currentDate — CURRENT_DATE&lt;br /&gt;
* fromFakeTable — FROM DUAL или можно не писать FROM вообще&lt;br /&gt;
&lt;br /&gt;
Для ограничения количества записей можно просто писать SELECT ... LIMIT 1: это транслируется в соответствующий диалект SQL.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых SQL-функций ===&lt;br /&gt;
&lt;br /&gt;
В скобках указываются синонимы&lt;br /&gt;
&lt;br /&gt;
 CONCAT, COALESCE (IFNULL), COUNT, SUM, MAX, MIN, SUBSTR (SUBSTRING), LENGTH (LEN), UPPER, LOWER, CHR (CHAR), TO_CHAR, TO_NUMBER, TO_DATE,&lt;br /&gt;
 REPLACE, LPAD, ROUND, TRUNC (TRUNCATE), IF, NOW, FORMAT_DATE (=TO_CHAR(x, 'YYYY-MM-DD')), FORMAT_DATETIME (=TO_CHAR(x, 'YYYY-MM-DD HH24:MI:SS')),&lt;br /&gt;
 FORMAT_DATE_RUS (=TO_CHAR(x, 'DD.MM.YYYY')), FORMAT_DATE_RUS_SHORT (=TO_CHAR(x, 'DD.MM.YY')), YEAR, MONTH, DAY.&lt;br /&gt;
&lt;br /&gt;
=== Форматирование даты ===&lt;br /&gt;
&lt;br /&gt;
Для форматирования даты в строку можно использовать &amp;lt;code&amp;gt;TO_CHAR(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;DATE_FORMAT(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt;. Строка формата должна быть одной из предопределённых констант из списка, иначе будет ошибка:&lt;br /&gt;
&lt;br /&gt;
* 'YYYY-MM-DD' или '%Y-%m-%d' (также можно использовать функцию FORMAT_DATE())&lt;br /&gt;
* 'YYYY-MM-DD HH24:MI:SS' или '%Y-%m-%d %H:%i:%S' (также можно использовать функцию FORMAT_DATETIME())&lt;br /&gt;
* 'DD.MM.YYYY' или '%d.%m.%Y' (также можно использовать функцию FORMAT_DATE_RUS())&lt;br /&gt;
* 'DD.MM.YY' или '%d.%m.%y' (также можно использовать функцию FORMAT_DATE_RUS_SHORT())&lt;br /&gt;
* 'YYYY' или '%Y'&lt;br /&gt;
* 'MM' или '%m'&lt;br /&gt;
* 'DD' или '%d'&lt;br /&gt;
&lt;br /&gt;
Заметьте, что функция YEAR(дата) возвращает число, а TO_CHAR(дата, 'YYYY') — строку. Аналогично MONTH и DAY.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых операций ===&lt;br /&gt;
&lt;br /&gt;
 +, -, *, /, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, = (или ==), != (или &amp;lt;&amp;gt;), || (конкатенация строк), OR, AND (или &amp;amp;&amp;amp;), NOT (или !), XOR, LIKE.&lt;br /&gt;
&lt;br /&gt;
=== Что точно не работает пока ===&lt;br /&gt;
&lt;br /&gt;
Использование этих возможностей скорее всего приведёт к ошибке валидации. В некоторых случаях к некорректному переформатированию в другом движке.&lt;br /&gt;
&lt;br /&gt;
* BE-теги &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; в JOIN/ORDER BY/GROUP BY и других нетривиальных местах&lt;br /&gt;
* ?asPK, genericRef, joinGenericRef, indexOf&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BE-SQL</id>
		<title>BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BE-SQL"/>
				<updated>2015-11-30T05:39:50Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BE-SQL''' — диалект SQL, который поддерживается BeanExplorer SQL Parser. Поддерживаются только запросы SELECT. Больше всего он похож на PostgreSQL, но некоторые конструкции из других диалектов тоже поддерживаются. Он также должен понимать различные BE-специфичные теги вроде &amp;lt;if&amp;gt;, &amp;lt;unless&amp;gt; и т. д. В данный момент находится в разработке: не все реальные запросы из проектов успешно разбираются BE-SQL.&lt;br /&gt;
&lt;br /&gt;
Соответствие FreeMarker-конструкций и BE-SQL конструкций:&lt;br /&gt;
&lt;br /&gt;
* chr(...) — CHR() или CHAR()&lt;br /&gt;
* concat(...) — CONCAT() или ||&lt;br /&gt;
* coalesce(...) — COALESCE() или IFNULL()&lt;br /&gt;
* length(...) — LENGTH() или LEN()&lt;br /&gt;
* lpad(...) — LPAD()&lt;br /&gt;
* replace(...) — REPLACE()&lt;br /&gt;
* substring(...) — SUBSTR() или SUBSTRING()&lt;br /&gt;
* if(...) — IF() (может транслироваться в предложение CASE WHEN ...)&lt;br /&gt;
* ?dateFormat — FORMAT_DATE()&lt;br /&gt;
* ?dateTimeFormat — FORMAT_DATETIME()&lt;br /&gt;
* ?dateFormatRus — FORMAT_DATE_RUS()&lt;br /&gt;
* ?asInt — CAST(x AS BIGINT), TO_NUMBER(x)&lt;br /&gt;
* ?asVarChar — CAST(x AS CHAR), CAST(x AS VARCHAR), TO_CHAR(x)&lt;br /&gt;
* ?asDate — CAST(x AS DATE), TO_DATE(x)&lt;br /&gt;
* ?lower — LOWER()&lt;br /&gt;
* ?upper — UPPER()&lt;br /&gt;
* ?quote — просто пишите в &amp;quot;двойных кавычках&amp;quot; или в `обратных кавычках`, оба варианта должны сработать и транслироваться при необходимости&lt;br /&gt;
* currentDateTime — CURRENT_DATETIME или NOW()&lt;br /&gt;
* currentDate — CURRENT_DATE&lt;br /&gt;
* fromFakeTable — FROM DUAL или можно не писать FROM вообще&lt;br /&gt;
&lt;br /&gt;
Для ограничения количества записей можно просто писать SELECT ... LIMIT 1: это транслируется в соответствующий диалект SQL.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых SQL-функций ===&lt;br /&gt;
&lt;br /&gt;
В скобках указываются синонимы&lt;br /&gt;
&lt;br /&gt;
 CONCAT, COALESCE (IFNULL), COUNT, SUM, MAX, MIN, SUBSTR (SUBSTRING), LENGTH (LEN), UPPER, LOWER, CHR (CHAR), TO_CHAR, TO_NUMBER, TO_DATE,&lt;br /&gt;
 REPLACE, LPAD, ROUND, TRUNC (TRUNCATE), IF, NOW, FORMAT_DATE (=TO_CHAR(x, 'YYYY-MM-DD')), FORMAT_DATETIME (=TO_CHAR(x, 'YYYY-MM-DD HH24:MI:SS')),&lt;br /&gt;
 FORMAT_DATE_RUS (=TO_CHAR(x, 'DD.MM.YYYY')), FORMAT_DATE_RUS_SHORT (=TO_CHAR(x, 'DD.MM.YY')), YEAR, MONTH, DAY.&lt;br /&gt;
&lt;br /&gt;
=== Форматирование даты ===&lt;br /&gt;
&lt;br /&gt;
Для форматирования даты в строку можно использовать &amp;lt;code&amp;gt;TO_CHAR(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;DATE_FORMAT(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt;. Строка формата должна быть одной из предопределённых констант из списка, иначе будет ошибка:&lt;br /&gt;
&lt;br /&gt;
* 'YYYY-MM-DD' или '%Y-%m-%d' (также можно использовать функцию FORMAT_DATE())&lt;br /&gt;
* 'YYYY-MM-DD HH24:MI:SS' или '%Y-%m-%d %H:%i:%S' (также можно использовать функцию FORMAT_DATETIME())&lt;br /&gt;
* 'DD.MM.YYYY' или '%d.%m.%Y' (также можно использовать функцию FORMAT_DATE_RUS())&lt;br /&gt;
* 'DD.MM.YY' или '%d.%m.%y' (также можно использовать функцию FORMAT_DATE_RUS_SHORT())&lt;br /&gt;
* 'YYYY' или '%Y'&lt;br /&gt;
* 'MM' или '%m'&lt;br /&gt;
* 'DD' или '%d'&lt;br /&gt;
&lt;br /&gt;
Заметьте, что функция YEAR(дата) возвращает число, а TO_CHAR(дата, 'YYYY') — строку. Аналогично MONTH и DAY.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых операций ===&lt;br /&gt;
&lt;br /&gt;
 +, -, *, /, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, = (или ==), != (или &amp;lt;&amp;gt;), || (конкатенация строк), OR, AND (или &amp;amp;&amp;amp;), NOT (или !), XOR, LIKE.&lt;br /&gt;
&lt;br /&gt;
=== Что точно не работает пока ===&lt;br /&gt;
&lt;br /&gt;
Использование этих возможностей скорее всего приведёт к ошибке валидации. В некоторых случаях к некорректному переформатированию в другом движке.&lt;br /&gt;
&lt;br /&gt;
* BE-теги &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; в JOIN/ORDER BY/GROUP BY и других нетривиальных местах&lt;br /&gt;
* ?asPK, genericRef, joinGenericRef, indexOf&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BE-SQL</id>
		<title>BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BE-SQL"/>
				<updated>2015-11-30T05:39:07Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: /* Что точно не работает пока */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BE-SQL''' — диалект SQL, который поддерживается BeanExplorer SQL Parser. Поддерживаются только запросы SELECT. Больше всего он похож на PostgreSQL, но некоторые конструкции из других диалектов тоже поддерживаются. Он также должен понимать различные BE-специфичные теги вроде &amp;lt;if&amp;gt;, &amp;lt;unless&amp;gt; и т. д. В данный момент находится в разработке: не все реальные запросы из проектов успешно разбираются BE-SQL.&lt;br /&gt;
&lt;br /&gt;
Соответствие FreeMarker-конструкций и BE-SQL конструкций:&lt;br /&gt;
&lt;br /&gt;
* chr(...) — CHR() или CHAR()&lt;br /&gt;
* concat(...) — CONCAT() или ||&lt;br /&gt;
* coalesce(...) — COALESCE() или IFNULL()&lt;br /&gt;
* length(...) — LENGTH() или LEN()&lt;br /&gt;
* lpad(...) — LPAD()&lt;br /&gt;
* replace(...) — REPLACE()&lt;br /&gt;
* substring(...) — SUBSTR() или SUBSTRING()&lt;br /&gt;
* ?dateFormat — FORMAT_DATE()&lt;br /&gt;
* ?dateTimeFormat — FORMAT_DATETIME()&lt;br /&gt;
* ?dateFormatRus — FORMAT_DATE_RUS()&lt;br /&gt;
* ?asInt — CAST(x AS BIGINT), TO_NUMBER(x)&lt;br /&gt;
* ?asVarChar — CAST(x AS CHAR), CAST(x AS VARCHAR), TO_CHAR(x)&lt;br /&gt;
* ?asDate — CAST(x AS DATE), TO_DATE(x)&lt;br /&gt;
* ?lower — LOWER()&lt;br /&gt;
* ?upper — UPPER()&lt;br /&gt;
* ?quote — просто пишите в &amp;quot;двойных кавычках&amp;quot; или в `обратных кавычках`, оба варианта должны сработать и транслироваться при необходимости&lt;br /&gt;
* currentDateTime — CURRENT_DATETIME или NOW()&lt;br /&gt;
* currentDate — CURRENT_DATE&lt;br /&gt;
* fromFakeTable — FROM DUAL или можно не писать FROM вообще&lt;br /&gt;
&lt;br /&gt;
Для ограничения количества записей можно просто писать SELECT ... LIMIT 1: это транслируется в соответствующий диалект SQL.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых SQL-функций ===&lt;br /&gt;
&lt;br /&gt;
В скобках указываются синонимы&lt;br /&gt;
&lt;br /&gt;
 CONCAT, COALESCE (IFNULL), COUNT, SUM, MAX, MIN, SUBSTR (SUBSTRING), LENGTH (LEN), UPPER, LOWER, CHR (CHAR), TO_CHAR, TO_NUMBER, TO_DATE,&lt;br /&gt;
 REPLACE, LPAD, ROUND, TRUNC (TRUNCATE), IF, NOW, FORMAT_DATE (=TO_CHAR(x, 'YYYY-MM-DD')), FORMAT_DATETIME (=TO_CHAR(x, 'YYYY-MM-DD HH24:MI:SS')),&lt;br /&gt;
 FORMAT_DATE_RUS (=TO_CHAR(x, 'DD.MM.YYYY')), FORMAT_DATE_RUS_SHORT (=TO_CHAR(x, 'DD.MM.YY')), YEAR, MONTH, DAY.&lt;br /&gt;
&lt;br /&gt;
=== Форматирование даты ===&lt;br /&gt;
&lt;br /&gt;
Для форматирования даты в строку можно использовать &amp;lt;code&amp;gt;TO_CHAR(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;DATE_FORMAT(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt;. Строка формата должна быть одной из предопределённых констант из списка, иначе будет ошибка:&lt;br /&gt;
&lt;br /&gt;
* 'YYYY-MM-DD' или '%Y-%m-%d' (также можно использовать функцию FORMAT_DATE())&lt;br /&gt;
* 'YYYY-MM-DD HH24:MI:SS' или '%Y-%m-%d %H:%i:%S' (также можно использовать функцию FORMAT_DATETIME())&lt;br /&gt;
* 'DD.MM.YYYY' или '%d.%m.%Y' (также можно использовать функцию FORMAT_DATE_RUS())&lt;br /&gt;
* 'DD.MM.YY' или '%d.%m.%y' (также можно использовать функцию FORMAT_DATE_RUS_SHORT())&lt;br /&gt;
* 'YYYY' или '%Y'&lt;br /&gt;
* 'MM' или '%m'&lt;br /&gt;
* 'DD' или '%d'&lt;br /&gt;
&lt;br /&gt;
Заметьте, что функция YEAR(дата) возвращает число, а TO_CHAR(дата, 'YYYY') — строку. Аналогично MONTH и DAY.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых операций ===&lt;br /&gt;
&lt;br /&gt;
 +, -, *, /, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, = (или ==), != (или &amp;lt;&amp;gt;), || (конкатенация строк), OR, AND (или &amp;amp;&amp;amp;), NOT (или !), XOR, LIKE.&lt;br /&gt;
&lt;br /&gt;
=== Что точно не работает пока ===&lt;br /&gt;
&lt;br /&gt;
Использование этих возможностей скорее всего приведёт к ошибке валидации. В некоторых случаях к некорректному переформатированию в другом движке.&lt;br /&gt;
&lt;br /&gt;
* BE-теги &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; в JOIN/ORDER BY/GROUP BY и других нетривиальных местах&lt;br /&gt;
* ?asPK, genericRef, joinGenericRef, indexOf&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BE-SQL</id>
		<title>BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BE-SQL"/>
				<updated>2015-11-30T05:38:27Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BE-SQL''' — диалект SQL, который поддерживается BeanExplorer SQL Parser. Поддерживаются только запросы SELECT. Больше всего он похож на PostgreSQL, но некоторые конструкции из других диалектов тоже поддерживаются. Он также должен понимать различные BE-специфичные теги вроде &amp;lt;if&amp;gt;, &amp;lt;unless&amp;gt; и т. д. В данный момент находится в разработке: не все реальные запросы из проектов успешно разбираются BE-SQL.&lt;br /&gt;
&lt;br /&gt;
Соответствие FreeMarker-конструкций и BE-SQL конструкций:&lt;br /&gt;
&lt;br /&gt;
* chr(...) — CHR() или CHAR()&lt;br /&gt;
* concat(...) — CONCAT() или ||&lt;br /&gt;
* coalesce(...) — COALESCE() или IFNULL()&lt;br /&gt;
* length(...) — LENGTH() или LEN()&lt;br /&gt;
* lpad(...) — LPAD()&lt;br /&gt;
* replace(...) — REPLACE()&lt;br /&gt;
* substring(...) — SUBSTR() или SUBSTRING()&lt;br /&gt;
* ?dateFormat — FORMAT_DATE()&lt;br /&gt;
* ?dateTimeFormat — FORMAT_DATETIME()&lt;br /&gt;
* ?dateFormatRus — FORMAT_DATE_RUS()&lt;br /&gt;
* ?asInt — CAST(x AS BIGINT), TO_NUMBER(x)&lt;br /&gt;
* ?asVarChar — CAST(x AS CHAR), CAST(x AS VARCHAR), TO_CHAR(x)&lt;br /&gt;
* ?asDate — CAST(x AS DATE), TO_DATE(x)&lt;br /&gt;
* ?lower — LOWER()&lt;br /&gt;
* ?upper — UPPER()&lt;br /&gt;
* ?quote — просто пишите в &amp;quot;двойных кавычках&amp;quot; или в `обратных кавычках`, оба варианта должны сработать и транслироваться при необходимости&lt;br /&gt;
* currentDateTime — CURRENT_DATETIME или NOW()&lt;br /&gt;
* currentDate — CURRENT_DATE&lt;br /&gt;
* fromFakeTable — FROM DUAL или можно не писать FROM вообще&lt;br /&gt;
&lt;br /&gt;
Для ограничения количества записей можно просто писать SELECT ... LIMIT 1: это транслируется в соответствующий диалект SQL.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых SQL-функций ===&lt;br /&gt;
&lt;br /&gt;
В скобках указываются синонимы&lt;br /&gt;
&lt;br /&gt;
 CONCAT, COALESCE (IFNULL), COUNT, SUM, MAX, MIN, SUBSTR (SUBSTRING), LENGTH (LEN), UPPER, LOWER, CHR (CHAR), TO_CHAR, TO_NUMBER, TO_DATE,&lt;br /&gt;
 REPLACE, LPAD, ROUND, TRUNC (TRUNCATE), IF, NOW, FORMAT_DATE (=TO_CHAR(x, 'YYYY-MM-DD')), FORMAT_DATETIME (=TO_CHAR(x, 'YYYY-MM-DD HH24:MI:SS')),&lt;br /&gt;
 FORMAT_DATE_RUS (=TO_CHAR(x, 'DD.MM.YYYY')), FORMAT_DATE_RUS_SHORT (=TO_CHAR(x, 'DD.MM.YY')), YEAR, MONTH, DAY.&lt;br /&gt;
&lt;br /&gt;
=== Форматирование даты ===&lt;br /&gt;
&lt;br /&gt;
Для форматирования даты в строку можно использовать &amp;lt;code&amp;gt;TO_CHAR(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;DATE_FORMAT(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt;. Строка формата должна быть одной из предопределённых констант из списка, иначе будет ошибка:&lt;br /&gt;
&lt;br /&gt;
* 'YYYY-MM-DD' или '%Y-%m-%d' (также можно использовать функцию FORMAT_DATE())&lt;br /&gt;
* 'YYYY-MM-DD HH24:MI:SS' или '%Y-%m-%d %H:%i:%S' (также можно использовать функцию FORMAT_DATETIME())&lt;br /&gt;
* 'DD.MM.YYYY' или '%d.%m.%Y' (также можно использовать функцию FORMAT_DATE_RUS())&lt;br /&gt;
* 'DD.MM.YY' или '%d.%m.%y' (также можно использовать функцию FORMAT_DATE_RUS_SHORT())&lt;br /&gt;
* 'YYYY' или '%Y'&lt;br /&gt;
* 'MM' или '%m'&lt;br /&gt;
* 'DD' или '%d'&lt;br /&gt;
&lt;br /&gt;
Заметьте, что функция YEAR(дата) возвращает число, а TO_CHAR(дата, 'YYYY') — строку. Аналогично MONTH и DAY.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых операций ===&lt;br /&gt;
&lt;br /&gt;
 +, -, *, /, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, = (или ==), != (или &amp;lt;&amp;gt;), || (конкатенация строк), OR, AND (или &amp;amp;&amp;amp;), NOT (или !), XOR, LIKE.&lt;br /&gt;
&lt;br /&gt;
=== Что точно не работает пока ===&lt;br /&gt;
&lt;br /&gt;
Использование этих возможностей скорее всего приведёт к ошибке валидации. В некоторых случаях к некорректному переформатированию в другом движке.&lt;br /&gt;
&lt;br /&gt;
* Форматирование даты на русском&lt;br /&gt;
* Функции для извлечения полей из даты&lt;br /&gt;
* BE-теги &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; не в списке колонок&lt;br /&gt;
* ?asPK, genericRef, joinGenericRef, indexOf&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BE-SQL</id>
		<title>BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BE-SQL"/>
				<updated>2015-11-27T09:36:57Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BE-SQL''' — диалект SQL, который поддерживается BeanExplorer SQL Parser. Поддерживаются только запросы SELECT. Больше всего он похож на PostgreSQL, но некоторые конструкции из других диалектов тоже поддерживаются. Он также должен понимать различные BE-специфичные теги вроде &amp;lt;if&amp;gt;, &amp;lt;unless&amp;gt; и т. д. В данный момент находится в разработке: не все реальные запросы из проектов успешно разбираются BE-SQL.&lt;br /&gt;
&lt;br /&gt;
Соответствие FreeMarker-конструкций и BE-SQL конструкций:&lt;br /&gt;
&lt;br /&gt;
* chr(...) — CHR() или CHAR()&lt;br /&gt;
* concat(...) — CONCAT() или ||&lt;br /&gt;
* coalesce(...) — COALESCE() или IFNULL()&lt;br /&gt;
* length(...) — LENGTH() или LEN()&lt;br /&gt;
* lpad(...) — LPAD()&lt;br /&gt;
* replace(...) — REPLACE()&lt;br /&gt;
* substring(...) — SUBSTR() или SUBSTRING()&lt;br /&gt;
* ?dateFromat — FORMAT_DATE()&lt;br /&gt;
* ?dateTimeFormat — FORMAT_DATETIME()&lt;br /&gt;
* ?asInt — CAST(x AS BIGINT), TO_NUMBER(x)&lt;br /&gt;
* ?asVarChar — CAST(x AS CHAR), CAST(x AS VARCHAR), TO_CHAR(x)&lt;br /&gt;
* ?asDate — CAST(x AS DATE), TO_DATE(x)&lt;br /&gt;
* ?lower — LOWER()&lt;br /&gt;
* ?upper — UPPER()&lt;br /&gt;
* ?quote — просто пишите в &amp;quot;двойных кавычках&amp;quot; или в `обратных кавычках`, оба варианта должны сработать и транслироваться при необходимости&lt;br /&gt;
* currentDateTime — CURRENT_DATETIME или NOW()&lt;br /&gt;
* currentDate — CURRENT_DATE&lt;br /&gt;
* fromFakeTable — FROM DUAL или можно не писать FROM вообще&lt;br /&gt;
&lt;br /&gt;
Для ограничения количества записей можно просто писать SELECT ... LIMIT 1: это транслируется в соответствующий диалект SQL.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых SQL-функций ===&lt;br /&gt;
&lt;br /&gt;
В скобках указываются синонимы&lt;br /&gt;
&lt;br /&gt;
 CONCAT, COALESCE (IFNULL), COUNT, SUM, MAX, MIN, SUBSTR (SUBSTRING), LENGTH (LEN), UPPER, LOWER, CHR (CHAR), TO_CHAR, TO_NUMBER, TO_DATE,&lt;br /&gt;
 REPLACE, LPAD, ROUND, TRUNC (TRUNCATE), IF, NOW, FORMAT_DATE (=TO_CHAR(x, 'YYYY-MM-DD')), FORMAT_DATETIME (=TO_CHAR(x, 'YYYY-MM-DD HH24:MI:SS')),&lt;br /&gt;
 FORMAT_DATE_RUS (=TO_CHAR(x, 'DD.MM.YYYY')), FORMAT_DATE_RUS_SHORT (=TO_CHAR(x, 'DD.MM.YY')).&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых операций ===&lt;br /&gt;
&lt;br /&gt;
 +, -, *, /, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, = (или ==), != (или &amp;lt;&amp;gt;), || (конкатенация строк), OR, AND (или &amp;amp;&amp;amp;), NOT (или !), XOR, LIKE.&lt;br /&gt;
&lt;br /&gt;
=== Что точно не работает пока ===&lt;br /&gt;
&lt;br /&gt;
Использование этих возможностей скорее всего приведёт к ошибке валидации. В некоторых случаях к некорректному переформатированию в другом движке.&lt;br /&gt;
&lt;br /&gt;
* Форматирование даты на русском&lt;br /&gt;
* Функции для извлечения полей из даты&lt;br /&gt;
* BE-теги &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; не в списке колонок&lt;br /&gt;
* ?asPK, genericRef, joinGenericRef, indexOf&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_ant</id>
		<title>Использование ant</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_ant"/>
				<updated>2015-11-26T07:48:29Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: /* Задачи */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Помимо использования IDE основной be4-функционал доступен с помощью ant-таргетов.&lt;br /&gt;
&lt;br /&gt;
=== Стандартные таргеты ===&lt;br /&gt;
&lt;br /&gt;
В проектах на be4 определены следующие ant-таргеты:&lt;br /&gt;
* '''be.validate''' — валидация [[Project|проекта]] (вычитывание всех файлов, базовые проверки на корректность, исполнение всего [[Freemarker]]; никаких обращений к базе не делается)&lt;br /&gt;
* '''be.update''' — инкрементальное обновление схемы, метаданных и локализаций. Если обновление схемы может привести к потере данных, операция будет отклонена. Для принудительного выполнения определите BE4_FORCE_UPDATE=true&lt;br /&gt;
* '''be.meta''' — инкрементальное обновление метаданных (включая roles, icons, references, page customizations, pages)&lt;br /&gt;
* '''be.locale''' — инкрементальное обновление локализаций&lt;br /&gt;
* '''be.ddl''' — инкрементальное обновление схемы. Для принудительного выполнения определите BE4_FORCE_UPDATE=true.&lt;br /&gt;
* '''be.ddl.check''' — вывод SQL-предложений, которые потребуются для инкрементального обновления схемы. Никаких изменений в базу не вносится.&lt;br /&gt;
* '''setup.db''' — полное разворачивание базы с нуля (как в BE)&lt;br /&gt;
* '''setup.meta''' — полное внесение метаданных и локализаций&lt;br /&gt;
* '''setup.just.meta''' — полное внесение метаданных&lt;br /&gt;
* '''setup.locale''' — полное внесение локализаций&lt;br /&gt;
* '''setup.adhoc''' — выполнение одного или нескольких FTL-скриптов из custom steps (передаются параметром -DA_SCRIPT='script1;script2'). Можно запускать скрипты из модуля (-DA_SCRIPT='realty:dictionaries') либо из всех модулей, где такой скрипт есть (-DA_SCRIPT='all:dictionaries')&lt;br /&gt;
* '''main''' (таргет по умолчанию) — сборка war&lt;br /&gt;
&lt;br /&gt;
=== Переменные ===&lt;br /&gt;
Имеются следующие BE4-специфичные переменные&lt;br /&gt;
* '''BE4_DIR''' — каталог с проектом be4 (без него ничего не заработает)&lt;br /&gt;
* '''BE4_PROFILE''' — если задано, указывает профиль соединения к базе данных (из connectionProfiles.*.yaml), который необходимо использовать.&lt;br /&gt;
* '''BE4_LOG_DIR''' — если задано, данный каталог будет использован для логирования BE4-операций.&lt;br /&gt;
* '''BE4_DEBUG''' — если &amp;quot;true&amp;quot;, будет выводиться дополнительная отладочная информация в stderr.&lt;br /&gt;
* '''BE4_FORCE_UPDATE''' — если &amp;quot;true&amp;quot;, будут выполняться потенциально опасные изменения в схеме базы данных (которые могут привести к потере пользовательских данных).&lt;br /&gt;
* '''BE4_UNLOCK_PROTECTED_PROFILE''' — если &amp;quot;true&amp;quot;, защищённый (protected) [[BeConnectionProfile|профиль соединения]] будет использоваться без дополнительных подтверждений.&lt;br /&gt;
&lt;br /&gt;
* '''BE4_&amp;amp;lt;имя_модуля&amp;amp;gt;''' — если true, то будут использованы метаданные из BE4-модуля (BE4-модуль должен существовать), иначе — из старого BE-модуля с тем же именем.&lt;br /&gt;
&lt;br /&gt;
Только с таргетом be.validate:&lt;br /&gt;
* '''BE4_RDBMS'''=mysql/postgres/oracle/db2/sqlserver/m4 — если задано, валидация будет выполняться с использованием соответствующей СУБД (это может повлиять на выполнение условных секций в FTL, результат разворачивания макросов, включения extras и т. д.).&lt;br /&gt;
* '''BE4_CHECK_QUERY'''=&amp;quot;entity.query&amp;quot; — если задано, текст указанного запроса после выполнения FTL будет выведен на экран). Если указана фиктивная BE4_RDBMS=m4, на место СУБД-специфичных FTL-функций будут подставлены соответствующие m4-функции (может пригодиться для обратного портирования кода в m4).&lt;br /&gt;
* '''BE4_CHECK_DDL'''=entity — если задано, DDL, необходимый для создания указанной сущности будет выведен на экран. Если указана фиктивная BE4_RDBMS=m4, будет сгенерирован соответствующий m4-код (может пригодиться для обратного портирования кода в m4).&lt;br /&gt;
* '''BE4_CHECK_ROLES'''=true — если задано, на экран будет выведен список ролей проекта, действующий в данных условиях. Может пригодиться, если часть ролей устанавливается условно через extras и хочется проверить, правильно ли отработали условия.&lt;br /&gt;
* '''BE4_CREATE_PROFILE_PROPERTIES'''=&amp;lt;file_path&amp;gt; — создаёт файл properties со свойствами профиля соединения и проекта, который может пригодиться для старой системы тестирования.&lt;br /&gt;
* '''BE4_SAVE'''=true — если задано, проект будет пересохранён (только основной проект, без учёта подключенных модулей) с помощью той же процедуры, как при сохранении через Eclipse. Могут быть отсортированы или переформатированы некоторые элементы проекта.&lt;br /&gt;
&lt;br /&gt;
=== Задачи ===&lt;br /&gt;
При редактировании ant-скриптов можно использовать следующие задачи (tasks):&lt;br /&gt;
* '''be4.db''' — создание базы по BE4-проекту. Параметры:&lt;br /&gt;
:* modules: если true, будут использованы BE4-модули&lt;br /&gt;
&lt;br /&gt;
* '''be4.meta''' — синхронизация. Параметры:&lt;br /&gt;
:* modules: если true, будут использованы BE4-модули&lt;br /&gt;
:* mode: режим синхронизации (all, meta, locale, ddl, security)&lt;br /&gt;
&lt;br /&gt;
* '''be4.data''' — выполнение скрипта или набора скриптов. Параметры:&lt;br /&gt;
:* scriptName: имена скриптов через точку с запятой. Можно написать moduleName:scriptName для выполнения скрипта из модуля, либо all:scriptName для выполнения скрипта с таким именем из всех модулей.&lt;br /&gt;
&lt;br /&gt;
* '''be4.validate''' — валидировать BE4-проект и (для немодульного проекта) заполнить свойства ANT из модели&lt;br /&gt;
:* modules: если true, будут подключены BE4-модули. Рекомендуется ставить в true всегда кроме каких-то частных случаев, когда важна производительность.&lt;br /&gt;
&lt;br /&gt;
* '''be4.tools''' — дополнительный инструментарий BE4.&lt;br /&gt;
&lt;br /&gt;
У всех задач есть общие параметры:&lt;br /&gt;
* projectPath (обязательно) — путь к проекту&lt;br /&gt;
* logDir — каталог для логирования (переопределяет переменную BE4_LOG_DIR)&lt;br /&gt;
* useMeta — экспериментальная опция: использовать базовые beanexplorer-метаданные из YAML-проекта beanexplorer_meta без вычитывания базы инициализированной через m4.&lt;br /&gt;
&lt;br /&gt;
=== Инструментарий ===&lt;br /&gt;
Для технических операций имеется специальная ant-задача '''be4.tools'''. По умолчанию эта задача не соответствует никакому ant-таргету. Если она требуется, можно создать таргет, например, так:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;target name=&amp;quot;be.tools&amp;quot; depends=&amp;quot;be4_settings&amp;quot;&amp;gt;&amp;lt;be4.tools projectPath=&amp;quot;${project.home}&amp;quot;/&amp;gt;&amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для пользования инструментами необходимо задавать дополнительные свойства:&lt;br /&gt;
* '''BE4_DUMP_TABLES'''=&amp;quot;таблица1,таблица2,...&amp;quot; — сдампить из базы соответствующей текущему connection-profile заданные таблицы в новый yaml-проект (будет создан подкаталог yamlDump в текущем каталоге). Может пригодиться для создания болванки при переносе таблиц из m4 в yaml. Пример:&lt;br /&gt;
 ant be.tools -DBE4_PROFILE=foo -DBE4_DUMP_TABLES=users,queries,operations&lt;br /&gt;
&lt;br /&gt;
:В дампе присутствуют все [[Query|представления]], [[Operation|операции]] и схемы указанных [[Entity|сущностей]], а также сообщения [[EntityLocalizations|локализации]] с таким же entityName.&lt;br /&gt;
&lt;br /&gt;
Для компиляции самого BE4 (в объёме необходимом для последующего использования вышеуказанных ant-таргетов) необходимо набрать ant в каталоге be4/src. Не требуется никаких внешних зависимостей.&lt;br /&gt;
&lt;br /&gt;
== Использование вне приложений ==&lt;br /&gt;
Следующие цели можно запускать без какого-либо приложения, т.е. досаточно просто зайти в папку be4/src и написать &amp;quot;ant someTarget&amp;quot;:&lt;br /&gt;
* '''wizard''' — позволяет генерировать новые BE4 приложения. Функционал аналогичен функционалу создания нового приложения в BEclipse (File → New → Project → BeanExplorer → BeanExplorer Project), однако все данные вводятся в консоли, а не в GUI.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BE-SQL</id>
		<title>BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BE-SQL"/>
				<updated>2015-11-25T11:09:24Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BE-SQL''' — диалект SQL, который поддерживается BeanExplorer SQL Parser. Поддерживаются только запросы SELECT. Больше всего он похож на PostgreSQL, но некоторые конструкции из других диалектов тоже поддерживаются. Он также должен понимать различные BE-специфичные теги вроде &amp;lt;if&amp;gt;, &amp;lt;unless&amp;gt; и т. д. В данный момент находится в разработке: не все реальные запросы из проектов успешно разбираются BE-SQL.&lt;br /&gt;
&lt;br /&gt;
Соответствие FreeMarker-конструкций и BE-SQL конструкций:&lt;br /&gt;
&lt;br /&gt;
* chr(...) — CHR() или CHAR()&lt;br /&gt;
* concat(...) — CONCAT() или ||&lt;br /&gt;
* coalesce(...) — COALESCE() или IFNULL()&lt;br /&gt;
* length(...) — LENGTH() или LEN()&lt;br /&gt;
* lpad(...) — LPAD()&lt;br /&gt;
* replace(...) — REPLACE()&lt;br /&gt;
* substring(...) — SUBSTR() или SUBSTRING()&lt;br /&gt;
* ?dateFromat — FORMAT_DATE()&lt;br /&gt;
* ?dateTimeFormat — FORMAT_DATETIME()&lt;br /&gt;
* ?asInt — CAST(x AS BIGINT), TO_NUMBER(x)&lt;br /&gt;
* ?asVarChar — CAST(x AS CHAR), CAST(x AS VARCHAR), TO_CHAR(x)&lt;br /&gt;
* ?lower — LOWER()&lt;br /&gt;
* ?upper — UPPER()&lt;br /&gt;
* ?quote — просто пишите в &amp;quot;двойных кавычках&amp;quot; или в `обратных кавычках`, оба варианта должны сработать и транслироваться при необходимости&lt;br /&gt;
* currentDateTime — CURRENT_DATETIME или NOW()&lt;br /&gt;
* currentDate — CURRENT_DATE&lt;br /&gt;
* fromFakeTable — FROM DUAL или можно не писать FROM вообще&lt;br /&gt;
&lt;br /&gt;
Для ограничения количества записей можно просто писать SELECT ... LIMIT 1: это транслируется в соответствующий диалект SQL.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых SQL-функций ===&lt;br /&gt;
&lt;br /&gt;
В скобках указываются синонимы&lt;br /&gt;
&lt;br /&gt;
 CONCAT, COALESCE (IFNULL), COUNT, SUM, MAX, MIN, SUBSTR (SUBSTRING), LENGTH (LEN), UPPER, LOWER, CHR (CHAR), TO_CHAR, TO_NUMBER, &lt;br /&gt;
 REPLACE, LPAD, ROUND, TRUNC (TRUNCATE), IF, NOW, FORMAT_DATE (=TO_CHAR(x, 'YYYY-MM-DD')), FORMAT_DATETIME (=TO_CHAR(x, 'YYYY-MM-DD HH24:MI:SS')).&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых операций ===&lt;br /&gt;
&lt;br /&gt;
 +, -, *, /, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, = (или ==), != (или &amp;lt;&amp;gt;), || (конкатенация строк), OR, AND (или &amp;amp;&amp;amp;), NOT (или !), XOR, LIKE.&lt;br /&gt;
&lt;br /&gt;
=== Что точно не работает пока ===&lt;br /&gt;
&lt;br /&gt;
Использование этих возможностей скорее всего приведёт к ошибке валидации. В некоторых случаях к некорректному переформатированию в другом движке.&lt;br /&gt;
&lt;br /&gt;
* Форматирование даты на русском&lt;br /&gt;
* Функции для извлечения полей из даты&lt;br /&gt;
* BE-теги &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; не в списке колонок&lt;br /&gt;
* ?asPK, genericRef, joinGenericRef, indexOf&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BE-SQL</id>
		<title>BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BE-SQL"/>
				<updated>2015-11-25T10:45:48Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BE-SQL''' — диалект SQL, который поддерживается BeanExplorer SQL Parser. Поддерживаются только запросы SELECT. Больше всего он похож на PostgreSQL, но некоторые конструкции из других диалектов тоже поддерживаются. Он также должен понимать различные BE-специфичные теги вроде &amp;lt;if&amp;gt;, &amp;lt;unless&amp;gt; и т. д. В данный момент находится в разработке: не все реальные запросы из проектов успешно разбираются BE-SQL.&lt;br /&gt;
&lt;br /&gt;
Соответствие FreeMarker-конструкций и BE-SQL конструкций:&lt;br /&gt;
&lt;br /&gt;
* chr(...) — CHR() или CHAR()&lt;br /&gt;
* concat(...) — CONCAT() или ||&lt;br /&gt;
* coalesce(...) — COALESCE() или IFNULL()&lt;br /&gt;
* length(...) — LENGTH() или LEN()&lt;br /&gt;
* lpad(...) — LPAD()&lt;br /&gt;
* replace(...) — REPLACE()&lt;br /&gt;
* substring(...) — SUBSTR() или SUBSTRING()&lt;br /&gt;
* ?dateFromat — FORMAT_DATE()&lt;br /&gt;
* ?dateTimeFormat — FORMAT_DATETIME()&lt;br /&gt;
* ?asInt — CAST(x AS BIGINT), TO_NUMBER(x)&lt;br /&gt;
* ?asVarChar — CAST(x AS CHAR), CAST(x AS VARCHAR), TO_CHAR(x)&lt;br /&gt;
* ?lower — LOWER()&lt;br /&gt;
* ?upper — UPPER()&lt;br /&gt;
* ?quote — просто пишите в &amp;quot;двойных кавычках&amp;quot; или в `обратных кавычках`, оба варианта должны сработать и транслироваться при необходимости&lt;br /&gt;
* currentDateTime — CURRENT_DATETIME&lt;br /&gt;
* currentDate — CURRENT_DATE&lt;br /&gt;
* fromFakeTable — FROM DUAL или можно не писать FROM вообще&lt;br /&gt;
&lt;br /&gt;
Для ограничения количества записей можно просто писать SELECT ... LIMIT 1: это транслируется в соответствующий диалект SQL.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых SQL-функций ===&lt;br /&gt;
&lt;br /&gt;
В скобках указываются синонимы&lt;br /&gt;
&lt;br /&gt;
 CONCAT, COALESCE (IFNULL), COUNT, SUM, MAX, MIN, SUBSTR (SUBSTRING), LENGTH (LEN), UPPER, LOWER, CHR (CHAR), TO_CHAR, TO_NUMBER, &lt;br /&gt;
 REPLACE, LPAD, ROUND, TRUNC (TRUNCATE), IF, NOW, FORMAT_DATE (=TO_CHAR(x, 'YYYY-MM-DD')), FORMAT_DATETIME (=TO_CHAR(x, 'YYYY-MM-DD HH24:MI:SS')).&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых операций ===&lt;br /&gt;
&lt;br /&gt;
 +, -, *, /, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, = (или ==), != (или &amp;lt;&amp;gt;), || (конкатенация строк), OR, AND (или &amp;amp;&amp;amp;), NOT (или !), XOR, LIKE.&lt;br /&gt;
&lt;br /&gt;
=== Что точно не работает пока ===&lt;br /&gt;
&lt;br /&gt;
Использование этих возможностей скорее всего приведёт к ошибке валидации. В некоторых случаях к некорректному переформатированию в другом движке.&lt;br /&gt;
&lt;br /&gt;
* Форматирование даты на русском&lt;br /&gt;
* Функции для извлечения полей из даты&lt;br /&gt;
* BE-теги &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; не в списке колонок&lt;br /&gt;
* ?asPK, genericRef, joinGenericRef, indexOf&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BE-SQL</id>
		<title>BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BE-SQL"/>
				<updated>2015-11-20T10:15:52Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BE-SQL''' — диалект SQL, который поддерживается BeanExplorer SQL Parser. Поддерживаются только запросы SELECT. Больше всего он похож на PostgreSQL, но некоторые конструкции из других диалектов тоже поддерживаются. Он также должен понимать различные BE-специфичные теги вроде &amp;lt;if&amp;gt;, &amp;lt;unless&amp;gt; и т. д. В данный момент находится в разработке: не все реальные запросы из проектов успешно разбираются BE-SQL.&lt;br /&gt;
&lt;br /&gt;
Соответствие FreeMarker-конструкций и BE-SQL конструкций:&lt;br /&gt;
&lt;br /&gt;
* chr(...) — CHR() или CHAR()&lt;br /&gt;
* concat(...) — CONCAT() или ||&lt;br /&gt;
* coalesce(...) — COALESCE() или IFNULL()&lt;br /&gt;
* length(...) — LENGTH() или LEN()&lt;br /&gt;
* lpad(...) — LPAD()&lt;br /&gt;
* replace(...) — REPLACE()&lt;br /&gt;
* substring(...) — SUBSTR() или SUBSTRING()&lt;br /&gt;
* ?asInt — CAST(x AS BIGINT), TO_NUMBER(x)&lt;br /&gt;
* ?asVarChar — CAST(x AS CHAR), CAST(x AS VARCHAR), TO_CHAR(x)&lt;br /&gt;
* ?lower — LOWER()&lt;br /&gt;
* ?upper — UPPER()&lt;br /&gt;
* ?quote — просто пишите в &amp;quot;двойных кавычках&amp;quot; или в `обратных кавычках`, оба варианта должны сработать и транслироваться при необходимости&lt;br /&gt;
* currentDateTime — CURRENT_DATETIME&lt;br /&gt;
* currentDate — CURRENT_DATE&lt;br /&gt;
* fromFakeTable — FROM DUAL или можно не писать FROM вообще&lt;br /&gt;
&lt;br /&gt;
Для ограничения количества записей можно просто писать SELECT ... LIMIT 1: это транслируется в соответствующий диалект SQL.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых SQL-функций ===&lt;br /&gt;
&lt;br /&gt;
В скобках указываются синонимы&lt;br /&gt;
&lt;br /&gt;
 CONCAT, COALESCE (IFNULL), COUNT, SUM, MAX, MIN, SUBSTR (SUBSTRING), LENGTH (LEN), UPPER, LOWER, CHR (CHAR), TO_CHAR, TO_NUMBER, &lt;br /&gt;
 REPLACE, LPAD, ROUND, TRUNC (TRUNCATE), IF, NOW.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых операций ===&lt;br /&gt;
&lt;br /&gt;
 +, -, *, /, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, = (или ==), != (или &amp;lt;&amp;gt;), || (конкатенация строк), OR, AND (или &amp;amp;&amp;amp;), NOT (или !), XOR, LIKE.&lt;br /&gt;
&lt;br /&gt;
=== Что точно не работает пока ===&lt;br /&gt;
&lt;br /&gt;
Использование этих возможностей скорее всего приведёт к ошибке валидации. В некоторых случаях к некорректному переформатированию в другом движке.&lt;br /&gt;
&lt;br /&gt;
* Форматирование даты&lt;br /&gt;
* Функции для извлечения полей из даты&lt;br /&gt;
* BE-теги &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; не в списке колонок&lt;br /&gt;
* ?asPK, genericRef, joinGenericRef, indexOf&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BE-SQL</id>
		<title>BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BE-SQL"/>
				<updated>2015-11-19T10:34:19Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BE-SQL''' — диалект SQL, который поддерживается BeanExplorer SQL Parser. Поддерживаются только запросы SELECT. Больше всего он похож на PostgreSQL, но некоторые конструкции из других диалектов тоже поддерживаются. Он также должен понимать различные BE-специфичные теги вроде &amp;lt;if&amp;gt;, &amp;lt;unless&amp;gt; и т. д. В данный момент находится в разработке: не все реальные запросы из проектов успешно разбираются BE-SQL.&lt;br /&gt;
&lt;br /&gt;
Соответствие FreeMarker-конструкций и BE-SQL конструкций:&lt;br /&gt;
&lt;br /&gt;
* chr(...) — CHR() или CHAR()&lt;br /&gt;
* concat(...) — CONCAT() или ||&lt;br /&gt;
* coalesce(...) — COALESCE() или IFNULL()&lt;br /&gt;
* length(...) — LENGTH() или LEN()&lt;br /&gt;
* lpad(...) — LPAD()&lt;br /&gt;
* replace(...) — REPLACE()&lt;br /&gt;
* substring(...) — SUBSTR() или SUBSTRING()&lt;br /&gt;
* ?asInt — CAST(x AS BIGINT), TO_NUMBER(x)&lt;br /&gt;
* ?asVarChar — CAST(x AS CHAR), CAST(x AS VARCHAR), TO_CHAR(x)&lt;br /&gt;
* ?lower — LOWER()&lt;br /&gt;
* ?upper — UPPER()&lt;br /&gt;
* ?quote — просто пишите в &amp;quot;двойных кавычках&amp;quot; или в `обратных кавычках`, оба варианта должны сработать и транслироваться при необходимости&lt;br /&gt;
* currentDateTime — CURRENT_DATETIME&lt;br /&gt;
* currentDate — CURRENT_DATE&lt;br /&gt;
* fromFakeTable — FROM DUAL или можно не писать FROM вообще&lt;br /&gt;
&lt;br /&gt;
Для ограничения количества записей можно просто писать SELECT ... LIMIT 1: это транслируется в соответствующий диалект SQL.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых SQL-функций ===&lt;br /&gt;
&lt;br /&gt;
В скобках указываются синонимы&lt;br /&gt;
&lt;br /&gt;
 CONCAT, COALESCE (IFNULL), COUNT, SUM, MAX, MIN, SUBSTR (SUBSTRING), LENGTH (LEN), UPPER, LOWER, CHR (CHAR), TO_CHAR, TO_NUMBER, REPLACE, LPAD.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых операций ===&lt;br /&gt;
&lt;br /&gt;
 +, -, *, /, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, = (или ==), != (или &amp;lt;&amp;gt;), || (конкатенация строк), OR, AND (или &amp;amp;&amp;amp;), NOT (или !), XOR, LIKE.&lt;br /&gt;
&lt;br /&gt;
=== Что точно не работает пока ===&lt;br /&gt;
&lt;br /&gt;
Использование этих возможностей скорее всего приведёт к ошибке валидации. В некоторых случаях к некорректному переформатированию в другом движке.&lt;br /&gt;
&lt;br /&gt;
* Форматирование даты&lt;br /&gt;
* Функции для извлечения полей из даты&lt;br /&gt;
* BE-теги &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; не в списке колонок&lt;br /&gt;
* ?asPK, genericRef, joinGenericRef, indexOf&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BE-SQL</id>
		<title>BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BE-SQL"/>
				<updated>2015-11-19T10:32:53Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: /* Что точно не работает пока */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BE-SQL''' — диалект SQL, который поддерживается BeanExplorer SQL Parser. Поддерживаются только запросы SELECT. Больше всего он похож на PostgreSQL, но некоторые конструкции из других диалектов тоже поддерживаются. Он также должен понимать различные BE-специфичные теги вроде &amp;lt;if&amp;gt;, &amp;lt;unless&amp;gt; и т. д. В данный момент находится в разработке: не все реальные запросы из проектов успешно разбираются BE-SQL.&lt;br /&gt;
&lt;br /&gt;
Соответствие FreeMarker-конструкций и BE-SQL конструкций:&lt;br /&gt;
&lt;br /&gt;
* chr(...) — CHR() или CHAR()&lt;br /&gt;
* concat(...) — CONCAT() или ||&lt;br /&gt;
* coalesce(...) — COALESCE() или IFNULL()&lt;br /&gt;
* length(...) — LENGTH() или LEN()&lt;br /&gt;
* lpad(...) — LPAD()&lt;br /&gt;
* replace(...) — REPLACE()&lt;br /&gt;
* substring(...) — SUBSTR() или SUBSTRING()&lt;br /&gt;
* ?asInt — CAST(x AS BIGINT), TO_NUMBER(x)&lt;br /&gt;
* ?asVarChar — CAST(x AS CHAR), CAST(x AS VARCHAR), TO_CHAR(x)&lt;br /&gt;
* ?lower — LOWER()&lt;br /&gt;
* ?upper — UPPER()&lt;br /&gt;
* currentDateTime — CURRENT_DATETIME&lt;br /&gt;
* currentDate — CURRENT_DATE&lt;br /&gt;
* fromFakeTable — FROM DUAL или можно не писать FROM вообще&lt;br /&gt;
&lt;br /&gt;
Для ограничения количества записей можно просто писать SELECT ... LIMIT 1: это транслируется в соответствующий диалект SQL.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых SQL-функций ===&lt;br /&gt;
&lt;br /&gt;
В скобках указываются синонимы&lt;br /&gt;
&lt;br /&gt;
 CONCAT, COALESCE (IFNULL), COUNT, SUM, MAX, MIN, SUBSTR (SUBSTRING), LENGTH (LEN), UPPER, LOWER, CHR (CHAR), TO_CHAR, TO_NUMBER, REPLACE, LPAD.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых операций ===&lt;br /&gt;
&lt;br /&gt;
 +, -, *, /, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, = (или ==), != (или &amp;lt;&amp;gt;), || (конкатенация строк), OR, AND (или &amp;amp;&amp;amp;), NOT (или !), XOR, LIKE.&lt;br /&gt;
&lt;br /&gt;
=== Что точно не работает пока ===&lt;br /&gt;
&lt;br /&gt;
Использование этих возможностей скорее всего приведёт к ошибке валидации. В некоторых случаях к некорректному переформатированию в другом движке.&lt;br /&gt;
&lt;br /&gt;
* Форматирование даты&lt;br /&gt;
* Функции для извлечения полей из даты&lt;br /&gt;
* BE-теги &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; не в списке колонок&lt;br /&gt;
* ?asPK, genericRef, joinGenericRef, indexOf&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BE-SQL</id>
		<title>BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BE-SQL"/>
				<updated>2015-11-19T10:26:22Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: /* Список всех поддерживаемых SQL-функций */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BE-SQL''' — диалект SQL, который поддерживается BeanExplorer SQL Parser. Поддерживаются только запросы SELECT. Больше всего он похож на PostgreSQL, но некоторые конструкции из других диалектов тоже поддерживаются. Он также должен понимать различные BE-специфичные теги вроде &amp;lt;if&amp;gt;, &amp;lt;unless&amp;gt; и т. д. В данный момент находится в разработке: не все реальные запросы из проектов успешно разбираются BE-SQL.&lt;br /&gt;
&lt;br /&gt;
Соответствие FreeMarker-конструкций и BE-SQL конструкций:&lt;br /&gt;
&lt;br /&gt;
* chr(...) — CHR() или CHAR()&lt;br /&gt;
* concat(...) — CONCAT() или ||&lt;br /&gt;
* coalesce(...) — COALESCE() или IFNULL()&lt;br /&gt;
* length(...) — LENGTH() или LEN()&lt;br /&gt;
* lpad(...) — LPAD()&lt;br /&gt;
* replace(...) — REPLACE()&lt;br /&gt;
* substring(...) — SUBSTR() или SUBSTRING()&lt;br /&gt;
* ?asInt — CAST(x AS BIGINT), TO_NUMBER(x)&lt;br /&gt;
* ?asVarChar — CAST(x AS CHAR), CAST(x AS VARCHAR), TO_CHAR(x)&lt;br /&gt;
* ?lower — LOWER()&lt;br /&gt;
* ?upper — UPPER()&lt;br /&gt;
* currentDateTime — CURRENT_DATETIME&lt;br /&gt;
* currentDate — CURRENT_DATE&lt;br /&gt;
* fromFakeTable — FROM DUAL или можно не писать FROM вообще&lt;br /&gt;
&lt;br /&gt;
Для ограничения количества записей можно просто писать SELECT ... LIMIT 1: это транслируется в соответствующий диалект SQL.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых SQL-функций ===&lt;br /&gt;
&lt;br /&gt;
В скобках указываются синонимы&lt;br /&gt;
&lt;br /&gt;
 CONCAT, COALESCE (IFNULL), COUNT, SUM, MAX, MIN, SUBSTR (SUBSTRING), LENGTH (LEN), UPPER, LOWER, CHR (CHAR), TO_CHAR, TO_NUMBER, REPLACE, LPAD.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых операций ===&lt;br /&gt;
&lt;br /&gt;
 +, -, *, /, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, = (или ==), != (или &amp;lt;&amp;gt;), || (конкатенация строк), OR, AND (или &amp;amp;&amp;amp;), NOT (или !), XOR, LIKE.&lt;br /&gt;
&lt;br /&gt;
=== Что точно не работает пока ===&lt;br /&gt;
&lt;br /&gt;
Использование этих возможностей скорее всего приведёт к ошибке валидации. В некоторых случаях к некорректному переформатированию в другом движке.&lt;br /&gt;
&lt;br /&gt;
* Форматирование даты&lt;br /&gt;
* Функции для извлечения полей из даты&lt;br /&gt;
* BE-теги &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; не в списке колонок&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BE-SQL</id>
		<title>BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BE-SQL"/>
				<updated>2015-11-19T10:25:31Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BE-SQL''' — диалект SQL, который поддерживается BeanExplorer SQL Parser. Поддерживаются только запросы SELECT. Больше всего он похож на PostgreSQL, но некоторые конструкции из других диалектов тоже поддерживаются. Он также должен понимать различные BE-специфичные теги вроде &amp;lt;if&amp;gt;, &amp;lt;unless&amp;gt; и т. д. В данный момент находится в разработке: не все реальные запросы из проектов успешно разбираются BE-SQL.&lt;br /&gt;
&lt;br /&gt;
Соответствие FreeMarker-конструкций и BE-SQL конструкций:&lt;br /&gt;
&lt;br /&gt;
* chr(...) — CHR() или CHAR()&lt;br /&gt;
* concat(...) — CONCAT() или ||&lt;br /&gt;
* coalesce(...) — COALESCE() или IFNULL()&lt;br /&gt;
* length(...) — LENGTH() или LEN()&lt;br /&gt;
* lpad(...) — LPAD()&lt;br /&gt;
* replace(...) — REPLACE()&lt;br /&gt;
* substring(...) — SUBSTR() или SUBSTRING()&lt;br /&gt;
* ?asInt — CAST(x AS BIGINT), TO_NUMBER(x)&lt;br /&gt;
* ?asVarChar — CAST(x AS CHAR), CAST(x AS VARCHAR), TO_CHAR(x)&lt;br /&gt;
* ?lower — LOWER()&lt;br /&gt;
* ?upper — UPPER()&lt;br /&gt;
* currentDateTime — CURRENT_DATETIME&lt;br /&gt;
* currentDate — CURRENT_DATE&lt;br /&gt;
* fromFakeTable — FROM DUAL или можно не писать FROM вообще&lt;br /&gt;
&lt;br /&gt;
Для ограничения количества записей можно просто писать SELECT ... LIMIT 1: это транслируется в соответствующий диалект SQL.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых SQL-функций ===&lt;br /&gt;
&lt;br /&gt;
В скобках указываются синонимы&lt;br /&gt;
&lt;br /&gt;
 CONCAT, COALSCE (IFNULL), COUNT, SUM, MAX, MIN, SUBSTR (SUBSTRING), LENGTH (LEN), UPPER, LOWER, CHR (CHAR), TO_CHAR, TO_NUMBER, REPLACE, LPAD.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых операций ===&lt;br /&gt;
&lt;br /&gt;
 +, -, *, /, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, = (или ==), != (или &amp;lt;&amp;gt;), || (конкатенация строк), OR, AND (или &amp;amp;&amp;amp;), NOT (или !), XOR, LIKE.&lt;br /&gt;
&lt;br /&gt;
=== Что точно не работает пока ===&lt;br /&gt;
&lt;br /&gt;
Использование этих возможностей скорее всего приведёт к ошибке валидации. В некоторых случаях к некорректному переформатированию в другом движке.&lt;br /&gt;
&lt;br /&gt;
* Форматирование даты&lt;br /&gt;
* Функции для извлечения полей из даты&lt;br /&gt;
* BE-теги &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; не в списке колонок&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%9C%D0%B0%D0%BA%D1%80%D0%BE%D1%81%D1%8B</id>
		<title>Макросы</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%9C%D0%B0%D0%BA%D1%80%D0%BE%D1%81%D1%8B"/>
				<updated>2015-11-19T10:23:32Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: /* Макросы для использования в запросах: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Шаблонизатор Freemarker поддерживает [http://freemarker.org/docs/dgui_misc_userdefdir.html макросы] или пользовательские директивы. Вы можете создавать свои макросы как непосредственно в месте использования (custom step или в коде представления), так и в отдельном файле macro.ftl (тогда они будут видны во всём проекте).&lt;br /&gt;
&lt;br /&gt;
Имеется также набор предопределённых макросов, которые позволяют выполнить стандартный функционал, полезный в разных проектах. Все эти макросы определены в файле be4/src/com/beanexplorer/enterprise/metadata/freemarker/macro/common.ftl. Все предопределённые макросы начинаются с подчерка. Просьба не создавать макросы с подчерка в своих проектах.&lt;br /&gt;
&lt;br /&gt;
=== Макросы для использования в запросах: ===&lt;br /&gt;
* '''&amp;lt;@_copyQuery name/&amp;gt;''': скопировать текст другого запроса из текущего entity.&lt;br /&gt;
* '''&amp;lt;@'''_'''copySelectionQuery/&amp;gt;''': скопировать текст запроса *** Selection view *** из текущего entity.&lt;br /&gt;
* '''&amp;lt;@'''_'''copyAllRecordsQuery/&amp;gt;''': скопировать текст запроса All records из текущего entity.&lt;br /&gt;
* '''&amp;lt;@'''_'''str&amp;gt;text&amp;lt;/@'''_'''str&amp;gt;''': превратить текст в SQL-строку (альтернатива суффиксу ?str), удобно использовать для запросов второго уровня.&lt;br /&gt;
* '''&amp;lt;@'''_'''bold&amp;gt;SQL&amp;lt;/@'''_'''bold&amp;gt;''': добавить SQL-код для выделения текста полужирным( '''НО правильнее это делать через CSS!''' ). Пример:&lt;br /&gt;
:* &amp;lt;code&amp;gt;SELECT &amp;lt;@&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;'''_'''bold&amp;gt;name&amp;lt;/@&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;'''_'''bold&amp;gt; FROM myTable &amp;lt;/code&amp;gt;-&amp;gt; (в MySQL) SELECT CONCAT( '&amp;lt;nowiki&amp;gt;&amp;lt;b&amp;gt;',name,'&amp;lt;/b&amp;gt;&amp;lt;/nowiki&amp;gt;' ) FROM myTable&lt;br /&gt;
* '''&amp;lt;@'''_'''italic&amp;gt;SQL&amp;lt;/@'''_'''italic&amp;gt;''': добавить SQL-код для выделения текста курсивом( '''НО правильнее это делать через CSS!''' ).Пример:&lt;br /&gt;
:* &amp;lt;code&amp;gt;SELECT &amp;lt;@&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;'''_'''bold&amp;gt;&amp;lt;@&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;'''_'''italic&amp;gt;name&amp;lt;/@&amp;gt;&amp;lt;/@&amp;gt; FROM myTable &amp;lt;/code&amp;gt;-&amp;gt; (в MySQL) SELECT CONCAT( '&amp;lt;nowiki&amp;gt;&amp;lt;b&amp;gt;',CONCAT( '&amp;lt;i&amp;gt;',name,'&amp;lt;/i&amp;gt;' ),'&amp;lt;/b&amp;gt;&amp;lt;/nowiki&amp;gt;' ) FROM myTable&lt;br /&gt;
* '''&amp;lt;@_align 'side'&amp;gt;SQL&amp;lt;/@_align&amp;gt;''': добавить SQL-код для выравнивания текста( '''НО правильнее это делать через CSS!''' ). Параметр 'side' принимает значения 'left', 'center', 'right', 'justify'&lt;br /&gt;
* '''&amp;lt;@_localize&amp;gt;SQL&amp;lt;/@_localize&amp;gt;''': добавить SQL-код для локализации текста. Полезно при сочетании с другими макросами, например:&lt;br /&gt;
:* &amp;lt;code&amp;gt;SELECT &amp;lt;@_bold&amp;gt;&amp;lt;@_localize&amp;gt;name&amp;lt;/@&amp;gt;&amp;lt;/@&amp;gt; FROM myTable&amp;lt;/code&amp;gt; (в этом случае внутри _localize должен быть самым внутренним макросом)&lt;br /&gt;
* '''&amp;lt;@_substring from [to]&amp;gt;SQL&amp;lt;/@&amp;gt;''': аналог функции substring. Полезен, если в качестве входной строки подаётся сложное выражение: здесь входная строка задаётся вложенным элементом.&lt;br /&gt;
* '''&amp;lt;@_isInRole 'roles'/&amp;gt;''': добавляет условие для проверки обладает ли текущий пользователь хотя бы одной из указанных ролей. Параметры могут включать конкретные роли и группы ролей через запятую, например '''&amp;lt;@_isInRole '@AllRolesExceptGuest'/&amp;gt;'''&lt;br /&gt;
* '''&amp;lt;@_contains list column/&amp;gt;:''' создаёт IN-предложение для списка элементов list и заданной колонки (column IN ('val1', 'val2', ...)).&lt;br /&gt;
* '''&amp;lt;@_selectRow&amp;gt;SQL&amp;lt;/@&amp;gt;:''' добавляет начало и конец SQL-запроса для выбора только одной строки (либо SELECT TOP 1 ..., либо SELECT ... LIMIT 1). Пример:&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@_selectRow&amp;gt; * FROM myTable&amp;lt;/@&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''&amp;lt;@_staticList 'element1' 'element2' ... /&amp;gt;''': создаёт SQL-предложение, выдающее одну колонку с заданными элементами. Удобно использовать для quick filter. Пример:&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@_staticList 'waiting' 'running' 'complete'/&amp;gt;&amp;lt;/code&amp;gt; -&amp;gt; (в Postgres):&lt;br /&gt;
 SELECT 'waiting'&lt;br /&gt;
 UNION&lt;br /&gt;
 SELECT 'running'&lt;br /&gt;
 UNION&lt;br /&gt;
 SELECT 'complete'&lt;br /&gt;
* '''&amp;lt;@_enumList 'columnName'/&amp;gt;''': создаёт SQL-предложение, выдающее одну колонку со списком вариантов типа ENUM для колонки columnName, определённой в текущей таблице. Удобно использовать для quick filter.&lt;br /&gt;
* '''&amp;lt;@_sql&amp;gt;SQL&amp;lt;/@&amp;gt;:''' форматирует данный SELECT-запрос с помощью движка [[BE-SQL]] в соответствии с текущим движком базы данных. В теле макроса должен присутствовать целый SQL-запрос. Пример: можно написать с помощью FTL-конструкций так:&lt;br /&gt;
&lt;br /&gt;
 SELECT c.ID AS &amp;quot;Code&amp;quot;,&lt;br /&gt;
   ${concat('c.alphabeticCode', ' - '?str, 'CASE WHEN '+length('c.name')+' &amp;gt; 30 THEN '+concat(substring('c.name', 1, 30), '...'?str)+' ELSE c.name END')} AS &amp;quot;Name&amp;quot;&lt;br /&gt;
   FROM currencies c&lt;br /&gt;
&lt;br /&gt;
:А можно воспользоваться &amp;lt;@_sql&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;@_sql&amp;gt;SELECT c.ID AS &amp;quot;Code&amp;quot;,&lt;br /&gt;
   c.alphabeticCode || ' - ' || CASE WHEN LENGTH(c.name) &amp;gt; 30 THEN SUBSTRING(c.name, 1, 30) || '...' ELSE c.name END AS &amp;quot;Name&amp;quot;&lt;br /&gt;
   FROM currencies c&amp;lt;/@&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Совет''': если макрос допускает вложенные элементы (например, &amp;lt;@'''_'''bold&amp;gt;), завершать его можно либо &amp;lt;/@'''_'''bold&amp;gt;, либо просто &amp;lt;/@&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макросы для использования в кастомизациях ===&lt;br /&gt;
* '''&amp;lt;@'''_'''onLoad 'functionName'/&amp;gt;''': .js-кастомизация, добавляющая вызов указанной JS-функции при загрузке страницы.&lt;br /&gt;
* '''&amp;lt;@_loadScript 'fileName.js'&amp;gt;code&amp;lt;/@&amp;gt;''': загрузить на клиенте указанный js-файл и выполнить указанный код по завершении.&lt;br /&gt;
&lt;br /&gt;
=== Макросы для использования в ftl-скриптах: ===&lt;br /&gt;
* '''&amp;lt;@'''_'''systemSetting category key value/&amp;gt;''': добавить системную настройку. Пример:&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;'''_'''systemSetting 'system' 'FORCED_LOCALE' 'ru' /&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;'''_'''systemSetting category='system' key='FORCED_LOCALE' value='ru' /&amp;gt;&amp;lt;/code&amp;gt; — то же самое&lt;br /&gt;
* '''&amp;lt;@_jsHandler code name&amp;gt;JavaScript code&amp;lt;/@&amp;gt;''': добавить в базу JavaScript-handler. Code — код (машинночитаемое имя), name — человекочитаемое имя, JavaScript code — исходник хэндлера&lt;br /&gt;
* '''&amp;lt;@_isInRole 'roles' 'column'/&amp;gt;''': добавляет условие для проверки, &lt;br /&gt;
входит ли значение в указанной колонке в заданный список ролей roles. &lt;br /&gt;
Пример:&lt;br /&gt;
:* &amp;lt;code&amp;gt;DELETE FROM queries_per_role WHERE &amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;&amp;lt;@_isInRole '@DisabledRoles,DbAdmin' 'role_name'/&amp;gt;&amp;lt;/code&amp;gt; -&amp;gt; DELETE FROM queries_per_role WHERE ( role_name IN ( 'DbAdmin', 'Dispatcher', 'Guest' )) (группа DisabledRoles содержала роли Dispatcher и Guest)&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;@_insertInto table [idCol]&amp;gt;columns&amp;lt;/@&amp;gt;''': добавить начало предложения INSERT INTO для таблицы с автоинкрементной колонкой idCol (по умолчанию 'ID'). Columns — список колонок через запятую. Далее должно следовать &amp;lt;@_insertValues&amp;gt; или &amp;lt;@_insertSelect&amp;gt;&lt;br /&gt;
* '''&amp;lt;@_insertValues&amp;gt;values&amp;lt;/@&amp;gt;''': продолжение INSERT INTO. Values — список значений через запятую (должно быть столько же, сколько колонок в _insertInto. Пример:&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@_insertInto myTable&amp;gt;col1, col2&amp;lt;/@&amp;gt; &amp;lt;@_insertValues&amp;gt;'val1', 'val2'&amp;lt;/@&amp;gt;&amp;lt;/code&amp;gt; — сгенерирует&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO myTable(col1, col2) VALUES ('val1', 'val2'); (в Oracle будет сложнее)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;@_insertSelect&amp;gt;statement&amp;lt;/@&amp;gt;''': продолжение INSERT INTO. Statement — SQL-предложение SELECT (без самого слова SELECT). Пример:&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@_insertInto 'categories'&amp;gt;entity, name, parentID&amp;lt;/@&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@_insertSelect&amp;gt;'utilitySuppliers', 'Жилищные услуги', ID FROM tmp_cat_table&amp;lt;/@&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;@_noAutoIncrement&amp;gt;insert statements...&amp;lt;/@&amp;gt;''': выполнить вставку записей в таблицу с явным заданием значения auto-increment. В некоторых СУБД может требоваться включить специальный режим для такой вставки, для чего и служит данный макрос.&lt;br /&gt;
&lt;br /&gt;
=== Устаревшие макросы ===&lt;br /&gt;
Эти макросы использовались для массового назначения ролей. После появления [[MassChange]] их использовать нельзя и они могут исчезнуть.&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;@_operationRoles 'roles' [entities] [names]/&amp;gt;''': создаёт SQL для задания ролей операциям. Каждый параметр необязательный, &lt;br /&gt;
если отсутствует, означает, любое. Использовать только в Pre-meta для &lt;br /&gt;
некастомизированных операций! Примеры:&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@_operationRoles entities=['documents','addresses','socialEvents2documents'] names='Filter'/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@_operationRoles entities='CSPcalls' names=['Insert','Edit'] roles='Passport,ClearingHouse,Reception'/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;@_removeOperationRoles 'roles' [entities] [names]/&amp;gt;''': создаёт SQL для удаления заданных ролей из заданных операций. Каждый параметр необязательный, если отсутствует, означает, любое. Использовать только в Pre-meta для некастомизированных операций! Примеры:&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@_removeOperationRoles names=['Explain Plan', 'Parent Record']/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@_removeOperationRoles roles='Accountant' entities='utilityRates' names=['Insert', 'Edit']/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;@_queryRoles 'roles' [entities] [names]/&amp;gt;''': создаёт SQL для задания ролей представлениям. Каждый параметр необязательный, &lt;br /&gt;
если отсутствует, означает, любое. Использовать только в Pre-meta для &lt;br /&gt;
некастомизированных представлений! Примеры:&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@_queryRoles entities=['documents','addresses','socialEvents2documents'] names='All records'/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''&amp;lt;@_removeQueryRoles 'roles' [entities] [names]/&amp;gt;''': создаёт SQL для удаления заданных ролей из заданных представлений. Каждый параметр необязательный, если отсутствует, означает, любое. Использовать только в Pre-meta для некастомизированных представлений! Примеры:&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@_removeQueryRoles entities='messages'/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@_removeQueryRoles entities='_system_' names=['MySQL Variables','MySQL Tables','MySQL Processes'] /&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@_removeQueryRoles entities=['votes','problems','sharedDocuments'] &amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;roles='Manager,Property Manager' /&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Freemarker]]&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BE-SQL</id>
		<title>BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BE-SQL"/>
				<updated>2015-11-19T10:19:07Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: Новая страница: «'''BE-SQL''' — диалект SQL, который поддерживается BeanExplorer SQL Parser. Больше всего он похож на PostgreSQL,…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BE-SQL''' — диалект SQL, который поддерживается BeanExplorer SQL Parser. Больше всего он похож на PostgreSQL, но некоторые конструкции из других диалектов тоже поддерживаются. Он также должен понимать различные BE-специфичные теги вроде &amp;lt;if&amp;gt;, &amp;lt;unless&amp;gt; и т. д. В данный момент находится в разработке: не все реальные запросы из проектов успешно разбираются BE-SQL.&lt;br /&gt;
&lt;br /&gt;
Соответствие FreeMarker-конструкций и BE-SQL конструкций:&lt;br /&gt;
&lt;br /&gt;
* chr(...) — CHR() или CHAR()&lt;br /&gt;
* concat(...) — CONCAT() или ||&lt;br /&gt;
* coalesce(...) — COALESCE() или IFNULL()&lt;br /&gt;
* length(...) — LENGTH() или LEN()&lt;br /&gt;
* lpad(...) — LPAD()&lt;br /&gt;
* replace(...) — REPLACE()&lt;br /&gt;
* substring(...) — SUBSTR() или SUBSTRING()&lt;br /&gt;
* ?asInt — CAST(x AS BIGINT), TO_NUMBER(x)&lt;br /&gt;
* ?asVarChar — CAST(x AS CHAR), CAST(x AS VARCHAR), TO_CHAR(x)&lt;br /&gt;
* ?lower — LOWER()&lt;br /&gt;
* ?upper — UPPER()&lt;br /&gt;
* currentDateTime — CURRENT_DATETIME&lt;br /&gt;
* currentDate — CURRENT_DATE&lt;br /&gt;
* fromFakeTable — FROM DUAL или можно не писать FROM вообще&lt;br /&gt;
&lt;br /&gt;
Для ограничения количества записей можно просто писать SELECT ... LIMIT 1: это транслируется в соответствующий диалект SQL.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых SQL-функций ===&lt;br /&gt;
&lt;br /&gt;
В скобках указываются синонимы&lt;br /&gt;
&lt;br /&gt;
 CONCAT, COALSCE (IFNULL), COUNT, SUM, MAX, MIN, SUBSTR (SUBSTRING), LENGTH (LEN), UPPER, LOWER, CHR (CHAR), TO_CHAR, TO_NUMBER, REPLACE, LPAD.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых операций ===&lt;br /&gt;
&lt;br /&gt;
 +, -, *, /, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, = (или ==), != (или &amp;lt;&amp;gt;), || (конкатенация строк), OR, AND (или &amp;amp;&amp;amp;), NOT (или !), XOR, LIKE.&lt;br /&gt;
&lt;br /&gt;
=== Что точно не работает пока ===&lt;br /&gt;
&lt;br /&gt;
Использование этих возможностей скорее всего приведёт к ошибке валидации. В некоторых случаях к некорректному переформатированию в другом движке.&lt;br /&gt;
&lt;br /&gt;
* Форматирование даты&lt;br /&gt;
* Функции для извлечения полей из даты&lt;br /&gt;
* BE-теги &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; не в списке колонок&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0</id>
		<title>Заглавная страница</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0"/>
				<updated>2015-11-19T10:05:48Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== BeanExplorer4 ===&lt;br /&gt;
* [[BeanExplorer4]]&lt;br /&gt;
** [[Для разработчиков BE4]]&lt;br /&gt;
* [[Компиляция и запуск BeanExplorer4]]&lt;br /&gt;
* [[Использование ant]]&lt;br /&gt;
* [[Поддержка СУБД]]&lt;br /&gt;
* [[Типы колонок]]&lt;br /&gt;
* [[Структура проекта]]&lt;br /&gt;
* [[Usecases|Usecases с картиночками]]&lt;br /&gt;
* [[JavaScript Debugger]]&lt;br /&gt;
* [[Extras]]&lt;br /&gt;
* [[Entity template|Шаблоны для сущностей]]&lt;br /&gt;
&lt;br /&gt;
=== Freemarker ===&lt;br /&gt;
* [[Freemarker]]&lt;br /&gt;
* [[Встроенные функции]]&lt;br /&gt;
* [[Макросы]]&lt;br /&gt;
* [[Объекты]]&lt;br /&gt;
* [[Пользовательские макросы]]&lt;br /&gt;
* [[Создание своих макросов]]&lt;br /&gt;
* [[Built-ins]]&lt;br /&gt;
&lt;br /&gt;
=== BeanExplorer5 ===&lt;br /&gt;
* [[BE-SQL|SQL-диалект BeanExplorer5]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
=== Внешние ссылки ===&lt;br /&gt;
* BeanExplorer4 на Edge Wiki [https://sites.google.com/a/developmentontheedge.com/wiki/home/proektnaadokumentacia/beanexplorer4]&lt;br /&gt;
----&lt;br /&gt;
Количество статей в вики: '''[[:Special:Statistics|{{NUMBEROFARTICLES}}]]'''.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/Daemon</id>
		<title>Daemon</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/Daemon"/>
				<updated>2015-11-13T11:36:18Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ElementType|com.beanexplorer.enterprise.metadata.model.Daemon|да|да}}&lt;br /&gt;
&lt;br /&gt;
Демон (Daemon) — фоновый процесс BeanExplorer. Вы можете определять своих демонов как в [[Project|проекте]], так и в [[Module|модулях]].&lt;br /&gt;
&lt;br /&gt;
Демон имеет следующие свойства:&lt;br /&gt;
;Имя&lt;br /&gt;
:уникальное имя демона. Если хочется запустить несколько одинаковых демонов, имена всё равно должны быть разными.&lt;br /&gt;
;Класс (className)&lt;br /&gt;
:полное имя класса демона (должен наследовать {{Class|com.beanexplorer.enterprise.process.Daemon}})&lt;br /&gt;
;Секция конфигурации (configSection)&lt;br /&gt;
:Имя секции в таблице [[systemSettings]], которая будет по умолчанию относиться к демону. Чтобы достать настройки из этой секции, используйте метод {{Method|com.beanexplorer.enterprise.process.Daemon.getSetting(String)}}.&lt;br /&gt;
;Тип демона (daemonType)&lt;br /&gt;
:Одно из следующих значений:&lt;br /&gt;
:*periodic&lt;br /&gt;
:*cron&lt;br /&gt;
:*service&lt;br /&gt;
:*manual&lt;br /&gt;
;Описание (description)&lt;br /&gt;
:Описание демона&lt;br /&gt;
;slaveNo&lt;br /&gt;
&lt;br /&gt;
Демоны сохраняются по умолчанию в файл daemons.yaml. В дереве проекта они хранятся в коллекции Daemons внутри [[Module|модуля]].&lt;br /&gt;
&lt;br /&gt;
Пример задания демона в [[yaml]]:&lt;br /&gt;
 daemons:&lt;br /&gt;
   CheckRequestsDaemon:&lt;br /&gt;
     className: com.myproject.daemons.CheckRequestsDaemon&lt;br /&gt;
     configSection: CheckRequestsDaemon&lt;br /&gt;
     daemonType: periodic&lt;br /&gt;
     description: Daemon to check the requests&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/Extras</id>
		<title>Extras</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/Extras"/>
				<updated>2015-11-13T11:36:09Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Extras''' — способ задания условий, по которым данный элемент [[Project|проекта]] будет использоваться. На данный момент поддерживается для следующих типов элементов:&lt;br /&gt;
* [[Entity|Сущность (entity)]]&lt;br /&gt;
* [[Query|Представление (query)]]&lt;br /&gt;
* [[Operation|Операция (operation)]]&lt;br /&gt;
* [[ColumnDef|Определение колонки (columnDef)]]&lt;br /&gt;
* [[IndexDef|Определение индекса (indexDef)]]&lt;br /&gt;
* [[Role|Роль (role)]]&lt;br /&gt;
* [[Daemon|Демон (daemon)]]&lt;br /&gt;
&lt;br /&gt;
Extras — набор текстовых строк, представляющих собой условия. Если строк несколько, требуется соблюдение всех условий сразу.&lt;br /&gt;
&lt;br /&gt;
Каждая строка имеет следующий формат:&lt;br /&gt;
 [!]&amp;lt;prefix&amp;gt;:&amp;lt;value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Восклицательный знак означает отрицание (элемент доступен в случае, если условие не выполнено). Определены следующие префиксы:&lt;br /&gt;
* '''db''' — используется ли данный движок СУБД. Возможные значения value: db2, mysql, oracle, sqlserver, postgres&lt;br /&gt;
* '''dbcap''' — обладает ли движок СУБД определённой функциональностью. На данный момент возможны следующие значения:&lt;br /&gt;
** '''fnindex''' — поддерживаются ли функциональные индексы&lt;br /&gt;
** '''customincrement''' — поддерживается ли создание autoincrement-колонки, начинающейся с определённого значения&lt;br /&gt;
** '''gencolumn''' — поддерживаются ли вычислимые колонки. Если да, можно использовать в качестве default value колонки что-то типа generic(ID)&lt;br /&gt;
* '''module''' — присутствует ли в проекте [[Module|модуль]] с данным именем.&lt;br /&gt;
* '''feature''' — подключена ли указанная фича.&lt;br /&gt;
* '''var''' — определена ли указанная переменная или равна ли она заданному значению. К примеру &amp;lt;code&amp;gt;var:REGION=54&amp;lt;/code&amp;gt; выполняется, если определена переменная REGION и её значение — 54.&lt;br /&gt;
&lt;br /&gt;
Также в модулях в качестве extras может встречаться просто строка. Если та же строка определена в проекте приложения в секции данного модуля, то этот extras выполняется.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/Extras</id>
		<title>Extras</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/Extras"/>
				<updated>2015-11-13T11:36:02Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Extras''' — способ задания условий, по которым данный элемент [[Project|проекта]] будет использоваться. На данный момент поддерживается для следующих типов элементов:&lt;br /&gt;
* [[Entity|Сущность (entity)]]&lt;br /&gt;
* [[Query|Представление (query)]]&lt;br /&gt;
* [[Operation|Операция (operation)]]&lt;br /&gt;
* [[ColumnDef|Определение колонки (columnDef)]]&lt;br /&gt;
* [[IndexDef|Определение индекса (indexDef)]]&lt;br /&gt;
* [[Role|Роль (role)]]&lt;br /&gt;
* [[Daemon|демон (daemon)]]&lt;br /&gt;
&lt;br /&gt;
Extras — набор текстовых строк, представляющих собой условия. Если строк несколько, требуется соблюдение всех условий сразу.&lt;br /&gt;
&lt;br /&gt;
Каждая строка имеет следующий формат:&lt;br /&gt;
 [!]&amp;lt;prefix&amp;gt;:&amp;lt;value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Восклицательный знак означает отрицание (элемент доступен в случае, если условие не выполнено). Определены следующие префиксы:&lt;br /&gt;
* '''db''' — используется ли данный движок СУБД. Возможные значения value: db2, mysql, oracle, sqlserver, postgres&lt;br /&gt;
* '''dbcap''' — обладает ли движок СУБД определённой функциональностью. На данный момент возможны следующие значения:&lt;br /&gt;
** '''fnindex''' — поддерживаются ли функциональные индексы&lt;br /&gt;
** '''customincrement''' — поддерживается ли создание autoincrement-колонки, начинающейся с определённого значения&lt;br /&gt;
** '''gencolumn''' — поддерживаются ли вычислимые колонки. Если да, можно использовать в качестве default value колонки что-то типа generic(ID)&lt;br /&gt;
* '''module''' — присутствует ли в проекте [[Module|модуль]] с данным именем.&lt;br /&gt;
* '''feature''' — подключена ли указанная фича.&lt;br /&gt;
* '''var''' — определена ли указанная переменная или равна ли она заданному значению. К примеру &amp;lt;code&amp;gt;var:REGION=54&amp;lt;/code&amp;gt; выполняется, если определена переменная REGION и её значение — 54.&lt;br /&gt;
&lt;br /&gt;
Также в модулях в качестве extras может встречаться просто строка. Если та же строка определена в проекте приложения в секции данного модуля, то этот extras выполняется.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_ant</id>
		<title>Использование ant</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_ant"/>
				<updated>2015-11-11T07:22:05Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: /* Задачи */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Помимо использования IDE основной be4-функционал доступен с помощью ant-таргетов.&lt;br /&gt;
&lt;br /&gt;
=== Стандартные таргеты ===&lt;br /&gt;
&lt;br /&gt;
В проектах на be4 определены следующие ant-таргеты:&lt;br /&gt;
* '''be.validate''' — валидация [[Project|проекта]] (вычитывание всех файлов, базовые проверки на корректность, исполнение всего [[Freemarker]]; никаких обращений к базе не делается)&lt;br /&gt;
* '''be.update''' — инкрементальное обновление схемы, метаданных и локализаций. Если обновление схемы может привести к потере данных, операция будет отклонена. Для принудительного выполнения определите BE4_FORCE_UPDATE=true&lt;br /&gt;
* '''be.meta''' — инкрементальное обновление метаданных (включая roles, icons, references, page customizations, pages)&lt;br /&gt;
* '''be.locale''' — инкрементальное обновление локализаций&lt;br /&gt;
* '''be.ddl''' — инкрементальное обновление схемы. Для принудительного выполнения определите BE4_FORCE_UPDATE=true.&lt;br /&gt;
* '''be.ddl.check''' — вывод SQL-предложений, которые потребуются для инкрементального обновления схемы. Никаких изменений в базу не вносится.&lt;br /&gt;
* '''setup.db''' — полное разворачивание базы с нуля (как в BE)&lt;br /&gt;
* '''setup.meta''' — полное внесение метаданных и локализаций&lt;br /&gt;
* '''setup.just.meta''' — полное внесение метаданных&lt;br /&gt;
* '''setup.locale''' — полное внесение локализаций&lt;br /&gt;
* '''setup.adhoc''' — выполнение одного или нескольких FTL-скриптов из custom steps (передаются параметром -DA_SCRIPT='script1;script2'). Можно запускать скрипты из модуля (-DA_SCRIPT='realty:dictionaries') либо из всех модулей, где такой скрипт есть (-DA_SCRIPT='all:dictionaries')&lt;br /&gt;
* '''main''' (таргет по умолчанию) — сборка war&lt;br /&gt;
&lt;br /&gt;
=== Переменные ===&lt;br /&gt;
Имеются следующие BE4-специфичные переменные&lt;br /&gt;
* '''BE4_DIR''' — каталог с проектом be4 (без него ничего не заработает)&lt;br /&gt;
* '''BE4_PROFILE''' — если задано, указывает профиль соединения к базе данных (из connectionProfiles.*.yaml), который необходимо использовать.&lt;br /&gt;
* '''BE4_LOG_DIR''' — если задано, данный каталог будет использован для логирования BE4-операций.&lt;br /&gt;
* '''BE4_DEBUG''' — если &amp;quot;true&amp;quot;, будет выводиться дополнительная отладочная информация в stderr.&lt;br /&gt;
* '''BE4_FORCE_UPDATE''' — если &amp;quot;true&amp;quot;, будут выполняться потенциально опасные изменения в схеме базы данных (которые могут привести к потере пользовательских данных).&lt;br /&gt;
* '''BE4_UNLOCK_PROTECTED_PROFILE''' — если &amp;quot;true&amp;quot;, защищённый (protected) [[BeConnectionProfile|профиль соединения]] будет использоваться без дополнительных подтверждений.&lt;br /&gt;
&lt;br /&gt;
* '''BE4_&amp;amp;lt;имя_модуля&amp;amp;gt;''' — если true, то будут использованы метаданные из BE4-модуля (BE4-модуль должен существовать), иначе — из старого BE-модуля с тем же именем.&lt;br /&gt;
&lt;br /&gt;
Только с таргетом be.validate:&lt;br /&gt;
* '''BE4_RDBMS'''=mysql/postgres/oracle/db2/sqlserver/m4 — если задано, валидация будет выполняться с использованием соответствующей СУБД (это может повлиять на выполнение условных секций в FTL, результат разворачивания макросов, включения extras и т. д.).&lt;br /&gt;
* '''BE4_CHECK_QUERY'''=&amp;quot;entity.query&amp;quot; — если задано, текст указанного запроса после выполнения FTL будет выведен на экран). Если указана фиктивная BE4_RDBMS=m4, на место СУБД-специфичных FTL-функций будут подставлены соответствующие m4-функции (может пригодиться для обратного портирования кода в m4).&lt;br /&gt;
* '''BE4_CHECK_DDL'''=entity — если задано, DDL, необходимый для создания указанной сущности будет выведен на экран. Если указана фиктивная BE4_RDBMS=m4, будет сгенерирован соответствующий m4-код (может пригодиться для обратного портирования кода в m4).&lt;br /&gt;
* '''BE4_CHECK_ROLES'''=true — если задано, на экран будет выведен список ролей проекта, действующий в данных условиях. Может пригодиться, если часть ролей устанавливается условно через extras и хочется проверить, правильно ли отработали условия.&lt;br /&gt;
* '''BE4_CREATE_PROFILE_PROPERTIES'''=&amp;lt;file_path&amp;gt; — создаёт файл properties со свойствами профиля соединения и проекта, который может пригодиться для старой системы тестирования.&lt;br /&gt;
* '''BE4_SAVE'''=true — если задано, проект будет пересохранён (только основной проект, без учёта подключенных модулей) с помощью той же процедуры, как при сохранении через Eclipse. Могут быть отсортированы или переформатированы некоторые элементы проекта.&lt;br /&gt;
&lt;br /&gt;
=== Задачи ===&lt;br /&gt;
При редактировании ant-скриптов можно использовать следующие задачи (tasks):&lt;br /&gt;
* '''be4.db''' — создание базы по BE4-проекту. Параметры:&lt;br /&gt;
:* modules: если true, будут использованы BE4-модули&lt;br /&gt;
&lt;br /&gt;
* '''be4.meta''' — синхронизация. Параметры:&lt;br /&gt;
:* modules: если true, будут использованы BE4-модули&lt;br /&gt;
:* mode: режим синхронизации (all, meta, locale, ddl, security)&lt;br /&gt;
&lt;br /&gt;
* '''be4.data''' — выполнение скрипта или набора скриптов. Параметры:&lt;br /&gt;
:* scriptName: имена скриптов через точку с запятой. Можно написать moduleName:scriptName для выполнения скрипта из модуля, либо all:scriptName для выполнения скрипта с таким именем из всех модулей.&lt;br /&gt;
&lt;br /&gt;
* '''be4.validate''' — валидировать BE4-проект и (для немодульного проекта) заполнить свойства ANT из модели&lt;br /&gt;
* '''be4.tools''' — дополнительный инструментарий BE4.&lt;br /&gt;
&lt;br /&gt;
У всех задач есть общие параметры:&lt;br /&gt;
* projectPath (обязательно) — путь к проекту&lt;br /&gt;
* logDir — каталог для логирования (переопределяет переменную BE4_LOG_DIR)&lt;br /&gt;
* useMeta — экспериментальная опция: использовать базовые beanexplorer-метаданные из YAML-проекта beanexplorer_meta без вычитывания базы инициализированной через m4.&lt;br /&gt;
&lt;br /&gt;
=== Инструментарий ===&lt;br /&gt;
Для технических операций имеется специальная ant-задача '''be4.tools'''. По умолчанию эта задача не соответствует никакому ant-таргету. Если она требуется, можно создать таргет, например, так:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;target name=&amp;quot;be.tools&amp;quot; depends=&amp;quot;be4_settings&amp;quot;&amp;gt;&amp;lt;be4.tools projectPath=&amp;quot;${project.home}&amp;quot;/&amp;gt;&amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для пользования инструментами необходимо задавать дополнительные свойства:&lt;br /&gt;
* '''BE4_DUMP_TABLES'''=&amp;quot;таблица1,таблица2,...&amp;quot; — сдампить из базы соответствующей текущему connection-profile заданные таблицы в новый yaml-проект (будет создан подкаталог yamlDump в текущем каталоге). Может пригодиться для создания болванки при переносе таблиц из m4 в yaml. Пример:&lt;br /&gt;
 ant be.tools -DBE4_PROFILE=foo -DBE4_DUMP_TABLES=users,queries,operations&lt;br /&gt;
&lt;br /&gt;
:В дампе присутствуют все [[Query|представления]], [[Operation|операции]] и схемы указанных [[Entity|сущностей]], а также сообщения [[EntityLocalizations|локализации]] с таким же entityName.&lt;br /&gt;
&lt;br /&gt;
Для компиляции самого BE4 (в объёме необходимом для последующего использования вышеуказанных ant-таргетов) необходимо набрать ant в каталоге be4/src. Не требуется никаких внешних зависимостей.&lt;br /&gt;
&lt;br /&gt;
== Использование вне приложений ==&lt;br /&gt;
Следующие цели можно запускать без какого-либо приложения, т.е. досаточно просто зайти в папку be4/src и написать &amp;quot;ant someTarget&amp;quot;:&lt;br /&gt;
* '''wizard''' — позволяет генерировать новые BE4 приложения. Функционал аналогичен функционалу создания нового приложения в BEclipse (File → New → Project → BeanExplorer → BeanExplorer Project), однако все данные вводятся в консоли, а не в GUI.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_ant</id>
		<title>Использование ant</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_ant"/>
				<updated>2015-11-11T07:19:02Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Помимо использования IDE основной be4-функционал доступен с помощью ant-таргетов.&lt;br /&gt;
&lt;br /&gt;
=== Стандартные таргеты ===&lt;br /&gt;
&lt;br /&gt;
В проектах на be4 определены следующие ant-таргеты:&lt;br /&gt;
* '''be.validate''' — валидация [[Project|проекта]] (вычитывание всех файлов, базовые проверки на корректность, исполнение всего [[Freemarker]]; никаких обращений к базе не делается)&lt;br /&gt;
* '''be.update''' — инкрементальное обновление схемы, метаданных и локализаций. Если обновление схемы может привести к потере данных, операция будет отклонена. Для принудительного выполнения определите BE4_FORCE_UPDATE=true&lt;br /&gt;
* '''be.meta''' — инкрементальное обновление метаданных (включая roles, icons, references, page customizations, pages)&lt;br /&gt;
* '''be.locale''' — инкрементальное обновление локализаций&lt;br /&gt;
* '''be.ddl''' — инкрементальное обновление схемы. Для принудительного выполнения определите BE4_FORCE_UPDATE=true.&lt;br /&gt;
* '''be.ddl.check''' — вывод SQL-предложений, которые потребуются для инкрементального обновления схемы. Никаких изменений в базу не вносится.&lt;br /&gt;
* '''setup.db''' — полное разворачивание базы с нуля (как в BE)&lt;br /&gt;
* '''setup.meta''' — полное внесение метаданных и локализаций&lt;br /&gt;
* '''setup.just.meta''' — полное внесение метаданных&lt;br /&gt;
* '''setup.locale''' — полное внесение локализаций&lt;br /&gt;
* '''setup.adhoc''' — выполнение одного или нескольких FTL-скриптов из custom steps (передаются параметром -DA_SCRIPT='script1;script2'). Можно запускать скрипты из модуля (-DA_SCRIPT='realty:dictionaries') либо из всех модулей, где такой скрипт есть (-DA_SCRIPT='all:dictionaries')&lt;br /&gt;
* '''main''' (таргет по умолчанию) — сборка war&lt;br /&gt;
&lt;br /&gt;
=== Переменные ===&lt;br /&gt;
Имеются следующие BE4-специфичные переменные&lt;br /&gt;
* '''BE4_DIR''' — каталог с проектом be4 (без него ничего не заработает)&lt;br /&gt;
* '''BE4_PROFILE''' — если задано, указывает профиль соединения к базе данных (из connectionProfiles.*.yaml), который необходимо использовать.&lt;br /&gt;
* '''BE4_LOG_DIR''' — если задано, данный каталог будет использован для логирования BE4-операций.&lt;br /&gt;
* '''BE4_DEBUG''' — если &amp;quot;true&amp;quot;, будет выводиться дополнительная отладочная информация в stderr.&lt;br /&gt;
* '''BE4_FORCE_UPDATE''' — если &amp;quot;true&amp;quot;, будут выполняться потенциально опасные изменения в схеме базы данных (которые могут привести к потере пользовательских данных).&lt;br /&gt;
* '''BE4_UNLOCK_PROTECTED_PROFILE''' — если &amp;quot;true&amp;quot;, защищённый (protected) [[BeConnectionProfile|профиль соединения]] будет использоваться без дополнительных подтверждений.&lt;br /&gt;
&lt;br /&gt;
* '''BE4_&amp;amp;lt;имя_модуля&amp;amp;gt;''' — если true, то будут использованы метаданные из BE4-модуля (BE4-модуль должен существовать), иначе — из старого BE-модуля с тем же именем.&lt;br /&gt;
&lt;br /&gt;
Только с таргетом be.validate:&lt;br /&gt;
* '''BE4_RDBMS'''=mysql/postgres/oracle/db2/sqlserver/m4 — если задано, валидация будет выполняться с использованием соответствующей СУБД (это может повлиять на выполнение условных секций в FTL, результат разворачивания макросов, включения extras и т. д.).&lt;br /&gt;
* '''BE4_CHECK_QUERY'''=&amp;quot;entity.query&amp;quot; — если задано, текст указанного запроса после выполнения FTL будет выведен на экран). Если указана фиктивная BE4_RDBMS=m4, на место СУБД-специфичных FTL-функций будут подставлены соответствующие m4-функции (может пригодиться для обратного портирования кода в m4).&lt;br /&gt;
* '''BE4_CHECK_DDL'''=entity — если задано, DDL, необходимый для создания указанной сущности будет выведен на экран. Если указана фиктивная BE4_RDBMS=m4, будет сгенерирован соответствующий m4-код (может пригодиться для обратного портирования кода в m4).&lt;br /&gt;
* '''BE4_CHECK_ROLES'''=true — если задано, на экран будет выведен список ролей проекта, действующий в данных условиях. Может пригодиться, если часть ролей устанавливается условно через extras и хочется проверить, правильно ли отработали условия.&lt;br /&gt;
* '''BE4_CREATE_PROFILE_PROPERTIES'''=&amp;lt;file_path&amp;gt; — создаёт файл properties со свойствами профиля соединения и проекта, который может пригодиться для старой системы тестирования.&lt;br /&gt;
* '''BE4_SAVE'''=true — если задано, проект будет пересохранён (только основной проект, без учёта подключенных модулей) с помощью той же процедуры, как при сохранении через Eclipse. Могут быть отсортированы или переформатированы некоторые элементы проекта.&lt;br /&gt;
&lt;br /&gt;
=== Задачи ===&lt;br /&gt;
При редактировании ant-скриптов можно использовать следующие задачи (tasks):&lt;br /&gt;
* '''be4.db''' — создание базы по BE4-проекту. Параметры:&lt;br /&gt;
:* modules: если true, будут использованы BE4-модули&lt;br /&gt;
&lt;br /&gt;
* '''be4.meta''' — синхронизация. Параметры:&lt;br /&gt;
:* modules: если true, будут использованы BE4-модули&lt;br /&gt;
:* mode: режим синхронизации (all, meta, locale, ddl, security)&lt;br /&gt;
&lt;br /&gt;
* '''be4.data''' — выполнение скрипта или набора скриптов. Параметры:&lt;br /&gt;
:* scriptName: имена скриптов через точку с запятой. Можно написать moduleName:scriptName для выполнения скрипта из модуля, либо all:scriptName для выполнения скрипта с таким именем из всех модулей.&lt;br /&gt;
&lt;br /&gt;
* '''be4.validate''' — валидировать BE4-проект и (для немодульного проекта) заполнить свойства ANT из модели&lt;br /&gt;
* '''be4.tools''' — дополнительный инструментарий BE4.&lt;br /&gt;
&lt;br /&gt;
У всех задач есть общие параметры:&lt;br /&gt;
* projectPath (обязательно) — путь к проекту&lt;br /&gt;
* logDir — каталог для логирования (переопределяет переменную BE4_LOG_DIR)&lt;br /&gt;
&lt;br /&gt;
=== Инструментарий ===&lt;br /&gt;
Для технических операций имеется специальная ant-задача '''be4.tools'''. По умолчанию эта задача не соответствует никакому ant-таргету. Если она требуется, можно создать таргет, например, так:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;target name=&amp;quot;be.tools&amp;quot; depends=&amp;quot;be4_settings&amp;quot;&amp;gt;&amp;lt;be4.tools projectPath=&amp;quot;${project.home}&amp;quot;/&amp;gt;&amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для пользования инструментами необходимо задавать дополнительные свойства:&lt;br /&gt;
* '''BE4_DUMP_TABLES'''=&amp;quot;таблица1,таблица2,...&amp;quot; — сдампить из базы соответствующей текущему connection-profile заданные таблицы в новый yaml-проект (будет создан подкаталог yamlDump в текущем каталоге). Может пригодиться для создания болванки при переносе таблиц из m4 в yaml. Пример:&lt;br /&gt;
 ant be.tools -DBE4_PROFILE=foo -DBE4_DUMP_TABLES=users,queries,operations&lt;br /&gt;
&lt;br /&gt;
:В дампе присутствуют все [[Query|представления]], [[Operation|операции]] и схемы указанных [[Entity|сущностей]], а также сообщения [[EntityLocalizations|локализации]] с таким же entityName.&lt;br /&gt;
&lt;br /&gt;
Для компиляции самого BE4 (в объёме необходимом для последующего использования вышеуказанных ant-таргетов) необходимо набрать ant в каталоге be4/src. Не требуется никаких внешних зависимостей.&lt;br /&gt;
&lt;br /&gt;
== Использование вне приложений ==&lt;br /&gt;
Следующие цели можно запускать без какого-либо приложения, т.е. досаточно просто зайти в папку be4/src и написать &amp;quot;ant someTarget&amp;quot;:&lt;br /&gt;
* '''wizard''' — позволяет генерировать новые BE4 приложения. Функционал аналогичен функционалу создания нового приложения в BEclipse (File → New → Project → BeanExplorer → BeanExplorer Project), однако все данные вводятся в консоли, а не в GUI.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%92%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8</id>
		<title>Встроенные функции</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%92%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8"/>
				<updated>2015-11-02T08:31:23Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: /* Функции для DDL-манипуляций */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Основные функции ===&lt;br /&gt;
Для удобства работы предопределены некоторые функции:&lt;br /&gt;
* '''addDays''': создаёт SQL-предложение для получения даты, отличающейся от заданной на указанное количество дней. Требуется два параметра: дата и количество дней&lt;br /&gt;
* '''addMillis''': создаёт SQL-предложение для получения даты, отличающейся от заданной на указанное количество миллисекунд. Требуется два параметра: дата и количество миллисекунд.&lt;br /&gt;
* '''addMonths''': создаёт SQL-предложение для получения даты, отличающейся от заданной на указанное количество месяцев. Требуется два параметра: дата и количество месяцев.&lt;br /&gt;
* '''chr''': создаёт SQL-предложение для нахождения символа по коду (обычно пригождаться не должно, сейчас используется для идентичных метаданных со старым BE).&lt;br /&gt;
* '''coalesce''': создаёт SQL-предложение COALESCE.&lt;br /&gt;
* '''concat''': создаёт SQL-предложения для конкатенации переданных строк. Пример:&lt;br /&gt;
** &amp;lt;code&amp;gt;SELECT ${concat('name', ' = '?str, 'value')} FROM myDictionary&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;br/&amp;gt; (в MySQL) &amp;lt;code&amp;gt;SELECT CONCAT( name, ' = ', value ) FROM myDictionary&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''genericRef''': создаётся generic-ссылка. Требуется два аргумента: entity и колонка-идентификатор.&lt;br /&gt;
* '''if''': создаёт SQL-предложение IF. Требуется три аргумента: условие, значение, если условие истинно, и значение, если условие ложно. Если третий опущен, предполагается пустая строка.&lt;br /&gt;
* '''indexOf''': создаёт SQL-предложение для поиска подстроки в строке. Требуется два аргумента: строка и подстрока.&lt;br /&gt;
* '''joinGenericRef''': создаёт JOIN-предложение для подключения таблицы через generic reference. Требудется три аргумента: целевая таблица, алиас для неё и колонка-идентификатор.&lt;br /&gt;
* '''length''': создаёт SQL-предложение для подсчёта количества символов в строке. Не путайте со стандартным Freemarker-суффиксом ?length, который вычислит длину поданной строки во время выполнения скрипта.&lt;br /&gt;
* '''limit''': создаёт SQL-предложение для ограничения числа строк в запросе (если это позволяет СУБД)&lt;br /&gt;
* '''lpad''': создаёт SQL-предложение LPAD. Требудется три аргумента: исходная строка, требуемая длина и строка-заполнитель, которая будет использована для удлиннения исходной строки слева в случае необходимости.&lt;br /&gt;
* '''replace''': создаёт SQL-предложение REPLACE. Требуется три аргумента: исходная строка, искомая подстрока, строка замены.&lt;br /&gt;
* '''substring''': создаёт SQL-предложение SUBSTRING. Требуется три аргумента: исходная строка, номер начального символа, количество символов.&lt;br /&gt;
&lt;br /&gt;
=== Функции для DDL-манипуляций ===&lt;br /&gt;
Обычно таблицы задаются в BE4 в декларативном стиле в файлах [[entity|сущностей]], и новые таблицы добавляются автоматически при синхронизации. DDL-манипуляции из FTL-скриптов могут потребоваться для обновления таблиц, определённых в старых m4-модулях. В целом манипулировать схемой таблиц из FTL не рекомендуется.&lt;br /&gt;
&lt;br /&gt;
* '''columnDef(columnName, columnDefinition)''': создаёт фрагмент SQL-предложения CREATE TABLE или ALTER TABLE для определения колонки. Первый параметр — имя колонки, второй — хэш с её свойствами. Свойства в точности такие же, как в structure.yaml. Пример:&lt;br /&gt;
** &amp;lt;code&amp;gt;ALTER TABLE test ADD COLUMN ${columnDef('myCol', {'type': 'BOOL', 'canBeNull': true})}&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;br/&amp;gt; (в Postgres) &amp;lt;code&amp;gt;ALTER TABLE test ADD COLUMN mycol VARCHAR(3) CHECK(mycol IN ('no', 'yes') )&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''tableDef(tableName, columns[, indices])''': создаёт SQL-предложение для создания новой таблицы (если таблица уже существовала, старая удаляется). Первый параметр — имя таблицы, второй — хэш, где ключи — имена колонок, а значения — хэш со свойствами колонок (как в columnDef). Необязательный третий параметр: список индексов (ключи — имена индексов, значения — хэш, описывающий индекс так же, как в structure.yaml). Пример:&lt;br /&gt;
**&lt;br /&gt;
 ${tableDef('uiSocialBlocks', {&lt;br /&gt;
 'CODE': {'type': 'VARCHAR(2)', 'primaryKey': true},&lt;br /&gt;
 'name': {'type': 'VARCHAR(250)'},&lt;br /&gt;
 'parentCode': {'type': 'VARCHAR(2)', 'canBeNull': true}&lt;br /&gt;
 })}&lt;br /&gt;
*** Результат в '''Postgres''':&lt;br /&gt;
 DROP TABLE IF EXISTS uisocialblocks;&lt;br /&gt;
 CREATE TABLE uisocialblocks (&lt;br /&gt;
 code VARCHAR(2) NOT NULL PRIMARY KEY,&lt;br /&gt;
 name VARCHAR(250) NOT NULL,&lt;br /&gt;
 parentcode VARCHAR(2));&lt;br /&gt;
*** Результат в '''Oracle''':&lt;br /&gt;
 call drop_if_exists( 'uiSocialBlocks' );&lt;br /&gt;
 CREATE TABLE UISOCIALBLOCKS (&lt;br /&gt;
 CODE VARCHAR2(2 CHAR) NOT NULL PRIMARY KEY,&lt;br /&gt;
 NAME VARCHAR2(250 CHAR) NOT NULL,&lt;br /&gt;
 PARENTCODE VARCHAR2(2 CHAR));&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Freemarker]]&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	</feed>