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") ' 예: 원하는 순서
Reflash : 폴더를 선택 하면 하위 폴더에 포함된 모든 Creo 파일 이름을 가져옵니다.
Clear : 화면에 표시된 데이터를 지웁니다.
Insert Postgre : 지정된 데이터베이스 테이블로 데이터를 저장 합니다
Read Postgre : 지정된 데이터베이스 테이블의 모든 데이터를 가져 옵니다
Update Postgre : 기능 개발은 하지 않았습니다
Reflash