DBを更新するアプリケーションにつきまして への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 あいいうえ  (社会人)
投稿日時
2020/3/18 11:18:49
> まずは DataTable に重複キー制約を付与しておきます。(型付DataSet でも可)
大変申し訳ありませんが、どのようにコーディングをすればよいのかがわかりません。
参考サイトのURL、もしくはサンプルコードのようなものをいただければ幸いです。
また、最初の質問に記載しましたコンボリストの件は解決しました。
大変申し訳ありませんが、どのようにコーディングをすればよいのかがわかりません。
参考サイトのURL、もしくはサンプルコードのようなものをいただければ幸いです。
また、最初の質問に記載しましたコンボリストの件は解決しました。
投稿者 魔界の仮面弁士  (社会人)
投稿日時
2020/3/16 17:58:54
C1FlexGrid は使ったことが無く、所有もしていないため、
メーカーのサポートページを見ているだけではありますが:
https://docs.grapecity.com/help/c1/winforms/winforms_flexgrid/
> グリッドの編集結果を取り出す方法であったり
.DataSource プロパティにバインドしているのなら、
DataTable に編集結果が格納されていると思います。
もしもアンバウンドで使っているなら、.GetData メソッドで編集結果が得られるのでは
ないでしょうか。(総行数は .Rows.Count で)
> 重複チェックのアルゴリズムなど
幾つか方法がありますが、2010 なら DataSet の制約機能を使うのはどうでしょう?
まずは DataTable に重複キー制約を付与しておきます。(型付DataSet でも可)
https://docs.microsoft.com/ja-jp/dotnet/api/system.data.uniqueconstraint?view=netframework-4.8
そしてユーザーには、EnforceConstraints = False の状態で入力させておき、
重複検証を行う際に EnforceConstraints = True にします。制約違反があると
例外が発生するので、Try~Catch で補足します。
EnforceConstraints = True で、どの行が原因で制約違反になったのかを調べるには、
DataTable の GetErrors メソッドを使えます。
エラー行のうち、どの列に問題があったのかを調査するには、
DataRow の GetColumnsInError メソッドと GetColumnError メソッドを使えます。
あるいは LINQ to DataSet で Group By して、.Count() > 1 なレコードを得るという手もありそう。
メーカーのサポートページを見ているだけではありますが:
https://docs.grapecity.com/help/c1/winforms/winforms_flexgrid/
> グリッドの編集結果を取り出す方法であったり
.DataSource プロパティにバインドしているのなら、
DataTable に編集結果が格納されていると思います。
もしもアンバウンドで使っているなら、.GetData メソッドで編集結果が得られるのでは
ないでしょうか。(総行数は .Rows.Count で)
> 重複チェックのアルゴリズムなど
幾つか方法がありますが、2010 なら DataSet の制約機能を使うのはどうでしょう?
まずは DataTable に重複キー制約を付与しておきます。(型付DataSet でも可)
https://docs.microsoft.com/ja-jp/dotnet/api/system.data.uniqueconstraint?view=netframework-4.8
そしてユーザーには、EnforceConstraints = False の状態で入力させておき、
重複検証を行う際に EnforceConstraints = True にします。制約違反があると
例外が発生するので、Try~Catch で補足します。
EnforceConstraints = True で、どの行が原因で制約違反になったのかを調べるには、
DataTable の GetErrors メソッドを使えます。
エラー行のうち、どの列に問題があったのかを調査するには、
DataRow の GetColumnsInError メソッドと GetColumnError メソッドを使えます。
あるいは LINQ to DataSet で Group By して、.Count() > 1 なレコードを得るという手もありそう。
投稿者 あいいうえ  (社会人)
投稿日時
2020/3/16 15:01:04
ご返信ありがとうございます。
> どの C1FlexGrid をお使いでしょうか。WinForms 版?
WinForms 版です。
> やりたいことは分かりましたが、質問点が分かりませんでした。
大雑把な説明ですいません。
C1FlexGridもDataGridViewも触りたての素人です。
Oracleには接続済みで、グリッドにデータベースの内容を表示したり、追加、削除、更新などはできています。ですので、グリッドの編集結果を取り出す方法であったり、重複チェックのアルゴリズムなどがわからないというのがお答えするべきことなのかと思います。
> 要件によって、幾つかの実装パターンが考えられますね。
行自体は十数件しかないので(1)~(2)辺りが適していると思います。
> どのタイプのコンボをお使いですか?
' 1列目:組み込みコンボ(非連結コンボ)だと思います。
質問に正しく答えられていないかもしれません。
もし至らぬ点があればわかる範囲でお答えします。
> どの C1FlexGrid をお使いでしょうか。WinForms 版?
WinForms 版です。
> やりたいことは分かりましたが、質問点が分かりませんでした。
大雑把な説明ですいません。
C1FlexGridもDataGridViewも触りたての素人です。
Oracleには接続済みで、グリッドにデータベースの内容を表示したり、追加、削除、更新などはできています。ですので、グリッドの編集結果を取り出す方法であったり、重複チェックのアルゴリズムなどがわからないというのがお答えするべきことなのかと思います。
> 要件によって、幾つかの実装パターンが考えられますね。
行自体は十数件しかないので(1)~(2)辺りが適していると思います。
> どのタイプのコンボをお使いですか?
' 1列目:組み込みコンボ(非連結コンボ)だと思います。
質問に正しく答えられていないかもしれません。
もし至らぬ点があればわかる範囲でお答えします。
投稿者 魔界の仮面弁士  (社会人)
投稿日時
2020/3/16 12:09:47
> その内容をC1flexgrid(サードパーティ製のdatagridviewの様なもの)をいじることで更新できるアプリケーションを作ろうとしています。
どの C1FlexGrid をお使いでしょうか。WinForms 版?
https://docs.grapecity.com/help/c1/winrt-xaml/winrtxaml_reference/C1.Xaml.FlexGrid~C1.Xaml.FlexGrid.C1FlexGrid.html
https://docs.grapecity.com/help/c1/xaml/xaml_flexsheet/html/T_C1_WPF_FlexGrid_C1FlexGrid.htm
https://docs.grapecity.com/help/c1/winforms/winforms_flexgrid/#C1.Win.C1FlexGrid.4.5.2~C1.Win.C1FlexGrid.C1FlexGrid.html
> 以下のような機能を実装しようとしているのですがどうすれば良いのか見当もつきません。
やりたいことは分かりましたが、質問点が分かりませんでした。
何処までわかっていて、どの部分が分からないのかが曖昧なので、
全部に答えようとすると、質問というよりも「作成依頼」になってしまいます。
・C1FlexGrid の使い方は習得済みですか? それとも C1FlexGrid に関する質問ですか? (DataGridView であれば実装できるのでしょうか?)
・Oracle に接続することはできていますか? 何を使って接続していますか? ODP.NET Managed Driver?
・Oracle からデータを取り出すことはできていますか? それをグリッドに表示できますか?
・Oracle にデータを書き戻すことはできていますか? あるいはグリッドの編集結果を取り出す方法が分からない?
・基本的な読み書きは出来ているけれれど、重複チェックのアルゴリズムが思いつかないので相談したいという話ですか?
> ・主キーを付けていないため、
Oracle なら、ROWID 疑似列を使うことで、疑似的なキーの代わりにできます。
https://sql-oracle.com/?p=1593
しかし、7 カラムの組み合わせを一意にしておきたいのであれば、
あらかじめ 7 カラムに対して UNIQUE INDEX を付与しておくべきかと思います。
> 7カラム全て同じ内容にした行を複数行追加できないようにしたい。
要件によって、幾つかの実装パターンが考えられますね。
(1) 競合する行データがあった場合に、行追加を拒絶する。
(行単位で判定。数件程度の小容量データには良いが、大量の入力の際には不向き)
(2) とにかく好きなようにデータを打たせてから、サーバーに反映させる前の
更新チェックの段階で、競合する行を通知して修正させる。
(複数件一括で判定。Excel 等のスプレッドシート系に近い設計手法)
(3) 競合するデータを見つけたら文字色や背景色を切り替えて通知し、
さらにサーバーに反映させる前の更新チェックも行う。(上記 1 と 2 の混合案)
(4) 画面側でチェックするだけではなく、同時に他のユーザーが同じデータを
既に登録していた場合のチェックが漏れるため、とにかく一度、実際に
サーバーに MERGE してみて重複チェックを行い、同一レコードが
複数登録されていたら、Rollback した上で競合通知メッセージを表示する。
> ・7カラムあるうち一つの項目のみコンボリストで「該当」「非該当」の二つのみ選べるようにしているのですが、
どのタイプのコンボをお使いですか?
https://dev.grapecity.co.jp/support/kb/detail.asp?id=82596
> 該当なら0、非該当なら1とDBに反映させたい。
連結コンボなら ValueMember、非連結なら SelectedIndex を利用すれば
0、1 という値を得られるかと思います。そこまでできれば、
後はテキストや数値項目を更新する場合と同じ手順で良いと思います。
どの C1FlexGrid をお使いでしょうか。WinForms 版?
https://docs.grapecity.com/help/c1/winrt-xaml/winrtxaml_reference/C1.Xaml.FlexGrid~C1.Xaml.FlexGrid.C1FlexGrid.html
https://docs.grapecity.com/help/c1/xaml/xaml_flexsheet/html/T_C1_WPF_FlexGrid_C1FlexGrid.htm
https://docs.grapecity.com/help/c1/winforms/winforms_flexgrid/#C1.Win.C1FlexGrid.4.5.2~C1.Win.C1FlexGrid.C1FlexGrid.html
> 以下のような機能を実装しようとしているのですがどうすれば良いのか見当もつきません。
やりたいことは分かりましたが、質問点が分かりませんでした。
何処までわかっていて、どの部分が分からないのかが曖昧なので、
全部に答えようとすると、質問というよりも「作成依頼」になってしまいます。
・C1FlexGrid の使い方は習得済みですか? それとも C1FlexGrid に関する質問ですか? (DataGridView であれば実装できるのでしょうか?)
・Oracle に接続することはできていますか? 何を使って接続していますか? ODP.NET Managed Driver?
・Oracle からデータを取り出すことはできていますか? それをグリッドに表示できますか?
・Oracle にデータを書き戻すことはできていますか? あるいはグリッドの編集結果を取り出す方法が分からない?
・基本的な読み書きは出来ているけれれど、重複チェックのアルゴリズムが思いつかないので相談したいという話ですか?
> ・主キーを付けていないため、
Oracle なら、ROWID 疑似列を使うことで、疑似的なキーの代わりにできます。
https://sql-oracle.com/?p=1593
しかし、7 カラムの組み合わせを一意にしておきたいのであれば、
あらかじめ 7 カラムに対して UNIQUE INDEX を付与しておくべきかと思います。
> 7カラム全て同じ内容にした行を複数行追加できないようにしたい。
要件によって、幾つかの実装パターンが考えられますね。
(1) 競合する行データがあった場合に、行追加を拒絶する。
(行単位で判定。数件程度の小容量データには良いが、大量の入力の際には不向き)
(2) とにかく好きなようにデータを打たせてから、サーバーに反映させる前の
更新チェックの段階で、競合する行を通知して修正させる。
(複数件一括で判定。Excel 等のスプレッドシート系に近い設計手法)
(3) 競合するデータを見つけたら文字色や背景色を切り替えて通知し、
さらにサーバーに反映させる前の更新チェックも行う。(上記 1 と 2 の混合案)
(4) 画面側でチェックするだけではなく、同時に他のユーザーが同じデータを
既に登録していた場合のチェックが漏れるため、とにかく一度、実際に
サーバーに MERGE してみて重複チェックを行い、同一レコードが
複数登録されていたら、Rollback した上で競合通知メッセージを表示する。
> ・7カラムあるうち一つの項目のみコンボリストで「該当」「非該当」の二つのみ選べるようにしているのですが、
どのタイプのコンボをお使いですか?
https://dev.grapecity.co.jp/support/kb/detail.asp?id=82596
> 該当なら0、非該当なら1とDBに反映させたい。
連結コンボなら ValueMember、非連結なら SelectedIndex を利用すれば
0、1 という値を得られるかと思います。そこまでできれば、
後はテキストや数値項目を更新する場合と同じ手順で良いと思います。
投稿者 (削除されました)  ()
投稿日時
2020/3/16 12:01:15
(削除されました)
投稿者 あいいうえ  (社会人)
投稿日時
2020/3/16 09:48:39
お世話になります。
私は現在visualstudio2010を使ってOracleのデータベースに接続をして、その内容をC1flexgrid(サードパーティ製のdatagridviewの様なもの)をいじることで更新できるアプリケーションを作ろうとしています。
カラムは7行あり、以下のような機能を実装しようとしているのですがどうすれば良いのか見当もつきません。
・主キーを付けていないため、7カラム全て同じ内容にした行を複数行追加できないようにしたい。
・7カラムあるうち一つの項目のみコンボリストで「該当」「非該当」の二つのみ選べるようにしているのですが、該当なら0、非該当なら1とDBに反映させたい。
お力添えいただければ幸いです。
私は現在visualstudio2010を使ってOracleのデータベースに接続をして、その内容をC1flexgrid(サードパーティ製のdatagridviewの様なもの)をいじることで更新できるアプリケーションを作ろうとしています。
カラムは7行あり、以下のような機能を実装しようとしているのですがどうすれば良いのか見当もつきません。
・主キーを付けていないため、7カラム全て同じ内容にした行を複数行追加できないようにしたい。
・7カラムあるうち一つの項目のみコンボリストで「該当」「非該当」の二つのみ選べるようにしているのですが、該当なら0、非該当なら1とDBに反映させたい。
お力添えいただければ幸いです。
DataTable 上の競合データを検出するサンプルを 3 パターンほど書いてみました。