| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 | unit TenderBackupDm;interfaceuses  SysUtils, Classes, ADODB, sdDB, sdProvider, Variants;type  TTenderBackupData = class(TDataModule)    sdpTenderBackup: TsdADOProvider;    sddTenderBackup: TsdDataSet;    sdvTenderBackup: TsdDataView;    sdvSearchTB: TsdDataView;    procedure sdvTenderBackupFilterRecord(ARecord: TsdDataRecord;      var Allow: Boolean);    procedure sdvTenderBackupGetText(var Text: String;      ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;      DisplayText: Boolean);  private    FProjectID: Integer;    FNewID: Integer;    function TenderBackupCount(AProjectID, AType: Integer): Integer;    function NewTenderBackup(AProjectID, AType: Integer): TsdDataRecord;    function OldestTenderBackup(AProjectID, AType: Integer): TsdDataRecord;    function AddTenderBackup(AProjectID, AType: Integer): TsdDataRecord;    procedure SetProjectID(const Value: Integer);  public    procedure Open(AConnection: TADOConnection);    procedure Save;    function AddOpenTenderBackup(AProjectID: Integer): TsdDataRecord;    function AddSaveTenderBackup(AProjectID: Integer): TsdDataRecord;    function HasTodayOpenTenderBackup(AProjectID: Integer): Boolean;    property ProjectID: Integer read FProjectID write SetProjectID;  end;implementationuses DateUtils;{$R *.dfm}{ TTenderBackupData }procedure TTenderBackupData.Open(AConnection: TADOConnection);var  idxID: TsdIndex;begin  sdpTenderBackup.Connection := AConnection;  sddTenderBackup.Open;  sddTenderBackup.AddIndex('idxID', 'ID');  sddTenderBackup.AddIndex('idxFilter', 'ProjectID;Type');  sddTenderBackup.AddIndex('idxView', 'ProjectID;Type;ID');  sdvTenderBackup.Open;  sdvTenderBackup.IndexName := 'idxView';  sdvSearchTB.Open;  sdvSearchTB.IndexName := 'idxFilter';  if sddTenderBackup.RecordCount > 0 then  begin    idxID := sddTenderBackup.FindIndex('idxID');    FNewID := idxID.Records[sddTenderBackup.RecordCount - 1].ValueByName('ID').AsInteger + 1;  end  else    FNewID := 1;end;procedure TTenderBackupData.Save;begin  sddTenderBackup.Save;end;procedure TTenderBackupData.SetProjectID(const Value: Integer);begin  FProjectID := Value;  sdvTenderBackup.RefreshFilter;end;procedure TTenderBackupData.sdvTenderBackupFilterRecord(  ARecord: TsdDataRecord; var Allow: Boolean);begin  Allow := ARecord.ValueByName('ProjectID').AsInteger = ProjectID;end;function TTenderBackupData.TenderBackupCount(AProjectID,  AType: Integer): Integer;var  idx: TsdIndex;  iFirst, iLast: Integer;  Rec: TsdDataRecord;begin  Result := 0;  sdvSearchTB.IndexName := 'idxFilter';  sdvSearchTB.SetRange([AProjectID, AType], [AProjectID, AType]);  Result := sdvSearchTB.RecordCount;  sdvSearchTB.CancelRange;{  idx := sddTenderBackup.FindIndex('idxFilter');  iFirst := idx.FindKeyIndex(VarArrayOf([AProjectID, AType]));  iLast := idx.FindKeyLastIndex(VarArrayOf([AProjectID, AType]));  if iFirst > 0 then    Result := iLast - iFirst + 1;}end;function TTenderBackupData.AddOpenTenderBackup(  AProjectID: Integer): TsdDataRecord;begin  Result := AddTenderBackup(AProjectID, 1);end;function TTenderBackupData.AddSaveTenderBackup(  AProjectID: Integer): TsdDataRecord;begin  Result := AddTenderBackup(AProjectID, 0);end;function TTenderBackupData.AddTenderBackup(AProjectID,  AType: Integer): TsdDataRecord;var  iCount: Integer;begin  iCount := TenderBackupCount(AProjectID, AType);  if iCount < 5 then    Result := NewTenderBackup(AProjectID, AType)  else    Result := OldestTenderBackup(AProjectID, AType);end;function TTenderBackupData.NewTenderBackup(AProjectID,  AType: Integer): TsdDataRecord;var  iCount: Integer;begin  iCount := TenderBackupCount(AProjectID, AType);  Result := sddTenderBackup.Add;  Result.ValueByName('ID').AsInteger := FNewID;  Inc(FNewID);  Result.ValueByName('ProjectID').AsInteger := FProjectID;  Result.ValueByName('Type').AsInteger := AType;  if AType = 0 then    Result.ValueByName('FileName').AsString := Format('s%d.mtf', [iCount + 1])  else    Result.ValueByName('FileName').AsString := Format('o%d.mtf', [iCount + 1]);end;function TTenderBackupData.OldestTenderBackup(AProjectID,  AType: Integer): TsdDataRecord;var  idx: TsdIndex;  iIndex, iFirst, iLast: Integer;  Rec: TsdDataRecord;begin  idx := sddTenderBackup.FindIndex('idxFilter');  iFirst := idx.FindKeyIndex(VarArrayOf([AProjectID, AType]));  iLast := idx.FindKeyLastIndex(VarArrayOf([AProjectID, AType]));  Result := idx.Records[iFirst];  for iIndex := iFirst + 1 to iLast do  begin    Rec := idx.Records[iIndex];    if Result.ValueByName('CreateDateTime').AsDateTime > Rec.ValueByName('CreateDateTime').AsDateTime then      Result := Rec;  end;end;function TTenderBackupData.HasTodayOpenTenderBackup(  AProjectID: Integer): Boolean;var  idx: TsdIndex;  iIndex, iFirst, iLast: Integer;  Rec: TsdDataRecord;begin  Result := False;  sdvSearchTB.IndexName := 'idxFilter';  sdvSearchTB.SetRange([AProjectID, 1], [AProjectID, 1]);  for iIndex := 0 to sdvSearchTB.RecordCount - 1 do  begin    Rec := sdvSearchTB.Records[iIndex];    if Date = Trunc(Rec.ValueByName('CreateDateTime').AsDateTime) then    begin      Result := True;      Break;    end;  end;  sdvSearchTB.CancelRange;  {idx := sddTenderBackup.FindIndex('idxFilter');  iFirst := idx.FindKeyIndex(VarArrayOf([AProjectID, 1]));  iLast := idx.FindKeyLastIndex(VarArrayOf([AProjectID, 1]));  if iFirst = -1 then Exit;  for iIndex := iFirst to iLast do  begin    Rec := idx.Records[iIndex];    if Date = Trunc(Rec.ValueByName('CreateDateTime').AsDateTime) then    begin      Result := True;      Break;    end;  end;}end;procedure TTenderBackupData.sdvTenderBackupGetText(var Text: String;  ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;  DisplayText: Boolean);begin  if SameText(AValue.FieldName, 'Type') then  begin    if AValue.AsInteger = 0 then      Text := '±£´æ±¸·Ýµã'    else if AValue.AsInteger = 1 then      Text := '´ò¿ª±¸·Ýµã';  end  else if SameText(AValue.FieldName, 'CreateDateTime') then  begin    Text := DateTimeToStr(AValue.AsDateTime);  end;end;end.
 |