我三流

いろいろ自分なりにやってみたことを書いています

テーブルAの変化によってテーブルBを作成する

今日は、半日
「テーブルAのレコード数分のデータを
テーブルBのフィールド名として使ってテーブルを作成する」という
まどろっこしいが、必要に迫られたコードを組んで終わってしまった...

項目のチェックを行うフォームがあるんですが
その項目が時期により増減するので
それを変更できるようにという訳ですが
(DB的にはあまりよろしくないことはわかっていても)


ここで問題になったのは、
カラムの増減をどうやって実現するかで
テーブルの存在有無をチェックするのに
http://blog.at-links.biz/?p=6
を参考にさせていただきました。

Option Compare Database

'−−−−−−−−−−−−−−−−−−−−−−−−−
'概要 :テーブル存在チェック(ADO)
'−−−−−−−−−−−−−−−−−−−−−−−−−
'引数 :strTblNm = 存在をチェックするテーブル名
'−−−−−−−−−−−−−−−−−−−−−−−−−
'戻り値:True = テーブルは存在する , False = テーブルは存在しない
'−−−−−−−−−−−−−−−−−−−−−−−−−
Public Function GetTableExec(strTblNm As String) As Boolean
    Dim cnn As New ADODB.Connection
    Dim adrTbl As ADODB.Recordset
    Dim varTbl As Variant
    
    Set cnn = CurrentProject.Connection
    
    GetTableExec = False 'デフォルトは存在しない(False)

    ' 配列で渡す値の説明
    ' →TABLE_CATALOG,TABLE_SCHEMA,TABLE_NAME,TABLE_TYPE
    varTbl = Array(Empty, Empty, strTblNm, "TABLE")
     ' テーブルのスキーマ情報を取得
    Set adrTbl = cnn.OpenSchema(adSchemaTables, varTbl)
    'テーブルがあればEOF=FalseなのでNOTとしTrueを返す
    GetTableExec = Not adrTbl.EOF

    adrTbl.Close
     Set adrTbl = Nothing
End Function

で、PGでもSEでもない自分の言い訳として冗長な部分は見逃してほしいのですが
テーブルBが存在していない場合は、テーブルAのデータ数分の
フィールドをテーブルAのデータをフィールド名としてテーブルBを新規作成する。
テーブルBが存在していた場合は、一旦、テーブルBを削除したうえで
テーブルAのデータ数分のフィールドをテーブルAのデータをフィールド名として
テーブルBを再作成するというコード。

Sub MyCreateTable()
    Dim cnn As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    Dim cat As ADOX.Catalog
    Dim tbl As ADOX.Table
    Dim StrSQL As String
    Dim FldName As String
    Dim TblName As String
    
    TblName = "テーブルB"
    
    StrSQL = "SELECT t1.REHAMENUID, t1.REHA, t1.CNT " & _
            "FROM テーブルA As t1 " & _
            "ORDER BY t1.REHAMENUID;"
    
    Set cnn = CurrentProject.Connection

    DoCmd.SetWarnings False
    Application.Echo False
    
    With rst
        .Open StrSQL, cnn, adOpenKeyset, adLockOptimistic
        
        Set cat = New ADOX.Catalog
        cat.ActiveConnection = CurrentProject.Connection
        Set tbl = New ADOX.Table
        tbl.Name = TblName
        Set tbl.ParentCatalog = cat
    
        If GetTableExec(TblName) = True Then
        
        cat.Tables.Delete TblName
        
        With tbl
            .Columns.Append "REHAMENUID", adInteger
            .Columns.Item("REHAMENUID").Properties("AutoIncrement") = True
            .Columns.Append "RECDETAILSID", adInteger
 
            Do Until rst.EOF
                FldName = rst!REHA
                Debug.Print "FldNameは、" & FldName
                    .Columns.Append FldName, adInteger
                rst.MoveNext
            Loop
        End With
        cat.Tables.Append tbl
        
        Else
        
        With tbl
            .Columns.Append "REHAMENUID", adInteger
            .Columns.Item("REHAMENUID").Properties("AutoIncrement") = True
            .Columns.Append "RECDETAILSID", adInteger
 
            Do Until rst.EOF
                FldName = rst!REHA
                Debug.Print "FldNameは、" & FldName
                    .Columns.Append FldName, adInteger
                rst.MoveNext
            Loop
        End With
        cat.Tables.Append tbl
        
        
        End If
        
    End With

    Application.Echo True
    DoCmd.SetWarnings True
    
    Set cat = Nothing
    cnn.Close: Set cnn = Nothing
    Set rst = Nothing

End Sub

PGとかSEとかいう人たちには笑われるんでしょう。きっと。