태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.
독도 광고 모금 캠페인
rss
2008 JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC << >>
July 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

파워빌더로 DB프로그램을 개발할때 많은 프로시져와 함수가 사용된다.
일반적으로 파워빌더에서 오라클의 Procedure나 Fuction을 실행할때 Declare문을 사용한다. 다음 예제는 도움말의 Example이다.

오라클의 spu_edt_object 프로시져를 호출하기 위해서 파워빌더 스크립트에서 DECLARE, FETCH를 이용하는 예제이다.
이렇게 복잡한 방법보다 다음과 같이 한라인으로 호출하도록 설정하는 방법을 알아보자.

SQLCA.spu_edt_object(o_id_object, o_message, a_id_object, a_param, a_value)

파워빌더의 SQLCA라는 변수는 시스템 글로벌변수로 파워빌더에서 DB transaction object로 정의되어 있는 변수이다. 이 변수를 사용자 정의 transaction object로 변경해서, 그 UserObject의 Local External Functions에 함수로 정의 하는 것이다.
우선 New > PB Object > Standard Class를 선택하여 transaction을 상속받은 UserObject를 생성하자.

새로 만든 UserObject를 저장한다. 예제에서는 uo_transaction으로 저장하였다. 그럼 SQLCA를 정의한 곳에서 transaction 대신에 지금 만든 uo_transaction 오브젝트로 재정의 해 준다.
이제 SQLCA를 uo_transaction으로 재정의 해줘야한다. SQLCA가 정의된 곳은 Application 오브젝트에 있다.
Application 페이터를 열고, Properties의 General탭 제일 아래에 보면 "Additional Properties"가 있다. 이 버튼을 클릭하면 Variable Types탭에 SQLCA를 정의하는 부분이 있다. 디폴트로 transaction으로 되어 있는 부분을 새로 만든 transaction 오브젝트인 uo_transaction으로 변경해 준다.
 
이제 기본적인 설정은 끝이 났고, 오라클의 프로시져나 함수를 uo_transaction 오브젝트의 Local External Fuction으로 정의만 하면 된다.
프로시져/함수를 등록하는 Syntax는 외부 DLL함수를 등록하는 방식도 대동소이하다. DLL 등록시 사용되는 Library 키워드 대신에 RPCFUNC라는 키워드가 사용된다. 그리고 프로시져에서 OUT변수는 REF키워드를 사용하여 정의하면 된다.

FUNCTION rtndatatype functionname ( { { REF } datatype1 arg1, ...,    { REF } datatypen argn } ) 
RPCFUNC { ALIAS FOR "spname" }
SUBROUTINE functionname ( { { REF } datatype1 arg1 , ...,    { REF } datatypen argn } ) 
RPCFUNC { ALIAS FOR "spname" }

procedure는 SUBROUTINE으로 등록하면 된다.
그럼 위 예제의 프로시져는 다음과 같이 등록하면 될것이다.

SUBROUTINE spu_edt_object(REF long o_id_object, REF string o_message, long a_id_object, string a_param, string a_value) RPCFUNC ALIAS FOR "spu_edt_object"

이렇게 정의해둔 프로시져나 함수는 SQLCA.<함수명>({변수}) 와 같은 식으로 한라인으로 처리가 가능하다.
알고 나면 쉽지만... 모르면 Example의 예처럼 많은 삽질을 해야한다. ^^;



파워빌더 11 제품발표 세미나에서 Q/A시간에 어떤 개발자 분이 했던 질문이 있었다. 데이터윈도우(DW)에서 Query를 수정하면 기존 화면이 변경되는 경우가 있는데, 이거 개발자가 의도하지 않는 경우는 변경안되도록 해달라는 요지의 질문이었다. 답변에 나선 John Strano는 파워빌더가 개발의 편의를 위해서 자동으로 DW의 컬럼명을 rebuild하는 기능인데, 개발자가 의도하지 않은 때가 있기 때문에 그런 문제가 생긴 것같고, 이 문제는 여러 개발자들의 의견을 수렴해서 EBF에 반영하겠다는 원론적이 답변을 하였다.
이 문제는 파워빌더로 레포트를 개발하다가 보면 개발자를 아주 짜증나게 하는 원인이 되기도 한다. 이쁘게 만들어 둔 레포트화면이 쿼리의 컬럼면 하나 수정으로 다 틀어져 버리는 경우가 생기기 때문이다.

세미나에서 질문을 한 개발자도 이야기 했지만, 대부분의 레포트의 개발은 우선 쿼리를 DB관리툴(TOAD)에서 만든 다음 파워빌더에서 DW를 생성하는 방법을 사용한다. 나도 대부분의 레포트를 TOAD같은 툴에서 미리 쿼리를 생성하고 Data를 검증한 후 파워빌더에서 DW를 새로 생성할때 Design > Conver to Syntax메뉴를 선택하여 TOAD에서 만든 쿼리를 복사/붙혀넣기해서 작업을 진행한다. Graphic모드가 Default로 되어 있는데 이것도 옵션으로 처리하게 했으면 좋겠는데... 외국 개발자들은 Graphic모드에서 다 처리하는지도 모르겠다. --;

우선 이렇게 생성한 DW의 쿼리가 변경되었을때 일반적으로 개발자들은 DW Painter를 오픈하고 Data Source 툴바를 클릭하고 쿼리를 수정하게된다. 여기서 문제가 발생한다. 기존 쿼리의 컬럼명을 바꾸었는데, 그 컬럼이 DW에서 Display되던 컬럼이었다면 컬럼에 적용된 디자인은 모두 날라가버리게 된다. 파워빌더가 기본으로 DW의 컬럼명을 자동으로 생성하기 때문이다. 옵션으로 이 기능을 해제할 방법도 없다.

해결방안은 Edit Source를 이용하는 것이다.

DW 오브젝트를 선택하고 오른쪽 마우스키를 클릭하면 파업메뉴가 뜨는데 그중 Edit Source를 선택하면, 파워빌더의 텍스트 에디트 페인터에 DW의 오리지널 소스가 표시되고, 수정할 수가 있게 된다. 여기서 retrieve항목의 값이 Query값이 된다. retrieve항목의 값으로 더블코테이션("")안에 쿼리가 위치하는데, Query가 멀티라인일 경우 Syntax Highlight가 조금 이상하지만 자세히 보면 쿼리부분을 금방 구분할 수가 있을 것이다. 이 부분의 쿼리를 변경해 주면 DW의 디자인은 전혀 변경이 되지않는다.

이 Tip은 또다른 경우에도 사용될 수가 있다. 바로 Update Properties의 불필요한 변경을 방지하는 경우이다.

DW화면 디자인 뿐아니라 DW의 Update()함수를 이용하여 데이터를 추가/삭제하는 기능이 있는 DW에 쿼리가 변경될 경우 Update Properties에 설정된 내용이 몽창 날라가 버리는 경우가 있다. 이 문제을 알면 다행인데, 모르고 넘어가면 잘 동작하던 프로그램이 오동작을 하게되어 버그를 찾는데 한참 삽질을 해야하는 경우가 발생한다. 나도 많이 그랬으니까... --;
이런 경우에도 Edit Source를 이용하여 쿼리를 수정하면 Update Properties에 설정했던 내용은 전혀 변경되지 않는다. Edit Source로 보면 알겠지만 Retrieve항목의 쿼리바로 다음에 Update Properties의 설정 내용이 있는 것을 알 수가 있을 것이다. DW 페인터에서는 이부분 또한 자동으로 생성되기 때문에 쿼리가 수정되면 문제가 발생하는 것이다.

이렇게 Edit Source로 소스를 자주 수정하다 보면 다른 오브젝트들도 Edit Source기능으로 수정하는 경지에 이르게 된다. ^^;



파워빌더 11 제품발표 세미나에서 David Fish가 데모로 보여줬던 구글맵 API를 파워빌더에서 사용하는 예제 샘플을 파워빌더 10.5로 다운그레이드해 보았다. 원래 파워빌더 11로 .NET Web Form으로도 배포가능하도록 소스가 되어 있었으나 10.5로 다운그레이드 하면서 관련 기능은 지원하지 않는다. 하지만 uo_googlemap_api라는 NVO는 10.5이전 버젼에서도 유용하게 사용될 수 있을 것같다.
10.5 이전 버젼사용자를 위해 모든 object를 export해서 함께 압축파일을 만들었다. 9이전 버젼 사용자들은 ANSI파일을 export하시길 바란다. 또한 d_pb11_cities.srd 파일을 열어서 2라인의 release 10.5; 부분을 사용하는 버젼에 맞게 수정하고 export하시길 바란다.




PowerBuilder 11!버튼은 파워빌더 11버젼 제품 발표 세미나에서 데모로 보여주었던 John Strono와 David Fish가 파워빌더11 발표를 위해 돌아다닌 지역의 마크를 표시하는 기능을 한다. 여기서 DB의 값을 읽어서 Marker를 표시하게 되는데 w_googlemaps_demo.init_db에 DB 접속 정보를 사용하고자 하는 DB로 수정하고, 샘플소스를 다운로드해서 압축을 풀면 db폴더 아래의 cities.sql파일이 있는데 이것을 사용하는 DB에서 실행하여 테이블(cities)과 데이터를 생성하고, PowerBuilder 11!버튼을 클릭하면 실행되는 것을 확인 할수가 있다.

기본적인 로직은 특정폴더에 Google Maps API를 이용하여 html파일(이 데모에선 C:\defaultmap.htm)을 생성하고, 생성된 html파일을 브라우징 하는 방식으로 되어있다. 이 원리를 이용하여 데모로 제공되던 소스를 Google Maps API를 참고 하여 약간 수정해 보았다. 지도를 클릭하면 마크가 추가되도록 했고, 마크를 Drag/Drop으로 이동할 수 있도록 하는 기능도 함께 추가해 보았다. Google Maps API를 자세히 분석한 다면 다양한 기능의 함수를 더 추가할 수 있을 것 같다.

uo_googlemap_api 함수 Prototypes

설정함수
set_dragging (boolean value) : 지도를 Drag/Drop으로 이동하는 기능 사용여부 Set함수
set_infowindow (boolean value) : Marker를 클릭했을때 나타나는 InfoWindow 사용여부 Set함수
set_doubleclickzoom (boolean value) : 지도를 더블클릭하면 줌인/아웃되는 기능 사용여부 Set함수
set_continuouszoom (boolean value) : 줌될때 continuous zoom(구글어스에서 줌될때 이미지 부드럽게 나오는 것처럼 되는 기능인거 같은데 제대로 작동되지는 않았다. 이 기능을 설정하나 안하나 똑같더라는...) 기능의 사용여부 Set함수
set_maptypecontrol (boolean value) : 오른쪽 상단에 지도타입버튼 표시 여부 Set함수
set_normalmaptype () : 지도타입을 일반 지도이미지로 표시 Set함수
set_satellitemaptype () : 지도타입을 위성 지도이미지로 표시 Set함수
set_hybridmaptype () : 지도타입을 하이브리드이미지로 표시 Set함수
set_largemapcontrol (boolean value) : 왼쪽 상단에 지도이동(전,후,좌,우,중앙), 줌인, 줌아웃, 줌단계 컨트롤을 표시여부 Set함수
set_smallmapcontrol (boolean value) : 왼쪽 상단에 지도이동(전,후,좌,우), 줌인, 줌아웃 컨트롤을 표시여부 Set함수
set_smallzoomcontrol (boolean value) : 왼쪽 상단에 줌인, 줌아웃 컨트롤을 표시여부 Set함수
set_scalecontrol (boolean value) : 왼쪽 하단에 Scale 표시여부 Set함수
set_overviewmapcontrol (boolean value) : 오른쪽 하단에 Overview지도를 표시여부 Set함수
set_zoomlevel (integer value) : Zoom Level을 설정하는 Set함수
set_mapcenter (real lat, real lng) : 지도의 중앙 좌표를 설정하는 Set함수

설정값을 가져오는 Get함수
boolean dragging_enabled ()
boolean infowindow_enabled ()
boolean doubleclickzoom_enabled ()
boolean continuouszoom_enabled ()
boolean is_normalmap ()
boolean is_satellitemap ()
boolean is_hybridmap ()
boolean has_largemapcontrol ()
boolean has_smallmapcontrol ()
boolean has_smallzoomcontrol ()
boolean has_scalecontrol ()
boolean has_maptypecontrol ()
boolean has_overviewmapcontrol ()
integer get_zoomlevel ()
struct_latlng get_mapcenter ()

Marker관련 함수
add_markerwithinfowindow (real lat, real lng, string info) : Marker추가하고, InforWindow까지 추가하는 함수
add_marker (real lat, real lng) : Marker만 추가하는 함수
remove_all_markers () : 설정된 모든 Marker를 제거하는 함수

html파일 Generation 함수
rendermapcontrols () : 지도의 컨트롤 표시 설정에 따라 html코드 생성 함수
rendermapcenter () : 지도의 중앙좌표를 설정하는 html코드 생성 함수
rendermaptype () : 지도타입을 설정하는 html코드 생성 함수
rendermapconfiguration () : 지도의 Configuration을 설정하는 html코드 생성 함수
renderheader () : HTML header코드를 생성하는 함수 (rendermapclickevent함수 call 추가)
renderbody () : HTML body코드를 생성하는 함수
rendermarkers () : Marker를 추가하는 html코드 생성 함수
rendermapclickevent () : 지도 클릭시 Marker추가, Marker Drag/Drop기능 html코드 생성 함수(추가한 함수)
string render_map (integer ai_width, integer ai_height) : 지도 html파일을 생성하고 생성한 파일의 PATH를 리턴하는 함수

GeoCode관련 함수
geocode (string address) : renderceocode에서 geocode에서 조회할 주소값 설정 함수(데모에서는 미사용)
rendergeocode () : showAddress라는 javascript함수 html코드 생성 함수(데모에서는 미사용)



파워빌더로 개발을 진행하다가 보면 수많은 외부함수,윈도우 함수,글로벌변수,인스턴스변수,로컬변수등을 사용하게 된다. 프로그램이 커지다보면 여기저기에 있는 함수명, 변수명을 일일이 기억하기란 그리 쉬운일이 아니다. 간단하게 이런 함수명이나 변수명을 스크립트창에서 바로 찾아서 참고할수 있다면 참 편리할 것이다. 이전에 버젼 8을 사용할때도 AutoScript기능이 있었으나 솔직히 느린 반응 속도때문에 거의 사용을 하지 않았다. 오브젝트 브라우져를 통해 해당 오브젝트 열어서 일일이 함수명 변수명을 확인하고 스크립트를 작성하곤 하였다.
하지만 10버젼으로 업그레이드(9버젼은 사용해 본 경험이 없어서 논외로 하겠다)하면서 다시 이 기능을 사용해 보니 기존버젼에 비해 많이 성능이 향상되었음을 느끼게 되었다.


AutoScript 이용한 스트립트 작성

기본적으로 파워빌더는 자동으로 AutoScipt 팝업을 띄우는 기능이 비활성화 되어 있다. Edit > Activate AutoScript 메뉴를 이용하여 수동으로 AutoScirpt팝업을 실행시킬 수가 있다. 예를 들어 로컬 변수로 ll_count라는 변수가 선언되어 있다면, 이 변수를 사용할 위치에서 ll만 타이프하고 Edit > Activate AutoScript 메뉴를 선택하면 자동으로 ll_count라고 입력이 되는 것이다. Edit > Activate AutoScript 메뉴를 단축키를 등록(Tools > Keyboard Shortcuts... ; 필자는 F2를 단축키로 등록)하여 두면 사용하기 편하다.
ll로 시작하는 로컬 변수가 여러개 있다면 팝업이 떠서 개발자가 선택하도록 한다. 만약 ll로 시작하는 변수가 하나라면 자동으로 해당 변수가 입력되는 것이다.
로컬변수 뿐만이 아니라 Design > Options 창의 AutoScript화면에 설정된 것은 모두 Activate AutoScript 메뉴를 통해 팝업창으로 조회할수 가 있다.


Default로는 선택이 안되어 있는 Statement Templates항목을 활성하 시키면, if, for, do, choose, try등과 같은 제어문의 템플릿을 추가할 수도 있다. 예를 들어 if를 입력 후 Activate AutoScript 메뉴를 클릭하면 다음과 같은 if문의 템플릿을 선택할 수 있다.


두번째 if then else를 선택하면 다음과 같은 템플릿이 추가된다.
if /*condition*/ then
    /*action1*/
else
    /*action2*/
end if
템플릿 스크립트가 추가된 후 바로 /*condition*/부분이 선택되며, 조건을 바로 입력하여 간단하게 if문을 작성할수가 있다.
Activate AutoScript 메뉴를 선택할 필요없이 바로 관련된 팝업이 뜨도록 하고 싶다면 Automatic Popup옵션을 활성화하고 Delay(Milliseconds)항목에 팝업이 나타나는데 Delay될 시간을 설정해 준다. Defult로 1000이 설정되어 있는데 100정도로 줄여주면 빠르게 팝업을 띄울수가 있다.
Delay를 짧게 주고 Automatic Popup옵션을 활성화 시켜두면 스크립트를 작성할 때마다 AutoScript팝업이 떠서 불편하다고 느껴진다면, Delay시간을 약간 길게 조정하거나 dot이후에만 AutoScript팝업을 활성화시키는 Activate Only After a Dot 옵션을 활성화 시켜서 사용하면 된다.

그러나 아직 파워빌더의 AutoScript는 MS Visual Studio보다 많은 점이 부족하다. 특히 함수를 선택하면, Argument를 /**/와 같이 주석처리해서 스크립트에 박아버려서 개발시 참고하도록 하고 있다. 개발시 추가된 이주석을 지우고 변수명으로 대체하는 작업이 반복되다 보면 효율이 상당이 떨어진다. Visual Studio처럼 (입력하면 Argument List가 풍선도움말로 나타나는 기능이 있었으면 아주 편할텐데, 이점이 참 안타깝다.

Paste Special을 이용한 스크립트 작성

파워빌더로 스크립트 작성중에 툴바를 자세히 보면, 일반적으로 붙혀넣기로 사용되는 아이콘과 비슷한 아이콘들이 여러개 붙어 있는걸 볼수가 있다.
붙혀넣기(Paste)는 붙혀넣기인데, 파워빌더에만 있는 특별한 붙혀넣기. Paste Special을 이용하면 스크립트 작성시간을 많이 단축할수가 있다. Paste Special은 툴바의 단축아이콘뿐만 아니라 메뉴의 Edit > Paste Special를 통해서도 접근이 가능하다. 메뉴를 보면 서브메뉴로 툴바에 있는 9개에 추가로 From File...이라는 메뉴가 있다. 각각의 기능은 다음과 같다.

  • Function
    Built-in : 파워빌더의 내장함수
    User-defined : 사용자 정의 함수(ex. 윈도우 함수)
    External : External 함수(ex. win32 API 함수)
  • SQL : Cursor, SELECT문, DML문, Procedure관련된 스크립트를 작성한다. 이것을 이용하면, 스크립트 빌더툴을 실행하여 결과를 스크립트에 반영하는 방식으로 적용된다.
  • Statement : IF, FOR, DO, CHOOSE, TRY문의 템플릿을 스크립트에 추가한다.
  • Global : Global변수 리스트 팝업이 나타나고, Global변수를 선택하면 스크립트에 추가된다.
  • Shared : Shared변수 리스트 팝업이 나타나고, Shared변수를 선택하면 스크립트에 추가된다.
  • Instance : Instance변수 리스트 팝업이 나타나고, Instance변수를 선택하면 스크립트에 추가된다.
  • Window : Access가능한 윈도우 오브젝트 리스트 팝업이 나타나고, 윈도우 오브젝트를 선택하면 스크립트에 추가된다.
  • Object : Access가능한 오브젝트 리스트 팝업이 나타나고, 오브젝트를 선택하면 스크립트에 추가된다.
  • Argument : 이벤트나 함수의 Argument 리스트 팝업이 나타나고, Argument를 선택하면 스크립트에 추가된다.
  • From File... : 파일 선택 팝업이 나타나고, 선택한 파일의 내용이 스크립트에 추가된다.

이중 SQL, Window, From File 이외의 기능은 AutoScript로 추가가 가능한 메뉴라서 사용 비율이 현저히 떨어지는 것이다.
From File기능은 개발중 스크립트 해더 커맨트부분을 템플릿을 파일로 작성해 두고, 스크립트 작성전 해당 템플릿 파일을 불어와서 스크립트를 작성하도록 하면, 소스코드의 관리에 도움이 될 것이다.

파워빌더의 AutoScript기능은 기본적으로 비활성화 되어있기 때문에 개발자들이 잘 모르는 경우가 있다. 이기능을 기본으로 활성화 시켜두고, MS Visual Studio처럼 더욱 좋은 기능을 첨가하고, 보완한다면 파워빌더의 생산성 향상에 많은 도움이 될꺼라는 생각을 해본다.



많은 개발툴들이 기본적으로 디버깅모드를 제공하듯이 파워빌더도 역시 디버깅모드를 지원한다. 특정한 변수값을 체크하기위해 MessageBox문을 삽입하는 원시적인 디버깅을 해왔다면, 앞으로는 파워빌더에서 제공하는 디버깅모드를 적극 활용하여 더욱 효율적인 디버깅을 해보도록 하자.
파워빌더 10.5 데모프로그램(<PowerBuilder 설치 폴더>\PowerBuilder 10.5\Code Examples\New DataWindow and UI\pb105demos.pbw)을 기준으로 디버깅 절차를 살펴보도록 하자.

  1. 원하는 위치에 Breakpoint를 건다.


    예제로 w_tvdw_link윈도우를 디버깅하도록 하자.
    w_tvdw_link윈도우를 오픈하고 원하는 스크립트의 위치에서 오른쪽 마우스키를 눌러서 나오는 메뉴중에 Insert Breakpoint라는 메뉴가 있다. 이 메뉴를 클릭하면 소스 스크립트 앞에 빨간점이 마크되는데 이것이 Breakpoint이다.
    디버그모드로 프로그램 실행중 이 위치에서 스크립트 실행을 멈추고 제어권이 파워빌더로 넘어와서 디버깅 작업을 수행할수 있게된다.
    이 예제에서는 Instance변수인 il_OldHeight의 값을 알아보기 위해 il_OldHeight에 값을 설정하는 스크립트에 Breakpoint를 걸어 보자.
     
  2. 디버그모드로 실행한다.
    파워빌더 툴바의 디버그버튼(벌레모양)을 클릭하거나, 메뉴 Run > Debug {target명}을 클릭하면 Debugger Painter가 열리고, 디버그 툴바가 툴바메뉴에, Debug메뉴가 메뉴에 추가된다.


    Debug > Start {target명} 메뉴를 선택(단축키 Ctrl+T)하거나, 툴바의 Start {target명}을 클릭하면 디버그모드로 프로그램이 실행된다.
  3. 파워빌더는 프로그램 실행중 Breakpoint 위치에서 실행을 멈춘다.


    스크립트창에 노란색 삼각형은 현재 실행중인 위치를 표시한다. 디버그모드로 실행중 1번에서 설정한 Breakpoint에서 실행을 멈추고 파워빌더로 제어권이 넘어와 Debugger Painter화면으로 이동된 것을 볼수가 있다.
  4. Breakpoint위치에서 각 변수들의 값의 확인, Call stack확인, 변수값을 임의로 변경등과 같은 디버깅 작업을 수행한다.
    스크립트 제어툴바를 이용하여 스크립트를 진행해 가면서 각변수의 값을 체크한다.
    Continue(Ctrl+C) : 스크립트의 제어권을 프로그램에 넘겨버려서 프로그램을 실행한다.
    Step In(F8) : 현재 스크립트에서 호출하는 함수나 이벤트의 스크립트 제어권을 넘겨 계속 디버깅 한다. Call Stack에 stack이 하나더 쌓이게 된다.
    Step Over(F10) : 현재 스크립트에서 호출하는 함수나 이벤트로 제어권을 넘기지 않고 다음 라인으로 넘어간다.
    Step Out(Shift+F8) : 현재 스크립트를 호출한 함수나 이벤트쪽으로 스크립트 제어권을 넘겨 계속 디버깅 한다. Call Stack에서 stack이 하나 빠진다.
    Run To Cursor(Ctrl+F10) : 커서가 있는 스크립트까지 실행을 한다.
    Set Next Statement : 한라인씩 스크립트를 실행한다.
    각 툴바의 단축키는 이전버젼(9버젼은 사용한 적이 없어서 잘모르겠으나 8버젼 이번에는 단축키가 Continue만 있었다.)에서는 기본으로 설정이 안되어 있다. 단축키가 있으면 여러모로 편하기 때문에 Tools > Keyboard Shortcuts...에서 단축키를 설정하고 사용하도록 하자. 주의할점은 Debug메뉴는 Debugger Painter를 오픈한 상태에서 활성화 된다는 것이다. Debugger Painter를 열지않은 상태에서는 Debug메뉴가 활성화 되지 않기 때문에 Keyboard Shortcuts창에서 단축키를 설정할 수가 없다.

    Debugger Painter에는 여러가지 창들이 있는데 이 창들의 값들은 현재 스크립트 위치의 상태를 상세히 설명해주는 정보들로 가득하다. 이 정보들을 이용해서 프로그램상에 존재하는 버그를 찾는 것은 사람이 할 일이다.

    Local : scope가 현재 스크립트(함수, 이벤트)인 local변수와 그 값.
    Global : Global 변수의 값.
    Instance : scope가 현재 오브젝트인 Instance변수와 그 값.
    Parent : 현재 오브젝트의 Parent의 변수와 그 값.
    Shared : 현재 오브젝트의 Shared변수와 그 값.
    Objects In Memory : 현재 메모리상의 오브젝트.
    Call Stack : 현재 실행되는 스크립트의 Call Stack.
    Breakpoints : 현재 타겟에 설정된 Breakpoints의 리스트.
    Watch : 자주 체크하고 싶은 변수를 설정해 두고 일일이 찾는 불편을 감소시킬 목적으로 설정한 변수 리스트.

    이중에서 개발과정에서 자주 사용되는 항목은 Local, Instance, Global, Watch 정도가 될 것같다.
    특히 Watch에는 sqlca를 추가해 두면 DB에러를 체크하는데 많은 도움이 될수 있다. sqlca는 Global 변수로 transation sqlca로 정의되어 있다. Watch창에 드래그&드랍하거나,  Debug > Add Watch, 툴바의 Add Watch툴버튼, Global창에서 sqlca선택 후 오른쪽 마우스클릭 후 나오는 팝업메뉴에서 Add Watch(참 종류도 여러가지네!)등의 방법으로 Watch변수로 추가한다.


    디버깅중에 변수의 값을 임의로 변경하여 프로그램의 로직을 체크하고 싶을 때도 있을 것이다. 값을 변경하고 싶은 변수를 더블클릭하면  Modify Variable팝업이 나타난다. 이 팝업에서 원하는 값으로 변경하여 스크립트를 수행할 수가 있다.


    예제에서 스크립트의 제어가 라인 16에 있는 상황에서 Local 변수 li_cnt값은 0이다. 이값을 임의로 5로 변경하여 다음 문장인 For루프를 실행하면, For루프를 그냥빠져나가 버리게 된다. 이와 같이 변수의 값을 조정하면서, 해당 변수의 값이 어떻게 되었을 때 프로그램의 흐름이 제대로 이루어지는지 확인해 볼수가 있다.

    디버그모드로 실행중에 Breakpoint를 추가하는 작업이 가능하다. Source Browser에서 추가하고자 하는 Source를 열어서 해당 라인을 더블클릭하면 Breakpoint를 추가 할수가 있다. 또한 Breapoint에서 제어가 멈추게하는 조건을 설정할 수가 있는데, Debugger Painter의 Edit Stop()툴버튼이나, Edit > Breakpoint..., Breakpoints창에서 수정할 Breakpoint를 선택후 오른쪽 마우스 클릭하면 나타나는 팝업메뉴에서  Breakpoints...메뉴를 선택하면 Edit Breakpoints팝업창이 실행된다.


    Occurrence : 해당 Breakpoint를 몇번째 실행될때 스크립트를 멈출 것인지 설정. Occurence에 2를 설정하면 해당 Breakpoint의 스크립트가 첫번째 실행될때는 멈추지 않고 2번째 스크립트가 실행될때 스크립트를 멈추게 된다. 이 옵션은 resize이벤트 처럼 여러번 이벤트가 중복되서 발생하는 경우 유용하게 사용될 수 있을 것 같다.
    Condition : 이 옵션에는 특정 expression을 설정하고, 설정한 expression이 True가 될때에만 스크립트를 멈추는 기능이다. notisNull(val)으로 설정하면 val값이 Null이 아닐때만 해당 Breakpoint가 작동하게된다.


    Variable탭에서는 특정변수가 변경되었을때 스크립트를 멈추게하는 Breakpoint를 추가하는 화면이다. Debug모드로 실행중 New버튼을 클릭하고, 현재 스크립트상의 변수명을 Variable에 입력하고 Apply 버튼을 클릭하면 'when {Variable} changes'라는 Breakpoint가 추가되는 것을 확인 할 수가 있다.


    이 Breakpoint는 디버깅모드로 실행을 한 후에만 추가할수 있으며, 디버깅모드로 실행하지 않은 상태에서 Variable을 추가하고 Apply를 클릭하면 "The variable could not be found."라는 메시지만 나오고 Breakpoint는 추가되지 않는다. 반드시 디버깅모드로 실행후에 추가해야 한다는 것을 기억하길 바란다.
  5. 디버깅으로 찾은 버그를 수정한다.
    프로그램 버그의 판단과 수정은 전적으로 개발자의 몫이며, 디버깅모드는 개발자의 판단에 도움을 주기위한 툴일뿐이다. 디버그모드로 모든 버그를 제거할수 있다는 오류는 범하지 말기를 바란다. 디버깅 모드의 중단은 Debugger Painter 툴바의 Stop Debugging()툴버튼이나, Debug > Stop메뉴를 선택하면 된다.

지금까지 파워빌더로 디버깅하는 방법을 알아보았다. 디버깅을 잘하는 정도는 없다고 생각한다. 위에 설명한 것은 단지 방법일 뿐이지 이것으로 모든 버그를 잡을 수 있다는 것은 절대 아님을 명심하길 바란다. 가능하면 버그없는 프로그램을 만들어야겠지만, 버그가 적게 프로그래밍 할수는 있을지언정 버그가 전혀없게 프로그래밍하기는 불가능하다는 것이 지금까지의 경험이다. 그래서 이런 디버깅툴의 도움을 받아서 버그를 잡아 버그를 줄여나가는 과정은 개발과정에서 반드시 필요한 과정이다. 버그들이 벌벌떨수 있도록... ^^;

(추가)

Just-in-time Debugging 보기...



소개 드릴 사이트는 사이베이스의 codexchange사이트 인데요. 주소는 다음과 같습니다.

https://powerbuilder.codexchange.sybase.com

선결 조건이 sybase회원으로 가입이 되어 있어야 하는데 파워빌더 개발자라면 이미 등록되어 있다고 가정하고 소개 시켜드립니다. ^^;

미가입상태라도 이메일과 간단한 정보만 입력하면 바로 가입되니 두려워마시고...

첫화면 하단을 보면 각 Section별로 링크와 설명이 있습니다. 각 Section별로 유용한 샘플 소스들이 많이 올라와 있으니 개발하시는데 많이 도움이 될것같습니다.

참고로 조만간 있을 파워빌더 11 제품발표 세미나에서 보실지도 모르는 PB11 Roadshow 자료가 올라와 있습니다. 미리 한번 살펴보시는 것도 좋을 것 같네요.

꼭 참고해 보시라고 권해드리고 싶은 소스가 있는데요. 파워빌더로 미려한 Outlook 스타일 GUI를 구현해 놓은 샘플인데, Control Section에 올라온 GUI 샘플들을 통합 정리한 샘플입니다. Advanced GUI Development PowerBuilder project이곳이 프로젝트 홈이고, 샘플 다운로드는 https://advanced-gui-development.codexchange.sybase.com/servlets/ProjectDocumentList에서 받으실 수 있습니다.

또 하나... 오픈 소스로 진행되고 있는 Kodigo Project를 소개해 드립니다. 이 사이트에서 회원가입하고 다운로드 메뉴에서 샘플 받으셔서 한번 실행해 보세요. 파워빌더로 이런 인터페이스도 가능하다는 사실에 놀라우 실 껍니다. ^^;

아직 Documents가 빈약한 것이 단점이지만, 지금까지 파워빌더의 화려하지 못한 GUI가 불만이셨다면, 그런 불만을 말끔히 해결해 줄꺼라 생각됩니다.



파워빌더 11버전 제품 발표 세미나

드디어 국내에 PowerBuilder 11버젼의 제품 발표회가 있다.
아젠다를 보면 John Strano가 .NET위주로 발표를 하게 될것 같다. 파워빌더 11의 주요 기능이 .NET의 통합임을 알수 있는 부분이다. PowerBuilder 11의 주요기능을 설명하는 섹션을 자타가 공인한다는 파워빌더 전문가인 John Strano가 직접 진행하는 것이 주목을 끈다. Sybase에서 이번 PowerBuilder11 버젼에 많은 기대를 하고 있다는 증거이다.  

기존 PowerBuilder솔루션을 웹 기반 솔루션으로 간편하게 전환하게 해주는 Appeon에 관한 섹션도 마련되어 있는데. 11버젼에서 .NET을 사용하게 되면서 Appeon의 장점이 많이 퇴색되는 것 같은데 어떤 주제로 섹션을 이어갈지 상당히 궁금하다.

PowerBuilder의 강력한 기능인 DataWindow를 PowerBuilder이외의 툴에서 사용가능하도록 하는 DataWindow .NET에 관한 섹션도 마련되어 있어 관심이 간다. 이 섹션을 통해 DataWindow .NET이 어떻게 사용되는지 알게 되는 계기가 되었으면 좋겠다.

이번 PowerBuilder 11버젼의 출시로 부디 국내에도 많은 래퍼런스 사이트들이 생겨 PowerBuilder의 옛 명성을 다시 되찾는 계기가 되었으면 좋겠다.

추가: PowerBuilder codexchange 사이트PB11 Roadshow 파워포인트 슬라이드와 예제 소스가 올라와 있어서 추가 포스트한다. 미리 참고하면 도움이 될것 같다.



PowerBuilder 드디어 .NET을 흡수하다. - 2. .NET Web Forms포스트에서 기존 C/S 프로그램을 Web Application으로 전환하여 IIS에서 서비스하는 방법을 살펴보았었다.
Tutorial 프로그램을 실행해본 결과에서 느낄수 있는 단점은 Web으로 전환후 속도가 C/S프로그램 만큼 나오지는 않는다는 것이다. 이번에 포스트하는 기존의 C/S프로그램을 .NET Windows Forms은 .NET기반의 Smart Client로 전환하는 방법에 대해서 설명하겠다.
파워빌더 개발환경이 설정되어 있지 않다면 PowerBuilder 드디어 .NET을 흡수하다. - 1. 환경설정포스트를 참고하여 설정을 하고 시작하도록 하자.

기존 C/S프로그램 및 Resource Files 복사

  1. PowerBuilder 설치 폴더(default:  C:\Program Files\Sybase)\PowerBuilder 11.0\Tutorial\Solutions디렉토리에 C/S버젼의 Tutorial이 존재한다. 우선 Tutorial\Soulutions폴더안의 파일을 Tutorial\Windows Forms폴더로 복사를 하자.
     
  2. Tutorial폴더안에 있는 이미지 파일들(tshirtw.jpg, tutsport.bmp, tutorial.ico)을 Tutorial\Windows Forms 폴더에 복사를 하자.
    파워빌더에서 .NET Windows Form Application에서는 Resource파일들이 반드시 Target Directory나 하위 Directory에 위치해 있어야만하는 제약이 있다. 모든 전환과정이 끝나고 .NET Windows Forms project object를 열어서 Resource tab에서 Add Files버튼을 클릭한 후 Target Directory상위 폴더로 이동해보자. 그러면 'You can only select files within this target's directory("C:\Program Files\Sybase\PowerBuilder 11.0\Tutorial\Windows Forms") or its subdirectories'라는 Warning 메시지 박스가 나타난다.
     
  3. w_welcome object를 열어서 Picture control인 p_sports의 PictureName속성에서 디렉토리 Path부분을 삭제한다.
    ..\tutsport.bmp를 tutsport.bmp로 수정한다.

계속보기...

관련 포스트