unit OrderMst; 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 TOrderMst = class(TwItem) private { Private declarations } FOrdNum: string; FOrdDate: string; FCustName: string; FConnPerson: string; FDeliveryDate: string; FWarehouse: string; FQty: string; FUnitt: string; FUnitPrice: string; FAmount: string; FDescriptions: string; FProcStatus: string; FScheDate: string; FProcDesc: string; FProcName: string; FProcCost: string; FOutInfo: string; FOutDate: string; FTaxDate: string; FInAmoDate: string; FqSubList: TList; FqPlanList: TList; protected { Protected declarations } public { Public declarations } property qSubList: TList read FqSubList write FqSubList; property qPlanList: TList read FqPlanList write FqPlanList; constructor Create(AOwner: TObject);// override; destructor Destroy; override; class function xAddSqlMark(velStr: string): string; class function xGetStrSqlOrderToSubList(AQuery: TFDQuery; cust, status, stDate, enDate: string): TList; class function LoadFromQuery(AQuery: TFDQuery): TList; class function xGetObjsProdScheOrderList(AQuery: TFDQuery; scheStatus, stDate, enDate: string): TList; class function LoadFromSingleQuery(AQuery: TFDQuery): TList; function xGetObjsSubOrderList(AQuery: TFDQuery): TList; function LoadFromQueryToSubOrder(AQuery: TFDQuery): TList; class function xGetOrderMstLastNumber(AQuery: TFDQuery; column: string): string; class function LoadFromStringQuery(AQuery: TFDQuery; column: string): TStrings; procedure xGetObjsProductPlanList(AQuery: TFDQuery); function LoadFromQueryToProductPlan(AQuery: TFDQuery): TList; procedure xFreeAllList(var objList: TList); class function xGetStrsDistinctCustName(AQuery: TFDQuery): TStrings; class function xGetStrsCustNameBySumQty(AQuery: TFDQuery; cust, stDate, enDate: string): TStrings; class function LoadFromStringsQuery(AQuery: TFDQuery; columns: TStrings): TStrings; published { Published declarations } property OrdNum: string read FOrdNum write FOrdNum; property OrdDate: string read FOrdDate write FOrdDate; property CustName: string read FCustName write FCustName; property ConnPerson: string read FConnPerson write FConnPerson; property DeliveryDate: string read FDeliveryDate write FDeliveryDate; property Warehouse: string read FWarehouse write FWarehouse; 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 Descriptions: string read FDescriptions write FDescriptions; property ProcStatus: string read FProcStatus write FProcStatus; property ScheDate: string read FScheDate write FScheDate; property ProcDesc: string read FProcDesc write FProcDesc; property ProcName: string read FProcName write FProcName; property ProcCost: string read FProcCost write FProcCost; property OutInfo: string read FOutInfo write FOutInfo; property OutDate: string read FOutDate write FOutDate; property TaxDate: string read FTaxDate write FTaxDate; property InAmoDate: string read FInAmoDate write FInAmoDate; end; implementation uses SubOrder, ProductPlan; { TOrderMst } constructor TOrderMst.Create(AOwner: TObject); begin FqSubList := TList.Create; FqPlanList := TList.Create; end; destructor TOrderMst.Destroy; var i: Integer; tmpObj: TObject; begin if FqSubList <> nil then xFreeAllList(FqSubList); if FqPlanList <> nil then xFreeAllList(FqPlanList); inherited; end; class function TOrderMst.LoadFromQuery(AQuery: TFDQuery): TList; var i, idx, nidx: Integer; valName, fieName, obidVal: string; curOrd, tmpOrd: TOrderMst; curSub: TSubOrder; begin Result := TList.Create; AQuery.First; //Áߺ¹ Ä÷³ ½ÃÀÛÁöÁ¡ ã±â.. nidx := -1; for i := 0 to AQuery.FieldCount-1 do begin fieName := AQuery.Fields[i].FieldName; if Pos('_1',fieName) > 0 then begin nidx := i; Break; end; end; AQuery.First; while not AQuery.Eof do begin obidVal := AQuery.FieldByName('OBID').AsString; //Áߺ¹ °´Ã¼ ã±â.. idx := -1; for i := 0 to Result.Count - 1 do begin tmpOrd := TOrderMst(Result[i]); if SameText(obidVal, tmpOrd.OBID) then begin idx := i; Break; end; end; if idx = -1 then begin curOrd := TOrderMst.Create(nil); for i := 0 to nidx-1 do begin fieName := AQuery.Fields[i].FieldName; valName := AQuery.Fields[i].AsString; if SameText(fieName, 'OBID') then curOrd.OBID := valName else if SameText(fieName, 'Name') then curOrd.Name := valName else if SameText(fieName, 'wClassName') then curOrd.wClassName := valName else if SameText(fieName, 'CreateDate') then curOrd.CreateDate := valName else if SameText(fieName, 'CreateTime') then curOrd.CreateTime := valName else if SameText(fieName, 'CreatorID') then curOrd.CreatorID := valName else if SameText(fieName, 'IsValid') then curOrd.IsValid := valName else if SameText(fieName, 'LcStatus') then curOrd.LcStatus := valName else if SameText(fieName, 'OrdNum') then curOrd.OrdNum := valName else if SameText(fieName, 'OrdDate') then curOrd.OrdDate := valName else if SameText(fieName, 'CustName') then curOrd.CustName := valName else if SameText(fieName, 'ConnPerson') then curOrd.ConnPerson := valName else if SameText(fieName, 'DeliveryDate') then curOrd.DeliveryDate := valName else if SameText(fieName, 'Warehouse') then curOrd.Warehouse := valName else if SameText(fieName, 'Qty') then curOrd.Qty := valName else if SameText(fieName, 'Unitt') then curOrd.Unitt := valName else if SameText(fieName, 'UnitPrice') then curOrd.UnitPrice := valName else if SameText(fieName, 'Amount') then curOrd.Amount := valName else if SameText(fieName, 'Descriptions') then curOrd.Descriptions := valName else if SameText(fieName, 'ProcStatus') then curOrd.ProcStatus := valName else if SameText(fieName, 'ScheDate') then curOrd.ScheDate := valName else if SameText(fieName, 'ProcName') then curOrd.ProcName := valName else if SameText(fieName, 'ProcDesc') then curOrd.ProcDesc := valName else if SameText(fieName, 'ProcCost') then curOrd.ProcCost := valName else if SameText(fieName, 'OutInfo') then curOrd.OutInfo := valName else if SameText(fieName, 'OutDate') then curOrd.OutDate := valName else if SameText(fieName, 'TaxDate') then curOrd.TaxDate := valName else if SameText(fieName, 'InAmoDate') then curOrd.InAmoDate := valName; end; Result.Add(curOrd); end else begin curOrd := TOrderMst(Result.Items[idx]); end; curSub := TSubOrder.Create(nil); for i := nidx to AQuery.FieldCount-1 do begin fieName := StringReplace(AQuery.Fields[i].FieldName, '_1', '', [rfReplaceAll]); valName := AQuery.Fields[i].AsString; if SameText(fieName, 'OBID') then curSub.OBID := valName else if SameText(fieName, 'Name') then curSub.Name := valName else if SameText(fieName, 'wClassName') then curSub.wClassName := valName else if SameText(fieName, 'CreateDate') then curSub.CreateDate := valName else if SameText(fieName, 'CreateTime') then curSub.CreateTime := valName else if SameText(fieName, 'CreatorID') then curSub.CreatorID := valName else if SameText(fieName, 'IsValid') then curSub.IsValid := valName else if SameText(fieName, 'LcStatus') then curSub.LcStatus := valName else if SameText(fieName, 'OrdNum') then curSub.OrdNum := valName else if SameText(fieName, 'OrdCode') then curSub.OrdCode := valName else if SameText(fieName, 'Qty') then curSub.Qty := valName else if SameText(fieName, 'Unitt') then curSub.Unitt := valName else if SameText(fieName, 'UnitPrice') then curSub.UnitPrice := valName else if SameText(fieName, 'Amount') then curSub.Amount := valName else if SameText(fieName, 'OrdDate') then curSub.OrdDate := valName; end; curOrd.qSubList.Add(curSub); AQuery.Next; end; end; function TOrderMst.LoadFromQueryToProductPlan(AQuery: TFDQuery): TList; var curPlan: TProductPlan; begin Result := TList.Create; while not AQuery.Eof do begin curPlan := TProductPlan.Create(nil); curPlan.OBID := AQuery.FieldByName('OBID').AsString; curPlan.Name := AQuery.FieldByName('Name').AsString; curPlan.wClassName := AQuery.FieldByName('wClassName').AsString; curPlan.CreateDate := AQuery.FieldByName('CreateDate').AsString; curPlan.CreateTime := FormatDateTime('hh:nn:ss', AQuery.FieldByName('CreateTime').AsDateTime); curPlan.CreatorID := AQuery.FieldByName('CreatorID').AsString; curPlan.IsValid := AQuery.FieldByName('IsValid').AsString; curPlan.LcStatus := AQuery.FieldByName('LcStatus').AsString; curPlan.OrdNum := AQuery.FieldByName('OrdNum').AsString; curPlan.OrdCode := AQuery.FieldByName('OrdCode').AsString; curPlan.ConnPerson := AQuery.FieldByName('ConnPerson').AsString; curPlan.Descriptions := AQuery.FieldByName('Descriptions').AsString; curPlan.MachName := AQuery.FieldByName('MachName').AsString; curPlan.PlanDate := AQuery.FieldByName('PlanDate').AsString; curPlan.StartMachDate := AQuery.FieldByName('StartMachDate').AsString; curPlan.FinMachDate := AQuery.FieldByName('FinMachDate').AsString; Result.Add(curPlan); AQuery.Next; end; end; function TOrderMst.LoadFromQueryToSubOrder(AQuery: TFDQuery): TList; var curSub: TSubOrder; begin while not AQuery.Eof do begin curSub := TSubOrder.Create(nil); curSub.OBID := AQuery.FieldByName('OBID').AsString; curSub.Name := AQuery.FieldByName('Name').AsString; curSub.wClassName := AQuery.FieldByName('wClassName').AsString; curSub.CreateDate := AQuery.FieldByName('CreateDate').AsString; curSub.CreateTime := FormatDateTime('hh:nn:ss', AQuery.FieldByName('CreateTime').AsDateTime); curSub.CreatorID := AQuery.FieldByName('CreatorID').AsString; curSub.IsValid := AQuery.FieldByName('IsValid').AsString; curSub.LcStatus := AQuery.FieldByName('LcStatus').AsString; curSub.OrdNum := AQuery.FieldByName('OrdNum').AsString; curSub.OrdCode := AQuery.FieldByName('OrdCode').AsString; curSub.Qty := AQuery.FieldByName('Qty').AsString; curSub.Unitt := AQuery.FieldByName('Unitt').AsString; curSub.UnitPrice := AQuery.FieldByName('UnitPrice').AsString; curSub.Amount := AQuery.FieldByName('Amount').AsString; curSub.OrdDate := AQuery.FieldByName('OrdDate').AsString; qSubList.Add(curSub); AQuery.Next; end; end; class function TOrderMst.LoadFromSingleQuery(AQuery: TFDQuery): TList; var curOrd: TOrderMst; begin Result := TList.Create; while not AQuery.Eof do begin curOrd := TOrderMst.Create(nil); curOrd.OBID := AQuery.FieldByName('OBID').AsString; curOrd.Name := AQuery.FieldByName('Name').AsString; curOrd.wClassName := AQuery.FieldByName('wClassName').AsString; curOrd.CreateDate := AQuery.FieldByName('CreateDate').AsString; curOrd.CreateTime := FormatDateTime('hh:nn:ss', AQuery.FieldByName('CreateTime').AsDateTime); curOrd.CreatorID := AQuery.FieldByName('CreatorID').AsString; curOrd.IsValid := AQuery.FieldByName('IsValid').AsString; curOrd.LcStatus := AQuery.FieldByName('LcStatus').AsString; curOrd.OrdNum := AQuery.FieldByName('OrdNum').AsString; curOrd.OrdDate := AQuery.FieldByName('OrdDate').AsString; curOrd.CustName := AQuery.FieldByName('CustName').AsString; curOrd.ConnPerson := AQuery.FieldByName('ConnPerson').AsString; curOrd.DeliveryDate := AQuery.FieldByName('DeliveryDate').AsString; curOrd.Warehouse := AQuery.FieldByName('Warehouse').AsString; curOrd.Qty := AQuery.FieldByName('Qty').AsString; curOrd.Unitt := AQuery.FieldByName('Unitt').AsString; curOrd.UnitPrice := AQuery.FieldByName('UnitPrice').AsString; curOrd.Amount := AQuery.FieldByName('Amount').AsString; curOrd.Descriptions := AQuery.FieldByName('Descriptions').AsString; curOrd.ProcStatus := AQuery.FieldByName('ProcStatus').AsString; curOrd.ScheDate := AQuery.FieldByName('ScheDate').AsString; curOrd.ProcDesc := AQuery.FieldByName('ProcDesc').AsString; curOrd.ProcName := AQuery.FieldByName('ProcName').AsString; curOrd.ProcCost := AQuery.FieldByName('ProcCost').AsString; curOrd.OutInfo := AQuery.FieldByName('OutInfo').AsString; curOrd.OutDate := AQuery.FieldByName('OutDate').AsString; curOrd.TaxDate := AQuery.FieldByName('TaxDate').AsString; curOrd.InAmoDate := AQuery.FieldByName('InAmoDate').AsString; Result.Add(curOrd); AQuery.Next; end; end; class function TOrderMst.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 TOrderMst.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 TOrderMst.xAddSqlMark(velStr: string): string; begin Result := ''; Result := '''' + velStr + ''''; end; procedure TOrderMst.xFreeAllList(var objList: TList); var i: Integer; tmpObj: TObject; begin if objList <> nil then begin i := 0; while i < objList.Count do begin tmpObj := objList.Items[i]; if tmpObj <> nil then tmpObj.Free; tmpObj := nil; objList.Delete(i); end; objList.Free; objList:=nil; end; end; class function TOrderMst.xGetObjsProdScheOrderList(AQuery: TFDQuery; scheStatus, stDate, enDate: string): TList; var sql: string; begin Result := nil; sql := 'SELECT * FROM "OrderMst"'; sql := sql + ' WHERE "IsValid"=' + xAddSqlMark('t'); if Length(Trim(scheStatus)) > 0 then sql := sql + ' AND "ProcStatus"=' + xAddSqlMark(scheStatus); if Length(Trim(stDate)) > 0 then begin sql := sql + ' AND "ScheDate">=' + xAddSqlMark(stDate); sql := sql + ' AND "ScheDate"<=' + xAddSqlMark(enDate); end; try AQuery.Close; AQuery.SQL.Text := sql; AQuery.Open; except on E: Exception do ShowMessage('xGetObjsProdScheOrderList Äõ¸® ½ÇÇà ¿À·ù: ' + E.Message); end; Result := LoadFromSingleQuery(AQuery); end; procedure TOrderMst.xGetObjsProductPlanList(AQuery: TFDQuery); var sql: string; begin sql := 'SELECT obj2.* FROM "OrderMst"obj0, "OrderMstProdPlanR"obj1, "ProductPlan"obj2'; sql := sql + ' WHERE obj0."IsValid"=' + xAddSqlMark('t'); sql := sql + ' AND obj0."OBID"=' + xAddSqlMark(OBID); sql := sql + ' AND obj1."IsValid"=' + xAddSqlMark('t'); sql := sql + ' AND obj1."LOBID"=obj0."OBID"'; sql := sql + ' AND obj2."IsValid"=' + xAddSqlMark('t'); sql := sql + ' AND obj2."OBID"=obj1."ROBID"'; try AQuery.Close; AQuery.SQL.Text := sql; AQuery.Open; except on E: Exception do ShowMessage('xGetObjsProductPlanList Äõ¸® ½ÇÇà ¿À·ù: ' + E.Message); end; if FqPlanList <> nil then xFreeAllList(FqPlanList); FqPlanList := LoadFromQueryToProductPlan(AQuery); end; function TOrderMst.xGetObjsSubOrderList(AQuery: TFDQuery): TList; var sql: string; begin Result := nil; sql := 'SELECT obj2.* FROM "OrderMst"obj0, "OrderMstSubR"obj1, "SubOrder"obj2'; sql := sql + ' WHERE obj0."IsValid"=' + xAddSqlMark('t'); sql := sql + ' AND obj0."OBID"=' + xAddSqlMark(OBID); sql := sql + ' AND obj1."IsValid"=' + xAddSqlMark('t'); sql := sql + ' AND obj1."LOBID"=obj0."OBID"'; sql := sql + ' AND obj2."IsValid"=' + xAddSqlMark('t'); sql := sql + ' AND obj2."OBID"=obj1."ROBID"'; try AQuery.Close; AQuery.SQL.Text := sql; AQuery.Open; except on E: Exception do ShowMessage('xGetObjsSubOrderList Äõ¸® ½ÇÇà ¿À·ù: ' + E.Message); end; Result := LoadFromQueryToSubOrder(AQuery); end; class function TOrderMst.xGetOrderMstLastNumber(AQuery: TFDQuery; column: string): string; var sql: string; resStrs: TStrings; begin Result := ''; sql := 'SELECT COUNT(*) FROM "OrderMst"'; try AQuery.Close; AQuery.SQL.Text := sql; AQuery.Open; except on E: Exception do ShowMessage('xGetOrderMstLastNumber Äõ¸® ½ÇÇà ¿À·ù: ' + E.Message); end; resStrs := LoadFromStringQuery(AQuery, column); if resStrs.Count > 0 then begin Result := resStrs.Strings[0]; end; resStrs.Free; end; class function TOrderMst.xGetStrsCustNameBySumQty(AQuery: TFDQuery; cust, stDate, enDate: string): TStrings; var sql: string; columns: TStrings; begin sql := 'SELECT "CustName" AS name,'; sql := sql + ' TO_CHAR(DATE_TRUNC(' + xAddSqlMark('month') + ', "OrdDate"), ' + xAddSqlMark('YYYY-MM') + ') AS mon,'; // sql := sql + ' TO_CHAR("OrdDate", ' + xAddSqlMark('FMMon') + ') || ' + xAddSqlMark('¿ù') + ' AS montext,'; // ¿ùÇ¥½Ã: date_trunc °á°ú¸¸ »ç¿ëÇØ ÆÄ»ý (GROUP BY ÃæÁ·) sql := sql + ' TO_CHAR(DATE_TRUNC(' + xAddSqlMark('month') + ', "OrdDate"), ' + xAddSqlMark('FMMM') + ') || ' + xAddSqlMark('¿ù') + ' AS montext,'; sql := sql + ' SUM("Amount") AS sumqty'; sql := sql + ' FROM "OrderMst"'; sql := sql + ' WHERE "IsValid" =' + xAddSqlMark('t'); if Length(cust) > 0 then sql := sql + ' AND "CustName" =' + xAddSqlMark(cust); if Length(Trim(stDate)) > 0 then begin sql := sql + ' AND "OrdDate">=' + xAddSqlMark(stDate); sql := sql + ' AND "OrdDate"<=' + xAddSqlMark(enDate); end; sql := sql + ' GROUP BY "CustName", DATE_TRUNC(' + xAddSqlMark('month') + ', "OrdDate")'; // sql := sql + ' DATE_TRUNC(' + xAddSqlMark('month') + ', "OrdDate")'; sql := sql + ' ORDER BY "CustName", mon'; try AQuery.Close; AQuery.SQL.Text := sql; AQuery.Open; except on E: Exception do ShowMessage('xGetStrsCustNameBySumQty Äõ¸® ½ÇÇà ¿À·ù: ' + E.Message); end; columns := TStringList.Create; columns.Add('name'); columns.Add('mon'); columns.Add('montext'); columns.Add('sumqty'); Result := LoadFromStringsQuery(AQuery, columns); columns.Free; end; class function TOrderMst.xGetStrsDistinctCustName(AQuery: TFDQuery): TStrings; var sql, column: string; begin Result := nil; sql := 'SELECT DISTINCT "CustName" FROM "OrderMst"'; sql := sql + ' WHERE "IsValid"=' + xAddSqlMark('t'); try AQuery.Close; AQuery.SQL.Text := sql; AQuery.Open; except on E: Exception do ShowMessage('xGetStrsDistinctCustName Äõ¸® ½ÇÇà ¿À·ù: ' + E.Message); end; column := 'CustName'; Result := LoadFromStringQuery(AQuery, column); end; class function TOrderMst.xGetStrSqlOrderToSubList(AQuery: TFDQuery; cust, status, stDate, enDate: string): TList; var sql: string; begin Result := nil; sql := 'SELECT obj0.*, obj2.* FROM "OrderMst"obj0, "OrderMstSubR"obj1, "SubOrder"obj2'; sql := sql + ' WHERE obj0."IsValid"=' + xAddSqlMark('t'); if Length(Trim(cust)) > 0 then sql := sql + ' AND obj0."CustName"=' + xAddSqlMark(cust); if Length(Trim(status)) > 0 then sql := sql + ' AND obj0."LcStatus"=' + xAddSqlMark(status); if Length(Trim(stDate)) > 0 then begin sql := sql + ' AND obj0."OrdDate">=' + xAddSqlMark(stDate); sql := sql + ' AND obj0."OrdDate"<=' + xAddSqlMark(enDate); end; sql := sql + ' AND obj1."IsValid"=' + xAddSqlMark('t'); sql := sql + ' AND obj1."LOBID"=obj0."OBID"'; sql := sql + ' AND obj2."IsValid"=' + xAddSqlMark('t'); sql := sql + ' AND obj2."OBID"=obj1."ROBID"'; sql := sql + ' ORDER BY obj0."OrdDate" DESC'; try AQuery.Close; AQuery.SQL.Text := sql; AQuery.Open; except on E: Exception do ShowMessage('xGetStrSqlOrderToSubList Äõ¸® ½ÇÇà ¿À·ù: ' + E.Message); end; Result := LoadFromQuery(AQuery); end; end.