| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548 | unit ZJJLDm;interfaceuses  ZjGrid,  SysUtils, Classes, DB, DBClient, ADODB, sdIDTree, sdDB, Provider,  Windows;type  TZJJLNode = class  private    FBillsID: Integer;    FCode: string;    FCertificateCode: string;    FBillsCode: string;    FFormulaMemo: string;    FRelaFile: string;    FType: Integer;  end;  TZJJLInfoRec = Record    FBFXName: string;    PegName: string;    BGLCode: string;    DrawingCode: string;    UnitName: string;  end;  TZJJLData = class(TDataModule)    atZJJL: TADOTable;    dspZJJL: TDataSetProvider;    cdsZJJL: TClientDataSet;    cdsZJJLID: TIntegerField;    cdsZJJLBillsID: TIntegerField;    cdsZJJLCode: TWideStringField;    cdsZJJLCertificateCode: TWideStringField;    cdsZJJLBillsCode: TWideStringField;    cdsZJJLFormulaMemo: TMemoField;    cdsZJJLRelaFile: TWideStringField;    cdsZJJLType: TIntegerField;    cdsZJJLView: TClientDataSet;    cdsZJJLViewID: TIntegerField;    cdsZJJLViewBillsID: TIntegerField;    cdsZJJLViewCode: TWideStringField;    cdsZJJLViewCertificateCode: TWideStringField;    cdsZJJLViewBillsCode: TWideStringField;    cdsZJJLViewFormulaMemo: TMemoField;    cdsZJJLViewRelaFile: TWideStringField;    cdsZJJLViewType: TIntegerField;    procedure cdsZJJLViewAfterScroll(DataSet: TDataSet);  private    FPhaseData: TObject;    FCanModified: Boolean;    FNewID: Integer;    FOrgDataList: TList;    FDetailGrid: TZJGrid;    procedure GenerateZJJLNode(ANode: TsdIDTreeNode; AType: Integer);    function CheckLastXmj(AID: Integer): Boolean;    function CheckBGExist(ANode: TsdIDTreeNode): Boolean;    function CheckMeasureExist(ANode: TsdIDTreeNode): Boolean;    procedure GenerateLastXmj(ANode: TsdIDTreeNode);    procedure GenerateNode(ANode: TsdIDTreeNode);    procedure GenerateLeafNode(ANode: TsdIDTreeNode);    procedure GenerateNodeByB_Code(ANode: TsdIDTreeNode);    procedure DeleteAll;    procedure RestoreOrgData;    procedure DetailGridCellCanEdit(Sender: TObject; const ACoord: TPoint;      var Allow: Boolean);    procedure DetailGridCellTextChanged(Sender: TObject; Col, Row: Integer);    function GetMainBillsTree: TsdIDTree;  public    constructor Create(APhaseData: TObject);    destructor Destroy; override;    procedure Open(AConnection: TADOConnection);    procedure Save;    procedure GenerateAll;    procedure GenerateAllByB_Code;    procedure AssignedCurData;    function GetInfoRecByCode(ABillsID: Integer): TZJJLInfoRec;    function GetInfoRecByB_Code(ABillsID: Integer): TZJJLInfoRec;    function GetInfoRec(ABillsID, AType: Integer): TZJJLInfoRec;    procedure LocateBills;    property PhaseData: TObject read FPhaseData;    property MainBillsTree: TsdIDTree read GetMainBillsTree;    property CanModified: Boolean read FCanModified write FCanModified;    property DetailGrid: TZJGrid read FDetailGrid;  end;implementationuses  PhaseData, ProjectData, BillsDm, UtilMethods, ProjectProperty, ZhAPI,  BillsCompileDm, BillsMeasureDm;{$R *.dfm}{ TZJJLData }constructor TZJJLData.Create(APhaseData: TObject);begin  inherited Create(nil);  FPhaseData := APhaseData;  FOrgDataList := TList.Create;  FDetailGrid := TZJGrid.Create(nil);  FDetailGrid.Options := FDetailGrid.Options + [goWarpText];  FDetailGrid.OnCellCanEdit := DetailGridCellCanEdit;  FDetailGrid.OnCellTextChanged := DetailGridCellTextChanged;end;destructor TZJJLData.Destroy;begin  FDetailGrid.Free;  ClearObjects(FOrgDataList);  FOrgDataList.Free;  inherited;end;function TZJJLData.GetMainBillsTree: TsdIDTree;begin  with TProjectData(TPhaseData(FPhaseData).ProjectData) do    Result := BillsMeasureData.BillsMeasureTree;end;procedure TZJJLData.Open(AConnection: TADOConnection);begin  atZJJL.Connection := AConnection;  cdsZJJL.Open;  cdsZJJL.IndexFieldNames := 'ID';  cdsZJJLView.CloneCursor(cdsZJJL, True);  cdsZJJLView.IndexFieldNames := 'ID';end;procedure TZJJLData.Save;begin  cdsZJJL.ApplyUpdates(0);end;function TZJJLData.CheckLastXmj(AID: Integer): Boolean;var  stnNode, stnChild: TsdIDTreeNode;begin  stnNode := MainBillsTree.FindNode(AID);  Result := stnNode.Rec.ValueByName('Code').AsString <> '';  if not stnNode.HasChildren or not Result then Exit;  stnChild := stnNode.FirstChild;  Result := stnChild.Rec.ValueByName('B_Code').AsString <> '';end;procedure TZJJLData.AssignedCurData;var  iRowIndex: Integer;  InfoRec: TZJJLInfoRec;begin  FDetailGrid.OnCellTextChanged := nil;  FDetailGrid.FixedRowCount := 0;  FDetailGrid.FixedColCount := 0;  FDetailGrid.ColCount := 1;  FDetailGrid.RowCount := 9;  FDetailGrid.DefaultColWidth := 300;  for iRowIndex := 0 to FDetailGrid.RowCount - 1 do    FDetailGrid[0, iRowIndex].Align := gaTopLeft;  InfoRec := GetInfoRec(cdsZJJLViewBillsID.AsInteger, cdsZJJLViewType.AsInteger);  FDetailGrid.Cells[0, 0].Text := '变更令号:' + InfoRec.BGLCode;  FDetailGrid.Cells[0, 1].Text := '桩号或部位:' + InfoRec.PegName;  FDetailGrid.Cells[0, 2].Text := '分部分项工程:' + InfoRec.FBFXName;  FDetailGrid.Cells[0, 3].Text := '计量单元:' + InfoRec.UnitName;  FDetailGrid.Cells[0, 4].Text := '图号:' + InfoRec.DrawingCode;  FDetailGrid.Cells[0, 5].Text := '计算式说明:';  FDetailGrid.Cells[0, 6].Text := cdsZJJLViewFormulaMemo.AsString;  FDetailGrid.Cells[0, 6].Align := gaTopLeft;  FDetailGrid.RowHeights[6] := 57;  FDetailGrid.Cells[0, 7].Text := '计算草图几何尺寸:';  FDetailGrid.Cells[0, 8].Text := cdsZJJLViewRelaFile.AsString;  FDetailGrid.Cells[0, 8].Align := gaTopLeft;  FDetailGrid.RowHeights[8] := 57;  FDetailGrid.OnCellTextChanged := DetailGridCellTextChanged;end;procedure TZJJLData.GenerateAll;begin  RestoreOrgData;  FNewID := 1;  DeleteAll;  GenerateNode(MainBillsTree.FirstNode);end;procedure TZJJLData.GenerateNode(ANode: TsdIDTreeNode);begin  if not Assigned(ANode) then Exit;  if CheckLastXmj(ANode.ID) then    GenerateLastXmj(ANode)  else    GenerateNode(ANode.FirstChild);  GenerateNode(ANode.NextSibling);end;procedure TZJJLData.GenerateLastXmj(ANode: TsdIDTreeNode);begin  if CheckMeasureExist(ANode) then    GenerateZJJLNode(ANode, 0);end;function TZJJLData.CheckBGExist(ANode: TsdIDTreeNode): Boolean;  function CheckBGLExist(AID: Integer): Boolean;  var    StageRec: TsdDataRecord;  begin    StageRec := TPhaseData(FPhaseData).StageData.StageRecord(AID);    Result := Assigned(StageRec) and           ((StageRec.ValueByName('QcBGLCode').AsString <> '')           or (StageRec.ValueByName('PcBGLCode').AsString <> ''));  end;var  iChild: Integer;begin  Result := False;  if not Assigned(ANode) then Exit;  if ANode.HasChildren then  begin    for iChild := 0 to ANode.ChildCount - 1 do    begin      Result := Result or CheckBGExist(ANode.ChildNodes[iChild]);      if Result then Break;    end;  end  else    Result := CheckBGLExist(ANode.ID);end;procedure TZJJLData.DeleteAll;begin  cdsZJJL.First;  while not cdsZJJL.Eof do    cdsZJJL.Delete;end;procedure TZJJLData.RestoreOrgData;  function CreateNodeData: TZJJLNode;  begin    Result := TZJJLNode.Create;    Result.FBillsID := cdsZJJLBillsID.AsInteger;    Result.FCode := cdsZJJLCode.AsString;    Result.FCertificateCode := cdsZJJLCertificateCode.AsString;    Result.FBillsCode := cdsZJJLBillsCode.AsString;    Result.FFormulaMemo := cdsZJJLFormulaMemo.AsString;    Result.FRelaFile := cdsZJJLRelaFile.AsString;    Result.FType := cdsZJJLType.AsInteger;  end;begin  FOrgDataList.Clear;  cdsZJJL.First;  while not cdsZJJL.Eof do  begin    FOrgDataList.Add(CreateNodeData);    cdsZJJL.Next;  end;end;function TZJJLData.CheckMeasureExist(ANode: TsdIDTreeNode): Boolean;  function CheckStageCompleteData(AID: Integer): Boolean;  var    StageRec: TsdDataRecord;  begin    StageRec := TPhaseData(FPhaseData).StageData.StageRecord(AID);    Result := Assigned(StageRec) and           ((StageRec.ValueByName('GatherQuantity').AsFloat <> 0)           or (StageRec.ValueByName('GatherTotalPrice').AsFloat <> 0));  end;var  iChild: Integer;begin  Result := False;  if not Assigned(ANode) then Exit;  if ANode.HasChildren then  begin    for iChild := 0 to ANode.ChildCount - 1 do    begin      Result := Result or CheckMeasureExist(ANode.ChildNodes[iChild]);      if Result then Break;    end;  end  else    Result := CheckStageCompleteData(ANode.ID);end;procedure TZJJLData.cdsZJJLViewAfterScroll(DataSet: TDataSet);begin  AssignedCurData;end;procedure TZJJLData.DetailGridCellCanEdit(Sender: TObject;  const ACoord: TPoint; var Allow: Boolean);begin  Allow := ((ACoord.Y = 6) or (ACoord.Y = 8)) and      not TPhaseData(FPhaseData).StageDataReadOnly;end;function TZJJLData.GetInfoRecByCode(ABillsID: Integer): TZJJLInfoRec;  function GetBGLCode(ANode: TsdIDTreeNode): string;  begin    with TProjectData(TPhaseData(FPhaseData).ProjectData) do      Result := BillsMeasureData.GatherRelaBGL(ANode);  end;  function GetPegName(APegNode: TsdIDTreeNode): string;  begin    if Assigned(APegNode) then      Result := APegNode.Rec.ValueByName('Name').AsString    else      Result := '';  end;  function GetPegNode(ANode: TsdIDTreeNode): TsdIDTreeNode;  begin    Result := nil;    if not Assigned(ANode) then Exit;    if CheckPeg(ANode.Rec.ValueByName('Name').AsString) then      Result := ANode    else      Result := GetPegNode(ANode.Parent);  end;  // 取树结构的第ALevel层节点的名称(level从0开始)  function GetNameByLevel(ANode: TsdIDTreeNode; ALevel: Integer): string;  begin    Result := '';    if not Assigned(ANode) then Exit;    if ANode.Level = ALevel then      Result := ANode.Rec.ValueByName('Name').AsString    else if ANode.Level > ALevel then      Result := GetNameByLevel(ANode.Parent, ALevel);  end;  function GetFBFXName(ANode, APegNode: TsdIDTreeNode): string;  var    vCurNode: TsdIDTreeNode;  begin    Result := '';    if not Assigned(ANode) then Exit;    // 如果计量单元节点的名称为桩号(转化为判断计量单元节点与桩号节点为同一个)    if not Assigned(APegNode) or (ANode.ID = APegNode.ID) then    begin      // 取树结构的第三、四层节点的名称      Result := GetNameByLevel(ANode, 2);      if (Result <> '') and (GetNameByLevel(ANode, 3) <> '') then        Result := Result + ',';      Result := Result + GetNameByLevel(ANode, 3);    end    // 否则,合并[桩号节点的子节点]至[计量单元节点的父节点]的名称    else    begin      vCurNode := ANode.Parent;      // 转化为判断层次,层次大于[桩号节点的子节点]的层次      while vCurNode.Level > APegNode.Level do      begin        Result := vCurNode.Rec.ValueByName('Name').AsString + ',' + Result;        vCurNode := vCurNode.Parent;      end;    end;  end;  function GetFieldStrDef(ANode: TsdIDTreeNode; const AFieldName, ADef: string): string;  begin    if Assigned(ANode) then      Result := ANode.Rec.ValueByName(AFieldName).AsString    else      Result := '';  end;var  vPeg, vNode: TsdIDTreeNode;begin  vNode := MainBillsTree.FindNode(ABillsID);  vPeg := GetPegNode(vNode);  Result.BGLCode := GetBGLCode(vNode);  Result.PegName := GetPegName(vPeg);  Result.FBFXName := GetFBFXName(vNode, vPeg);  Result.UnitName := GetFieldStrDef(vNode, 'Name', '');  Result.DrawingCode := GetFieldStrDef(vNode, 'DrawingCode', '');end;procedure TZJJLData.DetailGridCellTextChanged(Sender: TObject; Col,  Row: Integer);begin  if (Row = 6) then  begin    cdsZJJLView.Edit;    cdsZJJLViewFormulaMemo.AsString := TZJGrid(Sender).Cells[Col, Row].Text;    cdsZJJLView.Post;  end  else if (Row = 8) then  begin    cdsZJJLView.Edit;    cdsZJJLViewRelaFile.AsString := TZJGrid(Sender).Cells[Col, Row].Text;    cdsZJJLView.Post;  end;end;procedure TZJJLData.GenerateAllByB_Code;begin  RestoreOrgData;  FNewID := 1;  DeleteAll;  GenerateNodeByB_Code(MainBillsTree.FirstNode);end;procedure TZJJLData.GenerateNodeByB_Code(ANode: TsdIDTreeNode);begin  if not Assigned(ANode) then Exit;  if ANode.HasChildren then    GenerateNodeByB_Code(ANode.FirstChild)  else    GenerateLeafNode(ANode);  GenerateNodeByB_Code(ANode.NextSibling);end;procedure TZJJLData.GenerateLeafNode(ANode: TsdIDTreeNode);  function CheckMeasureExist(AID: Integer): Boolean;  var    StageRec: TsdDataRecord;  begin    StageRec := TPhaseData(FPhaseData).StageData.StageRecord(AID);    Result := Assigned(StageRec) and           ((StageRec.ValueByName('GatherQuantity').AsFloat <> 0)           or (StageRec.ValueByName('GatherTotalPrice').AsFloat <> 0));  end;begin  if (ANode.Rec.ValueByName('B_Code').AsString <> '') and      CheckMeasureExist(ANode.ID) then    GenerateZJJLNode(ANode, 1);end;procedure TZJJLData.GenerateZJJLNode(ANode: TsdIDTreeNode;  AType: Integer);  function GetNewCode: string;  begin    with TProjectData(TPhaseData(FPhaseData).ProjectData) do    begin      Result := ProjProperties.ZJJLPreText;      if (Result <> '') and (Result[Length(Result)] <> '-') then        Result := Result + '-';      Result := Result + Format('%d-%d', [PhaseIndex, FNewID]);    end;  end;  function GetOrgZJJLNode(ABillsID: Integer): TZJJLNode;  var    iIndex: Integer;  begin    Result := nil;    for iIndex := 0 to FOrgDataList.Count - 1 do      // 7/30新增了一个“总量控制”模式,Type字段控制。真的是要疯掉了。      if (TZJJLNode(FOrgDataList.Items[iIndex]).FBillsID = ABillsID)          and (TZJJLNode(FOrgDataList.Items[iIndex]).FType = AType) then      begin        Result := TZJJLNode(FOrgDataList.Items[iIndex]);        Break;      end;  end;var  ZJJLNode: TZJJLNode;begin  cdsZJJL.Append;  cdsZJJLID.AsInteger := FNewID;  cdsZJJLBillsID.AsInteger := ANode.ID;  cdsZJJLType.AsInteger := AType;  ZJJLNode := GetOrgZJJLNode(ANode.ID);  if not Assigned(ZJJLNode) then  begin    cdsZJJLCode.AsString := GetNewCode;    cdsZJJLBillsCode.AsString := ANode.Rec.ValueByName('Code').AsString;  end  else  begin    cdsZJJLCode.AsString := ZJJLNode.FCode;    cdsZJJLCertificateCode.AsString := ZJJLNode.FCertificateCode;    cdsZJJLBillsCode.AsString := ZJJLNode.FBillsCode;    cdsZJJLFormulaMemo.AsString := ZJJLNode.FFormulaMemo;    cdsZJJLRelaFile.AsString := ZJJLNode.FRelaFile;  end;  cdsZJJL.Post;  Inc(FNewID);end;function TZJJLData.GetInfoRecByB_Code(ABillsID: Integer): TZJJLInfoRec;  function GetBGLCode(ANode: TsdIDTreeNode): string;  begin    with TProjectData(TPhaseData(FPhaseData).ProjectData) do      Result := BillsMeasureData.GatherRelaBGL(ANode);  end;var  vNode: TsdIDTreeNode;begin  vNode := MainBillsTree.FindNode(ABillsID);  Result.BGLCode := GetBGLCode(vNode);  if Assigned(vNode.Parent) then    Result.PegName := vNode.Parent.Rec.ValueByName('Name').AsString;  Result.FBFXName := '';  Result.UnitName := '';  Result.DrawingCode := vNode.Rec.ValueByName('DrawingCode').AsString;end;function TZJJLData.GetInfoRec(ABillsID, AType: Integer): TZJJLInfoRec;begin  if AType = 0 then    Result := GetInfoRecByCode(ABillsID)  else if AType = 1 then    Result := GetInfoRecByB_Code(ABillsID);end;procedure TZJJLData.LocateBills;var  Rec: TsdDataRecord;begin  with TProjectData(TPhaseData(FPhaseData).ProjectData) do  begin    Rec := BillsData.sddBills.FindKey('idxID', cdsZJJLViewBillsID.AsInteger);    BillsMeasureData.sdvBillsMeasure.LocateInControl(Rec);  end;end;end.
 |