|
Отдел технической поддержки дата обновления 08.06.2023 |
|
"Программируемые циклы"ИспользованиеДля программы поставляется набор предопределенных отчетов: по проекту, по изделиям в проекте, по спецификациям, по результатам раскроя, контрагентам, по тарифу, по состоянию складов и по накладным. Для производства, заказчика и склада этого вполне достаточно. Но на предприятиях часто встают три задачи:
Использование программируемых SQL циклов позволяет произвести любую выборку данных независимо от ограниченных возможностей предопределенных циклов. Структура базы данныхОткрытую структуру базы данных программы можно посмотреть в окне мастера кода на дополнительной вкладке (странице).Команды SQL запросовДля выборки данных пользователю потребуется одна команда SELECT, имеющая формат:SELECT поле1,поле2,поле3… // выбрать поля FROM таблица // из таблицы WHERE условия // условия выборки ORDER BY поле1,поле2 // упорядочить по полям Примеры// выбрать артикулы и название профилей и заполнений из мат. ценностей// упорядочить по артикулу SELECT aNumb,aName FROM Artikls WHERE (aTypM=1)OR(aTypM=5) ORDER BY aNumb // выбрать артикулы и название профилей типа' коробка' // упорядочить по артикулу SELECT aNumb,aName FROM Artikls WHERE (aTypM=1)AND(aTypP=1) ORDER BY aNumb // выбрать все поля из мат. ценностей, упорядочить по названию SELECT * FROM Artikls ORDER BY aName // выбрать артикулы, входящие в спецификации без повторений SELECT DISTINCT aNumb FROM SpecPAU // вывести в одном запросе артикулы мат.ценности с названиями основной // текстуры (связанный запрос по таблицам тарифа мат.ценностей и текстур) SELECT aNumb,cName FROM ArtsVst,ColsLst WHERE (ArtsVst.clNum=ColsLst.cNumb) // выбрать проекты (номер проекта, суффикс, номер заказа, дата регистрации), // для которых определен контрагент (заказчик), упорядочить по номеру проекта SELECT pNumb,pNum2,zNumb,pDate FROM ListPrj // выбрать проекты, отправленные в производство SELECT pNumb,pNum2,zNumb,pDate FROM ListPrj WHERE pWork=1 // выбрать завершенные проекты SELECT pNumb,pNum2,zNumb,pDate FROM ListPrj WHERE pWork=2 // обновить пользовательское поле проекта для индикации красным кружком // для проектов, отправленных в производство и статус 'согласован' UPDATE ListPrj SET pFlag=255 WHERE (pWork=1)AND(pStat='согласован') К СВЕДЕНИЮ Описание синтаксиса команд SQL для изменения и удаления данных в состав данного руководства пользователя и техническую поддержку не входит. Команды циклов SQLВ генератор отчетов определены пять программированных цикла SQLn : SQL1, SQL2, SQL3, SQL4, SQL5.Форматы команд:~SQLn:УСТАНОВИТЬ:команды_sql~ <!-- инициализация запроса и установка первой строки запроса -->~SQLn:ДОБАВИТЬ:команды_sql~ <!-- добавление строк в запрос SQL --> ~SQLn:НАЧАЛО~ <!-- начало цикла --> ~SQLn:поле:тип~ <!-- вывод в отчет поля по типу --> ~SQLn:поле:тип:параметр~ <!-- ввод параметра и присвоение ему значения поля по типу --> ~SQLn:ВЫХОД~ <!-- принудительное завершение цикла --> ~SQLn:КОНЕЦ~ <!-- конец цикла --> Специальные типы мат.ценностейПри обращении к полям артикула и текстуры с помощью циклов появляются новые возможности вывода в отчет следующих свойств мат. ценностей:~SQLn:aNumb:As.Название~ // название артикула ~SQLn:aNumb:As.Ед.Изм.~ // единица измерения артикула ~SQLn:aNumb:As.Тип~ // тип артикула (профили, аксессуары …) ~SQLn:aNumb:As.ПодТип~ // подтип артикула (коробка, створка …) ~SQLn:clNum:As.Текстура~ // название основной текстуры ~SQLn:clNu1:As.Текстура~ // название внутренней текстуры ~SQLn:clNu2:As.Текстура~ // название внешней текстуры ~SQLn:clNum:As.Текстура.Префикс.Основная~ // префикс основн. текстуры ~SQLn:clNu1:As.Текстура.Префикс.Внутренняя ~ // префикс внутр. текстуры ~SQLn:clNu2:As.Текстура.Префикс.Внешняя~ // префикс внешн. текстуры ~SQLn:сNumb:As.Валюта.Название~ // название валюты артикула ~SQLn:сNumb:As.Валюта,Обозначение~ // обозначение валюты ~SQLn:aNumb:clNum:As.Арт№.Склада~ // артикул склада ~SQLn:aNumb:clNum:As.Арт№.1C~ // артикул для 1С Специальные типы доступы и для предопределенных циклов: Спецификация, Склад, Спецификация_накладных ... Для вывода названия пользовательского параметра существует специальный тип: ~SQLn:As.Параметр~. Специальные типы общего назначенияВ практической работе возникает необходимость применять специальные функции для конструктора-проектировщика. Эти функции можно реализовать в исходном тексте отчета, но удобнее иметь уже готовую функцию. К таким функиям относится точный вывод по требуемому формату углов реза ригелей во второй плоскости при проектировании ломаных фасадов:~SQLn:Поле:As.Градусы~ ~SQLn:Поле:As.Градусы.Минуты~ ~SQLn:Поле:As.Градусы.Минуты.Секунды~ Вычисляемые значения мат.ценностейК вычисляемым полям материальным ценностям относятся команды вычисления себестоимости и тарифа материальной ценности по трем составляющим текстурам:~SQLn:aNumb:clNum:clNu1:clNu2:As.Тариф~ // вывод в отчет ~SQLn:aNumb:clNum:clNu1:clNu2:As.Тариф:Цена~ // вывод в параметр ~SQLn:aNumb:clNum:clNu1:clNu2:As.Себестоимость~ // вывод в отчет ~SQLn:aNumb:clNum:clNu1:clNu2:As.Себестоимость:Себестоимость~ // вывод в параметр И более развернутый синтаксис с указанием валюты и кросс-курсов валюты проекта к основной и внутренней валютам: ~SQLn:aNumb:clNum:clNu1:clNu2:ИндВалюты.AsInt:КУРСкОсновной.AsFloat:КУРСкоВнутренней.AsFloat:As.Тариф~ // вывод в отчет ~SQLn:aNumb:clNum:clNu1:clNu2:ИндВалюты.AsInt:КУРСкОсновной.AsFloat:КУРСкоВнутренней.AsFloat:As.Тариф:Цена~ // вывод в параметр ~SQLn:aNumb:clNum:clNu1:clNu2:ИндВалюты.AsInt:КУРСкОсновной.AsFloat:КУРСкоВнутренней.AsFloat:As.Себестоимость~ // вывод в отчет ~SQLn:aNumb:clNum:clNu1:clNu2:ИндВалюты.AsInt:КУРСкОсновной.AsFloat:КУРСкоВнутренней.AsFloat:As.Себестоимость:Себестоимость~ // вывод в параметр Наборная строка - артикул с прибавленными кодами трех текстур: ~SQLn:aNumb:As.Артикул.Текстурный~ // текстурный артикул Для вычисления тарифа и текстурного артикула требуются значения всех трех текстур, поэтому в программируемых SQLn циклах все указанные поля (aNumb,clNum,clNu1,clNu2) должны присутствовать. Подстановка параметраВ цикл можно подставить значение определенного ранее параметра:~SQLn:SELECT … WHERE … поле=:Параметр.Тип: …~ или поля: ~SQLn:SELECT … WHERE … поле=:SQLnField.AsType: …~. Применяется при составлении вложенных циклов, например вывод артикулов по группам материальных ценностей или вывод изделий по проектам. Для типов AsString и AsDate кавычки будут добавлены автоматически ! Следует помнить, что в арифметических операциях и в командах условной проверки `IF:…:THEN:…:ELSE:…:ENDIF` могут использоваться только числовые параметры. Для проверки строковых параметров существует аналогичная команда условной проверки `IFS:…:THEN:…:ELSE:…:ENDIF`. Передача индексовПри вызове отчета из окон программы автоматически передается индекс(ы).В программе предопределены два индекса: Индекс1, Индекс2:
Передача индекса в цикл осуществляется простой подстановкой: ~SQLn:Установить:SELECT … WHERE … поле=:Индекс1.AsInteger: …~. Примеры<!-- пример подстановки индексов в программируемый SQL цикл вывода номера, названия, габаритов и количества изделия -->~SQL1:Установить:SELECT oNumb,oName,oLeng,oHeig,oQtyI~ ~SQL1:Добавить:FROM ListORD WHERE~ ~SQL1:Добавить:(pUnic=:Индекс1.AsInteger:)AND~ // индекс проекта ~SQL1:Добавить:(oNumb=:Индекс2.AsInteger:)~ // номер изделия ~SQL1:Добавить:ORDER BY oNumb~ ~SQL1:Начало~ ... ~SQL1:Конец~ Передача полейПри вызове отчета из окон программ меню 'Ценообразование' , 'Каталоги' и 'Состояния складов' создаются параметры-поля для последующего их использования в процессе формировании отчетов.Параметры именуются названиями полей в зависимости от формы вызова:
Передача индекса в цикл осуществляется простой подстановкой параметра: ~SQLn:Установить:SELECT … WHERE … aNumb=:aNumb.AsString: …~ ~SQLn:Установить:SELECT … WHERE … clNum=:clNum.AsInteger: …~. Примеры<!-- формирование запроса выборки проектов, где использовалась указанная мат. ценность при вызове отчета из окна 'Материальные ценности' -->~SQL1:Установить:SELECT DISTINCT pNumb,pNum2~ ~SQL1:Добавить:FROM ListPrj,SpecPAU~ ~SQL1:Добавить:WHERE (SpecPAU.aNumb=:aNumb.AsString:)~ ~SQL1:Добавить:AND(SpecPAU.clNum=:clNum.AsInteger:)~ ~SQL1:Добавить:AND(ListPrj.pUnic=SpecPAU.pUnic)~ ~SQL1:Начало~ ~SQL1:pNumb:AsInteger~ // номер проекта ~SQL1:pNum2:AsInteger~ // суффикс проекта ~SQL1:Конец~ <!-- Пример вывода артикулов с названиями, ед.изм. и валютой из окна мат. ценностей по выбранной группе мат. ценностей --> <HTML> <HEAD> <TITLE>Вывод мат.ценностей указанной группы</TITLE> <META content="text/html; charset=windows-1251" http-equiv=Content-Type> <META NAME="Generator" CONTENT="ProfSegment WorkShop"> <META NAME="Author" CONTENT="ПрофСтрой"> <META NAME="Keywords" CONTENT="ПрофСтрой"> <META NAME="Description" CONTENT="ПрофСтрой"> </HEAD> <BODY> <!-- вводим параметр 'Группа_МЦ' для проверки в команде IF, если выбраны все группы, то Индекс1=0 ! --> ~Индекс1:AsInteger:Группа_МЦ~ <!-- выводим заголовок - если выбрана конкретная группа, то выводим название этой группы мат. ценностей --> <P align=center> Группа мат. ценностей : ~IF:Группа_МЦ=0:THEN~ВСЕ ~ELSE~ ~SQL1: УСТАНОВИТЬ:SELECT mName FROM GrupArt~ ~SQL1:ДОБАВИТЬ:WHERE mUnic=:Группа_МЦ.AsInteger~ ~SQL1:НАЧАЛО~ ~SQL1:mName:AsString~ <!-- подставляем название группы --> ~SQL1:КОНЕЦ~ ~ENDIF~ </P> <TABLE style="border-collapse: collapse" border=1 bordercolor=#0> <TR> <TD align=center>Артикул</TD> <TD align=center>Название</TD> <TD align=center>Ед.изм.</TD> <TD align=center>Валюта</TD> </TR> <!-- определяем цикл по материальным ценностям --> ~SQL1:УСТАНОВИТЬ:SELECT aNumb,aName,cNumb FROM Artikls~ <!-- если выбрана конкретная группа МЦ, то добавляем условие выборки по этой группе --> ~IF:Группа_МЦ>0:THEN~ ~SQL1:ДОБАВИТЬ:WHERE mUnic=:Группа_МЦ.AsInteger~ ~ENDIF~ ~SQL1:НАЧАЛО~ <TR> <TD>~SQL1:aNumb:AsString~</TD> <TD>~SQL1:aName:AsString~</TD> <TD align=center>~SQL1:aNumb:As.Ед.изм.~</TD> <TD align=center>~SQL1:cNumb:As.Валюта.Обозначение~</TD> </TR> ~SQL1:КОНЕЦ~ </TABLE> </BODY> </HTML> Выходной отчет будет иметь примерный вид: Группа мат. ценностей : Основная
ПримерыПриводим примеры построения программируемых SQL запросов:<!-- вывод без повторений списка фурнитуры, используемой в изделии --> ~SQL1:установить:SELECT DISTINCT fName FROM SaveFur,FurnLst~ ~SQL1:добавить:WHERE (pUnic=:Индекс1.AsInteger:)~ <!-- проект --> ~SQL1:добавить:AND(oNumb=:Индекс2.AsInteger:)~ <!-- изделие --> ~SQL1:добавить:AND(SaveFur.fUnic=FurnLst.fUnic)~ ~SQL1:добавить:ORDER BY fName~ ~SQL1:начало~ ~SQL1:fName:AsString~ <br> ~SQL1:конец~ <!-- вывод фальца створок в изделии --> ~SQL2:установить:SELECT oLeng,oHeig FROM ContOrd~ ~SQL2:добавить:WHERE (pUnic=:Индекс1.AsInteger:)~ <!-- проект --> ~SQL2:добавить:AND(oNumb=:Индекс2.AsInteger:)~ <!-- изделие --> ~SQL2:добавить:AND(fUnic>0)~ <!-- фурнитура --> ~SQL2:начало~ ~SQL2:oLeng:AsFloat~ x ~SQL2:oHeig:AsFloat~ <br> ~SQL2:конец~ <!-- вывод параметров и значений, определенных для изделия --> ~SQL1:установить:SELECT pName,SaveFup.pNumb,SaveFup.zNumb FROM SaveFup,ParList~ ~SQL1:добавить:WHERE (pUnic=:Индекс1.AsInteger:)~ <!-- проект --> ~SQL1:добавить:AND(oNumb=:Индекс2.AsInteger:)~ <!-- изделие --> ~SQL1:добавить:AND(nEL=0)~ <!-- для изделия --> ~SQL1:добавить:AND(SaveFup.pNumb=ParList.pNumb)~ ~SQL1:добавить:AND(SaveFup.zNumb=ParList.zNumb)~ ~SQL1:начало~ ~SQL1:pNumb:AsInteger:параметр~ <!-- индекс параметра --> <!-- получаем название параметра : --> ~SQL2:установить:SELECT pName FROM ParList WHERE~ ~SQL2:добавить:(pNumb=:параметр.AsInteger:)AND(zNumb=0)~ ~SQL2:начало~ ~SQL2:pName:AsString~ = ~SQL1:pName:AsString~ <br> ~SQL2:конец~ ~SQL1:конец~ Работа с внешней базой данныхВ генераторе отчетов ПК "ПрофСтрой 4" есть спецальный программируемый цикл ~SQL9~ для работы с внешней базы данных протокола действий пользователя, используемой функционалом модуля управления взаимоотношениями с клиентами (CRM). Этот цикл имеет такой же синтаксис, как и остальные программируемые циклы. В качестве примера работы с внешней базой данных служит поставляемый макрос "Протокол действий пользователей", регулярно обновляемый в связи с регулярным вводом и обработкой новых системных событий.ВАЖНАЯ ИНФОРМАЦИЯ ПК "ПрофСтрой 4" работате в СУБД FireBird 2.5 SQL dialect 3. Имеется несколько отличий в требованиях синтаксиса SQL-запросов 3-го диалекта по сравнению 1-м, но важно знать два (особенно для пользователей, переходящих на "ПрофСтрой 4" с предыдущей версии - "ПрофСтрой 3"):
|