- ベストアンサー
フォームで前のレコードも表示させる
access2000です。 1つのフォームで、今のレコードと比較で前のレコードも表示させたいです。 具体的には フォームの左側は今表示しているデータ群 右側は、直前のレコード群を表示させたいです。 下にある移動ボタンに今のレコードが前から何番目か表示されていると思います。 あれの-1のレコードを表示させたいです。 どうすればいいでしょうか? お願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
全て想定しないとできない質問の様なので (処理の記述は全て VBA になりますが大丈夫ですか?) フォームの構成としては、 ・メインフォームがあり ・そこに埋め込みのサブフォームが左右に1対 (サブフォームコントロールは2つになりますが、埋め込むフォームは1つ) (また、表示形式は単票) 早速作ってみたいと思います。(以下手順で作れば、ソコソコ動くものが出来上がるかと) 以下のテーブル「T1」があったとします。 an | 順 | F1 | F2 | F3 | F4 1 | 1 | A1 | B1 | C1 | D1 2 | 2 | A2 | B2 | C2 | D2 3 | 3 | A3 | B3 | C3 | D3 4 | 4 | A4 | B4 | C4 | D4 an:オートナンバ このテーブルを元に、 フォームウィザードを使い、単票形式でフォーム「F_1S」を作成します。 レコードセレクタ部分はいらないので、プロパティを変更しておきます。 (デザインでみた感じは、添付図右上) メインのフォームをフォームデザインから作成していきます。 ・テキストボックス「txt1」を配置(本来非表示にしますが、今回はこのままで) ・サブフォームコントロールを左右に1対 (左側コントロール名を「FSUB1」、右側コントロール名を「FSUB2」に変更しておきます) ・非連結の単票というイメージなので、それなりのプロパティを変更しておきます (レコードセレクタ、移動ボタンなどなど:デザインでみた感じは、添付図左上) このフォーム名を「F_1M」と仮定します。 以下から、各フォームに処理を記述していきます。 【フォーム「F_1S」への記述】 Const EVENT_PROCEDURE As String = "[EVENT PROCEDURE]" Dim iMove As Long Private Sub Form_Open(Cancel As Integer) On Error GoTo ERR_EXIT iMove = Me.Parent.Tag If (iMove = 0) Then Me.AllowEdits = False Me.AllowAdditions = False Me.NavigationButtons = False End If Exit Sub ERR_EXIT: Cancel = True End Sub Private Sub Form_Current() Dim iNum As Long If (iMove <> 0) Then With Me.RecordsetClone iNum = 0 If (.RecordCount > 0) Then If (Me.NewRecord) Then .MoveLast iNum = .Fields("an") Else .Bookmark = Me.Bookmark .Move iMove If (Not .BOF) Then iNum = .Fields("an") End If End If End With Me.Parent.txt1 = iNum Me.OnCurrent = "" Me.Parent.Recalc Me.OnCurrent = EVENT_PROCEDURE End If End Sub 【フォーム「F_1M」への記述】 Private Sub Form_Open(Cancel As Integer) Me.txt1 = 0 Me.Tag = 0 With Me.FSUB2 .SourceObject = "F_1S" .LinkMasterFields = "txt1" .LinkChildFields = "an" End With Me.Tag = -1 Me.FSUB1.SourceObject = "F_1S" End Sub 各サブフォームコントロールへのフォーム割付けは、メインの「開く時」イベントで。 フォームがサブフォームとして組み込まれた時、メインの Tag 経由でどの動きをすればよいか通知します。 Tag が 0 だったら、 ・右側に配置されるのね ・なら、編集/追加を不可にして、移動ボタンを非表示にしましょうか Tag が <>0 ( -1 )だったら、元々の「F_1S」の状態のままで で、この Tag の内容を iMove に覚えておきます。 Tag = 0 なら、 サブフォームコントロールのリンク親/子フィールドを使って、表示を切り替えましょうか。 リンク親フィールド:txt1 リンク子フィールド:an フォーム「F_1S」での「レコード移動時」では、 ・右側(iMove = 0)なら何もしません 左側だった場合、 ・RecordsetClone を参照して前の「an」の値を求めます。 ・求まったら、親の txt1 に値を設定後、すぐに右側の表示を変えたいので、親を Recalc ・親を Recalc すると再度自分のレコード移動時も動いちゃうので、 一旦処理しない様にイベントを無効にして、Recalc 、再度イベントを有効 ここで、Recalc しなくても、ジワっていう感じで右側の表示は変わりますが・・・ 簡単に説明すると、上記のような感じになります。 今回レコードを一意に決めるフィールドに「an」(オートナンバ)を使いましたが、 一意にできるものが他にあれば an の記述部分、また、iNum 部分の型を変更してください。 また、同じフォーム「F_1S」を左右に表示しましたが、右用・左用と別々でも良いかと。 左側が Filter された場合は、Filter された中での 1 つ前が右側に表示されます。 添付画像左下:an = 1 で先頭を表示していた場合、右側は該当する「an」がないので空白 添付画像右下:an = 2 で、右はその前の an = 1 を表示 (これは an が、たまたま昇順になっていたから) いろいろ試してみてください。 動かないところがあったらごめんなさい。 (添付画像は 2007 でのものですが、2000 でもソコソコ動いてましたけど)
その他の回答 (3)
- kmetu
- ベストアンサー率41% (562/1346)
追加その2です 連番と書きましたが連番ではなくても、基本的に次のレコードの同じフィールドの値でしたらそれで大丈夫です。 例 親フィールド 子フィールド A B B C C D みたいな感じでもいけます。 ただ、連番のほうがデータを入力するときに、データ入力するフィールドどれかのイベントプロシージャに子フィールドになるフィールドに親フィールドの値+1を入力するコードを書いておけばいいので楽です。
お礼
ありがとうございました。
- kmetu
- ベストアンサー率41% (562/1346)
追加です もしくは、IDなどのように連番があるのでしたら、連番の次テーブルのIDの数値を入力するフィールド(たとえばID2とか)を追加します。 IDが10,11,12と続いていたらID2はそれぞれ11,12,13としておきます。 ID ID2 10 11 11 12 12 13 サブフォームのプロパティでリンク親フィールドをIDとしリンク子フィールドをID2とします。 以上でひとつ前のレコードがサブフォームに表示されます。
お礼
ありがとうございました。
- kmetu
- ベストアンサー率41% (562/1346)
一番簡単なのは上下になりますが、帳票フォームにして表示の高さを調整すればすればそれだけで済みます。左右にしたい場合、右側にサブフォームを作成して同じソースにし、親フォームのレコード移動時のイベントプロシージャに以下のページを参考にしてサブフォームに表示するレコードを選択するコードを作成してください。 http://www.tsware.jp/tips/tips_030.htm
お礼
ありがとうございました。
お礼
いろいろ勉強不足のようです(汗 ありがとうございました。