データを表示した。
しかし、UIBDataSetはReadOnlyのデータセットなので、編集が不可となっています。
(前回のサンプルを実行してもグリッドに入力ができません。)
いくつか、実験をおこなった結果、UIBDataSetは、単方向データセットとして機能している
ようなので、ClientDataSetを経由で接続すれば、DbExpressドライバのように使えるはず
だと思い試してみた。
以下、試して確認できたことを備忘録代わりに記述
フォームにTClientDataSetコンポーネントとTDataSetProviderコンポーネントを配置し、
UIBDataset → DatasetProvieder → ClientDataset → DataSourceにリンク変更
ここで、ClientDataset をActiveにするとタイムスタンプがうまく処理できないようでエラーが
発生するので、ClinetDataSet、およびUIBDataSetのソースを調べた結果、以下のとおり
データ形式の不整合があった。
UIBDataSet -> TDatetime型
ClinetDataSet → 通算のミリ秒(ftDatetime指定時)
そこで、ClientDatasetと時刻データが正しく連携が取れるようUIBDataSetを拡張したコンポーネントで、接続した。
以下、ソース
- unit UIBCdsDataSet;
- interface
- uses
- SysUtils, Classes, DB, uibdataset;
- type
- TUIBCdsDataSet = class(TUIBDataSet)
- private
- { Private 宣言 }
- protected
- { Protected 宣言 }
- public
- { Public 宣言 }
- function GetFieldData(FieldNo: Integer; Buffer: Pointer): Boolean; overload;{$IFNDEF FPC} override; {$ENDIF}
- {$IFNDEF FPC}
- function GetFieldData(Field: TField; Buffer: Pointer; NativeFormat: Boolean): Boolean; overload; override;
- {$ENDIF}
- published
- { Published 宣言 }
- end;
- procedure Register;
- implementation
- uses uiblib;
- procedure Register;
- begin
- RegisterComponents('UIB', [TUIBCdsDataSet]);
- end;
- { TUIBCdsDataSet }
- function TUIBCdsDataSet.GetFieldData(FieldNo: Integer;
- Buffer: Pointer): Boolean;
- var
- doubleBuf : TDateTime;
- aFieldType: TUIBFieldType;
- tsbuf : TTimeStamp;
- begin
- Result := inherited GetFieldData(FieldNo, Buffer);
- if not(Result) then Exit;
- if Buffer = nil then Exit;
- aFieldType := Self.InternalFields.FieldType[FieldNo -1];
- if aFieldType = uftTimestamp then
- begin
- doubleBuf := TDateTime(Buffer^);
- tsbuf := DateTimeToTimeStamp(doubleBuf);
- Double(Buffer^) := TimeStampToMSecs(tsbuf);
- end;
- end;
- function TUIBCdsDataSet.GetFieldData(Field: TField; Buffer: Pointer;
- NativeFormat: Boolean): Boolean;
- var
- //SF : TSQLResult;
- doubleBuf : TDateTime;
- aFieldType: TUIBFieldType;
- tsbuf : TTimeStamp;
- begin
- Result := inherited GetFieldData(Field, Buffer,NativeFormat);
- if not(Result) then Exit;
- if Buffer = nil then Exit;
- //SF := Self.InternalFields;
- aFieldType := Self.InternalFields.FieldType[Field.FieldNo-1];
- if aFieldType = uftTimestamp then
- begin
- doubleBuf := TDateTime(Buffer^);
- tsbuf := DateTimeToTimeStamp(doubleBuf);
- Double(Buffer^) := TimeStampToMSecs(tsbuf);
- end;
- end;
- end.
これで時刻型のフィールドでエラーが発生することなく連携ができた。
0 件のコメント:
コメントを投稿