Импорт обрезков профиля на склад

Матеріал з ADGroupWiki
Перейти до навігації Перейти до пошуку

Данный скрипт демонстрирует импортирование одного или нескольких обрезков профиля на склад в виде соответствующего складского документа.

Файл:ImportObrezok.rar

  function AddObrezokById(sdi:TSkladDocItem; IdMat,IdColor,Code:TId32; Len:double):boolean;
  // заносит один обрезок в документ на основании ID материала и цвета
  var
    ski:TSkladKolItem;
    mi:TMatItem;
    mci:TMatColorItem;
  begin
    result:=false;         
    mi:=nil;
    // сначала проверяем существует ли в базе заданный материал и его цвет, если да, то добавляем обрезок в документ
    mi:=gd.MatersDB.Items.GetById(IdMat);
    if assigned(mi)then
    begin                             
      mci:=mi.Colorsm.GetById(IdColor);
      if assigned(mci)and(mci.Id=IdColor)then
      begin
        ski:=TSkladKolItem.Create;
        ski.IdMat:=IdMat;
        ski.IdColor:=IdColor;
        ski.IdObr:=Code;
        if Code=0 then
        begin
         // делаем проверку на наличие уже такого же обрезка на текущем складе
         repeat
           ski.IdObr:=MainDB.GetCounter('Ver','Id_Ver','Data',4,true);
         until not assigned(gd.SkladOstProfm.Items.GetById(ski.IdObr));
       end;
       ski.Kol:=Len;
       sdi.Kols.Add(ski,aimYes);  
       result:=true;
      end;
    end;
  end;
  
  function AddObrezokByName(sdi:TSkladDocItem; MatName,MatArt,MatColor:string; Code:TId32; Len:double):boolean;
  // ищет материал по полному совпадению артикула, наименования, цвета и добавляет обрезок в случае успеха
  var
    mi:TMatItem;
    mci:TMatColorItem;
    i,k:integer;
    foundmat:boolean;
    foundcolor:boolean;
  begin
    result:=false;
    MatArt:=AnsiUpperCase(MatArt);
    MatName:=AnsiUpperCase(MatName);
    MatColor:=AnsiUpperCase(MatColor);
    // перебираем все материалы и ищем чтоб сначала совпало наименование материала
    foundmat:=false;
    foundcolor:=false;
    for i:=0 to gd.MatersDB.Items.Count-1 do
    begin                               
      mi:=gd.MatersDB.Items.GetByNum(i);
      if AnsiUpperCase(mi.Name)=MatName then
      begin
        foundmat:=true;
        // совпало наименование материала, ищем совпадение цвета и артикула внутри материала
        // перебираем все цвета материала внутри материала
        for k:=0 to mi.Colorsm.Count-1 do
        begin
          mci:=mi.Colorsm.GetByNum(k);
          if (AnsiUpperCase(mci.Art)=MatArt)and(AnsiUpperCase(mci.ColorName)=MatColor)then
          begin
            // найдено совпадение по артикулу и цвету, добавляем обрезок
            foundcolor:=true;
            if AddObrezokById(sdi,mi.Id,mci.Id,Code,Len) then result:=true;
            break; // прекращаем дальнейший поиск
          end;
        end;
        if foundcolor then break; // прекращаем дальнейший поиск
      end;
    end;
    if not foundcolor then
    begin
      // если материал найти не удалось - записываем сообщение в примечание к документу
      if sdi.Prim<>'' then sdi.Prim:=sdi.Prim+'; ';
      if not foundmat then sdi.Prim:=sdi.Prim+'Материал не найден:'+MatName
                      else sdi.Prim:=sdi.Prim+'Артикул/цвет материала не найден:'+MatArt+'/'+MatColor;
    end;
  end;

  procedure ImportObrezokToSklad;
  var
    sdi:TSkladDocItem;
    IdSkladName:TId32;
    IdSkladObrezkovType:TId32;  
    countnotimported:integer;
  begin
    IdSkladName:=1;
    IdSkladObrezkovType:=0; // обрезки профиля
    // сбор текущего состояния склада обрезков профиля
    // нужно для корректного определения возможного дубликата кода добавляемого обрезка
    gd.SkladDocsm.SborObrezkov(IdSkladObrezkovType,true,IdSkladName,false,now);
    // приход
    sdi:=TSkladDocItem.Create;
    sdi.IdDocType:=6; // приход
    sdi.IdSkladName:=IdSkladName;
    sdi.DateDoc:=now;
    sdi.Prim:='Импортирование обрезков';
    // занесение обрезков в документ 
    countnotimported:=0;        
    if not AddObrezokById(sdi,1,1,0,1000) then inc(countnotimported);
    if not AddObrezokByName(sdi,'Створка 104 мм Т,','A0100100701','Белый',0,1000) then inc(countnotimported);      
    if countnotimported>0 then sdi.Prim:='Не добавлено позиций: '+inttostr(countnotimported)+'. '+sdi.Prim; 
    // если обрезки были добавлены в документ, то добавляем сам документ в базу
    if sdi.Kols.Count>0 then gd.SkladDocsm.Items.Insert(sdi)
                        else sdi.Free;
    // сбор текущего состояния склада обрезков профиля
    gd.SkladDocsm.SborObrezkov(IdSkladObrezkovType,true,IdSkladName,false,now);
    //mri:=gd.MatersDB.Items.GetById(rei.Mat.IdMat);
  end;
  
  begin         
    ImportObrezokToSklad;
  end;