// скрипт просматривает внешний файл с расставленными там кодами товаров и производителей и переносит штрихкоды в нашу базу там, где найдены пары

const Trim13 = true; // обрезать ли 13-й символ. зависит от настроек самой базы

      CheckOnlyBlankBarcodes = false;


var CDS,cds1 :TClientdataset;
    StrVal :string;
    KeyMappings :tstringlist;

    RecC :integer;
    RecWithoutNN :integer;
    REcWithoutID_Producer :integer;
    RecWithoutBarcode :integer;
    RecFound :integer;
    RecChanged :integer;
    RecOtherBarcodes :integer;

    table :ttable;
    Barcode :string;

    function CorrectBarcode1(const Barcode :string) :string;
    var i :integer;
    begin
      Result := barcode;
      for i:= length(Result) downto 1 do
      begin
        if not (result in ['0'..'9'])
        then delete(result,i,1);
      end;
      if trim13 and (length(result)>=13) then delete(result,13,1);
    end;
begin
  cds := tclientdataset.create(selfscript);
  KeyMappings :=  tstringlist.create;
  try
    table := ttable.create(cds);
    cds1 := tclientdataset.create(cds);

    cds1.fielddefs.add('NN',ftstring,20,false);
    cds1.fielddefs.add('ID_PRODUCER',ftstring,20,false);
    cds1.fielddefs.add('BARCODE',ftstring,20,false);
    cds1.fielddefs.add('ID_PRT',ftinteger,0,false);
    cds1.fielddefs.add('NN_PRT',ftstring,20,false);
    cds1.fielddefs.add('ID_PRODUCER_PRT',ftstring,20,false);
    cds1.fielddefs.add('BARCODE_PRT',ftstring,20,false);
    cds1.createdataset;
    cds1.logchanges := false;

    keymappings.add('BARCODE=Штрихкод');
    keymappings.add('NN=Наш код товара');
    keymappings.add('ID_PRODUCER=Наш код производителя');

    StrVAl :=AppiniFile.readstring(extractfilenamewithoutext(selfscript.filename),'Variant','');
    if not readtable(cds)
       or not copytab2tab(cds,CDS1,KeyMappings,false,StrVAl)
    then exit;

    cds.close;

    AppiniFile.writestring(extractfilenamewithoutext(selfscript.filename),'Variant',StrVAl);

    case GetConfirm('Вы хотите заменить штрихкоды везде в базе, где найдутся указанные пары кодов товаров и производителей.'+#13+#13+
                  'Вы хотите сделать резервную копию?','Пропустить','Сделать бекап','СТОП,СТОП!') of
       mrOk : if  backupdatabase<> '' then exit;
       mrCancel : exit;
    end;


    with tmywait.create1('Идет анализ данных',selfscript) do
    try

      RecC := cds1.recordcount;
      RecWithoutNN := 0;
      recwithoutbarcode := 0;
      REcWithoutID_Producer := 0;
      RecFound := 0;
      RecChanged := 0;
      RecOtherBarcodes := 0;

      table.tablename := 'pr_tovar.db';
      table.databasename := 'dbkassa';
      table.open;

      //table.indexfieldnames := 'nn';

      progressbarmax := recc;

      advancedtext := 'Индексирование файла';
      cds1.indexfieldnames := 'nn;id_producer';
      //cds1.savetofile(gettempdir+'cds1.cds');

      advancedtext :=' Анализ заполненных полей';

      cds1.first;
      while not cds1.eof do
      begin
        barcode := CorrectBarcode1(cds1.fieldbyname('barcode').asstring);

        if length(barcode)=0
        then begin
          recwithoutbarcode := recwithoutbarcode+1;
          cds1.delete; // уберем пустые, чтобы не мешали логике работы
        end
        else begin
          if cds1.fieldbyname('nn').asstring = ''
          then recwithoutnn := recwithoutnn + 1
          else if cds1.fieldbyname('id_producer').asstring=''
          then recwithoutid_producer := recwithoutid_producer+1
          else begin
            (*

  select a.id,a.nn,a.producer,a.barcode,b."Штрих-код"
  from pr_tovar a join "C:\database\288\Отчет ЖНВЛС 123000.db" b
  on a.nn = b."Код" and a.producer = b."Код производителя"

            table.cancelrange;
            table.setrangestart;
            table.fieldbyname('nn').asstring := cds1.fieldbyname('nn').asstring;
            table.setrangeend;
            table.fieldbyname('nn').asstring := cds1.fieldbyname('nn').asstring;
            table.applyrange;

            table.first;
            while not table.eof do begin
              if table.fieldbyname('producer').asinteger = strtointprotected(cds1.fieldbyname('id_producer').asstring)
              then begin
                recfound := recfound + 1;

                if (table.fieldbyname('barcode').asstring<> cds1.fieldbyname('barcode').asstring)
                then begin
                   if (table.fieldbyname('barcode').asstring>'') // там вообще что-то есть
                      and (length(table.fieldbyname('barcode').asstring)>=8) // Это реальный штрихкод, а не какое-то просто число
                      and (table.fieldbyname('barcode').asstring<>getbarcode(table.fieldbyname('kart').asinteger,idtGoods)) // это не сгенерированный автоматом штрихкод
                   then recotherbarcodes := recotherbarcodes + 1
                   else begin
                     RecChanged := RecChanged +1;
                   end
                end;
              end;
              table.next;
            end;
            *)
          end;

          cds1.next;
        end;

        application.processmessages;
        incprogress;
      end;

      advancedtext := 'анализ кодов товаров и производителей в базе';

      progressbarmax := table.recordcount;
      progressbarpos := 0;
      table.first;
      while not table.eof do
      begin
        if (table.fieldbyname('nn').asstring>'')
           and (table.fieldbyname('producer').asinteger<>0)
           and cds1.findkey([table.fieldbyname('nn').asstring,table.fieldbyname('producer').asstring])
        then begin
          recfound := recfound + 1;
          //table.edit;
          //table.fieldbyname('GOST').asstring := '1';
          //table.post;

          //repeat    // если нарвемся на плохой штрихкод, то продолжить поиски
              barcode := CorrectBarcode1(cds1.fieldbyname('barcode').asstring);
              //if length(barcode)>0
              //then begin
                if
                  (table.fieldbyname('barcode').asstring<> barcode)
                  and
                  ( not checkonlyblankbarcodes
                    or (length(trim(table.fieldbyname('barcode').asstring))<8)
                    or (table.fieldbyname('barcode').asstring=getbarcode(table.fieldbyname('kart').asinteger,idtGoods)) // это не сгенерированный автоматом штрихкод
                   )

                then RecChanged := RecChanged +1
                else recotherbarcodes := recotherbarcodes + 1;

                //break;
              //end;

              //cds1.next;
          //until cds1.eof
          //      or (table.fieldbyname('nn').asstring<>cds1.fieldbyname('nn').asstring)
          //      or (table.fieldbyname('producer').asstring<>cds1.fieldbyname('id_producer').asstring)
          //      ;
        end;
        table.next;
        incprogress;
        application.processmessages;
      end;


      hide;
      if getConfirm('В таблице: '+inttostr(recc)+' строк.'+#13+
                    'Из них без кодов товаров: '+inttostr(recwithoutnn)+' позицией,'#13+
                    'без кодов производителей: '+inttostr(recwithoutnn)+' позицией,'#13+
                    'без штрих-кодов: '+inttostr(recwithoutbarcode)+' позицией.'#13+
                    'Из оставшихся позиций в нашей базе найдено: '+inttostr(RecFound)+' соответствий.'#13+
                    'Из которых '+inttostr(recotherbarcodes)+' имеют собственные штрихкоды.'#13+
                    'В оставшихся '+inttostr(RecChanged)+' позициях штрихкоды будут заменены.'#13#13+
                    'Продолжим?')
         <> mrok
      then exit;


      progressbarpos := 0;
      show;
      advancedtext := '';
      text := 'Идет изменение данных';

      recchanged := 0;

      (*
      cds1.first;
      while not cds1.eof do
      begin
        if (cds1.fieldbyname('nn').asstring > '')
           and (cds1.fieldbyname('id_producer').asinteger<>0)
        then begin
          table.cancelrange;
          table.setrangestart;
          table.fieldbyname('nn').asstring := cds1.fieldbyname('nn').asstring;
          table.setrangeend;
          table.fieldbyname('nn').asstring := cds1.fieldbyname('nn').asstring;
          table.applyrange;

          table.first;
          while not table.eof do begin
            if (table.fieldbyname('producer').asinteger = strtointprotected(cds1.fieldbyname('id_producer').asstring))
               and (table.fieldbyname('barcode').asstring<> cds1.fieldbyname('barcode').asstring)
               and (table.fieldbyname('barcode').asstring>'') // там вообще что-то есть
               and (length(table.fieldbyname('barcode').asstring)>=8) // Это реальный штрихкод, а не какое-то просто число
               and (table.fieldbyname('barcode').asstring<>getbarcode(table.fieldbyname('kart').asinteger,idtGoods)) // это не сгенерированный автоматом штрихкод
            then begin
               table.edit;
               table.fieldbyname('barcode').asstring := cds1.fieldbyname('barcode').asstring;
               table.post;
               recchanged := recchanged + 1;

               advancedtext := 'Изменено записей: '+inttostr(recchanged);
            end;
            table.next;
          end;
          application.processmessages;
        end;

        cds1.next;
        incprogress;
      end;
      *)

      progressbarmax := table.recordcount;
      progressbarpos := 0;
      table.first;
      while not table.eof do
      begin
        if (table.fieldbyname('nn').asstring>'')
           and (table.fieldbyname('producer').asinteger<>0)
           and cds1.findkey([table.fieldbyname('nn').asstring,table.fieldbyname('producer').asstring])
        then begin
          //repeat
              //if length(barcode)>0
              //then begin

                barcode := CorrectBarcode1(cds1.fieldbyname('barcode').asstring);

                if
                  (table.fieldbyname('barcode').asstring<> barcode)
                  and
                  ( not checkonlyblankbarcodes
                    or (length(trim(table.fieldbyname('barcode').asstring))<8)
                    or (table.fieldbyname('barcode').asstring=getbarcode(table.fieldbyname('kart').asinteger,idtGoods)) // это не сгенерированный автоматом штрихкод
                   )

                then begin
                //createhinti(table.fieldbyname('id').asstring,'',1000);
                 table.edit;
                 table.fieldbyname('barcode').asstring := barcode;
                 table.post;
                 recchanged := recchanged + 1;

                 cds1.edit;
                 cds1.fieldbyname('id_prt').asinteger := table.fieldbyname('id').asinteger;
                 cds1.fieldbyname('barcode_prt').asstring := table.fieldbyname('barcode').asstring;
                 cds1.fieldbyname('nn_prt').asstring := table.fieldbyname('nn').asstring;
                 cds1.fieldbyname('id_producer_prt').asinteger := table.fieldbyname('producer').asinteger;
                 cds1.post;


                 advancedtext := 'Изменено записей: '+inttostr(recchanged);

                 //break;
                end
              //end;

              //cds1.next;
          //until cds1.eof
          //      or (table.fieldbyname('nn').asstring<>cds1.fieldbyname('nn').asstring)
          //      or (table.fieldbyname('producer').asstring<>cds1.fieldbyname('id_producer').asstring)
          //     ;
        end;

        table.next;
        incprogress;
        application.processmessages;
      end;

      cds1.savetofile(gettempdir+'cds2.cds');

      createhinti('Операция закончена. Изменено позиций: '+inttostr(recchanged),'',1000);


    finally
      free
    end;




  finally
    KeyMappings.free;
    cds.free
  end;

end.
