データを表示した。
しかし、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 件のコメント:
コメントを投稿