Guest User

Untitled

a guest
Mar 20th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.51 KB | None | 0 0
  1. Option Explicit
  2.  
  3. 'フィールド文字列生成用
  4. Private Type TYPE_FIELD
  5. Field As String
  6. Exception As Boolean
  7. End Type
  8.  
  9. 'SQL情報
  10. Private Type TYPE_SQL
  11. SQL As String
  12. Fields() As TYPE_FIELD
  13. Alias As String
  14. End Type
  15. '**********************************************
  16. ' MakeFldStringFromArry
  17. ' SQLの出力用フィールド文字列の自動生成
  18. '
  19. ' 引数:strAlias テーブルの別名
  20. ' 引数:tFields フィールド文字列と例外指定のTYPE_FIELD型の配列
  21. ' 引数:lngIndent インデント段
  22. '
  23. ' 戻り値:SQLの出力フィールド部分の文字列
  24. '
  25. ' 解説:
  26. ' SELECT
  27. ' H.HOGE1 AS HOGE1
  28. ' H.HOGE2 AS HOGE2
  29. ' F.FUGA3 AS FUGA3
  30. ' FROM
  31. ' TBL_HOGE H
  32. ' INNER JOIN
  33. ' TBL_FUGA F
  34. ' WHERE
  35. ' H.HOGE1>0
  36. '
  37. ' の場合の
  38. '
  39. ' H.HOGE1 AS HOGE1
  40. ' H.HOGE2 AS HOGE2
  41. ' F.FUGA3 AS FUGA3
  42. '
  43. ' の部分を自動生成して返す。
  44. ' 但し、F.FUGA3 AS FUGA3の部分は別名が違うので
  45. ' TYPE_FIELDのExceptionをTrueにして例外としてFieldに
  46. ' その行全体を入れる。
  47. '
  48. ' 呼出し例:
  49. '
  50. ' tFields(0).Field = "HOGE1"
  51. ' tFields(1).Field = "HOGE2"
  52. ' tFields(2).Exception = True
  53. ' tFields(2).Field = "F.FUGE3 AS FUGA3"
  54. ' strField = MakeFldStringFromArry("H", tFields, 1)
  55. '
  56. ' 2018/03/11
  57. ' Coded by YASUTADA OOBA
  58. '**********************************************
  59. Private Function MakeFldStringFromArry(strAlias As String, tFields() As TYPE_FIELD, Optional lngIndent As Long) As String
  60.  
  61. Dim strField As String
  62. Dim strIndent As String
  63. Dim i As Long
  64.  
  65.  
  66. strIndent = String(lngIndent * 4, " ")
  67.  
  68. For i = 0 To UBound(tFields)
  69. If tFields(i).Exception = True Then
  70. strField = strField & strIndent & tFields(i).Field & vbCrLf
  71. Else
  72. strField = strField & strIndent & strAlias & "." & tFields(i).Field & " AS " & tFields(i).Field & vbCrLf
  73. End If
  74. Next i
  75.  
  76. MakeFldStringFromArry = strField
  77.  
  78. End Function
  79. 'MakeSQL_BASEのチェック用
  80. Private Sub testMakeSQL_BASE()
  81.  
  82. Debug.Print MakeSQL_BASE().SQL
  83.  
  84.  
  85. End Sub
  86. '**********************************************
  87. ' MakeSQL_BASE
  88. ' ネストの無いSQLとフィールド情報を生成する例
  89. '
  90. ' 引数:lngIndent インデント段
  91. '
  92. ' 戻り値:生成されたSQLとフィールド情報
  93. '
  94. '
  95. '
  96. ' 2018/03/11
  97. ' Coded by YASUTADA OOBA
  98. '**********************************************
  99. Private Function MakeSQL_BASE(Optional lngIndent As Long) As TYPE_SQL
  100.  
  101. Dim strField As String
  102. Dim tmpSQL As TYPE_SQL
  103. Dim strIndent As String
  104. Dim i As Long
  105.  
  106. strIndent = String(lngIndent * 4, " ")
  107.  
  108. 'ネスト無しのSQLなので本SQLの出力フィールドの配列を全て生成
  109. ReDim tmpSQL.Fields(4) As TYPE_FIELD
  110. With tmpSQL
  111. .Fields(0).Field = "TEST1"
  112. .Fields(1).Field = "TEST2"
  113. .Fields(2).Field = "TEST3"
  114. .Fields(3).Field = "TEST4"
  115.  
  116. 'T1を中心にMakeFldStringFromArryを使用するので例外は別途
  117. .Fields(4).Field = "T2.TEST5 AS TEST5"
  118. .Fields(4).Exception = True
  119. End With
  120.  
  121. 'フィールド文字列の自動生成
  122. strField = MakeFldStringFromArry("T1", tmpSQL.Fields, lngIndent + 1)
  123.  
  124. 'SQL生成
  125. tmpSQL.SQL = "SELECT" & vbCrLf & strField & _
  126. strIndent & "FROM" & vbCrLf & _
  127. strIndent & " TBLFUGAFUGA T1 " & vbCrLf & _
  128. strIndent & "INNER JOIN" & vbCrLf & _
  129. strIndent & " TBLHOGEHOGE T2" & vbCrLf & _
  130. strIndent & "ON" & vbCrLf & _
  131. strIndent & " T1.FUGAFUGA=T2.FUGAGUGA"
  132.  
  133. '出力用に例外を解除
  134. tmpSQL.Fields(4).Exception = False
  135. tmpSQL.Fields(4).Field = "TEST5"
  136.  
  137. MakeSQL_BASE = tmpSQL
  138.  
  139. End Function
  140. 'MakeSQL_TESTのチェック用
  141. Private Sub testMakeSQL_TEST()
  142.  
  143. Dim tSQL1 As TYPE_SQL
  144. Dim tSQL2 As TYPE_SQL
  145. Dim tSQL3 As TYPE_SQL
  146.  
  147. tSQL1 = MakeSQL_BASE(1)
  148. 'Debug.Print tSQL1.SQL
  149.  
  150.  
  151. tSQL1.Alias = "CHU"
  152. tSQL2 = MakeSQL_TEST(tSQL1)
  153.  
  154. Debug.Print tSQL2.SQL
  155.  
  156.  
  157. End Sub
  158. '**********************************************
  159. ' MakeSQL_TEST
  160. ' ネストの有るSQLとフィールド情報を生成する例
  161. '
  162. ' 引数:tSQL ネストの子供のSQLとフィールド情報
  163. ' 引数:lngIndent インデント段
  164. '
  165. ' 条件:tSQLは接続フィールドとしてFUGAFUGAフィールドを持つ。
  166. ' tSQL.Fields(2)にTBLHOGEHOGEのNNNNNフィールドとの
  167. ' 条件選択が設定されている。
  168. '
  169. ' 戻り値:生成されたSQLとフィールド情報
  170. '
  171. ' 2018/03/11
  172. ' Coded by YASUTADA OOBA
  173. '**********************************************
  174. Private Function MakeSQL_TEST(tSQL As TYPE_SQL, Optional lngIndent As Long) As TYPE_SQL
  175.  
  176. Dim strField As String
  177. Dim tmpSQL As TYPE_SQL
  178. Dim strIndent As String
  179. Dim i As Long
  180.  
  181. strIndent = String(lngIndent * 4, " ")
  182.  
  183. '一旦、本プロシージャで生成予定のTYPE_SQLにコピー
  184. tmpSQL = tSQL
  185.  
  186. 'フィールド文字列自動生成の例外(手動生成)
  187. tmpSQL.Fields(2).Exception = True
  188. 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
  189.  
  190. 'フィールド文字列の自動生成
  191. strField = MakeFldStringFromArry(tmpSQL.Alias, tmpSQL.Fields, lngIndent + 1)
  192.  
  193.  
  194. tmpSQL.SQL = "SELECT" & vbCrLf & strField & _
  195. strIndent & " T1.HOGE AS HOGE" & vbCrLf & _
  196. strIndent & "FROM" & vbCrLf & _
  197. strIndent & " (" & tSQL.SQL & vbCrLf & _
  198. strIndent & " ) " & tSQL.Alias & vbCrLf & _
  199. strIndent & "INNER JOIN" & vbCrLf & _
  200. strIndent & " TBLHOGEHOGE T1" & vbCrLf & _
  201. strIndent & "ON" & vbCrLf & _
  202. strIndent & " " & tSQL.Alias & ".FUGAFUGA=T1.FUGAGUGA"
  203.  
  204. 'フィールド文字列の例外を次への為に戻す
  205. tmpSQL.Fields(2).Exception = False
  206. tmpSQL.Fields(2).Field = "TEST3"
  207.  
  208. '本プロシージャで追加されたフィールド
  209. ReDim Preserve tmpSQL.Fields(UBound(tmpSQL.Fields) + 1) As TYPE_FIELD
  210. tmpSQL.Fields(UBound(tmpSQL.Fields)).Field = "HOGE"
  211.  
  212. MakeSQL_TEST = tmpSQL
  213.  
  214. End Function
  215. 'MakeSQL_TEST2のチェック用
  216. Private Sub testMakeSQL_TEST2()
  217.  
  218. Dim tSQL1 As TYPE_SQL
  219. Dim tSQL2 As TYPE_SQL
  220. Dim tSQL3 As TYPE_SQL
  221.  
  222. tSQL1 = MakeSQL_BASE(2)
  223. 'Debug.Print tSQL1.SQL
  224.  
  225.  
  226. tSQL1.Alias = "CHU"
  227. tSQL2 = MakeSQL_TEST(tSQL1, 1)
  228.  
  229. tSQL2.Alias = "BAO"
  230. tSQL3 = MakeSQL_TEST2(tSQL2)
  231.  
  232. Debug.Print tSQL3.SQL
  233.  
  234.  
  235. End Sub
  236. '**********************************************
  237. ' MakeSQL_TEST2
  238. ' ネストの有るSQLとフィールド情報を生成する例
  239. '
  240. ' 引数:tSQL ネストの子供のSQLとフィールド情報
  241. ' 引数:lngIndent インデント段
  242. '
  243. ' 条件:tSQLは接続フィールドとしてFIZFIZを持つ
  244. '
  245. ' 戻り値:生成されたSQLとフィールド情報
  246. '
  247. ' 2018/03/11
  248. ' Coded by YASUTADA OOBA
  249. '**********************************************
  250. Private Function MakeSQL_TEST2(tSQL As TYPE_SQL, Optional lngIndent As Long) As TYPE_SQL
  251.  
  252. Dim strField As String
  253. Dim tmpSQL As TYPE_SQL
  254. Dim strIndent As String
  255. Dim i As Long
  256.  
  257. strIndent = String(lngIndent * 4, " ")
  258.  
  259. '一旦、本プロシージャで生成予定のTYPE_SQLにコピー
  260. tmpSQL = tSQL
  261.  
  262. 'フィールド文字列自動生成の例外無し
  263.  
  264. 'フィールド文字列の自動生成
  265. strField = MakeFldStringFromArry(tmpSQL.Alias, tmpSQL.Fields, lngIndent + 1)
  266.  
  267.  
  268. tmpSQL.SQL = "SELECT" & vbCrLf & strField & _
  269. strIndent & " T3.HOEHOGE AS HOEHOE" & vbCrLf & _
  270. strIndent & "FROM" & vbCrLf & _
  271. strIndent & " (" & tSQL.SQL & vbCrLf & _
  272. strIndent & " ) " & tSQL.Alias & vbCrLf & _
  273. strIndent & "INNER JOIN" & vbCrLf & _
  274. strIndent & " TBL_HOE T3" & vbCrLf & _
  275. strIndent & "ON" & vbCrLf & _
  276. strIndent & " " & tSQL.Alias & ".FIZFIZ=T3.FIZFIZ"
  277.  
  278.  
  279. '本プロシージャで追加されたフィールド
  280. ReDim Preserve tmpSQL.Fields(UBound(tSQL.Fields) + 1) As TYPE_FIELD
  281. tmpSQL.Fields(UBound(tSQL.Fields)).Field = "HOEHOE"
  282.  
  283. MakeSQL_TEST2 = tmpSQL
  284.  
  285. End Function
Add Comment
Please, Sign In to add comment