Access (VBA)

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

 
(Windows 10 Home : Access 2016)
工事台帳を連続印刷です。
投稿日時: 19/05/22 17:53:35
投稿者: miyama2305

フォーム名、F工事台帳作成で工事台帳出力設定を行います
テキストボックスは、txt開始日,txt終了日,cbo工事NO,txt工事名,cbo工事No2,txt工事名2
cmdプレビュー,cmd印刷です。
コードは以下です。
前期繰越は,MT工事前期繰越(テーブル)です。仕訳は,T工事仕訳伝票明細です。
前期繰越額および期中仕訳デーダを有する工事については正しく表示されます。
前期繰越額がなくて期中仕訳データがある場合にはエラーとなります。
 
H 残高の計算と更新 の
rstZan.MoveFirstでエラー3021 カレントレコードが
ありません。と表示されます。又
M 残高データの計算と更新
rstZan.MoveFirst
でエラー3021 カレントレコードが
ありません。と表示されます。

前期繰越額があって期中仕訳データがない場合にはエラーとなります。
「データが1件もありません」と表示されます。
 
上記の問題を、いろいろ試しましたが、わたしの能力ではダメでした。
どうかご指導お願いします。
 
 
Sub データ作成()
'A //// 変数の宣言 ほか /////////////////////////////////////
 
    Dim varStatus
    Dim date1 As Date, date2 As Date
    Dim kishu As Date, kimatu As Date
    Dim preJoken As String '繰越期間の条件(開始日までの繰越額を取得するのに必要)
    Dim strJoken As String '対象期間の条件(指定した期間)
    Dim flgOption As Boolean '残高計算が不要(借方のみ・摘要・マークに条件指定)
    Dim db As Database
    Dim rst As Recordset 'T_抽出作業用、tblName など
    Dim rstZan As Recordset 'T日常_0残高参照用
    Dim rstSum As Recordset '残高集計クエリー
    Dim strSQL As String
    'Dim intcode As Integer
    Dim intcode As Long
    Set db = CurrentDb
 
    DoCmd.Hourglass True
    varStatus = SysCmd(acSysCmdSetStatus, "集計しています。しばらくお待ちください...")
 
'B //// 抽出作業用の条件取得 /////////////////////////////////////
 
 '対象期間
    date1 = txt開始日
    date2 = txt終了日
    kishu = DFirst("期首日", "MT基本情報")
    kimatu = DFirst("期末日", "MT基本情報")
    preJoken = "(日付 >= #" & kishu & "# and 日付 < #" & date2 & "#)"
    If date1 = date2 Then
    strJoken = "日付 = #" & date1 & "#"
    Else
    strJoken = "(日付 >= #" & date1 & "# and 日付 <= #" & date2 & "#)"
    End If
    preJoken = preJoken & "and (工事NO >= " & cbo工事NO & " and 工事NO <= " & cbo工事No2 & ")"
    strJoken = strJoken & " and (工事NO >= " & cbo工事NO & " and 工事NO <= " & cbo工事No2 & ")"
              
 'C //// 指定条件の値の取得と更新 /////////////////////////////////////
    ' 指定条件の取得 T_工事指定条件に表示
    Dim zei As String, intMark As Integer
    Select Case intChohyo '税処理の条件取得
    Case conKouzi
    If flm税処理.Value = 1 Then zei = "税抜" Else zei = "税込"
    Case Else: zei = "税抜"
    End Select
    If Not DFirst("業者区分", "MT基本情報") Then zei = "入力" '免税事業者は入力金額で計算
 ' 指定条件データの更新
    strSQL = "UPDATE T_工事指定条件 SET 帳簿No = " & intChohyo & ", 税処理 = '" & zei & _
    "', 開始日 = #" & date1 & "#, 終了日 = #" & date2 & "#, " & _
    "工事No1 = " & Nz(cbo工事NO, "Null") & ", 工事名1 = '" & txt工事名 & "', " & _
    "工事No2 = " & Nz(cbo工事No2, "Null") & ", 工事名2 = '" & txt工事名2 & "', " & _
    "chk期間印刷 = " & chk期間 & " WHERE [帳簿No] = " & intChohyo & ";"
    Debug.Print strSQL
    db.Execute strSQL
 
   'D //// 残高参照用テーブルの用意 /////////////////////////////////////
    '1 既存レコードの削除
  strSQL = "delete * from T日常_0残高工事参照用 WHERE 帳簿No = " & intChohyo & ";"
    db.Execute strSQL
    '2 指定工事NOレコードの追加
 strSQL = "INSERT INTO T日常_0残高工事参照用 (帳簿No, 工事NO, [5412], [5431], [5433], [5434], [5435], [5441], [5453], [5455], [5456], [5458], [5459], [5461], [5467] ) " & _
               "SELECT " & intChohyo & " as 式1, 工事NO, [5412], [5431], [5433], [5434], [5435], [5441], [5453], [5455], [5456], [5458], [5459], [5461], [5467] " & _
"FROM MT工事前期繰越 WHERE 工事NO>=" & cbo工事NO & " And 工事NO<=" & cbo工事No2 & ";"
db.Execute strSQL
    '3 残高参照用テーブルのセット
  strSQL = "SELECT * FROM T日常_0残高工事参照用 WHERE 帳簿No = " & intChohyo & ";"
    Set rstZan = db.OpenRecordset(strSQL)
     
 ' ++++ 【繰越額データの作成】 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
    'E //// 開始残高データの更新 /////////////////////////////////////
  strSQL = "UPDATE T日常_0残高工事参照用 " & _
                 "INNER JOIN MT工事前期繰越 ON T日常_0残高工事参照用.工事NO = MT工事前期繰越.工事NO " & _
                 "SET T日常_0残高工事参照用.開始残高 = MT工事前期繰越![5412], MT工事前期繰越![5431], MT工事前期繰越![5433], MT工事前期繰越![5434], MT工事前期繰越![5435], MT工事前期繰越![5441], MT工事前期繰越![5453], MT工事前期繰越![5455], MT工事前期繰越![5456], MT工事前期繰越![5458], MT工事前期繰越![5459], MT工事前期繰越![5461], MT工事前期繰越![5467] " & _
                 "WHERE 帳簿No = " & intChohyo & ";"
    
   'F //// 繰越期間の抽出作業用テーブルの用意 /////////////////////////////////////
    Dim tdf As TableDef
    For Each tdf In db.TableDefs 'テーブル削除
    If tdf.Name = "T_工事抽出作業用" Then DoCmd.DeleteObject acTable, "T_工事抽出作業用": Exit For
    Next
    strSQL = "SELECT Q工事仕訳伝票明細.* INTO T_工事抽出作業用 " & _
                  "FROM Q工事仕訳伝票明細 WHERE " & preJoken & ";"
    db.Execute strSQL 'テーブル作成
 
err_shori:
 'H //// 残高の計算と更新 /////////////////////////////////////
 
rstZan.MoveFirst
Do Until rstZan.EOF
rstZan.Edit
rstZan![残高] = rstZan![5412] + rstZan![5431] + rstZan![5433] + rstZan![5434] + rstZan![5435] + rstZan![5441] + rstZan![5453] + rstZan![5455] + rstZan![5456] + rstZan![5458] + rstZan![5459] + rstZan![5461] + rstZan![5467]
rstZan.Update
rstZan.MoveNext
 Loop
' rst.Close: Set rst = Nothing
 
'【工事台帳のテーブル作成】
'J //// 対象期間の抽出作業用テーブルの用意 /////////////////////////////////////
DoCmd.DeleteObject acTable, "T_工事抽出作業用" 'テーブル削除
strSQL = "SELECT Q工事仕訳伝票明細.* INTO T_工事抽出作業用 FROM Q工事仕訳伝票明細 WHERE " & strJoken & ";"
db.Execute strSQL 'テーブル作成
'K //// 工事台帳テーブルの用意 /////////////////////////////////////
        'テーブル削除
        For Each tdf In db.TableDefs
            If tdf.Name = tblName Then DoCmd.DeleteObject acTable, tblName: Exit For
        Next
        'テーブル作成
        Dim idx As Index, fld As Field
        Set tdf = db.CreateTableDef(tblName)
        Set idx = tdf.CreateIndex("工事NO")
        With idx
            .Fields.Append .CreateField("工事NO")
             .Fields.Append .CreateField("日付")
            .Fields.Append .CreateField("伝票番号")
            .Fields.Append .CreateField("行番号")
        End With
        tdf.Indexes.Append idx
        tdf.Indexes.Refresh
        With tdf
            .Fields.Append .CreateField("工事NO", dbLong)
            .Fields.Append .CreateField("日付", dbDate)
            .Fields.Append .CreateField("伝票番号", dbLong)
            .Fields.Append .CreateField("行番号", dbLong)
            Set fld = .CreateField("相手科目", dbText, 20)
            fld.AllowZeroLength = True
            .Fields.Append fld
           .Fields.Append .CreateField("補助科目", dbInteger)
           fld.AllowZeroLength = True
     
            Set fld = .CreateField("摘要コード", dbText, 20)
            fld.AllowZeroLength = True
            fld.AllowZeroLength = True
            .Fields.Append fld
            Set fld = .CreateField("摘要", dbText, 20)
            fld.AllowZeroLength = True
            .Fields.Append fld
            .Fields.Append .CreateField("5412", dbCurrency)
            .Fields.Append .CreateField("5431", dbCurrency)
            .Fields.Append .CreateField("5433", dbCurrency)
            .Fields.Append .CreateField("5434", dbCurrency)
            .Fields.Append .CreateField("5435", dbCurrency)
            .Fields.Append .CreateField("5441", dbCurrency)
            .Fields.Append .CreateField("5453", dbCurrency)
            .Fields.Append .CreateField("5455", dbCurrency)
            .Fields.Append .CreateField("5456", dbCurrency)
            .Fields.Append .CreateField("5458", dbCurrency)
            .Fields.Append .CreateField("5459", dbCurrency)
            .Fields.Append .CreateField("5461", dbCurrency)
            .Fields.Append .CreateField("5467", dbCurrency)
            .Fields.Append .CreateField("残高", dbCurrency)
        End With
        db.TableDefs.Append tdf
        db.TableDefs.Refresh
        Set tdf = Nothing
 
'L //// 工事原価レコードの追加 /////////////////////////////////////(抽出作業用→各種帳簿テーブル)
'1 データ追加
    strSQL = "INSERT INTO " & tblName & " (工事NO, 日付, 伝票番号, 行番号, 相手科目, 補助科目," & _
    "摘要コード, 摘要, [5412], [5431], [5433], [5434], [5435], [5441], [5453], [5455], [5456], [5458], [5459], [5461], [5467]) " & _
    "SELECT 工事NO, 日付, 伝票番号, 行番号, 相手科目, 補助科目," & _
    "摘要コード, 摘要, [5412], [5431], [5433], [5434], [5435], [5441], [5453], [5455], [5456], [5458], [5459], [5461], [5467] " & _
    "FROM T_工事抽出作業用 " & _
    "WHERE 工事NO >= " & cbo工事NO & " and 工事NO <= " & cbo工事No2 & ";"
 db.Execute strSQL
 
  'M //// 残高データの計算と更新 /////////////////////////////////////
Dim kurikosi As Currency
rstZan.MoveFirst
Do Until rstZan.EOF
intcode = rstZan![工事NO]
kurikosi = DLookup("残高", "T日常_0残高工事参照用", "帳簿No = " & intChohyo & " and 工事NO = " & intcode)
strSQL = "SELECT [工事NO],[5412],[5431],[5433],[5434],[5435],[5441],[5453],[5455],[5456],[5458],[5459],[5461],[5467],[残高] from " & tblName & " WHERE 工事NO = " & intcode & ";"
Set rst = db.OpenRecordset(strSQL, dbOpenDynaset)
If rst.EOF Then GoTo pas '残高はあるが、仕訳データがない場合、スキップ
rst.MoveFirst
Do Until rst.EOF
rst.Edit
rst![残高] = kurikosi + (Nz(rst![5412], 0) + Nz(rst![5431], 0) + Nz(rst![5433], 0) + Nz(rst![5434], 0) + Nz(rst![5435], 0) + Nz(rst![5441], 0) + Nz(rst![5453], 0) + Nz(rst![5455], 0) + Nz(rst![5456], 0) + Nz(rst![5458], 0) + Nz(rst![5459], 0) + Nz(rst![5461], 0) + Nz(rst![5467], 0))
rst.Update
kurikosi = rst![残高]
rst.MoveNext
Loop
pas:
rstZan.MoveNext
Loop
rstZan.Close: Set rstZan = Nothing
 
 
 
 
'O //// データ件数チェックと仕上げ //////////////////////////////////////
        Set rst = db.OpenRecordset(tblName)
        If rst.EOF Then '残高のチェック
            rst.Close
            Set rst = db.OpenRecordset("select 残高 from T日常_0残高工事参照用 where 帳簿No = " & intChohyo)
            kurikosi = 0
            rst.MoveFirst
            Do Until rst.EOF
                kurikosi = kurikosi + Nz(rst![残高], 0)
                rst.MoveNext
            Loop
            If kurikosi = 0 Then MsgBox "該当するデータがありません。", vbInformation: GoTo err_shori
        End If
        rst.Close: Set rst = Nothing
        db.Close: Set db = Nothing
     
'P//// 終了処理とエラーサブルーチン //////////////////////////////////////
    DoCmd.Close acForm, "F工事台帳作成"
    DoCmd.Hourglass False
    varStatus = SysCmd(acSysCmdClearStatus)
    Exit Sub
'err_shori:
    DoCmd.Hourglass False
    varStatus = SysCmd(acSysCmdClearStatus)
    If err.Number = 3011 Then Resume Next
        'オブジェクト <オブジェクト名> は見つかりませんでした。
        'オブジェクトが存在しているか、または名前やパス名が正しいかを確認してください。
    If err.Number <> 0 Then MsgBox err.Number & vbCrLf & err.Description
    End
End Sub
 
 
 
 
 
 
 
ここからはレポートコードです。
名前はR日常_6工事台帳です。


 
 
 
 
Option Explicit
Dim db As Database
Dim rstJoken As Recordset 'T_指定条件
Dim rstZan As Recordset 'T日常_0残高参照用
Dim kurikosi, kuri5412, kuri5431, kuri5433, kuri5434, kuri5435, kuri5441, kuri5453, _
kuri5455, kuri5456, kuri5458, kuri5459, kuri5461, kuri5467 As Long
Dim tuki5412kei, tuki5431kei, tuki5433kei, tuki5434kei, tuki5435kei, tuki5441kei, _
tuki5453kei, tuki5455kei, tuki5456kei, tuki5458kei, tuki5459kei, _
tuki5461kei, tuki5467kei As Long
Dim kei5412, kei5431, kei5433, kei5434, kei5435, kei5441, _
 kei5453, kei5455, kei5456, kei5458, kei5459, _
kei5461, kei5467 As Long
Private Sub Report_Open(Cancel As Integer)
Dim strSQL As String
Dim flgWareki As Boolean
intChohyo = conMoto
Set db = CurrentDb
Set rstJoken = db.OpenRecordset(Me.RecordSource)
If rstJoken.EOF Then MsgBox "データが1件もありません", vbInformation: End
If DFirst("日付の書式", "MT基本情報") = "和暦" Then flgWareki = True Else flgWareki = False
txt期間1.Format = IIf(flgWareki, "ggge年m月d日", "yyyy / mm / dd")
txt期間2.Format = IIf(flgWareki, "ggge年m月d日", "yyyy / mm / dd")
strSQL = "SELECT * FROM T_指定条件 where 帳簿No = " & intChohyo
Set rstJoken = db.OpenRecordset(strSQL)
lbl税処理.Visible = DFirst("業者区分", "MT基本情報")
End Sub
 
Private Sub ページヘッダー_Format(Cancel As Integer, FormatCount As Integer)
'条件の代入
If rstJoken![摘要] = "" Then txt摘要.Visible = False _
    Else txt摘要.Visible = True: txt摘要 = rstJoken![摘要]
If rstJoken![Mark] > 0 Then
      txtマーク = IIf(rstJoken![Mark] = 1, "あり", "なし")
 Else: txtマーク.Visible = False
   End If
    '★
   
If rstJoken![chk期間印刷] = True Then
txt期間1 = rstJoken![開始日]
txt期間2 = rstJoken![終了日]
Else
lbl期間.Visible = False
End If
End Sub
Private Sub G科目Noヘッダー_Format(Cancel As Integer, FormatCount As Integer)
Dim strSQL As String
strSQL = "select * from T日常_0残高工事参照用 where 帳簿No = 6 and 工事NO = " & [工事NO] & ";"
Set rstZan = db.OpenRecordset(strSQL) '繰越額の取得用
If rstZan.EOF Then Cancel = True: Exit Sub
kurikosi = Nz(rstZan![残高], 0) '残高計算不要の条件の場合にNullとなる
kuri5412 = Nz(rstZan![5412], 0)
kuri5431 = Nz(rstZan![5431], 0)
kuri5433 = Nz(rstZan![5433], 0)
kuri5434 = Nz(rstZan![5434], 0)
kuri5435 = Nz(rstZan![5435], 0)
kuri5441 = Nz(rstZan![5441], 0)
kuri5453 = Nz(rstZan![5453], 0)
kuri5455 = Nz(rstZan![5455], 0)
kuri5456 = Nz(rstZan![5456], 0)
kuri5458 = Nz(rstZan![5458], 0)
kuri5459 = Nz(rstZan![5459], 0)
kuri5461 = Nz(rstZan![5461], 0)
kuri5467 = Nz(rstZan![5467], 0)
    
zenzan = kurikosi '繰越額の代入
zen5412 = kuri5412
zen5431 = kuri5431
zen5433 = kuri5433
zen5434 = kuri5434
zen5435 = kuri5435
zen5441 = kuri5441
zen5453 = kuri5453
zen5455 = kuri5455
zen5456 = kuri5456
zen5458 = kuri5458
zen5459 = kuri5459
zen5461 = kuri5461
zen5467 = kuri5467
   
kei5412 = 0
kei5431 = 0
kei5433 = 0
kei5434 = 0
kei5435 = 0
kei5441 = 0
kei5453 = 0
kei5455 = 0
kei5456 = 0
kei5458 = 0
kei5459 = 0
kei5461 = 0
kei5467 = 0
     
If IsNull([残高]) And Not rstJoken![option条件] Then _
txt累計2.Visible = True Else txt累計2.Visible = False
End Sub
Private Sub G月次ヘッダー_Format(Cancel As Integer, FormatCount As Integer)
      '月が変わると初期化
tuki5412kei = 0
tuki5431kei = 0
tuki5433kei = 0
tuki5434kei = 0
tuki5435kei = 0
tuki5441kei = 0
tuki5453kei = 0
tuki5455kei = 0
tuki5456kei = 0
tuki5458kei = 0
tuki5459kei = 0
tuki5461kei = 0
tuki5467kei = 0
    End Sub
Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer)
     
kei5412 = kei5412 + Nz([5412], 0)
kei5431 = kei5431 + Nz([5431], 0)
kei5433 = kei5433 + Nz([5433], 0)
kei5434 = kei5434 + Nz([5434], 0)
kei5435 = kei5435 + Nz([5435], 0)
kei5441 = kei5441 + Nz([5441], 0)
kei5453 = kei5453 + Nz([5453], 0)
kei5455 = kei5455 + Nz([5455], 0)
kei5456 = kei5456 + Nz([5456], 0)
kei5458 = kei5458 + Nz([5458], 0)
kei5459 = kei5459 + Nz([5459], 0)
kei5461 = kei5461 + Nz([5461], 0)
kei5467 = kei5467 + Nz([5467], 0)
     
     
     
tuki5412kei = tuki5412kei + Nz([5412], 0)
tuki5431kei = tuki5431kei + Nz([5431], 0)
tuki5433kei = tuki5433kei + Nz([5433], 0)
tuki5434kei = tuki5434kei + Nz([5434], 0)
tuki5435kei = tuki5435kei + Nz([5435], 0)
tuki5441kei = tuki5441kei + Nz([5441], 0)
tuki5453kei = tuki5453kei + Nz([5453], 0)
tuki5455kei = tuki5455kei + Nz([5455], 0)
tuki5456kei = tuki5456kei + Nz([5456], 0)
tuki5458kei = tuki5458kei + Nz([5458], 0)
tuki5459kei = tuki5459kei + Nz([5459], 0)
tuki5461kei = tuki5461kei + Nz([5461], 0)
tuki5467kei = tuki5467kei + Nz([5467], 0)
     
End Sub
 
Private Sub G月次フッター_Format(Cancel As Integer, FormatCount As Integer)
'If rstZan.EOF Then Cancel = True: Exit Sub
txt5412月計 = tuki5412kei
txt5431月計 = tuki5431kei
txt5433月計 = tuki5433kei
txt5434月計 = tuki5434kei
txt5435月計 = tuki5435kei
txt5441月計 = tuki5441kei
txt5453月計 = tuki5453kei
txt5455月計 = tuki5455kei
txt5456月計 = tuki5456kei
txt5458月計 = tuki5458kei
txt5459月計 = tuki5459kei
txt5461月計 = tuki5461kei
txt5467月計 = tuki5467kei
     
If IsNull(日付) Then Cancel = True: Exit Sub
lbl月計.Caption = StrConv(Month(日付), vbWide) & " 月 計"
End Sub
Private Sub G科目Noフッター_Format(Cancel As Integer, FormatCount As Integer)
txt5412計 = kuri5412 + kei5412
txt5431計 = kuri5431 + kei5431
txt5433計 = kuri5433 + kei5433
txt5434計 = kuri5434 + kei5434
txt5435計 = kuri5435 + kei5435
txt5441計 = kuri5441 + kei5441
txt5453計 = kuri5453 + kei5453
txt5455計 = kuri5455 + kei5455
txt5456計 = kuri5456 + kei5456
txt5458計 = kuri5458 + kei5458
txt5459計 = kuri5459 + kei5459
txt5461計 = kuri5461 + kei5461
txt5467計 = kuri5467 + kei5467
End Sub
Private Sub Report_Close()
On Error Resume Next
rstZan.Close: Set rstZan = Nothing
rstJoken.Close: Set rstJoken = Nothing
db.Close: Set db = Nothing
End Sub

回答
投稿日時: 19/05/23 10:37:19
投稿者: sk

引用:
H 残高の計算と更新 の
rstZan.MoveFirstでエラー3021 カレントレコードが
ありません。と表示されます。

引用:
strSQL = "SELECT * FROM T日常_0残高工事参照用 WHERE 帳簿No = " & intChohyo & ";"
Set rstZan = db.OpenRecordset(strSQL)

・変数 intChohyo がどこで宣言されているのかが不明。
 
・変数 intChohyo にいつどんな値が代入されたのかが不明。
 
いずれにせよ、テーブルに[T日常_0残高工事参照用]のうち
フィールド[帳簿No]の値が変数 intChohyo の値に等しい
レコードの件数が 0 件だから MoveFirst メソッドを
実行出来ない(どのレコードにも移動のしようがない)のでしょう。
 
引用:
M 残高データの計算と更新
rstZan.MoveFirst
でエラー3021 カレントレコードが
ありません。と表示されます。

同上。
 
引用:
'D //// 残高参照用テーブルの用意 /////////////////////////////////////
'1 既存レコードの削除
strSQL = "delete * from T日常_0残高工事参照用 WHERE 帳簿No = " & intChohyo & ";"
db.Execute strSQL
'2 指定工事NOレコードの追加
strSQL = "INSERT INTO T日常_0残高工事参照用 (帳簿No, 工事NO, [5412], [5431], [5433], [5434], [5435], [5441], [5453], [5455], [5456], [5458], [5459], [5461], [5467] ) " & _
         "SELECT " & intChohyo & " as 式1, 工事NO, [5412], [5431], [5433], [5434], [5435], [5441], [5453], [5455], [5456], [5458], [5459], [5461], [5467] " & _
         "FROM MT工事前期繰越 WHERE 工事NO>=" & cbo工事NO & " And 工事NO<=" & cbo工事No2 & ";"
db.Execute strSQL

現時点で申し上げられるのは、テーブル[MT工事前期繰越]のうち、
フィールド[工事NO]の値がコンボボックス[cbo工事NO]の値以上であり、
かつフィールド[工事NO]の値がコンボボックス[cbo工事No2]の値以下である
レコードが存在しなければ、[T日常_0残高工事参照用]には何のレコードも
追加されず、rstZan によって参照されるレコードセットのレコード件数も
0 件になるはずである、ということだけです。
 
引用:
ここからはレポートコードです。

今それを挙げる必要はないと思います。
(件のエラーとは関係がない)

回答
投稿日時: 19/05/23 12:25:10
投稿者: Suzu

コード詳しくは見ていません。
  
どうにかしたいのは判るのですが、
エラーが出る要因は、すでに sk さんが回答くださっています。
  
じゃぁ、それをどうしたいの?
つまり、その場合の出力をどうしたいの?が無いと回答者には判りませんよね。
  
元々エラーになるレコードを出力しない様にする(抽出条件 または 予め削除しておく)
レコードが無いからエラーになるのですからレコードが有る様にダミーのレコードを追加しておく
  
等は出来るのでは?
 
 
業務でメンテナンスできない様なコードがあるなら
できるベンダーさんに頼む等の方が本筋と思いますよ。

投稿日時: 19/05/24 10:41:14
投稿者: miyama2305

 sk様 ありがとうございます
 
レポートで表示する帳簿は
仕訳日記帳、総勘定元帳、補助元帳、現金出納帳、預金出納帳、工事台帳です。
テーブル名T_指定条件には
行は、帳簿NO/帳簿名/税処理/年月1/年月2/開始日/終了日/科目NO1/科目1/科目NO2/科目2/等です
------1-------仕訳日記帳/税抜/
------2-------総勘定元帳/税抜/
------3-------補助元帳--/税抜/
------4-------現金出納帳/税抜/
------5-------預金出納帳/税抜
   
テーブル名T_工事指定条件には
帳簿NO/帳簿名/税処理/年月1/年月2/開始日/終了日/工事No1/工事名1/工事No2/工事名2/です
----6---/工事台帳/税抜/
 
T_指定条件は借方金額、貸方金額、残高を表示
 
T_工事指定条件は
5412(材料費), 5431(労務費), 5433(外注費), 5434(法定福利費), 5435(福利厚生費),
5441(外注労務費), 5453(保険料), 5455(減価償却費), 5456(機械損料)
, 5458(車両燃料費), 5459(修繕費), 5461(消耗品費),5467(雑費),残高
を表示するためテーブルを別にしました。
 
工事原価コードは変更不可にしており原価科目名は変更できるため原価コードで設定
しています。
 
フォーム名、工事台帳作成
を開く時のコードに
Private Sub Form_Open(Cancel As Integer)
On Error GoTo err_shori
Dim flgWareki As Boolean
    If intChohyo = 0 Then
        MsgBox "作成する帳票が不明です。メニューから呼び出してください。", vbInformation
        DoCmd.SelectObject acForm, "Fメニュー"
        Cancel = True: Exit Sub
    End If
cbo工事NO.RowSource = "SELECT T工事一覧表.工事No,T工事一覧表.工事名 FROM T工事一覧表 ORDER BY T工事一覧表.ID;"
cbo工事No2.RowSource = "SELECT T工事一覧表.工事No,T工事一覧表.工事名 FROM T工事一覧表 ORDER BY T工事一覧表.ID;"
 
'帳簿の設定
Select Case intChohyo
  Case conKouzi
   
       tblName = "T日常_6工事台帳"
        rptName = "R日常_6工事台帳"
        End Select
err_shori:
    If err.Number = 2489 Then DoCmd.OpenForm "Fメニュー": Resume Next
End Sub
 
その下に
 
Private Sub cmdプレビュー_Click()
Call データ作成
DoCmd.OpenReport rptName, acViewPreview
End Sub
 
Sub データ作成() を表示しています。
 
>・変数 intChohyo がどこで宣言されているのかが不明。
6を表示します。
 
すいません、ご指導お願いします。
 
 
Suzu様ありがとうございます
 
 

回答
投稿日時: 19/05/24 10:59:59
投稿者: sk

引用:
>・変数 intChohyo がどこで宣言されているのかが不明。
6を表示します。

変数 intChohyo のその時の値が 6 であるということは、
 
引用:
strSQL = "SELECT * FROM T日常_0残高工事参照用 WHERE 帳簿No = " & intChohyo & ";"
Set rstZan = db.OpenRecordset(strSQL)

フィールド[帳簿No]の値が 6 であるレコードが
テーブル[T日常_0残高工事参照用]に存在していないのでしょう。
(何故そうなっているのかは、先の回答で示した通りです)

投稿日時: 19/05/25 10:12:06
投稿者: miyama2305

sk様
ありがとうございます
 
工事NOには、前期繰越額がある工事とない工事がありますから
以下のコードに
If rstZan.EOF Thenを追加して、前期繰越額があれば残高計算を行い
ない場合はスルーするようにしました。
 ただrst.Close: Set rst = Nothingでエラーになるため
' rst.Close: Set rst = Nothingとしました。
この方法で、うまくいきました。
 'H //// 残高の計算と更新 /////////////////////////////////////
If rstZan.EOF Then
MsgBox "対応する工事NOの前期繰越額はありません"
Else
rstZan.MoveFirst
Do Until rstZan.EOF
rstZan.Edit
rstZan![残高] = rstZan![5412] + rstZan![5431] + rstZan![5433] + rstZan![5434] + rstZan![5435] + rstZan![5441] + rstZan![5453] + rstZan![5455] + rstZan![5456] + rstZan![5458] + rstZan![5459] + rstZan![5461] + rstZan![5467]
rstZan.Update
rstZan.MoveNext
 Loop
' rst.Close: Set rst = Nothing
End If
 
 
問題は以下のコードですが、前期繰越額及び期中仕訳がある場合は計算しますが
前期繰越額及び期中仕訳いづれかがない場合がわかりません。
試したのですうまくいきません。
どうかご指導お願いします。
 'M //// 残高データの計算と更新 /////////////////////////////////////
Dim kurikosi As Currency
rstZan.MoveFirst
Do Until rstZan.EOF
intcode = rstZan![工事NO]
kurikosi = DLookup("残高", "T日常_0残高工事参照用", "帳簿No = " & intChohyo & " and 工事NO = " & intcode)
strSQL = "SELECT [工事NO],[5412],[5431],[5433],[5434],[5435],[5441],[5453],[5455],[5456],[5458],[5459],[5461],[5467],[残高] from " & tblName & " WHERE 工事NO = " & intcode & ";"
Set rst = db.OpenRecordset(strSQL, dbOpenDynaset)
If rst.EOF Then GoTo pas '残高はあるが、仕訳データがない場合、スキップ
rst.MoveFirst
Do Until rst.EOF
rst.Edit
rst![残高] = kurikosi + (Nz(rst![5412], 0) + Nz(rst![5431], 0) + Nz(rst![5433], 0) + Nz(rst![5434], 0) + Nz(rst![5435], 0) + Nz(rst![5441], 0) + Nz(rst![5453], 0) + Nz(rst![5455], 0) + Nz(rst![5456], 0) + Nz(rst![5458], 0) + Nz(rst![5459], 0) + Nz(rst![5461], 0) + Nz(rst![5467], 0))
rst.Update
kurikosi = rst![残高]
rst.MoveNext
Loop
pas:
rstZan.MoveNext
Loop
rstZan.Close: Set rstZan = Nothing
 
 
 
 
 
 

回答
投稿日時: 19/05/27 10:25:36
投稿者: sk

引用:
問題は以下のコードですが、前期繰越額及び期中仕訳がある場合は計算しますが

・「前期繰越額」や「期中仕訳」が具体的に何を指しているのかが不明。
 (モジュールに記述されているどのテーブル/フィールドにも
  それらに該当する名前は見当たらない)
 
引用:
前期繰越額及び期中仕訳いづれかがない場合がわかりません。

・「前期繰越額及び期中仕訳いづれかがない場合」が
 具体的に何がどのような状態であることを意味しているのかが不明。
 
・「前期繰越額及び期中仕訳いづれかがない場合」に
 どんな計算処理を行ないたいのか(目的)が不明。
 
・現在記述されているコードを実行した結果、
 どのような問題が生じているのかが不明。
 
引用:
strSQL = "SELECT [工事NO],[5412],[5431],[5433],[5434],[5435],[5441],[5453],[5455],[5456],[5458],[5459],[5461],[5467],[残高] from " & tblName & " WHERE 工事NO = " & intcode & ";"
Set rst = db.OpenRecordset(strSQL, dbOpenDynaset)

引用:
Do Until rst.EOF
rst.Edit
rst![残高] = kurikosi + (Nz(rst![5412], 0) + Nz(rst![5431], 0) + Nz(rst![5433], 0) + Nz(rst![5434], 0) + Nz(rst![5435], 0) + Nz(rst![5441], 0) + Nz(rst![5453], 0) + Nz(rst![5455], 0) + Nz(rst![5456], 0) + Nz(rst![5458], 0) + Nz(rst![5459], 0) + Nz(rst![5461], 0) + Nz(rst![5467], 0))
rst.Update
kurikosi = rst![残高]
rst.MoveNext
Loop

・変数 strSQL に格納されている SELECT 文に ORDER BY 句の指定がない
 (ので累計の順序を狂っている可能性がある)。

投稿日時: 19/05/28 11:40:50
投稿者: miyama2305

 sk様 ありがとうございます。
 
>「前期繰越額」や「期中仕訳」が具体的に何を指しているのかが不明。
>(モジュールに記述されているどのテーブル/フィールドにも
> それらに該当する名前は見当たらない)
申し訳ありません。
コードに記述した名称で説明しなけらばなりませんでした。
前期繰越額はT日常_0残高工事参照用です。
期中仕訳はT日常_6工事台帳です。
 
>「前期繰越額及び期中仕訳いづれかがない場合」が
> 具体的に何がどのような状態であることを意味しているのかが不明。
 >・「前期繰越額及び期中仕訳いづれかがない場合」に
> どんな計算処理を行ないたいのか(目的)が不明。
HのコードはT日常_0残高工事参照用に、印刷したい工事NOに対する前期の繰越額が
表示されます。その合計を「残高」に計算表示するコードです。
前期の繰越額があれば問題ないですが、ない場合には説明し又指導いただきましたが
rstZan.MoveFirstでエラーが発生します。
その対処ですが下線を追加しました。
この方法ですとスルーしてくれるのでうまくできました。
ただrst.Close: Set rst = Nothingを起動しなくしました。
 
'H //// 残高の計算と更新 /////////////////////////////////////
If rstZan.EOF = False Then
rstZan.MoveFirst
Do Until rstZan.EOF
rstZan.Edit
rstZan![残高] = rstZan![5412] + rstZan![5431] + rstZan![5433] + rstZan![5434] + rstZan![5435] + rstZan![5441] + rstZan![5453] + rstZan![5455] + rstZan![5456] + rstZan![5458] + rstZan![5459] + rstZan![5461] + rstZan![5467]
rstZan.Update
rstZan.MoveNext
Loop
'rst.Close: Set rst = Nothing
End If
 
問題はMのコードです。
下線を追加しました。T日常_0残高工事参照用の残高フィールドに合計額が有及びない場合
のコードです。T日常_0残高工事参照用に繰越額がある場合はコードを起動、ない場合の
コードがわかりません。いろいろためしたのですが、期中の仕訳データは表示されますが、
残高が表示されません。
申し訳ありません。ご指導お願いします。
Else
End Ifの間に
 'M //// 残高データの計算と更新 /////////////////////////////////////
If DCount("残高", "T日常_0残高工事参照用") > 0 Then
Dim kurikosi As Currency
rstZan.MoveFirst
Do Until rstZan.EOF
intcode = rstZan![工事NO]
kurikosi = DLookup("残高", "T日常_0残高工事参照用", "帳簿No = " & intChohyo & " and 工事NO = " & intcode)
strSQL = "SELECT [工事NO],[5412],[5431],[5433],[5434],[5435],[5441],[5453],[5455],[5456],[5458],[5459],[5461],[5467],[残高] from " & tblName & " WHERE 工事NO = " & intcode & ";"
Set rst = db.OpenRecordset(strSQL, dbOpenDynaset) '期中仕訳
If rst.EOF Then GoTo pas '残高はあるが、仕訳データがない場合、スキップ
rst.MoveFirst
Do Until rst.EOF
rst.Edit
rst![残高] = kurikosi + (Nz(rst![5412], 0) + Nz(rst![5431], 0) + Nz(rst![5433], 0) + Nz(rst![5434], 0) + Nz(rst![5435], 0) + Nz(rst![5441], 0) + Nz(rst![5453], 0) + Nz(rst![5455], 0) + Nz(rst![5456], 0) + Nz(rst![5458], 0) + Nz(rst![5459], 0) + Nz(rst![5461], 0) + Nz(rst![5467], 0))
'rst![残高] = (Nz(rst![5412], 0) + Nz(rst![5431], 0) + Nz(rst![5433], 0) + Nz(rst![5434], 0) + Nz(rst![5435], 0) + Nz(rst![5441], 0) + Nz(rst![5453], 0) + Nz(rst![5455], 0) + Nz(rst![5456], 0) + Nz(rst![5458], 0) + Nz(rst![5459], 0) + Nz(rst![5461], 0) + Nz(rst![5467], 0))
rst.Update
kurikosi = rst![残高]
rst.MoveNext
Loop
pas:
rstZan.MoveNext
Loop
rstZan.Close: Set rstZan = Nothing
Else
End If
 
 
>変数 strSQL に格納されている SELECT 文に ORDER BY 句の指定がない
>(ので累計の順序を狂っている可能性がある)。
はい。ORDER BY を追加します。
 

回答
投稿日時: 19/05/28 17:48:23
投稿者: sk

業務内容についての説明をされる気配が全くないようですので、
とりあえず憶測の範囲で現時点での回答を示します。
 

引用:
前期繰越額はT日常_0残高工事参照用です。
期中仕訳はT日常_6工事台帳です。

レポートに出力しようとしているレコードソースの
主体となるのは「当期」と「前期」のどちら側のテーブルなのでしょうか。
 
引用:
HのコードはT日常_0残高工事参照用に、印刷したい工事NOに対する前期の繰越額
表示されます。その合計を「残高」に計算表示するコードです。

引用:
工事NOには、前期繰越額がある工事とない工事がありますから

 
例えば、「当期(ある一定の日付範囲)内に発生した収益/支出に
該当するレコードを抽出し、費目別金額とそれらの日付順累計を
[工事NO]ごとに集計した結果を出力する」というのが主たる処理
目的であるなら、この場合においてレコードの抽出/集計の主体
となるテーブルは、あくまで[T日常_6工事台帳](当期側)であるはずです。
 
もし、ある工事が当期から開始(受注)されたものであるならば、
当然「前期から繰り越される金額」なんてものはないわけですから、
その工事を示す[工事NO]に該当するレコードが
[T日常_0残高工事参照用](前期側)に存在するはずがありません。
 
つまり、本来の流れとしては、[T日常_6工事台帳](当期側)の[工事NO]に
該当するレコードが[T日常_0残高工事参照用](前期側)にも存在するかどうかを判定し、
もし存在していれば[T日常_0残高工事参照用](前期側)のそのレコードから
「前期から繰り越される金額」を取得して[T日常_6工事台帳](当期側)における
累計の初期値とし、逆に存在していなければ[T日常_6工事台帳](当期側)における
累計の初期値を 0 とする、という処理を行ない、その上で累計計算を実行する、
という形を採るべきです。
(当期側が主で、前期側が従、という関係になる)
 
引用:
tblName = "T日常_6工事台帳"

引用:
strSQL = "SELECT * FROM T日常_0残高工事参照用 WHERE 帳簿No = " & intChohyo & ";"
Set rstZan = db.OpenRecordset(strSQL)

引用:
If DCount("残高", "T日常_0残高工事参照用") > 0 Then
    Dim kurikosi As Currency
    rstZan.MoveFirst
    Do Until rstZan.EOF
        intcode = rstZan![工事NO]
        kurikosi = DLookup("残高", "T日常_0残高工事参照用", "帳簿No = " & intChohyo & " and 工事NO = " & intcode)
        strSQL = "SELECT [工事NO],[5412],[5431],[5433],[5434],[5435],[5441],[5453],[5455],[5456],[5458],[5459],[5461],[5467],[残高] from " & tblName & " WHERE 工事NO = " & intcode & ";"
        Set rst = db.OpenRecordset(strSQL, dbOpenDynaset) '期中仕訳
        If rst.EOF Then GoTo pas '残高はあるが、仕訳データがない場合、スキップ
        rst.MoveFirst
        Do Until rst.EOF
            rst.Edit
            rst![残高] = kurikosi + (Nz(rst![5412], 0) + Nz(rst![5431], 0) + Nz(rst![5433], 0) + Nz(rst![5434], 0) + Nz(rst![5435], 0) + Nz(rst![5441], 0) + Nz(rst![5453], 0) + Nz(rst![5455], 0) + Nz(rst![5456], 0) + Nz(rst![5458], 0) + Nz(rst![5459], 0) + Nz(rst![5461], 0) + Nz(rst![5467], 0))
            'rst![残高] = (Nz(rst![5412], 0) + Nz(rst![5431], 0) + Nz(rst![5433], 0) + Nz(rst![5434], 0) + Nz(rst![5435], 0) + Nz(rst![5441], 0) + Nz(rst![5453], 0) + Nz(rst![5455], 0) + Nz(rst![5456], 0) + Nz(rst![5458], 0) + Nz(rst![5459], 0) + Nz(rst![5461], 0) + Nz(rst![5467], 0))
            rst.Update
            kurikosi = rst![残高]
            rst.MoveNext
        Loop
        pas:
        rstZan.MoveNext
    Loop
    rstZan.Close: Set rstZan = Nothing
Else
     
End If

しかし、現在記述されているコードでは
「[T日常_0残高工事参照用](前期側)の[工事NO]に該当するレコードが
[T日常_6工事台帳](当期側)に存在するかどうかを判定する」という
真逆のことをしています。
(前期側が主で、当期側が従、という関係になっている)
 
これでは「前期から継続されている工事」しか抽出されませんし、
「当期から開始された工事」に掛かる累計計算が行なわれるわけもありません。
 
とりあえず、上記に示した内容について
(私の指摘に誤りがないかどうかも含めて)検討された上、
処理の流れを全体的に見直されることをお奨めします。

投稿日時: 19/06/05 11:33:18
投稿者: miyama2305

sk様 ありがとうございます
 
>とりあえず、上記に示した内容について
>(私の指摘に誤りがないかどうかも含めて)検討された上、
>処理の流れを全体的に見直されることをお奨めします
 
遅くなりました
全体の流れを見直しました。
すべてのコード表示すべきでした。
中途半端な質問申し訳ありません
 
MT工事前期繰越 のテーブルに、前期繰越(未成工事)額のある工事NOのみ
表示していましたが、未成工事のない工事NOを掲載していませんでした。
それが原因でカレントレコードがありませんと表示されてしまいました。
熟読玩味したことで原因が解りました。
ありがとうございます。
お礼申し上げます。