Выгрузка в Партнер (Катрен) — различия между версиями
Lander (обсуждение | вклад) |
Lander (обсуждение | вклад) |
||
| Строка 12: | Строка 12: | ||
устанавливаем в базу две процедуры | устанавливаем в базу две процедуры | ||
| + | === PR_LOAD_MOVE_PARTNER === | ||
| + | |||
| + | |||
<pre> | <pre> | ||
SET TERM ^ ; | SET TERM ^ ; | ||
| Строка 121: | Строка 124: | ||
GRANT SELECT ON VALS TO PROCEDURE PR_LOAD_MOVE_PARTNER; | GRANT SELECT ON VALS TO PROCEDURE PR_LOAD_MOVE_PARTNER; | ||
GRANT SELECT ON G$PROFILES TO PROCEDURE PR_LOAD_MOVE_PARTNER; | GRANT SELECT ON G$PROFILES TO PROCEDURE PR_LOAD_MOVE_PARTNER; | ||
| − | + | ||
/* Existing privileges on this procedure */ | /* Existing privileges on this procedure */ | ||
| Строка 129: | Строка 132: | ||
и процедуру выгрузки остатков | и процедуру выгрузки остатков | ||
| − | + | === PR_LOAD_PARTNER === | |
<pre>SET TERM ^ ; | <pre>SET TERM ^ ; | ||
| Строка 203: | Строка 206: | ||
GRANT SELECT ON VALS TO PROCEDURE PR_LOAD_PARTNER; | GRANT SELECT ON VALS TO PROCEDURE PR_LOAD_PARTNER; | ||
GRANT SELECT ON G$PROFILES TO PROCEDURE PR_LOAD_PARTNER; | GRANT SELECT ON G$PROFILES TO PROCEDURE PR_LOAD_PARTNER; | ||
| − | + | ||
/* Existing privileges on this procedure */ | /* Existing privileges on this procedure */ | ||
| Строка 209: | Строка 212: | ||
GRANT EXECUTE ON PROCEDURE PR_LOAD_PARTNER TO SYSDBA; </pre> | GRANT EXECUTE ON PROCEDURE PR_LOAD_PARTNER TO SYSDBA; </pre> | ||
| − | + | === Добавляем поля, папки и необходимые файлы === | |
так же в таблице G$PROFILES нужно создать поле '''PARTNER_ID''' | так же в таблице G$PROFILES нужно создать поле '''PARTNER_ID''' | ||
<pre>ALTER TABLE G$PROFILES | <pre>ALTER TABLE G$PROFILES | ||
| Строка 224: | Строка 227: | ||
после подготовительной работы создаем ТМС | после подготовительной работы создаем ТМС | ||
| + | === ТМС выгрузки === | ||
| + | |||
<pre>uses | <pre>uses | ||
unDM, cfIBUtils, unFrameCustomDict, need, cfUtils, | unDM, cfIBUtils, unFrameCustomDict, need, cfUtils, | ||
Версия 13:10, 29 декабря 2018
Разработана выгрузка в систему Партнер от поставщика Катрен
Существует в двух форматах для SpacePro (сети) и для Менеджера (Единичные аптеки)
Выгрузка осуществляется на фтп - partner.melzdrav.ru
для выгрузки партнер должен нам предоставить код клиента в формате - partner16666 и пароль
выгрузки делятся по регионам Уфа,Москва,Казань путь выгрузки не меняется меняются ответственные лица которые дают доступ
1. Сводная база (единое окно) устанавливаем в базу две процедуры
Содержание
PR_LOAD_MOVE_PARTNER
SET TERM ^ ;
create or alter procedure PR_LOAD_MOVE_PARTNER (
DATESTART DM_DATE,
DATEEND DM_DATE,
G$PROFILE_ID integer)
returns (
PARTNER_ID integer,
DRUG_NAME DM_TEXT,
DRUG_CODE integer,
DOCNUM DM_TEXT,
DOCDATE DM_DATETIME,
IZG_ID DM_UUID_NULL,
DRUG_PRODUCER_NAME DM_TEXT,
DRUG_PRODUCER_COUNTRY DM_TEXT,
BARCODE DM_TEXT,
CENA_ZAK DM_DOUBLE,
GODENDO_DATE DM_DATE,
SERIA DM_TEXT,
G$PROFILE_ID_OUT integer,
QUANT DM_DOUBLE,
BCODEIZG DM_TEXT,
DISK_T DM_DOUBLE,
DISK_SUM DM_DOUBLE,
SUM_ZAK DM_DOUBLE,
SUM_ROZN DM_DOUBLE,
CENA_ROZN DM_DOUBLE,
D_TYPE integer,
SUPPLIER DM_TEXT,
SUPPLIER_INN DM_TEXT,
DEVICE_NUM DM_TEXT,
N_CHEK DM_TEXT,
FIO_CHEK DM_TEXT,
PP_TEG DM_TEXT)
as
declare variable DOC_ID integer;
begin
for select
dd.part_id as Drug_code,
dd.doc_id,
cast(abs(sum(dd.quant)) as dm_double) as quant,
iif ((abs (dd.discount)>0),1,0) as disk_T,
cast(abs(dd.sum_dsc) as numeric(9,2)) as Disk_Sum,
abs(dd.summa_o) as Sum_Zak,
abs(dd.summa) as Sum_Rozn,
abs(dd.price) as Cena_Rozn,
dd.g$profile_id
from doc_detail dd
where dd.doc_id is not null and dd.doc_commitdate between :DATESTART and :DATEEND and dd.g$profile_id = :g$profile_id
group by dd.part_id, dd.doc_id,dd.discount,dd.sum_dsc,dd.summa_o,dd.summa,dd.price,dd.g$profile_id
into :drug_code, :doc_id, :quant, :disk_T, :disk_sum, :Sum_Zak, :Sum_Rozn, :Cena_Rozn , :g$profile_id_out do
begin
select g.partner_id,
iif (d.doc_type=1,10,iif(d.doc_type=3,20,d.doc_type))as d_type,
left(d.docnum,iif(position(' ',d.docnum)=0,char_length(d.docnum), position(' ',d.docnum)))as docnum,
cast(d.docdate as date)as docdate,
a.caption as Supplier,
a.inn as Supplier_INN,
d.device_num,
iif(d.doc_type=3,d.docnum, '')as N_Chek,
(select first 1 u.username from users u where u.id=d.owner)as FIO_Chek,
0 as pp_teg,
vname.svalue as Drug_name,
w.izg_id,
vorig_izg.svalue as Drug_Producer_Name,
w.barcode as bcodeizg,
vcountry.svalue as Drug_Producer_country,
p.price_o as Cena_Zak,
p.seria,
iif (p.godendo is not null, cast(p.godendo as date),'01.01.1990') as godendo_date,
p.barcode
from docs d
left join parts p on p.id = :drug_code and p.g$profile_id=d.g$profile_id
left join agents a on a.id = d.agent_id and a.g$profile_id=p.g$profile_id
left join wares w on w.id=p.ware_id
left join vals vorig_izg on vorig_izg.id=w.izg_id
left join vals vcountry on vcountry.id=w.country_id
left join vals vname on vname.id=w.name_id
left join g$profiles g on g.id = p.g$profile_id
where d.g$profile_id = :G$PROFILE_ID_OUT and d.doc_type in (1,2,3,6,9)
and d.id=:doc_id and d.docdate between :DATESTART and :DATEEND and d.docdate is not null
into :partner_id, :d_type, :docnum, :docdate, :supplier, :supplier_inn, :device_num, :n_chek, :fio_chek, :pp_teg, :drug_name, :izg_id, :drug_producer_name,
:bcodeizg, :drug_producer_country, :cena_zak, :seria, :godendo_date, :barcode;
suspend;
end
end^
SET TERM ; ^
/* Following GRANT statements are generated automatically */
GRANT SELECT ON DOC_DETAIL TO PROCEDURE PR_LOAD_MOVE_PARTNER;
GRANT SELECT ON USERS TO PROCEDURE PR_LOAD_MOVE_PARTNER;
GRANT SELECT ON DOCS TO PROCEDURE PR_LOAD_MOVE_PARTNER;
GRANT SELECT ON PARTS TO PROCEDURE PR_LOAD_MOVE_PARTNER;
GRANT SELECT ON AGENTS TO PROCEDURE PR_LOAD_MOVE_PARTNER;
GRANT SELECT ON WARES TO PROCEDURE PR_LOAD_MOVE_PARTNER;
GRANT SELECT ON VALS TO PROCEDURE PR_LOAD_MOVE_PARTNER;
GRANT SELECT ON G$PROFILES TO PROCEDURE PR_LOAD_MOVE_PARTNER;
/* Existing privileges on this procedure */
GRANT EXECUTE ON PROCEDURE PR_LOAD_MOVE_PARTNER TO SYSDBA;
и процедуру выгрузки остатков
PR_LOAD_PARTNER
SET TERM ^ ;
create or alter procedure PR_LOAD_PARTNER (
DATEEND DM_DATE,
G$PROFILE_ID integer)
returns (
PARTNER_ID integer,
SNAME DM_TEXT,
PART_ID integer,
DOCNUM DM_TEXT,
DOCDATE DM_DATETIME,
DOCAGENT DM_TEXT,
IZG_ID DM_UUID_NULL,
SIZG DM_TEXT,
SCOUNTRY DM_TEXT,
BARCODE DM_TEXT,
PRICE_O DM_DOUBLE,
PRICE DM_DOUBLE,
GODENDO_DATE DM_DATE,
SERIA DM_TEXT,
G$PROFILE_ID_OUT integer,
QUANT DM_DOUBLE,
INN DM_TEXT,
BCODE_IZG DM_TEXT)
as
begin
for select dd.part_id,cast(abs(sum(dd.quant)) as dm_double) as quant, g$profile_id
from doc_detail dd
where dd.doc_commitdate<=:DATEEND and dd.g$profile_id = :g$profile_id
group by dd.part_id, g$profile_id
having abs(sum(dd.quant))>0.001 into :part_id, :quant, :G$PROFILE_ID_OUT do
begin
select g.partner_id,
:DATEEND as docdate,
(select (select a.caption from agents a where a.id=pr.agent_id and a.g$profile_id=p.g$profile_id ) from pr_getmotherpart(p.id, :G$PROFILE_ID) pr)as docagent,
left(d.docnum,iif(position(' ',d.docnum)=0,char_length(d.docnum), position(' ',d.docnum)))as docnum,
(select a.inn from agents a where d.agent_id=a.id and a.g$profile_id=p.g$profile_id) as INN,
w.izg_id,
v_izg.svalue as sizg,
v_strana.svalue as scountry,
v_sname.svalue as sname,
w.barcode as bcode_izg,
cast (abs(p.price_o) as numeric(9,2)) as price_o,
cast (abs(p.price) as numeric(9,2)) as price,
iif (p.godendo is not null, cast(p.godendo as date),'01.01.1900') as godendo_date,
p.seria,
p.barcode
from parts p
left join docs d on d.id=p.doc_id and d.g$profile_id=p.g$profile_id
left join wares w on w.id=p.ware_id
left join vals v_izg on v_izg.id=w.izg_id
left join vals v_strana on v_strana.id=w.country_id
left join vals v_sname on v_sname.id=w.name_id
left join g$profiles g on g.id = p.g$profile_id
where p.id = :part_id and p.g$profile_id = :G$PROFILE_ID_OUT
into :partner_id, :docdate, :docagent, :docnum, :INN, :izg_id, :sizg, :scountry, :sname, :bcode_izg, :price_o, :price,:godendo_date, :seria, :barcode;
suspend;
end
end^
SET TERM ; ^
/* Following GRANT statements are generated automatically */
GRANT SELECT ON DOC_DETAIL TO PROCEDURE PR_LOAD_PARTNER;
GRANT SELECT ON AGENTS TO PROCEDURE PR_LOAD_PARTNER;
GRANT EXECUTE ON PROCEDURE PR_GETMOTHERPART TO PROCEDURE PR_LOAD_PARTNER;
GRANT SELECT ON PARTS TO PROCEDURE PR_LOAD_PARTNER;
GRANT SELECT ON DOCS TO PROCEDURE PR_LOAD_PARTNER;
GRANT SELECT ON WARES TO PROCEDURE PR_LOAD_PARTNER;
GRANT SELECT ON VALS TO PROCEDURE PR_LOAD_PARTNER;
GRANT SELECT ON G$PROFILES TO PROCEDURE PR_LOAD_PARTNER;
/* Existing privileges on this procedure */
GRANT EXECUTE ON PROCEDURE PR_LOAD_PARTNER TO SYSDBA;
Добавляем поля, папки и необходимые файлы
так же в таблице G$PROFILES нужно создать поле PARTNER_ID
ALTER TABLE G$PROFILES ADD PARTNER_ID DM_ID_NULL
данное поле в дальнейшем надо заполнить кодами клиента партнера используя только числовые значения ПРИМЕР код partner12000 в поле вводим 12000
Так же для успешной работы нам необходима папка c:\standart-n\Partner в этой папке будет создаваться файлы выгрузки а так же должен лежать клиент ФТП - ncftpput.exe
и создаем файл по пути c:\standart-n\spacepro - partner.log
после подготовительной работы создаем ТМС
ТМС выгрузки
uses
unDM, cfIBUtils, unFrameCustomDict, need, cfUtils,
inifiles, unMain, unFRFramePreview,
Classes, Graphics, Controls, Forms, Dialogs, AdvPanel,
AdvGlowButton, DB, IBDatabase, IBQuery, ExtCtrls, StdCtrls,
dxExEdtr, dxCntner, dxTL, dxDBCtrl, dxDBTL, Buttons, ComCtrls,
AdvOfficePager,dateUtils, ImgList, ShellApi,Windows,unDM,sysUtils;
const
//Пути выгрузки по профилям
path='\Standart-N\partner\';
//Доступ профилей на ФТП
login='partner15339';
pass='AYJXS-wlubj-4ami-5uvo-ksbzn';
url='partner.melzdrav.ru';
var q,q1,q3: TIBQuery;
sl,sl1: TStringList;
SQL,t,t1,f,f1,org_name,org_inn,codeClient,path1: String;
date_start,date_end:date;
today:Tdatetime;
fsLog: TFileStream;
procedure LogIt(s: string);
begin
s:=formatdatetime('dd.mm.yyyy hh:nn:ss',now)+#9+s+#13#10;
cfStreamWrite(fsLog,s);
// fsLog.Write(s,length(s));
end;
function filename:String;
var
t,y,m,d:String;
begin
d:=Copy(DatetoStr(date_end),0,2);
m:=Copy(DatetoStr(date_end),4,2);
y:=Copy(Datetostr(date_end),7,4);
t:=StringReplace(time,':','',1);
if Length(t)<6 then t:='0'+t;
result:=y+m+d+t;
end;
//Архивируем файл
Procedure ZIP (f:string);
var
fz:string;
begin
fz:=' a -tzip -sdel '+f+'.zip '+ f ;
LogIt(fz);
shellExecuteA(0,'open','C:\Program Files\7-Zip\7z.exe',fz,'',5);
end;
//Посылаем по ФТП
Procedure FTP (f,login,pass,path:string);
const
files=extractfiledrive(application.ExeName)+path;
begin
t:='-F -DD -u '+login+' -p '+pass+' '+url+' \ '+files+f;
frmSpacePro.logit(t);
ShellExecuteA(0, 'open',files+'ncftpput.exe', t, '', 5);
end;
//проверяем наличие файла в директории
Function CheckFiles (codeClient,FileName1,pathz:String):String;
var
fn:string
begin
fn:=Filename;
sl:= TStringList.Create;
sl1:= TStringList.Create;
result:=extractfiledrive(application.ExeName)+pathz+codeClient+'$'+fn+FileName1;
if FileExists(result) then
begin
deletefile(result);
end
end;
//получаем данные из запроса
Function GetSQLResult(SQL:String):TIBQuery;
var
q2:TIBQuery;
begin
try
LogIt(SQL);
q2:=dm.TempQuery(nil);
q2.Active:=false;
q2.SQL.Text:=SQL;
q2.Active:=true;
except
frmSpacePro.logit('неверный запрос-'+SQL);
q2.Transaction.Rollback;
end;
result:=q2;
end;
Procedure ExtractBase(i,partner_id:integer;path:String); //Выгрузка остатков
Begin
SQL:='select * from pr_load_partner('''+DateToStr(date_start)+''','+IntToStr(i)+') where Docnum is not null ';
// frmSpacePro.logit(SQL);
q:=GetSQLResult(SQL);
f:=CheckFiles(InttoStr(partner_id),'.ost',path);
logit(f);
frmSpacePro.logit('Выгружаем остатки');
{ t:='Тип Данных по строке;Номер Документа из программы участника;Дата создания или изменения строки документа из программы участника'+
';Поставщик;ИНН Поставщика;Номер ККМ;Номер чека из программы участника;ФИО Кассира;Тип скидки по строке чека;'+
'Cумма скидки по строке чека;Закупочная сумма по строке чека;Розничная сумма по строке чека;Признак использования модуля "Приоритетная рекомендация" по строке чека;'+
'Код Товара по справочнику товаров;Наименование Товара по справочнику товаров;Код производителя по справочнику производителей;'+
'Наименование Производителя по справочнику производителей;Название страны производителя;Штрих код завода изготовителя;'
+'Цена за единицу закупочная в рублях, округление до целых копеек;Цена за единицу розничная в рублях,округление до целых копеек;Количество;Серия товара;Срок годности товара;'+
'Уникальный код партии из системы учета товародвижения,в формате штрих кода EAN-13;';
sl.Add(t);}
while not q.eof do
begin
t:=
'0;'+ //1
q.fieldbyname('Docnum').AsString+';' //2
+StringReplace(DateToStr(date_end),'.','',1) +';' //3
+q.fieldbyname('docagent').AsString+';' //4
+q.fieldbyname('INN').AsString+';' //5
+';' //6
+';' //7
+';' //8
+';' //9
+';' +';' //10-11
+';' //12
+';' //13
+q.fieldbyname('PART_ID').AsString+';' //14
+StringReplace(StringReplace(q.fieldbyname('SNAME').AsString,';',' ',1),#13#10,'',1)+';' //15
+q.fieldbyname('IZG_ID').AsString+';' //16
+StringReplace(q.fieldbyname('SIZG').AsString,'"','',1)+';' //17
+q.fieldbyname('scountry').AsString+';' //18
+StringReplace(q.fieldbyname('bcode_izg').AsString,#13#10,'',1)+';'
+q.fieldbyname('price_o').AsString+';'
+q.fieldbyname('price').AsString+';'
+q.fieldbyname('quant').AsString+';'
+q.fieldbyname('seria').AsString+';'
+StringReplace(q.fieldbyname('godendo_date').AsString,'.','',1)+';'
+q.fieldbyname('barcode').AsString+';';
sl.Add(t);
// frmSpacePro.logit(t);
q.next;
end;
try
sl.SaveToFile(f);
Logit('SavetoFile-'+f);
sl.Free;
sleep(1000);
zip(f);
except
frmSpacePro.logit('неверный путь');
end;
// frmSpacePro.logit('Остатки выгружены');
end;
Procedure ExtractMove(i,partner_id:integer;pathe:string);//Выгрузка движения
Begin
SQL:='select * from pr_load_move_partner('''+DateToStr(date_start)+''','''+DateToStr(date_end)+''','+IntToStr(i)+') where d_type is not null';
//frmSpacePro.logit(SQL);
q:=GetSQLResult(SQL);
f:=CheckFiles(InttoStr(partner_id),'.mov',pathe);
logit(f);
frmSpacePro.logit('Выгружаем Движение');
{t:='Тип Данных по строке;Номер Документа из программы участника;Дата создания или изменения строки документа из программы участника'+
';Поставщик;ИНН Поставщика;Номер ККМ;Номер чека из программы участника;ФИО Кассира;Тип скидки по строке чека;'+
'Cумма скидки по строке чека;Закупочная сумма по строке чека;Розничная сумма по строке чека;Признак использования модуля "Приоритетная рекомендация" по строке чека;'+
'Код Товара по справочнику товаров;Наименование Товара по справочнику товаров;Код производителя по справочнику производителей;'+
'Наименование Производителя по справочнику производителей;Название страны производителя;Штрих код завода изготовителя;'
+'Цена за единицу закупочная в рублях, округление до целых копеек;Цена за единицу розничная в рублях,округление до целых копеек;Количество;Серия товара;Срок годности товара;'+
'Уникальный код партии из системы учета товародвижения,в формате штрих кода EAN-13;';
sl.Add(t);
}
while not q.eof do
begin
t:=
+q.fieldbyname('d_type').AsString+';'
+q.fieldbyname('docnum').AsString+';'
+StringReplace(q.fieldbyname('docdate').AsString,'.','',1) +';'
+q.fieldbyname('Supplier').AsString+';'
+q.fieldbyname('Supplier_INN').AsString+';'
+q.fieldbyname('device_num').AsString+';'
+q.fieldbyname('N_Chek').AsString+';'
+q.fieldbyname('FIO_Chek').AsString+';'
+q.fieldbyname('disk_T').AsString+';'
+q.fieldbyname('Disk_Sum').AsString+';'
+q.fieldbyname('Sum_Zak').AsString+';'
+q.fieldbyname('Sum_Rozn').AsString+';'
+q.fieldbyname('pp_teg').AsString+';'
+q.fieldbyname('Drug_code').AsString+';'
+StringReplace(q.fieldbyname('Drug_name').AsString,#13#10,'',1)+';'
+q.fieldbyname('izg_id').AsString+';'
+StringReplace(q.fieldbyname('Drug_name').AsString,';',' ',1)+';'
//
+q.fieldbyname('Drug_Producer_country').AsString+';'
+StringReplace(q.fieldbyname('bcodeizg').AsString,#13#10,'',1)+';'
+q.fieldbyname('Cena_Zak').AsString+';'
+q.fieldbyname('Cena_Rozn').AsString+';'
+q.fieldbyname('quant').AsString+';'
+q.fieldbyname('seria').AsString+';'
+StringReplace(q.fieldbyname('godendo_date').AsString,'.','',1) +';'
+q.fieldbyname('barcode').AsString+';'
;
sl.Add(t);
q.next;
end;
try
sl.SaveToFile(f);
Logit('SavetoFile-'+f);
sleep(1000);
Zip(f);
except
frmSpacePro.logit('неверный путь');
end;
End;
Procedure InitVar;
begin
//Базовые переменные - периуд отчета.
date_start:=date-1;// DateToStr(date-1); // strtoDate('30.09.2018');//
date_end:=date;// StrToDate('02.10.2018');//DatetoStr(date);//
end;
begin
InitVar;
try
//if not fileexists(extractfilepath(application.ExeName)+'Partner.log') then
//TFileStream.Create(extractfilepath(application.ExeName)+'Partner.log',fmCreate).Free;
fsLog:=TFileStream.Create(extractfilepath(application.ExeName)+'Partner.log',fmOpenReadWrite);
// logit(DatetoStr(date_start));
logit('Начали -'+TimetoStr( time));
//Выгружаем остатки по точкам
SQL:='select id,partner_id from g$profiles where partner_id is not null order by partner_id';
q1:=GetSQLResult(SQL);
while not q1.eof do
begin
path1:=path;
LogIt(q1.fieldbyname('id').AsString); logit(path1);
ExtractBase(q1.fieldbyname('id').AsInteger,q1.fieldbyname('partner_id').AsInteger,path1);
q1.Next;
end;
//выгрузка движение
SQL:='select id,partner_id from g$profiles where partner_id is not null order by partner_id ';
q3:=GetSQLResult(SQL);
while not q3.eof do
begin
logit(q3.fieldbyname('id').AsString);
InitVar;
path1:=path;
//logit(path1+' -- '+q3.fieldbyname('BASE_AGENT_ID').AsString);
// while date_end<>date do
// begin
ExtractMove(q3.fieldbyname('id').AsInteger,q3.fieldbyname('partner_id').AsInteger,path1);
// date_end:=date_end+1;
// date_start:=date_start+1;
// end;
q3.Next;
end;
ftp('*.zip',login,pass,path);
logit('Готово -'+TimetoStr( time));
q.Free;
finally
fsLog.Free;
end;
end;
Если файлы не формируются возможно у вас старая версия архиватора 7ZIP обновите до последней версии.
Финальным этапом после проверки что все формирует и выгружает требуется добавить данную ТМС в планировщик задач. Задачу запускать ежедневно по окончании рабочего времени