D10xhGemei/A00通用方法/U_CustomFun.pas

146 lines
3.6 KiB
ObjectPascal
Raw Normal View History

2024-12-14 17:23:12 +08:00
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.