Кем обрабатываются акции?

Важно: для работы SQL акций необходимо в папке BIN создать папку Plugins и в нее скопировать скрипт акции (csa_transaction_*.csa). После необходимо перезапустить Редактор карт.

MSSQL акции могут исполняться:
  1. сервером автоматических процессов по рассписанию (csa_scheduler_*.csa)
  • межуровневый переход

  • формирование сообщения для рассылки

  • периодеческое пополнение счета

  1. при запросе информации о счетах владельца, например, при прокатывании картой на кассе (csa_accountinfo_*.csa)
  • изменение базовой ставки

  • лимитирование суммы доступной на кассе

  1. при проведении транзакций, например, при закрытии чека (csa_transaction_*.csa)
  • поощрение владельца на основании сделанной покупки, например, выдача и печать купона

В 1-ом случае sql скрипт исполняется на базе данных для совершения каких либо действий.

Например, пересмотреть все бонусные или дисконтные счета и при необходимости установить нужный уровень счетам. Или установить/доначислить определенную сумму на дебетовый счет.

AccountClass — заполняется "0"

AccountTypeID — заполняется "0"

AccountID — заполняется "0"

ActionID — ID акции

ActionType — подкод акции (9997)

ClientID — ID классификатора, указанного в конфигурации

В 2-ом случае при выполнения каких то условий, sql скрипт должен выдать соответствующие данные через выполнение sql запроса (обязательно выполняется последним в скрипте).

Например, по переданному сервером карт номеру счета, применить условия достаточные для изменения базовой ставки или ограничить сумму, оперируемой на кассе.

AccountClass — класс передаваемого счета

AccountTypeID — тип передаваемого счета

AccountID — ID передаваемого счета

CardCode — номер карты

ActionID — ID акции

ActionType — подкод акции (9998)

ClientID — ID классификатора, указанного в конфигурации

ClientTime — локальное время запроса, например, время кассы или farcards (в CRM 6.00

указывается с учетом часовых поясов)

UnitID — ID станции, от которой пришел запрос

UserID — ID пользователя (например, кассира), от которого пришел запрос

В 3-ем случае при выполнении каких то условий, sql скрипт должен выдать соответствующие данные через выполнение sql запроса (обязательно выполняется последним в скрипте):

AccountClass — класс передаваемого счета

AccountTypeID — тип передаваемого счета

AccountID — ID передаваемого счета

CardCode — номер карты

ActionID — ID акции

ActionType — подкод акции (9999)

ClientID — ID классификатора, указанного в конфигурации

ClientTime — локальное время запроса, например, время кассы или farcards (в CRM 6.00

указывается с учетом часовых поясов)

UnitID — ID станции, от которой пришел запрос

UserID — ID пользователя (например, кассира), от которого пришел запрос

TransactGUID — GUID пакета транзакции (важно для сохранения целостности пакета, так

как основные транзакции ложатся через сервер авторизации карт)

ExternalID — внешний код транзакции (например, номер чека)

ExternalIndex — внешний подкод транзакции (например, дата смены)

CheckData — полученный xml пакет от внешней системы (например, xml-чек)

Состав и настройка скрипта

Скрипт делится на 3 основные части:

  1. инициализация переменных (в обязательном порядке для параметров настройки)

  2. настройках (xml для визуального отображения настройки)

  3. логическая часть скрипта (собственно сама бизнес логика акции)

Настройка акций оператором CRM осуществляется на основе встроенного xml (обязательно обернутого в комментарий). Ниже представлены элементы настройки.

При написании текста в подсказке (Hint) для перевода строки используйте \r (так же учитывайте спец. символы).

Примеры скриптов

1. Разделение на визуальные группы (отступ между визуальными элементами больше)

/*

<Script_Params>

<Param Caption="" Type="Line" />

</Script_Params>

*/

2. Ввод текстовой информации

-- инициализация переменной

declare @Notes varchar(max)

set @Notes = ''

-- визуальное отображение для настройки оператором CRM

/*

<Script_Params>

<Param Name="Notes"

Caption="Комментарий"

Hint="Комментарий к транзакции"

Type="Edit"

Type_Param="255"

ReadOnly="False"

Width="300"/>

</Script_Params>

*/

Атрибуты элемента настройки:

Name — название переменной (должно совпадать с инициализированной переменной)

Caption — название переменной, читаемое оператором CRM

Hint — подсказка, отображаемая в справочнике акций

Type — визуальное отображение переменной (Edit)

Type_Param — максимальное количество символов (не обязательный)

ReadOnly — флаг активности элемента (не обязательный):

True – элемент доступен только на просмотр

False – элемент доступен к редактированию (по умолчанию)

Width — ширина элемента в пикселах (не обязательный)

3. Ввод текстовой информации по маске

-- инициализация переменной

declare @ExtensionRate numeric(14,2)

set @ExtensionRate = 0.00

-- визуальное отображение для настройки оператором CRM

/*

<Script_Params>

<Param Name="ExtensionRate"

Caption="Процентная ставка скидки/бонуса"

Hint="Процентная ставка скидки/бонуса"

Type="Mask"

Type_Param="\-?\d\d?\d?\d?\d?\d?\d?\d?\d?\d?\d?\d? (\,|\.)? (\d\d?)?"/>

Width="300"

</Script_Params>

*/

Атрибуты элемента настройки:

Name — название переменной (должно совпадать с инициализированной переменной)

Caption — название переменной, читаемое оператором CRM

Hint — подсказка, отображаемая в справочнике акций

Type — визуальное отображение переменной (Mask)

Type_Param — маска ввода данных, поддерживаются типы данных:

numeric(14,2) — \-?\d\d?\d?\d?\d?\d?\d?\d?\d?\d?\d?\d? (\,|\.)? (\d\d?)?

int — \d?\d?\d?\d?

varchar(???) — любой формат маски (в приложении А представлено описание), который в дальнейшем

будет обработан в скрипте

ReadOnly — флаг активности элемента (не обязательный):

True – элемент доступен только на просмотр

False – элемент доступен к редактированию (по умолчанию)

Width — ширина элемента в пикселах (не обязательный)

4. Выбор одного параметра из представленного в настройке списка

-- инициализация переменной

declare @Period int

set @Period = 2

-- визуальное отображение для настройки оператором CRM

/*

<Script_Params>

<Param Name="Period"

Caption="Тип периода"

Hint="Тип периода"

Type="ComboBox">

<Item Value="1" Caption="День" Display="День" Default="True"/>

<Item Value="2" Caption="Неделя" Display="Неделя"/>

<Item Value="3" Caption="Месяц" Display="Месяц"/>

</Param>

</Script_Params>

*/

Атрибуты элемента настройки:

Name — название переменной (должно совпадать с инициализированной переменной)

Caption — название переменной, читаемое оператором CRM

Hint — подсказка, отображаемая в справочнике акций

Type — визуальное отображение переменной (ComboBox)

Clear — флаг очистки параметра (не обязательный)

True – разрешить оставлять поле чистым (горячие клавиши: Alt + Backspace)

False – запретить очистку параметра (по умолчанию)

Sorted — флаг сортировки (не обязательный)

True – сортировка включена

False – сортировка выключена (по умолчанию)

ReadOnly — флаг активности элемента (не обязательный):

True – элемент доступен только на просмотр

False – элемент доступен к редактированию (по умолчанию)

Width — ширина элемента в пикселах (не обязательный)

Дочерний список выбора значения параметра:

Item — список элементов выбора

Атрибуты элементов списка:

Item.Value — значение элемента, которое будет присвоено инициализированной переменной

Item.Caption — полное название элемента выбора в выпадающем списке

Item.Display — краткое название элемента выборка

Item.Default — значение по умолчанию

True – элемент по умолчанию

False – обычный элемент для выбора

5. Выбор нескольких параметров из представленного в настройке списка

-- инициализация переменной

declare @Period varchar(max)

-- параметр заполняется значениями Value, перечисленными через ","

set @Period = ''

-- визуальное отображение для настройки оператором CRM

/*

<Script_Params>

<Param Name="Period"

Caption="Тип периода"

Hint="Тип периода"

Type="CheckBox">

<Item Value="1" Caption="День" Display="День" Default="True"/>

<Item Value="2" Caption="Неделя" Display="Неделя"/>

<Item Value="3" Caption="Месяц" Display="Месяц"/>

</Param>

</Script_Params>

*/

Атрибуты элемента настройки:

Name — название переменной (должно совпадать с инициализированной переменной)

Caption — название переменной, читаемое оператором CRM

Hint — подсказка, отображаемая в справочнике акций

Type — визуальное отображение переменной (CheckBox)

Clear — флаг очистки параметра (не обязательный)

True – разрешить оставлять поле чистым (горячие клавиши: Alt + Backspace)

False – запретить очистку параметра (по умолчанию)

ReadOnly — флаг активности элемента (не обязательный):

True – элемент доступен только на просмотр

False – элемент доступен к редактированию (по умолчанию)

Width — ширина элемента в пикселах (не обязательный)

Дочерний список выбора значения параметра:

Item — список элементов выбора

Атрибуты элементов списка:

Item.Value — значение элемента, которое будет присвоено инициализированной переменной

Item.Caption — полное название элемента выбора в выпадающем списке

Item.Display — краткое название элемента выборка

Item.Default — значение по умолчанию

True – элемент по умолчанию

False – обычный элемент для выбора

6. Выбор одного параметра из списка, основанного на данных из SQL запроса

Пример 1

-- инициализация переменной

declare @AccountType int

set @AccountType = 0

-- визуальное отображение для настройки оператором CRM

/*

<Script_Params>

<Param Name="AccountType"

Caption="Тип проверяемого счета"

Hint="Тип счета, по которому ведется проверка"

SQLQuery="select ACCOUNT_TYPE_ID as ID, NAME as CAPTION from CARD_ACCOUNT_TYPES

where DELETED = 0 and ACCOUNT_CLASS in (1,3,4)"

Type="ComboBox">

</Param>

</Script_Params>

*/

Атрибуты элемента настройки:

Name — название переменной (должно совпадать с инициализированной переменной)

Caption — название переменной, читаемое оператором CRM

Hint — подсказка, отображаемая в справочнике акций

Type — визуальное отображение переменной (ComboBox)

SQLQuery — sql запрос, данные которого будут отображаться в списке (обязательные поля ID

и CAPTION)

Sorted — флаг сортировки (не обязательный)

True – сортировка включена

False – сортировка выключена (по умолчанию)

Clear — флаг очистки параметра (не обязательный)

True – разрешить оставлять поле чистым (горячие клавиши: Alt + Backspace)

False – запретить очистку параметра (по умолчанию)

ReadOnly — флаг активности элемента (не обязательный):

True – элемент доступен только на просмотр

False – элемент доступен к редактированию (по умолчанию)

Width — ширина элемента в пикселах (не обязательный)

Пример 2

-- инициализация переменной

declare @AccountType int

set @AccountType = 0

-- визуальное отображение для настройки оператором CRM

/*

<Script_Params>

<Param Name="AccountTypes"

Caption="Тип проверяемого счета"

Hint="Тип счета, по которому ведется проверка"

SQLQuery="select ACCOUNT_TYPE_ID as ID, NAME as CAPTION, case ACCOUNT_CLASS when 1

then 'Бонусный' when 2 then 'Дисконтный' when 3 then 'Дебетовый' when 4 then 'Кредитный' when 5 then

'Потраченые средства' when 99 then 'Пользовательский' else '' end as ACCOUNT_CLASS from

CARD_ACCOUNT_TYPES where DELETED = 0 and ACCOUNT_CLASS in (1,2,3,4,5,99)"

Sorted="true"

Type="ExtComboBox">

<Field Name="ID" Caption="" Visible="False"/>

<Field Name="ACCOUNT_CLASS" Caption="Уровень" Visible="True" Sorted="True" Width="35"/>

<Field Name="CAPTION" Caption="Название" Visible="True" Sorted="True" Width="65"/>

</Param>

</Script_Params>

*/

Атрибуты элемента настройки:

Name — название переменной (должно совпадать с инициализированной переменной)

Caption — название переменной, читаемое оператором CRM

Hint — подсказка, отображаемая в справочнике акций

Type — визуальное отображение переменной (ExtComboBox)

SQLQuery — sql запрос, данные которого будут отображаться в списке (обязательные поля ID

и CAPTION)

Clear — флаг очистки параметра (не обязательный)

True – разрешить оставлять поле чистым (горячие клавиши: Alt + Backspace)

False – запретить очистку параметра (по умолчанию)

ReadOnly — флаг активности элемента (не обязательный):

True – элемент доступен только на просмотр

False – элемент доступен к редактированию (по умолчанию)

Width — ширина элемента в пикселах (не обязательный)

Дочерний список полей sql запроса:

Field — список полей sql запроса

Атрибуты элементов списка:

Field.Name — название поля sql запросе

Field.Caption — название поля, читаемое оператором CRM

Field.Visible — флаг возможности отображать поле для оператора CRM

True – поле доступно для отображения

False – сортировка выключена (по умолчанию)

Field.Sorted — флаг сортировки (не обязательный)

True – сортировка включена

False – сортировка выключена (по умолчанию)

Field.Width — ширина поля

При выборе элемента списка происходит пересмотр данных в других списках (ComboBox,

CheckBox, ExtComboBox) и таблицах (Grid), основанных на sql запросах. Для этого в sql

запросе зависимого элемента настройки указывается текущий параметр. Ниже приведен

пример зависимости параметра AccountLevels от AccountTypeEdit:

<Param Name="AccountType"

Caption="Тип счета"

SQLQuery="select ACCOUNT_TYPE_ID as ID, NAME as CAPTION from CARD_ACCOUNT_TYPES

where DELETED = 0 and ACCOUNT_CLASS in (1,2)"

Type="ExtComboBox">

<Field Name="ID" Caption="" Visible="False"/>

<Field Name="CAPTION" Caption="Название" Visible="True" Sorted="True"/>

</Param>

<Param Name="AccountLevels"

Caption="Уровни счета"

SQLQuery="select ACCOUNT_LEVEL_ID as ID, NAME as CAPTION from CARD_ACCOUNT_LEVELS

where DELETED = 0 and ACCOUNT_TYPE_ID = coalesce(@AccountType, 0)"

Type="CheckBox">

</Param>

7. Выбор нескольких параметров из списка, основанного на данных из SQL запроса

-- инициализация переменной

declare @AccountTypes varchar(max)

-- параметр заполняется значениями поля ID, перечисленными через ","

set @AccountTypes = ''

-- визуальное отображение для настройки оператором CRM

/*

<Script_Params>

<Param Name="AccountTypes"

Caption="Тип проверяемого счета"

Hint="Тип счета, по которому ведется проверка"

SQLQuery="select ACCOUNT_TYPE_ID as ID, NAME as CAPTION from CARD_ACCOUNT_TYPES

where DELETED = 0 and ACCOUNT_CLASS in (1,3,4)"

Type="CheckBox">

</Param>

</Script_Params>

*/

Атрибуты элемента настройки:

Name — название переменной (должно совпадать с инициализированной переменной)

Caption — название переменной, читаемое оператором CRM

Hint — подсказка, отображаемая в справочнике акций

Type — визуальное отображение переменной (CheckBox)

SQLQuery — sql запрос, данные которого будут отображаться в списке (обязательные поля ID

и CAPTION)

Clear — флаг очистки параметра (не обязательный)

True – разрешить оставлять поле чистым (горячие клавиши: Alt + Backspace)

False – запретить очистку параметра (по умолчанию)

ReadOnly — флаг активности элемента (не обязательный):

True – элемент доступен только на просмотр

False – элемент доступен к редактированию (по умолчанию)

Width — ширина элемента в пикселах (не обязательный)

8. Ввод информации в табличной форме

-- инициализация переменной

-- AccountLevels.Grid.Insert.Begin

-- заполнение переменной будет осуществлена в момент сохранения параметров таблицы

-- переменная представлять собой временную локальную таблицу с префиксом TMP_ACTION_

-- для данного примера это будет выглядеть следующим образом (#TMP_ACTION_AccountLevels):

if OBJECT_ID ('tempdb..#TMP_ACTION_AccountLevels') IS NULL begin

create table #TMP_ACTION_AccountLevels (ACCOUNT_LEVEL_ID int, NAME nvarchar(60), LEVEL_NO int,

STARTED int, SUMM_UP numeric(14,2), COUNT_UP int, FIXING int, PERIOD_VALUE int, SUMM_DOWN

numeric(14,2), COUNT_DOWN int, SUMM_PAY numeric(14,2), COUPON_TYPE_ID int)

end else begin

delete #TMP_ACTION_AccountLevels

end

-- AccountLevels.Grid.Insert.End

-- визуальное отображение для настройки оператором CRM

/*

<Script_Params>

<Param Name="AccountLevels"

Caption="Уровни"

Hint="&quot;&#9733;&quot; - Стартовый уровень\r&quot;&#9650; Сумма&quot; - сумма необходимая

для повышения уровня\r&quot;&#9650; Визит&quot; - количество транзакций необходимых для повышения

уровня\r&quot;&#9660; Сумма&quot; - сумма, меньше которой произойдет понижение уровня\r&quot;&#9660;

Визит&quot; - количество, меньше которого произойдет понижение уровня\r&quot;Списание&quot; - сумма,

которая спишется за повышение уровня (все &quot;9&quot; - обнуление)"

Type="Grid"

SQLQuery="select ACCOUNT_LEVEL_ID, NAME, LEVEL_NO from CARD_ACCOUNT_LEVELS where

ACCOUNT_TYPE_ID = coalesce(@AccountTypeEdit, 0) and DELETED = 0"

Insert="False"

Delete="False">

<Field Name="ACCOUNT_LEVEL_ID" Type="int" Key="True" Caption="" Visible="False"/>

<Field Name="NAME" Type="nvarchar(60)" Caption="Название" Visible="True" Width="26"/>

<Field Name="LEVEL_NO" Type="int" Caption="&#8470;" Visible="True" Sorted="True" Width="5"/>

<Field Name="STARTED" Type="radiobox" Caption="&#9733;" Visible="True" ReadOnly="False" Width="5"/>

<Field Name="SUMM_UP" Type="numeric(14,2)" Caption="&#9650; Сумма" Visible="True" ReadOnly="False"

Width="11" Mask="\d?\d?\d?\d?\d?\d?\d?\d?\d?\d? (\,|\.)? (\d?\d?)?"/>

<Field Name="COUNT_UP" Type="int" Caption="&#9650; Визиты" Visible="True" ReadOnly="False" Width="8"

Mask="\d?\d?\d?"/>

<Field Name="FIXING" Type="int" Caption="Фиксация" Visible="True" ReadOnly="False" Width="8"

Mask="\d?\d?\d?"/>

<Field Name="PERIOD_VALUE" Type="int" Caption="Период" Visible="True" ReadOnly="False" Width="8"

Mask="\d?\d?\d?"/>

<Field Name="SUMM_DOWN" Type="numeric(14,2)" Caption="&#9660; Сумма" Visible="True"

ReadOnly="False" Width="11" Mask="\d?\d?\d?\d?\d?\d?\d?\d?\d?\d? (\,|\.)? (\d?\d?)?"/>

<Field Name="COUNT_DOWN" Type="int" Caption="&#9660; Визиты" Visible="True" ReadOnly="False"

Width="8" Mask="\d?\d?\d?"/>

<Field Name="SUMM_PAY" Type="numeric(14,2)" Caption="Списание" Visible="True" ReadOnly="False"

Width="11" Mask="\d?\d?\d?\d?\d?\d?\d?\d?\d?\d? (\,|\.)? (\d?\d?)?"/>

<Field Name="COUPON_TYPE_ID" Type="int" Caption="Тип купона" Visible="True" ReadOnly="False"

Width="15" SQLQuery="select COUPON_TYPE_ID as ID, NAME as CAPTION from CARD_COUPON_TYPES

where DELETED = 0 and FLAGS &amp; 4 &gt; 0 and ((SUBSCRIBE_DATE_FROM &lt;=

CURRENT_TIMESTAMP) or (SUBSCRIBE_DATE_FROM is null)) and ((SUBSCRIBE_DATE_TO &gt;=

CURRENT_TIMESTAMP) or (SUBSCRIBE_DATE_TO is null))">

<Field Name="ID" Caption="" Visible="False"/>

<Field Name="CAPTION" Caption="Название" Visible="True" Sorted="True" Width="100"/>

</Field>

</Param>

</Script_Params>

*/

Атрибуты элемента настройки:

Name — название переменной (должно совпадать с инициализированной переменной)

Caption — название переменной, читаемое оператором CRM

Hint — подсказка, отображаемая в справочнике акций

Type — визуальное отображение переменной (Grid)

SQLQuery — sql запрос, данные которого будут редактироваться

ReadOnly — флаг активности элемента (не обязательный):

True – элемент доступен только на просмотр

False – элемент доступен к редактированию (по умолчанию)

Delete — флаг удаления строк в таблице (не обязательный):

True – разрешено удалять строки

False – запрещено удалять строки (по умолчанию)

Insert — флаг удаления строк в таблице (не обязательный):

True – разрешено добавлять строки

False – запрещено добавлять строки (по умолчанию)

Дочерний список полей sql запроса:

Field — список полей sql запроса

Атрибуты элементов списка:

Field.Name — название поля sql запросе

Field.Caption — название поля, читаемое оператором CRM

Field.Type — тип данных:

numeric(14,2)

int

varchar(???)

radiobox – выбор одной строки таблицы (тип данных: int)

1 – строка выбрана

0 – строка не выбрана

checkbox – выбор нескольких строк таблицы (тип данных: int)

1 – строка выбрана

0 – строка не выбрана

Field.Key — флаг первичного ключа (должно быть 1 ключевое поле)

True – поле является ключем

False – поле не является ключем (по умолчанию)

Field.Visible — флаг возможности отображать поле для оператора CRM

True – поле доступно для отображения

False – сортировка выключена (по умолчанию)

Field.ReadOnly — флаг активности поля (не обязательный):

True – поле доступно только на просмотр (по умолчанию)

False – поле доступно к редактированию

Field.Sorted — флаг сортировки (не обязательный)

True – сортировка включена

False – сортировка выключена (по умолчанию)

Field.Width — ширина поля

Field.SQLQuery — sql запрос, который предоставит список для выбора значения (доступно с

CRM 6.00)

Field.Mask — маска ввода данных, поддерживаются типы данных:

numeric(14,2) — \-?\d\d?\d?\d?\d?\d?\d?\d?\d?\d?\d?\d? (\,|\.)? (\d\d?)?

int — \d?\d?\d?\d?

varchar(???) — любой формат маски (в приложении А представлено описание), который в дальнейшем будет обработан в скрипте

Так как атрибуты и теги влияют на тип отображения поля, присутствует приоритетность:

  • Mask (строка с указанной маской)

  • Type (приоритет актуален при указании radiobox и checkbox)

  • Item (выпадающий список, представленный в xml настройке)

  • SQLQuery (выпадающий список на основе данных из базы)

Если указан атрибут Mask, то списки или флаги не доступны к отображению.

Дочерний список выбора значения поля:

Field.Item — список элементов выбора

Атрибуты элементов списка:

Field.Item.Value — значение элемента

Field.Item.Caption — полное название элемента выбора в выпадающем списке

Field.Item.Display — краткое название элемента выборка

Дочерний список полей sql запроса (при указании атрибута SQLQuery):

Field.Field — список полей sql запроса

Атрибуты элементов списка:

Field.Field.Name — название поля sql запросе

Field.Field.Caption — название поля, читаемое оператором CRM

Field.Field.Visible — флаг возможности отображать поле для оператора CRM

True – поле доступно для отображения

False – сортировка выключена (по умолчанию)

Field.Field.Sorted — флаг сортировки (не обязательный)

True – сортировка включена

False – сортировка выключена (по умолчанию)

Field.Field.Width — ширина поля

Приложение А

Маска состоит из разделенных символом трех полей:

1. первое поле является собственно маской;

2. второе поле — это символ, определяющий, считаются ли литеральные символы частью данных. По

умолчанию используется 1, и литеральные символы маски являются частью не только значения,

редактируемого в визуальном компоненте, но и значения, содержащегося в поле. Если вместо 1 установить

символ о, то литеральные символы маски по-прежнему будут отображаться при редактировании значения,

однако в поле не сохраняются. Литеральные символы удобно применять в качестве разделителей, например,

при вводе телефонных номеров;

3. третье поле содержит символ, используемый для указания незаполненных символов во вводимом тексте,

по умолчанию это символ подчеркивания.

Если второе и/или третье поля не определены, то для них действуют значения по умолчанию.

В маске могут использоваться следующие специальные символы:

! — в тексте подавляются начальные пробелы; если символ ! отсутствует, то подавляются конечные пробелы;

> — символы, следующие за этим символом, до появления символа < переводятся в верхний регистр;

< — символы, следующие за этим символом, до появления символа > переводятся в нижний регистр;

<> — проверка регистра символов не производится;

\ — символ, следующий за этим символом, является литеральным;

L — в позиции должен быть введен алфавитный символ;

l — (строчная латинская буква l)— в позиции может быть введен алфавитный символ;

A— в позиции должен быть введен алфавитно-цифровой символ;

а — в позиции может быть введен алфавитно-цифровой символ;

C — в позиции должен быть введен символ;

с — в позиции может быть введен символ;

0 — в позиции должен быть введен цифровой символ;

9 — в позиции может быть введен цифровой символ;

# — в позиции может быть введен цифровой символ или знаки + и — ;

: — используется для разделения часов, минут и секунд в показаниях времени;

/ — используется для разделения дней, месяцев и лет в датах;

; — разделяет поля маски;

_ — оставляет в окне редактирования пустое пространство, являющееся автоматически пропускаемым разделителем, в которое нельзя ввести информацию.

Примеры масок:

!99/99/00; 1;_ — для даты;

!000−00−00; 1;_ — для семизначного телефонного номера, разделитель «-» является частью редактируемого и

запоминаемого значения;

!000−00−00, −0;_ — для семизначного телефонного номера, разделитель «-» является частью только

редактируемого значения;

!90:00; 1;_ — для времени;

1_1_1_1_1_1_;1;_ — для слова длиной в шесть букв максимум (между буквами отображаются пробелы).

 

The major feature of the MaskEdit is the edit mask that provides mask validating and the formatting of user input.

MaskEdit supports three types of edit mask.

Standard

The standard edit mask is a string that consists of three fields with semicolons separating them. The first part of the

mask is the mask itself. The second part is the character that determines whether literal characters within the mask are

saved as part of the data. The third part of the mask is the character used to represent un-entered characters in the mask.

These are the special characters used in the first field of the mask:

Character                       Meaning in mask

!                             If the ! character appears in the mask, optional characters are represented in the text as leading blanks. If the ! character is not present, optional characters are represented in the text as trailing blanks.

>                            If the > character appears in the mask, all characters that follow are in uppercase until the end of the mask or until the < character is encountered.

<                            If the < character appears in the mask, all characters that follow are in lowercase until the end of the mask or until the > character is encountered.

<>                          If these two characters appear together in the mask, no case checking is done and the data is formatted with the case the user uses to enter data.

\                              The character that follows the \ character is a literal character. Use this character to use any of the mask special characters as a literal in the entered data.

L                             The L character requires an alphabetic character only in this position. For the US, this is A-Z, a-z.

l                              The l character permits only an alphabetic character in this position, but doesn't require it.

A                            The A character requires an alphanumeric character only in this position. For the US, this is A-Z, a-z, 0-9.

a                            The a character permits an alphanumeric character in this position, but doesn't require it.

C                           The C character requires an arbitrary character in this position.

c                            The c character permits an arbitrary character in this position, but doesn't require it.

0                           The 0 character requires a numeric character only in this position.

9                           The 9 character permits a numeric character in this position, but doesn't require it.

#                           The # character permits a numeric character or a plus or minus sign in this position, but doesn't require it.

:                            The : character is used to separate hours, minutes, and seconds in times. If the character that separates hours, minutes, and seconds differs from the regional settings of the Control Panel utility on your computer system, that character is used instead.

/                            The / character is used to separate months, days, and years in dates. If the character that separates months, days, and years differs from the regional settings of the Control Panel utility on your computer system, that character is used instead.

;                            The ; character is used to separate the three fields of the mask.

_                          The _ character automatically inserts spaces into the text. When the user enters characters in the field, the cursor skips the _ character.

 
Any character that does not appear in the preceding table can appear in the first part of the mask as a literal character. Literal characters must be matched exactly in the edit control. They are inserted automatically, and the cursor skips over them during editing. The special mask characters can also appear as literal characters if preceded by a backslash character (\). The second field of the mask is a single character that indicates whether literal characters from the mask should be included as part of the text for the edit control. For example, the mask for a telephone number with area code could be the following string:
(000)_000-0000;0;*
The 0 in the second field indicates that the Text property for the edit control would consist of the 10 digits that were entered, rather than the 14 characters that make up the telephone number as it appears in the edit control. A 0 in the second field indicates that literals should be omitted, any other character indicates that they should be included.
The third field of the mask is the character that appears in the edit control for blanks (characters that have not been entered). By default, this is the same as the character that stands for literal spaces. The two characters appear the same in an edit window. However, when a user edits the text in a masked edit control, the cursor selects each blank character in turn, and skips over the space character.
 
Regular Expressions
 
MaskEdit supports regular expressions to validate and format user input.
Reference A regular expression can consist of characters (letters, digits and others which are not command characters), command characters and metacharacters.
 
1. Characters If one of the characters listed below occurs in the mask, the input string must contain the same character at this position. The following characters are supported: A-Z, a-z, 0-9, and non-letter and non–digit characters: ~, ', !, @, #, $, %, ^, &, -, _, =, ,, <, >, /, ;, :, ". Note: you can use other characters by placing \ before them. For instance, \[ will be treated as [ by the regular expression compiler. Spaces are ignored by the compiler unless they are enclosed in single quotes - '.
Example: The Making' 'RAD' 'a' 'Reality! expression matches only the Making RAD a Reality! string.
 
2. Command characters: These characters are not interpreted as symbols but as commands by the compiler. They are used to organize grouping, quantifications and conditions. Grouping: Character Sequence Grouping – ( ) This grouping is commonly used in quantifier operations: ?, +, *. (These are described later.) Examples: (a)+ matches a, aaa or aaaa. (+ means that the preceding character can occur one or more times) (abc)+ matches abc, abcabc or abcabcabc. This grouping is also used in back references. A back reference is a part of regular expression that can be referenced via a special metacharacter \n (where 1 =< n =< 9). You can use them in the expression to make it shorter and easier to read. The 3abcabcabc expression will be better written as 3(abc)\1\1. In this example the \1 references abc sequence.
OR Grouping – [ ] Means that any symbol listed within square brackets can represent a character. Examples: [bfc]at matches bat, fat and cat. OR grouping supports all quantifiers: ?, * and + (described later). But quantifiers enclosed in square brackets are treated
as simple characters. [bfc]?at matches bat, fat, cat and at. b[oa]+t matches bot, bat, boot and boat. a[in]*t matches at, ait and ant. OR grouping supports ranges: [A-Z] matches any Latin capital letter. [0-9A-Fa-f] matches any hexadecimal number. Exclusive OR Grouping – [^] Means that any symbol except those in square brackets can represent a character. Example: [^abc] matches any symbol except a, b, and c. Exclusive OR grouping supports all quantifiers: ?, * and +.(described later). But quantifiers enclosed in square brackets
are treated as simple characters. Example: [^0-9]+ Matches any text sting without digits (for instance, ExpressQuantumGrid but not ExpressQuantumGrid4). Variant Grouping – ( | ) Contains several sequences that can match on an OR basis. Example: (b|z)oo matches both zoo and boo. (abc|123) matches abc and 123. Quantifiers * matches the preceding expression zero or more times. The expression can be a symbol or group of symbols. Example: zo* matches z, zo and zoo. [#$][0-9a-f]* matches $00ff00, #ff1234234, $ or #. [0-9]*[.][0-9] matches any
decimal value with a single digit after the decimal separator. (a|b|c)* matches aaaa, bbb, cc, abc, acc, cba or an empty string. + matches the preceding expression one or more times. The expression can be a symbol or group of symbols. Example: zo+ matches zo and zoo, but not z. $[0-9]+.99 matches any string, thus representing a currency format. [#$] [0-9a-f]+ matches $00ff00, #ff1234234, but not $ or #. ? matches the preceding expression zero or one time. The expression can be a symbol or group of symbols.
Example: zoo? matches zo and zoo, but not z. [#$][0-9a-f]? - matches $, #e, but not #2a.
{n} matches the preceding expression exactly n times. The expression can be a symbol or group of symbols.
Example: zo{2} matches zoo but not zo or zooo. $[0-9a-f]{8} matches $00ff01de but not $ff or $0ffffe333.
{n,} matches the preceding expression at least n times. The expression can be a symbol or group of symbols.
Example: zo{2,} matches zoo or zooo but not z or zo. $[0-9a-f]{4,} matches $00ff or $ffddee but not $ff.
{n,m} matches the preceding expression at least n times and at most m times. The expression can be a symbol or group
of symbols.
Example: zo{1,2} matches zo and zoo but not z or zooo. $[0-9a-f]{4,8} matches $00ff01de and $00ff but not $ff or
$0ffffe333.
 
3. Metacharacters Metacharacters are used to represent a symbol or a range of symbols.
Character       Description
\d                   Matches a digit character. Equivalent to [0-9].
\D                   Matches a non digit character. Equivalent to [^0-9].
\f                     Matches a form-feed character. Equivalent to \x0c.
\n                   Matches a new line character. Equivalent to \x0a.
\r                    Matches a carriage return character. Equivalent to \x0d.
\s                   Matches any white space character including space, tab, form-feed, etc.
\S                  Matches any non white space character.
\t                   Matches a tab character. Equivalent to \x09.
\w                 Matches any word character including underscore. Equivalent to '[A-Za-z0-9_]'.
\W                Matches any non-word character. Equivalent to '[^A-Za-z0-9_]'.
\xn               Matches n, where n is a hexadecimal escape value. Hexadecimal escape values must be exactly two digits long. For example, '\x41' matches "A". '\x041' is equivalent to '\x04' & "1". Allows ASCII codes to be used in regular expressions.
.                    Matches any symbol. It is treated as full stop within square brackets.
 
Examples:
\d\d\d\-\d\d\-\d\d matches any phone number (for instance 555-65-92 or 123-45-67).
\w+\d? matches any sequence on non-digit characters followed by an optional digit (for instance
ExpressQuantumGrid or ExpressQuantumGrid4 but not All4You).
Some complex examples of regular expressions:
([01]?\d|2[0-3]):[0-5]\d:[0-5]\d – a regular expression representing the pattern for 24 hours time format.
Let us consider it in detail: [01]?\d matches any number between 0 and 19. Zero can precede single digit numbers (for instance 0, 5, 02 or 14). 2[0-3] matches any number between 20 and 23. ([01]?\d|2[0-3]) matches any number between
0 and 23. : - means that there must be a valid time separator. A valid time separator is obtained from the system regional settings. [0-5]\d matches any number between 0 and 59. Zero precedes all single digit numbers (for instance 00, 05, 34,59)
[\w\-.]+@[\w\-]+(\.[\w\-]+)+ - a regular expression that represents a pattern for e-mail addresses.
Let us consider it in detail: [\w\-.]+ matches any letter, digit, hyphen, underscore or full stop one or more times. [\w\-]+ matches any letter, digit, underscore or hyphen one or more times. (\.[\w\-]+)+ matches full stop followed by a letter, digit, underscore or hyphen sequence one or more times.
 
Extended Regular Expression
This is similar to a regular expression but with an added auto complete facility. If, while entering text into a MaskEdit a
user has no alternative text to enter, the text is auto-completed to the point where an alternative appears again. For
example, the regular expression is:
\w+' 'like' '\w+' 'apples!
After a user enters, for instance 'I' and presses the space button, the text is auto completed to the following:
'I like ';
After a user enters, for instance 'red' and presses space again, the text is auto completed to the following:
'I like red apples!'

Приложение B

Работа с флагами.

Флаг может быть выставлен либо сброшен, то есть подразумевается работа с битовыми масками. Например, при поле флагов Int32 у нас имеется 32 бита-флага. Значение константы соответствует номеру бита. Если биты будут одинаковые, флаги будут перетираться.

CARD_PEOPLES.FLAGS = 22dec = 16hex = 010110bin

16hex & 1hex = 0hex (запрещен автоматический межуровневый переход)

16hex & 2hex = 2hex (разрешена Email рассылка)

16hex & 4hex = 4hex (разрешена SMS рассылка)

16hex & 8hex = 0hex (не курящий)

16hex & 10hex = 10hex (владелец прошел верификацию)

declare @Flags int

set @Flags = 22

select @Flags as Flags, @Flags & 0x001 as Bit_1_0x001, @Flags & 0x002 as Bit_2_0x002, @Flags & 0x004 as

Bit_3_0x004, @Flags & 0x008 as Bit_4_0x008, @Flags & 0x010 as Bit_5_0x010

-- установка 4 бита-флага (8dec = 8hex = 01000bin)

set @Flags = @Flags + case when @Flags & 0x008 = 0 then 0x008 else 0 end

select @Flags as Flags, @Flags & 0x001 as Bit_1_0x001, @Flags & 0x002 as Bit_2_0x002, @Flags & 0x004 as

Bit_3_0x004, @Flags & 0x008 as Bit_4_0x008, @Flags & 0x010 as Bit_5_0x010

-- сброс 3 бита-флага (4dec = 4hex = 0100bin)

set @Flags = @Flags - case when @Flags & 0x004 > 0 then 0x004 else 0 end

select @Flags as Flags, @Flags & 0x001 as Bit_1_0x001, @Flags & 0x002 as Bit_2_0x002, @Flags & 0x004 as

Bit_3_0x004, @Flags & 0x008 as Bit_4_0x008, @Flags & 0x010 as Bit_5_0x010

Ниже приведены значения зарезервированные в системе. Значения с новыми версиями системы будут расширятся, поэтому не занимайте свободные биты в своих разработках.

CARD_PEOPLES.FLAGS

0x0001 - автоматический межуровневый переход

0x0002 - разрешить EMail рассылку

0x0004 - разрешить SMS рассылку

0x0008 - курящий

0x0010 - прошел верификацию

CARD_CARDS.FLAGS

0x0001 - требуется карта менеджера

0x0002 - зарезервировано