Основные процедуры используемые в программе
Подзапрос формирования промежуточного хранилища остатка на начало. Нулевые значения указывать обязательно, так как они используются в. IIF (ThisForm.Optiongroup1.Value#0,' and ' + IIF (ThisForm.Optiongroup1.Value=1,'a.день = .T.','a.день = .F.'), ''). Filter1 = IIF (ThisForm.Optiongroup1.Value#0, IIF (ThisForm.Optiongroup1.Value=1,'a.день=.T.','a.день=.F.'), '') +; Filter1 = IIF… Читать ещё >
Основные процедуры используемые в программе (реферат, курсовая, диплом, контрольная)
Перевод сырья
Ниже приведен фрагмент программного кода события «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