Язык описания данных DL600

Язык DL600 является декларативным языком, применяемым для описания разнообразных структур данных, используемых системой Papyrus .С помощью этого языка определяются следующие категории данных системы:

COM-интерфейсы
Внутреннее применение языка. Используется только на стадии разработки.
Структуры таблиц баз данных
Внутреннее применение языка. Используется на стадии разработки для определения структур таблиц баз данных.
Экспортные структуры данных
Применяется как на этапе разработки, так и при эксплуатации системы для кастомизации стандартных (определенных в дистрибутиве) структур данных для печати и экспорта.

Синтаксис языка

Лексические соглашения

Чувствительность к регистру
Язык DL600 является чувствительным к регистру символов.Например, слова Goods и goods с точки зрения компилятора языка различны.

Пробелы и перевод каретки
Символы пробела, табуляции, перевода каретки, за исключением разделения слов, являются не значащими. То есть, несколько таких символов, следующих последовательно друг за другом воспринимаются компилятором как один.

Зарезервированные слова

Следующие слова зарезервированы компилятором:

IMPORT
import
data
interface
struct
enum
iclass
declare
iteration
link
if
else
format
in
out
inout
default
version
library
uuid
abstract
property
table
index
file
Кроме того, зарезервированы следующие слова, обозначающие типы данных:

void
bool
int
long
uint
char
int8
int16
short
int32
autolong
int64
uint8
uint16
uint32
float
double
money
decimal
string
lstring
date
time
datetime
key
variant
wchar
note
raw
blob
clob

Структура файла

Файл DL600 представляет собой набор описаний данных. Каждый набор состоит из полей заголовка (DEFAULT HEAD) и итераторов.

Определение поля

[ [ [ . ] ] ] [] [ ] ; :

Вычисляемые поля

Функции

@(struc-name, int)
Специальная синтаксическая конструкция, возвращающая ссылку на структуру данных struc-name с идентификатором, определяемым вторым параметром.

@(Goods, 20).Name Выражение возвращает наименование из структуры данных Goods с идентификатором 20. @(Person, GetTag("MANUF").ObjID) Выражение в данном примере возвращает ссылку на структуру Person с идентификатором, возвращаемом функцией GetTag("MANUF").ObjID.

length(string)
Возвращает длину строки. Результат long.
sqrt(double a)
Возвращает квадратный корень аргумента a. Результат: double.
sqrt(int a)
Возвращает квадратный корень аргумента a. Результат: double.

round(double v, int p)
Округляет значение первого аргумента v до точности p знаков после десятичной точки. Если p меньше нуля, то округляет до -p десятичного разряда. Результат: double.
abs(double)
Возвращает абсолютное значение аргумента. Результат: double.

left(string s, int N)
Возвращает первые N символов. Результат: string. Номинальная длина результирующего поля равна номинальной длине аргумента s.
right(string s, int N)
Возвращает последние N символов. Результат: string.

middle(string s, int B, int N)
Возвращает часть строки s с символа номер B длиной N символов. Результат: string. Номинальная длина результата равна номинальной длине аргумента s.
wrap(string s, int N)
Возвращает первые N символов, если в них нет пробела, иначе - часть строки до последнего пробела в первых N символах. Результат: string.
replace(string source, string pattern, string replacer)
Замещает в строке source образец pattern на строку replacer. Результат: string. Поиск pattern в строке source осуществляется с учетом регистра символов. Номинальная длина результата равна номинальной длине аргумента source.

format(data, format_spec)
Возвращает строку отформатированных данных data в соответствии со спецификацией format_spec. Результат: string.
money2str(double D, long L)
Возвращает сумму D прописью. L - максимальная длина строки. Результат: string.

num2str(double D, long L)
Возвращает число D прописью. L - максимальная длина строки. Результат: string.
date2str(date D, long L)
Возвращает число D в виде dd/mm/yy. L - максимальная длина строки. Результат: string.

date2wstr(date D, long L)
Возвращает число D прописью. L - максимальная длина строки. Результат: string.
formatperiod(date start, date end)
Форматирует строку периода, ограниченную датами start и end. Результат: string[30].

printablebarcode(string barcode, long codeType)
Преобразует штрихкод в формат, пригодный для печати штрихкода на обычном принтере. Если codeType равно нулю, то система считает, что передаваемый ей код barcode является розничным кодом (EAN-13, EAN-8, UPC-A, UPC-E конкретный тип кода система идентифицирует в зависимости от длины и символов кода).

Если codeType равно 39, то система формирует печатаемую версию штрихкода в формате Code39 (допустимы цифры и латинские символы, которые система переводит в верхний регистр).
Результат: string[20].

barcodeaddcd(string barcode)
Возвращает строку штрихкода, эквивалентную barcode, дополняя ее контрольной цифрой, если в конфигурации справочника товаров не установлен флаг ✓Штрихкод содержит контрольную цифру и длина barcode больше 3 и начальные символы barcode не соответствуют префиксу весового кода, заданного в конфигурации справочника товаров. Результат: string[16].

datedmy(int day, int month, int year)
Возвращает дату в которой день равен аргументу day, месяц - аргументу month, год - аргументу year. Результат: date.
datezero()
Возвращает пустую дату. Результат: date.

timehms(int hour, int minut, int second)
Возвращает время в котором час равен аргументу hour, минуты - аргументу minut, секунды - аргументу second. Результат: time.
timezero()
Возвращает пустое значение времени. Результат: time.

(double) string
Конвертирует строку в число, если это возможно, иначе возвращает 0. Результат: double.
(double) int
Преобразует число из типа int в тип double. Результат: double.

(int) string
Конвертирует строку в число, если это возможно, иначе возвращает 0. Результат: int.
(int) double
Преобразует число из типа double в тип int. Результат: int.

if (long L) expr
Возвращает expr, если L не равно 0. Результат имеет тот же тип, что и expr.
if (long L) expr1 else expr2
Возвращает expr1, если L не равно 0, иначе expr2. Типы данных у expr1 и expr2 должны быть одинаковыми. Результат имеет тот же тип, что и expr1.

long L ? expr1 : expr2
Возвращает expr1, если L не равно 0, иначе expr2. Типы данных у expr1 и expr2 должны быть одинаковыми. Результат имеет тот же тип, что и expr1.

Операторы

+
Оператор сложения. Его поведение зависит от типа операндов, к которому он применяется.
int+int
Складывает два целых числа. Результат int.
double+double
Складывает два действительных числа. Результат double. Если первый или второй операнд является целочисленным, то он преобразуется к double.
date+int
Прибавляет к дате указанное вторым операндом количество дней. Результат date. Если второй операнд является действительным числом, то он преобразуется к целочисленному отбрасыванием дробной чисти.
string+string
“Склеивает” две строки. Результат string.
-
Оператор вычитания. Поведение зависит от типа операндов.
int-int
Вычитает из первого целого числа второе. Результат int.
double-double
Вычитает из первого действительного числа второе. Результат double. Если первый или второй операнд является целочисленным, то он преобразуется к double.
date-date
Вычитает из первой даты вторую вычисляя таким образом разницу в днях между ними. Результат int.

*
Оператор умножения. Поведение зависит от типа операндов.

int*int
Перемножает два целых числа. Результат int.
double*double
Перемножает два действительных числа. Результат double. Если первый или второй операнд является целочисленным, то он преобразуется к double.
string*string
“Склеивает” две строки таким образом, что между ними остается один пробел. Результат string.
/
Оператор деления. Может быть применен либо к целочисленным либо к действительным операндам.

В случае, если делитель равен нулю, то возвращается 0. Такое правило, хотя не согласуется с общепринятыми канонами, позволяет избежать исключительных ситуаций, при которых программа аварийно завершает работу.

Спецификаторы формата вывода

 [alignment][overflow][length][.prec][flags]

Alignment
Параметр выравнивания.
<
по левому краю
|
по центру
>
по правому краю

Overflow
Заполнение при переполнении.
*
заполняет символом '#' все поле, если длина строки выходит за заданные пределы
Length
Полная длина поля вывода.

Prec
Максимальное количество знаков после десятичной точки.
flags
Флаги форматирования.

Строка (prefix '@')

U
Все буквы в верхнем регистре.
L
Все буквы в нижнем регистре.
P
Все символы заменяются символом *.
Число (prefix '$')
C
Разделять триады чисел запятыми.
S
Разделять триады чисел пробелами.
A
Разделять триады чисел апострофами (').
F
Перед положительными числами ставить знак +.
Z
Не пропечатывать нулевые значения.
N
Опускать незначащие нули.

Дата (prefix '#')

A
American (mm.dd.yy)
B
British
D
DMY (dd/mm/yy)
F
French
G
German (dd.mm.yy)
I
Italian
J
Japan
M
MDY (mm/dd/yy)
U
USA
W
ANSI
Y
YMD (yy/mm/dd)
Если второй символ 'C' or 'c', то полностью выдавать год (например: 2003 вместо 03).

Время (prefix '&')

F
hh:mm:ss.dd
N
hh:mm:ss
H
hh:mm
L
mm:ss.dd
L
mm:ss
S
ss.dd
S
Ss
Если второй символ 'B', то - пустая строка для времени 00:00:00.