| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323 | unit rmCacheData;// Report Memory Cache Datainterfaceuses  Classes, CacheTree, sdIDTree, sdDB;type  TDoubleArray = array of Double;  TStringArray = array of string;  TGclGatherNode = class  private    FB_Code: string;    FIndexCode: string;    FName: string;    FUnits: string;    FPrice: Double;    FQuantity: Double;    FTotalPrice: Double;    FAddDealQuantity: Double;    FAddDealTotalPrice: Double;    FAddQcQuantity: Double;    FAddQcTotalPrice: Double;    FAddPcQuantity: Double;    FAddPcTotalPrice: Double;    FP_Price: TDoubleArray;    FP_Quantity: TDoubleArray;    FP_TotalPrice: TDoubleArray;    FP_AddGatherQuantity: TDoubleArray;    FP_AddGatherTotalPrice: TDoubleArray;    procedure SetB_Code(const Value: string);  public    constructor Create(AProjectCount: Integer);    property B_Code: string read FB_Code write SetB_Code;    property IndexCode: string read FIndexCode;    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;    property AddDealQuantity: Double read FAddDealQuantity write FAddDealQuantity;    property AddDealTotalPrice: Double read FAddDealTotalPrice write FAddDealTotalPrice;    property AddQcQuantity: Double read FAddQcQuantity write FAddQcQuantity;    property AddQcTotalPrice: Double read FAddQcTotalPrice write FAddQcTotalPrice;    property AddPcQuantity: Double read FAddPcQuantity write FAddPcQuantity;    property AddPcTotalPrice: Double read FAddPcTotalPrice write FAddPcTotalPrice;    property P_Price: TDoubleArray read FP_Price write FP_Price;    property P_Quantity: TDoubleArray read FP_Quantity write FP_Quantity;    property P_TotalPrice: TDoubleArray read FP_TotalPrice write FP_TotalPrice;    property P_AddGatherQuantity: TDoubleArray read FP_AddGatherQuantity write FP_AddGatherQuantity;    property P_AddGatherTotalPrice: TDoubleArray read FP_AddGatherTotalPrice write FP_AddGatherTotalPrice;  end;  TGclGatherList = class  private    FList: TList;    FComparePrice: Boolean;    FProjectName: TStringArray;    FProjectCount: Integer;    FGatherNode: TGclGatherNode;    function SameGclNode(AGclNode: TGclGatherNode; ARec: TsdDataRecord): Boolean;    function FindGclNode(ARec: TsdDataRecord): TGclGatherNode;    function AddGclNode(ARec: TsdDataRecord): TGclGatherNode;    function GetCount: Integer;    function GetNode(AIndex: Integer): TGclGatherNode;  public    constructor Create(AProjectCount: Integer; AComparePrice: Boolean = True);    destructor Destroy; override;    function GetGclGatherNode(ARec: TsdDataRecord): TGclGatherNode;    procedure ReCalcualteGatherNode;    property ProjectCount: Integer read FProjectCount;    property Count: Integer read GetCount;    property Node[AIndex: Integer]: TGclGatherNode read GetNode;    property GatherNode: TGclGatherNode read FGatherNode;    property ProjectName: TStringArray read FProjectName write FProjectName;  end;  TFixedIDBillsNode = class  private    FFixedID: Integer;    FName: string;    FTotalPrice: Double;    FP_TotalPrice: TDoubleArray;    FAddGatherTotalPrice: Double;    FP_AddGatherTotalPrice: TDoubleArray;  public    constructor Create(AProjectCount: Integer);    property FixedID: Integer read FFixedID write FFixedID;    property Name: string read FName write FName;    property TotalPrice: Double read FTotalPrice write FTotalPrice;    property P_TotalPrice: TDoubleArray read FP_TotalPrice write FP_TotalPrice;    property AddGatherTotalPrice: Double read FAddGatherTotalPrice write FAddGatherTotalPrice;    property P_AddGatherTotalPrice: TDoubleArray read FP_AddGatherTotalPrice write FP_AddGatherTotalPrice;  end;  TFixedIDBillsList = class  private    FList: TList;    FProjectName: TStringArray;    FProjectCount: Integer;    function AddNode(AFixedID: Integer): TFixedIDBillsNode;    function GetCount: Integer;    function GetNode(AIndex: Integer): TFixedIDBillsNode;  public    constructor Create(AProjectCount: Integer);    destructor Destroy; override;    function GetFixedIDBillsNode(AFixedID: Integer): TFixedIDBillsNode;    function FixedIDBillsNode(AFixedID: Integer): TFixedIDBillsNode;    property ProjectCount: Integer read FProjectCount;    property Count: Integer read GetCount;    property Node[AIndex: Integer]: TFixedIDBillsNode read GetNode;    property ProjectName: TStringArray read FProjectName write FProjectName;  end;implementationuses  ZhAPI, DateUtils, SysUtils, UtilMethods;{ TGclGatherNode }constructor TGclGatherNode.Create(AProjectCount: Integer);begin  SetLength(FP_Price, AProjectCount);  SetLength(FP_Quantity, AProjectCount);  SetLength(FP_TotalPrice, AProjectCount);  SetLength(FP_AddGatherQuantity, AProjectCount);  SetLength(FP_AddGatherTotalPrice, AProjectCount);end;procedure TGclGatherNode.SetB_Code(const Value: string);begin  FB_Code := Value;  FIndexCode := B_CodeToIndexCode(FB_Code);end;{ TGclGatherList }constructor TGclGatherList.Create(AProjectCount: Integer;  AComparePrice: Boolean = True);begin  FProjectCount := AProjectCount;  FList := TList.Create;  FComparePrice := AComparePrice;  SetLength(FProjectName, FProjectCount);  FGatherNode := TGclGatherNode.Create(FProjectCount);end;destructor TGclGatherList.Destroy;begin  FGatherNode.Free;  ClearObjects(FList);  FList.Free;  inherited;end;function TGclGatherList.FindGclNode(ARec: TsdDataRecord): TGclGatherNode;var  i: Integer;  GclNode: TGclGatherNode;begin  Result := nil;  for i := 0 to FList.Count - 1 do  begin    GclNode := TGclGatherNode(FList.Items[i]);    if SameGclNode(GclNode, ARec) then    begin      Result := GclNode;      Break;    end;  end;end;function TGclGatherList.GetCount: Integer;begin  Result := FList.Count;end;function TGclGatherList.GetNode(AIndex: Integer): TGclGatherNode;begin  Result := TGclGatherNode(FList.Items[AIndex]);end;function TGclGatherList.GetGclGatherNode(ARec: TsdDataRecord): TGclGatherNode;begin  Result := FindGclNode(ARec);  if not Assigned(Result) then    Result := AddGclNode(ARec);end;function TGclGatherList.AddGclNode(ARec: TsdDataRecord): TGclGatherNode;begin  Result := TGclGatherNode.Create(FProjectCount);  FList.Add(Result);  Result.B_Code := ARec.ValueByName('B_Code').AsString;  Result.Name := ARec.ValueByName('Name').AsString;  Result.Units := ARec.ValueByName('Units').AsString;  Result.Price := ARec.ValueByName('Price').AsFloat;end;procedure TGclGatherList.ReCalcualteGatherNode;var  iNode, iP: Integer;  GclNode: TGclGatherNode;begin  for iNode := 0 to FList.Count - 1 do  begin    GclNode := TGclGatherNode(FList.Items[iNode]);    FGatherNode.Quantity := FGatherNode.Quantity + GclNode.Quantity;    FGatherNode.TotalPrice := FGatherNode.TotalPrice + GclNode.TotalPrice;    FGatherNode.AddDealQuantity := FGatherNode.AddDealQuantity + GclNode.AddDealQuantity;    FGatherNode.AddDealTotalPrice := FGatherNode.AddDealTotalPrice + GclNode.AddDealTotalPrice;    FGatherNode.AddQcQuantity := FGatherNode.AddQcQuantity + GclNode.AddQcQuantity;    FGatherNode.AddQcTotalPrice := FGatherNode.AddQcTotalPrice + GclNode.AddQcTotalPrice;    FGatherNode.AddPcQuantity := FGatherNode.AddPcQuantity + GclNode.AddPcQuantity;    FGatherNode.AddPcTotalPrice := FGatherNode.AddPcTotalPrice + GclNode.AddPcTotalPrice;    for iP := 0 to FProjectCount - 1 do    begin      FGatherNode.P_Quantity[iP] := FGatherNode.P_Quantity[iP] + GclNode.P_Quantity[iP];      FGatherNode.P_TotalPrice[iP] := FGatherNode.P_TotalPrice[iP] + GclNode.P_TotalPrice[iP];      FGatherNode.P_AddGatherQuantity[iP] := FGatherNode.P_AddGatherQuantity[iP] + GclNode.P_AddGatherQuantity[iP];      FGatherNode.P_AddGatherTotalPrice[iP] := FGatherNode.P_AddGatherTotalPrice[iP] + GclNode.P_AddGatherTotalPrice[iP];    end;  end;end;function TGclGatherList.SameGclNode(AGclNode: TGclGatherNode; ARec: TsdDataRecord): Boolean;begin  Result := SameText(AGclNode.B_Code, ARec.ValueByName('B_Code').AsString) and            SameText(AGclNode.Name, ARec.ValueByName('Name').AsString) and            SameText(AGclNode.Units, ARec.ValueByName('Units').AsString);  if FComparePrice then    Result := Result and (AGclNode.Price = ARec.ValueByName('Price').AsFloat);end;{ TFixedIDBillsNode }constructor TFixedIDBillsNode.Create(AProjectCount: Integer);begin  SetLength(FP_TotalPrice, AProjectCount);  SetLength(FP_AddGatherTotalPrice, AProjectCount);end;{ TFixedIDBillsList }function TFixedIDBillsList.AddNode(AFixedID: Integer): TFixedIDBillsNode;begin  Result := TFixedIDBillsNode.Create(FProjectCount);  FList.Add(Result);  Result.FixedID := AFixedID;end;constructor TFixedIDBillsList.Create(AProjectCount: Integer);begin  FProjectCount := AProjectCount;  FList := TList.Create;  SetLength(FProjectName, FProjectCount);end;destructor TFixedIDBillsList.Destroy;begin  ClearObjects(FList);  FList.Free;  inherited;end;function TFixedIDBillsList.FixedIDBillsNode(  AFixedID: Integer): TFixedIDBillsNode;var  i: Integer;begin  Result := nil;  for i := 0 to FList.Count - 1 do  begin    if TFixedIDBillsNode(FList.Items[i]).FixedID = AFixedID then    begin      Result := TFixedIDBillsNode(FList.Items[i]);      Break;    end;  end;end;function TFixedIDBillsList.GetCount: Integer;begin  Result := FList.Count;end;function TFixedIDBillsList.GetFixedIDBillsNode(  AFixedID: Integer): TFixedIDBillsNode;begin  Result := FixedIDBillsNode(AFixedID);  if not Assigned(Result) then    Result := AddNode(AFixedID);end;function TFixedIDBillsList.GetNode(AIndex: Integer): TFixedIDBillsNode;begin  Result := TFixedIDBillsNode(FList.Items[AIndex]);end;end.
 |