2017-02-02 26 views
0

私は、2つのテーブルを2つのtdbgridに表示されている関係マスター詳細です。今すぐ 私はTeditのコントロールのテーブルの詳細の行に各フィールドを表示したいと思いますが、今はteditの最初のグループの詳細の最初の行だけを表示します。Delphi Firedacマスター詳細マルチ

enter image description here

+0

はいプロジェクトはVCLです。私はその後、各行のクエリを書く必要がありますか? –

+0

次に、各行にクエリを書く必要がありますか? yesはVCL –

+0

です。「各行にクエリを書き込む必要がありますか?」私の答えのようにTDBCtrlGridを使用する場合、必要はありません。 – MartynA

答えて

2

これは、VCLプロジェクト(とないFireMonkeyの1)である場合、あなたは非常に簡単にこれを行うことができます。

  • フォーム上に配置しTDBCtrlGridと詳細データセットのためにそのDataSourceを設定します。

  • IDEで、DBCtrlGridは垂直な一連のパネルを表示します.1つはソリッドグレー、もう1つはストライプ化されています。実線の灰色のパネルにTDBEditsのようなdb対応コントロールを配置し、DataFieldプロパティを設定してコンパイルして実行します。 DBCtrlGridには、Orientationというプロパティがあり、好みに応じて縦または横に設定できます。あなたは、実行時に、DBCtrlGridはパネルのように多くのインスタンスとDB対応のコンポーネントに移入詳細レコードがあるとして、それはDBCtrlGridのRowCountプロパティで指定された数まで、含まれていることを確認する必要があり

。パネルのコピーが十分にあるようにするには、RowCountの値をマスターデータセットのRecordCount' of the detail dataset in the AfterScroll`イベントに設定してみてください。それはあなたが(何TDBCtrlGridsを持っていない)LiveBindingsを使用する必要がありますので、FireMonkeyの(FMX)プロジェクトがある場合は、コントロールを設定と同じように一方

、それ 同様の方法でこれを実行することが可能ですマスターデータセットのフィールドを表示するが、私は試みたことがない。

以下の最小限のVCLプロジェクトコード抽出は、DBCtrlGridの使用を示しています。

uses 
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
    StdCtrls, ExtCtrls, DBCtrls, Grids, DBGrids, DB, DBClient, 
    dbcgrids, Mask; 

type 
    TForm1 = class(TForm) 
    cdsMaster: TClientDataSet; 
    cdsDetail: TClientDataSet; 
    dsMaster: TDataSource; 
    dsDetail: TDataSource; 
    gMaster: TDBGrid; 
    dbnavMaster: TDBNavigator; 
    gDetail: TDBGrid; 
    dbnavDetail: TDBNavigator; 
    DBCtrlGrid1: TDBCtrlGrid; 
    DBEdit1: TDBEdit; // placed in DBCtrlGrid1 
    DBEdit2: TDBEdit; // placed in DBCtrlGrid1 
    procedure cdsMasterAfterScroll(DataSet: TDataSet); 
    procedure FormCreate(Sender: TObject); 
    private 
    public 
    end; 

[...] 

procedure TForm1.FormCreate(Sender: TObject); 
var 
    i, 
    j : Integer; 
    Field : TIntegerField; 
begin 
    DBEdit1.DataField := 'MasterID'; 
    DBEdit2.DataField := 'DetailID'; 

    Field := TIntegerField.Create(Self); 
    Field.FieldName := 'MasterID'; 
    Field.DataSet := cdsMaster; 
    cdsMaster.CreateDataSet; 

    Field := TIntegerField.Create(Self); 
    Field.FieldName := 'DetailID'; 
    Field.DataSet := cdsDetail; 
    Field := TIntegerField.Create(Self); 
    Field.FieldName := 'MasterID'; 
    Field.DataSet := cdsDetail; 

    cdsDetail.MasterSource := dsMaster; 
    cdsDetail.MasterFields := 'MasterID'; 
    cdsDetail.IndexFieldNames := 'MasterID;DetailID'; 
    cdsDetail.CreateDataSet; 

    for i := 1 to 10 do begin 
    cdsMaster.InsertRecord([i]); 
    for j := 1 to i do 
     cdsDetail.InsertRecord([j, i]); 
    end; 
    cdsMaster.First; 
end; 

procedure TForm1.cdsMasterAfterScroll(DataSet: TDataSet); 
begin 
    cdsDetail.DisableControls; 
    try 
    DBCtrlGrid1.RowCount := cdsDetail.RecordCount; 
    finally 
    cdsDetail.EnableControls; 
    end; 
end; 
+0

私のデータベースへの接続はFiredacと申し訳ありません –

+0

FireDACは何も違いはありません.VCLプロジェクトでは、TDBCtrlGridを含むDelphiのすべてのdb対応コンポーネントがサポートされています。 – MartynA

+0

しかし、私はそれらを同時に見ないのですが、どこが間違っていますか? –

0

TDBEditをフォームに配置し、そのDatafieldプロパティとDetailsテーブルのDatasourceプロパティを設定するだけです。

+0

OPのスクリーンショットを見ると、彼のマスターテーブルは患者のテーブルであり、詳細は処方箋のテーブルであり、TBEditsはすでに詳細テーブルに接続されているようです。 – MartynA

+0

しかし、行はTeditの最初のグループでのみ実行されます。 私はTeditと並行してすべての行を見たいと思います。 tdctrlgridでも機能しません。 逃げ出すものがあります –

+0

https://www.youtube.com/edit?o=U&video_id=y_us6WeHVoQ –

関連する問題