D10xhGemei/A00通用方法/U_CustomFun.pas
“ddf” 56b1ef408f 1
2024-12-14 17:23:12 +08:00

146 lines
3.6 KiB
ObjectPascal
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.