Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Access 2016)
レポート表示の補助元帳で、残高がおかしい
投稿日時: 19/04/16 14:51:54
投稿者: miyama2305

「フォームF帳簿作成」から補助元帳をレポート表示します。
このコードは、1999年に発刊された教科書のCD(access2000)をそのまま載せました。
そのCDで、補助元帳を表示したらこのように表示されます。
総勘定元帳は正しく表示されます
以下の形式です
T日常_3補助元帳(テーブル名)
日付/伝票番号/行番号/科目No/科目/諸口/補助No/補助/補助ID/相手科目No/相手科目/相手補助No/相手補助/相手補助ID/摘要/借方金額/貸方金額/残高
以下/借方金額/貸方金額/残高のみ表示します。
日付/借方金額/貸方金額/残高
1/5--\0-----\9,180--\5,010,960
1/6--\0------\4,725--\5,006,235
1/7--\0------\454,610-\4,551,625
1/8--\0------\5,250--\4,546,375
1/9--\0------\454,610-\4,091,765
1/10-\809,790-\0------\4,895,755
1/10-\0-------\5,800--\4,085,965
1/10-\100,000-\0-------\4,995,755
日付が同じの場合の残高ですが、最後の残は一致するのですが
1/10、4,091,765+809,790=4,901,555の残が4,895,755です
どうしてこうなるのかご指導お願いします。
インデックスの設定は
T日常_3補助元帳テーブルは、
インデックス名/フィールド名/並べ替え順序
科目No/科目No/昇順
------/補助科目/昇順
------/日付/昇順
------/伝票番号/昇順
------/行番号/昇順
です。
R日常_3補助元帳レポートは
グループ化/並べ替え/集計
科目No/昇順/値全体/集計なし/ヘッダーセクション付/フッターセクション付/グループをまとめない
補助No/昇順/値全体/集計なし/ヘッダーセクション付/フッターセクション付/グループをまとめない
日付/昇順/値全体/集計なし/ヘッダーセクション付/フッターセクション付/グループをまとめない
並べ替えキー/日付/昇順/値全体/集計なし/ヘッダーセクションなし/フッターセクションなし/グループをまとめない
並べ替えキー/伝票番号/昇順/値全体/集計なし/ヘッダーセクションなし/フッターセクションなし/グループをまとめない
並べ替えキー/行番号/昇順/値全体/集計なし/ヘッダーセクションなし/フッターセクションなし/グループをまとめない
です。
フォームF帳簿作成(コード)ですが以下です
 
Private Sub Form_Open(Cancel As Integer)
 
    '帳簿ごとの設定
    Select Case intChohyo
    
    Case conHojomoto
        lblタイトル.Caption = "補助元帳の作成"
        tblName = "T日常_3補助元帳"
        rptName = "R日常_3補助元帳"
        flm税処理.Visible = True
        If Not DFirst("業種区分", "MT基本情報") Then '非建設業の場合
            cbo科目.RowSource = "SELECT 勘定科目No, 勘定科目, 貸借区分, 補助設定 " & _
                                "FROM MT勘定科目 WHERE 補助設定 = -1 AND 分類ID<=24 " & _
                                "ORDER BY MT勘定科目.勘定科目No;"
            cbo科目2.RowSource = "SELECT 勘定科目No, 勘定科目, 貸借区分, 補助設定 " & _
                                "FROM MT勘定科目 WHERE 補助設定 = -1 AND 分類ID<=24 " & _
                                "ORDER BY MT勘定科目.勘定科目No;"
        Else '建設業者の場合
            cbo科目.RowSource = "SELECT 勘定科目No, 勘定科目, 貸借区分, 補助設定 " & _
                                "FROM MT勘定科目 WHERE 補助設定 = -1 " & _
                                "ORDER BY MT勘定科目.勘定科目No;"
            cbo科目2.RowSource = "SELECT 勘定科目No, 勘定科目, 貸借区分, 補助設定 " & _
                                "FROM MT勘定科目 WHERE 補助設定 = -1 " & _
                                "ORDER BY MT勘定科目.勘定科目No;"
        End If
   
補助元帳の作成コードでが、コードの読み取りが自身未熟のため
不足のコードがあるかもしれません。
すべてを掲載することは出来ます
 
Sub データ作成()
 'M //// 残高データの計算と更新 /////////////////////////////////////
            Dim kurikosi As Currency
            rstZan.MoveFirst
            Do Until rstZan.EOF
                intcode = rstZan![コード]
                If Not flgHojo Then
                    kurikosi = DLookup("残高", "T日常_0残高参照用", "帳簿No = " & intChohyo & " and コード = " & intcode)
                    strSQL = "SELECT 借方金額,貸方金額,残高 from " & tblName & " WHERE 科目No = " & intcode & ";"
                Else
                    intHojoID = rstZan![補助ID]
                    kurikosi = DLookup("残高", "T日常_0残高参照用", "帳簿No = " & intChohyo & " and コード = " & intcode & " and 補助ID = '" & intHojoID & "'")
                    strSQL = "SELECT 借方金額,貸方金額,残高 from " & tblName & " WHERE 科目No = " & intcode & " and 補助ID = '" & intHojoID & "';"
                End If
                Set rst = db.OpenRecordset(strSQL, dbOpenDynaset)
                If rst.EOF Then GoTo pas '残高はあるが、仕訳データがない場合、スキップ
                rst.MoveFirst
                Do Until rst.EOF
                    rst.Edit
                    rst![残高] = kurikosi + (Nz(rst![借方金額], 0) - Nz(rst![貸方金額], 0)) * IIf(rstZan![貸借区分] = "借+" Or rstZan![貸借区分] = "貸-", 1, -1)
                    rst.Update
                    kurikosi = rst![残高]
                    rst.MoveNext
                Loop
pas:
                rstZan.MoveNext
            Loop
            rstZan.Close: Set rstZan = Nothing
             
            'N //// 残高あり&仕訳データのない指定科目レコードの追加 /////////////////////////////////////
            If Not flgHojo Then
                strSQL = "INSERT INTO " & tblName & "( 科目No, 科目 ) " & _
                         "SELECT T日常_0残高参照用.コード,T日常_0残高参照用.勘定科目 " & _
                         "FROM T日常_0残高参照用 LEFT JOIN " & tblName & _
                         " ON T日常_0残高参照用.コード = " & tblName & ".科目No " & _
                         "GROUP BY 帳簿No,コード,勘定科目," & tblName & _
                         ".科目No,T日常_0残高参照用.残高 " & _
                         "HAVING 帳簿No =" & intChohyo & " AND " & tblName & _
                         ".科目No Is Null AND T日常_0残高参照用.残高 > 0;"
            Else
                strSQL = "INSERT INTO " & tblName & "( 科目No, 科目, 補助No, 補助 ) " & _
                         "SELECT T日常_0残高参照用.コード,T日常_0残高参照用.勘定科目," & _
                         "T日常_0残高参照用.補助No,T日常_0残高参照用.補助 " & _
                         "FROM T日常_0残高参照用 LEFT JOIN " & tblName & _
                         " ON T日常_0残高参照用.コード = " & tblName & _
                         ".科目No AND T日常_0残高参照用.補助No = " & tblName & ".補助No " & _
                         "GROUP BY 帳簿No,コード,勘定科目,T日常_0残高参照用.補助No," & _
                         "T日常_0残高参照用.補助," & tblName & ".科目No,T日常_0残高参照用.残高 " & _
                         "HAVING 帳簿No =" & intChohyo & " AND " & tblName & _
                         ".科目No Is Null AND T日常_0残高参照用.残高 > 0;"
            End If
            db.Execute strSQL
        End If
 
 
未熟なためですが、ご指導お願いします。
 
 
 

投稿日時: 19/04/17 09:17:52
投稿者: miyama2305

申し訳ありません
色々しらべたのですが、
以下の方法で残高の確認をしました。F8を使用しました
Sub zanndaka()
Dim rumSum As Currency
Dim RS As DAO.Recordset
Set RS = CurrentDb.OpenRecordset("T日常_3補助元帳", dbOpenTable)
RS.MoveFirst
Do Until RS.EOF
RS.Edit
rumSum = rumSum + Nz(RS!貸方金額) - Nz(RS!借方金額)
RS!残高 = rumSum
RS.Update
RS.MoveNext
Loop
RS.Close
Set RS = Nothing
End Sub
以下のように表示されました
1/5--\0-----\9,180--\5,010,960
1/6--\0------\4,725--\5,006,235
1/7--\0------\454,610-\4,551,625
1/8--\0------\5,250--\4,546,375
1/9--\0------\454,610-\4,091,765
1/10-\809,790-\0------
1/10-\0-------\5,800--\4,085,965
1/10-\100,000-\0-------
1/5の残は、前期繰越額が含まれています。
1行飛ばされて残高が表示されました。
その結果、おかしな残高が表示されたと思います
理由として考えられるのは、どのような場合で
しょうか。お願いします
 
 
 
 

投稿日時: 19/04/17 09:24:39
投稿者: miyama2305

間違えました
>rumSum = rumSum + Nz(RS!貸方金額) - Nz(RS!借方金額)
 
rumSum = rumSum + Nz(RS!借方金額) - Nz(RS!貸方金額)
です

回答
投稿日時: 19/04/17 16:54:10
投稿者: sk

引用:
tblName = "T日常_3補助元帳"

とりあえず、この変数がモジュールレベルの変数であると仮定します。
 
引用:
Sub データ作成()

引用:
strSQL = "SELECT 借方金額,貸方金額,残高 from " & tblName & " WHERE 科目No = " & intcode & ";"

引用:
strSQL = "SELECT 借方金額,貸方金額,残高 from " & tblName & " WHERE 科目No = " & intcode & " and 補助ID = '" & intHojoID & "';"

引用:
Set rst = db.OpenRecordset(strSQL, dbOpenDynaset)

変数 strSQL に代入されるそれぞれの SELECT 文において、
ORDER BY 句(レコードの並べ替え順)の指定がありません。
 
ORDER BY 句の指定がないクエリ( SELECT 文) や、
1 つのテーブルをそのまま参照するレコードセットにおける
レコードの並び順は、Access のデータシートビューで
表示される並び順とは必ずしも一致しません
 
したがって、現在のコードでは「意図されている並び順」と
「(残高計算時における)実際の並び順」が異なっている可能性があります。
 
引用:
以下の方法で残高の確認をしました。F8を使用しました

引用:
Set RS = CurrentDb.OpenRecordset("T日常_3補助元帳", dbOpenTable)

引用:
1行飛ばされて残高が表示されました。

つまり、ここでの確認方法も正しくないということです。
 
引用:
T日常_3補助元帳テーブルは、
インデックス名/フィールド名/並べ替え順序
科目No/科目No/昇順
------/補助科目/昇順
------/日付/昇順
------/伝票番号/昇順
------/行番号/昇順
です。

残高計算を行なう際のレコードの並べ替え順は、
上記のインデックス定義の通りになればよいのでしょうか。
 
引用:
補助元帳の作成コードでが、コードの読み取りが自身未熟のため
不足のコードがあるかもしれません。

伏せられた部分のコードに起因する不具合等に関しては
判りかねます。

投稿日時: 19/04/17 18:29:22
投稿者: miyama2305

 sk様
ありがとうございます。
 
指導いただいたorderの追加記述で
おこないます。
 
時間がかかりますので
お世話になりました。