Пришла задача сделать для коммерсов такую вещь - они готовят текстовый файл с номерами накладных, нажимают кнопку и цены в накладной увеличиваются на определённый процент.
Вот что получилось:
Функция, читающая файл.
В неё передаётся имя файла, тип документа, процент наценки, тип операции, комментарий.
Если тип не передаётся, то это означает, что тип берётся из этого же файла.
Старая цена остаётся в столбце "цена в валюте", а сумма в "сумма в валюте".
В качестве защиты от дурака, меняет только документы в черновике и с пустым комментарием.
Код:
CREATE OR REPLACE procedure supermag.readfile (fil in varchar2, dtt in varchar2, proc in integer, op in integer, dc in varchar2) is
CN varchar2(25);
CAC integer(25);
DT varchar2(2);
DD varchar2(25);
COMM varchar2(100);
DS integer(2);
TS varchar2(20);
v_file UTL_FILE.FILE_TYPE;
BEGIN
v_file := UTL_FILE.FOPEN('DIR',fil,'r');
LOOP
begin
UTL_FILE.GET_LINE(v_file,cn);
if dtt is null then
cac := instr(cn,',');
DT := SUBSTR(cn,1,cac-1);
DD := SUBSTR(cn,cac+1,length(cn));
else
DT := dtt;
DD := cn;
end if;
SELECT COMMENTARY INTO comm FROM SUPERMAG.SMDOCUMENTS WHERE DOCTYPE=DT AND ID=DD;
SELECT docstate INTO ds FROM SUPERMAG.SMDOCUMENTS WHERE DOCTYPE=DT AND ID=DD;
SELECT totalsumcur INTO ts FROM SUPERMAG.SMDOCUMENTS WHERE DOCTYPE=DT AND ID=DD;
IF (comm is null) and (ds=1) THEN
dbms_output.put_line('doc '||dt||' # '||dd||'.');
UPDATE SUPERMAG.SMSPEC F SET
F.ITEMPRICE=ROUND(F.ITEMPRICECUR*(100+PROC)/100,2)
WHERE F.DOCTYPE=DT AND F.DOCID=DD;
COMMIT;
UPDATE SUPERMAG.SMSPEC F SET
F.TOTALPRICE=ROUND((F.QUANTITY*F.ITEMPRICE),2)
WHERE F.DOCTYPE=DT AND F.DOCID=DD;
COMMIT;
UPDATE SUPERMAG.SMDOCUMENTS D SET
D.TOTALSUM=(SELECT SUM(F.TOTALPRICE) FROM SUPERMAG.SMSPEC F WHERE F.DOCTYPE=D.DOCTYPE AND F.DOCID=D.ID),
D.COMMENTARY=ts || '+' || proc || '% (' || DC || ')',
d.opcode=op,
d.userop=NULL
WHERE D.DOCTYPE=DT AND D.ID=DD;
COMMIT;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN EXIT;
END;
END LOOP;
UTL_FILE.FCLOSE(v_file);
END;
/
Запускающий скрипт:
Код:
set serveroutput on;
CREATE or replace DIRECTORY DIR AS 'c:\sm2000\scripts\';
grant read on directory dir to supermag;
exec supermag.readfile ('imp.txt','WI',1,0,'Приход 12.12.2013 + 1%')
Файл imp.txt:
Код:
ПНМК042415
ПНМК042417
ПНМК042445
ПНМК042459
Сделано на коленке. Помидорами не бросаться.
Можно брать за основу для любых извращений, типа засовывания карточек, штрихкода, цены из текстового файла в супермаг или запихивания накладных поставщиков в текстовом виде.