// скрипт для импорта прайс-листа Катрен. используется процедурой Loader.LoadFromFileWithScript // на вход подается открытый Dataset, который нужно заполнить в соответствии с полями: { add('code',ftstring,50); add('code_goods',ftstring,50); add('name_goods',ftstring,300); add('code_producer',ftstring,50); add('name_producer',ftstring,300); add('code_country',ftstring,50); add('name_country',ftstring,300); add('price',ftstring,50); add('price_without_nds',ftstring,50); add('price_first',ftstring,50); add('price_first_with_nds',ftstring,50); add('nds',ftstring,50); add('shelf_life',ftstring,50); add('ex_rate',ftstring,50); add('price_rtl',ftstring,50); add('amount',ftstring,50); add('id_valuta',ftstring,50); add('min_amount',ftstring,50); add('units',ftstring,50); add('place_cap',ftstring,50); add('isliveneed',ftstring,50); add('price_registry',ftstring,50); add('barcode',ftstring,50); } // если вернуть закрытый датасет, то операция не будет продолжена, и предполагается, что скрипт самостоятельно разобрался с прайсом. // для самостоятельности скрипту передается ID - идентификатор прайса, который сейчас заливается. // но в целом задача скрипта - транспортировать данные из файла Filename в Dataset const //unpackcmd =' "c:\program files\winrar\unrar.exe" e -y "%s" "%s"'; unpackcmd =' "c:\program files\7-zip\7z.exe" e -y "%s" -o"%s"'; var // предопределенные скриптом переменные Filename :string; // Файл импорта SelfLoader :TPriceLoader; // вызывающий объект // собственные объекты var Table :ttable; tmpDir :string; tmpfile :string; Mappings :string; strval :string; cds :tclientdataset; dt :tdatetime; distinctcnt :integer = 0; begin table := ttable.create(selfscript); try tmpdir := includetrailingpathdelimiter(getuniquedirname); forcedirectories(tmpdir); tmpfile := tmpdir + extractfilename(FileName); copyfile(filename,tmpfile); if uppercase(Extractfileext(tmpfile)) = '.ZIP' then begin tmpfile := ZipExtractAll(tmpfile,tmpdir); tmpfile := tmpdir + tmpfile; end else if uppercase(Extractfileext(tmpfile)) = '.RAR' then begin FileExecuteWait(format(unpackcmd,[tmpfile,tmpdir]), esNormal); tmpfile := tmpdir + 'price_1.dbf'; end; try if uppercase(extractfileext(tmpfile))='.DBF' then begin table.tablename := tmpfile; table.tabletype := ttFoxpro; SetTableLangDriver(table,'db866ru0'); //SetTableLangDriver(Table,'DBWINUS0'); table.open; Mappings := 'CODEPST=CODE_GOODS;'+ 'NAME=NAME_GOODS;'+ 'FIRM=NAME_PRODUCER;'+ 'CNTR=NAME_COUNTRY;'+ 'PRICE1=PRICE;'+ 'PRICE2=PRICE;'+ 'PRICEGR=PRICE_REGISTRY;'+ //'IZGPR=PRICE_FIRST;'+ 'QNT=AMOUNT;'+ //'PACK=MIN_AMOUNT;'+ 'GDATE=SHELF_LIFE;'+ 'EAN13=BARCODE;'+ 'QNTPACK=PLACE_CAP;'+ 'NDS=NDS;'+ 'GNVLS=ISLIVENEED'; SElfLoader.InitFieldsToDefault; SelfLoader.InitImportCDS; TableAppend(selfloader.importcds,table,false,Mappings); //dataset.close; // чтобы не продолжился импорт end else begin //TXT //good-vendor id, good id, vendor id, наименование, //производитель, цена прайсовая, реестр. цена, срок годности cds := tclientdataset.create(selfscript); ReadTXT(cds,tmpfile,'|',false); SElfLoader.InitFieldsToDefault; SelfLoader.InitImportCDS; //selfloader.importcds.logchanges := false; selfloader.importcds.indexfieldnames := 'code_goods;code_producer;name_goods;name_producer;price;price_registry;shelf_life'; cds.first; while not cds.eof do begin with selfloader.importcds do begin if not findkey([ cds.fields[0].asstring+'|'+cds.fields[1].asstring, cds.fields[2].asstring, cds.fields[3].asstring, cds.fields[4].asstring, cds.fields[5].asstring, cds.fields[6].asstring, cds.fields[8].asstring ]) then begin append; //fieldbyname('code').asstring := cds.fields[0].asstring; fieldbyname('code_goods').asstring :=cds.fields[0].asstring+'|'+cds.fields[1].asstring; fieldbyname('code_producer').asstring := cds.fields[2].asstring; fieldbyname('name_goods').asstring := cds.fields[3].asstring; fieldbyname('name_producer').asstring := cds.fields[4].asstring; fieldbyname('price').asstring := cds.fields[5].asstring; fieldbyname('price_registry').asstring := cds.fields[6].asstring; fieldbyname('shelf_life').asstring := cds.fields[8].asstring; fieldbyname('amount').asstring := cds.fields[7].asstring; post; end else begin inc(distinctcnt); edit; fieldbyname('amount').asstring := floattostr(strtofloatprotected(fieldbyname('amount').asstring) + strtofloatprotected(cds.fields[7].asstring)); post; end; end; cds.next; end; selfloader.importcds.indexfieldnames := ''; //createhint('Повторов: '+inttostr(distinctcnt),'',60); end; finally table.close; cleardir(tmpdir); deletedir(tmpdir); end finally //mappings.free; table.free end; end.