*PowerBUilder 10.5


w_list.cb_search.clicked 이벤트를 열어보세요.

// wf_retrieve()



wf_retrieve(trim(right(ddlb_job.text, 10)))

이렇게 수정합니다.


요렇게 해 놓고 보니 조회버튼이 필요없어 보입니다만, 새로고침 정도로 사용하면 될 듯하니 그냥 두겠습니다.

지금까지 직급 조건으로 조회해 봤는데요. 이번에는 부서명 조건을 추가해서 조회해 보겠습니다.

직급, 부서명 모두 검색 조건에 사용하려고 하는 거죠.


앞서 직급 조건을 구현한 과정을 살펴보면,

1. d_emp 에서 직급으로 조회할 수 있도록 DataSource 쿼리를 수정하고 
    Retrieval Arguments(조회 인수) 를 설정한다.
2. 직급을 가져올 쿼리를 만든다.
3. 쿼리로 d_job_list (dw)를 생성하고 dw_job_list (dw 컨트롤) 도 만든다.
4. ddlb_job (ddlb) 을 만들고 dw_job_list 로 자료를 조회해서 ddlb_job 에 넣어준다.
5. ddlb_job 의 아이템을 dw_emp 의 조회조건으로 사용한다.




부서명 조건도 동일하게 만들면 됩니다. 

1. d_emp 의 DataSource 를 열어봅니다.

select a.empno, a.ename, a.job, a.deptno, b.deptno as dname, b.deptno as loc
from emp a, dept b
where a.deptno = b.deptno
and a.job like :as_job
and (a.deptno = :ai_deptno or :ai_deptno = 1)   --이 부분을 추가합니다.
order by a.ename


a.deptno 가 숫자타입이므로 모든 부서를 조회하기 위해서 편법 쿼리를 사용했습니다.
ai_deptno1 을 넣어주면 모든 부서를 조회할 수가 있게 됩니다.


메뉴 - Design - Retrieval Arguments

 

Add 버튼을 누릅니다.



Number 타입의 ai_deptno 를 입력합니다.



d_emp 레이아웃으로 돌아옵니다. 쿼리를 수정했으니 Update Properties... 가 초기화 되겠죠? 다시 설정하시길...


실행해 보세요.


w_list.open 이벤트의 wf_retrieve('%') 를 호출하면 발생하는 메시지 입니다.

wf_retrieve 를 열어보면

dw_emp.Retrieve(as_job)

두 개의 인수를 설정했는데 한 개의 인수만 넣어줬기 때문에 발생하는 메시지입니다.


일단, 무시하고 계속 진행하겠습니다.



2. 부서명을 가져올 쿼리를 만들어야 겠네요.

부서명은 dept 테이블에서 가져올 수 있습니다.

deptno        dname                loc
10          ACCOUNTING      NEW YORK
20          RESEARCH          DALLAS
30          SALES                CHICAGO
40          OPERATIONS       BOSTON


dept 테이블의 deptno 칼럼을 가져와야 하는데요. ddlb 에 보이는 것은 dname 칼럼이어야 합니다.

select deptno, dname
from dept




3. 이 쿼리로 d_dept_list 라는 이름으로 grid 타입의 dw 를 만듭니다.
그리고 w_list 에 dw_dept_list 라는 이름의 dw 컨트롤을 만들어서 연결시킵니다.




위 화면처럼 만들면 됩니다.



4. 이번에는 ddlb 를 만듭니다. 이름은 ddlb_dept 라고 합니다.



화면이 좁아서 커맨드 버튼의 너비를 줄이고 오른편으로 밀었습니다.

ddlb_dept 의 속성을 ddlb_job 의 속성과 같게 설정합니다.

ddlb 가 두개 있으니 뭐가 뭔지 모르겠네요.


 

컨트롤 모음창에서 StaticText control 를 선택합니다.



ddlb_job 바로 위를 클릭하면 텍스트를 입력할 수 있는 컨트롤이 생성됩니다.

Text 속성을 직급이라고 수정하고 정렬을 가운데로 합니다.



ddlb_dept 위에도 부서 라는 이름의 Static Text 컨트롤을 만듭니다.





이제 dw_dept_list 로 자료를 조회해서 ddlb_dept 에 넣어줘야 합니다.


w_list.open 이벤트를 여세요.

dw_emp.SetTransObject(sqlca)
dw_job_list.SetTransObject(sqlca)
dw_dept_list.SetTransObject(sqlca)


int li_cnt, i

// 직급 목록
li_cnt = dw_job_list.Retrieve()

ddlb_job.AddItem('전체' + space(30) + '%')


For i = 1 to li_cnt

    ddlb_job.AddItem( dw_job_list.getItemString(i, 'job') )

Next

ddlb_job.SelectItem(1)
//--

// 부서 목록
li_cnt = dw_dept_list.Retrieve()

ddlb_dept.AddItem('전체' + space(30) + '1')  // % 대신 1 을 사용

For i = 1 to li_cnt

   
// deptno 의 타입이 number 이므로 getItemNumber 사용

    // AddItem 의 인수는 string 타입이므로 string 함수로 변환
    ddlb_dept.AddItem( string(dw_dept_list.getItemNumber(i, 'deptno')) )
   
Next

ddlb_dept.SelectItem(1)
//--

wf_retrieve('%')


굵게 표시한 부분이 추가한 스크립트입니다.

직급 목록을 세팅한 것과 동일하게 작성한 거죠. 즉 copy & paste ㅎㅎ

일단 실행합니다.


deptno 를 추가했으니 이렇게 보이는 건데요.

보이는 것은 dname 이고 조회 인수로는 deptno 가 사용되어야 하겠습니다.




w_list.open 이벤트에서

ddlb_dept.AddItem(string(dw_dept_list.getItemNumber(i, 'deptno')))

이 부분을 다음과 같이 수정합니다.

ddlb_dept.AddItem( dw_dept_list.getItemString(i, 'dname') + space(30) + string(dw_dept_list.getItemNumber(i, 'deptno')) )

이해되시죠?

이제 실행해 보세요.


보이는 것은 dname 이고 오른편에 deptno 가 숨어있습니다.



5. 이번에는 ddlb_dept 의 아이템을 dw_dept_list 의 인수로 사용합니다.

Funtion List 에서 wf_retrieve 함수를 엽니다.

 


위 화면에서 빨간색 네모 부분을 클릭합니다.(기억나시죠?)

그럼 함수 프로토타입(prototype) 인터페이스가 열립니다.

 


빈공간에서 마우스 우클릭하면 나타나는 팝업 메뉴에서 Add Parameter 를 선택합니다.



integer 타입의 ai_deptno 를 인수로 추가하고 dw_emp.Retrieve 의 두번째 인수로 작성합니다.

(인수명을 꼭 as_job, ai_deptno 로 하지 않아도 됩니다. 인수명은 임으로 만들 수 있습니다.)


 

 

메뉴 - Design - Retrieval Arguments

 

 

여기에서 설정한 인수의 타입과 순서대로 Retrieve 함수의 인수를 작성하면 됩니다.



wf_retrieve 함수를 수정했으니 이 함수를 호출하는 부분을 수정해야 합니다.

w_list.open 이벤트를 엽니다.

wf_retrieve('%') 이 부분을 다음과 같이 수정합니다.

wf_retrieve('%', 1)

deptno 에 1을 넣어주면 모든 부서가 조회됩니다.


ddlb_job.selectionchanged 이벤트, ddlb_dept.selectionchanged 이벤트, cb_search.clicked 이벤트

모두 아래 스크립트를 추가하거나 수정합니다.

wf_retrieve( trim(right(ddlb_job.text, 10)), integer(trim(right(ddlb_dept.text, 10))) ) 


실행해서 테스트 해보세요.


수고하셨습니다.

 

Posted by A4M
,