*PowerBUilder 10.5



저번 강의에서는 ddlb_job 을 만들어 봤습니다.




ddlb_job 에서 직급을 선택하면 선택된 직급만 조회가 되도록 만들어 보겠습니다.


1. ddlb_job 에서 직급을 선택하면 -> ddlb_job.selectionchanged 이벤트
2. 선택된 직급만 조회가 되도록 -> wf_retrieve 함수



SelectionChanged PowerScript event

설명
  컨트롤 안에서 아이템이 선택될 때 발생


ddlb_job 컨트롤을 더블클릭하면 selectionchanged 이벤트가 바로 열립니다.
선택된 직급(아이템)을 받아서 wf_retrieve 함수의 인수로 넣어주면 됩니다.

 



selectionchanged (integer index) 에서 index 는 아이템의 순서입니다.

첫번째 아이템인 ANALYST 를 선택하면 1이 넘어오고
두번째 아이템인 CLERK 을 선택하면 2가 넘어오는 식입니다.

여기서는 index 를 사용하지 않습니다.

ddlb_job.text 는 ddlb_job 에서 선택된 아이템의 텍스트를 가져옵니다. 이것을 wf_retrieve 의 인수로 넣으면 되는거죠. 위 화면처럼...

실행해 보세요.

직급을 선택하면 선택된 직급만 조회되는 것을 볼 수 있습니다.

여기서 직급을 한번 선택하고 나면 선택된 직급의 사원만 조회되지 모든 사원을 조회할 수가 없게 됩니다.


ddlb_job 에 전체 직급을 선택할 수 있도록 해 보겠습니다.

w_list.open 이벤트를 열어보세요.


dw_emp.SetTransObject(sqlca)

dw_job_list.SetTransObject(sqlca)

int li_cnt, i

li_cnt = dw_job_list.Retrieve()

ddlb_job.AddItem('전체')   // 이 부분을 추가합니다.

For i = 1 to li_cnt
 
   ddlb_job.AddItem(dw_job_list.getItemString(i, 'job'))
 
Next


wf_retrieve('%')


실행해 보세요.





분명히 '전체' 아이템을 먼저 넣었는데 맨 아래에 있습니다.???

ddlb_job 의 Sorted 속성을 체크하면 이렇게 됩니다. 한글이 알파벳보다 더 크기 때문에 나타나는 현상입니다. Sorted 속성을 체크해제 하면 먼저 추가한 아이템이 위에 오게 되므로 '전체' 아이템이 맨 위로 오게 됩니다.
실행해서 확인해 보시구요.



현재 프로그램을 실행하자마다 모든 사원이 조회되므로 실행할 때 ddlb_job 의 '전체' 아이템이 자동으로 선택되게 하면 어떨까요?

w_list.open 이벤트에서...


dw_emp.SetTransObject(sqlca)

 

dw_job_list.SetTransObject(sqlca)

int li_cnt, i

li_cnt = dw_job_list.Retrieve()

ddlb_job.AddItem('전체')

For i = 1 to li_cnt

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

Next


ddlb_job.SelectItem(1)   // 이 부분을 추가합니다.

wf_retrieve('%')



SelectItem PowerScript function

문법

listboxname.SelectItem ( itemnumber )


SelectItem 함수는 아이템의 순서인 indexnumber 에 해당하는 아이템을 선택합니다.

ddlb_job.SelectItem(1) 는 첫번쩨 아이템을 선택하는 것이 됩니다.

실행해 보세요.




'전체' 아이템이 선택되면서 모든 사원이 조회되었으니 훨씬 자연스럽습니다.

그런데 '전체' 아이템을 선택해보면 아무도 조회가 안됩니다.

인수가 '전체' 이기 때문인데요...인수가 '%' 가 되면 해결 됩니다. 어떻게 해야 할까요?

여러가지 방법이 있는데요.





ddlb_job.selectionchanged 이벤트를 열어서 다음과 같이 수정합니다.

string ls_txt

 

ls_txt = ddlb_job.text   // ddlb_job.text 의 값을 ls_txt 에 저장


if ls_txt = '전체' then   // ls_txt 가 '전체'면
   ls_txt = '%'             // ls_txt 에 '%' 를 저장
end if

wf_retrieve(ls_txt)


실행해 보세요.

'전체'를 선택하면 모든 사원이 조회됩니다.


다른 방법도 있는데요.

일단 ddlb_job.selectionchanged 이벤트의 스크립트는 다음과 같이 수정합니다.

//
//string ls_txt
//
//ls_txt = ddlb_job.text
//
//if ls_txt = '전체' then
// ls_txt = '%'
//end if
//
//wf_retrieve(ls_txt)

wf_retrieve(ddlb_job.text)

먼저 작성했던 스크립트는 코멘트 처리했네요.


w_list.open 이벤트를 엽니다.


dw_emp.SetTransObject(sqlca)

dw_job_list.SetTransObject(sqlca)

int li_cnt, i

li_cnt = dw_job_list.Retrieve()

ddlb_job.AddItem('전체          %')     // 이렇게 수정합니다

For i = 1 to li_cnt
 
   ddlb_job.AddItem(dw_job_list.getItemString(i, 'job'))
 
Next

ddlb_job.SelectItem(1)

wf_retrieve('%')



그리고 ddlb_job.selectionchanged 이벤트로 갑니다.

//
//string ls_txt
//
//ls_txt = ddlb_job.text
//
//if ls_txt = '전체' then
// ls_txt = '%'
//end if
//
//wf_retrieve(ls_txt)

wf_retrieve( trim(right(ddlb_job.text,10)) )     // 이렇게 수정합니다



ddlb_job 에

'전체            %'

이 아이템을 추가했는데요. '%' 을 활용하려고 하는 겁니다.

right(ddlb_job.text,10) 는 ddlb_job.text 에서 오른쪽에서 10 글자만큼 가져옵니다.
10은 직급 문자열 중에 가장 큰 것보다 더 큰 숫자입니다. 대략 잡은 거죠.

right(ddlb_job.text,10) 는 결과적으로

'         %'
'ANALYST'
'CLERK'
...



이렇게 가져옵니다.

'          %' 에서 스페이스는 9개 이상이어야 합니다. 그렇지 않으면 '전체' 문자열 부분이 포함되어 버리죠.

'          %' 을 사용하려면 공백문자를 없애야 합니다. 그래서 trim 을 사용했습니다.


실행해보세요.

 




엥?  % 부분이 보입니다. ㅎㅎ

스페이스를 더 넣어주면 해결되겠죠?








w_list.open 이벤트

ddlb_job.AddItem('전체                  %')

이 부분에서 전체와 % 사이의 공백을 더 추가하면 됩니다.

ddlb_job.AddItem('전체                                                 %')

ㅎㅎ 무식해 보입니다. 그래서 다음과 같이 해봅니다.

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

space 함수는 인수만큼 공백으로 채웁니다.

실행합니다.


 




그런데 수평 스크롤이 생겨서 수평스크롤을 오른쪽으로 옴기면
'%' 가 보이게 됩니다.

ddlb_job 의 HScrollBar 속성을 체크해제하면 해결됩니다.

이제 실행해 보면 자연스럽게 보입니다.

수고하셨습니다.

 

 

 

Posted by A4M
,