• 締切済み

非営業日のレコードを前営業日のレコードを元に補う

営業日のみデータが入力されているテーブルを元に 非営業日(土日祝祭日など)のレコードを前営業日の レコードを参照して補いたいと考えています。 例) 主キーがDT,NMのテーブルT1 に営業日のみデータが入力されている DT NM FEE ========== 4/1 A 3 4/1 B 5 4/4 A 9 4/4 B 10 ↓ これをもとに、非営業日分(4/2,4/3)のレコードを 前(直近)営業日のデータで補った結果を作成したい。 Q1 DT NM FEE REF ========== 4/1 A 3 4/1 B 5 4/2 A 3 4/1 ←前営業日のレコードをもとに生成 4/2 B 5 4/1 ←前営業日のレコードをもとに生成 4/3 A 3 4/1 ←前営業日のレコードをもとに生成 4/3 B 5 4/1 ←前営業日のレコードをもとに生成 4/4 A 9 4/4 B 10 ちなみに列REFは何日のデータを参照して レコードが生成されたかを表示する列です。 営業日にフラグを立てたカレンダーテーブルと結合 させてみたりしたのですが、どうもうまくいきません。 環境はACCESSです。 わかりにくい説明で申し訳ありませんが、 よろしくお願いいたします。

みんなの回答

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.2

もう解決されているかもしれませんが、一応。 VBA にて行う例です。 ■不足に事態に備えファイルのバックアップは必ず取って置いてください■ ツールの参照設定から Microsoft DAO 3.6 Object Library にチェックを入れてください。 以下を標準モジュールにコピペして実行してみてください ※この頃ポカが多いので検証はじっくりと・・・。 Sub test() '要参照設定 DAO 3.6 Object Library   Dim db As DAO.Database   Dim rsFromA As DAO.Recordset   Dim rsFromB As DAO.Recordset   Dim rsTmp As DAO.Recordset   Dim rsTo As DAO.Recordset   Dim i As Long   Set db = CurrentDb   Set rsFromA = db.OpenRecordset("select DT from T1 group by dt order by DT", dbOpenSnapshot)   Set rsFromB = db.OpenRecordset("select DT from T1 group by dt order by DT", dbOpenSnapshot)   Set rsTo = db.OpenRecordset("select * from T1 order by DT", dbOpenDynaset)      rsFromB.MoveNext      Do Until rsFromB.EOF     i = 0     If rsFromA!DT <> rsFromB!DT Then              Do Until rsFromB!DT = rsFromA!DT + i + 1                  Set rsTmp = db.OpenRecordset _           ("select * from T1 where dt =#" & rsFromA!DT + i & "#", dbOpenSnapshot)         i = i + 1                    Do Until rsTmp.EOF           rsTo.AddNew           rsTo!DT = rsFromA!DT + i           rsTo!NM = rsTmp!NM           rsTo!FEE = rsTmp!FEE           rsTo!REF = rsFromA!DT           rsTo.Update           rsTmp.MoveNext         Loop                  rsTmp.Close: Set rsTmp = Nothing       Loop     End If     rsFromA.MoveNext: rsFromB.MoveNext   Loop   rsTo.Close: Set rsTo = Nothing   rsFromA.Close: Set rsFromA = Nothing   rsFromB.Close: Set rsFromB = Nothing   db.Close: Set db = Nothing End Sub

  • 894yyyy
  • ベストアンサー率25% (1/4)
回答No.1

ユニオンクエリはご存じでしょうか。 ユニオンクエリはSQL文を書かなければいけませんが、とても便利です。 たぶんこの場合に使えるでしょう。 手順として、 (1)前営業日のレコードを元に非営業日を表示したフィールドを設けたクエリ(条件で営業日のフィールドは非営業日の前営業日だけ表示するようにする。非営業日の前営業日はフラグでもたてたらいいでしょう。)を作る。 (2)営業日のみデータが入力されているテーブルと(1)で作成したクエリでユニオンクエリを作成する。 以上。 わかりにくい回答ですみません。