| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 | unit rmGclBillsCompareDm;// Report Memory Gcl Bills Compare DataModule// For [05.�뵙궐싹깊] 連깊01 묏넋좆헌데�뵙궐싹깊(0뵀憩瑯)interfaceuses  SysUtils, Classes, ProjectData, sdDB, DB, DBClient, sdIDTree;type  TCompareGclNode = class  private    FB_Code: string;    FIndexCode: string;    FName: string;    FUnits: string;    FSQuantity: Double;    FSPrice: Double;    FSTotalPrice: Double;    FCQuantity: Double;    FCPrice: Double;    FCTotalPrice: Double;    FMemoStr: string;    function GetDPrice: Double;    function GetDQuantity: Double;    function GetDTotalPrice: Double;  public    property B_Code: string read FB_Code write FB_Code;    property IndexCode: string read FIndexCode write FIndexCode;    property Name: string read FName write FName;    property Units: string read FUnits write FUnits;    // 覩괩    property SQuantity: Double read FSQuantity write FSQuantity;    property SPrice: Double read FSPrice write FSPrice;    property STotalPrice: Double read FSTotalPrice write FSTotalPrice;    // �뵙    property CQuantity: Double read FCQuantity write FCQuantity;    property CPrice: Double read FCPrice write FCPrice;    property CTotalPrice: Double read FCTotalPrice write FCTotalPrice;    // �뵙 - 覩괩    property DQuantity: Double read GetDQuantity;    property DPrice: Double read GetDPrice;    property DTotalPrice: Double read GetDTotalPrice;    property MemoStr: string read FMemoStr;  end;  TrmGclBillsCompareData = class(TDataModule)    cdsBills: TClientDataSet;    cdsBillsB_Code: TStringField;    cdsBillsCodeIndex: TStringField;    cdsBillsName: TWideStringField;    cdsBillsUnits: TWideStringField;    cdsBillsSQuantity: TFloatField;    cdsBillsSPrice: TFloatField;    cdsBillsSTotalPrice: TFloatField;    cdsBillsCQuantity: TFloatField;    cdsBillsCPrice: TFloatField;    cdsBillsCTotalPrice: TFloatField;    cdsBillsDQuantity: TFloatField;    cdsBillsDPrice: TFloatField;    cdsBillsDTotalPrice: TFloatField;    cdsBillsMemoStr: TWideStringField;  private    FNodeList: TList;    procedure LoadGclNodeData(AGclNode: TCompareGclNode; ARec: TsdDataRecord; AIsSource: Boolean);    procedure FilterGclBills(ANode: TsdIDTreeNode; AIsSource: Boolean);    procedure FilterBills(ANode: TsdIDTreeNode; AIsSource: Boolean);    procedure WriteBills;  public    constructor Create;    destructor Destroy; override;    function AssignData(ASProjectData, ACProjectData: TProjectData): TDataSet;  end;implementationuses  Globals, UtilMethods, ZhAPI;{$R *.dfm}{ TCompareGclNode }function TCompareGclNode.GetDPrice: Double;begin  {Result := FCPrice;  if Result = 0 then    Result := FSPrice;}  Result := CPrice - SPrice;end;function TCompareGclNode.GetDQuantity: Double;begin  Result := CQuantity - SQuantity;end;function TCompareGclNode.GetDTotalPrice: Double;begin  Result := CTotalPrice - STotalPrice;end;{ TGclBillsCompareData }function TrmGclBillsCompareData.AssignData(  ASProjectData, ACProjectData: TProjectData): TDataSet;begin  cdsBills.Active := True;  cdsBills.EmptyDataSet;  ClearObjects(FNodeList);  try    FilterBills(ASProjectData.BillsCompileData.BillsCompileTree.FirstNode, True);    FilterBills(ACProjectData.BillsCompileData.BillsCompileTree.FirstNode, False);    WriteBills;  finally    Result := cdsBills;  end;end;constructor TrmGclBillsCompareData.Create;begin  inherited Create(nil);  FNodeList := TList.Create;  cdsBills.IndexFieldNames := 'CodeIndex';end;destructor TrmGclBillsCompareData.Destroy;begin  ClearObjects(FNodeList);  FNodeList.Free;  inherited;end;procedure TrmGclBillsCompareData.FilterBills(ANode: TsdIDTreeNode;  AIsSource: Boolean);begin  if not Assigned(ANode) then Exit;  if ANode.HasChildren then    FilterBills(ANode.FirstChild, AIsSource)  else    FilterGclBills(ANode, AIsSource);  FilterBills(ANode.NextSibling, AIsSource);end;procedure TrmGclBillsCompareData.FilterGclBills(ANode: TsdIDTreeNode;  AIsSource: Boolean);  function CreateGclNode(ARec: TsdDataRecord): TCompareGclNode;  begin    Result := TCompareGclNode.Create;    FNodeList.Add(Result);    Result.FB_Code := ARec.ValueByName('B_Code').AsString;    Result.FIndexCode := B_CodeToIndexCode(ARec.ValueByName('B_Code').AsString);    Result.FName := ARec.ValueByName('Name').AsString;    Result.FUnits := ARec.ValueByName('Units').AsString;  end;  function GetGclNode(ARec: TsdDataRecord): TCompareGclNode;  var    I: Integer;    GclNode: TCompareGclNode;  begin    Result := nil;    for I := 0 to FNodeList.Count - 1 do    begin      GclNode := TCompareGclNode(FNodeList.Items[I]);      if SameText(GclNode.FB_Code, ARec.ValueByName('B_Code').AsString) and          SameText(GclNode.FName, ARec.ValueByName('Name').AsString) and          SameText(GclNode.FUnits, ARec.ValueByName('Units').AsString) then      begin        Result := GclNode;        Break;      end;    end;    if not Assigned(Result) then      Result := CreateGclNode(ARec);  end;var  Rec: TsdDataRecord;  GclNode: TCompareGclNode;begin  if not Assigned(ANode) then Exit;  Rec := ANode.Rec;  if Rec.ValueByName('B_Code').AsString = '' then Exit;  GclNode := GetGclNode(Rec);  LoadGclNodeData(GclNode, Rec, AIsSource);end;procedure TrmGclBillsCompareData.LoadGclNodeData(AGclNode: TCompareGclNode;  ARec: TsdDataRecord; AIsSource: Boolean);begin  if AIsSource then  begin    AGclNode.FSQuantity := AGclNode.FSQuantity + ARec.ValueByName('Quantity').AsFloat;    AGclNode.FSPrice := ARec.ValueByName('Price').AsFloat;    AGclNode.FSTotalPrice := AGclNode.FSTotalPrice + ARec.ValueByName('TotalPrice').AsFloat;  end  else  begin    AGclNode.FCQuantity := AGclNode.FCQuantity + ARec.ValueByName('Quantity').AsFloat;    AGclNode.FCPrice := ARec.ValueByName('Price').AsFloat;    AGclNode.FCTotalPrice := AGclNode.FCTotalPrice + ARec.ValueByName('TotalPrice').AsFloat;  end;end;procedure TrmGclBillsCompareData.WriteBills;var  I: Integer;  GclNode: TCompareGclNode;begin  for I := 0 to FNodeList.Count - 1 do  begin    GclNode := TCompareGclNode(FNodeList.Items[I]);    cdsBills.Append;    cdsBillsB_Code.AsString := GclNode.B_Code;    cdsBillsCodeIndex.AsString := GclNode.IndexCode;    cdsBillsName.AsString := GclNode.Name;    cdsBillsUnits.AsString := GclNode.Units;    cdsBillsSQuantity.AsFloat := GclNode.SQuantity;    cdsBillsSPrice.AsFloat := GclNode.SPrice;    cdsBillsSTotalPrice.AsFloat := GclNode.STotalPrice;    cdsBillsCQuantity.AsFloat := GclNode.CQuantity;    cdsBillsCPrice.AsFloat := GclNode.CPrice;    cdsBillsCTotalPrice.AsFloat := GclNode.CTotalPrice;    cdsBillsDQuantity.AsFloat := GclNode.DQuantity;    cdsBillsDPrice.AsFloat := GclNode.DPrice;    cdsBillsDTotalPrice.AsFloat := GclNode.DTotalPrice;    cdsBillsMemoStr.AsString := GclNode.MemoStr;    cdsBills.Post;  end;end;end.
 |