// скрипт для импорта прайс-листа. используется процедурой 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; missstrings:integer; isfound :boolean; i :integer; begin table := ttable.create(selfscript); try tmpdir := includetrailingpathdelimiter(gettempdir+'tmpscriptimport-'+formatdatetime('dd-mm-yyyy-hh-nn-ss',now)); forcedirectories(tmpdir); try if uppercase(extractfileext(filename))='.DBF' then begin tmpfile := tmpdir + 'tmpprice.dbf'; copyfile(filename,tmpfile); try table.tablename := tmpfile; //SetTableLangDriver(table,'db866ru0'); SetTableLangDriver(Table,'DBWINUS0'); table.open; Mappings := 'CODE=CODE_GOODS;'+ 'TITLE=NAME_GOODS;'+ 'MANUF=NAME_PRODUCER;'+ 'COUNTRY=NAME_COUNTRY;'+ 'PRICE=PRICE;'+ 'REGPR=PRICE_REGISTRY;'+ 'IZGPR=PRICE_FIRST;'+ 'AVIAIL=AMOUNT;'+ 'EXPIRED=SHELF_LIFE;'+ 'PACK=PLACE_CAP;'+ 'TAX=NDS;'+ 'GNVLS=ISLIVENEED;'+ 'EAN13=BARCODE'; SElfLoader.InitFieldsToDefault; SelfLoader.InitImportCDS; TableAppend(selfloader.importcds,table,false,Mappings); //dataset.close; // чтобы не продолжился импорт finally table.close; end; end else begin cds := tclientdataset.create(selfscript); readxls(cds, filename,false,false,-1); missstrings := 0; cds.first; isFound := false; while not cds.eof do begin for i := 0 to cds.fieldcount-1 do if (cds.fields[i].asstring='Наименование') then begin isfound := true; break; end; if not isfound then begin inc(MissStrings); cds.next; end else break end; if missstrings>= cds.recordcount then RaiseException('Не найдены нужные поля в таблице'); // считаем, сколько строк пропустить readxls(cds, filename,false,true,MissStrings); { Mappings := 'Код=CODE_GOODS;'+ 'Наименование=NAME_GOODS;'+ 'Производитель=NAME_PRODUCER;'+ //'COUNTRY=NAME_COUNTRY;'+ 'Цена с НДС_ руб=PRICE;'+ 'Остаток=AMOUNT;'+ 'ЖНВЛС=ISLIVENEED;'+ 'Цена изготовителя_ руб=PRICE_FIRST;'; } SElfLoader.InitFieldsToDefault; SelfLoader.InitImportCDS; //TableAppend(selfloader.importcds,cds,false,Mappings); cds.first; while not cds.eof do begin with selfloader.importcds do begin append; fieldbyname('code_goods').asstring := cds.fieldbyname('Код').asstring; fieldbyname('name_goods').asstring := cds.fieldbyname('Наименование').asstring; fieldbyname('name_producer').asstring := cds.fieldbyname('Производитель').asstring; //fieldbyname('name_country').asstring := cds.fieldbyname('country').asstring; fieldbyname('price').asstring := cds.fieldbyname('Цена с НДС_ руб').asstring; //fieldbyname('price_registry').asstring := cds.fieldbyname('regpr').asstring; fieldbyname('price_first').asstring := cds.fieldbyname('Цена изготовителя_ руб').asstring; //fieldbyname('shelf_life').asstring := cds.fieldbyname('expired').asstring; //fieldbyname('place_cap').asstring := cds.fieldbyname('pack').asstring; //fieldbyname('nds').asstring := cds.fieldbyname('tax').asstring; fieldbyname('isliveneed').asstring := cds.fieldbyname('ЖНВЛС').asstring; //fieldbyname('barcode').asstring := cds.fieldbyname('ean13').asstring; if (trim(cds.fieldbyname('Остаток').asstring) <> '') and (trim(cds.fieldbyname('Остаток').asstring) <> '+') then fieldbyname('amount').asstring := cds.fieldbyname('Остаток').asstring; post; end; cds.next; end; end; finally cleardir(tmpdir); deletedir(tmpdir); end; finally //mappings.free; table.free end; end.