Скриптовый движок

15 views
Skip to first unread message

Vladimir

unread,
Sep 14, 2011, 9:30:58 AM9/14/11
to qbalance
Предлагаю развивать движок от простого к сложному. Сначала создадим
типовые проводки для обслуживания такого бизнес-процесса:
1. Закупка товара у поставщика
2. Передача товара в продажу, наценка
3. Реализация товара за наличный расчет
4. Сдача выручки на расчетный счет
5. Перечисление денег поставщику
Создадим простейший движок, который обслуживает эти проводки.
Документируем функции движка в руководстве разработчика, а пример
бизнес-процесса описываем в руководстве пользователя.

Vladimir

unread,
Sep 14, 2011, 9:47:36 AM9/14/11
to qbalance
Примеры скриптов из программы-прототипа (на Visual FoxPro).

1. Закупка товара у поставщика:
******************************************************************
LOCAL nQuan
DO CASE
CASE cColumnName = "P1.КОЛ" .OR. cColumnName = "P1.ЦЕНА"
Таблица.P1.SetValue("СУММА", Таблица.P1.GetValue("КОЛ") *
Таблица.P1.GetValue("ЦЕНА"))
CASE cColumnName = "P1.СУММА"
nQuan = Таблица.P1.GetValue("КОЛ")
IF nQuan <> 0
Таблица.P1.SetValue("ЦЕНА", Таблица.P1.GetValue("СУММА") / nQuan)
ELSE
Таблица.P1.SetValue("СУММА", 0)
ENDIF
ENDCASE
Документ.Комментарий = Справочники.Организации.Имя
lResult = .T.
******************************************************************

2. Передача товара в продажу:
******************************************************************
LOCAL nQuan1, nPrice1, nPrice2, nTotQuan1, nTotSaldo1, nTotSaldo2
WITH Таблица
nQuan1 = .P1.GetOldValue("КОЛ")
nTotQuan1 = .Кр40.КонКол + nQuan1
nTotSaldo1 = .Кр40.КонСальдо + .P1.GetOldValue("СУММА")
nPrice2 = .Набор1.GetValue("ТОВАР_ЦЕНА")
nPrice2 = IIF(ISNULL(nPrice2), 0, nPrice2)
IF (nQuan1 = .P1.Кол) .OR. nPrice2 = .P2.Цена .OR. .P2.Цена =
0 && Перемещение еще не введено или введено, но цена эта же
nQuan1 = .P1.Кол
nPrice1 = nTotSaldo1 / nTotQuan1
.P1.Цена = nPrice1
.P1.Сумма = nPrice1 * nQuan1
.P2.Кол = nQuan1
.P2.Сумма = nQuan1 * .P2.Цена
IF nQuan1 > nTotQuan1
MESSAGEBOX(" Остаток ОТРИЦАТЕЛЬНЫЙ. ", 48, "Внимание!")
ENDIF
GO (.CurrentRecord) IN (.Alias)
=Zakaz(.Набор1.GetValue("КОД_ТОВАР"), nQuan1)
lResult = .T.
ELSE
MESSAGEBOX("Запрещено изменять строку, т.к. цена товара после
создания этой строки была изменена. Изменение может привести к
неверному вычислению сальдо.", 16, "Ошибка!")
lResult = .F.
ENDIF
ENDWITH
*********************************************************************

3. Реализация за наличный расчет:
*********************************************************************
LOCAL nQuan1, nPrice1, nTotQuan1, nTotSaldo1, nTotSaldo2
lResult = .F.
WITH Таблица
nQuan1 = .P1.GetOldValue("КОЛ")
IF .P1.Кол >= 0 .OR. oApp.IsSA
nTotQuan1 = .Кр411.КонКол + nQuan1
nTotSaldo1 = .Кр411.КонСальдо + .P1.GetOldValue("СУММА")
nTotSaldo2 = -.Дб421.КонСальдо + .P2.GetOldValue("СУММА")
nPrice1 = .Набор1.GetValue("ТОВАР_ЦЕНА")
IF ISNULL(nPrice1) .OR. nPrice1 = 0
MESSAGEBOX("Нельзя продавать товар, т.к. ЦЕНА НЕ ОПРЕДЕЛЕНА .",
48, "Внимание!")
nPrice1 = 0
ENDIF
IF .P1.Кол <> 0 .AND. .Набор1.GetValue("АДРЕС_ИМЯ") = "Брак"
IF MESSAGEBOX("Продать товар из брака?", 256 + 32 + 4, "Внимание!")
= 7
.P1.Кол = 0
ENDIF
ENDIF
IF .P1.Кол <> 0 .AND. .Набор1.GetValue("АДРЕС_ИМЯ") = "0"
IF MESSAGEBOX("Продать товар из нового прихода?", 256 + 32 + 4,
"Внимание!") = 7
.P1.Кол = 0
ENDIF
ENDIF
IF nTotQuan1 <> 0
IF nQuan1 = 0 .OR. nPrice1 = .P1.Цена && Продажа еще не
введена или введена, но цена эта же
nQuan1 = .P1.Кол
.P1.Цена = nPrice1
.P1.Сумма = nPrice1 * nQuan1
.P2.Сумма = nQuan1 * nTotSaldo2 / nTotQuan1
IF nQuan1 > nTotQuan1
MESSAGEBOX(" Остаток ОТРИЦАТЕЛЬНЫЙ. ", 48,
"Внимание!")
ENDIF
.P3.Сумма = Скидки() && Посчитаем скидки
GO (.CurrentRecord) IN (.Alias)
=Zakaz(.Набор1.GetValue("КОД_ТОВАР")) && Включим товар в
заказ
lResult = .T.
ELSE
MESSAGEBOX("Запрещено изменять строку, т.к. цена товара
после создания этой строки была изменена. Изменение может привести к
неверному вычислению сальдо.", 16, "Ошибка!")
ENDIF
ENDIF
ELSE
MESSAGEBOX("ЗАПРЕЩЕНО ВВОДИТЬ ОТРИЦАТЕЛЬНУЮ ПРОДАЖУ!
Необходимо оформить возврат товара от покупателя.", 16, "Ошибка!")
ENDIF
ENDWITH
*********************************************************************


Все эти скрипты срабатывают при изменении содержимого колонок КОЛ,
ЦЕНА, СУММА в любой строке соответствующего документа.


Vladimir

unread,
Sep 17, 2011, 1:53:50 AM9/17/11
to qbalance
Хорошо бы, чтобы код скрипта у нас выглядел примерно так:

p2.сумма = p1.кол * номенклатура.рознцена - p1.сумма

Это пример скрипта для операции "Поступление товара от
поставщика" (проводки 41.1/60, 41.1/42), в котором вычисляется наценка
при приходовании товара.

villager

unread,
Sep 17, 2011, 5:23:25 AM9/17/11
to qbalance
Сильно смущает примеры на фоксе :)
хотелось бы уточнить по скрипту - будет использоваться QtScript?

по любому, скрипты упираются в объектную модель системы
для счастья нужен доступ к БД, элементам экрана, настройкам из скрипта

villager

unread,
Sep 18, 2011, 2:05:08 PM9/18/11
to qbalance
случайно наткнулся на обсуждение скриптов

http://www.prog.org.ru/topic_18494_0.html

есть там пара ссылок на открытые проекты

trdm

unread,
Sep 18, 2011, 2:11:31 PM9/18/11
to qbalance
On 14 сен, 17:30, Vladimir <MorozovVladi...@mail.ru> wrote:
> Предлагаю развивать движок от простого к сложному. Сначала создадим
> типовые проводки для обслуживания такого бизнес-процесса:
Скрипты безусловно нужны.
А на какой базе их создавать? Какой скриптовый движек взять?

Vladimir

unread,
Sep 19, 2011, 1:10:33 AM9/19/11
to qbalance
Под скриптовым движком я (не знаю, как другие) понимаю объектное
окружение, в котором выполняется скрипт на Qt Script. Очевидно, что
нужны объекты-посредники между скриптом и моделями данных в основной
программе. Вот набор этих объектов-посредников и других полезных для
скриптов функций я и имею в виду под скриптовым движком.

Александр Руденко

unread,
Sep 19, 2011, 3:53:42 AM9/19/11
to qbal...@googlegroups.com
+1.
Для начала нужно научить движок управлять существующими объектами приложения.
Затем, в случае необходимости, научим его определять новые, ранее не существовашие, объекты самостоятельно.
Reply all
Reply to author
Forward
0 new messages