13.12.2013 16:38
Пришла задача сделать для коммерсов такую вещь - они готовят текстовый файл с номерами накладных, нажимают кнопку и цены в накладной увеличиваются на определённый процент.

Вот что получилось:

Функция, читающая файл.
В неё передаётся имя файла, тип документа, процент наценки, тип операции, комментарий.
Если тип не передаётся, то это означает, что тип берётся из этого же файла.

Старая цена остаётся в столбце "цена в валюте", а сумма в "сумма в валюте".

В качестве защиты от дурака, меняет только документы в черновике и с пустым комментарием.

Код:
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
Сделано на коленке. Помидорами не бросаться.
Можно брать за основу для любых извращений, типа засовывания карточек, штрихкода, цены из текстового файла в супермаг или запихивания накладных поставщиков в текстовом виде.
Часовой пояс GMT +3, время: 04:28.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.