diff --git a/sql/juk_csv_item_definition.sql b/sql/juk_csv_item_definition.sql new file mode 100644 index 0000000..5e370e5 --- /dev/null +++ b/sql/juk_csv_item_definition.sql @@ -0,0 +1,40 @@ +DELETE FROM SH_CSV_ITEM_DEFINITION WHERE CODE = 'JUK'; +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 1, '職員番号', '' ,TRUE, 'CHAR', 8, NULL, FALSE, FALSE, '' ,TRUE, NULL, NULL, FALSE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 2, '事実発生年月日', '' ,TRUE, 'DATE', NULL, NULL, FALSE, TRUE, '' ,FALSE, NULL, NULL, FALSE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 3, '提出年月日', '' ,FALSE, 'DATE', NULL, NULL, FALSE, TRUE, '' ,FALSE, NULL, NULL, FALSE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 4, '受理年月日', '' ,FALSE, 'DATE', NULL, NULL, FALSE, TRUE, '' ,FALSE, NULL, NULL, FALSE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 5, '届出の事由コード', '' ,TRUE, 'MASTER', 2, NULL, FALSE, FALSE, '' ,TRUE, NULL, '215', FALSE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 6, '届出の備考', '' ,FALSE, 'VARCHAR', 20, NULL, TRUE, TRUE, '' ,FALSE, NULL, NULL, FALSE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 7, '本人)形態区分', '' ,FALSE, 'ENUM', 1, NULL, TRUE, FALSE, '' ,TRUE, '{1,2}', NULL, FALSE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 8, '本人)契約区分', '' ,FALSE, 'ENUM', 1, NULL, TRUE, FALSE, '' ,TRUE, '{0,1}', NULL, TRUE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 9, '本人)契約開始日', '' ,FALSE, 'DATE', NULL, NULL, TRUE, TRUE, '' ,FALSE, NULL, NULL, TRUE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 10, '本人)契約満了日', '' ,FALSE, 'DATE', NULL, NULL, TRUE, TRUE, '' ,FALSE, NULL, NULL, TRUE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 11, '本人)所在地1', '' ,FALSE, 'VARCHAR', 60, NULL, TRUE, TRUE, '' ,FALSE, NULL, NULL, TRUE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 12, '本人)所在地2', '' ,FALSE, 'VARCHAR', 40, NULL, TRUE, TRUE, '' ,FALSE, NULL, NULL, TRUE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 13, '本人)家賃等月額', '' ,FALSE, 'NUMBER', 8, NULL, TRUE, TRUE, '' ,FALSE, NULL, NULL, TRUE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 14, '本人)家賃区分_光熱費込', '' ,FALSE, 'ENUM', 1, NULL, TRUE, FALSE, '' ,TRUE, '{0,1}', NULL, TRUE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 15, '本人)家賃区分_まかない付き', '' ,FALSE, 'ENUM', 1, NULL, TRUE, FALSE, '' ,TRUE, '{0,1}', NULL, TRUE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 16, '配偶者)形態区分', '' ,FALSE, 'ENUM', 1, NULL, TRUE, FALSE, '' ,TRUE, '{1,2}', NULL, FALSE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 17, '配偶者)契約区分', '' ,FALSE, 'ENUM', 1, NULL, TRUE, FALSE, '' ,TRUE, '{0,1}', NULL, TRUE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 18, '配偶者)契約開始日', '' ,FALSE, 'DATE', NULL, NULL, TRUE, TRUE, '' ,FALSE, NULL, NULL, TRUE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 19, '配偶者)契約満了日', '' ,FALSE, 'DATE', NULL, NULL, TRUE, TRUE, '' ,FALSE, NULL, NULL, TRUE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 20, '配偶者)所在地1', '' ,FALSE, 'VARCHAR', 60, NULL, TRUE, TRUE, '' ,FALSE, NULL, NULL, TRUE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 21, '配偶者)所在地2', '' ,FALSE, 'VARCHAR', 40, NULL, TRUE, TRUE, '' ,FALSE, NULL, NULL, TRUE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 22, '配偶者)家賃等月額', '' ,FALSE, 'NUMBER', 8, NULL, TRUE, TRUE, '' ,FALSE, NULL, NULL, TRUE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 23, '配偶者)家賃区分_光熱費込', '' ,FALSE, 'ENUM', 1, NULL, TRUE, FALSE, '' ,TRUE, '{0,1}', NULL, TRUE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 24, '配偶者)家賃区分_まかない付き', '' ,FALSE, 'ENUM', 1, NULL, TRUE, FALSE, '' ,TRUE, '{0,1}', NULL, TRUE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 25, '自宅)所有者情報', '' ,FALSE, 'ENUM', 1, NULL, TRUE, FALSE, '' ,TRUE, '{1,2,3,4}', NULL, FALSE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 26, '自宅)所在地1', '' ,FALSE, 'VARCHAR', 60, NULL, TRUE, TRUE, '' ,FALSE, NULL, NULL, TRUE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 27, '自宅)所在地2', '' ,FALSE, 'VARCHAR', 40, NULL, TRUE, TRUE, '' ,FALSE, NULL, NULL, TRUE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 28, '自宅)入居日', '' ,FALSE, 'DATE', NULL, NULL, TRUE, TRUE, '' ,FALSE, NULL, NULL, TRUE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 29, '自宅)取得理由', '' ,FALSE, 'MASTER', 1, NULL, TRUE, FALSE, '' ,TRUE, NULL, '216', TRUE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 30, '自宅)新築・購入年月日', '' ,FALSE, 'DATE', NULL, NULL, TRUE, TRUE, '' ,FALSE, NULL, NULL, TRUE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 31, '自宅)購入後5年経過日', '' ,FALSE, 'DATE', NULL, NULL, TRUE, TRUE, '' ,FALSE, NULL, NULL, TRUE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 32, '該当条文1', '' ,FALSE, 'MASTER', 1, NULL, TRUE, FALSE, '' ,TRUE, NULL, '217', FALSE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 33, '該当条文2', '' ,FALSE, 'MASTER', 1, NULL, TRUE, FALSE, '' ,TRUE, NULL, '217', FALSE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 34, '支給の始期', '' ,FALSE, 'DATE', NULL, NULL, TRUE, TRUE, '' ,FALSE, NULL, NULL, TRUE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 35, '住居手当の月額', '' ,FALSE, 'NUMBER', 8, NULL, TRUE, TRUE, '' ,FALSE, NULL, NULL, TRUE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 36, '備考', '' ,FALSE, 'VARCHAR', 40, NULL, TRUE, TRUE, '' ,FALSE, NULL, NULL, FALSE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 37, '所属コード', '' ,FALSE, 'VARCHAR', 10, NULL, TRUE, TRUE, '' ,FALSE, NULL, NULL, FALSE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 38, '認定年月日', '' ,FALSE, 'DATE', NULL, NULL, TRUE, TRUE, '' ,FALSE, NULL, NULL, TRUE, FALSE, 'updsv7', CURRENT_TIMESTAMP); +INSERT INTO SH_CSV_ITEM_DEFINITION VALUES ('JUK', 39, '(各庁の長)官職コード', '' ,FALSE, 'MASTER', 3, NULL, TRUE, FALSE, '' ,TRUE, NULL, '507', TRUE, FALSE, 'updsv7', CURRENT_TIMESTAMP); diff --git a/src/sh/juk/init_module/Import_modules.bas b/src/sh/juk/init_module/Import_modules.bas new file mode 100644 index 0000000..9519bb4 --- /dev/null +++ b/src/sh/juk/init_module/Import_modules.bas @@ -0,0 +1,39 @@ +' ============================================================ +' JUK Import - Simple Version +' ============================================================ +Option Explicit + +Sub ImportJukModules() + Const MODULE_PATH As String = "D:\Project\upds7\vba\src\sh\juk\module" + + Dim fso As Object + Set fso = CreateObject("Scripting.FileSystemObject") + + If Not fso.FolderExists(MODULE_PATH) Then + MsgBox "Folder not found" + Exit Sub + End If + + Dim file As Object + For Each file In fso.GetFolder(MODULE_PATH).Files + If LCase(fso.GetExtensionName(file.Name)) = "bas" Then + Dim modName As String + modName = fso.GetBaseName(file.Name) + + On Error Resume Next + ThisWorkbook.VBProject.VBComponents.Remove ThisWorkbook.VBProject.VBComponents(modName) + + ThisWorkbook.VBProject.VBComponents.Import file.Path + + If Err.Number <> 0 Then + MsgBox "Error: " & Err.Description & " (" & Err.Number & ")" + Exit Sub + End If + + On Error GoTo 0 + Debug.Print "Imported: " & modName + End If + Next + + MsgBox "Done" +End Sub \ No newline at end of file diff --git a/src/sh/juk/module/Common_Button.bas b/src/sh/juk/module/Common_Button.bas new file mode 100644 index 0000000..f3e019f --- /dev/null +++ b/src/sh/juk/module/Common_Button.bas @@ -0,0 +1,11 @@ +Attribute VB_Name = "Common_Button" +Option Explicit +' ============================================================ +' Module Name: Common_Button +' Module Desc: Common_Button +' Module Methods: +' - CSV_Import_Button +' ============================================================ +Sub DDL_Generate_Button() + GenerateJukCsvItemDefinition ActiveSheet +End Sub \ No newline at end of file diff --git a/src/sh/juk/module/SQL_Generate.bas b/src/sh/juk/module/SQL_Generate.bas new file mode 100644 index 0000000..1737c76 --- /dev/null +++ b/src/sh/juk/module/SQL_Generate.bas @@ -0,0 +1,230 @@ +Attribute VB_Name = "SQL_Generate" +Option Explicit +' ============================================================ +' JUK SQL Generator +' ============================================================ + +Public Sub GenerateJukCsvItemDefinition(ws As Worksheet) + Dim codePrefix As String: codePrefix = ws.CodeName + Dim outputFileName As String: outputFileName = LCase(codePrefix) & "_csv_item_definition.sql" + Dim csvFileName As String: csvFileName = LCase(codePrefix) & "_csv_item_definition.csv" + + Dim lastRow As Long: lastRow = ws.Cells(ws.Rows.Count, 4).End(xlUp).Row + If lastRow < 9 Then + MsgBox "No data found." + Exit Sub + End If + + Dim expectedSeq As Long: expectedSeq = 1 + Dim i As Long + For i = 9 To lastRow + Dim itemSeq As Long + itemSeq = Val(Trim(CStr(ws.Cells(i, 3).Value))) + If itemSeq = 0 Then + lastRow = i - 1 + Exit For + End If + If itemSeq <> expectedSeq Then + MsgBox "Seq error. Expected: " & expectedSeq & ", Actual: " & itemSeq & " (Row " & i & ")" + Exit Sub + End If + expectedSeq = expectedSeq + 1 + Next + + For i = 9 To lastRow + If Not ValidateRow(ws, i) Then Exit Sub + Next + + Dim sqlHeader As String: sqlHeader = "DELETE FROM sh_csv_item_definition WHERE CODE = '" & UCase(codePrefix) & "';" & vbCrLf + Dim sqlLines As String: sqlLines = sqlHeader + For i = 9 To lastRow + sqlLines = sqlLines & GenerateSqlForRow(ws, i, codePrefix) & vbCrLf + Next + + If sqlLines = "" Then + MsgBox "No data to output." + Exit Sub + End If + + Dim outputPath As String: outputPath = ThisWorkbook.Path & "\" & outputFileName + Dim fileNum As Long: fileNum = FreeFile + Open outputPath For Output As #fileNum + Print #fileNum, sqlLines; + Close #fileNum + + ' Generate CSV (columns matching INSERT INTO order) + Dim csvHeader As String: csvHeader = "CODE,ITEM_SEQ,ITEM_TITLE,ITEM_NAME,IS_DUPLICATE_CHECK_KEY,DATA_TYPE,PRECISION,SCALE,NULLABLE,ENABLE_FORMAT_CHECK,FORMAT_REGEX,ENABLE_EXIST_CHECK,ALLOWED_VALUES,MASTER_SYBT,ENABLE_RELATION_CHECK,JSON_IGNORE,CMNUSER" + Dim csvLines As String: csvLines = csvHeader & vbCrLf + For i = 9 To lastRow + csvLines = csvLines & GenerateCsvRow(ws, i, codePrefix) & vbCrLf + Next + + Dim csvPath As String: csvPath = ThisWorkbook.Path & "\" & csvFileName + fileNum = FreeFile + Open csvPath For Output As #fileNum + Print #fileNum, csvLines; + Close #fileNum + + MsgBox "Files generated:" & vbCrLf & outputPath & vbCrLf & csvPath +End Sub + +Private Function ValidateRow(ws As Worksheet, rowNum As Long) As Boolean + ValidateRow = True + + Dim itemTitle As String: itemTitle = Trim(CStr(ws.Cells(rowNum, 4).Value)) + Dim dataType As String: dataType = Trim(CStr(ws.Cells(rowNum, 16).Value)) + Dim jsonIgnore As String: jsonIgnore = Trim(CStr(ws.Cells(rowNum, 61).Value)) + + If itemTitle = "" Then + MsgBox "item_title is empty. (Row " & rowNum & ")" + ValidateRow = False + Exit Function + End If + + If dataType = "" Then + MsgBox "data_type is empty. (Row " & rowNum & " - " & itemTitle & ")" + ValidateRow = False + Exit Function + End If + + If jsonIgnore = "" Then + MsgBox "json_ignore is empty. (Row " & rowNum & " - " & itemTitle & ")" + ValidateRow = False + Exit Function + End If + + Dim allowedValues As String: allowedValues = Trim(CStr(ws.Cells(rowNum, "AA").Value)) + Dim isFormatCheck As String: isFormatCheck = Trim(CStr(ws.Cells(rowNum, "X").Value)) + + Select Case UCase(dataType) + Case "ENUM" + If allowedValues = "" Then + MsgBox "ENUM type must have allowed_values. (Row " & rowNum & " - " & itemTitle & ")" + ValidateRow = False + Exit Function + End If + If Not ValidateEnumFormat(allowedValues) Then + MsgBox "ENUM format error. (Row " & rowNum & " - " & itemTitle & ")" + ValidateRow = False + Exit Function + End If + Case "MASTER" + If Len(allowedValues) <> 3 Or Not IsNumeric(allowedValues) Then + MsgBox "MASTER type must be 3-digit number. (Row " & rowNum & " - " & itemTitle & ")" + ValidateRow = False + Exit Function + End If + Case "DATE", "VARCHAR", "NUMBER" + If isFormatCheck = "" Then + MsgBox dataType & " type must have required. (Row " & rowNum & " - " & itemTitle & ")" + ValidateRow = False + Exit Function + End If + End Select +End Function + +Private Function ValidateEnumFormat(s As String) As Boolean + ValidateEnumFormat = False + Dim items As Variant: items = Split(s, ", ") + Dim i As Long + For i = LBound(items) To UBound(items) + Dim item As String: item = Trim(items(i)) + If item = "" Then Exit Function + Dim parts As Variant: parts = Split(item, ":") + If UBound(parts) <> 1 Then Exit Function + If Not IsNumeric(parts(0)) Then Exit Function + Next + ValidateEnumFormat = True +End Function + +Private Function GenerateSqlForRow(ws As Worksheet, rowNum As Long, codePrefix As String) As String + Dim itemTitle As String: itemTitle = Trim(CStr(ws.Cells(rowNum, 4).Value)) + If itemTitle = "" Then + GenerateSqlForRow = "" + Exit Function + End If + + Dim itemSeq As Long: itemSeq = Val(Trim(CStr(ws.Cells(rowNum, 3).Value))) + Dim dataType As String: dataType = Trim(CStr(ws.Cells(rowNum, 16).Value)) + Dim allowedValues As String: allowedValues = Trim(CStr(ws.Cells(rowNum, 27).Value)) + + ' Parse data_type (e.g. VARCHAR(60) -> dataType='VARCHAR', precision=60) + Dim precision As String: precision = "NULL" + Dim vScale As String: vScale = "NULL" + Dim dtType As String: dtType = dataType + Dim pos As Long + Dim nums As String + + If InStr(dataType, "(") > 0 Then + pos = InStr(dataType, "(") + dtType = Trim(Left(dataType, pos - 1)) + nums = Mid(dataType, pos + 1) + nums = Trim(Left(nums, InStr(nums, ")") - 1)) + precision = nums + If InStr(UCase(dataType), "NUMBER") > 0 And InStr(nums, ", ") > 0 Then + vScale = Trim(Mid(nums, InStr(nums, ", ") + 1)) + End If + End If + + Dim isPk As String: isPk = SqlBool(GetIsChecked(ws, rowNum, "V")) + Dim isRequired As String: isRequired = SqlBool(GetIsChecked(ws, rowNum, "W")) + Dim isFormatCheck As String: isFormatCheck = SqlBool(GetIsChecked(ws, rowNum, "X")) + Dim isExistCheck As String: isExistCheck = SqlBool(GetIsChecked(ws, rowNum, "Y")) + Dim isRelationCheck As String: isRelationCheck = SqlBool(GetIsChecked(ws, rowNum, "Z")) + Dim isJsonIgnore As String: isJsonIgnore = SqlBool(GetIsChecked(ws, rowNum, "BI")) + + Dim code As String: code = "'" & UCase(codePrefix) & "'" + Dim itemTitleStr As String: itemTitleStr = SqlString(itemTitle) + Dim dataTypeStr As String: dataTypeStr = SqlString(dtType) + + ' For MASTER type, store in MASTER_SYBT; for others, store in ALLOWED_VALUES + Dim allowedValuesStr As String + Dim masterSybt As String + If UCase(dtType) = "MASTER" Then + masterSybt = "'" & allowedValues & "'" + allowedValuesStr = "NULL" + Else + masterSybt = "NULL" + If allowedValues = "" Then + allowedValuesStr = "NULL" + Else + allowedValuesStr = "'{" & allowedValues & "}'" + End If + End If + Dim cmnuser As String: cmnuser = "'updsv7'" + Dim dmndate As String: dmndate = "CURRENT_TIMESTAMP" + + Dim nullable As String: nullable = IIf(isRequired = "TRUE", "FALSE", "TRUE") + + GenerateSqlForRow = "INSERT INTO SH_CSV_ITEM_DEFINITION VALUES (" & _ + code & ", " & itemSeq & ", " & itemTitleStr & ", '' ," & isPk & ", " & dataTypeStr & ", " & _ + precision & ", " & vScale & ", " & nullable & ", " & isFormatCheck & ", '' ," & isExistCheck & ", " & _ + allowedValuesStr & ", " & masterSybt & ", " & isRelationCheck & ", " & isJsonIgnore & ", " & cmnuser & ", " & dmndate & ");" +End Function + +Private Function SqlBool(b As Boolean) As String + SqlBool = IIf(b, "TRUE", "FALSE") +End Function + +Private Function GetIsChecked(ws As Worksheet, rowNum As Long, colNumOrLetter As Variant) As Boolean + Dim colNum As Long + If VarType(colNumOrLetter) = vbString Then + colNum = ws.Range(colNumOrLetter & "1").Column + Else + colNum = CLng(colNumOrLetter) + End If + Dim val As String: val = Trim(CStr(ws.Cells(rowNum, colNum).Value)) + If val = "" Or val = "FALSE" Then + GetIsChecked = False + Else + GetIsChecked = True + End If +End Function + +Private Function SqlString(s As String) As String + If s = "" Then + SqlString = "NULL" + Else + SqlString = "'" & Replace(s, "'", "''") & "'" + End If +End Function \ No newline at end of file diff --git a/src/sh/juk/sheet/J1.cls b/src/sh/juk/sheet/J1.cls deleted file mode 100644 index 3afb4b2..0000000 --- a/src/sh/juk/sheet/J1.cls +++ /dev/null @@ -1,292 +0,0 @@ -' ============================================================ -' JUK CSV Item Definition Generator -' -' Description: -' Excel の CSV 項目定義シートから sh_csv_item_definition テーブル用の -' DML INSERT 文を生成する -' -' Usage: -' 1. 「CSV項目定義」シートを開く -' 2. VBAエディタで J1.cls をインポート -' 3. GenerateJukCsvItemDefinition マクロを実行 -' 4. 同じフォルダに juk_csv_item_definition.sql が生成される -' -' Column Mapping: -' C - 順序号 (item_seq) -' D - 項目名 (item_title) -' P - データ型 (data_type) -' V - PK (is_duplicate_check_key) -' W - 必须入力 (nullable) - 反転 -' X - 定義チェック (enable_format_check) -' Y - 存在チェック (enable_exist_check) -' Z - 関連チェック (enable_relation_check) -' AA -許可値 (allowed_values) -' BI - JsonIgnore (json_ignore) -' -' Output Sample: -' INSERT INTO sh_csv_item_definition (CODE, ITEM_SEQ, ITEM_TITLE, ITEM_NAME, IS_DUPLICATE_CHECK_KEY, DATA_TYPE, PRECISION, SCALE, NULLABLE, ENABLE_FORMAT_CHECK, FORMAT_REGEX, ENABLE_EXIST_CHECK, ALLOWED_VALUES, MASTER_SYBT, ENABLE_RELATION_CHECK, JSON_IGNORE, CMNUSER) VALUES ('JUK', 1, '職員番号', '', TRUE, 'CHAR', 8, NULL, FALSE, FALSE, '', TRUE, NULL, '', FALSE, FALSE, 'updsv7'); -' ============================================================ - -Option Explicit - -' --- 設定 --- -Private Const TARGET_SHEET_NAME As String = "CSV項目定義" -Private Const OUTPUT_FILE_NAME As String = "juk_csv_item_definition.sql" -Private Const DATA_START_ROW As Long = 9 -Private Const CODE_PREFIX As String = "JUK" -Private Const DEFAULT_CMNUSER As String = "updsv7" - -' --- カラム位置 (Excel 列番号) --- -Private Const COL_ITEM_SEQ As Long = 3 -Private Const COL_ITEM_TITLE As Long = 4 -Private Const COL_DATA_TYPE As Long = 16 -Private Const COL_PK As Long = 22 -Private Const COL_REQUIRED As Long = 23 -Private Const COL_FORMAT_CHECK As Long = 24 -Private Const COL_EXIST_CHECK As Long = 25 -Private Const COL_RELATION_CHECK As Long = 26 -Private Const COL_ALLOWED_VALUES As Long = 27 -Private Const COL_JSON_IGNORE As Long = 61 - -' --- フィールド名 (DDLフィールド名→大写) --- -Private Const CODE = "CODE" -Private Const ITEM_SEQ = "ITEM_SEQ" -Private Const ITEM_TITLE = "ITEM_TITLE" -Private Const ITEM_NAME = "ITEM_NAME" -Private Const IS_DUPLICATE_CHECK_KEY = "IS_DUPLICATE_CHECK_KEY" -Private Const DATA_TYPE = "DATA_TYPE" -Private Const PRECISION = "PRECISION" -Private Const SCALE = "SCALE" -Private Const NULLABLE = "NULLABLE" -Private Const ENABLE_FORMAT_CHECK = "ENABLE_FORMAT_CHECK" -Private Const FORMAT_REGEX = "FORMAT_REGEX" -Private Const ENABLE_EXIST_CHECK = "ENABLE_EXIST_CHECK" -Private Const ALLOWED_VALUES = "ALLOWED_VALUES" -Private Const MASTER_SYBT = "MASTER_SYBT" -Private Const ENABLE_RELATION_CHECK = "ENABLE_RELATION_CHECK" -Private Const JSON_IGNORE = "JSON_IGNORE" -Private Const CMNUSER = "CMNUSER" - - -' ============================================================ -' Main: GenerateJukCsvItemDefinition -' ============================================================ -Public Sub GenerateJukCsvItemDefinition() - Dim ws As Worksheet - Dim outputPath As String - Dim sqlLines As String - Dim lastRow As Long - Dim i As Long - Dim sql As String - - On Error Resume Next - Set ws = ThisWorkbook.Worksheets(TARGET_SHEET_NAME) - On Error GoTo 0 - - If ws Is Nothing Then - MsgBox "シート [" & TARGET_SHEET_NAME & "] が見つかりません。", vbExclamation - Exit Sub - End If - - lastRow = ws.Cells(ws.Rows.Count, COL_ITEM_TITLE).End(xlUp).Row - - If lastRow < DATA_START_ROW Then - MsgBox "データが見つかりません。", vbExclamation - Exit Sub - End If - - sqlLines = "" - - For i = DATA_START_ROW To lastRow - sql = GenerateSqlForRow(ws, i) - If sql <> "" Then - sqlLines = sqlLines & sql & vbCrLf - End If - Next i - - If sqlLines = "" Then - MsgBox "出力するデータがありませんでした。", vbInformation - Exit Sub - End If - - outputPath = ThisWorkbook.Path & "\" & OUTPUT_FILE_NAME - - Call WriteTextFile(outputPath, FormatSql(sqlLines)) - - MsgBox "SQLファイルを生成しました:" & vbCrLf & outputPath, vbInformation - -End Sub - - -' ============================================================ -' Generate SQL for a single row -' IDE表示用: 只需要对value做注释 -' ============================================================ -Private Function GenerateSqlForRow(ws As Worksheet, rowNum As Long) As String - Dim itemTitle As String - Dim itemSeq As Long - Dim sqlParts As Variant - - itemTitle = GetCellValue(ws, rowNum, COL_ITEM_TITLE) - If itemTitle = "" Then - GenerateSqlForRow = "" - Exit Function - End If - - itemSeq = CLng(GetCellValue(ws, rowNum, COL_ITEM_SEQ)) - - sqlParts = Array( _ - "INSERT INTO sh_csv_item_definition (", _ ' INSERT INTO - CODE & ",", _ ' code - ITEM_SEQ & ",", _ ' item_seq - ITEM_TITLE & ",", _ ' item_title - ITEM_NAME & ",", _ ' item_name - IS_DUPLICATE_CHECK_KEY & ",", _ ' is_duplicate_check_key - DATA_TYPE & ",", _ ' data_type - PRECISION & ",", _ ' precision - SCALE & ",", _ ' scale - NULLABLE & ",", _ ' nullable - ENABLE_FORMAT_CHECK & ",", _ ' enable_format_check - FORMAT_REGEX & ",", _ ' format_regex - ENABLE_EXIST_CHECK & ",", _ ' enable_exist_check - ALLOWED_VALUES & ",", _ ' allowed_values - MASTER_SYBT & ",", _ ' master_sybt - ENABLE_RELATION_CHECK & ",", _ ' enable_relation_check - JSON_IGNORE & ",", _ ' json_ignore - CMNUSER & ")", _ ' cmnuser - ") VALUES (", _ ' VALUES - GetCode(), _ ' code - GetItemSeq(itemSeq), _ ' item_seq - SqlString(itemTitle), _ ' item_title - GetIsChecked(ws, rowNum, COL_PK), _ ' is_duplicate_check_key - SqlString(GetCellValue(ws, rowNum, COL_DATA_TYPE)), _ ' data_type - GetNull(), _ ' precision - GetNull(), _ ' scale - Not GetIsChecked(ws, rowNum, COL_REQUIRED), _ ' nullable - GetIsChecked(ws, rowNum, COL_FORMAT_CHECK), _ ' enable_format_check - GetEmptyStr(), _ ' format_regex - GetIsChecked(ws, rowNum, COL_EXIST_CHECK), _ ' enable_exist_check - SqlArrayOrNull(GetCellValue(ws, rowNum, COL_ALLOWED_VALUES)), _ ' allowed_values - GetEmptyStr(), _ ' master_sybt - GetIsChecked(ws, rowNum, COL_RELATION_CHECK), _ ' enable_relation_check - GetIsChecked(ws, rowNum, COL_JSON_IGNORE, True), _ ' json_ignore - GetCmnuser()) ' cmnuser - - GenerateSqlForRow = Join(sqlParts, "") - -End Function - - -' ============================================================ -' Helper: Get code value -' ============================================================ -Private Function GetCode() As String - GetCode = "'" & CODE_PREFIX & "', " -End Function - - -' ============================================================ -' Helper: Get item_seq value -' ============================================================ -Private Function GetItemSeq(seq As Long) As String - GetItemSeq = seq & ", " -End Function - - -' ============================================================ -' Helper: Get cmnuser value -' ============================================================ -Private Function GetCmnuser() As String - GetCmnuser = "'" & DEFAULT_CMNUSER & "'" -End Function - - -' ============================================================ -' Helper: Get NULL value -' ============================================================ -Private Function GetNull() As String - GetNull = "NULL, " -End Function - - -' ============================================================ -' Helper: Get empty string value -' ============================================================ -Private Function GetEmptyStr() As String - GetEmptyStr = "'', " -End Function - - -' ============================================================ -' Format: 去掉IDE的换行和缩进,输出1行 -' ============================================================ -Private Function FormatSql(sql As String) As String - Dim lines As Variant - Dim i As Long - Dim result As String - - lines = Split(sql, vbCrLf) - result = "" - - For i = LBound(lines) To UBound(lines) - If Trim(lines(i)) <> "" Then - result = result & Trim(lines(i)) - End If - Next i - - FormatSql = result -End Function - - -' ============================================================ -' Helper: Get cell value as string (trimmed) -' ============================================================ -Private Function GetCellValue(ws As Worksheet, rowNum As Long, colNum As Long) As String - GetCellValue = Trim(CStr(ws.Cells(rowNum, colNum).Value)) -End Function - - -' ============================================================ -' Helper: Check if cell contains "○" -' ============================================================ - - -' ============================================================ -' Helper: Boolean to SQL string -' ============================================================ - - -' ============================================================ -' Helper: String to SQL (quoted and escaped) -' ============================================================ -Private Function SqlString(s As String) As String - If s = "" Then - SqlString = "NULL, " - Else - SqlString = "'" & Replace(s, "'", "''") & "', " - End If -End Function - - -' ============================================================ -' Helper: Array string to SQL or NULL -' ============================================================ -Private Function SqlArrayOrNull(s As String) As String - If s = "" Then - SqlArrayOrNull = "NULL, " - Else - SqlArrayOrNull = "'{" & s & "}', " - End If -End Function - - -' ============================================================ -' Helper: Write text file -' ============================================================ -Private Sub WriteTextFile(filePath As String, content As String) - Dim fileNum As Long - fileNum = FreeFile - Open filePath For Output As #fileNum - Print #fileNum, content; - Close #fileNum -End Sub \ No newline at end of file