VBA, VB.NET For Creo

Creo Parameter <=> PostgreSQL Table #8

ToolBOX01 2025. 1. 4. 17:41
반응형

데이터베이스에서 데이터 읽어 오기 ( Sub GetPostgreSQLData() )

Option Explicit
Public ws As Worksheet

Sub GetFilesInFolder()
    Dim fldr As FileDialog
    Dim fldrPath As String
    Dim iRow As Long
    Dim hasCreoFiles As Boolean ' Creo 파일 존재 여부 확인 변수
 
    Set ws = ThisWorkbook.Worksheets("File_List")
    
    ' 폴더 선택 대화상자 생성
    Set fldr = Application.FileDialog(msoFileDialogFolderPicker)
    With fldr
        .Title = "파일이 있는 폴더를 선택하세요"
        If .Show <> -1 Then Exit Sub ' 사용자가 취소하면 종료
        fldrPath = .SelectedItems(1)
    End With

    ' 엑셀 시트 초기화 (A열: 파일 번호, B열: 파일 이름, C열: 폴더 이름, D열: 파일 유형, E열: 수정 날짜)
    ws.Rows("8:" & ws.Rows.Count).ClearContents
    iRow = 1
    hasCreoFiles = False ' 초기값 설정

    ' 재귀 함수 호출하여 파일 목록 가져오기
    Call ListFiles(fldrPath, iRow, hasCreoFiles)

    ' Creo 파일이 없는 경우 메시지 표시
    If Not hasCreoFiles Then
        MsgBox "Creo 파일이 없습니다!"
    Else
        MsgBox "파일 목록을 성공적으로 추출했습니다."
    End If
End Sub

Sub ListFiles(ByVal strFolder As String, ByRef iRow As Long, ByRef hasCreoFiles As Boolean)
    Dim objFSO As Object
    Dim objFolder As Object
    Dim objFile As Object
    Dim fileType As String

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFSO.GetFolder(strFolder)

    ' 파일 목록에서 .PRT, .ASM, .DRW 포함하는 파일 필터링
    For Each objFile In objFolder.Files
        fileType = GetFileType(LCase(objFile.Name)) ' 파일 유형 확인
        If fileType <> "" Then
             ws.Cells(iRow + 7, "A").Value = iRow
             ws.Cells(iRow + 7, "B").Value = objFile.Name
             ws.Cells(iRow + 7, "C").Value = strFolder
             ws.Cells(iRow + 7, "D").Value = fileType ' 파일 유형 기록
             ws.Cells(iRow + 7, "E").Value = objFile.DateLastModified ' 수정 날짜 기록
             iRow = iRow + 1
             hasCreoFiles = True ' Creo 파일이 발견되면 True로 변경
        End If
    Next objFile

    ' 하위 폴더 재귀 호출
    For Each objFolder In objFolder.SubFolders
        Call ListFiles(objFolder.Path, iRow, hasCreoFiles)
    Next objFolder
End Sub

Function GetFileType(ByVal fileName As String) As String
    ' 파일 이름에 따라 파일 유형 반환
    If InStr(1, fileName, ".prt", vbTextCompare) > 0 Then
        GetFileType = "PRT"
    ElseIf InStr(1, fileName, ".asm", vbTextCompare) > 0 Then
        GetFileType = "ASM"
    ElseIf InStr(1, fileName, ".drw", vbTextCompare) > 0 Then
        GetFileType = "DRW"
    Else
        GetFileType = ""
    End If
End Function

Sub clear01()
    Dim CrentWS As Worksheet
    Set CrentWS = ThisWorkbook.Worksheets("File_List")
     
    CrentWS.Rows("8:" & CrentWS.Rows.Count).ClearContents
End Sub

Sub InsertDataToPostgreSQL()
    Dim conn As Object
    Dim query As String
    Dim lastRow As Long
    Dim i As Long
    Dim PostWS As Worksheet
    Set PostWS = ThisWorkbook.Worksheets("File_List")

    ' PostgreSQL ODBC 연결 문자열
    Dim connectionString As String
    connectionString = "Driver={PostgreSQL Unicode(x64)};" & _
                       "Server=localhost;" & _
                       "Port=5432;" & _
                       "Database=creomodel01;" & _
                       "Uid=postgres;" & _
                       "Pwd=4504;"

    ' ODBC 연결 열기
    Set conn = CreateObject("ADODB.Connection")
    On Error GoTo ErrorHandler
    conn.Open connectionString

    ' 데이터 삽입
    With PostWS
        lastRow = .Cells(.Rows.Count, 1).End(xlUp).row ' A열 기준 마지막 데이터 행 찾기

        For i = 1 To lastRow ' 데이터가 2행부터 시작한다고 가정
            Dim modelname As String
            Dim modeltype As String
            Dim modellocation As String
            Dim datemodified As Variant
            Dim formattedDate As String

            ' 셀 데이터 읽기
            modelname = Replace(.Cells(i + 7, "B").Value, "'", "''") ' 특수문자 이스케이프
            modeltype = Replace(.Cells(i + 7, "D").Value, "'", "''")
            modellocation = Replace(.Cells(i + 7, "C").Value, "'", "''")
            datemodified = Replace(.Cells(i + 7, "E").Value, "'", "''")

            ' 데이터가 비어 있는 경우 건너뛰기
            If IsEmpty(datemodified) Or datemodified = "" Then
                Debug.Print "비어 있는 데이터 - 행 번호: " & i + 7
                GoTo SkipRow
            End If

            ' 날짜 형식 유효성 검사
            If IsDate(datemodified) Then
                formattedDate = Format(CDate(datemodified), "yyyy-mm-dd HH:nn:ss")
            Else
                ' 유효하지 않은 데이터가 있는 경우 로그 작성 및 건너뛰기
                Debug.Print "유효하지 않은 데이터 - 행 번호: " & i + 7
                MsgBox "유효하지 않은 날짜 형식이 발견되었습니다. 행 번호: " & i + 7, vbExclamation
                GoTo SkipRow
            End If

            ' SQL 쿼리 작성
            query = "INSERT INTO ""DesignTeam"".""modelinfo"" (modelname, modeltype, modellocation, datemodified) " & _
                    "VALUES ('" & modelname & "', '" & modeltype & "', '" & modellocation & "', '" & formattedDate & "');"

            ' 디버그용 쿼리 출력
            Debug.Print query

            ' SQL 실행
            conn.Execute query

SkipRow:
        Next i
    End With

    ' 연결 닫기
    conn.Close
    Set conn = Nothing
    MsgBox "데이터베이스에 데이터가 성공적으로 삽입되었습니다."
    Exit Sub

ErrorHandler:
    MsgBox "오류 발생: " & Err.Description, vbCritical
    If Not conn Is Nothing Then conn.Close
    Set conn = Nothing
End Sub

Sub GetPostgreSQLData()
    '// 변수 선언
    Dim conn As Object
    Dim rs As Object
    Dim connectionString As String
    Dim query As String
    Dim ws As Worksheet
    Dim i As Integer
    Dim row As Long
    Dim fieldOrder As Variant ' 필드 출력 순서
    
    '// 워크시트 지정
    Set ws = ThisWorkbook.Sheets("File_List")
    
    '// PostgreSQL ODBC 연결 문자열
    connectionString = "Driver={PostgreSQL Unicode(x64)};" & _
                       "Server=localhost;" & _
                       "Port=5432;" & _
                       "Database=creomodel01;" & _
                       "Uid=postgres;" & _
                       "Pwd=4504;"
    
    '// SQL 쿼리 작성 (스키마 : DesignTeam)
    query = "SELECT * FROM ""DesignTeam"".modelinfo;"
    
    '// 필드 출력 순서 정의 (원하는 순서로 설정)
    ' 필드 이름은 PostgreSQL 테이블의 필드 이름과 동일해야 합니다.
    fieldOrder = Array("modelname", "modellocation", "modeltype", "datemodified", "id") ' 예: 원하는 순서
    
    '// ADODB 객체 생성
    On Error GoTo ErrorHandler
    Set conn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    
    '// 데이터베이스와 연결 열기
    conn.Open connectionString
    
    '// SQL 실행
    rs.Open query, conn, 1, 1 '// 1, 1은 adOpenKeyset과 adLockReadOnly를 의미
    
    '// 워크시트 초기화
    ws.Rows("8:" & ws.Rows.Count).ClearContents ' A8 이후 행 초기화
    
    '// 데이터 출력
    If Not rs.EOF Then
       
        
        '// 데이터 출력 (A8부터 시작)
        row = 0
        Do While Not rs.EOF
            For i = LBound(fieldOrder) To UBound(fieldOrder)
                ws.Cells(row + 8, "A").Value = row + 1
                ws.Cells(row + 8, i + 2).Value = rs.Fields(fieldOrder(i)).Value
            Next i
            rs.MoveNext
            row = row + 1
        Loop
    Else
        MsgBox "No data found in the table.", vbExclamation
    End If
    
    ' 연결 닫기
    rs.Close
    conn.Close
    Set rs = Nothing
    Set conn = Nothing
    
    MsgBox "Data imported successfully!", vbInformation
    Exit Sub

ErrorHandler:
    MsgBox "Error: " & Err.Description, vbCritical
    If Not rs Is Nothing Then rs.Close
    If Not conn Is Nothing Then conn.Close
End Sub

 

필드 출력 순서 지정
fieldOrder 배열을 사용하여 출력 순서를 지정합니다. 예제에서는 PostgreSQL의 테이블 필드 이름을 field3, field1, field2 순서로 설정했습니다. 필요에 따라 이 배열을 수정하세요.

' 필드 이름은 PostgreSQL 테이블의 필드 이름과 동일해야 합니다.
    fieldOrder = Array("modelname", "modellocation", "modeltype", "datemodified", "id") ' 예: 원하는 순서

 

File Name List.xlsm
0.10MB

 

Reflash : 폴더를 선택 하면 하위 폴더에 포함된 모든 Creo 파일 이름을 가져옵니다.

Clear : 화면에 표시된 데이터를 지웁니다.

Insert Postgre : 지정된 데이터베이스 테이블로 데이터를 저장 합니다

Read Postgre : 지정된 데이터베이스 테이블의 모든 데이터를 가져 옵니다

Update Postgre : 기능 개발은 하지 않았습니다

Reflash