Collect 개념 이해하기
PML Beginner 3
PML 에서의 Collect
매번 하나하나 데이터를 ARRAY에 add 할수는 없기에 collect를 사용합니다. 크게 PML1 방식의 Collect와 PML2 방식의 Collect가 있으나 주로 PML2는 복잡하기에 PML1 위주로 설명드리도록 하겠습니다. Beginner 이후 Object에 대한 설명 과정에서 PML2방식의 Collect에 대해 자세히 설명 드리겠습니다.
PML1 에서 Collect
PML1 에서 데이터를 COLLECT 하는 방법엔 2가지가 있습니다. COLL 을사용하는것과 EVAL을 사용하는게 있습니다.
- COLL 을 이용한 COLLECT
- 구조: VAR (변수) COLL ALL (COLLECT TYPE) WITH (조건) FOR (COLLECT 할 Scope)
- 주의사항: (COLLECT TYPE) 과 WITH (조건) 과 FOR (조건) 은 생략할 수 있습니다.
- 주의사항: 다만 셋 모두 동시 생략은 불가능합니다 EX)
VAR !A COLL ALL불가능
주의사항: COLL 사용시 모든 데이터는 string 타입의 refno 가 들어갑니다. 예시:
$* 존재하는 모든 PIPE를 COLLECT합니다.
VAR !A COLL ALL PIPE
$* 현재 선택하고있는 Element 하위에 존재하는 모든 PIPE를 COLLECT합니다.
VAR !A COLL ALL PIPE FOR CE
$* 현재 선택하고있는 Element 하위에 존재하는 모든 PIPE 중에서 BORE 값이 100MM와 같거나 큰 PIPE들을 COLLECT합니다.
VAR !A COLL ALL PIPE WITH BORE GE 100MM FOR CE
$* 존재하는 모든 PIPE 중에서 BORE 값이 100MM와 같거나 큰 PIPE들을 COLLECT합니다.
VAR !A COLL ALL PIPE WITH BORE GE 100MM
$* 존재하는 모든 PIPE 중에서 DDEPTH 값이 2 이상인 PIPE들을 COLLECT 합니다.
VAR !A COLL ALL PIPE WITH DDEPTH GE 2
$* 존재하는 모든 Element 중에서 DDEPTH 값이 2 이상인 Element들을 COLLECT 합니다.
VAR !A COLL ALL WITH DDEPTH GE 2결과:
<ARRAY>
[1] <STRING> '=1234286676/1'
[2] <STRING> '=1234286676/2'
[3] <STRING> '=1234286676/3'
[4] <STRING> '=1234286676/4'
[5] <STRING> '=1234286676/5'
[6] <STRING> '=1234286676/6'
[7] <STRING> '=1234286676/7'
[8] <STRING> '=1234286676/8'- EVAL 을 이용한 COLLECT
구조: 구조: VAR (변수) EVAL NAME FOR ALL (COLLECT TYPE) WITH (조건) FOR (COLLECT 할 Scope)
$*구조 추가설명
$* 이렇게 하면 선택한 ITEM의 이름이 나옵니다.
VAR !A EVAL NAME FOR CE
$* 위 구문에 FOR ALL PIPE 를 추가해주면 선택한 PIPE의 이름이 나옵니다.
VAR !A EVAL NAME FOR ALL PIPE FOR CE
$* 물론 NAME 이 아닌 TYPE을 사용한다면 TYPE이 나옵니다... 아래처럼 하면 결과값에 PIPE 만 나옵니다
VAR !A EVAL TPYE FOR ALL PIPE FOR CE주의사항: (COLLECT TYPE) 과 WITH (조건) 과 FOR (조건) 은 생략할 수 있습니다. 주의사항: 다만 셋 모두 동시 생략은 불가능합니다 EX) VAR !A EVAL NAME FOR ALL 불가능 주의사항: EVAL NAME FOR ALL 사용시 모든 데이터는 string 타입의 Name 가 들어갑니다.
예시:
$* 존재하는 모든 PIPE를 COLLECT합니다.
VAR !A EVAL NAME FOR ALL PIPE
$* 현재 선택하고있는 Element 하위에 존재하는 모든 PIPE를 COLLECT합니다.
VAR !A EVAL NAME FOR ALL PIPE FOR CE
$* 현재 선택하고있는 Element 하위에 존재하는 모든 PIPE 중에서 BORE 값이 100MM와 같거나 큰 PIPE들을 COLLECT합니다.
VAR !A EVAL NAME FOR ALL PIPE WITH BORE GE 100MM FOR CE
$* 존재하는 모든 PIPE 중에서 BORE 값이 100MM와 같거나 큰 PIPE들을 COLLECT합니다.
VAR !A EVAL NAME FOR ALL PIPE WITH BORE GE 100MM
$* 존재하는 모든 PIPE 중에서 DDEPTH 값이 2 이상인 PIPE들을 COLLECT 합니다.
VAR !A EVAL NAME FOR ALL PIPE WITH DDEPTH GE 2
$* 존재하는 모든 Element 중에서 DDEPTH 값이 2 이상인 Element들을 COLLECT 합니다.
VAR !A EVAL NAME FOR ALL WITH DDEPTH GE 2결과:
<ARRAY>
[1] <STRING> '/TEST1'
[2] <STRING> '/TEST2'
[3] <STRING> '/TEST3'
[4] <STRING> '/TEST4'
[5] <STRING> '/TEST5'
[6] <STRING> '/TEST6'
[7] <STRING> '/TEST7'
[8] <STRING> '/TEST8'PML2에서 Collect
PML2에서는 COLLECTION() 이라는 OBJECT를 이용하여 COLLECT 합니다. 자세히 설명하기에는 아직 OBJECT에 대한 설명도 안하였고 PML2를 이용한 객체지향에 대한 설명도 안하였기에 Beginner 이후 자세히 설명하도록 하겠습니다. 아래와 같이 사용이 가능하며 PML1에 비해 복잡하지만 결과값이 DBREF이기에 PML2에서 . 으로 객체 속성 접근이나 메쏘드 접근이 가능하다는 점 여러 SCOPE를 지정 가능하다는 장점이 있습니다.
$* Object Collection 객체 생성
!collection = OBJECT COLLECTION()
$* Scope설정 (WORLD, CE 도 가능 REF 타입만 와야함)
!Collection.SCOPE(=123456783/27)
$* 추가적으로 특정 영역을 포함하도록 설정(생략가능)
!Collection.addscope(=4152461/2)
$* TYPE 설정
!Collection.TYPE('PIPE')
$* 조건 설정 (생략가능)
!Collection.FILTER(OBJECT EXPRESSION(|BORE GT 100MM|))
$* 결과값 RETURN
!A = !Collection.RESULTS()
Q VAR !A