| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969 | 
							- unit ZJJLDm;
 
- interface
 
- uses
 
-   ZjGrid, MeasureGatherZJJL,
 
-   SysUtils, Classes, DB, DBClient, ADODB, sdIDTree, sdDB, Provider,
 
-   Windows, BillsTree, sdProvider, Variants;
 
- type
 
-   TZJJLType = (ztFx, ztGcl, ztGclGather); 
 
-   TRefreshDetailGridEvent = procedure of Object;
 
-   TZJJLNode = class
 
-   private
 
-     FBillsID: Integer;
 
-     FCode: string;
 
-     FCertificateCode: string;
 
-     FBillsCode: string;
 
-     FFormulaMemo: string;
 
-     FRelaFile: string;
 
-     FType: Integer;
 
-   end;
 
-   TZJJLInfoRec = Record
 
-     FBFXName: string;
 
-     PegName: string;
 
-     BeginPeg: string;
 
-     EndPeg: string;
 
-     BGLCode: string;
 
-     DrawingCode: string;
 
-     UnitName: string;
 
-   end;
 
-   TZJJLData = class(TDataModule)
 
-     sdpZJJL: TsdADOProvider;
 
-     sddZJJL: TsdDataSet;
 
-     sdvZJJL: TsdDataView;
 
-     sdpHistory: TsdADOProvider;
 
-     sddHistory: TsdDataSet;
 
-     sdpZJJLDetail: TsdADOProvider;
 
-     sddZJJLDetail: TsdDataSet;
 
-     procedure sdvZJJLBeforeValueChange(AValue: TsdValue;
 
-       const NewValue: Variant; var Allow: Boolean);
 
-     procedure sdvZJJLAfterDeleteRecord(ARecord: TsdDataRecord);
 
-     procedure sdvZJJLCurrentChanged(ARecord: TsdDataRecord);
 
-   private
 
-     FPhaseData: TObject;
 
-     FCanModified: Boolean;
 
-     FNewID: Integer;
 
-     FOrgDataList: TList;
 
-     FRefreshDetailGrid: TRefreshDetailGridEvent;
 
-     function GetNewCode(ANewID: Integer): string;
 
-     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);
 
-     function CheckLeafNodeMeasureExist(AID: Integer): Boolean;
 
-     procedure GenerateLeafNode(ANode: TsdIDTreeNode);
 
-     procedure GenerateNodeByB_Code(ANode: TsdIDTreeNode);
 
-     procedure DeleteAll;
 
-     procedure RestoreOrgData;
 
-     procedure DeleteHistory(ABillsID, AType: Integer);
 
-     procedure DeleteGatherHistory(ARecord: TsdDataRecord);
 
-     procedure DetailGridCellCanEdit(Sender: TObject; const ACoord: TPoint;
 
-       var Allow: Boolean);
 
-     procedure DetailGridCellTextChanged(Sender: TObject; Col, Row: Integer);
 
-     function GetFieldStrDef(ANode: TsdIDTreeNode; const AFieldName, ADef: string): string;
 
-     function GetPegNode(ANode: TsdIDTreeNode): TsdIDTreeNode;
 
-     function GetBGLCode(ANode: TsdIDTreeNode): string;
 
-     // 取树结构的第ALevel层节点的名称(level从0开始)
 
-     function GetNameByLevel(ANode: TsdIDTreeNode; ALevel: Integer): string;
 
-     function GetFBFXName(ANode, APegNode: TsdIDTreeNode): string;
 
-     function GetPegName(ANode: TsdIDTreeNode): string;
 
-     function GetInfoRecByCode_2(ABillsID: Integer): TZJJLInfoRec;
 
-     function GetInfoRecByB_Code_2(ABillsID: Integer): TZJJLInfoRec;
 
-     function GetInfoRec_2(ABillsID, AType: Integer): TZJJLInfoRec;
 
-     function GetNewHistoryID: Integer;
 
-     procedure SetHistory(const AFieldName, AValue: string; AZJJL_Rec: TsdDataRecord);
 
-     // 向父项检测,直至提取到图册号为止
 
-     function GetDrawingCode(ANode: TsdIDTreeNode): string;
 
-     procedure CheckZjjlVerison;
 
-     function GetMainBillsTree: TsdIDTree;
 
-   public
 
-     constructor Create(APhaseData: TObject);
 
-     destructor Destroy; override;
 
-     procedure Open(AConnection: TADOConnection);
 
-     procedure Save;
 
-     procedure GenerateAll;
 
-     procedure GenerateAllByB_Code;
 
-     procedure GenerateAllByB_CodeGather;
 
-     procedure AssignedCurData(ARec: TsdDataRecord; ADetailGrid: TZJGrid);
 
-     function GetInfoRecByCode(ABillsID: Integer): TZJJLInfoRec;
 
-     function GetInfoRecByB_Code(ABillsID: Integer): TZJJLInfoRec;
 
-     function GetInfoRec(ABillsID, AType: Integer): TZJJLInfoRec;
 
-     function GetZJJLCalcData(ARec: TsdDataRecord; const AFileName: string): Double;
 
-     procedure LocateBills;
 
-     function FindZJJLRecord(ABillsID: Integer): TsdDataRecord;
 
-     property PhaseData: TObject read FPhaseData;
 
-     property MainBillsTree: TsdIDTree read GetMainBillsTree;
 
-     property CanModified: Boolean read FCanModified write FCanModified;
 
-     property RefreshDetailGrid: TRefreshDetailGridEvent read FRefreshDetailGrid write FRefreshDetailGrid;
 
-   end;
 
- implementation
 
- uses
 
-   PhaseData, ProjectData, BillsDm, UtilMethods, ProjectProperty, ZhAPI,
 
-   BillsCompileDm, BillsMeasureDm, mPegFilter, Math;
 
- {$R *.dfm}
 
- { TZJJLData }
 
- constructor TZJJLData.Create(APhaseData: TObject);
 
- begin
 
-   inherited Create(nil);
 
-   FPhaseData := APhaseData;
 
-   FOrgDataList := TList.Create;
 
- end;
 
- destructor TZJJLData.Destroy;
 
- begin
 
-   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
 
-   sdpZJJL.Connection := AConnection;
 
-   sddZJJL.Open;
 
-   sddZJJL.AddIndex('idxID', 'ID');
 
-   sddZJJL.AddIndex('idxBillsID', 'BillsID');
 
-   sdvZJJL.Open;
 
-   sdpHistory.Connection := AConnection;
 
-   sddHistory.Open;
 
-   sddHistory.AddIndex('idxID', 'ID');
 
-   sddHistory.AddIndex('idxHistory', 'BillsID;Type;FieldName');
 
-   sddHistory.AddIndex('idxGatherHistory', 'BillsID;Type;B_Code;Name;Units;Price;FieldName');
 
-   sdpZJJLDetail.Connection := AConnection;
 
-   sddZJJLDetail.Open;
 
-   sddZJJLDetail.AddIndex('idxID', 'ID');
 
-   CheckZjjlVerison;
 
- end;
 
- procedure TZJJLData.Save;
 
- begin
 
-   sddZJJL.Save;
 
-   sddHistory.Save;
 
-   sddZJJLDetail.Save;
 
- 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(ARec: TsdDataRecord; ADetailGrid: TZJGrid);
 
- var
 
-   iRowIndex: Integer;
 
- begin
 
-   ADetailGrid.OnCellTextChanged := nil;
 
-   ADetailGrid.FixedRowCount := 0;
 
-   ADetailGrid.FixedColCount := 0;
 
-   ADetailGrid.ColCount := 1;
 
-   ADetailGrid.RowCount := 11;
 
-   ADetailGrid.DefaultColWidth := 300;
 
-   for iRowIndex := 0 to ADetailGrid.RowCount - 1 do
 
-     ADetailGrid[0, iRowIndex].Align := gaTopLeft;
 
-   if not Assigned(ARec) then Exit;
 
-   ADetailGrid.Cells[0, 0].Text := '变更令号:' + ARec.ValueByName('BGLCode').AsString;
 
-   ADetailGrid.Cells[0, 1].Text := '部位:' + ARec.ValueByName('PegName').AsString;
 
-   ADetailGrid.Cells[0, 2].Text := '起始桩号:' + ARec.ValueByName('BeginPeg').AsString;
 
-   ADetailGrid.Cells[0, 3].Text := '终止桩号:' + ARec.ValueByName('EndPeg').AsString;
 
-   ADetailGrid.Cells[0, 4].Text := '分部分项工程:' + ARec.ValueByName('FBFXName').AsString;
 
-   ADetailGrid.Cells[0, 5].Text := '计量单元:' + ARec.ValueByName('UnitName').AsString;
 
-   ADetailGrid.Cells[0, 6].Text := '图号:' + ARec.ValueByName('DrawingCode').AsString;
 
-   ADetailGrid.Cells[0, 7].Text := '计算式说明:';
 
-   ADetailGrid.Cells[0, 8].Text := ARec.ValueByName('FormulaMemo').AsString;
 
-   ADetailGrid.Cells[0, 8].Align := gaTopLeft;
 
-   ADetailGrid.RowHeights[8] := 57;
 
-   ADetailGrid.Cells[0, 9].Text := '计算草图几何尺寸:';
 
-   ADetailGrid.Cells[0, 10].Text := ARec.ValueByName('RelaFile').AsString;
 
-   ADetailGrid.Cells[0, 10].Align := gaTopLeft;
 
-   ADetailGrid.RowHeights[10] := 57;
 
-   ADetailGrid.OnCellTextChanged := DetailGridCellTextChanged;
 
- end;
 
- procedure TZJJLData.GenerateAll;
 
- begin
 
-   RestoreOrgData;
 
-   FNewID := 1;
 
-   DeleteAll;
 
-   GenerateNode(MainBillsTree.FirstNode);
 
-   TPhaseData(FPhaseData).PhaseProperty.ZjjlVersion := 1;
 
- 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
 
-   sddZJJL.DeleteAll;
 
-   sddZJJLDetail.DeleteAll;
 
- end;
 
- procedure TZJJLData.RestoreOrgData;
 
-   function CreateNodeData(ARec: TsdDataRecord): TZJJLNode;
 
-   begin
 
-     Result := TZJJLNode.Create;
 
-     Result.FBillsID := ARec.ValueByName('BillsID').AsInteger;
 
-     Result.FCode := ARec.ValueByName('Code').AsString;
 
-     Result.FCertificateCode := ARec.ValueByName('CertificateCode').AsString;
 
-     Result.FBillsCode := ARec.ValueByName('BillsCode').AsString;
 
-     Result.FFormulaMemo := ARec.ValueByName('FormulaMemo').AsString;
 
-     Result.FRelaFile := ARec.ValueByName('RelaFile').AsString;
 
-     Result.FType := ARec.ValueByName('Type').AsInteger;
 
-   end;
 
- var
 
-   i: Integer;
 
-   vRec: TsdDataRecord;
 
- begin
 
-   FOrgDataList.Clear;
 
-   for i := 0 to sddZJJL.RecordCount - 1 do
 
-   begin
 
-     vRec := sddZJJL.Records[i];
 
-     FOrgDataList.Add(CreateNodeData(vRec));
 
-   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.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;
 
- var
 
-   vPeg, vNode: TsdIDTreeNode;
 
- begin
 
-   vNode := MainBillsTree.FindNode(ABillsID);
 
-   vPeg := GetPegNode(vNode);
 
-   Result.BGLCode := GetBGLCode(vNode);
 
-   Result.PegName := GetFieldStrDef(vPeg, 'Name', '');
 
-   Result.FBFXName := GetFBFXName(vNode, vPeg);
 
-   Result.UnitName := GetFieldStrDef(vNode, 'Name', '');
 
-   Result.DrawingCode := GetDrawingCode(vNode);
 
- end;
 
- procedure TZJJLData.DetailGridCellTextChanged(Sender: TObject; Col,
 
-   Row: Integer);
 
- var
 
-   Rec: TsdDataRecord;
 
- begin
 
-   Rec := sdvZJJL.Current;
 
-   if not Assigned(Rec) then Exit;
 
-   if (Row = 8) then
 
-     Rec.ValueByName('FormulaMemo').AsString := TZJGrid(Sender).Cells[Col, Row].Text
 
-   else if (Row = 10) then
 
-     Rec.ValueByName('RelaFile').AsString := TZJGrid(Sender).Cells[Col, Row].Text;
 
- end;
 
- procedure TZJJLData.GenerateAllByB_Code;
 
- begin
 
-   RestoreOrgData;
 
-   FNewID := 1;
 
-   DeleteAll;
 
-   GenerateNodeByB_Code(MainBillsTree.FirstNode);
 
-   TPhaseData(FPhaseData).PhaseProperty.ZjjlVersion := 1;
 
- 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);
 
- begin
 
-   if (ANode.Rec.ValueByName('B_Code').AsString <> '') and
 
-       CheckLeafNodeMeasureExist(ANode.ID) then
 
-     GenerateZJJLNode(ANode, 1);
 
- end;
 
- procedure TZJJLData.GenerateZJJLNode(ANode: TsdIDTreeNode;
 
-   AType: Integer);
 
-   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;
 
-   function GetFieldValue(const AFieldName, ADefaultValue: string): string;
 
-   var
 
-     HistoryRec: TsdDataRecord;
 
-   begin
 
-     HistoryRec := sddHistory.FindKey('idxHistory', VarArrayOf([ANode.ID, AType, AFieldName]));
 
-     if Assigned(HistoryRec) then
 
-       Result := HistoryRec.ValueByName('FieldValue').AsString
 
-     else
 
-       Result := ADefaultValue;
 
-   end;
 
- var
 
-   ZJJLNode: TZJJLNode;
 
-   vInfoRec: TZJJLInfoRec;
 
-   Rec: TsdDataRecord;
 
- begin
 
-   Rec := sddZJJL.Add;
 
-   Rec.ValueByName('ID').AsInteger := FNewID;
 
-   Rec.ValueByName('BillsID').AsInteger := ANode.ID;
 
-   Rec.ValueByName('Type').AsInteger := AType;
 
-   if AType = Ord(ztFx) then
 
-     Rec.ValueByName('BillsCode').AsString := ANode.Rec.ValueByName('Code').AsString
 
-   else if AType = Ord(ztGcl) then
 
-     Rec.ValueByName('BillsCode').AsString := ANode.Rec.ValueByName('B_Code').AsString;
 
-   Rec.ValueByName('Code').AsString := GetFieldValue('Code', GetNewCode(FNewID));
 
-   Rec.ValueByName('CertificateCode').AsString := GetFieldValue('CertificateCode', '');
 
-   Rec.ValueByName('FormulaMemo').AsString := GetFieldValue('FormulaMemo', '');
 
-   Rec.ValueByName('RelaFile').AsString := GetFieldValue('RelaFile', '');
 
-   vInfoRec := GetInfoRec_2(ANode.ID, AType);
 
-   Rec.ValueByName('BGLCode').AsString := GetFieldValue('BGLCode', vInfoRec.BGLCode);
 
-   Rec.ValueByName('PegName').AsString := GetFieldValue('PegName', vInfoRec.PegName);
 
-   Rec.ValueByName('BeginPeg').AsString := GetFieldValue('BeginPeg', vInfoRec.BeginPeg);
 
-   Rec.ValueByName('EndPeg').AsString := GetFieldValue('EndPeg', vInfoRec.EndPeg);
 
-   Rec.ValueByName('FBFXName').AsString := GetFieldValue('FBFXName', vInfoRec.FBFXName);
 
-   Rec.ValueByName('UnitName').AsString := GetFieldValue('UnitName', vInfoRec.UnitName);
 
-   Rec.ValueByName('DrawingCode').AsString := GetFieldValue('DrawingCode', vInfoRec.DrawingCode);
 
-   Rec := sddZJJLDetail.Add;
 
-   Rec.ValueByName('ID').AsInteger := FNewID;
 
-   Rec.ValueByName('BillsID').AsInteger := ANode.ID;
 
-   Inc(FNewID);
 
- end;
 
- function TZJJLData.GetInfoRecByB_Code(ABillsID: Integer): TZJJLInfoRec;
 
- 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 := vNode.Rec.ValueByName('Name').AsString;
 
-   Result.DrawingCode := GetDrawingCode(vNode);
 
- 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', sdvZJJL.Current.ValueByName('BillsID').AsInteger);
 
-     BillsMeasureData.sdvBillsMeasure.LocateInControl(Rec);
 
-   end;
 
- end;
 
- function TZJJLData.GetDrawingCode(ANode: TsdIDTreeNode): string;
 
- var
 
-   vNode: TBillsIDTreeNode;
 
- begin
 
-   Result := '';
 
-   vNode := TBillsIDTreeNode(ANode);
 
-   while (Result = '') and Assigned(vNode) do
 
-   begin
 
-     if Assigned(vNode.Rec) then
 
-       Result := vNode.Rec.DrawingCode.AsString;
 
-     vNode := TBillsIDTreeNode(vNode.Parent);
 
-   end;
 
- end;
 
- procedure TZJJLData.CheckZjjlVerison;
 
-   procedure LoadVersion0Info;
 
-   var
 
-     i: Integer;
 
-     Rec: TsdDataRecord;
 
-     ZJJLInfoRec: TZJJLInfoRec;
 
-   begin
 
-     for i := 0 to sddZJJL.RecordCount - 1 do
 
-     begin
 
-       Rec := sddZJJL.Records[i];
 
-       ZJJLInfoRec := GetInfoRec(Rec.ValueByName('BillsID').AsInteger, Rec.ValueByName('Type').AsInteger);
 
-       Rec.ValueByName('BGLCode').AsString := ZJJLInfoRec.BGLCode;
 
-       Rec.ValueByName('PegName').AsString := ZJJLInfoRec.PegName;
 
-       Rec.ValueByName('FBFXName').AsString := ZJJLInfoRec.FBFXName;
 
-       Rec.ValueByName('UnitName').AsString := ZJJLInfoRec.UnitName;
 
-       Rec.ValueByName('DrawingCode').AsString := ZJJLInfoRec.DrawingCode;
 
-     end;
 
-   end;
 
-   procedure LoadVersion0History;
 
-   var
 
-     i, j, iNewID: Integer;
 
-     Rec: TsdDataRecord;
 
-   begin
 
-     for i := 0 to sddZJJL.RecordCount - 1 do
 
-     begin
 
-       Rec := sddZJJL.Records[i];
 
-       if Rec.ValueByName('CertificateCode').AsString <> '' then
 
-         SetHistory('CertificateCode', Rec.ValueByName('CertificateCode').AsString, Rec);
 
-       if Rec.ValueByName('FormulaMemo').AsString <> '' then
 
-         SetHistory('FormulaMemo', Rec.ValueByName('FormulaMemo').AsString, Rec);
 
-       if Rec.ValueByName('RelaFile').AsString <> '' then
 
-         SetHistory('RelaFile', Rec.ValueByName('RelaFile').AsString, Rec);
 
-     end;
 
-   end;
 
- begin
 
-   if TPhaseData(PhaseData).PhaseProperty.ZjjlVersion = 0 then
 
-   begin
 
-     TPhaseData(PhaseData).PhaseProperty.ZJJLPreText := TProjectData(TPhaseData(PhaseData).ProjectData).ProjProperties.ZJJLPreText;
 
-     LoadVersion0Info;
 
-     LoadVersion0History;
 
-   end;
 
- end;
 
- function TZJJLData.GetInfoRec_2(ABillsID, AType: Integer): TZJJLInfoRec;
 
- begin
 
-   if AType = 0 then
 
-     Result := GetInfoRecByCode_2(ABillsID)
 
-   else if AType = 1 then
 
-     Result := GetInfoRecByB_Code_2(ABillsID);
 
- end;
 
- function TZJJLData.GetInfoRecByB_Code_2(ABillsID: Integer): TZJJLInfoRec;
 
- var
 
-   vNode: TsdIDTreeNode;
 
-   sPeg: string;    
 
-   vPegFilter: TPegStrFilter;
 
- begin
 
-   vNode := MainBillsTree.FindNode(ABillsID);
 
-   sPeg := GetPegName(vNode);
 
-   Result.BGLCode := GetBGLCode(vNode);
 
-   if Assigned(vNode.Parent) then
 
-     Result.PegName := vNode.Parent.Rec.ValueByName('Name').AsString;
 
-   if sPeg <> '' then
 
-   begin
 
-     vPegFilter := TPegStrFilter.Create;
 
-     vPegFilter.PegStr := sPeg;
 
-     Result.BeginPeg := vPegFilter.BeginPeg;
 
-     Result.EndPeg := vPegFilter.EndPeg;
 
-     vPegFilter.Free;
 
-   end;
 
-   Result.UnitName := vNode.Rec.ValueByName('Name').AsString;
 
-   Result.DrawingCode := GetDrawingCode(vNode);
 
- end;
 
- function TZJJLData.GetInfoRecByCode_2(ABillsID: Integer): TZJJLInfoRec;
 
- var
 
-   vPeg, vNode: TsdIDTreeNode;
 
-   vPegFilter: TPegStrFilter;
 
- begin
 
-   vNode := MainBillsTree.FindNode(ABillsID);
 
-   vPeg := GetPegNode(vNode);
 
-   Result.BGLCode := GetBGLCode(vNode);
 
-   Result.PegName := GetFieldStrDef(vPeg, 'Name', '');
 
-   if Result.PegName <> '' then
 
-   begin
 
-     vPegFilter := TPegStrFilter.Create;
 
-     vPegFilter.PegStr := Result.PegName;
 
-     Result.BeginPeg := vPegFilter.BeginPeg;
 
-     Result.EndPeg := vPegFilter.EndPeg;
 
-     vPegFilter.Free;
 
-   end;
 
-   Result.FBFXName := GetFBFXName(vNode, vPeg);
 
-   Result.UnitName := GetFieldStrDef(vNode, 'Name', '');
 
-   Result.DrawingCode := GetDrawingCode(vNode);
 
- end;
 
- function TZJJLData.GetBGLCode(ANode: TsdIDTreeNode): string;
 
- begin
 
-   with TProjectData(TPhaseData(FPhaseData).ProjectData) do
 
-     Result := BillsMeasureData.GatherRelaBGL(ANode);
 
- end;
 
- function TZJJLData.GetPegName(ANode: TsdIDTreeNode): string;
 
- var
 
-   vPeg: TsdIDTreeNode;
 
- begin
 
-   vPeg := GetPegNode(ANode);
 
-   Result := GetFieldStrDef(vPeg, 'Name', '');
 
- end;
 
- function TZJJLData.GetFieldStrDef(ANode: TsdIDTreeNode; const AFieldName,
 
-   ADef: string): string;
 
- begin
 
-   if Assigned(ANode) then
 
-     Result := ANode.Rec.ValueByName(AFieldName).AsString
 
-   else
 
-     Result := '';
 
- end;
 
- function TZJJLData.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;
 
- function TZJJLData.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 TZJJLData.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;
 
- procedure TZJJLData.SetHistory(const AFieldName, AValue: string;
 
-   AZJJL_Rec: TsdDataRecord);
 
- var
 
-   HistoryRec: TsdDataRecord;
 
- begin
 
-   if AZJJL_Rec.ValueByName('Type').AsInteger <> Integer(ztGclGather) then
 
-     HistoryRec := sddHistory.FindKey('idxHistory', VarArrayOf([AZJJL_Rec.ValueByName('BillsID').AsInteger,
 
-       AZJJL_Rec.ValueByName('Type').AsInteger, AFieldName]))
 
-   else
 
-     HistoryRec := sddHistory.FindKey('idxGatherHistory', VarArrayOf([AZJJL_Rec.ValueByName('GatherBillsID').AsInteger,
 
-       AZJJL_Rec.ValueByName('Type').AsInteger, AZJJL_Rec.ValueByName('B_Code').AsString,
 
-       AZJJL_Rec.ValueByName('Name').AsString, AZJJL_Rec.ValueByName('Units').AsString,
 
-       AZJJL_Rec.ValueByName('Price').AsFloat, AFieldName]));
 
-   if not Assigned(HistoryRec) then
 
-   begin
 
-     HistoryRec := sddHistory.Add;
 
-     HistoryRec.ValueByName('ID').AsInteger := GetNewHistoryID;
 
-     if AZJJL_Rec.ValueByName('Type').AsInteger <> Integer(ztGclGather) then
 
-       HistoryRec.ValueByName('BillsID').AsInteger := AZJJL_Rec.ValueByName('BillsID').AsInteger
 
-     else
 
-       HistoryRec.ValueByName('BillsID').AsInteger := AZJJL_Rec.ValueByName('GatherBillsID').AsInteger;
 
-     HistoryRec.ValueByName('Type').AsInteger := AZJJL_Rec.ValueByName('Type').AsInteger;
 
-     HistoryRec.ValueByName('FieldName').AsString := AFieldName;
 
-     HistoryRec.ValueByName('B_Code').AsString := AZJJL_Rec.ValueByName('B_Code').AsString;
 
-     HistoryRec.ValueByName('Name').AsString := AZJJL_Rec.ValueByName('Name').AsString;
 
-     HistoryRec.ValueByName('Units').AsString := AZJJL_Rec.ValueByName('Units').AsString;
 
-     HistoryRec.ValueByName('Price').AsFloat := AZJJL_Rec.ValueByName('Price').AsFloat;
 
-   end;
 
-   HistoryRec.ValueByName('FieldValue').AsString := AValue;
 
- end;
 
- function TZJJLData.GetNewHistoryID: Integer;
 
- var
 
-   idx: TsdIndex;
 
- begin
 
-   idx := sddHistory.FindIndex('idxID');
 
-   if idx.RecordCount = 0 then
 
-     Result := 1
 
-   else
 
-     Result := idx.Records[idx.RecordCount - 1].ValueByName('ID').AsInteger + 1;
 
- end;
 
- procedure TZJJLData.sdvZJJLBeforeValueChange(AValue: TsdValue;
 
-   const NewValue: Variant; var Allow: Boolean);
 
-   function CheckFieldNeedHistory(const AFieldName: string): Boolean;
 
-   begin
 
-     Result := SameText(AFieldName, 'Code') or
 
-               SameText(AFieldName, 'CertificateCode') or
 
-               SameText(AFieldName, 'BGLCode') or
 
-               SameText(AFieldName, 'PegName') or
 
-               SameText(AFieldName, 'BeginPeg') or
 
-               SameText(AFieldName, 'EndPeg') or
 
-               SameText(AFieldName, 'FBFXName') or
 
-               SameText(AFieldName, 'UnitName') or
 
-               SameText(AFieldName, 'DrawingCode') or
 
-               SameText(AFieldName, 'FormulaMemo') or
 
-               SameText(AFieldName, 'RelaFile');
 
-   end;
 
- var
 
-   sNewValue: string;
 
- begin
 
-   if CheckFieldNeedHistory(AValue.FieldName) and not TPhaseData(FPhaseData).StageDataReadOnly then
 
-   begin
 
-     sNewValue := VarToStrDef(NewValue, '');
 
-     if sNewValue <> AValue.AsString then
 
-       SetHistory(AValue.FieldName, sNewValue, AValue.Owner);
 
-   end;
 
- end;
 
- procedure TZJJLData.sdvZJJLAfterDeleteRecord(ARecord: TsdDataRecord);
 
- begin
 
-   if ARecord.ValueByName('Type').AsInteger <> Integer(ztGclGather) then
 
-     DeleteHistory(ARecord.ValueByName('BillsID').AsInteger, ARecord.ValueByName('Type').AsInteger)
 
-   else
 
-     DeleteGatherHistory(ARecord);
 
- end;
 
- procedure TZJJLData.DeleteHistory(ABillsID, AType: Integer);
 
- var
 
-   i: Integer;
 
-   Rec: TsdDataRecord;
 
- begin
 
-   i := 0;
 
-   while (i < sddHistory.RecordCount) do
 
-   begin
 
-     Rec := sddHistory.Records[i];
 
-     if (ABillsID = Rec.ValueByName('BillsID').AsInteger) and
 
-        (AType = Rec.ValueByName('Type').AsInteger) then
 
-       sddHistory.Remove(Rec)
 
-     else
 
-       Inc(i);
 
-   end;
 
- end;
 
- procedure TZJJLData.GenerateAllByB_CodeGather;
 
-   procedure GenerateZJJLGather(AManager: TmgZJJLManager; ANode: TBillsIDTreeNode);
 
-   var
 
-     iChild: Integer;
 
-     vChild: TBillsIDTreeNode;
 
-   begin
 
-     if ANode.HasChildren then
 
-     begin
 
-       iChild := 0;
 
-       vChild := TBillsIDTreeNode(ANode.NextNode);
 
-       while iChild < ANode.PosterityCount do
 
-       begin
 
-         if not vChild.HasChildren and CheckLeafNodeMeasureExist(vChild.ID) then
 
-           AManager.AddZJJLAndDetail(vChild, ANode);
 
-         vChild := TBillsIDTreeNode(vChild.NextNode);
 
-         Inc(iChild);
 
-       end;
 
-     end
 
-     else if CheckLeafNodeMeasureExist(ANode.ID) then
 
-       AManager.AddZJJLAndDetail(ANode, ANode);
 
-   end;
 
-   procedure GenerateZJJLGatherByNode(AManager: TmgZJJLManager; ANode: TsdIDTreeNode);
 
-   begin
 
-     if not Assigned(ANode) then Exit;
 
-     if ANode.HasChildren and not TBillsIDTreeNode(ANode).Rec.IsGatherZJJL.AsBoolean then
 
-       GenerateZJJLGatherByNode(AManager, ANode.FirstChild)
 
-     else
 
-       GenerateZJJLGather(AManager, TBillsIDTreeNode(ANode));
 
-     GenerateZJJLGatherByNode(AManager, ANode.NextSibling);
 
-   end;
 
-   function GetFieldValue(AZJJL: TmgZJJL; const AFieldName, ADefaultValue: string): string;
 
-   var
 
-     HistoryRec: TsdDataRecord;
 
-   begin
 
-     HistoryRec := sddHistory.FindKey('idxGatherHistory', VarArrayOf([AZJJL.GatherNode.ID, Integer(ztGclGather), AZJJL.B_Code, AZJJL.Name, AZJJL.Units, AZJJL.Price, AFieldName]));
 
-     if Assigned(HistoryRec) then
 
-       Result := HistoryRec.ValueByName('FieldValue').AsString
 
-     else
 
-       Result := ADefaultValue;
 
-   end;
 
-   procedure SaveGatherData(AManager: TmgZJJLManager);
 
-   var
 
-     i, j: Integer;
 
-     vZJJL: TmgZJJL;
 
-     Rec: TsdDataRecord;
 
-   begin
 
-     for i := 0 to AManager.ZJJLCount - 1 do
 
-     begin
 
-       vZJJL := AManager.ZJJL[i];
 
-       Rec := sddZJJL.Add;
 
-       Rec.ValueByName('ID').AsInteger := i + 1;
 
-       Rec.ValueByName('BillsID').AsInteger := vZJJL.Detail[0].RelaNode.ID;
 
-       Rec.ValueByName('Type').AsInteger := Integer(ztGclGather);
 
-       Rec.ValueByName('GatherBillsID').AsInteger := vZJJL.GatherNode.ID;
 
-       Rec.ValueByName('BillsCode').AsString := vZJJL.B_Code;
 
-       Rec.ValueByName('B_Code').AsString := vZJJL.B_Code;
 
-       Rec.ValueByName('Name').AsString := vZJJL.Name;
 
-       Rec.ValueByName('Units').AsString := vZJJL.Units;
 
-       Rec.ValueByName('Price').AsFloat := vZJJL.Price;
 
-       Rec.ValueByName('Code').AsString := GetFieldValue(vZJJL, 'Code', GetNewCode(i+1));
 
-       Rec.ValueByName('CertificateCode').AsString := GetFieldValue(vZJJL, 'CertificateCode', '');
 
-       Rec.ValueByName('FormulaMemo').AsString := GetFieldValue(vZJJL, 'FormulaMemo', '');
 
-       Rec.ValueByName('RelaFile').AsString := GetFieldValue(vZJJL, 'RelaFile', '');
 
-       Rec.ValueByName('BGLCode').AsString := GetFieldValue(vZJJL, 'BGLCode', vZJJL.BGLCode);
 
-       Rec.ValueByName('PegName').AsString := GetFieldValue(vZJJL, 'PegName', '');
 
-       Rec.ValueByName('BeginPeg').AsString := GetFieldValue(vZJJL, 'BeginPeg', vZJJL.BeginPeg);
 
-       Rec.ValueByName('EndPeg').AsString := GetFieldValue(vZJJL, 'EndPeg', vZJJL.EndPeg);
 
-       Rec.ValueByName('FBFXName').AsString := GetFieldValue(vZJJL, 'FBFXName', vZJJL.GatherNode.Rec.Name.AsString);
 
-       Rec.ValueByName('UnitName').AsString := GetFieldValue(vZJJL, 'UnitName', '');
 
-       Rec.ValueByName('DrawingCode').AsString := GetFieldValue(vZJJL, 'DrawingCode', vZJJL.DrawingCode);
 
-       for j := 0 to vZJJL.DetailCount - 1 do
 
-       begin
 
-         Rec := sddZJJLDetail.Add;
 
-         Rec.ValueByName('ID').AsInteger := i + 1;
 
-         Rec.ValueByName('BillsID').AsInteger := vZJJL.Detail[j].RelaNode.ID;
 
-       end;
 
-     end;
 
-   end;
 
- var
 
-   vManager: TmgZJJLManager;
 
- begin
 
-   vManager := TmgZJJLManager.Create;
 
-   try
 
-     DeleteAll;
 
-     GenerateZJJLGatherByNode(vManager, MainBillsTree.FirstNode);
 
-     SaveGatherData(vManager);
 
-     TPhaseData(FPhaseData).PhaseProperty.ZjjlVersion := Integer(ztGclGather);
 
-   finally
 
-     vManager.Free;
 
-   end;
 
- end;
 
- function TZJJLData.CheckLeafNodeMeasureExist(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;
 
- function TZJJLData.GetNewCode(ANewID: Integer): 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, ANewID]);
 
-   end;
 
- end;
 
- function TZJJLData.FindZJJLRecord(ABillsID: Integer): TsdDataRecord;
 
- var
 
-   ADetailRec: TsdDataRecord;
 
- begin
 
-   if sddZJJLDetail.RecordCount > 0 then
 
-   begin
 
-     ADetailRec := sddZJJLDetail.Locate('BillsID', ABillsID);
 
-     if Assigned(ADetailRec) then
 
-       Result := sddZJJL.FindKey('idxID', ADetailRec.ValueByName('ID').AsInteger)
 
-     else
 
-       Result := nil;
 
-   end
 
-   else
 
-     Result := sddZJJL.Locate('BillsID', ABillsID);
 
- end;
 
- procedure TZJJLData.DeleteGatherHistory(ARecord: TsdDataRecord);
 
- var
 
-   i: Integer;
 
-   Rec: TsdDataRecord;
 
- begin
 
-   i := 0;
 
-   while (i < sddHistory.RecordCount) do
 
-   begin
 
-     Rec := sddHistory.Records[i];
 
-     if (ARecord.ValueByName('GatherBillsID').AsInteger = Rec.ValueByName('BillsID').AsInteger) and
 
-        (ARecord.ValueByName('Type').AsInteger = Rec.ValueByName('Type').AsInteger) and
 
-        (ARecord.ValueByName('B_Code').AsString = Rec.ValueByName('B_Code').AsString) and
 
-        (ARecord.ValueByName('Name').AsString = Rec.ValueByName('Name').AsString) and
 
-        (ARecord.ValueByName('Units').AsString = Rec.ValueByName('Units').AsString) and
 
-        (Abs(ARecord.ValueByName('Price').AsFloat - Rec.ValueByName('Price').AsFloat) < 0.00001) then
 
-       sddHistory.Remove(Rec)
 
-     else
 
-       Inc(i);
 
-   end;
 
- end;
 
- procedure TZJJLData.sdvZJJLCurrentChanged(ARecord: TsdDataRecord);
 
- begin
 
-   if Assigned(FRefreshDetailGrid) then
 
-     FRefreshDetailGrid;
 
- end;
 
- function TZJJLData.GetZJJLCalcData(ARec: TsdDataRecord;
 
-   const AFileName: string): Double;
 
- var
 
-   vIdx: TsdIndex;
 
-   iBegin, iEnd, i: Integer;
 
-   vRec, vStageRec: TsdDataRecord;
 
- begin
 
-   Result := 0;
 
-   vIdx := sddZJJLDetail.FindIndex('idxID');
 
-   iBegin := vIdx.FindKeyIndex(ARec.ValueByName('ID').AsInteger);
 
-   iEnd := vIdx.FindKeyLastIndex(ARec.ValueByName('ID').AsInteger);
 
-   if iBegin <> -1 then
 
-   begin
 
-     for i := iBegin to iEnd do
 
-     begin
 
-       vRec := vIdx.Records[i];
 
-       vStageRec := TPhaseData(FPhaseData).StageData.StageRecord(vRec.ValueByName('BillsID').AsInteger);
 
-       if Assigned(vStageRec) then
 
-         Result := QuantityRoundTo(Result + vStageRec.ValueByName(AFileName).AsFloat);
 
-     end;
 
-   end;
 
- end;
 
- end.
 
 
  |