Отдел технической поддержки
+7(929) 90-77-500
help@profsegment.ru


дата обновления 08.06.2023
 

 

Вводная часть

 

Установка программы (версии: ОРБИТА, СПУТНИК, МЕНЕДЖЕР)

 

Новшества ПрофСтрой 4

 

Операции

 

Настройки

 

Ценообразование

 

Каталоги

 

Конструктив

 

Оформление заказов

 

Групповые оптимизации раскроя

 

Генератор отчетов

 

Просмотр отчетов

 

Вид мрамор

 

Перевод

 

Помощь

 

Корпоративная версия с кабинетами дилеров

 

Первичная настройка

 

Модуль AutoCAD

 

Модуль МС

 

Склад

 

Модуль мультиформатной поддержки (1С)

 

Модуль - базовый CRM

 

Модуль склада готовой продукции

 

Архив новостной рассылки

"Программируемые циклы"

Использование

Для программы поставляется набор предопределенных отчетов: по проекту, по изделиям в проекте, по спецификациям, по результатам раскроя, контрагентам, по тарифу, по состоянию складов и по накладным. Для производства, заказчика и склада этого вполне достаточно. Но на предприятиях часто встают три задачи:

  • изменение вида/стиля документа - для этого достаточно исправить исходный текст отчета, применяя Html и подставляемые поля из мастера кода;
  • составление отчетов на основании таблиц базы данных - здесь потребуется применение программируемых циклов, знание структуры нужных таблиц, а также синтаксис простых команд SQL;
  • составление статистических отчетов - здесь применяются формы запросов по периоду и выделенным проектам.

Использование программируемых 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:

Тип отчетаИндекc1Индекс2+
проектListPrj.pUnic0
изделиеListOrd.pUnicListOrd.oNumb
спецификация (проект)ListPrj.pUnic0
спецификация (изделие)ListOrd.pUnicListOrd.oNumb
составыListOrd.pUnicListOrd.oNumbSpecPau.nEL
резерв по проектуListPrj.pUnicPrefPrj.sUnic
мат. ценностиGrupArt.mUnic0
оптимизация.профилиListPrj.pUnic0
оптимизация.раскройListPrj.pUnic0
состояния складовSklName.sUnic0
накладнаяNaklads.nUnic0
прайс-листPricLst.pUnic0

Передача индекса в цикл осуществляется простой подстановкой:
~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:Конец~

Передача полей

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

Параметры именуются названиями полей в зависимости от формы вызова:

Форма вызоваТаблица.ПолеПараметр.ТипОписание
валютыCorrenc.cNumb
Correnc.cName
сNumb.AsInteger
cName.AsString
Индекс валюты
Название валюты
текстурыColsLst.cNumb
ColsLst.cName
сNumb.AsInteger
cName.AsString
Индекс текстуры
Название текстуры
группы_мцGrupArt.mUnic
GrupArt.mName
mUnic.AsInteger
mName.AsString
Индекс группы
Название группы
мат.ценностиArtikls.aNumb
ArtsVst.clNum
aNumb.AsString
clNum.AsInteger
Артикул
Индекс текстуры
источники_заказовReklama.kRekl
Reklama.kRekN
kRekl.AsInteger
kRekN.AsString
Индекс рекламы
Название рекламы
контрагентыClients.kNamekName.AsStringКонтрагент
работыWorkLst.wUnic
WorkLst.wName
wUnic.AsInteger
wName.AsString
Индекс работы
Наименование
бригадыBrigads.bUnic
Brigads.bName
bUnic.AsInteger
bName.AsString
Индекс бригады
Название бригады
складыSKLspec.sUnic
SKLspec.aNumb

SKLspec.clNum
SKLspec.clNu1
SKLspec.clNu2
sUnic.AsInteger
aNumb.AsString

clNum.AsInteger
clNu1.AsInteger
clNu2.AsInteger
Индекс склада
Артикул
Индексы текстур:
Основная
Внутренняя
Внешняя
остатки (обрезь)Remains.aNumb

Remains.clNum
Remains.clNu1
Remains.clNu2
aNumb.AsString

clNum.AsInteger
clNu1.AsInteger
clNu2.AsInteger
Артикул
Индексы текстур:
Основная
Внутренняя
Внешняя
групповые раскроиOptimRS.aNumb
OptimRS.aTypM

OptimRS.clNum
OptimRS.clNu1
OptimRS.clNu2
aNumb.AsString
aTypM.AsInteger

clNum.AsInteger
clNu1.AsInteger
clNu2.AsInteger
Артикул
Тип артикула
Индексы текстур:
Основная
Внутренняя
Внешняя

Передача индекса в цикл осуществляется простой подстановкой параметра:
~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>

Выходной отчет будет иметь примерный вид:

Группа мат. ценностей : Основная

АртикулНазваниеЕд.изм.Валюта
132Импостпог.м.$
707Рама стандартпог.м.$
4 x 10 x 4 x 10 x 4Стеклопакет 32 мм (стандарт)кв.м.$


Примеры

Приводим примеры построения программируемых 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"):
  1. Необходимо указавать явно таблицу для одноименных полей в связанных запросах. Например, поле индекса проекта pUnic есть в таблице проектов ListPrj и в таблице изделий ListOrd.
    В третьей версии запрос   SELECT pUnic,zNumb,oNumb FROM ListPrj,ListOrd WHERE ListPrj.pUnic=ListOrd.pUnic ORDER BY zNumb,oNumb   нормально выполнялся, а в 4-й версии выдаст ошибку SQL.
    Для 4-й версии необходимо дополнить запрос:   SELECT ListPrj.pUnic,zNumb,oNumb FROM ListPrj,ListOrd WHERE ListPrj.pUnic=ListOrd.pUnic ORDER BY zNumb,oNumb  

  2. Двойные кавычки в 3-м диалекте являются обычным символом строки и не могут служить оформлением срок в SQL запросах.
    Запросы для выборки типа   SELECT aName FROM Artikls WHERE aNumb="554001"
    Необходимо переделать в   SELECT aName FROM Artikls WHERE aNumb='554001'