| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440 | unit rmWeiWuZjjlGatherDm;interfaceuses  SysUtils, Classes, ProjectData, DB, sdDB, DBClient, sdIDTree, BillsTree;type  TZjjl = class  private    FCode: string;    FCertificateCode: string;    FBGLCode: string;    FPegName: string;    FBeginPeg: string;    FEndPeg: string;    FFBFXName: string;    FUnitName: string;    FDrawingCode: string;    FFormulaMemo: string;    FRelaFile: string;    FBillsCode: string;    FBillsName: string;    FBillsUnits: string;    FBillsPrice: Double;    FFilterDrawingCode: string;    FBillsCurDealQuantity: Double;    FBillsCurDealTotalPrice: Double;    FBillsCurQcQuantity: Double;    FBillsCurQcTotalPrice: Double;    FBillsCurGatherQuantity: Double;    FBillsCurGatherTotalPrice: Double;    FBillsEndDealQuantity: Double;    FBillsEndDealTotalPrice: Double;    FBillsEndQcQuantity: Double;    FBillsEndQcTotalPrice: Double;    FBillsEndGatherQuantity: Double;    FBillsEndGatherTotalPrice: Double;    FBillsOrgQuantity: Double;    FBillsOrgTotalPrice: Double;    FBillsMisQuantity: Double;    FBillsMisTotalPrice: Double;    FBillsOthQuantity: Double;    FBillsOthTotalPrice: Double;    FBillsQuantity: Double;    FBillsTotalPrice: Double;    FFenBuName: string;    FDanWeiName: string;    function MergeStr(AStr1, AStr2: string): string;  public    constructor Create(ARec, AStageRec: TsdDataRecord; ANode: TBillsIDTreeNode);    procedure Merge(ARec, AStageRec: TsdDataRecord; ANode: TBillsIDTreeNode);  end;  TrmWeiWuZjjlGatherData = class(TDataModule)    cdsZjjl: TClientDataSet;    cdsZjjlCode: TWideStringField;    cdsZjjlCertificateCode: TWideStringField;    cdsZjjlBGLCode: TMemoField;    cdsZjjlPegName: TWideStringField;    cdsZjjlBeginPeg: TWideStringField;    cdsZjjlEndPeg: TWideStringField;    cdsZjjlFBFXName: TWideStringField;    cdsZjjlUnitName: TWideStringField;    cdsZjjlDrawingCode: TWideStringField;    cdsZjjlFormulaMemo: TMemoField;    cdsZjjlRelaFile: TMemoField;    cdsZjjlBillsCode: TStringField;    cdsZjjlBillsName: TWideStringField;    cdsZjjlBillsUnits: TWideStringField;    cdsZjjlBillsPrice: TFloatField;    cdsZjjlFilterDrawingCode: TWideStringField;    cdsZjjlBillsCurDealQuantity: TFloatField;    cdsZjjlBillsCurDealTotalPrice: TFloatField;    cdsZjjlBillsCurQcQuantity: TFloatField;    cdsZjjlBillsCurQcTotalPrice: TFloatField;    cdsZjjlBillsCurGatherQuantity: TFloatField;    cdsZjjlBillsCurGatherTotalPrice: TFloatField;    cdsZjjlBillsEndDealQuantity: TFloatField;    cdsZjjlBillsEndDealTotalPrice: TFloatField;    cdsZjjlBillsEndQcQuantity: TFloatField;    cdsZjjlBillsEndQcTotalPrice: TFloatField;    cdsZjjlBillsEndGatherQuantity: TFloatField;    cdsZjjlBillsEndGatherTotalPrice: TFloatField;    cdsZjjlBillsOrgQuantity: TFloatField;    cdsZjjlBillsOrgTotalPrice: TFloatField;    cdsZjjlBillsMisQuantity: TFloatField;    cdsZjjlBillsMisTotalPrice: TFloatField;    cdsZjjlBillsOthQuantity: TFloatField;    cdsZjjlBillsOthTotalPrice: TFloatField;    cdsZjjlBillsQuantity: TFloatField;    cdsZjjlBillsTotalPrice: TFloatField;    cdsZjjlFenBuName: TWideStringField;    cdsZjjlDanWeiName: TWideStringField;  private    FZjjlList: TList;    function FindZjjl(ARec: TsdDataRecord; ANode: TBillsIDTreeNode): TZjjl;    procedure GatherZjjl(AProjectData: TProjectData);    procedure WriteData;  public    function AssignData(AProjectData: TProjectData): TDataSet;  end;implementationuses  ZhAPI, PhaseData, UtilMethods, BillsMeasureDm;{$R *.dfm}function GetThirdPartString(const AStr: string; AFilter: Char = '-'): string;var  sgs: TStringList;begin  sgs := TStringList.Create;  try    sgs.Delimiter := AFilter;    sgs.DelimitedText := AStr;    while sgs.Count > 2 do      sgs.Delete(sgs.Count - 1);    Result := sgs.DelimitedText;  finally    sgs.Free;  end;end;function GetLeafXmj(ANode: TBillsIDTreeNode): TBillsIDTreeNode;begin  Result := ANode;  while Assigned(Result) and (Result.Rec.B_Code.AsString <> '') do    Result := TBillsIDTreeNode(Result.Parent);end;function GetLeafXmjDrawingCode(ANode: TBillsIDTreeNode): String;var  vLeafXmj: TsdIDTreeNode;begin  Result := '';  vLeafXmj := GetLeafXmj(ANode);  if Assigned(vLeafXmj) then    Result := vLeafXmj.Rec.ValueByName('DrawingCode').AsString;end;{ TZjjl }constructor TZjjl.Create(ARec, AStageRec: TsdDataRecord; ANode: TBillsIDTreeNode);  // 取树结构的第ALevel层节点的名称(level从0开始)  function GetNameByLevel(ANode: TBillsIDTreeNode; ALevel: Integer): string;  begin    Result := '';    if not Assigned(ANode) then Exit;    if ANode.Level = ALevel then      Result := ANode.Rec.Name.AsString    else if ANode.Level > ALevel then      Result := GetNameByLevel(TBillsIDTreeNode(ANode.Parent), ALevel);  end;  function GetNameDanWei(ANode: TBillsIDTreeNode): string;  begin    // 取树结构的第二层节点的名称    Result := GetNameByLevel(ANode, 1);  end;  // ANode为计量单元节点,APegNode为桩号节点  function GetNameFenBu(ANode, APegNode: TBillsIDTreeNode): string;  var    vCurNode: TBillsIDTreeNode;  begin    // 如果计量单元节点的名称为桩号(转化为判断计量单元节点与桩号节点为同一个)    if not Assigned(APegNode) or (ANode.ID = APegNode.ID) then      // 取树结构的第三层节点的名称      Result := GetNameByLevel(ANode, 2)    // 否则,取桩号节点的子节点的名称    else    begin      vCurNode := ANode;      while vCurNode.Level > APegNode.Level + 1 do        vCurNode := TBillsIDTreeNode(vCurNode.Parent);      Result := vCurNode.Rec.Name.AsString;    end;  end;  function GetPegNode(ANode: TBillsIDTreeNode): TBillsIDTreeNode;  begin    Result := nil;    if not Assigned(ANode) then Exit;    if CheckPeg(ANode.Rec.Name.AsString) then      Result := ANode    else      Result := GetPegNode(TBillsIDTreeNode(ANode.Parent));  end;var  vLeafXmj, vPegNode: TBillsIDTreeNode;begin  FCode := ARec.ValueByName('Code').AsString;  FCertificateCode := ARec.ValueByName('CertificateCode').AsString;  FBGLCode := ARec.ValueByName('BGLCode').AsString;  FPegName := ARec.ValueByName('PegName').AsString;  FBeginPeg := ARec.ValueByName('BeginPeg').AsString;  FEndPeg := ARec.ValueByName('EndPeg').AsString;  FFBFXName := ARec.ValueByName('FBFXName').AsString;  FUnitName := ARec.ValueByName('UnitName').AsString;  FDrawingCode := ARec.ValueByName('DrawingCode').AsString;  FFormulaMemo := ARec.ValueByName('FormulaMemo').AsString;  FRelaFile := ARec.ValueByName('RelaFile').AsString;  FBillsCode := ANode.Rec.ValueByName('B_Code').AsString;  FBillsName := ANode.Rec.ValueByName('Name').AsString;  FBillsUnits := ANode.Rec.ValueByName('Units').AsString;  FBillsPrice := ANode.Rec.ValueByName('Price').AsFloat;  FFilterDrawingCode := GetThirdPartString(GetLeafXmjDrawingCode(ANode));  if Assigned(AStageRec) then  begin    FBillsCurDealQuantity := AStageRec.ValueByName('DealQuantity').AsFloat;    FBillsCurDealTotalPrice := AStageRec.ValueByName('DealTotalPrice').AsFloat;    FBillsCurQcQuantity := AStageRec.ValueByName('QcQuantity').AsFloat;    FBillsCurQcTotalPrice := AStageRec.ValueByName('QcTotalPrice').AsFloat;    FBillsCurGatherQuantity := AStageRec.ValueByName('GatherQuantity').AsFloat;    FBillsCurGatherTotalPrice := AStageRec.ValueByName('GatherTotalPrice').AsFloat;    FBillsEndDealQuantity := AStageRec.ValueByName('DealQuantity').AsFloat;    FBillsEndDealTotalPrice := AStageRec.ValueByName('DealTotalPrice').AsFloat;    FBillsEndQcQuantity := AStageRec.ValueByName('QcQuantity').AsFloat;    FBillsEndQcTotalPrice := AStageRec.ValueByName('QcTotalPrice').AsFloat;    FBillsEndGatherQuantity := AStageRec.ValueByName('GatherQuantity').AsFloat;    FBillsEndGatherTotalPrice := AStageRec.ValueByName('GatherTotalPrice').AsFloat;  end;  FBillsOrgQuantity := ANode.Rec.OrgQuantity.AsFloat;  FBillsOrgTotalPrice := ANode.Rec.OrgTotalPrice.AsFloat;  FBillsMisQuantity := ANode.Rec.MisQuantity.AsFloat;  FBillsMisTotalPrice := ANode.Rec.MisTotalPrice.AsFloat;  FBillsOthQuantity := ANode.Rec.OthQuantity.AsFloat;  FBillsOthTotalPrice := ANode.Rec.OthTotalPrice.AsFloat;  FBillsQuantity := ANode.Rec.Quantity.AsFloat;  FBillsTotalPrice := ANode.Rec.TotalPrice.AsFloat;  vLeafXmj := GetLeafXmj(ANode);  vPegNode := GetPegNode(ANode);  FFenBuName := GetNameFenBu(vLeafXmj, vPegNode);  FDanWeiName := GetNameDanWei(vLeafXmj);end;procedure TZjjl.Merge(ARec, AStageRec: TsdDataRecord; ANode: TBillsIDTreeNode);begin  FCertificateCode := MergeStr(FCertificateCode, ARec.ValueByName('CertificateCode').AsString);  FBGLCode := MergeRelaBGL(FBGLCode, ARec.ValueByName('BGLCode').AsString);  FDrawingCode := MergeStr(FDrawingCode, ARec.ValueByName('DrawingCode').AsString);  FFormulaMemo := MergeStr(FFormulaMemo, ARec.ValueByName('FormulaMemo').AsString);  FRelaFile := MergeStr(FRelaFile, ARec.ValueByName('RelaFile').AsString);  if Assigned(AStageRec) then  begin    FBillsCurDealQuantity := FBillsCurDealQuantity + AStageRec.ValueByName('DealQuantity').AsFloat;    FBillsCurDealTotalPrice := FBillsCurDealTotalPrice + AStageRec.ValueByName('DealTotalPrice').AsFloat;    FBillsCurQcQuantity := FBillsCurQcQuantity + AStageRec.ValueByName('QcQuantity').AsFloat;    FBillsCurQcTotalPrice := FBillsCurQcTotalPrice + AStageRec.ValueByName('QcTotalPrice').AsFloat;    FBillsCurGatherQuantity := FBillsCurGatherQuantity + AStageRec.ValueByName('GatherQuantity').AsFloat;    FBillsCurGatherTotalPrice := FBillsCurGatherTotalPrice + AStageRec.ValueByName('GatherTotalPrice').AsFloat;    FBillsEndDealQuantity := FBillsEndDealQuantity + AStageRec.ValueByName('DealQuantity').AsFloat;    FBillsEndDealTotalPrice := FBillsEndDealTotalPrice + AStageRec.ValueByName('DealTotalPrice').AsFloat;    FBillsEndQcQuantity := FBillsEndQcQuantity + AStageRec.ValueByName('QcQuantity').AsFloat;    FBillsEndQcTotalPrice := FBillsEndQcTotalPrice + AStageRec.ValueByName('QcTotalPrice').AsFloat;    FBillsEndGatherQuantity := FBillsEndGatherQuantity + AStageRec.ValueByName('GatherQuantity').AsFloat;    FBillsEndGatherTotalPrice := FBillsEndGatherTotalPrice + AStageRec.ValueByName('GatherTotalPrice').AsFloat;  end;  FBillsOrgQuantity := FBillsOrgQuantity + ANode.Rec.OrgQuantity.AsFloat;  FBillsOrgTotalPrice := FBillsOrgTotalPrice + ANode.Rec.OrgTotalPrice.AsFloat;  FBillsMisQuantity := FBillsMisQuantity + ANode.Rec.MisQuantity.AsFloat;  FBillsMisTotalPrice := FBillsMisTotalPrice + ANode.Rec.MisTotalPrice.AsFloat;  FBillsOthQuantity := FBillsOthQuantity + ANode.Rec.OthQuantity.AsFloat;  FBillsOthTotalPrice := FBillsOthTotalPrice + ANode.Rec.OthTotalPrice.AsFloat;  FBillsQuantity := FBillsQuantity + ANode.Rec.Quantity.AsFloat;  FBillsTotalPrice := FBillsTotalPrice + ANode.Rec.TotalPrice.AsFloat;end;function TZjjl.MergeStr(AStr1, AStr2: string): string;begin  if (AStr1 <> '') then  begin    if (AStr2 <> '') then      Result := AStr1 + ';' + AStr2    else      Result := AStr1;  end  else  begin    if (AStr2 <> '') then      Result := AStr2    else      Result := '';  end;end;{ TrmWeiWuZjjlGatherData }function TrmWeiWuZjjlGatherData.AssignData(  AProjectData: TProjectData): TDataSet;begin  FZjjlList := TList.Create;  try    if AProjectData.PhaseData.Active then    begin      GatherZjjl(AProjectData);      WriteData;    end;    Result := cdsZjjl;  finally    ClearObjects(FZjjlList);    FZjjlList.Free;  end;end;function TrmWeiWuZjjlGatherData.FindZjjl(ARec: TsdDataRecord; ANode: TBillsIDTreeNode): TZjjl;var  sCode, sName, sUnits, sDrawingCode: string;  fPrice: Double;  i: Integer;  vZ: TZjjl;begin  sCode := ANode.Rec.ValueByName('B_Code').AsString;  sName := ANode.Rec.ValueByName('Name').AsString;  sUnits := ANode.Rec.ValueByName('Units').AsString;  sDrawingCode := GetThirdPartString(GetLeafXmjDrawingCode(ANode));  fPrice := ANode.Rec.valueByName('Price').AsFloat;  Result := nil;  for i := 0 to FZjjlList.Count - 1 do  begin    vZ := TZjjl(FZjjlList.Items[i]);    if SameText(vZ.FBillsCode, sCode) and SameText(vZ.FBillsName, sName) and SameText(vZ.FBillsUnits, sUnits) and       (PriceRoundTo(fPrice - vZ.FBillsPrice) < 0.00001) and       SameText(sDrawingCode, vZ.FFilterDrawingCode) then    begin      Result := vZ;      Break;    end;  end;end;procedure TrmWeiWuZjjlGatherData.GatherZjjl(AProjectData: TProjectData);var  i: Integer;  vNode: TBillsIDTreeNode;  Rec, BillsRec, StageRec: TsdDataRecord;  vZ: TZjjl;begin  for i := 0 to AProjectData.PhaseData.ZJJLData.sddZJJL.RecordCount - 1 do  begin    Rec := AProjectData.PhaseData.ZJJLData.sddZJJL.Records[I];    vNode := TBillsIDTreeNode(AProjectData.BillsMeasureData.BillsMeasureTree.FindNode(Rec.ValueByName('BillsID').AsInteger));    StageRec := AProjectData.PhaseData.StageData.StageRecord(Rec.ValueByName('BillsID').AsInteger);    if Assigned(Rec) and Assigned(vNode) then    begin      vZ := FindZjjl(Rec, vNode);      if not Assigned(vZ) then      begin        vZ := TZjjl.Create(Rec, StageRec, vNode);        FZjjlList.Add(vZ);      end      else        vZ.Merge(Rec, StageRec, vNode);    end;  end;end;procedure TrmWeiWuZjjlGatherData.WriteData;var  i: Integer;  vZ: TZjjl;begin         cdsZjjl.Active := True;  cdsZjjl.EmptyDataSet;  for i := 0 to FZjjlList.Count - 1 do  begin    vZ := TZjjl(FZjjlList.Items[i]);    cdsZjjl.Append;    cdsZjjlCode.AsString := vZ.FCode;    cdsZjjlCertificateCode.AsString := vZ.FCertificateCode;    cdsZjjlBGLCode.AsString := vZ.FBGLCode;    cdsZjjlPegName.AsString := vZ.FPegName;    cdsZjjlBeginPeg.AsString := vZ.FBeginPeg;    cdsZjjlEndPeg.AsString := vZ.FEndPeg;    cdsZjjlFBFXName.AsString := vZ.FFBFXName;    cdsZjjlUnitName.AsString := vZ.FUnitName;    cdsZjjlDrawingCode.AsString := vZ.FDrawingCode;    cdsZjjlFormulaMemo.AsString := vZ.FFormulaMemo;    cdsZjjlRelaFile.AsString := vZ.FRelaFile;    cdsZjjlBillsCode.AsString := vZ.FBillsCode;    cdsZjjlBillsName.AsString := vZ.FBillsName;    cdsZjjlBillsUnits.AsString := vZ.FBillsUnits;    cdsZjjlBillsPrice.AsFloat := vZ.FBillsPrice;    cdsZjjlFilterDrawingCode.AsString := vZ.FFilterDrawingCode;    cdsZjjlBillsCurDealQuantity.AsFloat := vZ.FBillsCurDealQuantity;    cdsZjjlBillsCurDealTotalPrice.AsFloat := vZ.FBillsCurDealTotalPrice;    cdsZjjlBillsCurQcQuantity.AsFloat := vZ.FBillsCurQcQuantity;    cdsZjjlBillsCurQcTotalPrice.AsFloat := vZ.FBillsCurQcTotalPrice;    cdsZjjlBillsCurGatherQuantity.AsFloat := vZ.FBillsCurGatherQuantity;    cdsZjjlBillsCurGatherTotalPrice.AsFloat := vZ.FBillsCurGatherTotalPrice;    cdsZjjlBillsEndDealQuantity.AsFloat := vZ.FBillsEndDealQuantity;    cdsZjjlBillsEndDealTotalPrice.AsFloat := vZ.FBillsEndDealTotalPrice;    cdsZjjlBillsEndQcQuantity.AsFloat := vZ.FBillsEndQcQuantity;    cdsZjjlBillsEndQcTotalPrice.AsFloat := vZ.FBillsEndQcTotalPrice;    cdsZjjlBillsEndGatherQuantity.AsFloat := vZ.FBillsEndGatherQuantity;    cdsZjjlBillsEndGatherTotalPrice.AsFloat := vZ.FBillsEndGatherTotalPrice;    cdsZjjlBillsOrgQuantity.AsFloat := vZ.FBillsOrgQuantity;    cdsZjjlBillsOrgTotalPrice.AsFloat := vZ.FBillsOrgTotalPrice;    cdsZjjlBillsMisQuantity.AsFloat := vZ.FBillsMisQuantity;    cdsZjjlBillsMisTotalPrice.AsFloat := vZ.FBillsMisTotalPrice;    cdsZjjlBillsOthQuantity.AsFloat := vZ.FBillsOthQuantity;    cdsZjjlBillsOthTotalPrice.AsFloat := vZ.FBillsOthTotalPrice;    cdsZjjlBillsQuantity.AsFloat := vZ.FBillsQuantity;    cdsZjjlBillsTotalPrice.AsFloat := vZ.FBillsTotalPrice;    cdsZjjlFenBuName.AsString := vZ.FFenBuName;    cdsZjjlDanWeiName.AsString := vZ.FDanWeiName;    cdsZjjl.Post;  end;end;end.
 |