* Powerbuilder 10.5


이번 강의에서는 조건에 따라 명단을 조회하는 기능을 만들어 보겠습니다.

두 가지 방법이 있습니다.

1. DB 쿼리에 조건을 주는 방법
2. Filter 함수를 이용해서 조건에 맞는 명단을 걸러내는 방법


먼저, 1번 방법을 이용해서 직급(job) 조건을 주고 조건에 맞는 명단만 보여주는 기능을 구현해 봅니다.

1. DB 쿼리에 조건을 주는 방법

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
order by a.ename

이 쿼리를 시험삼아 다음과 같이 수정해 보겠습니다.

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 = 'CLERK'
order by a.ename

쿼리 결과 직급이 CLERK 인 사원들만 조회됩니다.
dw 에서는 'CLERK' 부분을 변수로 만들 수 있습니다. 다음과 같이요.

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 = :as_job
order by a.ename

:as_job 는 변수입니다. 변수명 앞에는 반드시 콜론(:)을 붙입니다. 물론 변수명은 임의로 정하면 되구요.






쿼리를 이렇게 수정하세요.






그런데 이건 어디까지나 쿼리 상에서만 변수를 조건으로 부여한 것 뿐입니다.
안타까게도 이것만 가지고는 파빌에서 인식하지 못합니다.

파빌에서 인식하려면 따로 설정을 해 줘야 합니다.

DataSource 창에서

메뉴 - Design - Retrieval Arguments...





Specify Retrieval Arguments

여기다가 위에서 만든 변수
as_job 를 입력합니다.














Name 에 as_job 라고 입력하고 Type 에다가 데이터 타입(String)을 설정합니다.

OK 버튼 클릭~








아이콘 메뉴에서 Return 을 클릭해서 d_emp 로 돌아옵니다.



그럼 요놈이 보입니다. 전에 본 적있죠?

쿼리가 변경되서 Update Properties 설정을 바꿨다는 얘긴데요.







메뉴 - Rows - Update Properties... 를 열어보세요.


그럼 요렇게 되어 있습니다.

DataSource 의 쿼리가 조금이라도 변경되면 요렇게 됩니다.

다시 설정해 줘야 겠네요.
















OK?


















이제 실행해 보세요.


엥?

이런 창이 뜨네요 ????












w_list 의 open 이벤트에서 dw_emp.Retrieve() 을 호출하면서 열리는 화면입니다.

여기다가 CLERK, MANAGER,... 등 직급을 입력하고 OK 버튼을 누르면 조건에 맞는 결과가 조회됩니다.

그리고 Cancel 버튼을 누르면 빈화면만 나오구요.

조회할 때마다 조회조건 입력하라는 창이 뜨며 여간 번거로운 일이 아닙니다.


이 문제를 해결하기 위해서 지금까지 한 걸 돌이켜 보면...

d_emp 의 DataSource 에 들어가서 쿼리에다가 조건 변수 주고 파빌에서 인식할 수 있게 설정했습니다.

쿼리에다가 조건 변수만 만들었지... 조회하면서 그 변수에 값을 입력하지는 않았습니다.


dw 의 Retrieve 함수를 호출할 때 dw 쿼리의 조건 변수에 값을 줄 수 있습니다.

Retrieve method (DataWindows)
문법
long dwcontrol.Retrieve ( { any argument, any argument . . . } )

any argument, any argument . . .
는 다수의 매개변수를 사용할 수 있다는 뜻입니다.


d_emp 의 DataSource 에는 조건 변수를 부여했지만 막상 w_list 의 open 이벤트에서 dw_emp.Retrieve() 을 호출 할 때 값을 주지 않았기 때문에 위와 같은 화면이 열려서 값을 입력하라고 하는 거죠.

Retrieve 함수의 매개변수는 dw 의 DataSource - Specify Retrieval Arguments 의 설정을 참조합니다.
여기서는 String 타입으로 설정된 as_job 변수를 참조하겠죠?

String 타입의 변수 한 개를 설정했으므로 Retrieve 함수를 호출할 때 String 타입의 변수 한 개를 사용할 수 있습니다.
즉, 쿼리에 설정된 변수의 갯수만큼 Retrieve 함수에 매개변수 값을 줄 수 있습니다. 당연한 거겠죠?


dw컨트롤의 Retrieve 함수와 dw의 쿼리와의 이와같은 관계를 잘 알고 있어야 합니다.



이제 Retrieve 함수를 호출한 부분을 찾아 보세요.

소스양이 얼마 되지 않으므로 조금만 기억을 더듬으면 금방 찾을 수 있습니다. 그러나 소스양이 많아서 찾기가 쉽지 않을 때는 다음과 같이 하면 됩니다.

먼저 System Tree 를 엽니다.




 


그리고

test.pbl 에 포인터를 놓고(워크스페이스, 타겟, 각각의 오브젝트 에서도 마찬가지)

마우스 우클릭 - Search...















여기다가 찾기를 원하는 스크립트를 입력하면 됩니다. 결과를 볼까요?



















그럼 조회결과가 Output 창이 열리면서 표시됩니다.



이렇게 Retrieve() 함수가 두번 호출되었네요.

















열기 원하는 스크립트부분을 더블클릭하면 그 스크립트가 있는 이벤트나 함수등이 열립니다.





dw_emp.Retrieve() 가 w_list 의 open 이벤트와 cb_search.clicked 이벤트에서 호출 되었는데요.

두 이벤트 모두
dw_emp.Retrieve() 을 dw_emp.Retrieve('CLERK') 라고 수정합니다.

그리고 실행해 보세요.




결과가 이해 되나요? 직급이 CLERK 인 사원만 조회됩니다.

dw_emp.Retrieve('CLERK') 에서 'CLERK' 을 변수로 처리하면 더 완성도 높은 프로그램을 만들 수가 있습니다.

다음 강의에서 구현해 보겠습니다.

수고하셨어요.


Posted by A4M
,