본문 바로가기
  • 환영 합니다 ! Welcome!
VBA For Windchill

학습 03) Open API, 엑셀 VBA - WC 제품 이름 가져오기

by ToolBOX01 2024. 6. 30.
반응형

□ 소개

Windchill PDMLink의 제품 (Product Name)을 가져오는 프로그램 입니다. jsonconvert 프로그램을 설치 해야 합니다.
Rest API를 사용 하기 위해서는 JSON 구조를 이해해야 합니다. 또한 제 3자가 개발한 프로그램 을 설치 해야 합니다.

자세한것은 아래 블로그를 참고 합니다

 

[엑셀 크롤링] JSON 데이터 다루기 (기본 셋업)

안녕하세요. 하날리야입니다. 오늘은 크롤링을 하면서 웹 상에서 자주 등장하는 데이터 형태인 'JS...

blog.naver.com

또한 토큰 발생 함수를 만들어 사용 합니다. (Rest-API 사용을 위해서는 Windchill PDMLink 관리자의 지원을 받습니다)

 


▷ NonceToken 모듈 

전역 함수로 정의 합니다. "wc주소"는 Windchill PDMLink 주소 입니다. 접속기 ID와 비번을 입력 해야 합니다.
json 구조로 결과 값을 가져옵니다, (전문 용어 : Parsing) jsonCover 모듈로 일반 문자로 변환 합니다.
토큰 값은 "csrfToken" 변수에 저장 됩니다 . 

Option Explicit
Public xmlhttp As Object
Public responseJson As String
Public NonceTorken As Object
Public csrfToken As String
Public Sub GetToken001()
    
    '// MSXML2.XMLHTTP.6.0 객체를 만듭니다.
        Set xmlhttp = CreateObject("MSXML2.XMLHTTP.6.0")

    '// 요청 메서드를 GET으로 설정합니다.
    xmlhttp.Open "GET", "http://WC주소/Windchill/servlet/odata/PTC/GetCSRFToken()", False

    '// 요청 헤더를 설정합니다.
    xmlhttp.SetRequestHeader "Content-Type", "application/json"
    xmlhttp.SetRequestHeader "Accept", "application/json"

    '// 요청을 보냅니다.
    xmlhttp.Send

     '// 응답 상태를 확인합니다.
         If xmlhttp.status = 200 Then
            
            '// 응답 JSON을 가져옵니다.
            responseJson = xmlhttp.responseText
            
            '// JSON을 파싱합니다. (JsonConverter가 필요합니다)
            Set NonceTorken = JsonConverter.ParseJson(responseJson)
            
            '// CSRF 토큰값을 가져옵니다.
            csrfToken = NonceTorken("NonceValue")
            
            '//Worksheets("제품_Name").Cells(1, "C") = NonceTorken("NonceKey")
            '//Worksheets("제품_Name").Cells(2, "C") = NonceTorken("NonceValue")
            
            '//CSRF 토큰을 사용합니다.
            '// MsgBox "CSRF Token: " & csrfToken
            
           '// Debug.Print NonceTorken("NonceKey")
           '// Debug.Print NonceTorken("NonceValue")
            
        Else
            ' //오류 처리
            MsgBox "Error: " & xmlhttp.status
        End If

End Sub

 

▷ 제품 이름 가져오는 프로그램

REST API  사용 문서에 나오는 URL 주소를 사용 하여 Windchill PDMLink 서버로 토큰과 함깨 보내면,  Json 데이터 구조로 값을 가져올수 있습니다. 이것을 jsonCover 모듈로 변환 합니다. (배열의 형태로 변환 됩니다) 변환것을 이용하여 엑셀 파일에 자동 입력 합니다

Option Explicit
Sub ProductName01()

        '// 오류 발생 시 오류 메시지 출력
        On Error Resume Next
        
        Call MainGetToken.GetToken001
     
       '// 변수
        Dim xmlhttp As Object
        Set xmlhttp = CreateObject("MSXML2.XMLHTTP.6.0")
        Dim Url As String
        Dim requestBody As String
        Dim GetresponseText As String
        Dim status As Integer
        Dim jsonObject As Object
        Dim jsonItem As Object
        Dim ProductType As String
        
        Dim i, j As Integer
        

         '// URL 설정
        Url = "http://wc주소:80/Windchill/servlet/odata/v6/DataAdmin/Containers?$count=false"
       
            
        '// 서버와의 연결 열기
        xmlhttp.Open "GET", Url, False
        
        '//요청 헤더 설정
        xmlhttp.SetRequestHeader "Content-Type", "application/json"
        xmlhttp.SetRequestHeader "CSRF_NONCE", NonceTorken("NonceValue")
        
         '//요청 보내기
        xmlhttp.Send requestBody
    
        '// 오류 발생 시 디버그 창에 오류 메시지 출력
        If Err.Number <> 0 Then
            Debug.Print "Error " & Err.Number & ": " & Err.Description
            On Error GoTo 0
            Exit Sub
        End If
    
        '// 응답 상태 코드 가져오기
        status = xmlhttp.status
        
        '// 응답 텍스트 가져오기
        GetresponseText = xmlhttp.responseText
        
        '// JSON 파싱
        Set jsonObject = JsonConverter.ParseJson(GetresponseText)
        
        '// 데이터 엑셀에 출력
                i = 1
                j = 1
                For Each jsonItem In jsonObject("value")
                          If jsonItem("@odata.type") = "#PTC.DataAdmin.ProductContainer" Then
                                
                               Worksheets("제품_Name").Cells(j + 4, "A") = j
                               Worksheets("제품_Name").Cells(j + 4, "B") = jsonItem("ID")
                               Worksheets("제품_Name").Cells(j + 4, "C") = jsonItem("Name")
                                j = j + 1
                            
                           End If
                   i = i + 1
                Next jsonItem
        
        '// 응답 상태 및 텍스트 출력 (디버깅 용도)
        '//Debug.Print "Status: " & status
        '//Debug.Print "Response: " & GetresponseText
        
        '// 정리 작업
        Set xmlhttp = Nothing


End Sub

 

프로그램 실행 결과

 

 

'VBA For Windchill' 카테고리의 다른 글

학습 04) Open API, 엑셀 VBA - WC 폴더 만들기  (1) 2024.07.03
Windchill REST Services (WRS)  (0) 2024.07.01
VBA Web Parsing 2/2  (0) 2024.06.30
HTTP  (0) 2024.06.30
DOM (Document Object Model) 이란?  (0) 2024.06.30