Основные процедуры используемые в программе
Как видно из программного кода максимальная оптимизация достигается за счет выражения UNION в SQL запросах. Данное выражение позволяет объединить несколько запросов в один, чем достигается максимальная скорость обработки данных. Свод сырья по цеху При реализации фильтров используются SQL запросы и динамические фильтры. Ниже приведен фрагмент исходного кода загружаемого при инициализации (событие… Читать ещё >
Основные процедуры используемые в программе (реферат, курсовая, диплом, контрольная)
Перевод сырья Ниже приведен фрагмент программного кода события «Click» кнопки «Передать». Практически вся процедура реализована SQL.
* Поддверждение передачи сырья
IF MESSAGEBOX («Вы действительно хотите передать «+ ;
ALLTRIM (ThisForm.List1.Value) + «из «+ ThisForm. Combo1.Value+» в «+ ;
ThisForm.Combo2.Value + " ?", 4+32+256, «Передача сырья») = 6
* списываем передаваемое сырье в расход источника
INSERT INTO (table1)(дата, сырье, кол_во, принял);
VALUES (ThisForm.Text1.Value, ALLTRIM (ThisForm.List1.Value), ;
ThisForm.Text2.Value, «Перевод»)
* списываем передаваемое сырье в приход приемника
INSERT INTO (table2)(дата, сырье, кол_во, принял) ;
VALUES (ThisForm.Text1.Value, ALLTRIM (ThisForm.List1.Value), ;
ThisForm.Text2.Value, «Перевод»)
MESSAGEBOX («Передача завершена», 64, «Передача сырья», 1)
ENDIF
Свод сырья по цеху При реализации фильтров используются SQL запросы и динамические фильтры. Ниже приведен фрагмент исходного кода загружаемого при инициализации (событие Init) формы «Пекарня»:
ThisForm.Label18.Caption = mes_svod
ThisForm.Label19.Caption = 'рабочий период: ' + DTOC (date1)+' - '+DTOC (date2)
- * формирование промежуточного хранилища остатка на начало
- * нулевые значения указывать обязательно, так как они используются в
- * последующих подзапросах
- * подзапрос формирования промежуточного хранилища остатка на начало
SELECT a. сырье, sum (a.кол_во) as Остаток_на_начало,
0.0000 as приход, 0.0000 as расход,
0.0000 as остаток_на_конец ;
FROM &TableName1 a WHERE &filter1 GROUP BY a. сырье ;
UNION ;
* подзапрос формирования прихода
SELECT a. сырье, -sum (a.кол_во) as Остаток_на_начало,
0.0000 as приход, 0.0000 as расход,
0.0000 as остаток_на_конец ;
FROM &TableName2 a WHERE &filter1 GROUP BY a. сырье ;
UNION ;
* подзапрос формирования остатка на начало
SELECT a. сырье, sum (a.кол_во) as Остаток_на_начало,
0.0000 as приход, 0.0000 as расход,
0.0000 as остаток_на_конец ;
FROM &TableName1 a WHERE &filter2 GROUP BY a. сырье ;
UNION ;
SELECT a. сырье, -sum (a.кол_во) as Остаток_на_начало,
0.0000 as приход, 0.0000 as расход,
0.0000 as остаток_на_конец ;
FROM &TableName2 a WHERE &filter2 GROUP BY a. сырье INTO CURSOR query1
Таким образом было сформировано промежуточное хранилище формирования остатка на начало. Далее приводится пример использования промежуточного хранилища при формировании запроса остатка на начало с использованием динамических фильтров, что, несомненно, усложняет синтаксис выборки, но облегчает и ускоряет процесс вывода результата.
SELECT a. сырье, sum (a.Остаток_на_начало) as Остаток_на_начало,
0.0000 as приход, 0.0000 as расход,
0.0000 as остаток_на_конец ;
FROM query1 a GROUP BY a. сырье; && остаток на начало
UNION ;
SELECT a. сырье, 0.0000, sum (a.кол_во) as приход,
0.0000 as расход, 0.0000 as остаток_на_конец;
FROM &TableName1 a WHERE &filter31 GROUP BY a. сырье; && приход
UNION ;
SELECT a. сырье, 0.0000, sum (a.кол_во) as приход,
0.0000 as расход, 0.0000 as остаток_на_конец;
FROM &TableName1 a WHERE &filter41 GROUP BY a. сырье; && приход
UNION ;
SELECT a. сырье, 0.0000, 0.0000 as приход,
sum (a.кол_во) as расход, 0.0000 as остаток_на_конец ;
FROM &TableName2 a WHERE &filter32 GROUP BY a. сырье; && расход
UNION ;
SELECT a. сырье, 0.0000, 0.0000 as приход,
sum (a.кол_во) as расход, 0.0000 as остаток_на_конец ;
FROM &TableName2 a WHERE &filter42 GROUP BY a. сырье
INTO CURSOR query1 && расход
Итак, в промежуточном хранилище набора данных остатка на начало сформированы приходная и расходная части выборки. Далее формируется набор данных остатка на конец.
* остаток_на_конец
SELECT a. сырье, sum (a.Остаток_на_начало) as Остаток_на_начало,
sum (a.приход) as приход, sum (a.расход) as расход,
sum (a.Остаток_на_начало)+sum (a.приход)-sum (a.расход) as остаток_на_конец;
FROM query1 a GROUP BY a. сырье INTO CURSOR свод
ThisForm.Pageframe1.свод.Grid1.RecordSource = [свод]
ThisForm.Pageframe1.свод.Init
Как видно из программного кода максимальная оптимизация достигается за счет выражения UNION в SQL запросах. Данное выражение позволяет объединить несколько запросов в один, чем достигается максимальная скорость обработки данных.
Расчет остатков Ниже приводится фрагмент программного кода расчета остатков в форме расположенного в событии «init» формы.
* Подготовка таблиц для остатка
SELECT table2 && сырья
SET FILTER TO
SCAN
replace table2. количество WITH 0
ENDSCAN
SELECT продукция && продукции
SET FILTER TO
SCAN
replace продукция. кол_во WITH 0
ENDSCAN
* расчет остатка сырья
SELECT table2
SCAN
kol_pr = 0
kol_ras = 0
* приход сырья
SET FILTER TO sklad. title = ALLTRIM (table2.сырье) IN sklad
GO TOP IN sklad
DO WHILE! EOF ('sklad') && Просматривается вся таблица
kol_pr = kol_pr + sklad. quantity
SKIP IN sklad
ENDDO
* расход сырья
SET FILTER TO sklad_р.title = ALLT (table2.сырье) IN sklad_р
GO TOP IN sklad_р
DO WHILE! EOF ('sklad_р')
kol_ras = kol_ras + sklad_р.quantity
SKIP IN sklad_р
ENDDO
* остаток сырья
Replace table2. количество WITH kol_pr — kol_ras
ENDSCAN
SET FILTER TO table2. количество 0
GO TOP
* РАСЧЕТ ОСТАТКА ПРОДУКЦИИ
SELECT продукция
SCAN
kol_pr = 0
kol_ras = 0
* приход продукции
SET FILTER TO sklad. title = продукция. продукция IN sklad
GO TOP IN sklad
DO WHILE! EOF ('sklad') && Просматривается вся таблица
kol_pr = kol_pr + sklad. quantity
SKIP IN sklad
ENDDO
* расход продукции
SET FILTER TO sklad_р.title = продукция. продукция IN sklad_р
GO TOP IN sklad_р
DO WHILE! EOF ('sklad_р') && Просматривается вся таблица
kol_ras = kol_ras + sklad_р.quantity
SKIP IN sklad_р
ENDDO
* остаток продукции
Replace продукция. кол_во WITH kol_pr — kol_ras
ENDSCAN
GO TOP
SET FILTER TO продукция. кол_во 0
ThisForm.Refresh
Списание сырья со склада в цех Ниже приведена процедура разноски по цехам магазина.
DO CASE
CASE ALLTRIM (ThisForm.Combo2.Value)='Пекарня'
INSERT INTO pek_pr_сырье (дата, день, сырье, кол_во, ед_изм, принял);
VALUES (sklad_р.дата, sklad_р.день, sklad_р.title,
sklad_р.quantity, sklad_р.edenizm, sklad_р.принял)
CASE ALLTRIM (ThisForm.Combo2.Value)='Полуфабрикаты'
INSERT INTO пол_пр_сырье (дата, день, сырье, кол_во, ед_изм, принял);
VALUES (sklad_р.дата, sklad_р.день, sklad_р.title,
sklad_р.quantity, sklad_р.edenizm, sklad_р.принял)
CASE ALLTRIM (ThisForm.Combo2.Value)='Кондитерские изд. (торты)'
INSERT INTO kon_tort_pr_сырье (дата, день, сырье, кол_во, ед_изм, принял);
VALUES (sklad_р.дата, sklad_р.день, sklad_р.title,
sklad_р.quantity, sklad_р.edenizm, sklad_р.принял)
CASE ALLTRIM (ThisForm.Combo2.Value)='Кондитерские изд. (штучно)'
INSERT INTO kon_шт_pr_сырье (дата, день, сырье, кол_во, ед_изм, принял);
VALUES (sklad_р.дата, sklad_р.день, sklad_р.title,
sklad_р.quantity, sklad_р.edenizm, sklad_р.принял)
ENDCASE
Формирование фильтров Ниже приведена процедура формирования фильтров в форме изготовленной продукции. В данной процедуре используются динамические фильтры встраиваемые в SQL-запрос. Данная связка максимально увеличивает скорость обработки записей, тем более что их в базах очень много. В результате действие этой процедуры практически незаметно для пользователя.
LPARAMETERS CallObject, ObjectCount
DO CASE
*** Combo1, Combo2, Optiongroup1
CASE CallObject = 'Combo1' OR CallObject = 'Combo2'
report_title = UPPER (ThisForm.Combo1.Value) + IIF (!EMPTY (ThisForm.Combo2.Value)," («+ALLTRIM (ThisForm.Combo2.Value)+»)", «»)
ThisForm.Label18.Caption = [ИЗГОТОВЛЕННАЯ ПРОДУКЦИЯ (] + ThisForm. Combo1.Value + [ ] + ALLTRIM (ThisForm.Combo2.Value) + [)]
filter1 = 'BETWEEN (a.дата, date1, date2) and цех = ThisForm. Combo1.Value and принял = ThisForm. Combo2.Value' + ;
IIF (ThisForm.Optiongroup1.Value#0, IIF (ThisForm.Optiongroup1.Value=1,' and день=.T.',' and день=.F.'), '')
* IIF (ThisForm.Optiongroup1.Value#0,' and ' + IIF (ThisForm.Optiongroup1.Value=1,'a.день = .T.','a.день = .F.'), '')
SELECT * FROM изготовлено a WHERE a. дата = date1 AND a. день = .F. and &filter1 ;
UNION ALL ;
SELECT * FROM изготовлено a WHERE a. дата >= date1+1 AND a. дата <= date2−1 and &filter1 ;
UNION ALL ;
SELECT * FROM изготовлено a WHERE a. дата = date2 AND a. день = .T. and &filter1 INTO CURSOR заказ_query1
SELECT заказ_query1
ThisForm.Grid1.RecordSource = [SELECT продукция, sum (кол_во) as Количество, ед_изм, цех, принял ;
FROM заказ_query1 GROUP BY продукция, принял INTO CURSOR заказ_query]
*** Optiongroup1, Combo1
CASE CallObject = 'Optiongroup1'
mDay = IIF (ThisForm.Optiongroup1.Value=1,'день','ночь')
ThisForm.Label19.Caption = mDay
filter1 = 'BETWEEN (a.дата, date1, date2) and ' + IIF (ThisForm.Optiongroup1.Value=1,'день = .T.','день = .F.') + ;
' and цех = ThisForm. Combo1.Value and принял = ThisForm. Combo2.Value'
SELECT * FROM изготовлено a WHERE a. дата = date1 AND a. день = .F. and &filter1 ;
UNION ALL ;
SELECT * FROM изготовлено a WHERE a. дата >= date1+1 AND a. дата <= date2−1 and &filter1 ;
UNION ALL ;
SELECT * FROM изготовлено a WHERE a. дата = date2 AND a. день = .T. and &filter1 INTO CURSOR заказ_query1
SELECT заказ_query1
ThisForm.Grid1.RecordSource = [SELECT продукция, sum (кол_во) as Количество, ед_изм, цех, принял ;
FROM заказ_query1 GROUP BY продукция, принял INTO CURSOR заказ_query]
*** Период, Optiongroup1, Combo1
CASE CallObject = 'Command5'
report_title = UPPER (ALLTRIM (ThisForm.Combo1.Value))
ThisForm.Label18.Caption = [ИЗГОТОВЛЕННАЯ ПРОДУКЦИЯ] + IIF (!EMPTY (ThisForm.Combo1.Value),' ('+ThisForm.Combo1.Value+')','')
- *filter1 = IIF (ThisForm.Optiongroup1.Value#0, IIF (ThisForm.Optiongroup1.Value=1,'a.день=.T.','a.день=.F.'), '') +;
- * 'a.цех = ThisForm. Combo1.Value'
filter1 = IIF (ThisForm.Optiongroup1.Value#0, IIF (ThisForm.Optiongroup1.Value=1,'a.день=.T.','a.день=.F.'), '') +;
IIF (!EMPTY (ThisForm.Combo1.Value),'and a. цех = ThisForm. Combo1.Value','')
SELECT * FROM изготовлено a WHERE a. дата = date1 AND a. день = .F. and &filter1 ;
UNION ALL ;
SELECT * FROM изготовлено a WHERE a. дата >= date1+1 AND a. дата <= date2−1 and &filter1 ;
UNION ALL ;
SELECT * FROM изготовлено a WHERE a. дата = date2 AND a. день = .T. and &filter1 INTO CURSOR заказ_query1
SELECT заказ_query1
ThisForm.Grid1.RecordSource = [SELECT продукция, sum (кол_во) as Количество, ед_изм, цех, принял ;
FROM заказ_query1 GROUP BY продукция, принял INTO CURSOR заказ_query]
ENDCASE
- *!*ThisForm.Grid1.RecordSource = [SELECT продукция, sum (кол_во) as Количество, ед_изм, цех, принял ;
- *!*FROM изготовлено a WHERE &filter1 GROUP BY продукция, принял INTO CURSOR заказ_query]
GO TOP IN заказ_quer…
INSERT INTO &TableName4(дата, день, время, продукция, id, сырье, кол_во, ед_изм, принял);
VALUES (date1,IIF (ThisForm.Optiongroup1.Value=1,.T.,.F.), mTime, продукция. продукция, svod1. N, svod1. сырье, svod1. количество,;
IIF (SEEK (ALLTRIM (svod1.сырье),'table2','сырье'), table2. ед_изм,''),;
сотрудники.fio)
ENDSCAN
This.Enabled = .F.
ThisForm.Text1.Enabled = .F.
ELSE
MESSAGEBOX ([Не указан сотрудник принявший заказ или смена], 0+64,[Внимание!])
* Блокировка кнопок
This.Enabled = .T.
ThisForm.Text1.Enabled = .T.
ENDIF
GO TOP
ThisForm.Optiongroup1.InteractiveChange
ThisForm.Refresh
ThisForm.Combo4.SetFocus
Процедура формирования карточки наряд-заказа.
SELECT a. цех, a. продукция, a. кол_во, a. Ед_изм, b. сырье, b. кол_во, b. ед_изм FROM изготовлено a, pek_ras_сырье b WHERE a. дата = date1 AND b. дата = date1 AND a. цех = ALLTRIM (ThisForm.Combo1.Value) INTO CURSOR наряд_заказ_печ READWRITE
SELECT наряд_заказ_печ
INDEX ON продукция TAG продукция
INDEX ON сырье TAG сырье
DELETE ALL
** Сырье с разбивкой на цеха
SELECT &TableName4
SET ORDER TO сырье
SET FILTER TO дата = date1
SCAN
IF SEEK (ALLTRIM (&TableName4.сырье),'наряд_заказ_печ','сырье')
REPLACE наряд_заказ_печ.кол_во_b WITH наряд_заказ_печ.кол_во_b + &TableName4.кол_во
ELSE
INSERT INTO наряд_заказ_печ (цех, сырье, кол_во_b, ед_изм_b);
VALUES (AliasName, &TableName4.сырье, &TableName4.кол_во, &TableName4.ед_изм)
ENDIF
ENDSCAN
* Продукция
SELECT изготовлено
SET ORDER TO ПРОДУКЦИЯ
SET FILTER TO дата = date1 AND цех = ALLTRIM (ThisForm.Combo1.Value)
GO TOP IN наряд_заказ_печ
SCAN
IF SEEK (ALLTRIM (изготовлено.продукция),'наряд_заказ_печ','продукция')
REPLACE наряд_заказ_печ.кол_во_a WITH наряд_заказ_печ.кол_во_a + изготовлено. кол_во
ELSE
SELECT наряд_заказ_печ
SCAN
IF EMPTY (наряд_заказ_печ.продукция) AND наряд_заказ_печ.цех = изготовлено. цех AND! EOF ()
REPLACE наряд_заказ_печ.цех WITH изготовлено. цех
REPLACE наряд_заказ_печ.продукция WITH изготовлено. продукция
REPLACE наряд_заказ_печ.кол_во_a WITH изготовлено. кол_во
REPLACE наряд_заказ_печ.ед_изм_a WITH изготовлено. ед_изм
EXIT
ENDIF
ENDSCAN
IF EOF ()
INSERT INTO наряд_заказ_печ (цех, продукция, кол_во_a, ед_изм_a);
VALUES (изготовлено.цех, изготовлено. продукция, изготовлено. кол_во, изготовлено. ед_изм)
ENDIF
ENDIF
ENDSCAN
SELECT наряд_заказ_печ
SET ORDER TO 0
REPORT FORM nar_zakaz_kartochka PREVIEW
Процедура добавления фактических остатков в цех магазина.
PUBLIC mday, medit
mday = .F.
medit=.f.
* Меню
DEFINE POPUP shortcut SHORTCUT RELATIVE FROM MROW (), MCOL ()
DEFINE BAR 1 OF shortcut PROMPT «День»
DEFINE BAR 2 OF shortcut PROMPT «Ночь»
ON SELECTION BAR 1 OF shortcut mday = .T.
ON SELECTION BAR 2 OF shortcut mday = .F.
ACTIVATE POPUP shortcut
* Через переменные
ThisForm.Pageframe1.Ост_фак.Container1.Visible = .T.
* Деактивация кнопок добавления и удаления фактического остатка
ThisForm.Command5.Enabled = .F.
ThisForm.Command6.Enabled = .F.
ThisForm.Refresh
ThisForm.Pageframe1.Ост_фак.Container1.Text1.Value = DATE ()
ThisForm.Pageframe1.Ост_фак.Container1.Combo1.Value = ''
ThisForm.Pageframe1.Ост_фак.Container1.Text2.Value = 0
ThisForm.Pageframe1.Ост_фак.Container1.Text3.Value = ''
ThisForm.Pageframe1.Ост_фак.Container1.SetFocus
Процедура вычисления количественного расчета.
SET CURSOR OFF
WAIT [Идут вычисления]+CHR (13)+[Пожалуйста подождите] WINDOW NOWAIT
ThisForm.Label18.Caption = 'КОЛИЧЕСТВЕННЫЙ отчет ' + otv_fio + ' за период с '+ DTOC (date1) + ' по ' + DTOC (date2)
mReport = 'Количественный'
SELECT kalk
SCAN
REPLACE kalk. кол_во WITH 0
REPLACE kalk. сумма WITH 0
ENDSCAN
* Формируем список сырья и цен
SELECT table2
SCAN
INSERT INTO количественный (наим, цена) VALUES (table2.сырье, table2. цена)
ENDSCAN
- * Сформировали
- * Действия по шагам
- * 1 шаг Расчет остатка на начало
- * 2 шаг Расчет прихода и расхода
- * 3 шаг Расчет реализ. продукции за указ. период согласно калькуляции
- * 4 шаг Расчет «Остатка на конец»
- * 1 шаг
- * Расчет остатка на начало
SELECT количественный
SET FILTER TO IN количественный
kol = 0
kol_r = 0
SCAN
* Приход на начало периода
SELECT sklad
SET FILTER TO sklad. дата < date1 && IN sklad
LOCATE FOR sklad. title = ALLTRIM (количественный.наим)
DO WHILE FOUND ()
kol = kol + sklad. quantity
CONTINUE
ENDDO
* Расход на начало периода
SELECT sklad_р
SELECT * FROM sklad_р WHERE sklad_р.дата <= date1−1 ;
UNION ALL ;
SELECT all * FROM sklad_р WHERE sklad_р.дата = date1 AND день = .T. INTO CURSOR расход_со_склада
SELECT расход_со_склада
LOCATE FOR расход_со_склада.title = ALLTRIM (количественный.наим)
DO WHILE FOUND ()
kol_r = kol_r + расход_со_склада.quantity
CONTINUE
ENDDO
* Остаток на начало периода
SELECT количественный && Заносим в отчет
Replace количественный. ост_кол WITH kol — kol_r && остаток,
Replace количественный. ост_сум WITH (kol — kol_r)* количественный. цена && сумму
kol = 0
kol_r = 0
ENDSCAN
- * Рассчитали
- * 2 шаг
- * Расчет прихода и расхода
SELECT количественный
kol = 0
kol_r = 0
SCAN
* Приход на склад сырья за указанный период
SELECT sklad
SET FILTER TO sklad. дата >= date1 AND sklad. дата <= date2
LOCATE FOR sklad. title = ALLTRIM (количественный.наим)
DO WHILE FOUND ()
kol = kol + sklad. quantity
CONTINUE
ENDDO
SELECT количественный && Заносим в отчет
Replace количественный. пр_кол WITH kol && В отчет кол-во
Replace количественный. пр_сум WITH kol * количественный. цена && В отчет сумму прихода
* Расход со склада сырья за указанный период
SELECT sklad_р
* SET FILTER TO sklad_р.дата >= date1 AND sklad_р.дата <= date2 AND sklad_р.реал = .f.
SELECT * FROM sklad_р WHERE sklad_р.дата = date1 AND день = .F. AND реал = .F. ;
UNION ALL ;
SELECT * FROM sklad_р WHERE sklad_р.дата >= date1+1 AND sklad_р.дата <= date2−1 AND реал = .F. ;
UNION ALL ;
SELECT * FROM sklad_р WHERE sklad_р.дата = date2 AND день = .T. AND реал = .F. INTO CURSOR расход_со_склада
SELECT расход_со_склада
LOCATE FOR расход_со_склада.title = ALLTRIM (количественный.наим)
DO WHILE FOUND ()
kol_r = kol_r + расход_со_склада.quantity
CONTINUE
ENDDO
SELECT количественный
Replace количественный. рас_кол WITH kol_r && В отчет кол-во
Replace количественный. рас_сум WITH kol_r * количественный. цена && В отчет сумму расхода
kol = 0
kol_r = 0
ENDSCAN
- * Рассчитали
- * 3 шаг
- * Здесь расчет реализ. продукции за указ. период согласно калькуляции
Select sklad_р
Set Order To 1 && TITLE
Set Filter To sklad_р.дата >= date1 AND sklad_р.дата <= date2 AND реал = .t.
* Расчитанная согласно кальк. реализованная продукция в отчет
SELECT количественный
kol = 0
SCAN
* Приход на склад сырья за указанный период
SELECT sklad_р
LOCATE FOR sklad_р.title = ALLTRIM (количественный.наим)
DO WHILE FOUND ()
kol = kol + sklad_р.quantity
CONTINUE
ENDDO
SELECT количественный && Заносим в отчет
Replace количественный. реал_кол WITH kol && В отчет кол-во
Replace количественный. реал_сум WITH kol * количественный. цена && В отчет сумму прихода
kol = 0
ENDSCAN
- * Расчитали согласно калькуляции реализованную продукцию и отправили в отчет
- * 4 шаг
- * Расчет «Остатка на конец»
SELECT количественный
SCAN
* количество
REPLACE количественный. остат_кол WITH количественный. ост_кол + количественный. пр_кол — количественный. рас_кол — количественный. реал_кол
* сумма
REPLACE количественный. остат_сум WITH количественный. ост_сум + количественный. пр_сум — количественный. рас_сум — количественный. реал_сум
ENDSCAN
- *Рассчитали
- * Фильтруем нулевые значения
- *SET FILTER TO количественный. ост_кол 0 OR количественный. пр_кол 0 OR количественный. рас_кол 0
- *SET FILTER TO количественный. остат_кол 0
CALCULATE sum (количественный.ост_кол) TO ThisForm.TxtОстКол.Value
CALCULATE sum (количественный.ост_сум) TO ThisForm.TxtОстСумма.Value
CALCULATE sum (количественный.пр_кол) TO ThisForm.TxtПрКол.Value
CALCULATE sum (количественный.пр_сум) TO ThisForm.TxtПрСумма.Value
CALCULATE sum (количественный.рас_кол) TO ThisForm.TxtРасКол.Value
CALCULATE sum (количественный.рас_сум) TO ThisForm.TxtРасСумма.Value
CALCULATE sum (количественный.реал_кол) TO ThisForm.TxtРеалКол.Value
CALCULATE sum (количественный.реал_сум) TO ThisForm.TxtРеалСумма.Value
CALCULATE sum (количественный.остат_кол) TO ThisForm.TxtОстатКол.Value
CALCULATE sum (количественный.остат_сум) TO ThisForm.TxtОстатСумма.Value
SET ORDER TO наим
GO TOP IN количественный
ThisForm.Refresh
WAIT CLEAR
Ниже приведена процедура вычисления сличительного расчета.
WAIT [Идут вычисления]+CHR (13)+[Пожалуйста подождите] WINDOW NOWAIT
ThisForm.Label18.Caption = 'СЛИЧИТЕЛЬНАЯ ведомость ' + otv_fio + ' за период с '+ DTOC (date1) + ' по ' + DTOC (date2)
mReport = 'Сличительная'
SELECT kalk
SCAN
REPLACE kalk. кол_во WITH 0.0000
REPLACE kalk. сумма WITH 0.0000
ENDSCAN
* Формируем список сырья и цен
SELECT table2
SCAN
INSERT INTO количественный (наим, цена) VALUES (table2.сырье, table2. цена)
ENDSCAN
- * Сформировали
- * Действия по шагам
- * 1 шаг Расчет остатка по отчету
- * 2 шаг Расчет фактического сырья на складе по ревизии
- * 3 шаг
- * 1 шаг расчет остатка по отчету
- * Расчет остатка на начало
SELECT количественный
SET FILTER TO IN количественный
kol = 0
kol_r = 0
SCAN
* Приход на начало периода
SELECT sklad
SET FILTER TO sklad. дата < date1 && IN sklad
LOCATE FOR sklad. title = ALLTRIM (количественный.наим)
DO WHILE FOUND ()
kol = kol + sklad. quantity
CONTINUE
ENDDO
* Расход на начало периода
SELECT sklad_р
SELECT * FROM sklad_р WHERE sklad_р.дата <= date1−1 ;
UNION ALL ;
SELECT * FROM sklad_р WHERE sklad_р.дата = date1 AND день = .T. INTO CURSOR расход_со_склада
SELECT расход_со_склада
LOCATE FOR расход_со_склада.title = ALLTRIM (количественный.наим)
DO WHILE FOUND ()
kol_r = kol_r + расход_со_склада.quantity
CONTINUE
ENDDO
* Остаток на начало периода
SELECT количественный && Заносим в отчет
Replace количественный. ост_кол WITH kol — kol_r && остаток,
Replace количественный. ост_сум WITH (kol — kol_r)* количественный. цена && сумму
kol = 0
kol_r = 0
ENDSCAN
- * Рассчитали
- * Расчет прихода и расхода
SELECT количественный
kol = 0
kol_r = 0
SCAN
* Приход на склад сырья за указанный период
SELECT sklad
SET FILTER TO sklad. дата >= date1 AND sklad. дата <= date2
LOCATE FOR sklad. title = ALLTRIM (количественный.наим)
DO WHILE FOUND ()
kol = kol + sklad. quantity
CONTINUE
ENDDO
SELECT количественный && Заносим в отчет
Replace количественный. пр_кол WITH kol && В отчет кол-во
Replace количественный. пр_сум WITH kol * количественный. цена && В отчет сумму прихода
* Расход со склада сырья за указанный период
SELECT sklad_р
* SET FILTER TO sklad_р.дата >= date1 AND sklad_р.дата <= date2 AND sklad_р.реал = .f.
SELECT * FROM sklad_р WHERE sklad_р.дата = date1 AND день = .F. AND реал = .F. ;
UNION ALL ;
SELECT * FROM sklad_р WHERE sklad_р.дата >= date1+1 AND sklad_р.дата <= date2−1 AND реал = .F. ;
UNION ALL ;
SELECT * FROM sklad_р WHERE sklad_р.дата = date2 AND день = .T. AND реал = .F. INTO CURSOR расход_со_склада
SELECT расход_со_склада
LOCATE FOR расход_со_склада.title = ALLTRIM (количественный.наим)
DO WHILE FOUND ()
kol_r = kol_r + расход_со_склада.quantity
CONTINUE
ENDDO
SELECT количественный
Replace количественный. рас_кол WITH kol_r && В отчет кол-во
Replace количественный. рас_сум WITH kol_r * количественный. цена && В отчет сумму расхода
kol = 0
kol_r = 0
ENDSCAN
- * Рассчитали
- * Здесь расчет реализованной продукции за указ. период согласно калькуляции
SELECT sklad_р
SET ORDER TO 1 && TITLE
SET FILTER TO sklad_р.дата >= date1 AND sklad_р.дата <= date2 AND реал = .T.
* Рассчитанная согласно кальк. реализованная продукция в отчет
SELECT количественный
kol = 0
SCAN
* Приход на склад сырья за указанный период
SELECT sklad_р
LOCATE FOR sklad_р.title = ALLTRIM (количественный.наим)
DO WHILE FOUND ()
kol = kol + sklad_р.quantity
CONTINUE
ENDDO
SELECT количественный && Заносим в отчет
Replace количественный. реал_кол WITH kol && В отчет кол-во
Replace количественный. реал_сум WITH kol * количественный. цена && В отчет сумму прихода
kol = 0
ENDSCAN
- * Расчитали согласно кальк. реализованную продукцию и отправили в отчет
- * Расчет ОСТАТКА НА КОНЕЦ
SELECT количественный
SCAN
* количество
REPLACE количественный. остат_кол WITH количественный. ост_кол + количественный. пр_кол — количественный. рас_кол — количественный. реал_кол
* сумма
Replace количественный. остат_сум WITH количественный. ост_сум + количественный. пр_сум — количественный. рас_сум — количественный. реал_сум
ENDSCAN
- * Рассчитали остаток по отчету
- * Переносим остаток по отчету из количественного в сличительную ведомость
SCAN
INSERT INTO сличительная (наим, цена, остат_кол, остат_сум) VALUES (количественный.наим, количественный. цена, количественный. остат_кол, количественный. остат_сум)
ENDSCAN
* 2 шаг Расчет фактического сырья на складе по ревизии
SELECT ревизия
SET FILTER TO ревизия. дата >= date1 AND ревизия. дата <= date2 AND ревизия. прод = .F.
SELECT сличительная
kol = 0.0000
kol_r = 0.0000
SCAN
* Приход на склад сырья за указанный период
SELECT ревизия
LOCATE FOR ALLTRIM (ревизия.наим) == ALLTRIM (сличительная.наим)
DO WHILE FOUND ()
kol = kol + ревизия. кол_во
CONTINUE
ENDDO
SELECT сличительная
&& Заносим в отчет
Replace сличительная. фсыр_кол WITH kol && В отчет кол-во
&& В отчет сумму прихода
Replace сличительная. фсыр_сум WITH kol * сличительная. цена
kol = 0.0000
kol_r = 0.0000
ENDSCAN
- * Рассчитали
- * 3 шаг * Расчет излишков и недостачи
SELECT сличительная
SCAN
IF сличительная. остат_кол — сличительная. фсыр_кол < 0
REPLACE сличительная. излиш_кол WITH сличительная. фсыр_кол — сличительная. остат_кол
REPLACE сличительная. излиш_сум WITH (сличительная.фсыр_кол — сличительная. остат_кол) * сличительная. цена
ENDIF
IF сличительная. остат_кол — сличительная. фсыр_кол > 0
REPLACE сличительная. недост_кол WITH сличительная. остат_кол — сличительная. фсыр_кол
REPLACE сличительная. недост_сум WITH (сличительная.остат_кол — сличительная. фсыр_кол) * сличительная. цена
ENDIF
ENDSCAN
* расчет по столбцам
CALCULATE sum (сличительная.остат_кол) TO ThisForm.TxtОстКол.Value
CALCULATE sum (сличительная.остат_сум) TO ThisForm.TxtОстСумма.Value
CALCULATE sum (сличительная.фсыр_кол) TO ThisForm.TxtРасКол.Value
CALCULATE sum (сличительная.фсыр_сум) TO ThisForm.TxtРасСумма.Value
CALCULATE sum (сличительная.недост_кол) TO ThisForm.TxtРеалКол.Value
CALCULATE sum (сличительная.недост_сум) TO ThisForm.TxtРеалСумма.Value
CALCULATE sum (сличительная.излиш_кол) TO ThisForm.TxtОстатКол.Value
CALCULATE sum (сличительная.излиш_сум) TO ThisForm.TxtОстатСумма.Value
GO TOP IN количественный
SELECT сличительная
SET ORDER TO наим
GO TOP
ThisForm.Refresh