- ベストアンサー
MS ACCESSで分割フォームの表示に関する問題
- MS ACCESSの分割フォームで表示される[合計金額]が全レコードに同じ値で表示され、選択しないと変わらない問題についての解決方法を知りたい。
- MS ACCESSの分割フォームで表示されるデータシートの[合計金額]が全レコードに同じ値で表示される問題について、解決策を教えてください。
- MS ACCESSの分割フォームで表示される[合計金額]が全レコードに同じ値で表示され、選択しないと変化しない問題に対する解決方法を教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (3)
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
お詫び: 完全に成功したのは2.2のみ! つまり、主表に列[売上金額総合計]を設け、サブフォームが更新された時にSQL文を発行し更新した時のみ、リアルタイムで、かつ、タイムラグなく表示が更新されます。 2.1のDBLookup()の場合、リアルタイム更新に問題があることが判明しました。よって、前回の質問の回答(=SQL文を発行し更新)をもう一度参考にされて下さい。 完全なテストを抜きに、第二案を提示したことをお詫びし訂正します。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
補足:なぜ、回答1なのか? CCur(DBLookup(XXXXX)) XXXXX="SELECT SUM(売上金額合計) FROM 売上伝票明細 WHERE 売上伝票_ID=" & [id] この式を、フォームのレコードソースに埋め込んで CCur(DBLookup(XXXXX)) As 売上金額合計 と列[売上金額合計]を生成します。 これで、 列[売上金額合計].レコードソース:売上金額合計 となります。 もちろん 列[売上金額合計].レコードソース:=CCur(DBLookup(XXXXX)) としても目的は達成できます。でも、この場合も、画面の表示にタイムラグが発生します。なぜなら、この時のレコードソースはフォームのレコードソースに含まれていないからです。ですから、やはり、フォームの表示において不具合が発生する可能性があります。 DBLookup(XXXXX) As 売上金額合計 CCur(DBLookup(XXXXX)) As 売上金額合計 この二つの式の違いは、戻り値のタイプの差です。書式を設定を利用する場合は、後者の方が簡単です。 ※フォームのレコードソースに埋め込んだデータの表示は確実に保証される。 ※表示後のデータのフォーム間参照の表示は100%は保証されない。 今回は、こういう現象です。 ですから、そもそも<売上金額合計>を主表[売上伝票]か>それとも、レコードソースでアペンドするのか?そういう策が浮上する訳です。 以上、回答1の意味を補足しておきます。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
Q、直す方法があったら知りたいです。 A、先ず、試すべきは<参照の中止>です。 【テーマ】 1.全体の設計を見直すのか? 2.それとも部分解決で逃れるのか? 1.おそらく、フォーム全体の設計の見直しは必須です。一般的な伝票入力フォームの体裁に戻すことが根本的な問題追放に繋がる筈です。 2.全体設計の見直しは先送りにし、幾つかの別の解決策を探ってみる。 2.1、メインフォームのレコードソースを見直す。 SELECT 売上伝票.ID, 売上伝票.日付, 売上伝票.伝票番号, DBLookup( "SELECT SUM(売上金額) FROM 売上伝票明細 WHERE 売上伝票_ID=" & [id]) AS 売上金額合計 FROM 売上伝票; 部分的には、参照のやり方の不具合が表面化したということだろうと推察します。そこで、一つには、次のようなDBLookup()を標準モジュールに登録しておいて関数でもって集計します。少しは、これで画面表示は改善します。 Public Function DBLookup(ByVal strQuerySQL As String, _ Optional ByVal ReturnValue = Null) As Variant On Error GoTo Err_DBLookup Dim DataValue Dim rst As ADODB.Recordset Set rst = New ADODB.Recordset With rst .Open strQuerySQL, _ CurrentProject.Connection, _ adOpenStatic, _ adLockReadOnly If Not .BOF Then .MoveFirst DataValue = .Fields(0) End If End With Exit_DBLookup: On Error Resume Next rst.Close Set rst = Nothing DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue) Exit Function Err_DBLookup: MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _ "・Err.Description=" & Err.Description & Chr$(13) & _ "・SQL Text=" & strQuerySQL, _ vbExclamation, " 関数エラーメッセージ" Resume Exit_DBLookup End Function 2.2、売上伝票明細の合計金額を主表に保存しておく。 これは、異論もありましょうが、まあ、後々の工程での処理を割愛する有力な手でもあります。この場合は、更に、部分解決としてはベストと言えるでしょう。 ※部分解決にとどまらず全体の体裁の見直しを!
お礼
いろいろ方法を考えて下さりありがとうございます!! ACCESSの構造をちゃんと理解していないと、やはり今後も機能を追加していくにあたって難しいですよね。。。 今回は知人の知恵を借りてDSUM関数で切り抜けました。 =DSum("[金額]","商品詳細","[フォームNo] = """ & [フォームNo] & """") "商品詳細"テーブル内の"金額"を、"フォームNo"が同じもの同士で集計して合計を求める。 これでタイムラグ無くデータシートビューの方にも反映されるようになりました。