Формально логический контроль

Добрый день, уважаемые коллеги!
При вводе данных на рабочем листе есть возможность проверить вводимые значения посредством проверочных форматов. К сожалению, штатная проверка RDR не покрывает изобретательность каталогизаторов.
При этом, в одном поле можно допустить сразу несколько ошибок. Но при этом, в лоб задача не решается:

if &uf(‘+960*0.1#’,v10)=’ ‘ then ‘1Уберите пробел в начале Фамилии.’ else ‘0’ fi, if &uf(‘+961*0.1#’,v10)=’ ‘ then ‘1Уберите пробел в конце Фамилии.’ else ‘0’ fi,
Почему? Потому что ‘Иванов’ вернет ’00’, а ‘ Иванов ‘ выдаст ‘1Уберите пробел в начале Фамилии.1Уберите пробел в конце Фамилии.’
Что совсем не укладывается в заданный стандарт.
Задачу можно решить в лоб:
Вложенные условия, когда второе условие проверяется только если первое должно было вернуть ‘0’
Но если у нас пять условий? Или механизм проверки и возвращаемое сообщения тоже сложносоставные? Код становится сложночитаемым (или вообще нечитаемым).
В основу предлагаемого решения заложены принципы разделения логики, и максимально возможная в рамках форматного языка ИРБИСА, модульность.
Для этого построим формат на переменных.
300 — входные данные,
200 — выходные данные
101,102,…,N — переменные результата отдельного условия.
Логически формат разделяется на четыре части:
Блок входных данных;
Блок проверки условий;
Блок выбора выходной строки;
Блок вывода строки.
С первым и последним блоком всё понятно.
Третий блок сформирован так, чтобы можно было скопировать пару условий, вставить, и просто сменить номер переменной.
Во втором блоке, при увеличении количества проверок, тоже нужно скопировать-вставить строку и поменять номер соответствующей переменной.
Потом уже прописывать условие, оперируя переменной 300 (Полезно, в случае схожих применений, например для полей 11 и 12 логично использовать этот формат с минимальной правкой.
Но самое интересное, это добавление дополнительных условий к существующим ФЛК-форматам.
Вставляем в шаблон исходный формат 21 поля, для идентичности исходному, заворачиваем вывод в переменную 101, и добавляем рядом свои.
Если предположить, что дополнительные условия вносятся через вложенные if, то не допустить ошибку и понять в дальнейшем чтоже пошло не так, будет в разы сложнее.
P.S. Шаблон в текстовом виде:
&uf(‘+7W300#’,v10), &uf(‘+7W200#’,’0′), if &uf(‘+960*0.1#’,&uf(‘+7R300′))=’ ‘ then &uf(‘+7W101#’,’1Уберите пробел в начале Фамилии.’) else &uf(‘+7W101#’,’0′) fi, if &uf(‘+961*0.1#’,&uf(‘+7R300′))=’ ‘ then &uf(‘+7W102#’,’1Уберите пробел в конце Фамилии.’) else &uf(‘+7W102#’,’0′) fi, if &uf(‘+960*0.1#’,&uf(‘+7R101′))=’1’ then &uf(‘+7W200#’,&uf(‘+7R101’)) fi, if &uf(‘+960*0.1#’,&uf(‘+7R101′)) =’2’ and &uf(‘+960*0.1#’&uf(‘+7R200′)) <>’1’ then &uf(‘+7W200#’, &uf(‘+7R101’)) fi if &uf(‘+960*0.1#’,&uf(‘+7R102′))=’1’ then &uf(‘+7W200#’,&uf(‘+7R102’)) fi, if &uf(‘+960*0.1#’,&uf(‘+7R102′)) =’2’ and &uf(‘+960*0.1#’&uf(‘+7R200′)) <>’1’ then &uf(‘+7W200#’, &uf(‘+7R102’)) else fi &uf(‘+7R200’)
Редактировано 1 раз. Последний раз 17.01.2019 13:55 пользователем levaleva.

Формально логический контроль

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *