COPY
Option Compare Database
Option Explicit
'----------------------------------------------------------------
Private NenTuki() As String
Private Fname As Dictionary
Private ViewPosi As Long
Private ShiftPosi As Long
Private memSQL As String
Private memTableSQL As String 'SUBフォームがセットして年シフト時使用
Private memOrderSQL As String 'SUBフォームがセットして年シフト時使用
Private memClickLabel As String
'----------------------------------------------------------------
Public Property Get mySQL() As String
mySQL = memSQL
End Property
'----------------------------------------------------------------
Public Property Let mySQL(ByVal val As String)
memSQL = val
End Property
'----------------------------------------------------------------
Public Property Get TableSQL() As String
TableSQL = memTableSQL
End Property
'----------------------------------------------------------------
Public Property Let TableSQL(ByVal val As String)
memTableSQL = val
End Property
'----------------------------------------------------------------
Public Property Get OrderSQL() As String
OrderSQL = memOrderSQL
End Property
'----------------------------------------------------------------
Public Property Let OrderSQL(ByVal val As String)
memOrderSQL = val
End Property
Public Property Get ClickLabel() As String
ClickLabel = memClickLabel
End Property
'----------------------------------------------------------------
Public Property Let ClickLabel(ByVal val As String)
memClickLabel = val
End Property
'----------------------------------------------------------------
Private Sub Form_Open(Cancel As Integer)
Dim EDate As Long
Dim SDate As Long
Dim I As Long
Me.車検点検予定表SUB.SourceObject = "車検点検予定表SUB"
ShiftPosi = 0
ViewPosi = 13
memTableSQL = ""
memOrderSQL = ""
'点検月名とフォームの表題の対照表の作成
Call FNameMake
Me.車検点検予定表SUB.Form.Painting = False
Call ListAdd
Call SubControl(True)
Me.車検点検予定表SUB.Form.Painting = True
End Sub
'----------------------------------------------------------------
Private Sub Form_Close()
Set Fname = Nothing
End Sub
'----------------------------------------------------------------
Private Sub エクセル_Click()
Dim Rst As Recordset
Dim Ws As Object
Dim xls As Object
Dim I As Long
Set Ws = CreateObject("Wscript.Shell")
'得意先テーブルを開く
Set Rst = Me.車検点検予定表SUB.Form.Recordset.Clone
'Excelオブジェクトを生成
Set xls = CreateObject("Excel.Application")
With xls
'新しいブックを追加
.Workbooks.Add
For I = 0 To Rst.Fields.Count - 1
.Cells(1, I + 1).Value = Fname(Rst.Fields(I).Name)
Next I
'2行目の1列目からレコードセットを出力
.Cells(2, 1).CopyFromRecordset Rst
Set Rst = Nothing
.Visible = True
End With
Set xls = Nothing
End Sub
'----------------------------------------------------------------
Private Sub シフト右_Click()
ShiftPosi = ShiftPosi + 1
'点検月名とフォームの表題の対照表の作成
Call FNameMake
Me.車検点検予定表SUB.Form.Painting = False
Call ListAdd
Call SubControl(True)
Me.車検点検予定表SUB.Form.Painting = True
End Sub
'----------------------------------------------------------------
Private Sub シフト左_Click()
ShiftPosi = ShiftPosi - 1
'点検月名とフォームの表題の対照表の作成
Call FNameMake
Me.車検点検予定表SUB.Form.Painting = False
Call ListAdd
Call SubControl(True)
Me.車検点検予定表SUB.Form.Painting = True
End Sub
'----------------------------------------------------------------
Private Sub 右_Click()
ViewPosi = ViewPosi + 1
Me.車検点検予定表SUB.Form.Painting = False
Call SubControl
Me.車検点検予定表SUB.Form.Painting = True
End Sub
'----------------------------------------------------------------
Private Sub 左_Click()
ViewPosi = ViewPosi - 1
Me.車検点検予定表SUB.Form.Painting = False
Call SubControl
Me.車検点検予定表SUB.Form.Painting = True
End Sub
'----------------------------------------------------------------
Private Sub 解除_Click()
Dim Ctrl As Access.Control
Me.車検点検予定表SUB.Form.Painting = False
For Each Ctrl In Me.車検点検予定表SUB.Form.Controls
If Ctrl.ControlType = acLabel Then
With Ctrl
Select Case True
Case InStr(.Caption, "_■") > 0
.Caption = Replace(.Caption, "_■", "")
Case InStr(.Caption, "_▲") > 0
.Caption = Replace(.Caption, "_▲", "")
Case InStr(.Caption, "_▼") > 0
.Caption = Replace(.Caption, "_▼", "")
End Select
End With
End If
Next Ctrl
ClickLabel = ""
TableSQL = ""
OrderSQL = ""
Me.車検点検予定表SUB.Form.RecordSource = mySQL & ";"
Me.車検点検予定表SUB.Form.Requery
Me.車検点検予定表SUB.Form.Painting = True
End Sub
'----------------------------------------------------------------
Private Sub ListAdd()
Dim Rs As DAO.Recordset
Dim Touroku As String
Dim TourokuDate As Long
Dim HaishaDate As Long
Dim BaseDate As Long
Dim ShokaiSpan As Long
Dim ShakenSpan As Long
Dim TenkenSpan As Long
Dim I As Long
Dim SetSQL As String
Set Rs = CurrentDb.OpenRecordset("車検証", dbOpenSnapshot)
If Rs.BOF Then
Set Rs = Nothing
Exit Sub
End If
Do Until Rs.EOF
'車検証(レコードセット)から値を取得
Touroku = Rs("登録番号")
TourokuDate = Rs("登録日")
HaishaDate = Nz(Rs("廃車日"), 999999)
BaseDate = Rs("有効期限")
ShokaiSpan = Rs("初回有効期間")
ShakenSpan = Rs("継続有効期間")
TenkenSpan = Rs("点検有効期間")
'テーブル車検点検listに追加
Call ListMake(Touroku, TourokuDate, HaishaDate, BaseDate, ShokaiSpan, ShakenSpan, TenkenSpan)
Rs.MoveNext
Loop
'レコードセットの参照破棄
Set Rs = Nothing
'フォームのデータSQLの作成
mySQL = "SELECT A.登録番号"
mySQL = mySQL & ", Max(A.ID) AS ID"
mySQL = mySQL & ", Max(A.登録日) AS 登録日"
mySQL = mySQL & ", Max(A.廃車日) AS 廃車日"
mySQL = mySQL & ", Max(A.有効期限) AS 有効期限"
For I = 1 To UBound(NenTuki)
mySQL = mySQL & ", Max(IIf(A.年月='" & NenTuki(I) & "',A.車検点検ID,Null)) AS " & "F" & I
Next I
mySQL = mySQL & " FROM 車検点検list AS A"
mySQL = mySQL & " GROUP BY A.登録番号"
If TableSQL <> "" Then
If OrderSQL <> "" Then
SetSQL = "SELECT X.* FROM (" & Replace(mySQL, "車検点検list", TableSQL) & ") AS X " & OrderSQL & ";"
Else
SetSQL = "SELECT X.* FROM (" & Replace(mySQL, "車検点検list", TableSQL) & ") AS X;"
End If
Else
SetSQL = mySQL & ";"
End If
Me.車検点検予定表SUB.Form.RecordSource = SetSQL
End Sub
'----------------------------------------------------------------
Private Sub 実行_Click()
Dim Rs As DAO.Recordset
Dim Touroku As String
Dim TourokuDate As Long
Dim HaishaDate As Long
Dim BaseDate As Long
Dim ShokaiSpan As Long
Dim ShakenSpan As Long
Dim TenkenSpan As Long
Dim EDate As Long
Dim SDate As Long
Dim I As Long
Dim Qdf As QueryDef
Dim mySQL As String
SDate = DateSerial(Year(Date) - 1, Month(Date), 1)
EDate = DateSerial(Year(Date) + 2, Month(Date), 0)
Set Rs = CurrentDb.OpenRecordset("車検証", dbOpenSnapshot)
If Rs.BOF Then
Set Rs = Nothing
Exit Sub
End If
'DoCmd.RunSQL "DELETE * FROM 車検点検list;"
Do Until Rs.EOF
'車検証(レコードセット)から値を取得
Touroku = Rs("登録番号")
TourokuDate = Rs("登録日")
HaishaDate = Nz(Rs("廃車日"), 999999)
BaseDate = Rs("有効期限")
ShokaiSpan = Rs("初回有効期間")
ShakenSpan = Rs("継続有効期間")
TenkenSpan = Rs("点検有効期間")
'テーブル車検点検listに追加
Call ListMake(Touroku, TourokuDate, BaseDate, HaishaDate, ShokaiSpan, ShakenSpan, TenkenSpan)
Rs.MoveNext
Loop
'レコードセットの参照破棄
Set Rs = Nothing
'点検月名とフォームの表題の対照表の作成
Set Fname = New Dictionary
Do Until DateSerial(Year(SDate), Month(SDate) + I, 1) > EDate
I = I + 1
ReDim Preserve NenTuki(I)
NenTuki(I) = StrConv(Format(DateSerial(Year(SDate), Month(SDate) + I - 1, 1), "geemm"), vbUpperCase)
Fname.Add "F" & I, NenTuki(I)
Loop
'フォームのデータSQLの作成
memSQL = "SELECT A.登録番号"
memSQL = memSQL & ", Max(A.登録日) AS 登録日"
memSQL = memSQL & ", Max(A.廃車日) AS 廃車日"
memSQL = memSQL & ", Max(A.有効期限) AS 有効期限"""
For I = 1 To UBound(NenTuki)
memSQL = memSQL & ", Max(IIf(A.年月='" & NenTuki(I) & "', A.車検点検ID, Null)) AS " & "F" & I
Next I
memSQL = memSQL & " FROM 車検点検list AS A"
memSQL = memSQL & " GROUP BY A.登録番号"
'クエリの作成
Set Qdf = CurrentDb.CreateQueryDef("Q_一覧表", mySQL & ";")
Set Qdf = Nothing
End Sub
'----------------------------------------------------------------
Private Sub ListMake(ByVal Touroku As String, _
ByVal TourokuDate As Long, _
ByVal HaishaDate As Long, _
ByVal BaseDate As Long, _
ByVal ShokaiSpan As Long, _
ByVal ShakenSpan As Long, _
ByVal TenkenSpan As Long)
Dim ShuseiDate As Long
Dim BUF As Long
Dim I As Long
Dim NenTuki As String
Dim ShaID As String
Dim FLG As String
Dim bufSQL As String
ShuseiDate = BaseDate + 1
For I = -(6 + Abs(ShiftPosi)) To (6 + Abs(ShiftPosi))
BUF = DateSerial(Year(ShuseiDate), Month(ShuseiDate) + TenkenSpan * I, Day(ShuseiDate)) - 1
If BUF <= TourokuDate Then
'登録日以前に車検・点検はない
NenTuki = StrConv(Format(TourokuDate, "geemm"), vbUpperCase)
ShaID = "登_" & Format(TourokuDate, "eemmdd") & "_" & Touroku
FLG = "登"
BUF = TourokuDate
ElseIf BUF >= HaishaDate Then
'廃車日以降に車検・点検はない
NenTuki = StrConv(Format(HaishaDate, "geemm"), vbUpperCase)
ShaID = "廃_" & Format(HaishaDate, "eemmdd") & "_" & Touroku
FLG = "廃"
BUF = HaishaDate
Else
If BUF < DateSerial(Year(TourokuDate), Month(TourokuDate) + ShokaiSpan, Day(TourokuDate)) - 1 Then
'初回有効期限内に車検はないが、有効期限であるばあい車検とする
If I = 0 Then
NenTuki = StrConv(Format(BUF, "geemm"), vbUpperCase)
ShaID = "検_" & Format(BUF, "eemmdd") & "_" & Touroku
FLG = "検"
Else
NenTuki = StrConv(Format(BUF, "geemm"), vbUpperCase)
ShaID = "点_" & Format(BUF, "eemmdd") & "_" & Touroku
FLG = "点"
End If
Else
If I = 0 Then
'有効期限は車検
NenTuki = StrConv(Format(BUF, "geemm"), vbUpperCase)
ShaID = "検_" & Format(BUF, "eemmdd") & "_" & Touroku
FLG = "検"
Else
If (TenkenSpan * I) Mod ShakenSpan = 0 Then
'車検と点検が重なる場合は車検
NenTuki = StrConv(Format(BUF, "geemm"), vbUpperCase)
ShaID = "検_" & Format(BUF, "eemmdd") & "_" & Touroku
FLG = "検"
Else
'重ならない場合は点検
NenTuki = StrConv(Format(BUF, "geemm"), vbUpperCase)
ShaID = "点_" & Format(BUF, "eemmdd") & "_" & Touroku
FLG = "点"
End If
End If
End If
End If
If DCount("車検点検ID", "車検点検list", "車検点検ID='" & ShaID & "'") = 0 Then
'追加クエリの作成
bufSQL = "INSERT INTO 車検点検list"
bufSQL = bufSQL & " (年月日,"
bufSQL = bufSQL & " 登録日,"
bufSQL = bufSQL & " 廃車日,"
bufSQL = bufSQL & " 有効期限,"
bufSQL = bufSQL & " 年月,"
bufSQL = bufSQL & " 登録番号,"
bufSQL = bufSQL & " 車検点検ID,"
bufSQL = bufSQL & " 車検点検別)"
bufSQL = bufSQL & " VALUES "
bufSQL = bufSQL & " (" & BUF & ","
bufSQL = bufSQL & " " & TourokuDate & ","
bufSQL = bufSQL & " " & IIf(HaishaDate = 999999, "NULL", HaishaDate) & ","
bufSQL = bufSQL & " " & BaseDate & ","
bufSQL = bufSQL & " '" & NenTuki & "',"
bufSQL = bufSQL & " '" & Touroku & "',"
bufSQL = bufSQL & " '" & ShaID & "',"
bufSQL = bufSQL & " '" & FLG & "');"
'追加の実行
DoCmd.RunSQL bufSQL
End If
Next I
End Sub
'----------------------------------------------------------------
Private Sub 閉じる_Click()
DoCmd.Close acForm, Me.Name, acSaveYes
End Sub
'----------------------------------------------------------------
Private Sub SubControl(Optional ByVal FLG As Boolean = False)
Dim I As Long
Dim Posi As Double
Dim Span As Double
Dim fCount As Long
Me.車検点検予定表SUB.Form.SelHeight = 1
Posi = Me.車検点検予定表SUB.Form("F1").Left
For I = 1 To Fname.Count
If Fname.Exists("F" & I) Then
If I > (ViewPosi - 1) And I < (ViewPosi + 13) Then
'13テキストボックス・ラベルを表示にし隙間なく並べる
With Me.車検点検予定表SUB
With .Form("F" & I)
Span = .Width
.Left = Posi
.Visible = True
End With
With .Form("L" & I)
If FLG Then
If InStr(ClickLabel, Fname("F" & I)) > 0 Then
.Caption = ClickLabel
Else
.Caption = Fname("F" & I)
End If
End If
.Left = Posi
.Visible = True
End With
With .Form("BK" & I)
.Left = Posi
.Visible = True
End With
Posi = Posi + Span
End With
Else
'その他は非表示にする
With Me.車検点検予定表SUB
.Form("F" & I).Visible = False
With .Form("L" & I)
If FLG Then
If InStr(ClickLabel, Fname("F" & I)) > 0 Then
.Caption = ClickLabel
Else
.Caption = Fname("F" & I)
End If
End If
.Visible = False
End With
With .Form("BK" & I)
.Visible = False
End With
End With
End If
'ラベルにセットした数をカウント
fCount = fCount + 1
End If
Next I
'ラベルにセットした数を上限にする
If (ViewPosi + 12) >= fCount Then
If Me.右.Enabled Then
Me.右.Enabled = False
End If
Else
If Not Me.右.Enabled Then
Me.右.Enabled = True
End If
End If
If ViewPosi <= 1 Then
If Me.左.Enabled Then
Me.左.Enabled = False
End If
Else
If Not Me.左.Enabled Then
Me.左.Enabled = True
End If
End If
End Sub
'----------------------------------------------------------------
Private Sub FNameMake()
Dim SDate As Long
Dim EDate As Long
Dim I As Long
SDate = DateSerial(Year(Date) - 1 + ShiftPosi, Month(Date), 1)
EDate = DateSerial(Year(Date) + 2 + ShiftPosi, Month(Date) + 1, 0)
'点検月名とフォームの表題の対照表の作成
Set Fname = Nothing
Set Fname = New Dictionary
Do Until DateSerial(Year(SDate), Month(SDate) + I, 1) > EDate
I = I + 1
ReDim Preserve NenTuki(I)
NenTuki(I) = StrConv(Format(DateSerial(Year(SDate), Month(SDate) + I - 1, 1), "geemm"), vbUpperCase)
Fname.Add "F" & I, NenTuki(I)
Loop
With Fname
.Add "登録番号", "登録番号"
.Add "登録日", "登録日"
.Add "廃車日", "廃車日"
.Add "有効期限", "有効期限"
End With
Call SetSelectCell
End Sub
'----------------------------------------------------------------
Private Sub SetSelectCell()
Dim Rs As DAO.Recordset
Dim SDate As Long
Dim EDate As Long
Dim mySQL As String
Dim bufStr() As String
Dim I As Long
SDate = DateSerial(Year(Date) - 1 + ShiftPosi, Month(Date), 1)
EDate = DateSerial(Year(Date) + 2 + ShiftPosi, Month(Date) + 1, 0)
mySQL = "SELECT"
mySQL = mySQL & " A.車検点検ID"
mySQL = mySQL & " FROM"
mySQL = mySQL & " 車検点検list AS A"
mySQL = mySQL & " WHERE (A.年月日>=" & SDate & ") AND (A.年月日<=" & EDate & ");"
Set Rs = CurrentDb.OpenRecordset(mySQL, dbOpenSnapshot)
If Rs.BOF Then
Exit Sub
End If
I = 0
Do Until Rs.EOF
ReDim Preserve bufStr(I)
bufStr(I) = Rs("車検点検ID")
I = I + 1
Rs.MoveNext
Loop
Rs.Close
Set Rs = Nothing
Me.車検点検予定表SUB.Form.SelectCell = Join(bufStr, ",")
End Sub