Программный код
DECLARE
I INTEGER;
K INTEGER;
L INTEGER:=0;
D1 DATE;
R INTEGER;
M INTEGER;
Q1 INTEGER;
Q2 INTEGER;
T INTEGER:=0;
Р INTEGER:=0;
CURSOR C_zakfil IS [привязывается таблица ZAKAZ_FILIALU к курсорам]
SELECT *
FROM ZAKAZ_FILIALU
WHERE KOD_ZAKAZA_FILIALU =I;
cv_zf C_zakfil%rowtype;
CURSOR denki IS
SELECT *
FROM DALNOST
WHERE KOD_POSTAVSHCHIKA =M;
c_denki denki%rowtype;
CURSOR C_NNYY IS [привязывается таблица ZAKAZ_POSTAVSHCHIKU к курсорам]
SELECT *
FROM ZAKAZ_POSTAVSHCHIKU
WHERE KOD_ZAKAZA_POSTAVSHCHIKU =R;
cv_NN C_NNYY%rowtype;
CURSOR C_obrabotka IS [группируется по коду заказа филиалу, затем ищется последний этап обработки заказа и начинается движение по таблице «Обработка заказа» с выполненных заказов]
SELECT KOD_ZAKAZA_FILIALU, MAX(KOD_ETAPA_OBRABOTKI_ZAKAZA) as d
FROM OBRABOTKA_ZAKAZA
GROUP BY KOD_ZAKAZA_FILIALU
ORDER by MAX(KOD_ETAPA_OBRABOTKI_ZAKAZA) desc;
cv_obr C_obrabotka%rowtype;
CURSOR C_NNQQ IS [привязывается таблица к курсорам, она пригодится для вывода даты]
SELECT *
FROM OBRABOTKA_ZAKAZA
WHERE (KOD_ZAKAZA_FILIALU =Q1) AND (KOD_ETAPA_OBRABOTKI_ZAKAZA=Q2) ;
cv_QQN C_NNQQ%rowtype;
BEGIN
DBMS_OUTPUT.enable; [подключается процедура вывода текста на экран]
FOR cv_obr IN C_obrabotka LOOP [начинается с первой строчки движение по таблице обработка заказа. Здесь отображаются только последние этапы заказов, находящихся в обработке]
I:=cv_obr.KOD_ZAKAZA_FILIALU; [запоминается код заказа филиалу первой строчки в таблице]
FOR cv_zf IN C_zakfil LOOP [по коду заказа филиалу в I открывается таблица «Заказ филиалу]
Q2:= cv_obr.d;
Q1:= cv_obr.KOD_ZAKAZA_FILIALU;
R:=cv_zf.KOD_ZAKAZA_POSTAVSHCHIKU;
FOR cv_NN IN C_NNYY LOOP [открывается таблица «Поставщик» по коду заказа филиалу]
M:=cv_NN.KOD_POSTAVSHCHIKA;
END LOOP;
IF cv_obr.d = 27 THEN [запоминается код поставщика и, если заказ находится на предпоследнем этапе, то можно сделать прогноз даты его поступления]
FOR cv_QQN IN C_NNQQ LOOP [теперь снова открывается таблица по значению KOD_ZAKAZA_FILIALU и KOD_ETAPA_OBRABOTKI_ZAKAZA. когда открывалась эта таблица в строке FOR cv_obr IN C_obrabotka LOOP , в ней содержалась не вся информация]
D1:=cv_QQN.DATETIME [запоминается дата оформления этапа обработки заказа]
end loop;
FOR c_denki IN denki LOOP
if (cv_zf.KOLICHESTVO>=c_denki.KOLICHESTVO_OT) and (cv_zf.KOLICHESTVO<=c_denki.KOLICHESTVO_DO) then
P:=c_denki.DNI;
end if;
end loop;
end if;
if L<>cv_obr.d then [условие, необходимое для того , чтобы строчка «На этапе находятся заказы» выводилась 1 раз для каждого этапа]
K:=cv_zf.STOIMIST_ZA_SHTUKU*cv_zf.KOLICHESTVO; [считается сумма завершенных заказов]
DBMS_OUTPUT.put_line('На этапе '||to_char(cv_obr.d)||' находятся заказы ');
DBMS_OUTPUT.put_line('№ '||to_char(cv_obr.KOD_ZAKAZA_FILIALU) ||' Сумма заказа = '||to_char(K));
DBMS_OUTPUT.put_line(' '); [выводится полученная информация]
L:=cv_obr.d; [запоминается предыдущий этап для того, чтобы строчка «На этапе находятся заказы» выводилась 1 раз для каждого этапа]
IF cv_obr.d = 27 THEN
DBMS_OUTPUT.put_line('Примерная дата поступления заказа = '||to_char(D1+N)||' Через '||to_char(D1+N-sysdate, '9999')||' дня '); [считается, сколько дней осталось до поступления заказа относительно текущей даты]
DBMS_OUTPUT.put_line(' '); [выводится примерная дата поступления заказа, если заказ на предпоследнем этапе]
END IF;
IF cv_obr.d = 29 THEN T:=T+K;END IF; [если последний этап, то считается общая сумма за выполненные заказы]
else
K:=cv_zf.STOIMIST_ZA_SHTUKU*cv_zf.KOLICHESTVO; [считается сумма за данный заказ]
IF cv_obr.d = 29 THEN T:=T+K;END IF;
DBMS_OUTPUT.put_line('№ '||to_char(cv_obr.KOD_ZAKAZA_FILIALU) ||' Сумма заказа = '||to_char(K));
DBMS_OUTPUT.put_line(' ');
IF cv_obr.d = 27 THEN
DBMS_OUTPUT.put_line('Примерная дата поступления заказа = '||to_char(D1+N)||' Через '||to_char(D1+N-sysdate, '9999')||' дня ');
DBMS_OUTPUT.put_line(' '); [выводится информация, если заказ на 29 или 27 этапе]
END IF;
L:=cv_obr.d; [запоминается номер этапа заказа, затем сравнивается с номером следующего заказа из таблицы «Обработка заказа», это нужно для того чтобы строка «На этапе находятся заказы» выводилась 1 раз для каждого этапа]
end if;
END LOOP;
END LOOP;
DBMS_OUTPUT.put_line('Сумма по закрытым заказам = '||to_char(T));
END;
/