- 締切済み
Accessのフォームで任意のレコードを表示させる方法
MS-Accessでの質問です。 帝国やTSRのような企業情報を基にしたT1_企業情報テーブルを作成し、それを元にクエリーやフォームを作成しました。 フォームは企業情報を網羅するもの(F1)と、取引情報を記入する為のもの(F2)です。 F1にはF2が開くようにするボタンを作りましたが、例えばF1で「00100」番の企業を表示していて、その企業との取引情報を入力しようとボタンをクリックしても、いつも必ず「00001」番目の企業が開いてしまいます。(最初のレコード) これを「00100」番目の企業が開くようにするにはどうすれば良いのでしょうか? 文字数制限があるのでより詳しい説明は補足でご説明致します。宜しくお願い致します。
- みんなの回答 (8)
- 専門家の回答
みんなの回答
- SAKUJOU
- ベストアンサー率26% (93/354)
ちょっと時間が経ちましたが、もう解決しちゃいましたかね? F2が開くようにするボタンのプロシジャに以下を追加すればいいと思います。 DoCmd.GoToRecord , , acGoTo, Forms!F1.Form.CurrentRecord いろいろ考えましたがこれが一番簡単かと。
- SAKUJOU
- ベストアンサー率26% (93/354)
>具体的なやり方を教えて頂ければ助かります。 少々時間を下さい。
- SAKUJOU
- ベストアンサー率26% (93/354)
今までのことをまとめますと、テーブルは2つになっているが、表示する項目がおおいので、フォームを2つに分けて、それぞれ表示したときに同じレコードを表示したいということでしょうか? この場合はF1を表示した時にレコード番号を記憶させておいて、F2を開いたときに、GOTOレコードで移動させればいいのではないでしょうか?
補足
>>今までのことをまとめますと、テーブルは2つになっているが、表示する項目がおおいので、フォームを2つに分けて、それぞれ表示したときに同じレコードを表示したいということでしょうか? その通りです。 >>この場合はF1を表示した時にレコード番号を記憶させておいて、F2を開いたときに、GOTOレコードで移動させればいいのではないでしょうか? 具体的なやり方を教えて頂ければ助かります。
- CHRONOS_0
- ベストアンサー率54% (457/838)
>これは取引内容の一件一件を記録するものではなく、 データベースなのに? せっかくの貴重なデータを捨ててしまうのですか? それに1対1のテーブルというのは特殊なものです 普通はひとつのテーブルにします 疑問いっぱいのシステムですが どうしても1対1のままやりたければやはり サブフォームが一番、それもいやなら この前回答したように、F2にF1の企業コードを抽出条件として渡せばいいでしょう
補足
仰る通りです。AccessはリレーショナルDBとして使ってこそ有効に使えるのは 私自身も解っております。 これらのテーブル(T1とT2とすると)は各々の主キーが同じですので、 クエリーで繋げて表示させればExcelの一つのシートのように全項目を表示します。 ですがユーザーがどのように使うのかまでは強制する筋合いはありませんので、 そのように使いたいと言う希望ですので何とか方法を考えている次第です。 >>せっかくの貴重なデータを捨ててしまうのですか? 別に当人はデータを捨てるつもりなんて無いと思いますが? 私は当人にはこんな事は言えませんが・・・
- CHRONOS_0
- ベストアンサー率54% (457/838)
>ですので、出来ればサブフォームを使うのではなく、 >F2単体を起動させてもF1で表示していた企業コードと同一の企業コードがF2でも開く方法 ということならF2のソースをF1の企業コードを抽出条件とするクエリにしてやればいいだけでは F2のソースの企業コードフィールドの抽出条件欄に =Forms!F1!企業コード ただし >T1とT2の主キーは「企業コード」です。 これはおかしいですよ T1とT2は1対多でないとだめなのですから T2の主キーは企業コードともうひとつのフィールドの2つで主キーにします でないとT2には1企業1レコードしか格納できなくなってしまいます
補足
>>ただし >>T1とT2の主キーは「企業コード」です。 >>これはおかしいですよ >>T1とT2は1対多でないとだめなのですから ご説明が足りずに誤解を招いてしまいました。 これは取引内容の一件一件を記録するものではなく、 公開されている(又は入手した)大規模な企業データを 利用しつつ、そこに1対1でオリジナルのデータを付け加えている ようなものです。 ですのである企業に対して取引内容が何万件と溜まって行くような 性質のものでは無いとの事です。
- SAKUJOU
- ベストアンサー率26% (93/354)
勘違いしました、考え方はNo.2さんのが正しいです。 フォームF1とF2では扱うテーブルは別々ですか? それとも同じ1つのテーブルを扱うのですか?
補足
企業情報が入っているテーブル = T1 で、 取引情報を入力するテーブル = T2 です。 T1とT2の主キーは「企業コード」です。 クエリーはT1とT2の主キー同士を結合しています。 F1はT1の、F2はT2の項目を各々表示・入力・編集させる為のものです。 F1にF2を表示(起動)させる為のボタンが設けてあり、これをクリックしてF2を表示させた時に、それまで見ていたF1と同じ企業が表示されないので、毎回F2の下の所のレコード番号の数字を直して表示させているので、F1と連動して同じ企業がF2でも開くようにならないものか?という質問です。 宜しくお願い致します。
- CHRONOS_0
- ベストアンサー率54% (457/838)
考え方がおかしいみたいですよ F2に入力するのは取引情報ですよね 新しい情報を入力するときにはF2にはまだ入っていないんじゃないの 目的の企業を表示してもそれは過去のレコードですよ こういう場合にはF1にサブフォームとしてF2をはめ込みます 企業番号でリンクしておけば F1で企業を選べばその企業の取引情報の一覧が表示されますし 新規レコード欄には企業番号がすでに入力されて表示されます
補足
ご回答有難うございます。 確かに仰る通りです。実は件のデータベースは別の方が作成したものです。 その方から質問され、私自身も色々と試してみましたが、同一企業コードの企業情報と取引情報を入力するには、F1の中にサブフォームを作成すれば良い事は分かります。 但し問題なのが、現在作成されているF1フォームに表示されている項目数が非常に多く、F1の中でも画面中段から下にタブコントロールを数枚設けて、その中に様々な情報を表示させているような状況です。 因みにF1で表示させている項目はT1(企業情報)のデータです。 T2の取引情報の内容をF2に表示させている状態です。 T2の項目数も非常に多い為、F2で表示されている項目もタブ2枚に分けているような状態です。 つまり、F1の下半分にF2をサブフォームで埋め込むのが常套手段なのでしょうが、項目数があまりにも多い為に、F1フォームにF2フォームを起動させるボタンを作ったのだけれども、F1で「丙」という企業を表示させていて、その企業との取引情報を入力しようとボタンを押してもいつも「甲」という企業が出てきてしまうので、何とかならないか?という質問なのです。 文字数制限の関係上、細かいポイントまでご説明出来ず済みませんでした。 ですので、出来ればサブフォームを使うのではなく、F2単体を起動させてもF1で表示していた企業コードと同一の企業コードがF2でも開く方法を教えて頂けないか?という事になります。 宜しくお願い致します。
- SAKUJOU
- ベストアンサー率26% (93/354)
ボタンに、以下を実行させてはだめですか? Private Sub ボタン_Click() DoCmd.GoToControl "企業コード" DoCmd.FindRecord クエリ, acAnywhere End Sub
補足
返事が遅くなって申し訳ありませんでした。 その後依頼者にはサブフォーム内で表示させればレコードがずれないので その方法を試すようにとアドバイスするに留まっていますが、当人は 一応それで納得しているようです。 ご教示頂いた方法を試みているのですが、これはF1内に配置している F2を開く為のボタンに追加するのですよね? ボタンのプロパティでコマンドボタンのイベントのクリック時に "F2を押す"となっていて、アクションが今は「フォームを開く」に なっているのを「プロシージャーの実行」を選択してプロシージャー 名の所に教えて頂いた式を書き込んでみました。 F1フォームを開いて件のボタンをクリックしたら 「式の中で'DoCmd'が参照されているため、1つ以上の式の検証に 失敗しました。Accessをサンドボックスモードで実行している場合、 安全とみなされる関数とプロパティだけが式の中で許可されます。」 と表示されてしまいました。