DBGridに随時表示

解決


湘南乃海  2007-02-28 03:59:07  No: 25094

データベース作ってます。(DB2006,BDE,Paradox)
メインフォームと入力フォームを作ってます。で、入力フォームに値を入れていくときに、メインフォームのDBGridに表示していって、入力フォームの「登録」ボタンを押してデータベースに反映させたいと思っています。
(キャンセルボタンで、入力された値を破棄する)
値が正しく入力されているかどうかの確認もかねて、入力フォームに値を代入するたびにメインフォームのDBGridに表示していくという方法はないでしょうか。(OnDataChangeイベントという、いかにもこんな時のために!  というのが本に書いてあったのですが、使い方がよく分からないというか、イベントの中身をどう書いていいのか分からなかったもので。)


AY  2007-02-28 04:25:53  No: 25095

Tabel、Datasouceの構成が見えませんが
同じデータソースをアサインしていれば、DBEDITに入力すれば
DBGridの同項目も当然表示されます。


湘南乃海  2007-02-28 17:52:13  No: 25096

AYさん、返信ありがとうございます。
試行錯誤した結果、「登録」ボタンを押してデータベースに反映させたあと、レコードを追加して日付、時刻をセットすることで解決しました。OnDataChanbeイベントは使いませんでした。
この質問を送る前に思いつけばよかったんですけど・・・。


湘南乃海  2007-02-28 18:53:06  No: 25097

ちょっと待てよ・・・これじゃ解決したことになってない・・・私アホやなぁ。


Vinus  2007-02-28 19:45:05  No: 25098

メインフォームと入力用フォームのデータセットに違うインスタンスを
使用しているからでは?
入力用フォーム.DataSource.Dataset = メインフォーム.DataSource.Dataset であれば、
入力値が見えるはずですよ。


湘南乃海  2007-03-01 01:33:13  No: 25099

Queryを使ってメインフォームに表示しているんですけど、それが原因である可能性はあり・・・ますね。  ためしにQueryからTableに変えてみると表示されていくんですけど、メインフォームの(DBGridの)日付型のフィールドがありまして、日付の範囲指定(BEQWEEN ○/○/○ and ○/○/○ )とかをやってるので、Tableでは無理かなぁと思ってQueryを使ってます。


湘南乃海  2007-03-01 01:35:23  No: 25100

間違ってる。"BEQWEEN"って・・・      BETWEENです。


AY  2007-03-01 01:49:08  No: 25101

Tableで抽出するのであれば、Filterを使いましょう


湘南乃海  2007-03-01 19:58:34  No: 25102

Filterで日付の範囲指定ができるんですか?
Table1.Filtered:=False;
Table1.Filter:='Hiduke=
                 ↑ここからわかりません。
Table1.Filtered:=True;


AY  2007-03-01 20:14:25  No: 25103

例えば  2006/12/01から2006/12/31までであれば
Table1.Filter := 'hiduke >= ''2006/12/01'' and hiduke <= ''2006/12/31''';
Table1.Filtered := True;


湘南乃海  2007-03-01 22:41:35  No: 25104

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)これではできないということですか?


湘南乃海  2007-03-01 22:48:03  No: 25105

ごめんなさい。  "  じゃなくて  '  を2つだったんですね。AYさんの返事を見直してみると何か私のと違うなぁっておもって。つい2つ並んでたら(")ダブルクォーテーションか・・・と思ってしまって。変えてみたらばっちりでした。


ナスビ  2007-03-01 22:58:39  No: 25106

> 例えば、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で見えなくなった秘密の機能があるのか・・・。


湘南乃海  2007-03-02 01:58:19  No: 25107

う、見慣れない言葉がいくつも・・・とりあえず範囲指定はできたわけで。が、新たな問題が。並び順です。どうにかしてソートできないでしょうか。範囲指定した日付を。


Basser  2007-03-02 02:10:08  No: 25108

テーブルに2次インデックスを作るのが簡単なんじゃないでしょうか?
後はTTable.IndexNameで作成した指定するだけです。


HOta  2007-03-02 02:11:56  No: 25109

Helpで調べていますか?
ほかの人の説明を見ていますか?


湘南乃海  2007-03-02 17:59:34  No: 25110

もちろん見てます。ヘルプも、ほかの人の説明もきっちりみてます。でも言葉が分からないんです。自分自身に毎日腹が立ちます。これだけ説明してもらってるのに何で私は・・・。ここは泣き言を言うところではないと分かってます。でも適当に質問しているわけではないということだけは言っておきたいと。


HOta  2007-03-02 18:25:22  No: 25111

TTableもTQueryも同じDataSetを扱いますから、同じ動作になります。
ソートする場合や、選択する場合にはこちらの方が便利ですし、実際TTableを使っても、実際はSQLを発行しています。これからデーターベースを始めるなら、TQueryをぜひ使いこなしたほうが、応用が利きますよ。
Query1->DataSource1->DBEdit1
                   ->DBGrid1
の様に接続していますでしょうか?


湘南乃海  2007-03-02 20:47:06  No: 25112

"Query1->DataSource1->DBEdit1
                   ->DBGrid1
の様に接続していますでしょうか?"

はい。問題ありません。


Vinus  2007-03-02 20:57:57  No: 25113

Query1->DataSource1(入力フォーム)->DBEdit1(入力フォーム)
        DataSource1(メインフォーム)->DBGrid1(メインフォーム)

なの?


湘南乃海  2007-03-02 22:15:26  No: 25114

すいません。問題ありました。
メインフォームはDBGrid<-DataSource1<-Query1
入力フォームは  DBEdit<-DataSource1<-Table1

Query1のWHEREで、Table1の日付フィールドを選択、ソートします。


HOta  2007-03-03 02:39:12  No: 25115

当方では、同じDataSourceにDBGridとDBEdit・DBNavigatorをつなげると、DBEditで登録したものはすぐにDBGridに表示されますよ。


びーなす・・・なすびー  2007-03-03 06:02:37  No: 25116

> メインフォームはDBGrid<-DataSource1<-Query1
> 入力フォームは  DBEdit<-DataSource1<-Table1

参照というか、表示しているテーブルは同じだが、インスタンスが違うため
連動しません。

同じフォームに、Query1とQuery2,DataSource1,DataSource2,DBGrid1,DBGrid2を置いて、
Query1 -> DataSource1 -> DBGrid1
Query2 -> DataSource2 -> DBGrid2

SQLを同じにして表示してみなさい。
片方で選択する行を変更しても、もう一方は変更されないでしょ?

だから、Tableを使うと表示されたってのが不思議でならない。


AY  2007-03-03 08:30:57  No: 25117

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/
の検索でも有用な情報が得られます。


湘南乃海  2007-03-08 20:09:21  No: 25118

ずいぶんと返事が遅れました。

”入力フォームのDBEditもメインフォームのDatasouce1を使うようにして下さい。
入力フォームでメインフォームを参照できるようにしていれば
入力フォームのDBeditのDatasourceにメインフォームのDatasource1が表示されるはずです。”

表示されました。入力フォームのDBEditに値を入力すると、メインフォームのDBGridの指定したフィールドに表示されるようになりました。


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

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






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