はじめまして。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文を書けばうまく結合して、しかも挿入できるのか?」が分からずどんどん頭の整理が付かなくなってしまいました。やりたいことと実力の差が激しく困っております。
お手数ですが、お知恵を拝借したいと思って投稿しました。
よろしくお願いします。
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系コントロールは全て撤去しました。
ユーザーインターフェイスをどうするかが問題です。
TDbEditだと、制御がややこしくなる場合が多いようです。
> 設定として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 を入力できます。
ぶっちゃけ何をしたいかがはっきりわからんです。
> ユーザーがフォーム上で番号(No)、氏名(Name)、権限名称(Kengen)、
> 付与日(getdate)にあたる値を入力し,ボタンを押したときに
入力したこのユーザー(No, Name)が存在しないときは、新規登録?
存在するときは、最終日を更新?
入力されているユーザーを見たいとかそういうことではなさそうなので、
Editで十分かと。
絞り込む条件の入力だけのようですし。
些細なことですが、期限(limit)が決まっているなら、最終日(lastdate)は、
いらないと思います。計算ですぐ出るので。
最終日を保持していると、権限の期限が変更されると、最終日を計算し直さないといけないでしょう?
初めはDBGridを使わず4つのEditと1つのボタンのみでフォームをつくりたかったのですが、新規登録後の確認方法や、別に用意した編集用フォームと一体化できることを考えて、結局DBEditとDBGridを使用してDBNavigatorで操作するという方法をとりました。
作る際には特に んー さん、えーとね さんのアドバイスを参考にさせていただきました。
皆様ありがとうございました。
ツイート | ![]() |