* Powerbuilder 10.5


계속해서 어플리케이션을 다듬어 보겠습니다.


1. 삭제 기능 추가

삭제하고자 하는 로우를 선택해서 삭제하는 기능을 추가해 보도록 하겠습니다.

문장
  삭제버튼을 누르면 w_list 의 사원목록에서 삭제하려는 로우를 선택해서 삭제한 다음 실제 DB 에 반영합니다.

스크립트로 변환
  1.삭제버튼을 누르면 -> w_list.cb_delete 의 clicked 이벤트
  2.w_list 의 사원목록에서 삭제하려는 로우를 선택 -> GetSelectedRow 함수 호출
  3.삭제한 다음 -> DeleteRow 함수
  4.실제 DB 에 반영합니다. -> Update 함수 호출



GetSelectedRow method (DataWindows)

설명
  dw 에서 인수(row) 바로 다음 로우부터 검색하여 가장 먼저 반전된 로우 넘버를 알려줍니다.
  반전된 로우는 SelectRow 함수에 의해 반전된 로우입니다.
   
  예) 인수가 0 이면 첫번째 로우부터 검색, 1 이면 두번째 로우부터 검색....

문법
  long dwcontrol.GetSelectedRow ( long row )

반환값
  인수(row) 바로 다음에 반전된 로우 넘버, 반전된 로우가 없을 경우 0



DeleteRow method (DataWindows)

설명
  dw의 로우를 삭제.

문법
  integer dwcontrol.DeleteRow ( long row )

  row : 삭제하고자 하는 로우 넘버

반환값
  성공시 1
  에러시 -1


그럼

w_list.cb_delete 의 cliked 이벤트를 열어서 스크립트를 작성해 보겠습니다.



GetSeletedRow(0) 에서 인수가 0 이므로 첫번째 로우부터 검색합니다.
li_row 에는 반전된 로우넘버가 저장되는데요. li_row 값이 0 이면 반전된 로우가 없는 것이 되지요.

If li_row < 1 Then
또는
If li_row = 0 Then

모두 가능합니다.

li_row = 0 이 되면 반전된 로우가 없다고 판단해서 메시지를 보여줍니다.

MessageBox 의 마지막 인수에 Exclamation! 이 쓰였습니다.

MessageBox 인수의 갯수가 세개가 되면 마지막 인수는 보여지는 메시지 글의 왼쪽에 보이는 아이콘 모양을 결정합니다.

아이콘 인수는 열거형으로

Information! (Default)
StopSign!
Exclamation!
Question!
None!


5가지가 있습니다.


아이콘 인수를 생략하면 디폴트값인 Information! 이 선택됩니다. 지금까지 아이콘 인수를 생략했으므로 항상 Informaion! 아이콘이 보였습니다.

인수를 바꾸면서 각각의 모양을 확인해 보기 바랍니다.


dw_emp.DeleteRow(li_row) 는 반전된(선택된) 로우인 li_row 를 삭제합니다.
이 때, 화면에서만 사라지며 DB 에 반영되지는 않고 DB 에 반영하려면 Update 함수를 호출해야 합니다.
(정확하게 얘기하면 DeleteRow 함수에 의해 삭제된 로우의 데이터는 Delete! 버퍼로 옮겨집니다.
dw 버퍼에 대해서는 나중에 다룹니다.)


여기까지 하고 실행해서 확인해 보세요. 그리고 저장버튼을 누르면 DB에 반영이 됩니다. 곧, 실제 데이터가 삭제됩니다. Update 함수는 dw 에서 수정하거나 삭제된 데이터를 쿼리로 변환하여 DBMS 로 전달시킵니다.



2. 저장 기능 보완

w_list 윈도우를 열고 저장 버튼(cb_save) 의 clicked 이벤트로 들어가보세요.

 



Update 함수는 dw에 수정 또는 삭제된 내용이 있으면 DBMS에 쿼리문을 전달합니다.

그런데 저장 버튼만 누르면 무조건 Update 함수가 호출되네요.

사용자 입장에서 보면 멍~ 때리는 프로그램입니다.

저장 버튼을 눌렀는데 에러 발생할 때를 제외하고는 아무런 메시지가 없기 때문입니다.


저장 버튼을 눌렀을 때, 수정되거나 삭제된 내용이 없으면 메시지를 보여주는 기능을 추가해 보겠습니다.

문장
  저장 버튼을 눌렀을 때, 수정되거나 삭제된 내용이 없으면 메시지를 보여준다.

스크립트로 변환
  1.저장 버튼을 눌렀을 때 -> cb_save.clicked
  2.수정되거나 삭제된 내용 -> ModifiedCount, DeletedCount
  3.메시지를 보여준다 -> MessageBox

ModifiedCount method (DataWindows)

설명
  dw 에 수정된 로우들의 갯수를 알려준다. 수정된 로우가 없으면 0 을 반환한다.

문법
  long dwcontrol.ModifiedCount ( )

반환값
  수정된 로우의 갯수
  수정된 로우가 없으면 0
  에러시 -1


DeletedCount method (DataWindows)

설명
  dw 에 삭제된 로우들의 갯수를 알려준다.

문법
  long dwcontrol.DeletedCount ( )

반환값
  삭제된 로우의 갯수
  삭제된 로우가 없으면 0
  에러시 -1





dw_emp.ModifiedCount( ) + dw_emp.DeletedCount( ) = 0 
이것은 두 함수 모두 반환값이 0 이어야 성립합니다. 곧, 수정되거나 삭제된 로우가 없는거죠.

전체적으로 MessageBox 를 세번 사용했네요. 메시지 아이콘은 상황에 맞는 걸로 정해주면 됩니다.

정상적으로 저장되었다는 메시지도 보여주게 했습니다.

그리고 문자열을 감싸는 기호로 싱글코(', Single Quote) 를 사용했는데요. 더블코(", Double Quote)를 사용해도 됩니다. 그러니까 "알림" 이렇게 써도 된다는 얘기죠. 이는 모든 문자열에 해당됩니다.

이제, 실행해서 확인해 보세요. 적당한 메시지가 보여지면 성공이죠.


여기서 테스트~

사원명을 수정한 뒤에 바로 저장버튼을 눌러보세요.
수정한 다음에 다른 아이템을 클릭하거나 탭키를 누르면 안 됩니다.


사원명 ALLEN 에서 EN 부분을 지우고 바로 저장 버튼을 눌렀는데, 이러한 메시지가 나옵니다. ??????

수정 후에 다른 아이템을 클릭하거나 탭키를 누르고 난다음 저장버튼을 누르면 정상적으로 저장이 됩니다.

dw 에서는 아이템을 수정한 뒤에 다른 아이템을 클릭하거나 커서를 옴기지 않으면 수정된 것으로 보지 않습니다.








ㅎㅎ 다음 시간에 이 문제를 해결해 보도록 하겠습니다.


수고하셨어요.



* 질문은 댓글로 남기세요.

Posted by A4M
,