Импорт обрезков профиля на склад
Перейти к навигации
Перейти к поиску
Данный скрипт демонстрирует импортирование одного или нескольких обрезков профиля на склад в виде соответствующего складского документа.
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;