投稿者 魔界の仮面弁士  (社会人) 投稿日時 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 という値を得られるかと思います。そこまでできれば、
後はテキストや数値項目を更新する場合と同じ手順で良いと思います。