// скрипт для импорта прайс-листа Протек-18. используется процедурой 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 var // предопределенные скриптом переменные Filename :string; // Файл импорта SelfLoader :TPriceLoader; // вызывающий объект // собственные объекты var Table :TTable; tmpDir :string; tmpfile :string; Mappings :string; CDS :Tclientdataset; List :tstringlist; BodyIndex :integer; begin table := ttable.create(selfscript); try tmpdir := includetrailingpathdelimiter(gettempdir+'tmpscriptimport-'+formatdatetime('dd-mm-yyyy-hh-nn-ss',now)); forcedirectories(tmpdir); tmpfile := tmpdir + 'tmpprice'+uppercase(extractfileext(filename)); copyfile(filename,tmpfile); try if uppercase(extractfileext(filename))='.DBF' then begin table.tablename := tmpfile; table.tabletype := ttFoxpro; //SetTableLangDriver(table,'DBWINUS0'); //SetTableLangDriver(Table,'db866ru0'); //CheckDBFCP(Table.TableName,87); //866DOS - 38 table.open; if table.findfield('IDENT')<>nil then begin table.close; CheckDBFCP(Table.TableName,87); //866DOS - 38 table.open; Mappings := 'IDENT=CODE_GOODS;'+ 'NAME=NAME_GOODS;'+ 'MANUF=NAME_PRODUCER;'+ 'COUNTRY=NAME_COUNTRY;'+ 'PRICE=PRICE;'+ 'PRICER=PRICE_REGISTRY;'+ 'PRICEPR=PRICE_FIRST;'+ 'QTY=AMOUNT;'+ 'DATEEXP=SHELF_LIFE;'+ //'EAN13=BARCODE;'+ 'PACK=PLACE_CAP;'+ 'NDS=NDS;'+ 'LIFE=ISLIVENEED'; end { else if table.findfield('MANUFAC')<>nil then begin Mappings := 'CODE=CODE_GOODS;'+ 'NAME=NAME_GOODS;'+ 'MANUFAC=NAME_PRODUCER;'+ // 'COUNTRY=NAME_COUNTRY;'+ 'PRICE=PRICE;'+ // 'PRICER=PRICE_REGISTRY;'+ // 'PRICEPR=PRICE_FIRST;'+ 'BALANCE=AMOUNT;'+ 'EXPDATE=SHELF_LIFE;'+ 'MINORDER=MIN_AMOUNT'; //'EAN13=BARCODE;'+ // 'PACK=PLACE_CAP;'+ // 'NDS=NDS;'+ // 'LIFE=ISLIVENEED'; end } else Mappings := 'CODEPST=CODE_GOODS;'+ 'NAME=NAME_GOODS;'+ 'FIRM=NAME_PRODUCER;'+ 'COUNTRY=NAME_COUNTRY;'+ 'PRICE2=PRICE;'+ 'PRICEGR=PRICE_REGISTRY;'+ 'PRICEN=PRICE_FIRST;'+ 'QNT=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 if uppercase(extractfileext(filename))='.XLS' then begin cds := tclientdataset.create(selfscript); readxls(cds, filename,false,true); Mappings := 'Код=CODE_GOODS;'+ 'Наименование=NAME_GOODS;'+ 'Производитель=NAME_PRODUCER;'+ 'Цена с НДС_0_=PRICE;'+ 'Упаковка=PLACE_CAP;'+ 'Срок годности=SHELF_LIFE;'+ 'Мин_Упаковка=MIN_AMOUNT'; SElfLoader.InitFieldsToDefault; SelfLoader.InitImportCDS; TableAppend(selfloader.importcds,cds,false,Mappings); end else if uppercase(extractfileext(filename))='.TXT' then begin cds := tclientdataset.create(selfscript); List := tstringlist.create; try list.loadfromfile(filename); if (list.count>0) and (list[0] = 'Code|Name|Pack|Manufactor|Country|Amount|Reest|Proizv|Cost|Expire') then begin ReadTXTList(cds,list,'|'); Mappings := 'CODE=CODE_GOODS;'+ 'NAME=NAME_GOODS;'+ 'MANUFACTOR=NAME_PRODUCER;'+ 'COUNTRY=NAME_COUNTRY;'+ 'AMOUNT=Amount;'+ 'REESTR=PRICE_REGISTRY;'+ 'PROIZV=PRICE_FIRST;'+ 'COST=PRICE;'+ 'Упаковка=PLACE_CAP;'+ 'EXPIRE=SHELF_LIFE;'+ 'PACK=MIN_AMOUNT'; SElfLoader.InitFieldsToDefault; SelfLoader.InitImportCDS; TableAppend(selfloader.importcds,cds,false,Mappings); end; finally list.free; end end else if uppercase(extractfileext(filename))='.SST' then begin cds := tclientdataset.create(selfscript); List := tstringlist.create; try list.loadfromfile(filename); BodyIndex := list.indexof('[BODY]'); if (list.count>0) and (BodyIndex>=0) then begin ReadTXTList(cds,list,';',False,'',ctNone,false,1,false,BodyIndex+1); SElfLoader.InitFieldsToDefault; SelfLoader.InitImportCDS; cds.first; while not cds.eof do begin with selfloader.importcds do begin append; Fieldbyname('code_goods').asstring := cds.fields[0].asstring; Fieldbyname('name_goods').asstring := cds.fields[1].asstring; fieldbyname('name_producer').asstring := cds.fields[2].asstring; fieldbyname('place_cap').asstring := cds.fields[3].asstring; fieldbyname('amount').asstring := cds.fields[4].asstring; fieldbyname('price').asstring := cds.fields[5].asstring; fieldbyname('shelf_life').asstring := cds.fields[6].asstring; post; end; cds.next; end; end; finally list.free; end; end; finally cleardir(tmpdir); deletedir(tmpdir); end; finally //mappings.free; table.free end; end.