データベース作ってます。(DB2006,BDE,Paradox)
メインフォームと入力フォームを作ってます。で、入力フォームに値を入れていくときに、メインフォームのDBGridに表示していって、入力フォームの「登録」ボタンを押してデータベースに反映させたいと思っています。
(キャンセルボタンで、入力された値を破棄する)
値が正しく入力されているかどうかの確認もかねて、入力フォームに値を代入するたびにメインフォームのDBGridに表示していくという方法はないでしょうか。(OnDataChangeイベントという、いかにもこんな時のために! というのが本に書いてあったのですが、使い方がよく分からないというか、イベントの中身をどう書いていいのか分からなかったもので。)
Tabel、Datasouceの構成が見えませんが
同じデータソースをアサインしていれば、DBEDITに入力すれば
DBGridの同項目も当然表示されます。
AYさん、返信ありがとうございます。
試行錯誤した結果、「登録」ボタンを押してデータベースに反映させたあと、レコードを追加して日付、時刻をセットすることで解決しました。OnDataChanbeイベントは使いませんでした。
この質問を送る前に思いつけばよかったんですけど・・・。
ちょっと待てよ・・・これじゃ解決したことになってない・・・私アホやなぁ。
メインフォームと入力用フォームのデータセットに違うインスタンスを
使用しているからでは?
入力用フォーム.DataSource.Dataset = メインフォーム.DataSource.Dataset であれば、
入力値が見えるはずですよ。
Queryを使ってメインフォームに表示しているんですけど、それが原因である可能性はあり・・・ますね。 ためしにQueryからTableに変えてみると表示されていくんですけど、メインフォームの(DBGridの)日付型のフィールドがありまして、日付の範囲指定(BEQWEEN ○/○/○ and ○/○/○ )とかをやってるので、Tableでは無理かなぁと思ってQueryを使ってます。
間違ってる。"BEQWEEN"って・・・ BETWEENです。
Tableで抽出するのであれば、Filterを使いましょう
Filterで日付の範囲指定ができるんですか?
Table1.Filtered:=False;
Table1.Filter:='Hiduke=
↑ここからわかりません。
Table1.Filtered:=True;
例えば 2006/12/01から2006/12/31までであれば
Table1.Filter := 'hiduke >= ''2006/12/01'' and hiduke <= ''2006/12/31''';
Table1.Filtered := True;
Table1.Filter:='Hiduke>="2007/03/01" and Hiduke<="2007/03/31"';
Table1.Filtered:=True;
エラー
フィルター式に不正な文字 " が含まれています。
とでたので、
Table1.Filter:='Hiduke>=2007/03/01 and Hiduke<=2007/03/31';
Table1.Filtered:=True;
エラー
フィルター式中の数値演算はサポートされていません。
でした。
(DB2006,BDE,Paradox)これではできないということですか?
ごめんなさい。 " じゃなくて ' を2つだったんですね。AYさんの返事を見直してみると何か私のと違うなぁっておもって。つい2つ並んでたら(")ダブルクォーテーションか・・・と思ってしまって。変えてみたらばっちりでした。
> 例えば、TTable で Filter プロパティを指定すると、Filterプロパティ
> の内容が Where 句に設定された Select 文が組み立てられます。
> (ただし、CachedUpdates を使用しない場合です。)
> CachedUpdates を使用した場合は、クライアント側で OnFilterRecord
> 相当の処理が行われるため、オープン時にすべてのレコードがクライア
> ントに流れます。
http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=033531
つまりTTable使っても SELECT文が発行されて処理されてるから、
TableとQueryで違う理由がわからん。
TTableにはQueryで見えなくなった秘密の機能があるのか・・・。
う、見慣れない言葉がいくつも・・・とりあえず範囲指定はできたわけで。が、新たな問題が。並び順です。どうにかしてソートできないでしょうか。範囲指定した日付を。
テーブルに2次インデックスを作るのが簡単なんじゃないでしょうか?
後はTTable.IndexNameで作成した指定するだけです。
Helpで調べていますか?
ほかの人の説明を見ていますか?
もちろん見てます。ヘルプも、ほかの人の説明もきっちりみてます。でも言葉が分からないんです。自分自身に毎日腹が立ちます。これだけ説明してもらってるのに何で私は・・・。ここは泣き言を言うところではないと分かってます。でも適当に質問しているわけではないということだけは言っておきたいと。
TTableもTQueryも同じDataSetを扱いますから、同じ動作になります。
ソートする場合や、選択する場合にはこちらの方が便利ですし、実際TTableを使っても、実際はSQLを発行しています。これからデーターベースを始めるなら、TQueryをぜひ使いこなしたほうが、応用が利きますよ。
Query1->DataSource1->DBEdit1
->DBGrid1
の様に接続していますでしょうか?
"Query1->DataSource1->DBEdit1
->DBGrid1
の様に接続していますでしょうか?"
はい。問題ありません。
Query1->DataSource1(入力フォーム)->DBEdit1(入力フォーム)
DataSource1(メインフォーム)->DBGrid1(メインフォーム)
なの?
すいません。問題ありました。
メインフォームはDBGrid<-DataSource1<-Query1
入力フォームは DBEdit<-DataSource1<-Table1
Query1のWHEREで、Table1の日付フィールドを選択、ソートします。
当方では、同じDataSourceにDBGridとDBEdit・DBNavigatorをつなげると、DBEditで登録したものはすぐにDBGridに表示されますよ。
> メインフォームはDBGrid<-DataSource1<-Query1
> 入力フォームは DBEdit<-DataSource1<-Table1
参照というか、表示しているテーブルは同じだが、インスタンスが違うため
連動しません。
同じフォームに、Query1とQuery2,DataSource1,DataSource2,DBGrid1,DBGrid2を置いて、
Query1 -> DataSource1 -> DBGrid1
Query2 -> DataSource2 -> DBGrid2
SQLを同じにして表示してみなさい。
片方で選択する行を変更しても、もう一方は変更されないでしょ?
だから、Tableを使うと表示されたってのが不思議でならない。
TTable・TQueryと、TDataSourceと、データコントロールのコンポーネントの関係を整理されたら、皆さんの書かれていることが見えると思います。
DBEDITやDBGRidは、TDatasourceに結びつけます。
1つのTDataSourceを使う限り、DBEDITとDBGRidは同じレコードを表示します
(DBGRidは複数ですが)
>メインフォームはDBGrid<-DataSource1<-Query1
>入力フォームは DBEdit<-DataSource1<-Table1
ここで、DataSource1と書かれているのは それぞれのフォームに置いた別なものですね(たぶん)
入力フォームのDBEditもメインフォームのDatasouce1を使うようにして下さい。
入力フォームでメインフォームを参照できるようにしていれば
入力フォームのDBeditのDatasourceにメインフォームのDatasource1が表示されるはずです。
先ずは、確認のために1フォーム上で
(メインフォームと入力フォームを兼ねたイメージのフォームで)
DBGridとDBEditをおいて試されてみるのもよいと思います。
ここのログの検索機能や、Delphi-ML
http://www2.big.or.jp/~osamu/Delphi/
の検索でも有用な情報が得られます。
ずいぶんと返事が遅れました。
”入力フォームのDBEditもメインフォームのDatasouce1を使うようにして下さい。
入力フォームでメインフォームを参照できるようにしていれば
入力フォームのDBeditのDatasourceにメインフォームのDatasource1が表示されるはずです。”
表示されました。入力フォームのDBEditに値を入力すると、メインフォームのDBGridの指定したフィールドに表示されるようになりました。
ツイート | ![]() |