unit PurchasePlan; 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 TPurchasePlan = class(TwItem) private { Private declarations } FOrdNum: string; FQty: string; FUnitt: string; FUnitPrice: string; FAmount: string; FOrdDate: string; protected { Protected declarations } public { Public declarations } class function xGetPurchasePlanLastNumber(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 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 { TPurchasePlan } class function TPurchasePlan.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 TPurchasePlan.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 TPurchasePlan.xAddSqlMark(velStr: string): string; begin Result := ''; Result := '''' + velStr + ''''; end; class function TPurchasePlan.xGetPurchasePlanLastNumber(AQuery: TFDQuery; column: string): string; var sql: string; resStrs: TStrings; begin Result := ''; sql := 'SELECT COUNT(*) FROM "PurchasePlan"'; try AQuery.Close; AQuery.SQL.Text := sql; AQuery.Open; except on E: Exception do ShowMessage('xGetPurchasePlanLastNumber Äõ¸® ½ÇÇà ¿À·ù: ' + E.Message); end; resStrs := LoadFromStringQuery(AQuery, column); if resStrs.Count > 0 then begin Result := resStrs.Strings[0]; end; resStrs.Free; end; class function TPurchasePlan.xGetStrsDistinctProductName( AQuery: TFDQuery): TStrings; var sql, column: string; begin Result := nil; sql := 'SELECT DISTINCT "Name" FROM "PurchasePlan"'; 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 TPurchasePlan.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 "PurchasePlan"'; 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; end.