| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454 |
- unit StageLeafXmjGlDm;
- interface
- uses
- SysUtils, Classes, sdDB, sdProvider, ADODB, mDataRecord, CalcDecimal;
- type
- TStageLeafXmjGlData = class(TDataModule)
- sdpStageLeafXmjGl: TsdADOProvider;
- sddStageLeafXmjGl: TsdDataSet;
- procedure sddStageLeafXmjGlGetRecordClass(
- var ARecordClass: TsdRecordClass);
- procedure sddStageLeafXmjGlAfterValueChanged(AValue: TsdValue);
- private
- FPhaseData: TObject;
- procedure SaveCurStageData;
- procedure BeforeBatchOperation;
- procedure AfterBatchOperation;
- procedure UpdateEndTotalPrice(ARec: TStageLeafXmjGlRecord);
- procedure UpdateEndQuantity(ARec: TStageLeafXmjGlRecord);
- procedure CalculateQuantity(ARec: TStageLeafXmjGlRecord);
- procedure UpdateEndPALRela(ARec:TStageLeafXmjGlRecord);
- procedure CalculatePALRela(ARec:TStageLeafXmjGlRecord; AProjGLRec: TProjectGLRecord);
- function GetDecimal: TCalcDecimal;
- function GetActive: Boolean;
- public
- constructor Create(APhaseData: TObject);
- destructor Destroy; override;
- procedure Open(AConnection: TADOConnection);
- procedure Save;
- procedure CopyPrePhaseData;
- procedure LoadCurStageData;
- function StageLeafXmjGlRecord(AID: Integer): TStageLeafXmjGlRecord;
- procedure DeleteLeafXmjGLRecord(AID: Integer);
- procedure Calculate(AID: Integer);
- // 调整工料价格后,需计算项
- procedure CalculatePriceRela(AGLID: Integer);
- property Active: Boolean read GetActive;
- property Decimal: TCalcDecimal read GetDecimal;
- end;
- implementation
- uses
- PhaseData, ProjectData, UtilMethods, LeafXmjGlDm, ProjectGLDm, StrUtils,
- DetailGLDm, BillsTree, BillsMeasureDm;
- {$R *.dfm}
- { TStageLeafXmjGlData }
- procedure TStageLeafXmjGlData.AfterBatchOperation;
- begin
- sddStageLeafXmjGl.EndUpdate;
- sddStageLeafXmjGl.EnableControls;
- sddStageLeafXmjGl.AfterValueChanged := sddStageLeafXmjGlAfterValueChanged;
- end;
- procedure TStageLeafXmjGlData.BeforeBatchOperation;
- begin
- sddStageLeafXmjGl.DisableControls;
- sddStageLeafXmjGl.BeginUpdate;
- sddStageLeafXmjGl.AfterValueChanged := nil;
- end;
- procedure TStageLeafXmjGlData.Calculate(AID: Integer);
- var
- Rec: TStageLeafXmjGlRecord;
- ProjGLRec: TProjectGLRecord;
- fValue: Double;
- begin
- Rec := StageLeafXmjGlRecord(AID);
- CalculateQuantity(Rec);
- with TProjectData(TPhaseData(FPhaseData).ProjectData) do
- ProjGLRec := ProjectGLData.ProjectGLRec(Rec.GLID);
- // 计算调差金额
- fValue := Decimal.TotalPrice.RoundTo(Rec.Quantity.AsFloat * ProjGLRec.ValidDeltaPrice.AsFloat);
- Rec.SetFloatValue(Rec.TotalPrice, fValue);
- UpdateEndTotalPrice(Rec);
- // 计算本期实耗分析相关
- CalculatePALRela(Rec, ProjGLRec);
- end;
- procedure TStageLeafXmjGlData.CalculatePriceRela(AGLID: Integer);
- var
- i: Integer;
- Rec: TStageLeafXmjGlRecord;
- ProjGLRec: TProjectGLRecord;
- fValue: Double;
- begin
- with TProjectData(TPhaseData(FPhaseData).ProjectData) do
- ProjGLRec := ProjectGLData.ProjectGLRec(AGLID);
- for i := 0 to sddStageLeafXmjGl.RecordCount - 1 do
- begin
- Rec := TStageLeafXmjGlRecord(sddStageLeafXmjGl.Records[i]);
- if Rec.GLID = AGLID then
- begin
- // 计算调差金额
- fValue := Decimal.TotalPrice.RoundTo(Rec.Quantity.AsFloat * ProjGLRec.ValidDeltaPrice.AsFloat);
- Rec.SetFloatValue(Rec.TotalPrice, fValue);
- UpdateEndTotalPrice(Rec);
- // 计算本期实耗分析相关
- CalculatePALRela(Rec, ProjGLRec);
- end;
- end;
- end;
- procedure TStageLeafXmjGlData.CalculateQuantity(ARec: TStageLeafXmjGlRecord);
- var
- vDetails: TList;
- fQuantity: Double;
- i: Integer;
- GLRec: TDetailGLRecord;
- vNode: TMeasureBillsIDTreeNode;
- begin
- vDetails := TList.Create;
- try
- with TProjectData(TPhaseData(FPhaseData).ProjectData).DetailGLData do
- LoadXmjDetailGLs(ARec.XmjID, ARec.GLID, vDetails);
- fQuantity := 0;
- for i := 0 to vDetails.Count - 1 do
- begin
- GLRec := TDetailGLRecord(vDetails.Items[i]);
- with TProjectData(TPhaseData(FPhaseData).ProjectData).BillsMeasureData do
- vNode := TMeasureBillsIDTreeNode(BillsMeasureTree.FindNode(GLRec.BillsID.AsInteger));
- if Assigned(vNode.StageRec) then
- fQuantity := fQuantity + Decimal.Quantity.RoundTo(vNode.StageRec.GatherQuantity.AsFloat * GLRec.Quantity.AsFloat);
- end;
- ARec.SetFloatValue(ARec.Quantity, fQuantity);
- UpdateEndQuantity(ARec);
- finally
- vDetails.Free;
- end;
- end;
- constructor TStageLeafXmjGlData.Create(APhaseData: TObject);
- begin
- inherited Create(nil);
- FPhaseData := APhaseData;
- end;
- destructor TStageLeafXmjGlData.Destroy;
- begin
- inherited;
- end;
- function TStageLeafXmjGlData.GetDecimal: TCalcDecimal;
- begin
- Result := TProjectData(TPhaseData(FPhaseData).ProjectData).ProjProperties.DecimalManager.Common;
- end;
- procedure TStageLeafXmjGlData.LoadCurStageData;
- const
- sSelectSql = 'Select * From PhaseLeafXmjGL Where StageID = %d';
- var
- vQuery: TADOQuery;
- procedure LoadData;
- var
- iRec: Integer;
- Rec: TStageLeafXmjGlRecord;
- begin
- for iRec := 0 to sddStageLeafXmjGl.RecordCount - 1 do
- begin
- Rec := TStageLeafXmjGlRecord(sddStageLeafXmjGl.Records[iRec]);
- if vQuery.Active and vQuery.Locate('ID', Rec.ID.AsInteger, []) then
- begin
- Rec.SetFloatValue(Rec.Quantity, vQuery.FieldByName('Quantity').AsFloat);
- Rec.SetFloatValue(Rec.TotalPrice, vQuery.FieldByName('TotalPrice').AsFloat);
- Rec.SetFloatValue(Rec.UsedQuantity, vQuery.FieldByName('UsedQuantity').AsFloat);
- Rec.SetFloatValue(Rec.UsedTotalPrice, vQuery.FieldByName('UsedTotalPrice').AsFloat);
- Rec.SetFloatValue(Rec.PAL_UsedQuantity, vQuery.FieldByName('PAL_UsedQuantity').AsFloat);
- Rec.SetFloatValue(Rec.PAL_UsedTotalPrice, vQuery.FieldByName('PAL_UsedTotalPrice').AsFloat);
- Rec.SetFloatValue(Rec.PAL_DeltaPrice, vQuery.FieldByName('PAL_DeltaPrice').AsFloat);
- Rec.SetFloatValue(Rec.PAL_Total, vQuery.FieldByName('PAL_Total').AsFloat);
- Rec.SetFloatValue(Rec.EndQuantity, Decimal.Quantity.RoundTo(Rec.PreQuantity.AsFloat + Rec.Quantity.AsFloat));
- Rec.SetFloatValue(Rec.EndTotalPrice, Decimal.TotalPrice.RoundTo(Rec.PreTotalPrice.AsFloat + Rec.TotalPrice.AsFloat));
- Rec.SetFloatValue(Rec.EndUsedQuantity, Decimal.Quantity.RoundTo(Rec.PreUsedQuantity.AsFloat + Rec.UsedQuantity.AsFloat));
- Rec.SetFloatValue(Rec.EndUsedTotalPrice, Decimal.TotalPrice.RoundTo(Rec.PreUsedTotalPrice.AsFloat + Rec.UsedTotalPrice.AsFloat));
- Rec.SetFloatValue(Rec.EndPAL_UsedQuantity, Decimal.Quantity.RoundTo(Rec.PrePAL_UsedQuantity.AsFloat + Rec.PAL_UsedQuantity.AsFloat));
- Rec.SetFloatValue(Rec.EndPAL_UsedTotalPrice, Decimal.TotalPrice.RoundTo(Rec.PrePAL_UsedTotalPrice.AsFloat + Rec.PAL_UsedTotalPrice.AsFloat));
- Rec.SetFloatValue(Rec.EndPAL_DeltaPrice, Decimal.TotalPrice.RoundTo(Rec.PrePAL_DeltaPrice.AsFloat + Rec.PAL_DeltaPrice.AsFloat));
- Rec.SetFloatValue(Rec.EndPAL_Total, Decimal.TotalPrice.RoundTo(Rec.PrePAL_Total.AsFloat + Rec.PAL_Total.AsFloat));
- end
- else
- begin
- Rec.SetFloatValue(Rec.Quantity, 0);
- Rec.SetFloatValue(Rec.TotalPrice, 0);
- Rec.SetFloatValue(Rec.UsedQuantity, 0);
- Rec.SetFloatValue(Rec.UsedTotalPrice, 0);
- Rec.SetFloatValue(Rec.PAL_UsedQuantity, 0);
- Rec.SetFloatValue(Rec.PAL_UsedTotalPrice, 0);
- Rec.SetFloatValue(Rec.PAL_DeltaPrice, 0);
- Rec.SetFloatValue(Rec.PAL_Total, 0);
- Rec.SetFloatValue(Rec.EndQuantity, Rec.PreQuantity.AsFloat);
- Rec.SetFloatValue(Rec.EndTotalPrice, Rec.PreTotalPrice.AsFloat);
- Rec.SetFloatValue(Rec.EndUsedQuantity, Rec.PreUsedQuantity.AsFloat);
- Rec.SetFloatValue(Rec.EndUsedTotalPrice, Rec.PreUsedTotalPrice.AsFloat);
- Rec.SetFloatValue(Rec.EndPAL_UsedQuantity, Rec.PrePAL_UsedQuantity.AsFloat);
- Rec.SetFloatValue(Rec.EndPAL_UsedTotalPrice, Rec.PrePAL_UsedTotalPrice.AsFloat);
- Rec.SetFloatValue(Rec.EndPAL_DeltaPrice, Rec.PrePAL_DeltaPrice.AsFloat);
- Rec.SetFloatValue(Rec.EndPAL_Total, Rec.PrePAL_Total.AsFloat);
- end;
- end;
- end;
- begin
- if not sddStageLeafXmjGl.Active then Exit;
- BeforeBatchOperation;
- vQuery := TADOQuery.Create(nil);
- try
- vQuery.Connection := sdpStageLeafXmjGl.Connection;
- vQuery.SQL.Clear;
- vQuery.SQL.Add(Format(sSelectSql, [TPhaseData(FPhaseData).StageIndex]));
- vQuery.Open;
- LoadData;
- finally
- vQuery.Free;
- AfterBatchOperation;
- end;
- end;
- procedure TStageLeafXmjGlData.Open(AConnection: TADOConnection);
- begin
- sdpStageLeafXmjGl.Connection := AConnection;
- sddStageLeafXmjGl.Open;
- if not Assigned(sddStageLeafXmjGl.FindIndex('idxID')) then
- sddStageLeafXmjGl.AddIndex('idxID', 'ID');
- LoadCurStageData;
- end;
- procedure TStageLeafXmjGlData.Save;
- begin
- if sddStageLeafXmjGl.Active then
- begin
- sddStageLeafXmjGl.Save;
- if not TPhaseData(FPhaseData).StageDataReadOnly then
- SaveCurStageData;
- end;
- end;
- procedure TStageLeafXmjGlData.SaveCurStageData;
- const
- sDeleteSql = 'Delete From PhaseLeafXmjGL where (StageID = %d)';
- sCopySql = 'Insert Into PhaseLeafXmjGL'+
- ' Select ID, %d As StageID, Quantity, TotalPrice, UsedQuantity, UsedTotalPrice,'+
- ' PAL_UsedQuantity, PAL_UsedTotalPrice, PAL_DeltaPrice, PAL_Total'+
- ' From StageLeafXmjGL' +
- ' Where (Quantity <> 0) or (UsedQuantity <> 0)';
- begin
- if TPhaseData(FPhaseData).StageDataReadOnly then Exit;
- ExecuteSql(sdpStageLeafXmjGl.Connection, Format(sDeleteSql, [TPhaseData(FPhaseData).StageIndex]));
- ExecuteSql(sdpStageLeafXmjGl.Connection, Format(sCopySql, [TPhaseData(FPhaseData).StageIndex]));
- // 不要问我为什么,不写下面这个,上面那句不执行
- ExecuteSql(sdpStageLeafXmjGl.Connection, Format(sDeleteSql, [-1]));
- ExecuteSql(sdpStageLeafXmjGl.Connection, Format(sCopySql, [-1]));
- end;
- procedure TStageLeafXmjGlData.sddStageLeafXmjGlGetRecordClass(
- var ARecordClass: TsdRecordClass);
- begin
- ARecordClass := TStageLeafXmjGlRecord;
- end;
- function TStageLeafXmjGlData.StageLeafXmjGlRecord(
- AID: Integer): TStageLeafXmjGlRecord;
- begin
- Result := TStageLeafXmjGlRecord(sddStageLeafXmjGl.FindKey('idxID', AID));
- if not Assigned(Result) then
- begin
- Result := TStageLeafXmjGlRecord(sddStageLeafXmjGl.Add);
- Result.ID.AsInteger := AID;
- end;
- end;
- procedure TStageLeafXmjGlData.sddStageLeafXmjGlAfterValueChanged(
- AValue: TsdValue);
- var
- Rec: TStageLeafXmjGlRecord;
- ProjGLRec: TProjectGLRecord;
- begin
- if SameText(AValue.FieldName, 'UsedQuantity') then
- begin
- Rec := TStageLeafXmjGlRecord(AValue.Owner);
- with TProjectData(TPhaseData(FPhaseData).ProjectData) do
- begin
- ProjGLRec := ProjectGLData.ProjectGLRec(Rec.GLID);
- CalculatePALRela(Rec, ProjGLRec);
- ProjectGLData.CalculatePALRela(ProjGLRec);
- PhaseData.StageData.CalculateMaterialNode;
- end;
- end;
- end;
- procedure TStageLeafXmjGlData.CalculatePALRela(
- ARec: TStageLeafXmjGlRecord; AProjGLRec: TProjectGLRecord);
- var
- fValue: Double;
- begin
- // 计算 材料实耗金额
- fValue := Decimal.TotalPrice.RoundTo(ARec.UsedQuantity.AsFloat * AProjGLRec.InfoPrice.AsFloat);
- ARec.SetFloatValue(ARec.UsedTotalPrice, fValue);
- // 计算 数量差
- fValue := Decimal.Quantity.RoundTo(ARec.Quantity.AsFloat - ARec.UsedQuantity.AsFloat);
- ARec.SetFloatValue(ARec.PAL_UsedQuantity, fValue);
- // 计算 数量差金额
- fValue := Decimal.Quantity.RoundTo(ARec.PAL_UsedQuantity.AsFloat * AProjGLRec.BasePrice.AsFloat);
- ARec.SetFloatValue(ARec.PAL_UsedTotalPrice, fValue);
- // 计算 实耗价差金额
- fValue := Decimal.TotalPrice.RoundTo( - ARec.UsedQuantity.AsFloat * AProjGLRec.DeltaPrice.AsFloat);
- ARec.SetFloatValue(ARec.PAL_DeltaPrice, fValue);
- // 计算 节余金额
- fValue := Decimal.TotalPrice.RoundTo(AProjGLRec.BasePrice.AsFloat*ARec.Quantity.AsFloat - AProjGLRec.InfoPrice.AsFloat*ARec.UsedQuantity.AsFloat);
- ARec.SetFloatValue(ARec.PAL_Total, fValue);
- UpdateEndPALRela(ARec);
- end;
- procedure TStageLeafXmjGlData.DeleteLeafXmjGLRecord(AID: Integer);
- var
- Rec: TsdDataRecord;
- begin
- Rec := sddStageLeafXmjGl.FindKey('idxID', AID);
- sddStageLeafXmjGl.Remove(Rec);
- end;
- procedure TStageLeafXmjGlData.UpdateEndQuantity(
- ARec: TStageLeafXmjGlRecord);
- var
- fQuantity: Double;
- AddRec: TLeafXmjGlRecord;
- begin
- fQuantity := Decimal.Quantity.RoundTo(ARec.PreQuantity.AsFloat + ARec.Quantity.AsFloat);
- ARec.SetFloatValue(ARec.EndQuantity, fQuantity);
- if Assigned(ARec.MainRec) then
- begin
- AddRec := TLeafXmjGlRecord(ARec.MainRec);
- AddRec.SetFloatValue(AddRec.AddQuantity, fQuantity);
- end;
- end;
- procedure TStageLeafXmjGlData.UpdateEndPALRela(
- ARec: TStageLeafXmjGlRecord);
- var
- fValue: Double;
- AddRec: TLeafXmjGlRecord;
- begin
- // 实耗数量
- fValue := Decimal.Quantity.RoundTo(ARec.PreUsedQuantity.AsFloat + ARec.UsedQuantity.AsFloat);
- ARec.SetFloatValue(ARec.EndUsedQuantity, fValue);
- // 实耗金额
- fValue := Decimal.TotalPrice.RoundTo(ARec.PreUsedTotalPrice.AsFloat + ARec.UsedTotalPrice.AsFloat);
- ARec.SetFloatValue(ARec.EndUsedTotalPrice, fValue);
- // 数量差
- fValue := Decimal.Quantity.RoundTo(ARec.PrePAL_UsedQuantity.AsFloat + ARec.PAL_UsedQuantity.AsFloat);
- ARec.SetFloatValue(ARec.EndPAL_UsedQuantity, fValue);
- // 数量差金额
- fValue := Decimal.TotalPrice.RoundTo(ARec.PrePAL_UsedTotalPrice.AsFloat + ARec.PAL_UsedTotalPrice.AsFloat);
- ARec.SetFloatValue(ARec.EndPAL_UsedTotalPrice, fValue);
- // 实耗价差金额
- fValue := Decimal.TotalPrice.RoundTo(ARec.PrePAL_DeltaPrice.AsFloat + ARec.PAL_DeltaPrice.AsFloat);
- ARec.SetFloatValue(ARec.EndPAL_DeltaPrice, fValue);
- // 节余金额
- fValue := Decimal.TotalPrice.RoundTo(ARec.PrePAL_Total.AsFloat + ARec.PAL_Total.AsFloat);
- ARec.SetFloatValue(ARec.EndPAL_Total, fValue);
- if Assigned(ARec.MainRec) then
- begin
- AddRec := TLeafXmjGlRecord(ARec.MainRec);
- AddRec.SetFloatValue(AddRec.AddUsedQuantity, ARec.EndUsedQuantity.AsFloat);
- AddRec.SetFloatValue(AddRec.AddUsedTotalPrice, ARec.EndUsedTotalPrice.AsFloat);
- AddRec.SetFloatValue(AddRec.AddPAL_UsedQuantity, ARec.EndPAL_UsedQuantity.AsFloat);
- AddRec.SetFloatValue(AddRec.AddPAL_UsedTotalPrice, ARec.EndPAL_UsedTotalPrice.AsFloat);
- AddRec.SetFloatValue(AddRec.AddPAL_DeltaPrice, ARec.EndPAL_DeltaPrice.AsFloat);
- AddRec.SetFloatValue(AddRec.AddPAL_Total, ARec.EndPAL_Total.AsFloat);
- end;
- end;
- procedure TStageLeafXmjGlData.UpdateEndTotalPrice(
- ARec: TStageLeafXmjGlRecord);
- var
- fValue: Double;
- AddRec: TLeafXmjGlRecord;
- begin
- fValue := Decimal.TotalPrice.RoundTo(ARec.PreTotalPrice.AsFloat + ARec.TotalPrice.AsFloat);
- ARec.SetFloatValue(ARec.EndTotalPrice, fValue);
- if Assigned(ARec.MainRec) then
- begin
- AddRec := TLeafXmjGlRecord(ARec.MainRec);
- AddRec.SetFloatValue(AddRec.AddTotalPrice, fValue);
- end;
- end;
- procedure TStageLeafXmjGlData.CopyPrePhaseData;
- var
- iRecord: Integer;
- Rec: TLeafXmjGlRecord;
- NewRec: TStageLeafXmjGlRecord;
- begin
- BeforeBatchOperation;
- try
- with TProjectData(TPhaseData(FPhaseData).ProjectData).LeafXmjGlData do
- for iRecord := 0 to sddLeafXmjGL.RecordCount - 1 do
- begin
- Rec := TLeafXmjGlRecord(sddLeafXmjGL.Records[iRecord]);
- NewRec := TStageLeafXmjGlRecord(Rec.StageRec);
- NewRec.ID.AsInteger := Rec.ID.AsInteger;
- NewRec.PreQuantity.AsFloat := Rec.AddQuantity.AsFloat;
- NewRec.PreTotalPrice.AsFloat := Rec.AddQuantity.AsFloat;
- NewRec.PreUsedQuantity.AsFloat := Rec.AddUsedQuantity.AsFloat;
- NewRec.PreUsedTotalPrice.AsFloat := Rec.AddUsedTotalPrice.AsFloat;
- NewRec.PrePAL_UsedQuantity.AsFloat := Rec.AddPAL_UsedQuantity.AsFloat;
- NewRec.PrePAL_UsedTotalPrice.AsFloat := Rec.AddPAL_UsedTotalPrice.AsFloat;
- NewRec.PrePAL_DeltaPrice.AsFloat := Rec.AddPAL_DeltaPrice.AsFloat;
- NewRec.PrePAL_Total.AsFloat := Rec.AddPAL_Total.AsFloat;
- NewRec.EndQuantity.AsFloat := Rec.AddQuantity.AsFloat;
- NewRec.EndTotalPrice.AsFloat := Rec.AddQuantity.AsFloat;
- NewRec.EndUsedQuantity.AsFloat := Rec.AddUsedQuantity.AsFloat;
- NewRec.EndUsedTotalPrice.AsFloat := Rec.AddUsedTotalPrice.AsFloat;
- NewRec.EndPAL_UsedQuantity.AsFloat := Rec.AddPAL_UsedQuantity.AsFloat;
- NewRec.EndPAL_UsedTotalPrice.AsFloat := Rec.AddPAL_UsedTotalPrice.AsFloat;
- NewRec.EndPAL_DeltaPrice.AsFloat := Rec.AddPAL_DeltaPrice.AsFloat;
- NewRec.EndPAL_Total.AsFloat := Rec.AddPAL_Total.AsFloat;
- end;
- finally
- AfterBatchOperation;
- end;
- end;
- function TStageLeafXmjGlData.GetActive: Boolean;
- begin
- Result := sddStageLeafXmjGl.Active;
- end;
- end.
|