| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361 | unit rmBGLExecutionDm;interfaceuses  SysUtils, Classes, ProjectData, DB, DBClient, sdIDTree, sdDB;type  TGclNode = class  private    FQuantity: Double;    FTotalPrice: Double;    FPrice: Double;    FUnits: string;    FName: string;    FB_Code: string;  public    property B_Code: string read FB_Code write FB_Code;    property Name: string read FName write FName;    property Units: string read FUnits write FUnits;    property Price: Double read FPrice write FPrice;    property Quantity: Double read FQuantity write FQuantity;    property TotalPrice: Double read FTotalPrice write FTotalPrice;  end;  TXmjNode = class  private    FCode: string;    FName: string;    FUnits: string;    FGclList: TList;  public    constructor Create;    destructor Destroy; override;    function AddGclNode(AB_Code: string): TGclNode;    property Code: string read FCode write FCode;    property Name: string read FName write FName;    property Units: string read FUnits write FUnits;    property GclList: TList read FGclList;  end;  TBGLNode = class  private    FBGLCode: string;    FXmjList: TList;  public    constructor Create;    destructor Destroy; override;    function FindXmjNode(ACode: string): TXmjNode;    function AddXmjNode(ACode: string): TXmjNode;    property BGLCode: string read FBGLCode write FBGLCode;    property XmjList: TList read FXmjList;  end;  TrmBGLExecutionData = class(TDataModule)    cdsBGLExecution: TClientDataSet;    cdsBGLExecutionBGLCode: TWideStringField;    cdsBGLExecutionCode: TStringField;    cdsBGLExecutionB_Code: TStringField;    cdsBGLExecutionName: TWideStringField;    cdsBGLExecutionUnits: TWideStringField;    cdsBGLExecutionPrice: TFloatField;    cdsBGLExecutionQuantity: TFloatField;    cdsBGLExecutionTotalPrice: TFloatField;  private    FProjectData: TProjectData;    FBGLList: TList;    function FindBGLNode(ABGLCode: string): TBGLNode;    function AddBGLNode(ABGLCode: string): TBGLNode;    procedure FilterGclBills(ANode: TsdIDTreeNode);    procedure FilterBills(ANode: TsdIDTreeNode);    procedure WriteData;  public    function AssignData(AProjectData: TProjectData): TDataSet;  end;implementationuses  ZhAPI, UtilMethods, PhaseData, BillsCompileDm;{$R *.dfm}{ TrmBGLExecutionData }function TrmBGLExecutionData.AddBGLNode(ABGLCode: string): TBGLNode;var  Node: TBGLNode;  i, iIndex: Integer;begin  // 新增  Result := TBGLNode.Create;  Result.BGLCode := ABGLCode;  // List中根据顺序新增  iIndex := FBGLList.Count;  for i := 0 to FBGLList.Count - 1 do  begin    Node := TBGLNode(FBGLList.Items[i]);    if ABGLCode < Node.BGLCode then    begin      iIndex := i;      Break;    end;  end;  FBGLList.Insert(iIndex, Result);end;function TrmBGLExecutionData.AssignData(  AProjectData: TProjectData): TDataSet;begin  cdsBGLExecution.DisableControls;  cdsBGLExecution.Active := True;  cdsBGLExecution.EmptyDataSet;  FBGLList := TList.Create;  try    FProjectData := AProjectData;    FilterBills(AProjectData.BillsMeasureData.BillsMeasureTree.FirstNode);    WriteData;    Result := cdsBGLExecution;  finally    ClearObjects(FBGLList);    FBGLList.Free;    cdsBGLExecution.EnableControls;  end;end;procedure TrmBGLExecutionData.FilterBills(ANode: TsdIDTreeNode);begin  if not Assigned(ANode) then Exit;  if not ANode.HasChildren then    FilterGclBills(ANode);  FilterBills(ANode.FirstChild);  FilterBills(ANode.NextSibling);end;procedure TrmBGLExecutionData.FilterGclBills(ANode: TsdIDTreeNode);  procedure AddBGLData(ABGLCode, ABGLNum: string);  var    BGLNode: TBGLNode;    XmjNode: TXmjNode;    GclNode: TGclNode;    LeafXmjParent: TsdIDTreeNode;  begin    // BGL    BGLNode := FindBGLNode(ABGLCode);    if not Assigned(BGLNode) then      BGLNode := AddBGLNode(ABGLCode);    // Xmj    with FProjectData.BillsCompileData do      LeafXmjParent := BillsCompileTree.FindNode(GetLeafXmjParentID(ANode.ID));    XmjNode := BGLNode.FindXmjNode(LeafXmjParent.Rec.ValueByName('Code').AsString);    if not Assigned(XmjNode) then      XmjNode := BGLNode.AddXmjNode(LeafXmjParent.Rec.ValueByName('Code').AsString);    XmjNode.Name := LeafXmjParent.Rec.ValueByName('Name').AsString;    XmjNode.Units := LeafXmjParent.Rec.ValueByName('Units').AsString;        // Gcl    GclNode := XmjNode.AddGclNode(ANode.Rec.ValueByName('B_Code').AsString);    GclNode.Name := ANode.Rec.ValueByName('Name').AsString;    GclNode.FUnits := ANode.Rec.ValueByName('Units').AsString;    GclNode.Price := ANode.Rec.ValueByName('Price').AsFloat;    GclNode.Quantity := StrToFloatDef(ABGLNum, 0);    GclNode.TotalPrice := GclNode.Quantity * GclNode.Price;  end;var  StageRec: TsdDataRecord;  sgsCode, sgsNum: TStringList;  i: Integer;begin  StageRec := FProjectData.PhaseData.StageData.StageRecord(ANode.ID);  if (ANode.Rec.ValueByName('B_Code').AsString = '') or      (not Assigned(StageRec)) or      (StageRec.ValueByName('QcBGLCode').AsString = '') then Exit;  sgsCode := TStringList.Create;  sgsNum := TStringList.Create;  try    sgsCode.Delimiter := ';';    sgsCode.DelimitedText := StageRec.ValueByName('QcBGLCode').AsString;    sgsNum.Delimiter := ';';    sgsNum.DelimitedText := StageRec.ValueByName('QcBGLNum').AsString;    for i := 0 to sgsCode.Count - 1 do      AddBGLData(sgsCode[i], sgsNum[i]);  finally    sgsNum.Free;    sgsCode.Free;  end;end;function TrmBGLExecutionData.FindBGLNode(ABGLCode: string): TBGLNode;var  iBGL: Integer;  BGLNode: TBGLNode;begin  Result := nil;  for iBGL := 0 to FBGLList.Count - 1 do  begin    BGLNode := TBGLNode(FBGLList.Items[iBGL]);    if SameText(BGLNode.BGLCode, ABGLCode) then    begin      Result := BGLNode;      Break;    end;  end;end;procedure TrmBGLExecutionData.WriteData;  procedure WriteGclData(AXmjNode: TXmjNode);  var    iGcl: Integer;    GclNode: TGclNode;  begin    for iGcl := 0 to AXmjNode.GclList.Count - 1 do    begin      GclNode := TGclNode(AXmjNode.GclList.Items[iGcl]);      cdsBGLExecution.Append;      cdsBGLExecutionB_Code.AsString := GclNode.B_Code;      cdsBGLExecutionName.AsString := GclNode.Name;      cdsBGLExecutionUnits.AsString := GclNode.Units;      cdsBGLExecutionPrice.AsFloat := GclNode.Price;      cdsBGLExecutionQuantity.AsFloat := GclNode.Quantity;      cdsBGLExecutionTotalPrice.AsFloat := GclNode.TotalPrice;      cdsBGLExecution.Post;    end;  end;  procedure WriteXmjData(ABGLNode: TBGLNode);  var    iXmj: Integer;    XmjNode: TXmjNode;  begin    for iXmj := 0 to ABGLNode.XmjList.Count - 1 do    begin      XmjNode := TXmjNode(ABGLNode.XmjList.Items[iXmj]);      cdsBGLExecution.Append;      cdsBGLExecutionCode.AsString := XmjNode.Code;      cdsBGLExecutionName.AsString := XmjNode.Name;      cdsBGLExecutionUnits.AsString := XmjNode.Units;      cdsBGLExecution.Post;      WriteGclData(XmjNode);    end;  end;var  iBGL: Integer;  BGLNode: TBGLNode;begin  for iBGL := 0 to FBGLList.Count - 1 do  begin    BGLNode := TBGLNode(FBGLList.Items[iBGL]);    cdsBGLExecution.Append;    cdsBGLExecutionBGLCode.AsString := BGLNode.BGLCode;    cdsBGLExecution.Post;    WriteXmjData(BGLNode);  end;end;{ TXmjNode }function TXmjNode.AddGclNode(AB_Code: string): TGclNode;var  Node: TGclNode;  i, iIndex: Integer;  sB_Code1, sB_Code2: string;begin  // 新增  Result := TGclNode.Create;  Result.B_Code := AB_Code;  // List中根据顺序新增  iIndex := FGclList.Count;  sB_Code1 := B_CodeToIndexCode(AB_Code);  for i := 0 to FGclList.Count - 1 do  begin    Node := TGclNode(FGclList.Items[i]);    sB_Code2 := B_CodeToIndexCode(Node.B_Code);    if sB_Code1 < sB_Code2 then    begin      iIndex := i;      Break;    end;  end;  FGclList.Insert(iIndex, Result);end;constructor TXmjNode.Create;begin  FGclList := TList.Create;end;destructor TXmjNode.Destroy;begin  ClearObjects(FGclList);  FGclList.Free;  inherited;end;{ TBGLNode }function TBGLNode.AddXmjNode(ACode: string): TXmjNode;var  Node: TXmjNode;  i, iIndex: Integer;  sCode1, sCode2: string;begin  // 新增  Result := TXmjNode.Create;  Result.Code := ACode;  // List中根据顺序新增  iIndex := FXmjList.Count;  sCode1 := ConvertDigitCode(ACode, 3);  for i := 0 to FXmjList.Count - 1 do  begin    Node := TXmjNode(FXmjList.Items[i]);    sCode2 := ConvertDigitCode(Node.Code, 3);    if sCode1 < sCode2 then    begin      iIndex := i;      Break;    end;  end;  FXmjList.Insert(iIndex, Result);end;constructor TBGLNode.Create;begin  FXmjList := TList.Create;end;destructor TBGLNode.Destroy;begin  ClearObjects(FXmjList);  FXmjList.Free;  inherited;end;function TBGLNode.FindXmjNode(ACode: string): TXmjNode;var  iXmj: Integer;  XmjNode: TXmjNode;begin  Result := nil;  for iXmj := 0 to FXmjList.Count - 1 do  begin    XmjNode := TXmjNode(FXmjList.Items[iXmj]);    if SameText(XmjNode.Code, ACode) then    begin      Result := XmjNode;      Break;    end;  end;end;end.
 |