Программный код
DECLARE
I INTEGER;
k INTEGER;
L INTEGER:=0;
D1 DATE;
R INTEGER;
M INTEGER;
Q1 INTEGER;
Q2 INTEGER;
T INTEGER:=0;
D2 INTEGER;
p 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 – запоминаем дату оформления этапа ожидание заказа
endloop;
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.dthen – условия необходимое для того , чтобы строчка На этапе находятся заказы выводилась 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;
/