- ベストアンサー
Access初心者の質問 売り上げ集計システムの明細フォームでのチェックボックス表示に関する問題
- Access初心者が売り上げ集計システムを作っている中で、明細フォームでのチェックボックスの表示に関する問題が発生しています。
- 明細フォームのチェックボックス表示は、大盛や小盛が指定できる商品の行では「true」に、指定できない商品の行では「false」にしたいと考えています。
- VBAを使用してこの問題を解決しようとしましたが、メインフォーム中の全ての行のチェックボックスの表示が同時に変わってしまうという課題があります。また、ODBCの設定にも問題があるかもしれません。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ADOなどでのデータセットの仕方は例えば以下の本の97ページに載っています。 http://www.amazon.co.jp/exec/obidos/ASIN/4816332952/250-4912886-7132269 ネットで聞くよりは、こういう書籍をあたった方が絵つきでわかりやすいと思います。 ただし、ADOなどでレコードセットを作ってやる場合は、例えば以下のような構造にしないといけないと思います。 ・親フォームに売上の基本情報を入力 顧客名(または客層)、レジ打ち者名 日付など ・サブフォームを親フォームに埋め込む こちらは注文メニューの詳細内容です。 ここに数行の帳票フォームとなります。 ・親フォームに「次へ」「前へ」ボタンなどを作成し、 サブフォームの内容が例えば10件ずつ表示される ようにする。 (ただし、注文数が絶対に20件を越えないなら 最初から20件~30件ほど表示できるように すればこのようなボタンは要りません) ・フォームを開くと同時に最初の10件を読み込み ・親フォームに「登録」ボタンをつくり、売上登録時には そのボタンを押す(裏ではADOなどで売上登録させる) などなど、結構面倒くさいです。 ですので、変わりの方法として、『visible』=「true」は使えませんが、次のような方法はどうでしょうか? ・商品マスタにチェックボックスのフィールドを増設し、大盛り等ができる商品にチェックをつけておく。(フラグがわりです) ・帳票フォーム上にはそれとは関係なくチェックボックス を配置(売上登録用のチェックボックスです) ・売上登録時の商品ID(もしくは商品名)入力時に、その商品の大盛り等チェックフィールドの値を調べに行く(DLookup関数などで) ・商品マスタの大盛りのチェックがONなら、大盛り等OKなので、その売り上げ帳票フォーム上の チェックボックスに普通に入力できるようにします ・逆に、商品マスタのチェックがOFFなら、その売り上げ帳票フォーム上の チェックボックスに入力できないようにします。 入力できないようにするには、そのチェックボックス 更新前イベントに以下のようなコードを書きます。 If DLookup("大盛り等できる出来ないのチェックボックスフィールド名","商品マスタテーブル名") = vbYes Then Else Cancel = True Me!帳票フォーム上のチェックボックス名.Undo End if この状態で、帳票フォーム上のチェックボックスに値を入れようとすると、大盛り等ができないメニューの場合は、 「Cancel = True」という行と 「Me!帳票フォーム上のチェックボックス名.Undo」という行のところで、値を入れても強制的にもとにもどされてしまいますので、結果として、大盛り等にできない形になります。ですので入力ミスはこれでかなり減ると思います。 なお、帳票フォーム上のチェックボックスの更新後イベントに Me!帳票フォーム上のチェックボックス名 = Me!帳票フォーム上のチェックボックス名.OldValue などと書いても元の値に戻り、値の変更ができなくなります。 その後、どこか別のテキストボックスなどに、SetFocusで強制移動させるなどしても良いと思います。 もし、現在の、『visible』=「true」が単に入力ミスを無くすだけの目的でしたら、以上のような方法もあると思います。 とりあえず思いついたのをぱっと書いただけですので、もっと他の方法もあると思います。 詳しくはヘルプや、他の掲示板、メーリンスリストなどの過去ログもあたってみてください。
その他の回答 (3)
- gadd3
- ベストアンサー率46% (211/451)
>書いて頂いているif文にはthen以下が見当たらないのですが、これで大丈夫なのですね? はい。とりあえずそうです。「何もしない」ということを明示的にしました。逆の書き方もできると思いますけど・・・。すみません。わかりにくくて。 >あと、これは確認ですが、サブフォームには >チェックボックスが大盛用と小盛用、 >2つ有るのですが、両方とも同じ式を入れれば良いですよね。 はい。そうです。 >大盛等が出来る商品の中分類IDの範囲は決まっていますので、 >それをフラグ代わりに使えないのでしょうか? ですが、 >カレー系から軽食系までは、大盛小盛が指定出来る ということですと、できますね。(^^) If DLookup("中分類フィールド名","商品マスタテーブル名") = "カレー" Then '何もしない(これはコメントです。) ElseIf DLookup("中分類フィールド名","商品マスタテーブル名") = "スパゲティ" Then '何もしない(これもコメントです。) Elseif・・・(以下、条件の数だけ同様に) ・ ・ ・ Else Cancel = True Me!帳票フォーム上のチェックボックス名.Undo End if みたいな感じでしょうか・・・ もっと良い書き方があるとは思いますが・・・ >昔、N80-BASIC・N88-BASICをやっていて、古い書き方しか知らないもので.... お気に障ったら申し訳ありません。 とんでもございません~。 僕の方こそへんな書き方で・・・ 書き方は初心者同然ですからあまり参考にしない方が よいかもしれません(^^) 検証したわけではないので、どこか、間違ってたら ごめんなさい。
お礼
お礼が遅くなってしまって、申し訳ありません。 問題の部分ですが、お答えを見ている時に、ふと、「『チェックボックス』ではなく『オプションボタン』ではどうだろう。」と思いまして、試してみました。 フォーム『明細』中に三つのオプションボタンを配置し、それぞれ[小盛]'-100'[普通]'0'[大盛]'100'と、オプション値に割り引き・割り増し金額をそのまま入れておくのです。 盛りを指定出来ない時は、強制的に0を入れるようにしました。 Dim morichk As Integer: morichk = Forms![F_売上伝票]![明細].Form![gr_盛り] Dim chuubunrui As Integer: chuubunrui = CInt(Forms![F_売上伝票]![明細].Form![商品ID].Column(4)) ・ ・ ・ If chuubunrui > 2 And chuubunrui < 9 Then mori = morichk Else mori = 0 Forms![F_売上伝票]![明細].Form![gr_盛り] = mori End If 上記の中身はどうでも良いのですが、何とかこれで盛りでの入力ミスはなくなりました。 皆様からの色々な考え方やアドバイスのおかげです。有難うございました。 まだまだ完成には程遠いものですが、何とかやっていけそうな実感が湧いてきました。 また、質問させて頂くかもしれませんが、その時はよろしくお願いします。 皆様へのお礼に代えさせて頂きます。
- gadd3
- ベストアンサー率46% (211/451)
>レコードセットを使わないとメインフォーム中の全ての >行のチェックボックスの『visible』が同時に変わって >しまいます。 ところから察しますに、 > 帳票形式の明細フォーム というのは。フォームプロパティの「既定のビュー」が 「帳票フォーム」になっている状態のことですよね? 多分・・・ これですと、1行分のプロパティ設定が繰り返し同じ設定 で表示される形式ですので、1つのテキストボックスや チェックボックスの設定が、全ての行のそれに適用されて しまいます。 したがって、帳票フォームの各個別の行に、例えば、 「テキストボックスAの値が●●だったら、チェックボック スの『visible』を「true」にする」などのプロパティ設定は不可能だと思います。 全部の行が『visible』=「true」になります。 値そのものを行ごとに変更することはもちろん出来ますが。 コントロールのプロパティ設定は全ての列に同じ 設定がなされてしまいます。 ですので、条件別に1行ずつ違うプロパティ設定にしたいときは 非連結フォームに例えば10行分のコントロールを用意して、 ADOかDAOでレコードセットを生成し、そこへレコード セットの内容を表示するパターンでないとだめなような 気がします。 もしくは帳票フォームはあきらめて、単票フォームにするとか・・・。 違ってたらごめんなさい。 僕も過去に何度も調べてヘルプ・WEBなども参照しましたが、解決方法 は見つかりませんでした。 バージョンアップでこれを可能にして欲しいなと 思いましたが、条件付き書式を設定時の表示速度などを 見ますと、やはり表示速度が遅くなるので、 それでマイクロソフトはやらないのかな?という風に 推測しています。
補足
お返事ありがとうございます。 >というのは。フォームプロパティの「既定のビュー」が >「帳票フォーム」になっている状態のことですよね? >多分・・・ そうです。その通りです。 >ですので、条件別に1行ずつ違うプロパティ設定にしたいときは >非連結フォームに例えば10行分のコントロールを用意して、 やっぱりこうですかね...... >ADOかDAOでレコードセットを生成し、そこへレコード >セットの内容を表示するパターンでないとだめなような >気がします。 そのレコードセットの組み方自体が分からないのです。基本的な事ですが... >もしくは帳票フォームはあきらめて、単票フォームにするとか・・・。 一枚の伝票を一人分(代金を払ってくれるお客様一人)としていますので一人で何個頼むかは分かりません。ですので、何行でも追加出来、一目で見通せる帳票フォームにしているんです。修正もし易いですし。 しかし、もう少し調べてだめなようなら単票にするしかないかなと思っております。
- yosa
- ベストアンサー率16% (28/170)
正直・・・イメージができません。 要点だけをまとめてほしいのですが、私なりの解釈として 「大盛り小盛りの選択肢のあるメニューだけに、チェック ボックスを表示したいが、なぜか全てのメニューにチェック ボックスがついてしまう」 と言う風に読み取りましたがあたっていますか?。
補足
早速有り難うございます。 >と言う風に読み取りましたがあたっていますか?。 はい。当たっています。 本当は『不可視』ではなく『薄い表示&更新不可』にしたいのですが.......
お礼
丁寧なお答え有難うございます。 ここの文章を読んでいるだけでは分からない部分もありますが、その部分は自分で試しながら解決していきたいと思います。 貴重なご意見有難うございました。
補足
お礼を書いてしまってから、よく見直してみたのですが、新たな疑問が湧いてしまいました。 たとえば、 大盛等が出来る商品の中分類IDの範囲は決まっていますので、 それをフラグ代わりに使えないのでしょうか? あと、これは確認ですが、サブフォームにはチェックボックスが大盛用と小盛用、 2つ有るのですが、両方とも同じ式を入れれば良いですよね。 もうひとつ。 書いて頂いているif文にはthen以下が見当たらないのですが、これで大丈夫なのですね? 昔、N80-BASIC・N88-BASICをやっていて、古い書き方しか知らないもので.... お気に障ったら申し訳ありません。 ご紹介頂いた本も参考にしてみます。 有難うございます。