unit SubOrder; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, wItem, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt, FireDAC.Phys.PGDef, FireDAC.VCLUI.Wait, FireDAC.Comp.UI, FireDAC.Phys.PG, Data.DB, FireDAC.Comp.DataSet, FireDAC.Comp.Client ; type TSubOrder = class(TwItem) private { Private declarations } FOrdNum: string; FOrdCode: string; FQty: string; FUnitt: string; FUnitPrice: string; FAmount: string; FOrdDate: string; protected { Protected declarations } public { Public declarations } class function xGetSubOrderLastNumber(AQuery: TFDQuery; column: string): string; class function LoadFromStringQuery(AQuery: TFDQuery; column: string): TStrings; class function xGetStrsDistinctProductName(AQuery: TFDQuery): TStrings; class function xAddSqlMark(velStr: string): string; class function xGetStrsProdNameBySumQty(AQuery: TFDQuery; prod, stDate, enDate: string): TStrings; class function LoadFromStringsQuery(AQuery: TFDQuery; columns: TStrings): TStrings; published { Published declarations } property OrdNum: string read FOrdNum write FOrdNum; property OrdCode: string read FOrdCode write FOrdCode; property Qty: string read FQty write FQty; property Unitt: string read FUnitt write FUnitt; property UnitPrice: string read FUnitPrice write FUnitPrice; property Amount: string read FAmount write FAmount; property OrdDate: string read FOrdDate write FOrdDate; end; implementation { TSubOrder } class function TSubOrder.LoadFromStringQuery(AQuery: TFDQuery; column: string): TStrings; var valStr: string; begin Result := TStringList.Create; while not AQuery.Eof do begin valStr := AQuery.FieldByName(column).AsString; Result.Add(valStr); AQuery.Next; end; end; class function TSubOrder.LoadFromStringsQuery(AQuery: TFDQuery; columns: TStrings): TStrings; var i: Integer; valStr, sumval: string; begin Result := TStringList.Create; AQuery.First; while not AQuery.Eof do begin sumval := ''; for i := 0 to columns.Count-1 do begin valStr := AQuery.FieldByName(columns.Strings[i]).AsString; if i = 0 then sumval := valStr else sumval := sumval + ';' + valStr; end; Result.Add(sumval); AQuery.Next; end; end; class function TSubOrder.xAddSqlMark(velStr: string): string; begin Result := ''; Result := '''' + velStr + ''''; end; class function TSubOrder.xGetStrsDistinctProductName( AQuery: TFDQuery): TStrings; var sql, column: string; begin Result := nil; sql := 'SELECT DISTINCT "Name" FROM "SubOrder"'; sql := sql + ' WHERE "IsValid"=' + xAddSqlMark('t'); try AQuery.Close; AQuery.SQL.Text := sql; AQuery.Open; except on E: Exception do ShowMessage('xGetStrsDistinctProductName Äõ¸® ½ÇÇà ¿À·ù: ' + E.Message); end; column := 'Name'; Result := LoadFromStringQuery(AQuery, column); end; class function TSubOrder.xGetStrsProdNameBySumQty(AQuery: TFDQuery; prod, stDate, enDate: string): TStrings; var sql: string; columns: TStrings; begin sql := 'SELECT "Name" AS prodname,'; sql := sql + ' TO_CHAR(DATE_TRUNC(' + xAddSqlMark('month') + ', "OrdDate"), ' + xAddSqlMark('YYYY-MM') + ') AS mon,'; sql := sql + ' TO_CHAR(DATE_TRUNC(' + xAddSqlMark('month') + ', "OrdDate"), ' + xAddSqlMark('FMMM') + ') || ' + xAddSqlMark('¿ù') + ' AS montext,'; sql := sql + ' SUM("Amount") AS sumqty'; sql := sql + ' FROM "SubOrder"'; sql := sql + ' WHERE "IsValid" =' + xAddSqlMark('t'); if Length(prod) > 0 then sql := sql + ' AND "Name" =' + xAddSqlMark(prod); if Length(Trim(stDate)) > 0 then begin sql := sql + ' AND "OrdDate">=' + xAddSqlMark(stDate); sql := sql + ' AND "OrdDate"<=' + xAddSqlMark(enDate); end; sql := sql + ' GROUP BY "prodname", DATE_TRUNC(' + xAddSqlMark('month') + ', "OrdDate")'; sql := sql + ' ORDER BY "prodname", mon'; try AQuery.Close; AQuery.SQL.Text := sql; AQuery.Open; except on E: Exception do ShowMessage('xGetStrsProdNameBySumQty Äõ¸® ½ÇÇà ¿À·ù: ' + E.Message); end; columns := TStringList.Create; columns.Add('prodname'); columns.Add('mon'); columns.Add('montext'); columns.Add('sumqty'); Result := LoadFromStringsQuery(AQuery, columns); columns.Free; end; class function TSubOrder.xGetSubOrderLastNumber(AQuery: TFDQuery; column: string): string; var sql: string; resStrs: TStrings; begin Result := ''; sql := 'SELECT COUNT(*) FROM "SubOrder"'; try AQuery.Close; AQuery.SQL.Text := sql; AQuery.Open; except on E: Exception do ShowMessage('xGetSubOrderLastNumber Äõ¸® ½ÇÇà ¿À·ù: ' + E.Message); end; resStrs := LoadFromStringQuery(AQuery, column); if resStrs.Count > 0 then begin Result := resStrs.Strings[0]; end; resStrs.Free; end; end.