* Powerbuilder 10.5

지금 dw의 데이터를 수정한 다음 DB에 반영하는 실습을 계속 하고 있습니다.

1. dw 에서 수정하고자 하는 칼럼의 Tab Order 부여
2. Update Properties 설정
3. dw에서 데이터 수정
4. Update 함수 호출

update 함수는 도움말에서 Update method (DataWindows) 로 검색할 수 있습니다.
(파워빌더에서 method 는 함수(Function)와 이벤트(Event)를 포함합니다. Update method 에서 method 는 함수를뜻합니다.)

Update 함수는 dw 컨트롤 함수입니다.

설명
  dw 컨트롤 이나 DataStore 에 의해서 변경된 내용으로 데이터베이스를 변경한다.

문법
  integer dwcontrol.Update ( { boolean accept {, boolean resetflag } } )

반환값
  성공 :
1
  에러 :
-1
  인수값이 null :
null
  dw 컨트롤에 dw object 가 할당되지 않았음 : 1



대략 사용법은 위와 같습니다. 도움말에 다른 내용들이 많지만 이 정도만 알고 넘어가고 차근차근 배워가는 것이 좋습니다. 문법에 있는 accept, resetflag 는 나중에 설명하겠습니다. 생략해도 되는 인수이므로 당분간 생략하면서 사용합니다.

파워빌더를 실행하고 w_list 를 열어보세요.

현재 dw_emp 에서 사원명만 수정할 수 있습니다. 이 Item 을 수정하고난 다음, 저장 버튼을 누르면 DB 에 반영되게 해야 합니다.

저장 버튼의 clicked 이벤트를 열어보세요.

 


먼저, 요렇게 타이핑합니다. 그럼 수정된 내용이 DB에 전달됩니다.
그런데 오라클은 기본적으로 Transaction을 지원하는 DBMS 라서 DML 을 실행한 후에는 반드시 Commit 이나 Rollback 을 전달해 줘야 합니다.

여기서 Commit 과 Rollback 의 구분 기준은 에러 여부에 있습니다.


update 함수는 에러가 생기면 -1을 반환하므로 이것을 이용할 수 있겠네요.

일단, 원하는 내용을 문장으로 표현해 보겠습니다.

dw_emp의 수정된 내용을 DBMS에 적용한다.
만약 에러가 생기면 Rollback 을 전달한 다음 메시지를 띄워서 에러 내용을 보여주고
성공하면 Commit 을 전달한다.



그 문장 대로 스크립트를 작성합니다.
 

ㅎㅎ 이제 좀 스크립트가 길어졌습니다.
자세한 설명 들어갑니다.

전체적으로 If 구문이구요.

If dw_emp.Update() = -1 Then  

요넘은 일단, Update 함수를 호출한 후에 그 반환값을 가지고 조건을 체크합니다.
이렇게 작성해도 Update 함수를 호출한다는 것을 기억해 두세요.

좀 친절하게 작성하자면

int li_rtn

li_rtn = dw_emp.Update()

If li_rtn = -1 Then


(int 는 정수를 저장할 수 있는 데이터 타입입니다. 난중에 꼭 설명할께요. ㅎㅎ)

li_rtn 변수를 선언해서 사용했는데요. 프로그래밍할 때는 가능한 필요한 변수만 선언해서 사용하는 것이 좋습니다.
코드 가독성을 높일 수도 있고 메모리를 절약하기도 하니까요. 요즘 PC 사양이 워낙 좋아져서 메모리 걱정은 안해도 되겠지만 티끌모아 태산이라고 절약하는 것이 좋습니다. 그러나 디버그할 때는 변수값의 확인을 위해 이렇게 변수를 만들어서 사용하는 것이 좋습니다. (디버그에 대해서는 추후에 설명합니다.)


string 타입은 문자열을 저장할 수 있어요.

선언하는 방법은

string 변수명

ls_errtext 라는 string 변수를 선언한 거죠.


sqlerrtext 는 SQLCA 에서 에러가 발생하면 에러 내용이 저장되는 string 변수입니다.
사용할 때는 SQLCA.sqlerrtext  요렇게 값을 받아옵니다.

Rollback 과 Commit 은 파빌 내장 SQL 입니다. 

Rollback Using SQLCA;  -> SQLCA 의 정보를 이용하여 Rollback 을 DBMS에 전달하라는 뜻입니다.
                                       내장 SQL의 마지막에는 세미콜론(;)을 붙여야 합니다.(기억나시죠?)

MessagBox의 문법은 MessageBox(string title, string or int or boolean text)

title : '에러'
text : '저장 중 에러가 발생했습니다.~n~n' + ls_errtext

~n 은 line feed 즉, 개행(줄바꿈) 을 뜻하는 특수문자입니다.
~n 을 두번 썼으니 두줄을 띄웁니다.

string 과 string 을 연결하려면 + 를 사용하면 됩니다.



여기서 궁금한 점이 하나 생깁니다.  ls_errtext 를 선언하지 않아도 될 것 같지 않나요?


If dw_emp.Update() = -1 Then
 
   Rollback Using SQLCA;
 
   MessageBox('에러', '저장 중 에러가 발생했습니다.~n~n' + SQLCA.sqlerrtext)
 
Else
 
   Commit Using SQLCA;
 
End If



요렇게 말이죠.

Rollback과 Commit 은 SQLCA.sqlerrtext 값을 초기화 시킵니다. 그래서 미리 sqlerrtext 값을 받아 두기 위해서 그렇게 한 것입니다.

그렇다면 MessageBox 후에 Rollback 을 사용해도 될 것같네요. but....

MessageBox가 열리고 사용자가 확인 버튼을 클릭하지 않으면 그 다음 스크립트는 실행 되지 않습니다.
사용자가 계속 확인 버튼을 누르지 않으면 Rollback 은 전달이 안 됩니다. 이럴 경우 현재 실습환경에서는 전혀 문제가 안되지만 Transaction 을 구현하고 있는 실무에서는 테이블에 lock 이 걸리는 문제가 생깁니다. 좀 어려운 얘기일 수는 있지만 이 부분은 알아두는 것이 좋습니다. 그래서 Rollback과 Commit 은 신속하게 이루어져야 합니다.


이제 파빌을 실행해서 사원명을 수정하고 저장버튼을 누르고 난 다음에 조회버튼을 눌러보세요.
제대로 저장이 되었다면 수정된 후의 데이터가 그대로 조회되어야 합니다.

그런데 어플리케이션에 좀 부족한 부분이 많아 보입니다.


다음 시간에는 먼저 파워스크립트 언어에 대해 전반적으로 설명합니다.
그 다음에 이 어플리케이션의 완성도를 높이는 방향으로 강의를 진행하겠습니다.

수고하셨습니다.


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

Posted by A4M
,