3

私はDelphiが初めてです。2 つの TDataSetProvider によって 2 つの TClientDataSet (それぞれ cdsA と cdsB と言う) にリンクされた 2 つの TSQLTables (A と B と言う) を取得し、2 つの DataSource (dsA と dsB) でシナリオを完了します。

A をマスター、B をディテールとします。

B.MasterSource は dsA 値に設定され、B.MasterFields 値は cdsA に存在しない (クエリには存在する) フィールドを参照します。アプリケーションを起動すると、最初に cdsA が開き、次に cdsB が開きます。何かがおかしい。dsA データソースにリンクする DBGrid にはデータが表示されますが、dsB にリンクする DBGrid には何も表示されません。SQLMonitor ログファイルは、B で実装されたクエリが実行されたことを示しています (単純なselect a, b, c from tableB)。クエリを変更してフィールド 'X' ( select a, b, c, X from tableB) を表示すると、問題なく動作します。ここで、'X' は B.IndexFieldNames プロパティによって参照されるフィールドです。

dsB にリンクする DBGrid に、cdsA の現在のレコードに関連する B のレコードが表示されないのはなぜですか? IndexFieldNamesクエリ列でを指定した場合にのみ機能しますか? 私は何を取りこぼしたか?ティア。

4

2 に答える 2

2

SQL Server 2008 R2用のAdventureWorksデータベースを使用する完全なシナリオについて説明します。また、既にコンポーネントを配置し、データベースとの接続を確立するためにそのパラメーターを適切に設定していると仮定します。この例では、その名前もConn1であると仮定します。TSQLConnection

フォーム上に、2 TSQLTable( tableAおよびtableBという名前)、2 TDataSetProvider( dspAおよびdspBという名前)、2 TClientDataSet( cdsAおよびcdsBという名前)、2 TDataSource( dsAおよびdsBという名前) および 2 TDBGrid( gridAおよびgridBという名前) コンポーネントを配置します。

プロパティを次のように設定します。

tableA.SQLConnection = Conn1
tableA.SchemaName = Sales
tableA.TableName = Customer
tableA.Active = True

dspA.DataSet = tableA

cdsA.ProviderName = dspA
cdsA.Active = True

dsA.DataSet = cdsA

gridA.DataSource = dsA

tableB.SQLConnection = Conn1
tableB.SchemaName = Sales
tableB.TableName = SalesOrderHeader
tableB.Active = True

dspB.DataSet = tableB

cdsB.ProviderName = dspB
cdsB.MasterSource = cdsA
cdsB.MasterFields = CustomerID
cdsB.Active = True

dsB.DataSet = cdsB

gridB.DataSource = dsB

gridAにはすべてのCustomersが表示され、gridBには現在選択されている顧客に関連するOrdersのみが表示されます。

これは、Delphi で 2 つの TClientDataSet コンポーネント間にマスター/詳細関係を確立する基本的な例です。ただし、これを行う方法は他にもあります。

于 2011-11-22T02:10:10.100 に答える