問題タブ [tclientdataset]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - TADOQuery を使用した TClientDataSet のクエリ
私の質問はとても簡単です。TDataSetProvider を介して TADOQuery にリンクされた TClientDataSet があります。TADOQuery から TClientDataSet にデータを入れることはできますが、TClientDataSet から TADOQuery にデータを戻すにはどうすればよいですか?
クエリを実行し、TClientDataSet の Active プロパティを True に設定すると、TADOQuery から TClientDataSet にデータが自動的に転送されますが、TADOQuery を非アクティブにしてから再度アクティブにすると、どうすれば TClientDataSet からデータを取得できますか?
複数のデータベースで同じクエリを実行し、TClientDataSet を使用して結果を連結しています。これはうまくいっています。私の問題は、連結された結果セットを TClientDataSet から TADOQuery に戻して、TADOQuery の SaveToFile プロシージャを使用できるようにする必要があることです (互換性の理由から)。これどうやってするの?
delphi - 「bof または eof のいずれかが true であるか、現在のレコードが削除されています..」削除操作を含む applyupdates のエラー
ClientDatset から TAdoDataset (アクセス テーブルにバインドされている) への削除操作を解決しているときに、このエラーが発生します。Delphi 2010 を使用しています。
TClientDataset と TAdoDataset の間の私の DatasetProvider :
TDataSetResolver.EndUpdate() によって呼び出されるこの関数でエラーが発生します。
delphi - DBGrid で列を移動すると、添付された DataSet フィールドが移動するようです
先週、私が予期していなかったことがわかりました。以下に説明します。なぜこれが起こるのか、私は興味があります。TDataSet クラスの内部的なものですか、TDBGrid のアーティファクトですか、それとも何か他のものですか?
開いている ClientDataSet のフィールドの順序が変更されました。具体的には、FieldDefs を使用してその構造を定義した後、CreateDatatSet を呼び出して、コードで ClientDataSet を作成しました。この ClientDataSet の構造の最初のフィールドは、StartOfWeek という名前の Date フィールドでした。ほんの少し後、StartOfWeek フィールドが ClientDataSet.Fields[0] の 0 番目の位置にあると仮定して私が書いたコードは、StartOfWeek フィールドが ClientDataSet の最初のフィールドではなくなったため、失敗しました。
調査の結果、ClientDataSet のすべてのフィールドが、特定の時点で、ClientDataSet が作成された時点の元の構造とは異なる位置に表示される可能性があることがわかりました。私はこれが起こる可能性があることを知りませんでした.Googleで検索しても、この影響についての言及はありませんでした.
起こったことは魔法ではありませんでした。フィールドはそれ自体で位置を変更したり、コードで行ったことに基づいて変更したりしませんでした。フィールドが ClientDataSet 内の位置を物理的に変更したように見える原因は、ユーザーが ClientDataSet がアタッチされている DbGrid 内の列の順序を (もちろん、DataSource コンポーネントを介して) 変更したためです。Delphi 7、Delphi 2007、および Delphi 2010 でこの効果を再現しました。
この効果を実証する非常に単純な Delphi アプリケーションを作成しました。これは、1 つの DBGrid、DataSource、2 つの ClientDataSet、および 2 つの Button を持つ単一のフォームで構成されています。このフォームの OnCreate イベント ハンドラは次のようになります。
[ClientDataSet 構造を表示] というラベルの付いた Button1 には、次の OnClick イベント ハンドラーが含まれています。
移動フィールド効果を示すには、このアプリケーションを実行し、[ClientDataSet 構造を表示] というラベルの付いたボタンをクリックします。次のようなものが表示されるはずです。
次に、DBGrid の列をドラッグして、フィールドの表示順序を並べ替えます。[ClientDataSet 構造を表示] ボタンをもう一度クリックします。今回は、次のようなものが表示されます。
この例で注目に値するのは、DBGrid の列が移動されていることですが、ClientDataSet.Field[0] にあったフィールドが 1 つの位置にあるように、ClientDataSet のフィールドの位置に明らかな影響があることです。ポイントは、すぐにそこにあるとは限りません。残念ながら、これは明確に ClientDataSet の問題ではありません。BDE ベースの TTable と ADO ベースの AdoTable で同じテストを実行したところ、同じ結果が得られました。
DBGrid に表示されている ClientDataSet のフィールドを参照する必要がない場合は、この影響について心配する必要はありません。残りの皆さんのために、いくつかの解決策を考えることができます。
必須ではありませんが、この問題を回避するための最も簡単な方法は、ユーザーが DBGrid 内のフィールドを並べ替えられないようにすることです。これは、DBGrid の Options プロパティから dgResizeColumn フラグを削除することで実行できます。このアプローチは効果的ですが、ユーザーの観点からすると、潜在的に価値のある表示オプションが排除されます。さらに、このフラグを削除すると、列の並べ替えが制限されるだけでなく、列のサイズ変更が防止されます。(列のサイズ変更オプションを削除せずに列の並べ替えを制限する方法については、http://delphi.about.com/od/adptips2005/a/bltip0105_2.htm を参照してください。 )
2 番目の回避策は、DataSet のフィールドをリテラル位置に基づいて参照しないようにすることです (これが問題の本質であるため)。つまり、Count フィールドを参照する必要がある場合は、DataSet.Fields[2] を使用しないでください。フィールドの名前がわかっている限り、DataSet.FieldByName('Count') のようなものを使用できます。
ただし、FieldByName の使用にはかなり大きな欠点が 1 つあります。具体的には、このメソッドは、DataSet の Fields プロパティを反復処理してフィールドを識別し、フィールド名に基づいて一致を探します。これは FieldByName を呼び出すたびに行われるため、大きな DataSet をナビゲートするループなど、フィールドを何度も参照する必要がある状況では避けるべきメソッドです。
フィールドを繰り返し (そして何度も) 参照する必要がある場合は、次のコード スニペットのようなものを使用することを検討してください。
3 番目の解決策がありますが、これは、元の例のように、DataSet が ClientDataSet である場合にのみ使用できます。このような状況では、元の ClientDataSet のクローンを作成すると、元の構造を持つことができます。その結果、0 番目の位置に作成されたフィールドは、ClientDataSets データを表示する DBGrid に対してユーザーが行った操作に関係なく、その位置に残ります。
これは、Show Cloned ClientDataSet Structure というラベルの付いたボタンの OnClick イベント ハンドラーに関連付けられている次のコードで示されています。
このプロジェクトを実行し、[複製された ClientDataSet 構造を表示] というラベルの付いたボタンをクリックすると、ここに示すように、ClientDataSet の真の構造が常に取得されます。
補遺:
基になるデータの実際の構造は影響を受けないことに注意することが重要です。具体的には、DBGrid 内の列の順序を変更した後、ClientDataSet の SaveToFile メソッドを呼び出すと、保存された構造は元の (真の内部) 構造になります。また、ある ClientDataSet の Data プロパティを別の ClientDataSet にコピーすると、コピー先の ClientDataSet にも真の構造が表示されます (これは、コピー元の ClientDataSet を複製したときに見られる効果と同様です)。
同様に、TTable や AdoTable など、他のテスト済みのデータセットにバインドされた DBGrid の列の順序を変更しても、実際には基になるテーブルの構造には影響しません。たとえば、Delphi に同梱されている customer.db サンプル Paradox テーブルからのデータを表示する TTable は、実際にはそのテーブルの構造を変更しません (また、期待することもありません)。
これらの観察結果から結論できることは、DataSet 自体の内部構造は損なわれていないということです。その結果、DataSet の構造の二次表現がどこかにあると想定する必要があります。また、DataSet に関連付ける必要があります (DataSet のすべての使用でこれが必要なわけではないため、やり過ぎのように思われます)、DBGrid に関連付ける必要があります (DBGrid がこの機能を使用しているため、これはより理にかなっていますが、そうではありません)。 TField の並べ替えが DataSet 自体で持続するように見えるという観測によってサポートされています)、または別のものです。
もう 1 つの方法は、効果を TGridDataLink に関連付けることです。これは、複数行対応コントロール (DBGrid など) にデータ認識を提供するクラスです。ただし、このクラスは DataSet ではなくグリッドに関連付けられているため、この説明も拒否する傾向があります。これもまた、効果が DataSet クラス自体で持続するように見えるためです。
元の質問に戻ります。この効果は TDataSet クラスの内部にあるものですか、TDBGrid のアーティファクトですか、それとも何か他のものですか?
以下のコメントの1つに追加したことをここで強調することも許可してください. 何よりも、私の投稿は、列の順序を変更できる DBGrid を使用している場合、TField の順序も変更される可能性があることを開発者に認識させるように設計されています。このアーティファクトは、断続的で重大なバグを引き起こす可能性があり、特定と修正が非常に困難になる可能性があります。いいえ、これは Delphi のバグではないと思います。機能するように設計されているため、すべてが機能していると思います。私たちの多くが、この動作が発生していることに気づいていなかっただけです。今、私たちは知っています。
delphi - TClientDatasetコンポーネントはどこに配置する必要がありますか?
背景:SQLデータベースをストレージとして使用するデスクトップアプリケーションを開発したいと考えています。データベースに接続しているユーザーは一度に1人だけです。
メンテナンスを容易にするために、GUIをBusnissLogicから分離したいと思います。したがって、各ダイアログにDataModule(BLが実装されている場所)を使用することを考えました。
私の質問:TClientDatasetコンポーネントを挿入する適切な場所はどこですか?ダイアログまたはデータモジュールで直接?
delphi - TClientDataSets でファイルを送信する
TClientDataSet を使用してファイルを送信するにはどうすればよいですか?
私はDelphi2010を使用しています
ありがとう
ウラジミール。
混乱をお詫びします。私の意図は、ある TCLientDataSet から Onother に PDF ファイルを送信/転送することです...私たちは MIDAS を使用しています...ありがとう
delphi - DataSetProvider - DataSet から ClientDataSet へ
編集: DataSetProvider にはこのプロジェクトに必要な機能がないように思われるため、データを ClientDataSet にロードするためのカスタム クラスを実装します。
DB に接続されている TMSQuery からデータを取得し、DataSetProvider を使用してそのデータの一部を ClientDataSet に入力しようとしています。
私の問題は、ClientDataSet に入る前に、このデータの一部を変更する必要があることです。ClientDataSet には、生の DB データと一致しない永続フィールドがあります。DB から ClientDataSet のメモ フィールドに文字列を取得することさえできません。
ClientDataSet はデータ層の一部であるため、DB から ClientDataSet へのデータをフィールドごとに適合させる必要があります (ほとんどはそのまま通過できますが、多くはルーティングや変換が必要になります)。
誰もこれを経験していますか?
delphi - TClientDataset の ReconcileError メソッドで複数のレコードの更新エラーを処理する
ReconcileError イベントを使用して、特に特定のレコードで発生した更新エラーの後にユーザーがデータを修正できるようにしようとしています。
例:
1 つのフィールドと 3 つのレコードを持つデータセットがあり、このフィールドにはデータベースに一意の制約があり、データベースに到達したときに 1 つの値を競合するように変更し、データセットで ApplyUpdates を呼び出します。
これにより、プロバイダーでエラー (一意の制約違反) が生成され、applyupdates プロセスが中止され、ReconcileError メソッドの Action var で raAbort が返されます。
ReconcileError メソッドで使用しようとしました:
** 編集 **
サーバーから返された DataSet レコードをデバッグしてダンプした後、この Dataset に 2 つのレコードがあることに気付きました。
少し混乱しています。この DataSet は常に 2 つのレコードで取得されますか? 古い/新しい値を持つレコードは 1 つだけにする必要があると考えました。
ありがとう。
delphi - TClientDataSet.CommandText でのエラーのトラップ
TDataSetProvider に接続された TClientDataSet があり、それが TAdsQuery に接続されています。SQL コマンドを設定してから、次のように ClientDataset を開きます。
ただし、CommandText の SQL ステートメントが失敗した場合 (構文エラーなど)、Advantage コード内で例外が発生しますが、独自の例外処理コードではキャッチされません。
このエラーをトラップしてユーザーに適切に報告する方法はありますか? または、実行する前に SQL クエリの構文を確認する方法はありますか?
Delphi Pro 2009 と Advantage Local Server 9 を使用しています。
delphi - Delphiクライアントデータセットルックアップ/集計
DelphiのClientDatasetsについて少しサポートが必要です。
私が達成したいのは、顧客を示すグリッドです。ここで、列の1つは、各顧客の注文数を示しています。ClientDatasetをフォームに配置し、DelphiデモデータからCustomers.xmlをロードします。別のClienDatasetにorders.xmlがロードされます。比較的簡単ですが、注文CDSで、顧客ごとの合計金額(またはカウント)を示す集計を定義できます。(これに関するCary Jensensの記事を参照してください:http://edn.embarcadero.com/article/29272)問題は、注文データセットから顧客データセットにこの集計結果を取得することです。
顧客と注文の間には1-nの関係があり、通常のルックアップシナリオのようにn-1ではないため、これは一種の逆ルックアップです。
何か案は ?
ソーレン
delphi - tclientdatasetのデルタプロパティ
TclientDataSetのデルタ内のデータを明示的にクリアする方法を知っている人はいますか?applyupdatesを使用せずに
よろしくお願いします、Vijay。