Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчет.docx
Скачиваний:
9
Добавлен:
29.03.2015
Размер:
453.74 Кб
Скачать

Программный код

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;

/