unit U_CraftSync; interface uses SysUtils, Classes, Variants, DB, ADODB; //将工艺数据静默同步到所有绑定该工艺的产品: // 主表工艺字段(含工艺编号/名称) + 经纬纱配比子表 + 纹版图子表 //注意:必须在调用方的事务内执行,本过程不自己开事务 procedure SyncCraftToProduct(const ACRID: string); //将工艺数据同步到所有绑定该工艺的合同明细行(仅工艺管辖列:编号/名称/门幅/克重/颜色) //注意:必须在调用方的事务内执行,本过程不自己开事务 procedure SyncCraftToContract(const ACRID: string); implementation uses U_DataLink, U_RTFun; function StrSQL(const AValue: Variant): string; begin if VarIsNull(AValue) then Result := 'null' else Result := QuotedStr(Trim(VarToStr(AValue))); end; function NumSQL(const AValue: Variant): string; begin if VarIsNull(AValue) then Result := 'null' else Result := FormatFloat('0.##########', VarAsType(AValue, varDouble)); end; function WBColList(const APrefix: string): string; var i: Integer; begin Result := ''; for i := 1 to 72 do begin if Result <> '' then Result := Result + ','; Result := Result + APrefix + 'WB_' + IntToStr(i); end; end; procedure SyncCraftToProduct(const ACRID: string); var Qry, QryYarn: TADOQuery; Products: TStringList; i: Integer; NewNo: string; begin if Trim(ACRID) = '' then Exit; Qry := TADOQuery.Create(nil); QryYarn := TADOQuery.Create(nil); Products := TStringList.Create; try Qry.Connection := DataLink_ClothInfo.ADOLink; QryYarn.Connection := DataLink_ClothInfo.ADOLink; //1.主表工艺字段镜像(只更新工艺管辖列,不碰产品自有字段) with Qry do begin Close; SQL.Clear; SQL.Add('update B set B.CRID=C.CRID,B.CR_Code=C.CR_Code,B.CR_Name=C.CR_Name'); SQL.Add(',B.C_Width=C.C_Width,B.C_GramWeight=C.C_GramWeight,B.C_Color=C.C_Color'); SQL.Add(',B.C_YarnQty=C.C_YarnQty,B.head_count=C.head_count,B.strip_width=C.strip_width'); SQL.Add(',B.C_MachLatitudeDensity=C.C_MachLatitudeDensity,B.row_count_top=C.row_count_top'); SQL.Add(',B.displace=C.displace,B.reed_width=C.reed_width,B.C_ReedNo=C.C_ReedNo'); SQL.Add(',B.ends_per_dent=C.ends_per_dent,B.selvage_yarn=C.selvage_yarn,B.yardage=C.yardage'); SQL.Add(',B.warp_arrange=C.warp_arrange,B.weft_arrange=C.weft_arrange,B.threading_method=C.threading_method'); SQL.Add('from BS_Cloth_Info B join BS_Craft_Info C on C.CRID=B.CRID'); SQL.Add('where B.CRID=' + QuotedStr(Trim(ACRID))); ExecSQL; end; //2.纹版图镜像(每产品一行,整行替换) with Qry do begin Close; SQL.Clear; SQL.Add('delete W from Bs_Cloth_Info_WB W join BS_Cloth_Info B on B.BCIID=W.BCIID'); SQL.Add('where B.CRID=' + QuotedStr(Trim(ACRID))); ExecSQL; Close; SQL.Clear; SQL.Add('insert into Bs_Cloth_Info_WB (BCIID,' + WBColList('') + ')'); SQL.Add('select B.BCIID,' + WBColList('C.')); SQL.Add('from BS_Cloth_Info B join BS_Craft_Info_WB C on C.CRID=B.CRID'); SQL.Add('where B.CRID=' + QuotedStr(Trim(ACRID))); ExecSQL; end; //3.经纬纱配比镜像(逐产品整删整插,YRId按产品表自己的流水取号) with Qry do begin Close; SQL.Clear; SQL.Add('select BCIID from BS_Cloth_Info where CRID=' + QuotedStr(Trim(ACRID))); Open; while not Eof do begin Products.Add(Trim(FieldByName('BCIID').AsString)); Next; end; Close; end; if Products.Count > 0 then begin with QryYarn do begin Close; SQL.Clear; SQL.Add('select * from BS_Craft_Yarn where CRID=' + QuotedStr(Trim(ACRID))); SQL.Add('order by YRType,seq_no,YRId'); Open; end; try for i := 0 to Products.Count - 1 do begin with Qry do begin Close; SQL.Clear; SQL.Add('delete BS_Cloth_Yarn where BCIID=' + QuotedStr(Products[i])); ExecSQL; end; QryYarn.First; while not QryYarn.Eof do begin if GetLSNo(Qry, NewNo, 'RJ', 'BS_Cloth_Yarn', 4, 1) = False then raise Exception.Create('取产品配比流水号失败'); with Qry do begin Close; SQL.Clear; SQL.Add('insert into BS_Cloth_Yarn (YRId,BCIID,YRType,seq_no,Y_Code,Y_Name,Brand,Y_Color,Denier,Y_Ratio,Y_Qty,Filler,FillTime)'); SQL.Add('values (' + QuotedStr(Trim(NewNo)) + ',' + QuotedStr(Products[i])); SQL.Add(',' + StrSQL(QryYarn.FieldByName('YRType').Value)); SQL.Add(',' + StrSQL(QryYarn.FieldByName('seq_no').Value)); SQL.Add(',' + StrSQL(QryYarn.FieldByName('Y_Code').Value)); SQL.Add(',' + StrSQL(QryYarn.FieldByName('Y_Name').Value)); SQL.Add(',' + StrSQL(QryYarn.FieldByName('Brand').Value)); SQL.Add(',' + StrSQL(QryYarn.FieldByName('Y_Color').Value)); SQL.Add(',' + NumSQL(QryYarn.FieldByName('Denier').Value)); SQL.Add(',' + NumSQL(QryYarn.FieldByName('Y_Ratio').Value)); SQL.Add(',' + NumSQL(QryYarn.FieldByName('Y_Qty').Value)); SQL.Add(',' + QuotedStr(Trim(DName)) + ',getdate())'); ExecSQL; end; QryYarn.Next; end; end; finally QryYarn.Close; end; end; finally Products.Free; QryYarn.Free; Qry.Free; end; end; procedure SyncCraftToContract(const ACRID: string); var Qry: TADOQuery; begin if Trim(ACRID) = '' then Exit; Qry := TADOQuery.Create(nil); try Qry.Connection := DataLink_ClothInfo.ADOLink; with Qry do begin Close; SQL.Clear; SQL.Add('update S set S.C_Code=C.CR_Code,S.C_Name=C.CR_Name'); SQL.Add(',S.C_Width=C.C_Width,S.C_GramWeight=C.C_GramWeight,S.C_Color=C.C_Color'); SQL.Add('from BS_Contract_Sub S join BS_Craft_Info C on C.CRID=S.CRID'); SQL.Add('where S.CRID=' + QuotedStr(Trim(ACRID))); ExecSQL; end; finally Qry.Free; end; end; end.