* Powerbuilder 10.5


저번 강의에 남겨뒀던 문제를 해결해 보겠습니다.





사실....좀 어려운 문제입니다. 프로그램을 만드려고 하는 방향에 따라 다양한 방법이 있는데요.

로우를 추가할 때, empno 가 자동으로 입력이 되기 때문에 마지막 로우가 null 일 경우가 없습니다.

그래서 마지막 로우의 empno 가 null 일 때, 추가 버튼을 눌러도 추가가 안 되게한 스크립트 부분이 의미가 없습니다.

w_list.cb_insert 의 clicked 이벤트에서 가장 위에 있는 다음 부분이 의미가 없어져 버린 거죠.

// 마지막 로우의 empno 값 체크
int li_rcnt

li_rcnt = dw_emp.RowCount()

If li_rcnt > 0 Then
 
   int li_empno
 
   li_empno = dw_emp.GetItemNumber(li_rcnt, 'emp_empno')
 
   If IsNull(li_empno) Then

      Return

   End If
 
End If
//--



그래서 이 부분을 수정해야 하는데요. 
사원번호(empno) 의 null 여부를 체크하는 것을 사원명(ename) 의 null 여부를 체크하는 것으로 수정하겠습니다. 그리고 위 스크립트는 코멘트 처리하고 난 뒤에 위 스크립트를 그대로 재활용하는 게 좋겠네요.

위 스크립트를 재활용해서 다음과 같이 스크립트를 만들어 봤습니다.

// 마지막 로우의 ename 값 체크
int li_rcnt

li_rcnt = dw_emp.RowCount()


If
li_rcnt > 0 Then

   string ls_ename

   ls_ename = Trim(dw_emp.GetItemString(li_rcnt, 'emp_ename'))

   If IsNull(ls_ename) or ls_ename = '' Then
      Return
   End If


End If
//--



empno 칼럼의 자료형은 숫자형이지만 ename 은 문자형입니다.
그래서 수정할 부분이 생기는 겁니다.
(오라클에서 empno의 타입은 number 입니다. 이 타입의 칼럼에는 파워빌더의 모든 숫자형 데이터를 입력할 수 있습니다. 또, 오라클의 varchar2 또는 char 문자형 칼럼에는 파워빌더 string 또는 char 의 문자형 데이터를 입력할 수 있습니다.)

Trim PowerScript function

설명
  문자열(string)에서 앞 뒤의 빈 공간(space)을 제거한다.

문법
  Trim ( string )

반환값
  앞뒤의 빈 공간을 제거한 string



GetItemString method (DataWindows)

설명
  dw 에서 string 형의 데이터를 가져온다.

문법
  string dwcontrol.GetItemString ( long row, string column )

반환값
  row인수와 column 인수에 해당하는 값


 If IsNull(ls_ename) or ls_ename = '' Then

이 부분에서 ls_ename = '' 을 넣은 이유를 살펴봅시다.

칼럼의 타입이 string 형일 때 null 인 경우 말고 '' 인 경우가 있습니다.
먼저, '' 또는 "" 는 null 이 아님을 알아야 합니다.
오라클 문법에서는 null 이지만 파워빌더에서는 null 이 아닙니다.

로우를 추가하고 데이터를 입력하지 않으면 반드시 null 이 됩니다.
그러나 데이터를 입력했다가 지우면 null 이 아니라 '' 또는 "" 이 됩니다.

사원명(ename) 칼럼은 사용자가 직접 입력해야 하므로 그런게 가능한 겁니다. OK?

그리고

ls_ename = Trim(dw_emp.GetItemString(li_rcnt, 'emp_ename'))

에서 사용자가 빈공간(space) 을 입력할 경우도 배제할 수 없으므로 trim 함수를 사용해서 빈공간을 제거합니다.

Trim 함수를 사용하지 않고 사용자가 빈공간 한 개를 입력할 경우 ls_ename = ' ' 이 됩니다.

그러므로

If IsNull(ls_ename) or ls_ename = '' Then

에서 ls_ename = '' 으로 체크를 못합니다.

그렇다고

If IsNull(ls_ename) or ls_ename = '' or ls_ename = ' ' Then

이렇게 하면 될까요?

빈 공간을 두 개 입력하면요? ㅎㅎ


만약 빈공간이 입력되는 것을 허용한다면

ls_ename = '' 이 부분은 필요가 없습니다.

일반적으로 사원명으로 빈공간을 허용하지는 않으니 Trim 함수를 사용하는게 좋습니다.




코멘트 처리를 해서 재활용할 수 있도록 했습니다.















여기서부터가 수정된 내용이구요
.
.
.
.
.
.
.
.
.
.
.

여기까지...




이 다음 스크립트는 화면이 짤려서 생략했습니다.



그럼 실행해서 확인해 보세요.

이제 사원명을 입력하지 않으면 새로운 로우가 추가되지 않습니다.

사원명을 입력하면 새로운 로우가 추가가 되겠죠? 테스트해 보세요.

어떻습니까? ....  그런데 사원명을 입력하고 바로 추가 버튼을 누르면 추가가 안됩니다.


왜 그럴까요?  해결방법은 숙제요~ ㅎㅎ

힌트) GetItemString 에서 다음과 같이 row 인수와 column 인수만 사용했을 때, Primary Buffer 에서 값을 가져옵니다.

dw_emp.GetItemString(li_rcnt, 'emp_ename')

(GetItemString 에서 생략 가능한 다른 두 개의 인수가 있지만 다소 복잡해질 수 있으므로 지금은 다루지 않습니다.)


수고하셨어요.


*질문은 댓글에...

Posted by A4M
,