- 締切済み
非営業日のレコードを前営業日のレコードを元に補う
営業日のみデータが入力されているテーブルを元に 非営業日(土日祝祭日など)のレコードを前営業日の レコードを参照して補いたいと考えています。 例) 主キーが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です。 わかりにくい説明で申し訳ありませんが、 よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- nicotinism
- ベストアンサー率70% (1019/1452)
もう解決されているかもしれませんが、一応。 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)
ユニオンクエリはご存じでしょうか。 ユニオンクエリはSQL文を書かなければいけませんが、とても便利です。 たぶんこの場合に使えるでしょう。 手順として、 (1)前営業日のレコードを元に非営業日を表示したフィールドを設けたクエリ(条件で営業日のフィールドは非営業日の前営業日だけ表示するようにする。非営業日の前営業日はフラグでもたてたらいいでしょう。)を作る。 (2)営業日のみデータが入力されているテーブルと(1)で作成したクエリでユニオンクエリを作成する。 以上。 わかりにくい回答ですみません。