ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

システムエンジニアの部屋コミュのACCESSのフォーム作成について質問です

  • mixiチェック
  • このエントリーをはてなブックマークに追加
この場を借りて、ACCESSでのフォーム作成についてお聞きしたいことがあります。
(管理人様:突然このような質問を記載してすみません。こちらへの記載が間違っていましたら即削除させていただきますのでご指摘ください。)

私はSEではなくプログラマーなのですが、色々調べてみてもどうしてもわからず、こちらに記載致しました。
ACCESS初心者なので、おかしな事を言っている所があるかもしれませんが、間違いがありましたらご指摘お願いします。

フォーム(フォームAとします)を開く際に特定のレコードを表示させたいのですが、「DoCmd.OpenForm stDocName, , , 」後のwhere句の表記方法がわかりません。(stDocNameにはフォーム名を先で代入しております)

データの体系としては・・・
テーブル :ID(Integer)、日付(date)、他数項目
(同IDで日付違いのレコードがいくつかあります)
フォームA:上記テーブルの全項目を表示
フォームB:ID(Integer)
(既にテーブルに存在する値(ID)をコンボボックスより選んでもらう)
クエリ  :ID(Integer)、日付(date)
(テーブルよりIDごとに最新日付のものを抽出し、IDのみ表示する。フォームBのコンボボックスに使用)

フォームの仕様は・・・
フォームBで値(ID)を選ぶと、既に抽出されたクエリによりIDごとの最新日付がわかっているので、そのIDと最新日付によりテーブルから同じレコードを検索し、フォームAに表示させたいと思っています。

where句に指定するのは「コンボボックスより指定されたクエリのID・日付=テーブルのID・日付」だと思うのですが、表記方法がわかる方いましたら教えてください。

考え方が間違っていたり、もっと良い別の方法がありましたらご指摘ください。

よろしくお願いします。

コメント(15)

とりあえず専門コミュもあるみたいです。
Microsoft Office Access
 http://mixi.jp/view_community.pl?id=43464

質問が理解しきれていませんが、SQL 的にはこんな感じになるのでよろしいのですかねぇ。

 select * from TABLE where
  (FormB.ID = TABLE.ID) and (FormB.DATE = TABLE.DATE)

FormB にて指定された結果を条件に入れて値を出すのでよければ上記 SQL になります。
TABLE. や FormB. は適当に読み替えてください。
コンポボックスにIDと日付の両方持たせてあげればもっと楽な気が?
早速の返答ありがとうございます。
元々こちらのコミュニティーに参加していたので、こちらに書き込みさせていただきました。
ACCESSのみのコミュニティーもあるのですね、参考にしてみます。
ありがとうございます。

上記を参考に修正してみたのですが、「オブジェクトが必要です」というエラーになってしまいました。

DoCmd.OpenForm stDocName, , , (Me!ID = テーブル名.ID) And (Me!日付 = テーブル名.日付)

何か表記の仕方に問題があるのでしょうか?
詳しくはヘルプみてほしいけど
Where句もしくはFilter句で指定できます。
ここで指定するのは文字列なので
↓じゃぁだめです。あくまで引数を渡しているということを
忘れないでね。

>DoCmd.OpenForm stDocName, , , (Me!ID = テーブル名.ID) And (Me!日付 = テーブル名.日付)
ありがとうございます!
明日またがんばってみます!!
>えいたさん

ということは、私が抽出条件にしたいIDと日付ではDoCmd.OpenFormでは指定できないということでしょうか?
すみません、ヘルプやネットで色々見たのですがよくわかりませんでした・・・
別の方法でやろうかと検討中です。
ヒント

Me.Filter = "文字列A" And Me.Filter = "文字列B"
Me.FilterOn = True
じゅりさんありがとうございます。
ひとつ質問してもよろしいでしょうか?
文字列A/Bとありますが、この部分は文字列でなければならないとヘルプにも書いてあるのですが、文字列ではなく別フォームのコンボボックスより選択して取得された引数を設定することは不可能ということでしょうか?
無理やり文字列にしようとして""をつけるとパラメータを設定する画面が出てしまうので・・・

DoCmd.OpenForm stDocNameでも同じようなことになってしまいました。

ですので、今度はクエリを使ってやろうかと考えてるのですが、これでもまた抽出条件を設定するところでわからなくなってしまいました。

抽出条件をクエリにし、そのクエリでテーブルを作成するようにし、それをフォームAで開くようにしました。。。が、クエリの抽出条件の指定がおかしいらしく、うまく抽出してくれません。フォームBのコンボボックスから選んだ値(ID)をクエリで使うことはできないのでしょうか?
ちなみに、現在の抽出条件は↓こうなってます。

[Forms]![フォームB]![ID検索用コンボ]
(クエリでは、IDごとの最新日付レコードを抽出し、更にコンボボックスに選択されたIDとイコールのものを抽出しようとしています)

よろしくお願いします。
ありがとうございます。
上記を元に、
--------------------------------------------------------------------
stWhere = "ID=" & Me!ID検索用コンボ.Column(0)
stWhere = stWhere & " AND [日付]=#" & Me!ID検索用コンボ.Column(1) & "#"
stDocName = "ID発行変更申請一覧"
DoCmd.OpenForm stDocName, , , stWhere
--------------------------------------------------------------------
・・・というようにしてみました。
しかし、今度は「OpenFormアクションの実行はキャンセルされました」となってしまいました。
上記の部分に間違いがあるのでしょうか?
今、もう一度全体的に見直しているのですが・・・
ふむ・・・ここまで教えてもらって出来ないって・・・・
おっと最近 愚痴っぽくなっていけないね ここは優しくアドバイスでもw

いきなりコンボボックスの値を条件文として編集するんじゃなくて
自分で条件文を手で書いてみて正しく実行されるか確認する

例) stWhere = "ID = 1 AND 日付 = #2006/01/01#"

正しく実行されるならば stWhere を編集する段階の間違い
(ブレイクポイントをしてどのような編集結果になっているか確認する)
実行されないならば 考えている条件文自体が間違い
(何処が違っているのかよく考えてみる)

追記つーかヒントかな?
1.コンボボックスの値を参照する時はIndexを指定した方が良い
2.条件を指定する際には確実に何処の何が何かと等しいという具合に書く事

Aというテーブルを元にした"F_A"というフォームを
F_Bというフォームのコンボボックスから選択した値により
条件を指定するサンプルを作成してみました

iIx = Me.IDコンボ.ListIndex
stWhere = "A.ID = " & Me!IDコンボ.Column(0, iIx)
stWhere = stWhere & " AND A.日付 = #" & Me!IDコンボ.Column(1, iIx) & "#"
stDocName = "F_A"
DoCmd.OpenForm stDocName, , , stWhere

さぁて理解できましたかね?
ぴょんさん、こんばんわ。

説明が足らなくてすみません。
でも皆さんが説明してくれたおかげで
完成しました????


もしまだなら

「OpenFormアクションの実行はキャンセルされました」
は、下記のときにメッセージが表示された経験があります。

<発生条件>
抽出条件の書式が、
フィールドのデータ型と合っていないとき。
例)数値型なのに文字列で指定したりその逆だったり。
  日付型なのに指定を間違えたり。


コンボボックスの2列目は
ダイン・クガさんが書いてるように
YYYY/MM/DD書式になっていると思ってOKですよね?

ウォッチ式などで確認しながらステップ実行して
Where句に指定している内容を確認してみてください。
ありがとうございます!!
やっと出来ました!
ダイン・クガさんのアドバイスの通り、ブレイクポイントをしてみたところ、WHERE句だけ除くと通ったので、WHERE句だけに集中して考えながらえいたさんのアドバイスを読み返して、気が付きました。
元のテーブルのIDが数値ではなく文字列になっていたので型が合わなくてエラーになっていました。
まさかこんなところで間違っているとは思わなかったので・・・
恥ずかしいです。。でもやっと解決したので良かったです。
本当にありがとうございました!!
これからもっとACCESS勉強します!
解決してなによりですわ

>まさかこんなところで間違っているとは思わなかったので・・・

って先入観でプログラムを見ると深みにはまりますね
こんな時は隣に居る人でもひっつかまえて現象を順を追って
口頭で説明してみたりすると ピンとくるもんです
(最初こう書いて、こう変えて、こう変えて、こうやって・・とね)

プログラマとは言葉を紡ぐ職です
(勝手に私がそう解釈してるだけですけどね^^;)
Programer Pro=プロ gram=言葉 er が付いて 言葉を紡ぐプロ

頑張って下さいまし
http://mixi.jp/view_bbs.pl?id=4806644&comment_count=9&comm_id=43464

結果としてマルチポストになっており、
概算で…
4000人 * 3分 = 200h
1人/月あたりの費用を80万として換算すると
160h/月として100万ほどが無駄に…
…というのは冗談としてw

同様の意見交換を別コミュでも平行して行ってしまうので、非効率的になってしまいます。
マナー違反でもありますし、以後気をつけましょう。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

システムエンジニアの部屋 更新情報

システムエンジニアの部屋のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング