123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846 |
- unit BGLDm;
- interface
- uses
- SysUtils, Classes, DB, DBClient, Provider, ADODB, sdIDTree,
- sdDB;
- type
- TAfterCurrentBGLChanged = procedure of object;
- TBGLSelectInfo = class(TObject)
- private
- FB_Code: string;
- FName: string;
- FUnits: string;
- FPrice: Double;
- FIsOrg: Boolean;
- FTotalNum: Double;
- FNums: TStrings;
- FCodes: TStrings;
- procedure SetMergedCode(const Value: string);
- procedure SetMergedNum(const Value: string);
- function GetCount: Integer;
- function GetMergedCode: string;
- function GetMergedNum: string;
- public
- constructor Create(ARec: TsdDataRecord; ATotalNum: Double; AIsOrg: Boolean);
- destructor Destroy; override;
- procedure Clear;
- property MergedCode: string read GetMergedCode write SetMergedCode;
- property MergedNum: string read GetMergedNum write SetMergedNum;
- property Codes: TStrings read FCodes;
- property Nums: TStrings read FNums;
- property Count: Integer read GetCount;
- property TotalNum: Double read FTotalNum write FTotalNum;
- property IsOrg: Boolean read FIsOrg;
- property B_Code: string read FB_Code;
- property Name: string read FName;
- property Units: string read FUnits;
- property Price: Double read FPrice;
- end;
- TBGLData = class(TDataModule)
- atBGL: TADOTable;
- dspBGL: TDataSetProvider;
- cdsBGL: TClientDataSet;
- cdsBGLID: TIntegerField;
- cdsBGLCode: TWideStringField;
- cdsBGLName: TWideStringField;
- cdsBGLTotalPrice: TFloatField;
- cdsBGLPos_Reason: TMemoField;
- cdsBGLDirection: TMemoField;
- cdsBGLDrawingCode: TWideStringField;
- cdsBGLApprovalCode: TWideStringField;
- cdsBGLCreatePhaseID: TIntegerField;
- cdsBGLExecutionRate: TFloatField;
- cdsBGLBGLType: TWideStringField;
- cdsBGLView: TClientDataSet;
- cdsBGLViewID: TIntegerField;
- cdsBGLViewCode: TWideStringField;
- cdsBGLViewName: TWideStringField;
- cdsBGLViewTotalPrice: TFloatField;
- cdsBGLViewPos_Reason: TMemoField;
- cdsBGLViewDirection: TMemoField;
- cdsBGLViewDrawingCode: TWideStringField;
- cdsBGLViewApprovalCode: TWideStringField;
- cdsBGLViewCreatePhaseID: TIntegerField;
- cdsBGLViewExecutionRate: TFloatField;
- cdsBGLViewBGLType: TWideStringField;
- dsBGL: TDataSource;
- atBGBills: TADOTable;
- dspBGBills: TDataSetProvider;
- cdsBGBills: TClientDataSet;
- cdsBGBillsID: TIntegerField;
- cdsBGBillsBGID: TIntegerField;
- cdsBGBillsB_Code: TWideStringField;
- cdsBGBillsName: TWideStringField;
- cdsBGBillsUnits: TWideStringField;
- cdsBGBillsPrice: TFloatField;
- cdsBGBillsQuantity: TFloatField;
- cdsBGBillsTotalPrice: TFloatField;
- cdsBGBillsUsedQuantity: TFloatField;
-
- cdsBGBillsView: TClientDataSet;
- cdsBGBillsViewID: TIntegerField;
- cdsBGBillsViewBGID: TIntegerField;
- cdsBGBillsViewB_Code: TWideStringField;
- cdsBGBillsViewName: TWideStringField;
- cdsBGBillsViewUnits: TWideStringField;
- cdsBGBillsViewPrice: TFloatField;
- cdsBGBillsViewQuantity: TFloatField;
- cdsBGBillsViewTotalPrice: TFloatField;
- cdsBGBillsViewUsedQuantity: TFloatField;
- cdsBGLIsCloud: TBooleanField;
- cdsBGLWebID: TIntegerField;
- cdsBGLViewIsCloud: TBooleanField;
- cdsBGLViewWebID: TIntegerField;
- procedure cdsBGBillsViewAfterInsert(DataSet: TDataSet);
- procedure cdsBGBillsViewAfterPost(DataSet: TDataSet);
- procedure cdsBGBillsViewQuantityChange(Sender: TField);
- procedure cdsBGBillsViewBeforePost(DataSet: TDataSet);
- procedure cdsBGLViewBeforePost(DataSet: TDataSet);
- procedure cdsBGLViewBeforeDelete(DataSet: TDataSet);
- procedure cdsBGBillsViewBeforeDelete(DataSet: TDataSet);
- procedure cdsBGBillsViewAfterDelete(DataSet: TDataSet);
- procedure cdsBGLViewNewRecord(DataSet: TDataSet);
- procedure cdsBGBillsViewQuantitySetText(Sender: TField;
- const Text: String);
- procedure cdsBGBillsViewPriceSetText(Sender: TField;
- const Text: String);
- procedure cdsBGLViewCodeChange(Sender: TField);
- procedure cdsBGLViewAfterScroll(DataSet: TDataSet);
- private
- FProjectData: TObject;
- FAfterCurrentBGLChanged: TAfterCurrentBGLChanged;
- procedure GatherBGLTotalPrice(ABGLID: Integer);
- procedure UpdateBGLTotalPrice(ABGLID: Integer; ADiffer: Double);
- procedure UpdateBGLExecutionRate(ABGLID: Integer);
- procedure ApplyBGL(ABGLInfo: TBGLSelectInfo); overload;
- function DeleteWeb(AWebID: Integer): Boolean;
- procedure DeleteBGBills(ABGID: Integer);
- function CheckSameB_Code(ABGID: Integer; const AB_Code: string): Boolean;
- function CheckBGLUsed(ABGID: Integer): Boolean;
- function LocateBGL(const ACode: string): Boolean;
- function LocateBGBills(ABGID: Integer; const AB_Code, AName, AUnit: string; APrice: Double): Boolean;
- function GetTotalPrice: Double;
- function GetEndTotalPrice(AEndPhase: Integer): Double;
- public
- constructor Create(AProjectData: TObject);
- destructor Destroy; override;
- procedure Open(AConnection: TADOConnection);
- procedure Close;
- procedure Save;
- function GetBGLCanEdit(ASerialNo: Integer): Boolean;
- function AllBGLTotalPrice: Double;
- function AllCloudBGLWebID: string;
- procedure LoadCloudBGL(const ABGLs: string);
- procedure AddBGL(const sCode: string);
- procedure ApplyBGL(AOrgBGL, ANewBGL: TBGLSelectInfo); overload;
- procedure BatchWritePos_Reason;
- property ProjectData: TObject read FProjectData;
- property TotalPrice: Double read GetTotalPrice;
- property EndTotalPrice[AEndPhase: Integer]: Double read GetEndTotalPrice;
- property AfterCurrentBGLChanged: TAfterCurrentBGLChanged read FAfterCurrentBGLChanged write FAfterCurrentBGLChanged;
- end;
- implementation
- uses
- ZhAPI, Math, ProjectData, BillsDm, Variants, UtilMethods, superobject,
- PHPWebDm, Forms, Controls;
- {$R *.dfm}
- { TBGLSelectInfo }
- procedure TBGLSelectInfo.Clear;
- begin
- FCodes.Clear;
- FNums.Clear;
- end;
- constructor TBGLSelectInfo.Create(ARec: TsdDataRecord;
- ATotalNum: Double; AIsOrg: Boolean);
- begin
- FB_Code := ARec.ValueByName('B_Code').AsString;
- FName := ARec.ValueByName('Name').AsString;
- FUnits := ARec.ValueByName('Units').AsString;
- FPrice := ARec.ValueByName('Price').AsFloat;
- FTotalNum := ATotalNum;
- FIsOrg := AIsOrg;
- FCodes := TStringList.Create;
- FCodes.Delimiter := ';';
- FNums := TStringList.Create;
- FNums.Delimiter := ';';
- end;
- destructor TBGLSelectInfo.Destroy;
- begin
- FNums.Free;
- FCodes.Free;
- inherited;
- end;
- function TBGLSelectInfo.GetCount: Integer;
- begin
- Result := Min(FCodes.Count, FNums.Count);
- end;
- function TBGLSelectInfo.GetMergedCode: string;
- begin
- Result := FCodes.DelimitedText;
- end;
- function TBGLSelectInfo.GetMergedNum: string;
- begin
- Result := FNums.DelimitedText;
- end;
- procedure TBGLSelectInfo.SetMergedCode(const Value: string);
- begin
- if Value <> '' then
- FCodes.DelimitedText := Value
- else
- FCodes.Clear;
- end;
- procedure TBGLSelectInfo.SetMergedNum(const Value: string);
- begin
- if Value <> '' then
- FNums.DelimitedText := Value
- else
- FNums.Clear;
- end;
- { TBGLData }
- constructor TBGLData.Create(AProjectData: TObject);
- begin
- inherited Create(nil);
- FProjectData := AProjectData;
- end;
- destructor TBGLData.Destroy;
- begin
- inherited;
- end;
- procedure TBGLData.Open(AConnection: TADOConnection);
- begin
- atBGL.Connection := AConnection;
- cdsBGL.Open;
- cdsBGL.AddIndex('idxID', 'ID', []);
- cdsBGL.AddIndex('idxCode', 'Code', []);
- cdsBGL.IndexName := 'idxID';
- cdsBGLView.CloneCursor(cdsBGL, True);
- atBGBills.Connection := AConnection;
- cdsBGBills.Open;
- cdsBGBillsView.CloneCursor(cdsBGBills, True);
- cdsBGBills.IndexFieldNames := 'ID';
- cdsBGBillsView.MasterSource := dsBGL;
- cdsBGBillsView.MasterFields := 'ID';
- cdsBGBillsView.IndexFieldNames := 'BGID;ID';
- end;
- procedure TBGLData.Save;
- begin
- cdsBGL.ApplyUpdates(0);
- cdsBGBills.ApplyUpdates(0);
- end;
- procedure TBGLData.cdsBGBillsViewAfterInsert(DataSet: TDataSet);
- begin
- cdsBGBillsViewID.AsInteger := GetNewIDOfIndex(cdsBGBills);
- cdsBGBillsViewBGID.AsInteger := cdsBGLViewID.AsInteger;
- end;
- procedure TBGLData.AddBGL(const sCode: string);
- begin
- cdsBGLView.DisableControls;
- cdsBGLView.Append;
- cdsBGLViewCode.AsString := sCode;
- cdsBGLView.Post;
- cdsBGLView.EnableControls;
- end;
- procedure TBGLData.cdsBGBillsViewAfterPost(DataSet: TDataSet);
- procedure DoB_CodeChange;
- var
- Rec: TsdDataRecord;
- begin
- cdsBGBillsViewB_Code.Tag := 0;
- cdsBGBillsView.Edit;
- with TProjectData(FProjectData).BillsData do
- begin
- Rec := sddBills.Locate('B_Code', cdsBGBillsViewB_Code.AsString);
- if Rec <> nil then
- begin
- cdsBGBillsViewName.AsString := Rec.ValueByName('Name').AsString;
- cdsBGBillsViewUnits.AsString := Rec.ValueByName('Units').AsString;
- cdsBGBillsViewPrice.AsString := Rec.ValueByName('Price').AsString;
- end;
- end;
- cdsBGBillsView.Post;
- end;
- procedure ClearChangeTag;
- begin
- cdsBGBillsViewB_Code.Tag := 0;
- cdsBGBillsViewName.Tag := 0;
- cdsBGBillsViewUnits.Tag := 0;
- cdsBGBillsViewPrice.Tag := 0;
- cdsBGBillsViewQuantity.Tag := 0;
- end;
- var
- fTotalPrice, Differ: Double;
- begin
- if (cdsBGBillsViewB_Code.Tag = 1) then
- DoB_CodeChange;
- if (cdsBGBillsViewPrice.Tag = 1) or
- (cdsBGBillsViewQuantity.Tag = 1) then
- begin
- cdsBGBillsViewPrice.Tag := 0;
- cdsBGBillsViewQuantity.Tag := 0;
- fTotalPrice := TotalPriceRoundTo(cdsBGBillsViewPrice.AsFloat * cdsBGBillsViewQuantity.AsFloat);
- UpdateBGLTotalPrice(cdsBGBillsViewBGID.AsInteger, fTotalPrice - cdsBGBillsViewTotalPrice.AsFloat);
- UpdateBGLExecutionRate(cdsBGBillsViewBGID.AsInteger);
- cdsBGBillsView.Edit;
- cdsBGBillsViewTotalPrice.AsFloat := fTotalPrice;
- cdsBGBillsView.Post;
- end;
- ClearChangeTag;
- end;
- procedure TBGLData.cdsBGBillsViewQuantityChange(Sender: TField);
- begin
- Sender.Tag := 1;
- end;
- procedure TBGLData.GatherBGLTotalPrice(ABGLID: Integer);
- var
- fGather: Double;
- begin
- cdsBGBills.Filter := 'BGID = ' + IntToStr(ABGLID);
- cdsBGBills.Filtered := True;
- try
- fGather := 0;
- cdsBGBills.First;
- while not cdsBGBills.Eof do
- begin
- fGather := fGather + cdsBGBillsTotalPrice.AsFloat;
- cdsBGBills.Next;
- end;
- if cdsBGL.FindKey([ABGLID]) then
- begin
- cdsBGL.Edit;
- cdsBGLTotalPrice.AsFloat := fGather;
- cdsBGL.Post;
- end;
- finally
- cdsBGBills.Filtered := False;
- end;
- end;
- procedure TBGLData.UpdateBGLTotalPrice(ABGLID: Integer; ADiffer: Double);
- begin
- if cdsBGL.FindKey([ABGLID]) then
- begin
- cdsBGL.Edit;
- cdsBGLTotalPrice.AsFloat := cdsBGLTotalPrice.AsFloat + ADiffer;
- cdsBGL.Post;
- end;
- end;
- procedure TBGLData.ApplyBGL(AOrgBGL, ANewBGL: TBGLSelectInfo);
- begin
- ApplyBGL(AOrgBGL);
- ApplyBGL(ANewBGL);
- end;
- procedure TBGLData.ApplyBGL(ABGLInfo: TBGLSelectInfo);
- var
- I: Integer;
- fNum: Double;
- begin
- for I := 0 to ABGLInfo.Count - 1 do
- if LocateBGL(ABGLInfo.Codes[I]) and
- LocateBGBills(cdsBGLID.AsInteger, ABGLInfo.B_Code, ABGLInfo.Name, ABGLInfo.Units, ABGLInfo.Price) then
- begin
- cdsBGBills.Edit;
- fNum := QuantityRoundTo(StrToFloatDef(ABGLInfo.Nums[I], 0));
- if ABGLInfo.IsOrg then
- cdsBGBillsUsedQuantity.AsFloat := QuantityRoundTo(cdsBGBillsUsedQuantity.AsFloat - fNum)
- else
- cdsBGBillsUsedQuantity.AsFloat := QuantityRoundTo(cdsBGBillsUsedQuantity.AsFloat + fNum);
- cdsBGBills.Post;
- UpdateBGLExecutionRate(cdsBGBillsBGID.AsInteger);
- end;
- end;
- procedure TBGLData.cdsBGBillsViewBeforePost(DataSet: TDataSet);
- procedure DisplayErrorMessage(const AHint: string);
- begin
- cdsBGBillsViewB_Code.Tag := 0;
- cdsBGBillsViewName.Tag := 0;
- cdsBGBillsViewUnits.Tag := 0;
- cdsBGBillsViewPrice.Tag := 0;
- cdsBGBillsViewQuantity.Tag := 0;
- ErrorMessage(AHint);
- Abort;
- end;
- begin
- if (cdsBGBillsViewB_Code.Tag = 1) or
- (cdsBGBillsViewName.Tag = 1) or
- (cdsBGBillsViewUnits.Tag = 1) or
- (cdsBGBillsViewPrice.Tag = 1) then
- begin
- if cdsBGBillsViewUsedQuantity.AsFloat <> 0 then
- DisplayErrorMessage('变更令已被应用至清单,不可修改!');
- end;
- if (cdsBGBillsViewQuantity.Tag = 1) then
- begin
- if (cdsBGBillsViewUsedQuantity.AsFloat <> 0) and
- (cdsBGBillsViewQuantity.AsFloat < cdsBGBillsViewUsedQuantity.AsFloat) then
- DisplayErrorMessage('变更清单的清单数量应大于已变更数量!');
- end;
- if cdsBGBillsViewB_Code.Tag = 1 then
- if CheckSameB_Code(cdsBGBillsViewBGID.AsInteger, cdsBGBillsViewB_Code.AsString) then
- begin
- DisplayErrorMessage('不允许存在同编号变更清单!');
- end;
- end;
- procedure TBGLData.cdsBGLViewBeforePost(DataSet: TDataSet);
- var
- iIncrement: Integer;
- sNewCode: string;
- begin
- if cdsBGLViewIsCloud.AsBoolean then
- begin
- cdsBGLViewCode.Tag := 0;
- WarningMessage('当前变更令不允许编辑。');
- DataSet.Cancel;
- Abort;
- end;
- // 变更令号不可为空
- if cdsBGLViewCode.AsString = '' then
- begin
- cdsBGLViewCode.Tag := 0;
- if cdsBGL.FindKey([cdsBGLViewID.AsInteger]) then
- if cdsBGLCode.AsString <> '' then
- WarningMessage('变更令号不允许为空,如需删除,请点击右键进行删除。');
- DataSet.Cancel;
- Abort;
- end;
- if cdsBGLViewCode.Tag = 1 then
- begin
- cdsBGLViewCode.Tag := 0;
- if CheckBGLUsed(cdsBGLViewID.AsInteger) then
- begin
- ErrorMessage('当前变更令下变更清单已被应用到清单,不可修改!');
- Abort;
- end;
- sNewCode := cdsBGLViewCode.AsString;
- if Pos(';', sNewCode) > 0 then
- begin
- ErrorMessage('变更令号不可输入'';'',请使用其他符号代替!');
- Abort;
- end;
- // 相同变更令号应递增[1],[2]...
- iIncrement := 1;
- while LocateBGL(sNewCode) and (cdsBGLID.AsInteger <> cdsBGLViewID.AsInteger) do
- begin
- sNewCode := Format('%s[%d]', [cdsBGLViewCode.AsString, iIncrement]);
- Inc(iIncrement);
- end;
- if cdsBGLViewCode.AsString <> sNewCode then
- begin
- cdsBGLViewCode.AsString := sNewCode;
- cdsBGLViewCode.Tag := 0;
- end;
- end;
- end;
- procedure TBGLData.DeleteBGBills(ABGID: Integer);
- begin
- cdsBGBills.Filter := 'BGID = ' + IntToStr(ABGID);
- cdsBGBills.Filtered := True;
- try
- cdsBGBills.First;
- while not cdsBGBills.Eof do
- cdsBGBills.Delete;
- finally
- cdsBGBills.Filtered := False;
- end;
- end;
- procedure TBGLData.cdsBGLViewBeforeDelete(DataSet: TDataSet);
- begin
- if CheckBGLUsed(cdsBGLViewID.AsInteger) then
- raise Exception.Create('变更令下变更清单已被应用到清单,不可删除!');
- //if cdsBGLViewIsCloud.AsBoolean then
- //raise Exception.Create('云端获取的变更令不允许删除!');
- if cdsBGLViewIsCloud.AsBoolean and not DeleteWeb(cdsBGLViewWebID.AsInteger) then
- raise Exception.Create('同步删除云端数据失败,请重试');
- DeleteBGBills(cdsBGLViewID.AsInteger);
- end;
- function TBGLData.CheckSameB_Code(ABGID: Integer;
- const AB_Code: string): Boolean;
- begin
- Result := False;
- cdsBGBills.Filter := 'BGID = ' + IntToStr(ABGID);
- cdsBGBills.Filtered := True;
- try
- cdsBGBills.First;
- while (not cdsBGBills.Eof) and (not Result) do
- begin
- Result := Result or SameText(cdsBGBillsB_Code.AsString, AB_Code);
- cdsBGBills.Next;
- end;
- finally
- cdsBGBills.Filtered := False;
- end;
- end;
- procedure TBGLData.cdsBGBillsViewBeforeDelete(DataSet: TDataSet);
- begin
- if cdsBGBillsViewUsedQuantity.AsFloat <> 0 then
- raise Exception.Create('变更清单已被应用至清单,不可删除!');
- if cdsBGLViewIsCloud.AsBoolean then
- raise Exception.Create('云端获取的变更清单不允许删除!');
- end;
- function TBGLData.CheckBGLUsed(ABGID: Integer): Boolean;
- begin
- Result := False;
- cdsBGBills.Filter := 'BGID = ' + IntToStr(ABGID);
- cdsBGBills.Filtered := True;
- try
- cdsBGBills.First;
- while (not cdsBGBills.Eof) and (not Result) do
- begin
- Result := Result or (cdsBGBillsUsedQuantity.AsFloat <> 0);
- cdsBGBills.Next;
- end;
- finally
- cdsBGBills.Filtered := False;
- end;
- end;
- procedure TBGLData.cdsBGBillsViewAfterDelete(DataSet: TDataSet);
- begin
- GatherBGLTotalPrice(cdsBGLViewID.AsInteger);
- UpdateBGLExecutionRate(cdsBGLViewID.AsInteger);
- end;
- procedure TBGLData.BatchWritePos_Reason;
- begin
- cdsBGL.First;
- while not cdsBGL.Eof do
- begin
- cdsBGL.Edit;
- cdsBGLPos_Reason.AsString := cdsBGLName.AsString;
- cdsBGL.Post;
- cdsBGL.Next;
- end;
- end;
- procedure TBGLData.cdsBGLViewNewRecord(DataSet: TDataSet);
- begin
- cdsBGLViewID.AsInteger := GetNewIDOfIndex(cdsBGL);
- cdsBGLViewCreatePhaseID.AsInteger := TProjectData(FProjectData).PhaseIndex;
- end;
- procedure TBGLData.UpdateBGLExecutionRate(ABGLID: Integer);
- function GetBGLExecutionTotalPrice: Double;
- var
- cdsTemp: TClientDataSet;
- begin
- Result := 0;
- cdsTemp := TClientDataSet.Create(nil);
- try
- cdsTemp.CloneCursor(cdsBGBills, True);
- cdsTemp.Filter := Format('BGID = %d', [ABGLID]);
- cdsTemp.Filtered := True;
- cdsTemp.First;
- while not cdsTemp.Eof do
- begin
- Result := Result + TotalPriceRoundTo(
- cdsTemp.FieldByName('UsedQuantity').AsFloat * cdsTemp.FieldByName('Price').AsFloat);
- cdsTemp.Next;
- end;
- finally
- cdsTemp.Free;
- end;
- end;
- begin
- if cdsBGL.FindKey([ABGLID]) then
- begin
- cdsBGL.Edit;
- if cdsBGLTotalPrice.AsFloat <> 0 then
- cdsBGLExecutionRate.AsFloat := AdvRoundTo(GetBGLExecutionTotalPrice/cdsBGLTotalPrice.AsFloat*100)
- else
- cdsBGLExecutionRate.AsFloat := 0;
- cdsBGL.Post;
- end;
- end;
- function TBGLData.AllBGLTotalPrice: Double;
- begin
- Result := 0;
- cdsBGL.First;
- while not cdsBGL.Eof do
- begin
- Result := Result + cdsBGLTotalPrice.AsFloat;
- cdsBGL.Next;
- end;
- end;
- procedure TBGLData.cdsBGBillsViewQuantitySetText(Sender: TField;
- const Text: String);
- begin
- Sender.AsFloat := QuantityRoundTo(StrToFloatDef(Text, 0));
- end;
- procedure TBGLData.cdsBGBillsViewPriceSetText(Sender: TField;
- const Text: String);
- begin
- Sender.AsFloat := PriceRoundTo(StrToFloatDef(Text, 0));
- end;
- procedure TBGLData.cdsBGLViewCodeChange(Sender: TField);
- begin
- Sender.Tag := 1;
- end;
- procedure TBGLData.Close;
- begin
- cdsBGL.IndexName := '';
- cdsBGL.Close;
- cdsBGBills.Close;
- end;
- function TBGLData.LocateBGL(const ACode: string): Boolean;
- begin
- cdsBGL.IndexName := 'idxCode';
- try
- Result := cdsBGL.FindKey([ACode]);
- finally
- cdsBGL.IndexName := 'idxID';
- end;
- end;
- function TBGLData.LocateBGBills(ABGID: Integer;
- const AB_Code, AName, AUnit: string; APrice: Double): Boolean;
- begin
- Result := False;
- cdsBGBills.First;
- while (not cdsBGBills.Eof) do
- begin
- if (cdsBGBillsBGID.AsInteger = ABGID) and
- SameText(cdsBGBillsB_Code.AsString, AB_Code) and
- SameText(cdsBGBillsName.AsString, AName) and
- SameText(cdsBGBillsUnits.AsString, AUnit) and
- (PriceRoundTo(cdsBGBillsPrice.AsFloat - APrice) = 0) then
- begin
- Result := True;
- Break;
- end;
- cdsBGBills.Next;
- end;
- end;
- function TBGLData.AllCloudBGLWebID: string;
- begin
- Result := '';
- cdsBGL.First;
- while not cdsBGL.Eof do
- begin
- if cdsBGLIsCloud.AsBoolean then
- begin
- if Result = '' then
- Result := IntToStr(cdsBGLWebID.AsInteger)
- else
- Result := Result + ',' + IntToStr(cdsBGLWebID.AsInteger);
- end;
- cdsBGL.Next;
- end;
- end;
- procedure TBGLData.LoadCloudBGL(const ABGLs: string);
- procedure AddCloudBGLBills(ABGLID: Integer; ABGBills: ISuperObject);
- var
- i, iNewID: Integer;
- vJ: ISuperObject;
- begin
- for i := 0 to ABGBills.AsArray.Length - 1 do
- begin
- iNewID := GetNewIDOfIndex(cdsBGBills);
- vJ := ABGBills.AsArray.O[i];
- cdsBGBills.Append;
- cdsBGBillsID.AsInteger := iNewID;
- cdsBGBillsBGID.AsInteger := ABGLID;
- cdsBGBillsB_Code.AsString := vJ.S['lnum'];
- cdsBGBillsName.AsString := vJ.S['lname'];
- cdsBGBillsUnits.AsString := vJ.S['unit'];
- cdsBGBillsPrice.AsFloat := vJ.D['unitprice'];
- cdsBGBillsQuantity.AsFloat := vJ.D['samount'];
- cdsBGBillsTotalPrice.AsFloat := TotalPriceRoundTo(cdsBGBillsPrice.AsFloat * cdsBGBillsQuantity.AsFloat);
- cdsBGBills.Post;
- UpdateBGLTotalPrice(ABGLID, cdsBGBillsTotalPrice.AsFloat);
- end;
- end;
- procedure AddCloudBGL(ABGL: ISuperObject);
- var
- iNewID, iCreatePhaseID: Integer;
- vBGBills: ISuperObject;
- begin
- iNewID := GetNewIDOfIndex(cdsBGL);
- iCreatePhaseID := TProjectData(FProjectData).PhaseIndex;
- cdsBGL.Append;
- cdsBGLID.AsInteger := iNewID;
- cdsBGLCode.AsString := ABGL.S['pnum'];
- cdsBGLName.AsString := ABGL.S['pname'];
- cdsBGLPos_Reason.AsString := ABGL.S['description'];
- cdsBGLDirection.AsString := ABGL.S['basis'];
- cdsBGLDrawingCode.AsString := ABGL.S['cnum'];
- cdsBGLApprovalCode.AsString := ABGL.S['bnum'];
- cdsBGLCreatePhaseID.AsInteger := iCreatePhaseID;
- cdsBGLBGLType.AsString := ABGL.S['changeNature'];
- cdsBGLIsCloud.AsBoolean := True;
- cdsBGLWebID.AsInteger := ABGL.I['cid'];
- cdsBGL.Post;
- AddCloudBGLBills(iNewID, ABGL.O['changeBills']);
- end;
- var
- vJ: ISuperObject;
- i: Integer;
- begin
- vJ := SO(ABGLs);
- try
- if not Assigned(vJ.AsArray) then Exit;
- for i := 0 to vJ.AsArray.Length - 1 do
- AddCloudBGL(vJ.AsArray.O[i]);
- finally
- vJ := nil;
- end;
- end;
- function TBGLData.GetBGLCanEdit(ASerialNo: Integer): Boolean;
- var
- i: Integer;
- bk: TBookmark;
- begin
- cdsBGLView.DisableControls;
- bk := cdsBGLView.GetBookmark;
- cdsBGLView.First;
- i := 0;
- while (i < ASerialNo) and not cdsBGLView.Eof do
- begin
- cdsBGLView.Next;
- Inc(i);
- end;
- if i = ASerialNo then
- Result := not cdsBGLViewIsCloud.AsBoolean
- else
- Result := False;
- cdsBGLView.GotoBookmark(bk);
- cdsBGLView.FreeBookmark(bk);
- cdsBGLView.EnableControls;
- end;
- procedure TBGLData.cdsBGLViewAfterScroll(DataSet: TDataSet);
- begin
- if Assigned(FAfterCurrentBGLChanged) then
- FAfterCurrentBGLChanged;
- end;
- function TBGLData.DeleteWeb(AWebID: Integer): Boolean;
- var
- sgs: TStrings;
- sUrl, sInfo: string;
- begin
- Screen.Cursor := crHourGlass;
- sgs := TStringList.Create;
- try
- sgs.Add(Format('cid=%d', [AWebID]));
- sUrl := PHPWeb.MeasureURL + 'change/delete';
- Result := PHPWeb.UrlGet(sUrl, sgs, sInfo) = 1;
- finally
- sgs.Free;
- Screen.Cursor := crDefault;
- end;
- end;
- function TBGLData.GetTotalPrice: Double;
- var
- fTotalPrice: Double;
- begin
- fTotalPrice := 0;
- cdsBGL.First;
- while not cdsBGL.Eof do
- begin
- fTotalPrice := fTotalPrice + cdsBGLTotalPrice.AsFloat;
- cdsBGL.next;
- end;
- Result := fTotalPrice;
- end;
- function TBGLData.GetEndTotalPrice(AEndPhase: Integer): Double;
- var
- fTotalPrice: Double;
- begin
- fTotalPrice := 0;
- cdsBGL.First;
- while not cdsBGL.Eof do
- begin
- if (cdsBGLCreatePhaseID.AsInteger <= AEndPhase) then
- fTotalPrice := fTotalPrice + cdsBGLTotalPrice.AsFloat;
- cdsBGL.next;
- end;
- Result := fTotalPrice;
- end;
- end.
|