Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Option Explicit
- 'フィールド文字列生成用
- Private Type TYPE_FIELD
- Field As String
- Exception As Boolean
- End Type
- 'SQL情報
- Private Type TYPE_SQL
- SQL As String
- Fields() As TYPE_FIELD
- Alias As String
- End Type
- '**********************************************
- ' MakeFldStringFromArry
- ' SQLの出力用フィールド文字列の自動生成
- '
- ' 引数:strAlias テーブルの別名
- ' 引数:tFields フィールド文字列と例外指定のTYPE_FIELD型の配列
- ' 引数:lngIndent インデント段
- '
- ' 戻り値:SQLの出力フィールド部分の文字列
- '
- ' 解説:
- ' SELECT
- ' H.HOGE1 AS HOGE1
- ' H.HOGE2 AS HOGE2
- ' F.FUGA3 AS FUGA3
- ' FROM
- ' TBL_HOGE H
- ' INNER JOIN
- ' TBL_FUGA F
- ' WHERE
- ' H.HOGE1>0
- '
- ' の場合の
- '
- ' H.HOGE1 AS HOGE1
- ' H.HOGE2 AS HOGE2
- ' F.FUGA3 AS FUGA3
- '
- ' の部分を自動生成して返す。
- ' 但し、F.FUGA3 AS FUGA3の部分は別名が違うので
- ' TYPE_FIELDのExceptionをTrueにして例外としてFieldに
- ' その行全体を入れる。
- '
- ' 呼出し例:
- '
- ' tFields(0).Field = "HOGE1"
- ' tFields(1).Field = "HOGE2"
- ' tFields(2).Exception = True
- ' tFields(2).Field = "F.FUGE3 AS FUGA3"
- ' strField = MakeFldStringFromArry("H", tFields, 1)
- '
- ' 2018/03/11
- ' Coded by YASUTADA OOBA
- '**********************************************
- Private Function MakeFldStringFromArry(strAlias As String, tFields() As TYPE_FIELD, Optional lngIndent As Long) As String
- Dim strField As String
- Dim strIndent As String
- Dim i As Long
- strIndent = String(lngIndent * 4, " ")
- For i = 0 To UBound(tFields)
- If tFields(i).Exception = True Then
- strField = strField & strIndent & tFields(i).Field & vbCrLf
- Else
- strField = strField & strIndent & strAlias & "." & tFields(i).Field & " AS " & tFields(i).Field & vbCrLf
- End If
- Next i
- MakeFldStringFromArry = strField
- End Function
- 'MakeSQL_BASEのチェック用
- Private Sub testMakeSQL_BASE()
- Debug.Print MakeSQL_BASE().SQL
- End Sub
- '**********************************************
- ' MakeSQL_BASE
- ' ネストの無いSQLとフィールド情報を生成する例
- '
- ' 引数:lngIndent インデント段
- '
- ' 戻り値:生成されたSQLとフィールド情報
- '
- '
- '
- ' 2018/03/11
- ' Coded by YASUTADA OOBA
- '**********************************************
- Private Function MakeSQL_BASE(Optional lngIndent As Long) As TYPE_SQL
- Dim strField As String
- Dim tmpSQL As TYPE_SQL
- Dim strIndent As String
- Dim i As Long
- strIndent = String(lngIndent * 4, " ")
- 'ネスト無しのSQLなので本SQLの出力フィールドの配列を全て生成
- ReDim tmpSQL.Fields(4) As TYPE_FIELD
- With tmpSQL
- .Fields(0).Field = "TEST1"
- .Fields(1).Field = "TEST2"
- .Fields(2).Field = "TEST3"
- .Fields(3).Field = "TEST4"
- 'T1を中心にMakeFldStringFromArryを使用するので例外は別途
- .Fields(4).Field = "T2.TEST5 AS TEST5"
- .Fields(4).Exception = True
- End With
- 'フィールド文字列の自動生成
- strField = MakeFldStringFromArry("T1", tmpSQL.Fields, lngIndent + 1)
- 'SQL生成
- tmpSQL.SQL = "SELECT" & vbCrLf & strField & _
- strIndent & "FROM" & vbCrLf & _
- strIndent & " TBLFUGAFUGA T1 " & vbCrLf & _
- strIndent & "INNER JOIN" & vbCrLf & _
- strIndent & " TBLHOGEHOGE T2" & vbCrLf & _
- strIndent & "ON" & vbCrLf & _
- strIndent & " T1.FUGAFUGA=T2.FUGAGUGA"
- '出力用に例外を解除
- tmpSQL.Fields(4).Exception = False
- tmpSQL.Fields(4).Field = "TEST5"
- MakeSQL_BASE = tmpSQL
- End Function
- 'MakeSQL_TESTのチェック用
- Private Sub testMakeSQL_TEST()
- Dim tSQL1 As TYPE_SQL
- Dim tSQL2 As TYPE_SQL
- Dim tSQL3 As TYPE_SQL
- tSQL1 = MakeSQL_BASE(1)
- 'Debug.Print tSQL1.SQL
- tSQL1.Alias = "CHU"
- tSQL2 = MakeSQL_TEST(tSQL1)
- Debug.Print tSQL2.SQL
- End Sub
- '**********************************************
- ' MakeSQL_TEST
- ' ネストの有るSQLとフィールド情報を生成する例
- '
- ' 引数:tSQL ネストの子供のSQLとフィールド情報
- ' 引数:lngIndent インデント段
- '
- ' 条件:tSQLは接続フィールドとしてFUGAFUGAフィールドを持つ。
- ' tSQL.Fields(2)にTBLHOGEHOGEのNNNNNフィールドとの
- ' 条件選択が設定されている。
- '
- ' 戻り値:生成されたSQLとフィールド情報
- '
- ' 2018/03/11
- ' Coded by YASUTADA OOBA
- '**********************************************
- Private Function MakeSQL_TEST(tSQL As TYPE_SQL, Optional lngIndent As Long) As TYPE_SQL
- Dim strField As String
- Dim tmpSQL As TYPE_SQL
- Dim strIndent As String
- Dim i As Long
- strIndent = String(lngIndent * 4, " ")
- '一旦、本プロシージャで生成予定のTYPE_SQLにコピー
- tmpSQL = tSQL
- 'フィールド文字列自動生成の例外(手動生成)
- tmpSQL.Fields(2).Exception = True
- tmpSQL.Fields(2).Field = "DECODE(" & tmpSQL.Alias & "." & tmpSQL.Fields(2).Field & ",NULL,T1.NNNNN," & tmpSQL.Alias & "." & tmpSQL.Fields(2).Field & ") AS " & tmpSQL.Fields(2).Field
- 'フィールド文字列の自動生成
- strField = MakeFldStringFromArry(tmpSQL.Alias, tmpSQL.Fields, lngIndent + 1)
- tmpSQL.SQL = "SELECT" & vbCrLf & strField & _
- strIndent & " T1.HOGE AS HOGE" & vbCrLf & _
- strIndent & "FROM" & vbCrLf & _
- strIndent & " (" & tSQL.SQL & vbCrLf & _
- strIndent & " ) " & tSQL.Alias & vbCrLf & _
- strIndent & "INNER JOIN" & vbCrLf & _
- strIndent & " TBLHOGEHOGE T1" & vbCrLf & _
- strIndent & "ON" & vbCrLf & _
- strIndent & " " & tSQL.Alias & ".FUGAFUGA=T1.FUGAGUGA"
- 'フィールド文字列の例外を次への為に戻す
- tmpSQL.Fields(2).Exception = False
- tmpSQL.Fields(2).Field = "TEST3"
- '本プロシージャで追加されたフィールド
- ReDim Preserve tmpSQL.Fields(UBound(tmpSQL.Fields) + 1) As TYPE_FIELD
- tmpSQL.Fields(UBound(tmpSQL.Fields)).Field = "HOGE"
- MakeSQL_TEST = tmpSQL
- End Function
- 'MakeSQL_TEST2のチェック用
- Private Sub testMakeSQL_TEST2()
- Dim tSQL1 As TYPE_SQL
- Dim tSQL2 As TYPE_SQL
- Dim tSQL3 As TYPE_SQL
- tSQL1 = MakeSQL_BASE(2)
- 'Debug.Print tSQL1.SQL
- tSQL1.Alias = "CHU"
- tSQL2 = MakeSQL_TEST(tSQL1, 1)
- tSQL2.Alias = "BAO"
- tSQL3 = MakeSQL_TEST2(tSQL2)
- Debug.Print tSQL3.SQL
- End Sub
- '**********************************************
- ' MakeSQL_TEST2
- ' ネストの有るSQLとフィールド情報を生成する例
- '
- ' 引数:tSQL ネストの子供のSQLとフィールド情報
- ' 引数:lngIndent インデント段
- '
- ' 条件:tSQLは接続フィールドとしてFIZFIZを持つ
- '
- ' 戻り値:生成されたSQLとフィールド情報
- '
- ' 2018/03/11
- ' Coded by YASUTADA OOBA
- '**********************************************
- Private Function MakeSQL_TEST2(tSQL As TYPE_SQL, Optional lngIndent As Long) As TYPE_SQL
- Dim strField As String
- Dim tmpSQL As TYPE_SQL
- Dim strIndent As String
- Dim i As Long
- strIndent = String(lngIndent * 4, " ")
- '一旦、本プロシージャで生成予定のTYPE_SQLにコピー
- tmpSQL = tSQL
- 'フィールド文字列自動生成の例外無し
- 'フィールド文字列の自動生成
- strField = MakeFldStringFromArry(tmpSQL.Alias, tmpSQL.Fields, lngIndent + 1)
- tmpSQL.SQL = "SELECT" & vbCrLf & strField & _
- strIndent & " T3.HOEHOGE AS HOEHOE" & vbCrLf & _
- strIndent & "FROM" & vbCrLf & _
- strIndent & " (" & tSQL.SQL & vbCrLf & _
- strIndent & " ) " & tSQL.Alias & vbCrLf & _
- strIndent & "INNER JOIN" & vbCrLf & _
- strIndent & " TBL_HOE T3" & vbCrLf & _
- strIndent & "ON" & vbCrLf & _
- strIndent & " " & tSQL.Alias & ".FIZFIZ=T3.FIZFIZ"
- '本プロシージャで追加されたフィールド
- ReDim Preserve tmpSQL.Fields(UBound(tSQL.Fields) + 1) As TYPE_FIELD
- tmpSQL.Fields(UBound(tSQL.Fields)).Field = "HOEHOE"
- MakeSQL_TEST2 = tmpSQL
- End Function
Add Comment
Please, Sign In to add comment