태터데스크 관리자

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

태터데스크 메시지

저장하였습니다.
독도 광고 모금 캠페인
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

위 파워빌더 Example프로그램처럼 Datawindow(이하 DW)에 Grouping을 이용할 경우 페이지 변경되는 부분에 회색 라인이 생기게 된다.
스크롤 바를 클릭하여 페이지 단위로 넘길때는 안보이지만, 휠마우스로 스크롤을 한다던가 스크롤바 상하 이동 버튼을 클릭하거나 스크롤바를 드래그해서 이동하거나 하면 이 페이지 구분 라인이 보여서 가끔 프로그램 사용자들이 불만을 제기하는 경우가 있다.

이런 경우 페이지 단위로 이동하게 하는 방법을 알아보도록 하자.

페이지 단위 스크롤하는 Global 함수를 하나 추가하자.
Prototype은 다음과 같다.

global function long gf_dw_page_scroll (datawindow arg_dw)

이 함수의 내용은 다음과 같다.

   1:  //===========================================================
   2:  //= DW에서 휠/스크롤시 페이지 단위로 스크롤 처리
   3:  //= DW.other이벤트에 사용할 것.
   4:  //===========================================================
   5:   
   6:  CONSTANT integer WM_MOUSEWHEEL = 522 
   7:  CONSTANT integer WM_VSCROLL = 277
   8:   
   9:   
  10:  //= 마우스휠/스크롤을 사용한 경우 페이지 단위로 스크롤 하기
  11:  Long ll_rowcnt, ll_firstrow_page, ll_lastrow_page, ll_updown
  12:   
  13:   
  14:  // 마우스휠/스크롤을 사용한 경우
  15:  IF Message.Number = WM_MOUSEWHEEL OR Message.Number =  WM_VSCROLL THEN 
  16:      
  17:      //= 위로인지 아래인지 설정
  18:      IF Message.Number = WM_MOUSEWHEEL THEN
  19:          IF Message.WordParm > 0 THEN 
  20:              ll_updown = 1
  21:          ELSEIF Message.WordParm < 0 THEN
  22:              ll_updown = -1
  23:          END IF
  24:      ELSEIF Message.Number =  WM_VSCROLL THEN
  25:          //= 0은 위버튼클릭, 2는 위쪽바를 클릭
  26:          IF Message.WordParm = 0 OR Message.WordParm = 2 THEN 
  27:              ll_updown = 1
  28:          //= 1은 아래버튼클릭, 3은 아래쪽바를 클릭
  29:          ELSEIF Message.WordParm = 1 OR Message.WordParm = 3 THEN 
  30:              ll_updown = -1
  31:          END IF
  32:      END IF
  33:      ll_rowcnt = arg_dw.RowCount() 
  34:      ll_firstrow_page = Long(arg_dw.Object.DataWindow.FirstRowOnPage)
  35:      ll_lastrow_page = Long(arg_dw.Object.DataWindow.LastRowOnPage)
  36:      
  37:      //= 위로 스크롤한 경우
  38:      IF ll_updown = 1 THEN
  39:          
  40:          IF ll_firstrow_page <> 1 THEN
  41:              arg_dw.ScrollPriorPage()
  42:          END IF        
  43:          
  44:      //= 아래로 스크롤한 경우
  45:      ELSEIF ll_updown = -1 THEN
  46:          
  47:          IF ll_lastrow_page <> ll_rowcnt THEN
  48:              arg_dw.ScrollNextPage()
  49:          END IF
  50:          
  51:      END IF
  52:      
  53:      Message.Processed = TRUE     
  54:      
  55:      RETURN 1 
  56:  END IF 

ScrollPriorPage(), ScrollNextPage()함수를 이용하면 페이지 단위로 화면이동이 되고, Message.Number와 Message.WordParm은 MSDN을 참고하거나 일일이 디버깅모드로 값을 찾았습니다. 삽질이었죠. Sybase에서 Message내용을 다 정리해 주었으면 좋겠지만 그렇지 못한것이 아쉬웠습니다.

함수를 추가하되었으면, 페이지 단위로 스크롤할 DW의 other이벤트에 다음 코드를 추가하면 해당 DW는 페이지 단위로만 스크롤이 됩니다.

   1:  //= 마우스휠/스크롤을 사용한 경우 페이지 단위로 스크롤 하기
   2:  Return gf_dw_page_scroll(This)

위 Example에서는 w_print_employee_roster_dw.dw_employee_roster.other 이벤트가 되겠네요.

gf_dw_page_scroll 함수의 Export File을 첨부파일에 있습니다. 파워빌더 10.5로 Export한 것이니 Example프로그램에 한번 적용해 보시길 바랍니다.



파워빌더로 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기능으로 수정하는 경지에 이르게 된다. ^^;