* Powerbuilder 10.5

 

 

 

데이터윈도우(이하 dw)의 칼럼 타입 가운데 DropDownDW (이하 dddw) 를 사용한 적이 있습니다.

앞서 만든 d_emp 에서 부서명 칼럼(dept_dname)의 타입이 바로 dddw 입니다.

dddw 는 dw 의 내부 칼럼에 또 다른 dw를 연결시켜 구현합니다.

부서명 칼럼에서는 dddw 의 dw 로 dddw_dname 가 사용되었는데요.

 

 

dddw_dname 의 DataSource 는 다음과 같습니다.

 

select dname, deptno
from dept
order by dname

 

 

아규먼트(argument) 가 없습니다.

만약 where 절에 아규먼트를 추가하고 싶다면 어떻게 해야 할까요?

dddw_dname은 dept_dname 에 포함된 DataWindow 인데 어떻게 아규먼트를 입력할 수 있을까요?

이런 경우 필요한 함수가 바로 GetChild 입니다.

 

 

 

프로그램을 실행합니다.

 

 

 

 

 

부서 DropDownListBox(이하 ddlb) 의 목록에서 RESEARCH 를 선택하면 RESEARCH 부서만 화면에 보입니다.

사원목록에서 부서명 칼럼을 클릭해 봅니다.

 

 

 

 

dddw 에는 모든 부서가 보입니다.

 

 

 

 

 

 

 

 

부서 ddlb 에서 선택된 것만 부서명 칼럼의 dddw 목록에 보이게 하겠습니다.

만약, 부서 ddlb 에서 RESEARCH 가 선택되면 dddw 에 RESEARCH 만 보이게 되고 전체가 선택되면 모든 부서명이 보이게 됩니다.

 

일단 무작정 dddw_dname 아규먼트를 추가합니다.

 

dddw_dname 의 DataSource 를 엽니다.

 

 

 

쿼리를 위와 같이 수정하세요.

deptno의 아규먼트로 an_deptno 를 추가했습니다. an_deptno 는 Number Type 으로 지정했구요.

an_deptno = 1 일 때, dept 테이블의 모든 데이터가 조회됩니다.

 

Return 을 클릭해서 DataSource 를 빠져나오면 메시지 박스가 연속해서 오픈됩니다.

무시하고 저장하세요.

(지금까지의 작업이 낯설다면 8강부터 진행된 DataWindow 관련 강의들을 다시 보고 오세요.)

 

 

프로그램을 실행해보세요.

아래 화면이 오픈되면 정상입니다.

 

 

 

 

위 화면은 w_list 가 오픈되는 과정에서 열렸습니다.

앞서 dddw_dname 에 아규먼트를 추가했구요.

dddw_dname 가 조회될 때, 입력된 아규먼트가 없으니 직접 입력하라고 열리는 화면입니다.

 

스크립트의 어떤 시점에서 dddw_dname 가 조회되는지 찾아야 합니다.

이럴 때 필요한 것이 바로 디버깅입니다.

직접 디버깅을 해서 찾아보세요.

(디버깅 강의 66강~69강)

 

디버깅 타임~.

.

.

.

.

.

.

.

.

.

.

.

.

 

dddw_dname 는 d_emp 의 속성값이고 d_emp 는 dw_emp 의 DataObject 입니다.

dw_emp 를 최초로 호출하는 시점 w_list.open 이벤트입니다.

w_list.open 이벤트를 엽니다.

 

wf_retrieve('%', 1)

 

위 부분에 브레이크포인트를 추가합니다.

 

디버거를 실행(ctrl + D -> ctrl + T)하면 위 부분에서 멈춥니다.

이 때, Step In 을 클릭합니다.

그럼 wf_retrieve 함수로 들어갑니다. 

 

또, Step In 을 클릭하면

wf_retrieve 함수의 아래 부분에서 문제의 화면이 열리게 됩니다.

 

 

 

dw_emp.Retrieve(as_job, ai_deptno)

 

 

 

dw_emp 통해서 d_emp 가 조회되는데요.

d_emp 에서 데이터가 조회될 때 내부의 DataWindow도 함께 조회하는 것입니다.

 

위 스크립트가 호출되기 전에 dddw_dname 에 아규먼트를 입력하면 문제의 화면은 열리지 않습니다.

 

이러한 개념을 탑재한 상태에서 지금부터는 무작정 따라하기~

 

 

w_list 의 인스턴스 변수 선언부를 열고 다음 스크립트를 추가합니다.

 

dataWindowChild    i_dwchild

 

 

 

 

 

 

 

 

이렇게 말이죠.

 

 

 

 

w_list.open 이벤트를 엽니다.

 

wf_retrieve('%', 1)

 

이 부분 바로 전에 다음 스크립트를 작성합니다.

 

// 부서명 DataWindowChild
dw_emp.getChild('dept_dname', i_dwchild)

i_dwchild.setTransObject(sqlca)
i_dwchild.retrieve(1)
//--

 

 

 

 

이렇게 하고 프로그램을 실행하면 문제의 화면이 열리지 않습니다.

실행해서 확인해 보세요.

 

 

 

GetChild method (DataWindows)

 

설명

child DataWindow 의 reference(참조) 를 제공한다.

 

문법

integer dwcontrol.GetChild (string name, REF DataWindowChild dwchildvariable)

 

name : child DataWindow 를 포함하고 있는 문자열 칼럼명

dwchildvariable : child DataWindow 의 reference 변수

 

 

 

child 란 내부에 속해있다는 뜻이고 child DataWindow 는 어떤 오브젝트에 포함되어 있는 DataWindow입니다.

dddw_dname 는 d_emp 에 포함되어 있는 child DataWindow 가 됩니다.

 

 

일반적으로 메서드를 선언할 때 아규먼트 속성 중에 Pass By가 있습니다.

Pass By 에는 value, reference, readonly 세가지가 있습니다.

 

 

어떤 메서드에서 아규먼트로 제공된 변수에 대해

 

value 는 그 변수값의 카피이고 변수값 자체가 변경되지는 않습니다.

reference 는 그 변수의 포인터(Pointer)로 변수값 자체를 변경할 수 있습니다.

readonly 는 그 변수값을 상수로 취급해서 변수값을 수정할 수 없습니다.

 

(이 부분은 이후에 다시 다루겠습니다.)

 

 

 

REF DataWindowChild dwchildvariable

 

REF 는 reference 라는 뜻입니다.

dwchildvariable 는 DataWindowChild 타입의 reference 변수가 되므로 그 값을 변경할 수 있습니다.

 

dw_emp.getChild('dept_dname', i_dwchild)

 

 

이것은 dw_emp의 DataObject 인 d_emp 의 dept_dname 이 포함하고 있는 DataWindow(dddw_dname) 를 i_dw_child 라는 dataWindowChild 변수에 저장하라는 뜻입니다.

이렇게 하면 i_dwchild 는 dddw_dname 을 가르키게 됩니다.

  

i_dwchild.setTransObject(sqlca)

 

i_dwchild 도 dw 의 일종이므로 setTransObject 를 통해서 Transaction Object 와 연결시킵니다.

 

i_dwchild.retrieve(1)

 

아규먼트로 1을 줬습니다. 그럼 어떻게 될까요?

dept 테이블의 모든 데이터가 조회됩니다.

 

 

 

 

// 부서명 DataWindowChild
dw_emp.getChild('dept_dname', i_dwchild)

i_dwchild.setTransObject(sqlca)
i_dwchild.retrieve(1)
//--

 

 

이 부분을 다시 정리하자면

d_emp 의 dept_dname 칼럼이 포함하고 있는 dddw_dname 의 참조를 i_dwchild 에 저장해서 i_dwchild 가 dddw_name 을 조회할 수 있게 하라는 뜻입니다.

 

 

이번 강의 목표는 부서 ddlb 에서 선택된 것만 부서명 칼럼의 dddw 목록에 보이게 하는 것입니다.

부서 ddlb 의 부서목록이 변경될 때 그 부서코드값을 받아서 i_dwchild.retrieve 의 아규먼트로 넘겨주면 됩니다.

 

이번 강의의 숙제입니다.

 

수고하셨습니다.

 

 

 

 

 

Posted by 신선봉(닉네임)

댓글을 달아 주세요

  1. 2015.09.02 16:55  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  2. 2016.03.31 13:30  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  3. 2016.03.31 13:32  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다