Основные процедуры, используемые в программе
REPLACE количественный. остат_кол WITH количественный. ост_кол + количественный. пр_кол — количественный. рас_кол — количественный. реал_кол. REPLACE количественный. остат_кол WITH количественный. ост_кол + количественный. пр_кол — количественный. рас_кол — количественный. реал_кол. Перевод сырья Ниже приведен фрагмент программного кода события «Click» кнопки «Передать». Практически вся процедура… Читать ещё >
Основные процедуры, используемые в программе (реферат, курсовая, диплом, контрольная)
Перевод сырья Ниже приведен фрагмент программного кода события «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 …
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 заказ_query
ThisForm. Refresh
ThisForm. Grid1. SetFocus
Ниже приведена процедура используемая в наряд-заказе.
mTime = TIME ()
* Если не забыли указать сотрудника принявшего заказ и выбрана смена (ДЕНЬ-НОЧЬ)
IF! EMPTY (ThisForm. Combo3. Value) AND ThisForm. Optiongroup1. Value # 0
* Продукция в приход на пекарню
INSERT INTO изготовлено (дата, день, время, цех, продукция, кол_во, ед_изм, принял);
VALUES
(date1, IIF (ThisForm. Optiongroup1. Value=1.T.F.), mTime, AliasName, ALLTRIM (продукция. продукция), ThisForm. Text1. Value;
IIF (SEEK (ALLTRIM (продукция. продукция), 'продукция', 'продукция'), продукция. ед_изм, ''), сотрудники. fio)
* Продукция в приход на склад
INSERT INTO sklad (дата, time, пост, title, edenizm, quantity, edenizm, прод);
VALUES (date1, mTime, AliasName,&TableName2.продукция,&TableName2.ед_изм,&TableName2.кол_во;
IIF (SEEK (ALLTRIM (&TableName2.продукция), 'продукция', 'продукция'), продукция. ед_изм, '').T.)
* Разноска на приход в пекарню
SELECT svod1
SCAN
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