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