Примеры скриптов
Содержание:
Заполнение и отображение полей
Работа с договорами и документами
Внешний вид (подсветка полей, изменение фона и т.п.)
======
Задача: передать даты периода в запрос.
Решение:
| 1. | Задать начало и конец периода (в пользовательской форме через GlobalVar). |
| 2. | Получить значения в VBScript и ввести в запрос. |
Текст кода:
public VBStr1, VBStr2
Sub ViewOnSetVBStr ''
VBStr1 = GetGlobalVar ("BegDate")
VBStr2 = GetGlobalVar ("EndDate")
End Sub
В запросе на закладке WHERE необходимо ввести: Документ.Дата between ^VBStr1^ and ^VBStr2^
======
Задача: организовать с помощью VBScript сортировку итоговых данных.
Решение:
| 1. | В форме выбирается порядок сортировки. |
| 2. | Это значение с помощью GlobalVar передается в VBScript. |
| 3. | В VBScript значение получается и обрабатывается. |
Текст кода:
'выборочное цитирование кода
Itogi = GetGlobalVar("SOS_Itogi")
Select Case Itogi
Case "Общие итоги" OrderStr = ""
Case "Подразделение" OrderStr = "Подразделение"
Case "Вид ОС" OrderStr = "Вид"
Case "Отв. лицо" OrderStr = "МОЛ"
Case "Группа ОС" OrderStr = "[Группа ОС]"
Case "Подразделение, вид ОС" OrderStr = "Подразделение, вид"
Case "Подразделение, отв.лицо" OrderStr = "Подразделение, МОЛ"
Case "Подразделение, группа ОС" OrderStr = "Подразделение, [группа ОС]"
End Select
В результате работы скрипта имеется список полей, по которым надо проводить сортировку.
В запросе на закладке SQLAfter необходимо ввести: order by ^OrderStr^
Заполнение и отображение полей
======
Задача: в реквизитах договора в поле Способ оплаты отображать список валют, в которых может быть произведен платеж.
Решение: написать текст кода в VBScript карточки договора.
Текст кода:
Sub FormOnShow 'при открытии формы редактирования
SposobOplatyEdit.ComboType = "SQL в ComboItems"
SposobOplatyEdit.ClearComboItems
SposobOplatyEdit.Comboitems.Add("SELECT DISTINCT Название FROM Валюта")
SposobOplatyEdit.LoadComboItems
End Sub
======
Задача: заполнять автоматически поле [Сумма] в спецификации при заполнении/редактировании полей с ценой и количеством
Решение: написать текст кода в VBScript карточки спецификации.
Текст кода:
Sub KolEditOnChange 'Количество'
SumEdit.Value = KolEdit.Value * CenaEdit.Value 'Сумма = Кол-во * Цена
End Sub
Sub CenaEditOnChange 'Цена'
SumEdit.Value = KolEdit.Value * CenaEdit.Value
End Sub
======
Задача: заполнять автоматически поле [Сумма руб.] в спецификации при заполнении поля [Сумма] (в USD); заполнение производить по курсу на текущую дату.
Решение: написать текст кода в VBScript карточки спецификации.
Текст кода:
Sub SumEditOnChange 'Сумма'
SummaRubEdit.Value = GetValueFromSQL("SELECT dbo.[Конвертация валюты] (" + intToStr(Val1Edit.Value) + ", " + intToStr(rubcode)+ ", " + FloatToStr(SumEdit.Value) + " , " + DateAsSQL(DateEdit.Value) + ", 'ЦБ')")
End Sub
Sub Val1EditOnChange 'Валюта1'
SummaRubEdit.Value = GetValueFromSQL("SELECT dbo.[Конвертация валюты] (" + intToStr(Val1Edit.Value) + ", " + intToStr(rubcode)+ ", " + FloatToStr(SumEdit.Value) + " , " + DateAsSQL(DateEdit.Value) + ", 'ЦБ')")
End Sub
Sub Val2EditOnChange 'Валюта2'
SummaRubEdit.Value = GetValueFromSQL("SELECT dbo.[Конвертация валюты] (" + intToStr(Val1Edit.Value) + ", " + intToStr(rubcode)+ ", " + FloatToStr(SumEdit.Value) + " , " + DateAsSQL(DateEdit.Value) + ", 'ЦБ')")
End Sub
========
Задача: включать/отключать видимость и доступность полей.
Текст кода:
PostEdit.Enabled=False 'поле недоступно
PostEdit.Visible=False 'поле невидимо
PostEdit.Enabled=True 'поле доступно
PostEdit.Visible=True 'поле видимо
======
Задача: при открытии окна Прайс-лист автоматически открыть требуемый прайс-лист.
Решение: открыть редактор скрипта для прайс-листа и на свойство PriceFormShow добавить приведенный ниже код.
Текст кода:
Sub PriceFormShow ''
PriceListEdit.Value="[3]основной" 'Указать значение поля [Номер и Название] прайс-листа.
End Sub
======
Задача: вставить цену из прайс-листа в спецификацию.
Решение: <...где помещать текст кода?...>
Текст кода:
Sub Subconto1EditOnChange
CenaEdit.Value=GetValueFromSQL("SELECT TOP 1 Цена FROM [Базовая цена ТМЦ] WHERE ТМЦ="+CSTR(Subconto1Edit.Value)+"AND [Базовая цена]='Основная' ORDER BY Дата DESC")
End Sub
======
Задача: заполнить поле субконто 1 в спецификации значением из поля Получатель из шапки Договора или Документа.
Решение: написать текст кода в VBScript карточки спецификации договора/документа.
Текст кода:
Sub FormAfterNewData 'Автоподстановка плательщика в субконто спецификации'
Subconto1Edit.SubcontoType=Form.OwnerForm("PolEdit").SubcontoType
if IsEmptyRef(Form.OwnerForm("PolEdit").Value)=false then
Subconto1Edit.Value=Form.OwnerForm("PolEdit").Value
else
bmInformation("Не указан плательщик!")
Subconto1Edit.Value=249
end if
End Sub
======
Задача: узнать тип субконто в карточке редактирования или назначить тип субконто.
Текст кода (обращение к типу субконто):
Subconto1Edit.SubcontoType='Орг'
Работа с документами и договорами
======
Задача: запретить копирование записей (например, документов).
Решение: написать текст кода в VBScript списка записей (например, списка документа).
Текст кода:
Sub FormOnAfterCopy(TableName, SourceID, DestID) ''
MsgBox "OOPS!"
End Sub
'-------------------------------------------------------------------------------
Sub FormOnBeforeCopy(ByRef TableName, SourceID, IsContinue) ''
MsgBox "OOPS!"
IsContinue=False 'Если IsContinue=False - копирование запрещено.
End Sub
======
Задача: при сохранении договора проводится создание документа, по спецификациям этого договора.
Как сделать так, чтобы документы не пересоздавались, если при редактировании в договоре изменены поля, от которых документы не меняются.
Текст кода:
' процедура инициирует служебную переменную = кол-ву измененных догспец
Sub FormOnShow ''
SpecChanged=0
End Sub
' Значение служебной переменной заполняется кол-вом измененных догспец.
Sub FormBeforeSaveData ''
SpecChanged=GetValueFromSQL("Select Count(*) From #Догспец Where Status>0")
End Sub
' Процедура, проверяющая изменения важных полей формы редактирования договора и измененния в спецификациях
Sub FormAfterSaveData ''
If SpecChanged=0 and _
PostEdit.Value=PostEdit.InitValue and _
PolEdit.Value=PolEdit.InitValue and _
((Data_1.Value="0:00:00" and Data_1.InitValue="01.01.1900") or Data_1.Value=Data_1.InitValue) and _
........................
((Data_14.Value="0:00:00" and Data_14.InitValue="01.01.1900") or Data_14.Value=Data_14.InitValue) and _
Priznak_1.Value=Priznak_1.InitValue and _
........................
Priznak_14.Value=Priznak_14.InitValue Then
Exit Sub //Если ничего существенного не было изменено - выходим из процедуры и не создаем документы заново
end if
[Далее процедура создания документов]
End Sub
======
Задача: вывод информации по долгам клиента во время редактирования договора (документа):
Решение: написать текст кода в VBScript карточки договора/документа. Запуск процедуры надо включить в события FormAfterLoadData, PolEditOnChange
Текст кода:
Sub ShowClientInfo
DepositRub=GetValueFromSQL("SELECT ISNULL((SELECT Значение FROM Остаток WHERE [Юр.лицо]=1 AND Вид=3 AND Субконто="+PolEdit.ValueAsSQL+"),0)")
if DepositRub<0 then
PolNote.Caption="Депозит "+CStr(-DepositRub)+" руб."
PolNote.Font.Color=clBlue
else
if DepositRub>0 then
PolNote.Caption="Долг "+CStr(DepositRub)+" руб."
PolNote.Font.Color=clRed
end if
end if
End Sub
======
Задача: контроль пустых полей в шапке договора.
Решение: написать текст кода в VBScript карточки договора.
Текст кода:
Sub PostEditOnValidate(ByRef IsValid, ByRef NoValidMessage) 'Поставщик'
if VarType(PostEdit.Value)=0 or (VarType(PostEdit.Value)=3 and PostEdit.Value=0) then
NoValidMessage="Поставщик не может быть пустым"
MsgBox(NoValidMessage)
end if
End Sub
======
Задача: создать/отредактировать бизнес-операции для вида документа.
Решение:
| 1. | Открыть карточку редактирования документа. |
| 2. | Открыть редактор скрипта и добавить туда приведенный ниже код (приведенный код позволяет изменить ставку НДС в отмеченных документах). |
Текст кода:
Sub FormGetBizOperList(ByRef List) ''
List = "НДС 18; Пересчет для НДС=18%" + Chr(13) + _
"НДС 10; Пересчет для НДС=10%"
End Sub
Sub FormRunBizOper(BizOper) ''
Select Case BizOper
Case "НДС 18"
ExecuteSQL ("UPDATE Докспец SET [НДС]=18 WHERE Документ=" + IntegerAsSQL(Form.RecordID))
ExecuteSQL ("EXEC [Пересчет спецификаций документа от суммы] " + IntegerAsSQL(Form.RecordID)+"")
Case "НДС 10"
ExecuteSQL ("UPDATE Докспец SET [НДС]=10 WHERE Документ=" + IntegerAsSQL(Form.RecordID))
ExecuteSQL ("EXEC [Пересчет спецификаций документа от суммы] " + IntegerAsSQL(Form.RecordID)+"")
Case Else MsgBox "Неизвестная бизнес-операция: " + BizOper
End Select
End Sub
======
Задача: создать документы на основании договора посредством бизнес-операций.
Решение:
| 1. | Открыть карточку редактирования документа. |
2. Открыть редактор скрипта и добавить туда приведенный ниже код (позволяет запустить SQL-процедуру по созданию документов на списание комплектующих).
Текст кода:
Sub FormGetBizOperList(ByRef List) ''
List = "Создание док 21; Списание комплектующих"
End Sub
Sub FormRunBizOper(BizOper) ''
Select Case BizOper
Case "Создание док 21" EXECUTESQL ("EXEC [_Создание документа 21] " + IntegerAsSQL(Form.RecordID))
Case Else MsgBox "Неизвестная Бизнес операция: " + BizOper
End Select
End Sub
Внешний вид (подсветка полей, изменение фона и т.п.)
======
Задача: подсветить строку в списке договоров.
Решение: написать текст кода в VBScript запроса по списку договоров.
Текст кода для смены окраски строки с крупным заказом:
Sub ViewOnSetColor(Column, ByRef Color) ''
if View("Сумма")>=20000 then Color = 9104422 end if
End Sub
Текст кода (вторая часть) для смены цвета в поле Получатель для клиентов определенного вида:
Sub ViewOnSetFont(Column, ByRef Font) ''
if View("Вид клиента")=2 and Column = "Получатель" then
font.color = 255
font.style = 1 'Значения, которые может принимать font.style, приведены ниже.
end if
End Sub
Значения, которые может принимать font.style:
0 - обычный шрифт (по умолчанию);
1 - жирный;
2 - курсив;
3 - жирный курсив;
4 - подчеркнутый;
5 - подчеркнутый жирный;
6 - подчеркнутый курсив;
7 - подчеркнутый жирный курсив;
8 - зачеркнутый;
9 - зачеркнутый жирный.
======
Программное управление выполнением запроса по Сальдо/Оборот.
Предположим, что есть пользовательская форма с полями ввода OrgEdit, DateEdit, ValEdit, таблицей(TbuhtaGrid) с именем Grid и запросом с именем View
Grid.ClearNodes;
View.Close;
Период для Сальдо/Оборот задается при помощи параметров 'BegDate' и 'EndDate'
View.Param.Values['BegDate'] := DateEdit.Value;
View.Param.Values['EndDate'] := DateEdit.Value;
Если параметры 'BegDate' и 'EndDate' не заданы, произойдет запрос периода через стандартный диалог.
Параметры должны быть именно не заданы(опущены), нельзя использовать View.Param.Values['BegDate'] := 0; и View.Param.Values['EndDate'] := 0;
View.Param.Values['СальдоВалюта'] := 'Одна';
View.Param.Values['СальдоВалюта значение'] := ValEdit.Value;
View.Param.Values['СальдоСчет'] := 'Список';
View.Param.Values['СальдоСчет список'] := '62,62/1';
View.Param.Values['СальдоСчет Субсчета'] := True;
View.Param.Values['СальдоСубконто 1 тип'] := 'Один';
View.Param.Values['СальдоСубконто 1 значение тип'] := 'Орг';
View.Param.Values['СальдоСубконто 1'] := 'Один';
View.Param.Values['СальдоСубконто 1 значение'] := OrgEdit.Value;
Grid.LoadData;
Результат выполнения запроса зависит от состава его полей. Так, если в запросе задействовано поле [Субконто 2], то возможно лишь выбрать конкретное значение или список значений,
View.Param.Values['СальдоСубконто 2 тип'] := 'Все';
View.Param.Values['СальдоСубконто 2 список тип'] := 'Дог';
View.Param.Values['СальдоСубконто 2'] := 'Все';
View.Param.Values['СальдоСубконто 2 список'] := '5343, 5244';
но "свернуть" суммы по всем субконто, указав View.Param.Values['СальдоСубконто 2'] := 'Нет' - нельзя.