146 lines
3.6 KiB
ObjectPascal
146 lines
3.6 KiB
ObjectPascal
unit U_CustomFun;
|
||
|
||
interface
|
||
|
||
uses
|
||
System.SysUtils, System.Classes, Data.DB, System.Generics.Collections,
|
||
System.StrUtils, Datasnap.DBClient;
|
||
|
||
type
|
||
TProductTotals = class
|
||
private
|
||
FPieceCount: Integer;
|
||
FQuantity: Double;
|
||
public
|
||
property PieceCount: Integer read FPieceCount write FPieceCount;
|
||
property Quantity: Double read FQuantity write FQuantity;
|
||
constructor Create;
|
||
end;
|
||
|
||
TProductNameTotalsDict = TDictionary<string, TProductTotals>;
|
||
|
||
function GetMergedResultsAsString(ClientDataSet: TClientDataSet): string;
|
||
|
||
function CustomSelCDSKey(CDS_1: TclientDataSet; Keys: TArray<string>): TArray<string>;
|
||
|
||
implementation
|
||
|
||
//uses
|
||
// U_printPdf, U_RTFun, U_DataLink;
|
||
|
||
constructor TProductTotals.Create;
|
||
begin
|
||
FPieceCount := 0;
|
||
FQuantity := 0.0;
|
||
end;
|
||
|
||
function CustomSelCDSKey(CDS_1: TclientDataSet; Keys: TArray<string>): TArray<string>;
|
||
var
|
||
RTValues: TArray<string>;
|
||
i, j, CurRow: Integer;
|
||
begin
|
||
SetLength(RTValues, Length(Keys));
|
||
CurRow := CDS_1.recno;
|
||
CDS_1.DisableControls;
|
||
with CDS_1 do
|
||
begin
|
||
First;
|
||
j := 0;
|
||
while not Eof do
|
||
begin
|
||
if j = 0 then
|
||
begin
|
||
for i := 0 to Length(RTValues) - 1 do
|
||
begin
|
||
RTValues[i] := Trim(CDS_1.fieldbyname(Keys[i]).AsString) + ',';
|
||
end;
|
||
end
|
||
else
|
||
begin
|
||
for i := 0 to Length(RTValues) - 1 do
|
||
begin
|
||
RTValues[i] := RTValues[i] + Trim(CDS_1.fieldbyname(Keys[i]).AsString) + ',';
|
||
end;
|
||
end;
|
||
j := j + 1;
|
||
|
||
CDS_1.Next;
|
||
end;
|
||
end;
|
||
CDS_1.recno := CurRow;
|
||
CDS_1.EnableControls;
|
||
|
||
for i := 0 to Length(RTValues) - 1 do
|
||
begin
|
||
RTValues[i] := copy(RTValues[i], 1, Length(RTValues[i]) - 1);
|
||
end;
|
||
|
||
Result := RTValues;
|
||
end;
|
||
|
||
function GetMergedResultsAsString(ClientDataSet: TClientDataSet): string;
|
||
var
|
||
ProductNameTotalsDict: TProductNameTotalsDict;
|
||
ProductName: string;
|
||
PieceCount: Integer;
|
||
Quantity: Double;
|
||
ProductNameList: TStringList;
|
||
ProductTotals: TProductTotals;
|
||
I: Integer;
|
||
begin
|
||
ProductNameTotalsDict := TProductNameTotalsDict.Create;
|
||
try
|
||
ClientDataSet.IndexName := ''; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
ClientDataSet.First;
|
||
|
||
while not ClientDataSet.Eof do
|
||
begin
|
||
ProductName := ClientDataSet.FieldByName('Grade').AsString;
|
||
PieceCount := ClientDataSet.FieldByName('Piece').AsInteger;
|
||
Quantity := ClientDataSet.FieldByName('Qty').AsFloat;
|
||
|
||
if not ProductNameTotalsDict.ContainsKey(ProductName) then
|
||
begin
|
||
ProductTotals := TProductTotals.Create;
|
||
ProductTotals.PieceCount := PieceCount;
|
||
ProductTotals.Quantity := Quantity;
|
||
ProductNameTotalsDict.Add(ProductName, ProductTotals);
|
||
end
|
||
else
|
||
begin
|
||
ProductTotals := ProductNameTotalsDict[ProductName];
|
||
ProductTotals.PieceCount := ProductTotals.PieceCount + PieceCount;
|
||
ProductTotals.Quantity := ProductTotals.Quantity + Quantity;
|
||
end;
|
||
|
||
ClientDataSet.Next;
|
||
end;
|
||
|
||
ProductNameList := TStringList.Create;
|
||
try
|
||
for ProductName in ProductNameTotalsDict.Keys do
|
||
begin
|
||
ProductTotals := ProductNameTotalsDict[ProductName];
|
||
ProductNameList.Add(Format('%s: ֧<><D6A7>=%d, <20><><EFBFBD><EFBFBD>=%.2f', [ProductName, ProductTotals.PieceCount, ProductTotals.Quantity]));
|
||
end;
|
||
|
||
ProductNameList.Sort;
|
||
Result := StringReplace(ProductNameList.Text, #13#10, '; ', [rfReplaceAll]);
|
||
finally
|
||
ProductNameList.Free;
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>еĶ<D0B5><C4B6><EFBFBD><F3A3ACB1><EFBFBD><EFBFBD>ڴ<EFBFBD>й©
|
||
for ProductTotals in ProductNameTotalsDict.Values do
|
||
begin
|
||
ProductTotals.Free;
|
||
end;
|
||
ProductNameTotalsDict.Clear;
|
||
end;
|
||
finally
|
||
ProductNameTotalsDict.Free;
|
||
end;
|
||
end;
|
||
|
||
end.
|
||
|