목록으로

Report 생성하기

Pml Example 1

PML을 처음 학습하는데 있어서 폼을 만드는건 여러 명령어들을 알 수있고 Report를 뽑아보면서 pml을 쉽게 이해할 수 있는 것 같아 우선 Report를 만드는법 부터 하나하나 작성해보려고 합니다. 또한 Collect시 pml1보다는 pml2 방식으로 진행하도록 하겠습니다.

TXT로 저장, EXCEL로 저장, REPORT 속도개선 등 하나하나 작성하도록 하겠습니다.

1. (.TXT)로 Report 뽑기

1. txt추출 기본개념

Report를 가장 간단하게 만드는 방법은 .txt파일로 추출하는 겁니다.

우선 코드부터 보여드리겠습니다

!path = |D:test.txt|
!file = object File(!path)
!data = object array()
!data.append(|A,B,C|)
!data.append(|AA,BB,CC|)

!file.writefile(|overwrite|,!data)

1. 저장할 파일 지정

!path = |D:test.txt| !file = object File(!path)

파일 경로지정 > 파일 객체 생성 > 파일에 데이터 삽입 과 같은 과정인데 파일에 데이터 삽입 전까지만 한다고 보면 됩니다.

Object File(경로) 와 같은식으로 고정적으로 사용하면 되며 추가적으로 궁금하시면 아래 링크에서 확인해 주세요

2. Data 생성

.txt로 데이터 저장할땐 당연하겠지만 반드시 Array데이터만 저장이 가능합니다.

임의로 아래와 같이 데이터를 삽입하였습니다.

!data = object array() !data.append(|A,B,C|) !data.append(|AA,BB,CC|)

3. 파일에 데이터 삽입

!file.writefile(|overwrite|,!data)

writefile을 사용해서 !file에 Data를 삽입합니다

이렇게 하면 최종적으로 D:test.txt 위치에 첫번째줄엔 A,B,C 두번째줄엔 AA,BB,CC인 텍스트 파일이 생성됩니다.

추후 엑셀로 가져가서 구분자를 ,로 나누어서 사용하시면 됩니다.

이제 간단한 Collect를 사용하여 뽑아보겠습니다.

2. Report 생성하기

다를게 없습니다.

경로지정> Data생성 > 파일에 데이터 삽입 이 과정으로 진행하시면 됩니다.

조건은

  1. 현재 CE하위 ITEM에서 이름에 100이 들어간 PIPE를 COLLECT
  2. PIPE의 NAME, PSPEC, BORE, TEMPERATURE 추출

우선 코드부터 보여드리겠습니다

!path = |D:test.txt|
!file = object File(!path)
!data = object array()
!pipeList = !!collectAllFor('PIPE', |MATCHWILD(NAME, '*100*')|, CE)
DO !pipe values !pipeList
    !name = !pipe.name
    !pspec = !pipe.pspec.name
    !bore = !pipe.bore
    !temperature = !pipe.temperature
    !data.append(|$!name,$!pspec,$!bore,$!temperature|)
ENDDO

!file.writefile(|overwrite|,!data)

1. 저장할 파일 지정

기존과 별반 다를바 없습니다. 똑같이 하시면 됩니다.

파일 선택 다이알로그를 사용하여 원하는 저장경로 선택하는건 뒤쪽에서 설명하도록 하겠습니다

!path = |D:test.txt| !file = object File(!path)

2. Data 생성

  1. 데이터를 삽입하기 위해 비어있는 array를 우선 만들어줍시다. !data = object array()

  1. !!collectAllFor(타입,조건,검색위치)입니다 현재 CE하위 ITEM에서 이름에 100이 들어간 PIPE이니깐 타입은 PIPE 조건은 MATCHWILD(NAME, '100') 검색위치는 CE로 하면 되겠네요 !pipeList = !!collectAllFor('PIPE', |MATCHWILD(NAME, '100')|, CE)
  2. 데이터 삽입

3. 파일에 데이터 삽입

데이터 파일에 삽입 !file.writefile(|overwrite|,!data)

이런식으로 txt파일 report를 생성 할 수 있습니다.

정리하면 object file을 이용하면 원하는 경로에 한개의Array가 담긴 텍스트 파일을 저장할 수 있습니다.

object file에는 구분자, 혹은 여러개의 Array삽입 과 같은 기능이 없기에 최종 으로 삽입할 단 하나의 Array 를 만들어줘야 하는겁니다.

그렇기에 Collect > Do문으로 반복 > 원하는 속성값 추출 > 최종 Array 생성 > Array를 텍스트 파일로 변경 과 같은 과정을 거치게 됩니다.

2. (.Xlsx)로 Report 뽑기

1. XlSX추출 기본개념

헤더는 A,B,C 데이터는 1 2 3 4 5 6 7 8 9 이렇게 넣은 예제입니다 일단 코드부터 보여드리겠습니다

import |GridControl|
handle ANY
endhandle
using namespace 'Aveva.Core.Presentation'

!headings = object array()
!headings.append(|A|)
!headings.append(|B|)
!headings.append(|C|)

!data = object array()
!data[1][1] = |1|
!data[1][2] = |2|
!data[1][3] = |3|
!data[2][1] = |4|
!data[2][2] = |5|
!data[2][3] = |6|
!data[3][1] = |7|
!data[3][2] = |8|
!data[3][3] = |9|

!path = |D:test.xlsx|
!grid = object NETGRIDCONTROL()
!nds = object NETDATASOURCE('test', !Headings, !data)
!grid.bindToDataSource(!nds)
!grid.saveGridToExcel(!path)

XLSX를 추출하기 위해서는 AVAEVA에서 기본 제공하는 DLL인 GridControl을 이용해야합니다. 자세한 설명은 아래 게시글 참고해주시면 됩니다

1. DLL IMPORT

일단은 공식처럼 사용해주시면 됩니다. DLL import import |GridControl| handle ANY endhandle

사용할 namespace 지정 using namespace 'Aveva.Core.Presentation'

2. Data 및 Headings 삽입

엑셀로 데이터를 추출하려면 2개의 Array가 필요합니다 헤더, 실제 데이터 헤더는 말 그대로 헤더로 일반적은 array형태이지만 실제 데이터는 2차원 배열의 형태가 되어야합니다.

헤더 삽입

!headings = object array() !headings.append(|A|) !headings.append(|B|) !headings.append(|C|) 데이터 삽입

!data = object array() !data[1][1] = |1| !data[1][2] = |2| !data[1][3] = |3| !data[2][1] = |4| !data[2][2] = |5| !data[2][3] = |6| !data[3][1] = |7| !data[3][2] = |8| !data[3][3] = |9|

3. 엑셀로 추출

  1. 저장경로 지정 !path = |D:test.xlsx|
  2. 엑셀로 추출

2. 엑셀로 Report 추출

  1. 현재 CE하위 ITEM에서 이름에 100이 들어간 PIPE를 COLLECT
  2. PIPE의 NAME, PSPEC, BORE, TEMPERATURE 추출

우선 코드부터 보여드리겠습니다

import |GridControl|
handle ANY
endhandle
using namespace 'Aveva.Core.Presentation'

!headings = object array()
!headings.append(|NAME|)
!headings.append(|PSPEC|)
!headings.append(|BORE|)
!headings.append(|Temperature|)

!data = object array()
!pipeList = !!collectAllFor('PIPE', |MATCHWILD(NAME, '*100*')|, CE)

!i = 1
DO !pipe values !pipeList
    !data[!i][1] = !pipe.name
    !data[!i][2] = !pipe.pspec.name
    !data[!i][3] = !pipe.bore.string()
    !data[!i][4] = !pipe.temperature.string()
    !i = !i + 1
ENDDO

!path = |D:test.xlsx|
!grid = object NETGRIDCONTROL()
!nds = object NETDATASOURCE('test', !Headings, !data)
!grid.bindToDataSource(!nds)
!grid.saveGridToExcel(!path)

1. DLL IMPORT

import |GridControl|
handle ANY
endhandle
using namespace 'Aveva.Core.Presentation'

2. 헤더지정

!headings = object array()
!headings.append(|NAME|)
!headings.append(|PSPEC|)
!headings.append(|BORE|)
!headings.append(|Temperature|)

3. data Array 생성 및 Collect

!data = object array()
!pipeList = !!collectAllFor('PIPE', |MATCHWILD(NAME, '*100*')|, CE)

4. data 에 데이터 삽입

!i = 1
DO !pipe values !pipeList
    !data[!i][1] = !pipe.name
    !data[!i][2] = !pipe.pspec.name
    !data[!i][3] = !pipe.bore.string()
    !data[!i][4] = !pipe.temperature.string()
    !i = !i + 1
ENDDO

주의해야할 점은 Array안에는 반드시 <string> 타입 데이터만 와야합니다. 예를들어 !pipe.pspec 하면 dbref 정보가 들어가기에 !pipe.pspec.name을 해줍니다 bore도 마찬가지로 !pipe.bore 해버리면 <bore>타입으로 들어가기에 !pipe.bore.string() 해줍니다 temperature도 <REAL> 값으로 들어가기에 <string>으로 변경해줍니다.

5. 엑셀로 저장

!path = |D:test.xlsx|
!grid = object NETGRIDCONTROL()
!nds = object NETDATASOURCE('test', !Headings, !data)
!grid.bindToDataSource(!nds)
!grid.saveGridToExcel(!path)

모든 report는 결국 Report1,2를 응용하여 작업하면 됩니다.

3. 추가 정보

1. 파일 저장위치 선택하기

코드 먼저 보여드리겠습니다.

Import 'PMLFileBrowser'
handle Any
endhandle
using namespace 'Aveva.Core.Presentation'
!Browser = object PMLFileBrowser()
!Browser.Show( 'C:\' , 'TEST.xlsx' , 'Save File' , False , 'TEXT Files (*.TXT)|*.TXT' , 1 )
!file = object File(!browser.file())
!data = object array()
!data.append(|A,B,C|)
!data.append(|AA,BB,CC|)
!file.writefile(|overwrite|,!data)

기존에 !path를 지정하던거와는 달리 PMLFileBrowser를 이용하여 파일 브라우저를 켤 수 있습니다.

  1. PMLFileBrowser import
Import 'PMLFileBrowser'
handle Any
endhandle
using namespace 'Aveva.Core.Presentation'
  1. 파일브라우저 열기
!Browser = object PMLFileBrowser()
!Browser.Show( 'C:\' , 'TEST.xlsx' , 'Save File' , False , 'TEXT Files (*.TXT)|*.TXT' , 1 )

!Browser.file() 하면 파일 경로가 나오게 됩니다.

만약 엑셀파일을 넣으려 한다면 이렇게 하면 되겠죠

!Browser.Show( 'C:\' , 'TEST.xlsx' , 'Save File' , False , 'Microsoft Excel Files (*.xlsx;*.xls)|*.xlsx;*.xls' , 1 )
  1. 나머지코드
!file = object File(!browser.file())
!data = object array()
!data.append(|A,B,C|)
!data.append(|AA,BB,CC|)
!file.writefile(|overwrite|,!data)

2. Report 관련하여 추가적으로,,

1. CE 최소화

예를들어 DO !PIPE VALUES !PIPELIST라고 할떄 반복문안에서 $!PIPE 이렇게 하면서

계속 PIPE를 CE하는 방식으로 코딩되어있는 것들이 있는데 생각보다 속도 차이가 많이납니다.

그냥 ce 없이 !pipe.name 이런식으로 혹은 name of $!pipe 이런식으로 하는게 좋습니다.

2. 나누기

Collect 할때 world 단위로 해버리면 엄청 터집니다,, 특히 BranMem이나 sube 같은것들이요

Site단위로 반복하는게 좋습니다 그래도 터지면 Zone 단위로요

3. Collect

Collect 할때 가공하기 편해서 PML2방식이 좋다고 생각합니다.

하지만 속도가 중요할때는 object table 이용하는게 좋습니다.