一つのフォームから複数のテーブルに関係して、値を与える方法

解決


canis  2006-05-30 10:49:05  No: 21926

はじめまして。Delphiを始めて2週間目くらいのものです。
バージョンはDelphi4
DBはOracle8
接続方法はBDEを使用しています。

設定として2種類のテーブル
・番号(No),氏名(Name),権限番号(KengenNo),権限付与日(getdate),最終日(lastdate)のあるTableA
・権限番号(KengenNo),権限名称(kengen),期限(limit)のあるTableB
(〜dateという名称のものは全てYYYY/MM/DD形式、limitは〜ヶ月単位で入力された整数が入っています)があったとして、やりたいことは以下の3点です。

ユーザーがフォーム上で番号(No)、氏名(Name)、権限名称(Kengen)、付与日(getdate)にあたる値を入力し,ボタンを押したときに
1.TableB上に存在するユーザーの入力した文字列と合致する権限名称(Kengan)から、対応するKengenNoを割り出す
2.1と同様にTableBから権限名称に対応したKigenを取得して、入力された付与日(getdate)に合算して最終日(lastate)を計算する
3.個人データを管理するテーブルAに、入力されたNo、Name,getdate,および先ほど割り出されたKengenNo,lastdayの5種類を挿入する
という処理を行いたいと考えています。

色々試してみたのですが、やっている内に「フォームに貼り付けるのはEditなのかDBEditなのか?」、「どのようにSQL文を書けばうまく結合して、しかも挿入できるのか?」が分からずどんどん頭の整理が付かなくなってしまいました。やりたいことと実力の差が激しく困っております。
お手数ですが、お知恵を拝借したいと思って投稿しました。

よろしくお願いします。


んー  2006-05-30 18:16:15  No: 21927

DBEdit は、SQL文とかあまり意識することなく
DBを制御する場合にむいています。
ドライバのバージョンがおかしいとDBEditも
おかしくなります。
が、Oracleに限らず他のDBに対しても追加コード
をほとんど書かずに接続できるし、様々な処理も行えるでしょう。
DBEditは、とても硬く DB と結びついているので
DBEditを制御することは、DBを制御するのとまったく同じ
という気持ちで、操作しないといけませんし、
DBのエラーはそのままDBEditにも影響してきます。

Edit 等を使うと、TDatabaseとTQueryを使って
いくつかのSQL文を書くことになると思います。
エスケープ処理などは、TQuery.ParamByName()を
使えば問題なく行えるのでそういった心配はないのですが
特定のDBに依存したSQL文を書かねばならないので
単純なSQL文であっても、複数のDBシステムに対応する
場合には、SQL文を複数用意しなければならず手間がかかります。
が、基本的にDBとは無縁なので
SQL文が走るまでは、DBとは無関与で、ほっとできます(汗)
サブクエリを多用する場合も後者のほうが楽なのではないかと
思います。

専門家ではないので、アレですが。
Delphi 4 との事なので、今から実装をすすめるのであれば
後者のほうがよいのではないかと思います。
古いと最新のDBに接続してDBEditを使うとなると
いろいろと問題があるのではないかと。
Delphi 5 でも、おかしくなりましたからね。
まあ、直せるとは思います。専門家なら。
私は無理だったので DB系コントロールは全て撤去しました。


HOta  2006-05-30 20:33:54  No: 21928

ユーザーインターフェイスをどうするかが問題です。
TDbEditだと、制御がややこしくなる場合が多いようです。


えーとね  2006-05-30 20:46:43  No: 21929

> 設定として2種類のテーブル
人番号(No), 氏名(Name) のテーブルA
権限番号(KengenNo), 権限名称(kengen), 期限(limit) のテーブルB
人番号, 権限番号, 権限付与日(getdate), 最終日(lastdate) のテーブルC
の3種類が良いのでは。

> フォームに貼り付けるのはEditなのかDBEditなのか?
DbGrid の方が楽かもしれません。
テーブルAとCのDbGrid を置いて、A->Cをマスター詳細とすれば
表示上は良い感じになると思います。

> 合致する権限名称(Kengan)から、対応するKengenNoを割り出す
C->Bの参照項目を作り、Grid 上でドロップダウンしてKengen を選択すればKengenNo を入力できます。


ん?  2006-05-31 02:42:12  No: 21930

ぶっちゃけ何をしたいかがはっきりわからんです。

> ユーザーがフォーム上で番号(No)、氏名(Name)、権限名称(Kengen)、
> 付与日(getdate)にあたる値を入力し,ボタンを押したときに
入力したこのユーザー(No, Name)が存在しないときは、新規登録?
存在するときは、最終日を更新?

入力されているユーザーを見たいとかそういうことではなさそうなので、
Editで十分かと。
絞り込む条件の入力だけのようですし。

些細なことですが、期限(limit)が決まっているなら、最終日(lastdate)は、
いらないと思います。計算ですぐ出るので。
最終日を保持していると、権限の期限が変更されると、最終日を計算し直さないといけないでしょう?


canis  2006-06-02 07:15:19  No: 21931

初めはDBGridを使わず4つのEditと1つのボタンのみでフォームをつくりたかったのですが、新規登録後の確認方法や、別に用意した編集用フォームと一体化できることを考えて、結局DBEditとDBGridを使用してDBNavigatorで操作するという方法をとりました。
作る際には特に  んー  さん、えーとね  さんのアドバイスを参考にさせていただきました。

皆様ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加