SelectNextControl метод

Метод SelectNextControl позволяет перейти к следующему элементу, учитывая свойство TabIndex.

При этом можно указать направление перехода вперед (true) или назад (false).

В примере, метод вызывается по нажатию кнопки вверх (вниз), а не по Tab, что привычнее для пользователя знакомого со стандартным вводом/коррекцией в CronosPro.

 

RDF в LUA

http://activerdf.luaforge.net/ библиотека на LUA для работы с уже размеченными текстами семантического Web. Используется стандарт RDF, который помимо прочих поддерживает Yandex. Распознанный в документах текст имеет смысл сохранять в RDF формате.

https://ru.wikipedia.org/wiki/Resource_Description_Framework

https://ru.wikipedia.org/wiki/Schema.org

http://ruschema.org/

Быстрое чтение

Интересный способ быстрого чтения информации под условным названием RSVP реализован в CronosPro. Достаточно вставить требуемый текст в текстовое поле и нажать кнопку Старт.

RSVP
Нажми для анимации

 

Форма ввода прилагается RSVP.

Таблицы в шаблонах отчетов

Задачи в CronosPro возникают самые разнообразные и решаются к счастью пользователей тоже самыми разнообразными способами.

Столкнулся с задачей вывода большого количества данных в таблицу. Читать далее Таблицы в шаблонах отчетов

Формула CREATEUSER

Формула CREATEUSER позволяет зарегистрировать в системе нового пользователя, добавить банки уже существующему пользователю, сбросить или изменить пароль, заблокировать пользователя. Так же эта функция позволяет обычному пользователю допущенному к проектированию формул стать администратором CronosPro.

QR code — штрих коды в CronosPro

CronosProВ условиях современного документооборота большую роль играют штрих коды наносимые на товары, документы либо материальные ценности.

В CronosPro  встроенных функций для генерации штрих кода пока нет, но имеется возможность создавать их используя сторонние приложения. Например,  текст который нужно закодировать, с помощью формулы EXECUTE () или функции LUA ShellExecute() передается  во  внешнюю программу, которая генерирует штрих-код, а на выходе вы получите  картинку которую формулами можно вставить в файл отчета.

Также есть более сложный, но более надежный способ — написать алгоритм генерации штрих кода самостоятельно.  Но благодаря тому, что LUA активно развивается, то порой достаточно адаптировать уже существующие алгоритмы для работы в CronosPro.  Тестовая форма ввода с алгоритмом формирования BMP файла (предоставлен Zulus) прилагается

qrcode.

 

Ленивые вычисления в Lua

В языке Lua операции and и or вычисляют второй операнд только в случае необходимости. Например, если при вычислении выражения

Lua не станет вычислять значение B, если А будет иметь зачение true или любое другое, кроме nil. И наоборот, если значением А будет false или nil, будет вычислено выражение В. То есть, если написать

то, возможно, функция do_smth() никогда не будет вызвана.

И это еще не все чудеса. Операндами логических операций and и or могут быть выражения любых типов, не только логические. Результатом операции тоже могут быть любые значения, а не только true и false. Примеры приведены в документации:

Для чего  все это можно использовать? Ну, например чтобы сделать свои программы более компактными:

можно заменить на

Или так, конструкцию

заменяем на

Вместо

пишем

Пример 1.  Убираем инициалы из имени, если они там есть.

Пример 2. Помещаем в таблицу строку, если она (строка) не пустая.

Возвращаемое значение в данном случае нас не интересует, поэтому присваиваем его фиктивной переменной.

Пример 3.  Открываем файл или выводим сообщение об ошибке.

Пример 4.  Возвращаем самую длинную из строк s1 и s2.

StringRequest

В некоторых сборках CronosPro присутствовал метод StringRequest, который позволяет делать строчные запросы типа "ОТ ЛЦ01 РВ ИВАНОВ" прямо из кода Lua, в последней версии CronosPro этот метод по непонятным причинам отсутствует, но тем не менее пользователи со стажем нашли выход и смогли реализовать механизм строчного запроса используя формулы, где еще сохранилась функция FIND().
Итак создаем пользовательскую функцию StringFind с таким содержимым:

@request;
@recordset :=FIND(@request)
@ret:=@recordset

В управляющей форме описываем новую функцию

function StringRequest(strreq)
local formula=Formula.new()
recs=formula:ExecuteUser("StringFind",strreq)
local t_recs=Formula.ToLuaTable(recs)
return t_recs;
end

Функцией, можно пользоваться, примерно так:

strreq="ОТ ЛЦ01 2 РВ "..Me.текст1.Text
t_sn=StringRequest(strreq)

for ind,cursn in ipairs(t_sn) do
local currec=CroApp:GetBank():GetBase(4):GetRecord(tonumber(cursn))
Me.список1:Add(currec.SN.." "..currec:GetValue(2))
end

Перегрузка операторов в LUA

В LUA имеется возможность перегружать операторы используя механизм метатаблиц.
Получив метатаблицу для типа данных «строка» мы можем заменить стандартную операцию канкатенации на свою собственнцю, путем замены мета-функции _add().
В обычном случае конкатенация производится оператором str ="A".."B", а  в приведенном  примере  запись str ="A"+"B" будет корректно работать и не вызовет ошибки.
Пример

Type_To_Reload = "string"
metatable_Of_TypeToReload = getmetatable(Type_To_Reload)
metatable_Of_TypeToReload.__add = function(str1,str2)
return str1..str2
end
MsgBox("Перегрузка " + "о" + "пе" + "рации конкатенации")

string.split

Функция string.split позволяет создавать массивы из текстовых строк с разделителями. При этом строка с данными легко преобразовывается в массив.

Пример:

 

формула COMPSTRINGEX()

Формула COMPSTRINGEX(@array1,@array2) сравнивает между собой два массива и позволяет определить, является ли один из сравниваемых массивов подмножеством другого.

В результате работы функция возвращает значение от 0 до3.

0 — Массивы идентичны

1 — Первый массив является подмножеством второго

2 — Второй массив является подмножеством  первого

3 — Массивы различны.

Пример

Использование формулы COMPSTRINGEX  позволяет в «ручном» режиме реализовать 5 тип идентификации.

В данном случае подчиненные адреса организации сливаются в случае их идентичности либо при условии что один адрес является подмножеством другого.

Если у организации имеется 4 адреса

— Московская область,

— Московская область, Мытищи,

— Московская область, Химки,

— Московская область, Мытищи, ул. Листопадова 8

То в результате работы формулы останется 2 адреса:

— Московская область, Химки,

— Московская область, Мытищи, ул. Листопадова 8

Скачать код.

/* формула слияния одинаковых подчиненных адресов у организаций*/

@i:= VALCOUNT(РГ16_АД); /* определяем сколько адресов свзанно с организацией*/
@old_AD_value:=»»
WHILE  (@i>0) do
(
@j:=@i-1;
@SN:=РГ16_АД(@i);
@AD_VALUE:=VIEWRECORD(АД{@SN},АД1<<@VALUESEPARATOR<<АД2<<@VALUESEPARATOR<<АД3<<@VALUESEPARATOR<<АД4<<@VALUESEPARATOR<<АД5);
WHILE (@j>0) do /* после того как взяли значение организации сравниваем его со всеми остальными в наборе*/
(
@NEXT_SN:=РГ16_АД(@j);
@NEXT_AD_VALUE:=VIEWRECORD(АД{@NEXT_SN},АД1<<@VALUESEPARATOR<<АД2<<@VALUESEPARATOR<<АД3<<@VALUESEPARATOR<<АД4<<@VALUESEPARATOR<<АД5);
@res:=COMPSTRINGEX(@AD_VALUE,@NEXT_AD_VALUE);
if @res=0|@res=2 then  /* если сравниваемые адреса идентичны  ИЛИ  если первый адрес полный, а второй является его подмножеством */
(
/* сохраняем отсылки  текущего адреса*/
@array_UL:=VIEWRECORD(АД{@NEXT_SN},АД16_ЮЛ);
@array_FL:=VIEWRECORD(АД{@NEXT_SN},АД16_ФЛ);
/* сохраняем отсылки следующего адреса  */
@prev_array_UL:=VIEWRECORD(АД{@SN},АД16_ЮЛ);
@prev_array_FL:=VIEWRECORD(АД{@SN},АД16_ФЛ);
/* переносим отсылки к  от «старого» адреса к «новому»*/
USERECORD(АД{@SN}, АД16_ЮЛ:=@prev_array_UL<<@VALUESEPARATOR<<@array_UL);
USERECORD(АД{@SN}, if VALCOUNT(АД80_ФЛ)>0 then (АД80_ФЛ:=@prev_array_FL<<@VALUESEPARATOR<<@array_FL) else (АД80_ФЛ:=@array_FL) );
DELETERECORD ( АД{@NEXT_SN}, 1)
)
if @res=1 then /* если первый адрес является подмножеством , а второй полный   то удалению подлежит текущий адрес*/
(
/* сохраняем отсылки  текущего адреса*/
@array_UL:=VIEWRECORD(АД{@NEXT_SN},АД16_ЮЛ);
@array_FL:=VIEWRECORD(АД{@NEXT_SN},АД16_ФЛ);
/* сохраняем отсылки следующего адреса  */
@prev_array_UL:=VIEWRECORD(АД{@SN},АД16_ЮЛ);
@prev_array_FL:=VIEWRECORD(АД{@SN},АД16_ФЛ);
/* переносим отсылки к  от «старого» адреса к «новому»*/
USERECORD(АД{@NEXT_SN}, АД16_ЮЛ:=@prev_array_UL<<@VALUESEPARATOR<<@array_UL);
USERECORD(АД{@NEXT_SN}, if VALCOUNT(АД80_ФЛ)>0 then (АД80_ФЛ:=@prev_array_FL<<@VALUESEPARATOR<<@array_FL) else (АД80_ФЛ:=@array_FL) );
DELETERECORD ( АД{@SN}, 1)
)
@j:=@j-1;
);
@i:=@i-1;
)
@ret:=@res;

LUA: Объекты интерфейса CronosPro

Перечисленные ниже объекты позволяют получить доступ к элементам интерфейса CronosPro.

CroApp — предоставляет доступ к методам  и свойствам  текущего банка.

Color — позволяет создавать объекты для манипуляций с цветом.

Cursor — позволяет создавать и управлять внешним видом курсора.

Font — описывает экземпляр шрифта.

Formula — класс интегрирующий формулы CronosPro в LUA.

Keys — предоставляет доступ к кодам или константам клавиш клавиатуры.

Timer — полноценный класс для организации работы в любых  интервалах времени.

При изучении LUA, из всех перечисленных объектов больше внимания стоит уделить классу CroApp и Formula.

Пятый тип идентификации

Слияние подчиненных объектов — пятый тип идентификации  позволяет без труда избавиться от множества дублирующихся записей в банке данных. Для того чтобы объекты сливались по 5 типу идентификации не требуется создавать идентифицирующий набор, записи в данном случае сливаются по принципу подчиненности.  Если база ЛИЦО через прямую отсылку связана с базой АДРЕС, то сливаться будут все одинаковые адреса у одного лица. К примеру у лица  Иванов И.И. имеется 3 адреса, Москва/ул.Мосфильмовская/12, Москва/ул.Мосфильмовская,  Москва/ул.Мосфильмовская/12. Из 3 адресов сольются 2, у которых полностью совпадают простые характеристики. Если же адрес  подчинен не только базе ЛИЦО, а еще какому либо объекту то он не будет сливаться.

Статус поля

При проектировании банка данных в CronosPro имеется возможность задавать различные статусы отдельным полям базы.
Поле может иметь статус

  • Множественное
  • Автозаполнение
  • Замена значения
  • Некорректируемое
  • Информативное
  • Поиск на вводе
  • Замена непустого значения
  • Обязательное

Начнем с конца. Статус «Обязательное» как можно догадаться ставиться на те поля которые подлежат заполнению в обязательном порядке. Пока не заполнено это поле вы даже не сможете сохранить  новую и пустую запись в базе.

«Замена непустого значения» статус который позволяет при слиянии двух одинаковых записей заменять непустые значения в корректируемой записи.

«Поиск на вводе» разрешает пользователю использовать режим предварительного поиска в банке на этапе ввода объекта.

«Информативное» установив этот статус например на фамилию в базе ЛИЦО, вы сможете видеть в дереве объектов не только системные номера, но и непосредственно фамилию человека.

«Некорректируемое»  название говорит само за себя, такое поле нельзя будет корректировать просто так, но можно будет изменить с помощью формул. Полезно например устанавливать такой статус на дату загрузки документов, поле будет заполнено с помощью формулы при загрузке и никто не сможет его случайно удалить.

«Замена значения»  тоже используется при слиянии записей по 3 типу. Таким полям будут присвоены новые значения.

«Автозаполнение» поле вычисляется на основе внутреннего таймера и работает только для полей типа ДАТА и ВРЕМЯ

«Множественное» пожалуй самый полезный статус который разрешает сохранять в одно поле более одного значения.

Формула DELETERECORD

Формула DELETERECORD позволяет удалить запись с определенным системным номером.

В качестве параметров задается конкретная запись, например РГ{345}, второй параметр разрешает  или запрещает удалять связанные отсылки, лучше всегда ставить 1,  будет работать всегда.

В качестве примера можно привести обход стандартного механизма удаления записей. Если пользователям запретить удаление записей, то они все равно смогут ее удалить если у будут использовать  выходную форму с такой формулой:

@r:=MESSAGE(«Запись имеет миллион отсылок, действительно хотите удалить?», @OKCANCEL )
if @r=1 then DELETERECORD(РГ{@SYSNOMER},1);

функция CHECKSYMBOL

функция CHECKSYMBOL позволяет проверить наличие определенных символов в строке, это могут быть как запрещенные символы типа / и ;, а могут быть наборы различных символов.

Синтаксис прост:

@A:=CHECKSYMBOL(«/строка с запрещенным символом»,»/») /*функция вернет 1, так как символ найден*/

@A:=CHECKSYMBOL(«/строка с запрещенным символом»,»;») /*функция вернет 0, так как символ не найден*/

@A:=CHECKSYMBOL(«12.03.1956″,»абвгдежзийклмнопрстуфхцчшщэюя») /*функция вернет 0, так как в дате только цифры*/

String.gmatch

В Lua имеется богатый функционал по работе со строками. Одина из таких функций это gmatch. Предназначена для поиска в тексте по шаблону.

string.gmatch (s, pattern) где s –строка поиска, pattern – шаблон поиска.

В паттернах (шаблонах) применяются следующие правила для замены символов

‘%z’    нулевой символ

‘%s’    любой пробельный символ

‘%l’    буква в нижнем регистре

‘%u’    буква в верхнем регистре

‘%a’    буква

‘%d’    цифра

‘%x’    шестнадцатеричная цифра

‘%w’    буква или цифра

‘%p’    любой символ пунктуации

‘%с’    управляющий символ

Пример:

s=«Сидоров Иван Петрович «

for str in string.gmatch (s,«%u») do – Будут найдены все заглавные буквы в тексте

FIO=FIO..str.. «.»

end – результат работы FIO = «С.И.П.»

Помимо этого существуют еще управляющие символы

‘%’    экранирование или придание специального смысла

‘.’    любой символ

‘^’    начало строки

‘$’    конец строки

‘(…)’    группа

‘%d’    (d — цифра) группа с номером d

‘*’    0 или больше символов

‘-‘    0 или больше символов (кратчайшее соответствие)

‘+’    1 или больше символов

‘?’    0 или 1 символ

‘[…]’    множество символов

‘[^…]’    отрицание множества символов

Используя эти символы можно эффективно выделять типовые блоки в тексте, например следующая конструкция

«%u%l+[%s]+%u%l+[%s]+%u%l+» выделяет в тексте три слова разделенные пробелами, каждое из которых начинается с большой буквы. Под этот шаблон могут попадать как ФИО, так и некоторые организации. А если видоизменить этот шаблон и в конце поставить окончание характерное для мужских отчеств, то с определенной долей уверенности можно говорить о поиске лиц в тексте «%u%l+[%s]+%u%l+[%s]+%u%l+вич».


а, тем кто хочет расширить свой кругозор рекомендую ознакомиться со слудующим материалом
ru.wikipedia.org/wiki/Regexp

управлять данными легко