본문 바로가기

컴퓨터/파워빌더

파워빌더 - 실무에 유용한 팁모음1

[TIP1]

NonVisible UserObject를 이용하여 Parameter 전달


 한 window에서 다른 window로 어떤 값을 넘길때 통상 string, double 그리고 다수의 다양한 변수를 위해 structure를 사용한다.

 그런데 여기에 유용한 다른 방법으로 NonVisible UserObject를 사용할 수 있다. 이것은 여러다양한 변수는 물론 Event , Function도 포함하여 전달이 가능하다


사용예

먼저 변수로 선언 n_parm in_parm

Open Event에서 in_parm = CREATE n_parm

Close Event에서 Destroy in_parm


필요한 값을 setting 한후 in_parm.dept_no = '00123' 값을 넘겨줄곳에서

OpenwithParm(w_win , in_parm)


받는 window에서

in_parm = Message.Powerobjectparm


[TIP2] 

Datawindow에서 Multi Table Update를 가능하게


몇개의 Table을 Join하여 Datawindow를 만들었을때 Update characteristic에서하나의 Table에 대해서만 선택이 가능하며 다른 Table의 칼럼을 선택하여 OK를 누르면 선택된 Table의 칼럼이 아니라는 Error가 뜬다.  그러나 Update를 원하는 모든칼럼을 선택하고 여러 Table의 Key column을 선택할 수 있는 방법이 있다.

위와같이 필요한 모든 칼럼과 원하는 Option을 선택한뒤 Table to Update 필드에 임의 테이블명을 쓰고 (예:TEMP) OK 버튼을 누르면  Table 'TEMP' not found. Use table name anyway ? 라는 선택 메세지박스가 나타나는데 확인을 누르면 모든게 OK

이 방법은 물론 Update() 함수를 날릴때 Sqlsyntex를 확인해보면 알겠지만 Update나 Insert SQL문이 TEMP라는 Table로 날아감으로 Not Found Table이라는 Error가

발생할것이므로 미리 Modify("Datawindow.Table.UpdateTable = {table명}") 과

 Modify("column명..Update = {yes/no}")을 해야하는 수고가  필요한것은 같으나 선택한 column에 대한 Itemstatus를 내부적으로  Checking 하고있는것이 다르다.

보통 이렇게 쓰지않고 직접 SQL문장을 몇번씩 날리거나 보다편하게 Stored Procedure를 사용하는게 속편하고 행복한(?) 방법이다.


[TIP3] 

Funtion에서..


funtion을 만들때 Argument에 대한 특정한 Type을 지정을 하는데 선택할 수 있는 List에는 없지만 "dragobjct" 와 "blob"를 그냥 typing하여 사용할 수 있다.

특별히 쓰는곳이 없으신 분들이야 필요없겠지만 언젠가 필요할때 기억해두면 유용할것이다.


[TIP4] 

Datawindow에서 Enter Key를 DoubleClick 또는 필요한 Event화 하기.


Datawindow에서 User Event를 pbm_dwnprocessenter로 Mapping하여 만든뒤 아래와 같은 script를 쓴다.

This.Postevent(doubleclicked!) This.Setactioncode(1)


다음 script를 쓰면 Enter Key가 Tab Key와 같은 역할을 하게되죠

send(handle(this),256,9,long(0,0)) this.setactioncode(1)


[Tip5] 

FreeForm DW를 만들때 Design 높이를 정해놓기.


 칼럼의 수가 몇개 되지 않는 데이타윈도우일때는 별문제없겠지만 상당한 수의 칼럼을 FreeForm  Presentation Style로 Design할때에 column들이 아래로 계속내려가 있어 다시 정렬시에는 매우 번거러울 것이다.

 그래서 새로운 Datawindow를 만드는 화면의 Option을 누르면 Wrap Height가 보이는데 이것을 적당한 크기로 선택하면 DW의 Detail의 높이를 한정할 수 있다.


[TIP6] 

DataBase의 행동과 소요시간을 추적해 보기


 Profile 을 setup할때 DBMS 부문 앞에 trace를 써주면 (예: trace OR7 ORACLE v7.x) Database의 traffic과 action들을 pbtrace.log 파일로 쌓아놓게 된다.


[TIP7] 

DataWindow Error Message Title의 변경


 데이타 윈도우에 Error가 발생하면 자체의 Error MessageBox가 뜨는데 Title이 항상 똑같아 보기에 별로다. 그래서 필요한 곳에 한번 아래와 같이 써주면 된다. dw_1.Modify("Datawindow.Message.title ='"+parent.title+"'") 물론 타이틀이야 본인이 원하는대로 하시길...


[TIP8] 

가장 간단한 윤년 확인


ls_year = 원하는 년도

IF Isdate(ls_year + "/2/29") THEN

    Messagebox("",'윤년이네 !')

END IF


[TIP9] 

Window의 Timer Event를 이용하지 않은 시계만들기


1. Datawindow Object의 Attribute 중 Timer interval은 내부적으로

   Timer를 발생시킨다. 이 Option을 1000으로하여 1초마다 변화를 발

   생하게한뒤 Now() 함수를 쓴 Computed field를 만들어 Header에

   위치시키면 시계가 된다. 물론 이 Datawindow는 Dummy column

   한개의 External Datawindow로 만들면 될것이다.


2. 이러한 Timer interval을 응용하여 어떤 특정한 칼럼이나 Row를 깜

   박이게 하거나 색을 반복적으로 변화시킬 수 있다.

   원하는 Column의 Attribute 중 Visible에 다음과 같이 쓰거나

   if(mod(integer(Mid(string(Now()),7,2)),2) = 1, 0 , 1)

   Attribute 중 color에 아래와 같이 쓰면 된다

   if(mod(integer(Mid(string(Now()),7,2)),2) = 1 , 0 , 255)



[TIP10] 

특정한 각도의 Text 만들기


 Datawindow에서 특정한 StaticText Object를 일정한 각도로 놓아  

지게할려면 Attribute 중 Font Escapement에 필요한 수를 쓴다. 수

직으로 할려면 900 이다.


[TIP11] 

고정된 Data를 Datawindow내부에 갖고 있기


 데이타윈도우 Design 메뉴중 Rows/data 에 필요한 것을 써넣음. Retrieve가 필요없이 화면에 Data가 나타나므로 Design시 유용하다.


[TIP12] 

Update된 특정 Row의 칼럼만 다시 Retrieve 하기


 간단하다. Reselectrow() 함수를 사용하면 됨.

보통 모든 칼럼대비 10% 미만의 변화가 있을때 사용함이 유용하며 그 이상일때는 완전한 Retrieve() 함수의 사용이 보다 빠르다.


[Tip13] 

Path 지정


 PowerBuilder로 만든 프로그램을 설치할때 필요한 run-time DLLs를 위해 Path를 설정 해야한다.

autoexec.bat file에서 Path문장으로 설정할 수도 있지만 Win95의 registry를 이용할 수도 있다.


'시작'의 '실행'에서 regedit를 하면 registry를 편집할 수 있다.

'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Apths'


항목을 선택하면 모든 실행화일 이름들이 나열되어있다.

거기에는 'Path'라는 값이 있고 거기에 실행파일에 필요한 path가 기재되어있다. 마우스 오른쪽버튼으로 path를 수정할 수 있다.

예를 들어 'myprog.exe'라는 프로그램을 설치한다면 App Paths밑에 'myprog.exe'라는 key를 만들고 Path값으로 'c\Program Files\Common Files\PowersoftShared;c:\SQLANY50\win32'하면 Windows는 실행파일에 필요한 내용을 찾을 수 있게된다.


[Tip14] 

pbm_syscommand Event


PowerBuilder 프로그래밍을 하다보면 response window를 많이 사용하게 된다.

response window에서는 'OK'라던가 'Cancel' button을 사용하게 되는데 사용자가 이 버튼만 사용한다고 말할 순 없다.

윈도우의 오른쪽 상단 구석에 보면 'x'표시가 있다.

마우스로 이걸 누르게 되면 윈도우는 close된다.

우리가 response window를 사용할때 main window와의 message 전달 수단으로 CloseWithReturn 함수를 사용한다.

따라서 main window는 responce window가 close되면 message객체에서 message를 참조하려 할것이고 사용자는 'OK'또는 'Cancel' 버튼으로 종료하지 않았으므로 message는 null값이 전달된다.

즉 실행중에 'null object referenced' error message가 발생한다.

이를 해결하기 위한 script로서는 pbm_syscommand로 User Event를 선언한다. 그런다음에 user event에 다음의 script를 기술한다.

ue_cancel은 cancel 버튼을 눌렀을 때 수행하는 내용과 같다.

그럼 ue_cancel에서 적당한 message를 전달하게 script를 작성하면 끝난다.


IF message.wordparm = 61536 THEN

   this.TriggerEvent("ue_cancel")

END IF


[Tip15] 

LookUpDisplay(column)


Drop-Down DataWindow 또는 code table인 column을 sort key로 사용하는 경우

LookUpDisplay 함수를 사용한다.

DataWindow Painter에서 메뉴의 Rows - Sort를 선택한다.

'Specify Sort Columns' window에서 column을 drag하여 선택한다.

선택한 drop-down DataWindow 또는 code table edit style인 column을 더블 클릭하면 'Modify Expression' window가 뜬다.

그곳에서 column을 인자로 취하는 LookUpDisplay()함수를 사용한다.


예)

 Specify Sort Columns                                               

 1) Drag and Drop items                                       

 2) Double clik column to edit                                  

                                                                  

 Source Data                  Columns                  Ascendin

 emp_id               LookUpDisplay(dept_id)               *

 dept_id  

 emp_fnam

 emp_lname

 

그러면 dept_id code로 sort되지않고 dept_id의 display되는 값이 sort 기준이 된다.


[Tip16] 

SetMicroHelp


마우스를 어떤 control위로 이동시키면 microhelp message가 뿌려지는

프로그램을 본 일이 있을것이다.

이걸 PowerBuilder에서 구현하기 위한 Tip이다.

표준 Window event로써 pbm_nchittest가 있다.

이건 마우스가 어떤 control로 이동하면 자동으로 발생하는 event다.

예를 들어서 command button을 만들었다면 사용자가 마우스를 command button위로 이동시켰을 때 pbm_nchittest event가 발생한다.

그럼 우리는 pbm_nchittest event를 commnand button의 user event로 만들고 microhelp message를 뿌리는 script를 작성하면 끝이다.

message는 control의 properties... 의 Tag에 기술하고 pbm_nchittest

event의 script로서 다음과 같이 기술하면 된다.


g_w_frame.SetMicroHelp(this.tag)


g_w_frame은 MDI frame window를 가리키고 있다.

Tag가 싫다면 직접 string을 줘도 된다.

script는 여러분의 application에 맞게 기술하면된다.

user event만드는 방법은 해당 control의 script에 들어가서

메뉴의 Declare항목 User Events...를 선택하면 된다.

그럼 Events - controlname 이라는 window가 뜨고 거기에서 Event Name은 적당한 이름을 준다.

가능하면 we_nchittest라고 주는 것을 권장한다.

그리고 Event ID는 pbm_nchittest라고 주면 된다.

또는 Paste Event ID:라는 ListBox에서 찾아보면 있다.

더블클릭하면 해당 event id가 Event ID에 등록된다.


[Tip17] 

자동 Row 삽입


DataWindow에서 사용자가 맨 마지막 row 마지막 column에서 Tab Key를 누르면 자동으로 새로운 row를 insert해주는 Tip을 소개하겠다.


먼저 DataWindow에서 User Event를 선언하자.

선언할 User Event는 ue_tabout이라고 하고 사용할 User Event는 pbm_dwntabout이다.

이 Event는 사용자가 tab key를 입력해서 DataWindow를 벗어날때 발생하는 event다.

따라서 focus는 DataWindow가 아닌 다른곳으로 이동하게 되는 순간에 발생한다.

ue_tabout script는 다음처럼 기술하면 된다.


long l_row


l_row = this.InsertRow(0)

this.SetRow(l_row)


//DataWindow가 horizontal scroll bar를 갖도록 property를 설정한 경우.

this.Modify("datawindow.HorizontalScrollPosition = 1")


this.SetColumn("first_column")

this.SetFocus()


[Tip18] 

문자를 반짝이게(blink 기능)


DataWindow에서 display되는 문자를 반짝이게 하는 Tip이다.

문자를 반짝이게 하기 위해서는 DataWindow의 property중에서 timer inteval을 적당한 값으로 setting시켜야 한다.

10정도로 잡으면 된다. 그런다음 column이나 기타 control을 만들고 control의 property에서 Expressions의 visible에 다음 코드를 작성한다.

if(mod(Integer(Mid(String(Now(),),7,2)),2) = 1,0,1)


색변화를 주기위해서는 color에 다음 코드를 작성한다.

if(mod(Integer(Mid(String(Now(),),7,2)),2) = 1,0,255)


이렇게 하면 1초를 주기로 반짝이게 된다.

Now()는 현재 시간이고 Mid()로 초를 잘라내어 2로 나눈 나머지 값의 변화로 반짝이게 하는 것이다.

timer interval이 0으로 되어있으면 Now()는 처음 retrieve된 시간을 유지하게 되므로 반드시 timer interval을 줘야 한다.


[Tip19] 

ScrollToFirstRowOnPage


User가 DataWindow의 scrollbar를 눌러 scroll시킬때 row에 대한 highlight도 이동되도록 하는 Tip이다.

highlight되는 row는 현재 보여지는 page의 첫번째 row가 되도록 한다.

vertical scrollbar를 누르면 ScrollVertical event가 발생한다.

따라서 ScrollVertical Event에서 Describe()함수로 현재 보여지는 page의 첫번째 row의 값을 구해서 highlight를 설정하면 된다.


integer li_RC

long    ll_row

string  ls_result


// 현재 Page의 첫번째 row를 구한다.

ls_result = this.describe ( "DataWindow.FirstRowOnPage" )

if ls_result = "!" then

   MessageBox ( "Error", "Describe failed (1)" )

   halt close

end if


ll_row = long ( ls_result )


if ll_row < 1 then

   MessageBox ( "Error", "Describe failed (1)" )

   halt close

end if


// ScrollToRow함수로 상단의 row를 current row로 설정한다.

li_RC = this.ScrollToRow ( ll_row )

if li_RC <> 1 then

   MessageBox ( "Error", "ScrollToRow failed" )

   halt close

end if


[Tip20] 

Text at Any Angle


이번은 아주 간단한 Tip이다.

DataWindow에서 static text또는 column등의 property에서 expressions list를 보면 font.escapement가 있다.

font.excapement property는 font가 display되는 각도를 지정하는 것이다. 즉 글자를 90도로 기울이고자 할때는 값을 900으로 맞춰주면 된다.

지정해주는 값은 각도*10을 하면된다. 즉 90도*10 = 900이다.

font.excapement를 지정함으로써 어떤 각도로든지 글자의 Angle을 조절할 수 있다.

font.excapement를 지정한 결과의 display형태는 DataWindow Painter에서 preview해보면 알 수 있다.



출처 : 주호의파워빌더