| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843 | unit BGLDm;interfaceuses  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: string): 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;implementationuses  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) 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: string): Boolean;begin  Result := False;  cdsBGBills.First;  while (not cdsBGBills.Eof) do  begin    if (cdsBGBillsBGID.AsInteger = ABGID) and       SameText(cdsBGBillsB_Code.AsString, AB_Code) 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.
 |