윈도우에 listbox 컨트롤을 추가 후 아래와같이 작성하여 원하는 파일명들을 listbox에 불러온다.

lb_1.dirlist("경로\*.파일형식", 0)

삭제이벤트에 아래와같이 기술하면 된다.

int i

for i = 1 to lb_1.totalitems()
 FileDelete(lb_1.text(i))
next

혹은 커맨드 명령어를 통해 간단히 사용할 수도 있다.

Run("cmd /c del 경로\*.파일형식")

'Power Builder*' 카테고리의 다른 글

파일 용량 제한  (0) 2009.01.05
Command line (cmd)  (0) 2009.01.05
프로그램 중복실행 방지  (0) 2009.01.05
파일 생성 (FileOpen)  (0) 2009.01.02
사용자 IP 가져오기  (0) 2009.01.02
Posted by 회사원Z
:



string ls_path, ls_filename
integer li_FileNum, li_bytes, li_value
long ll_FileLen, ll_loops, ll_size
blob lb_pic, lb_image

// 파일 선택
li_value = GetFileOpenName ("Select File", ls_path, ls_filename, "jpg", &
"JPEG Files(*.jpg), *.jpg")

if IsNull(ls_path) or li_value <> 1 then return

SetPointer(HourGlass!)
ll_FileLen = FileLength(ls_path)
li_FileNum = FileOpen(ls_filename, StreamMode!)
IF ll_FileLen > 32765 THEN
IF Mod(ll_FileLen, 32765) = 0 THEN
ll_loops = ll_FileLen / 32765
ELSE
ll_loops = (ll_FileLen / 32765) + 1
END IF

ELSE
ll_loops = 1
END IF

// Read the file
li_NewPos = 1
FOR i = 1 to ll_loops
li_bytes = FileRead(li_FileNum, lb_pic)
lb_image = lb_image + lb_pic
NEXT
FileClose(li_FileNum)

ll_size = li_bytes + ((ll_loops - 1) * 32765)

// 이미지 크기 제한
if ll_size > 50000 then
MessageBox("확인", " 이미지 크기가 50,000 Byte 이상 넘지를 못합니다.(" + &
string(ll_size, "###,###,##0") + " Byte)", StopSign!)
return
end if

'Power Builder*' 카테고리의 다른 글

디렉토리내의 특정형식의 파일만 삭제하기  (0) 2009.01.09
Command line (cmd)  (0) 2009.01.05
프로그램 중복실행 방지  (0) 2009.01.05
파일 생성 (FileOpen)  (0) 2009.01.02
사용자 IP 가져오기  (0) 2009.01.02
Posted by 회사원Z
:


run ("명령어")


예 )

Run("cmd /c del c:\test\*.txt")

c:\test의 텍스트 파일을 모두 삭제

'Power Builder*' 카테고리의 다른 글

디렉토리내의 특정형식의 파일만 삭제하기  (0) 2009.01.09
파일 용량 제한  (0) 2009.01.05
프로그램 중복실행 방지  (0) 2009.01.05
파일 생성 (FileOpen)  (0) 2009.01.02
사용자 IP 가져오기  (0) 2009.01.02
Posted by 회사원Z
:



Global External Functions
FUNCTION UINT CreateMutexA ( ULONG lpsa, BOOLEAN fInitialOwner, STRING lpszMutexName ) LIBRARY "Kernel32.DLL"
FUNCTION BOOLEAN ReleaseMutex ( UINT hMutex ) LIBRARY "Kernel32.DLL"
FUNCTION ULONG GetLastError () LIBRARY "Kernel32.DLL"

Global Variables
UNIT gui_hMutex

OPEN event
gui_hMutex = CreateMutexA ( 0, TRUETHIS.title )
 IF GetLastError() = 183 THEN
  
MessageBox("!", "Already Running!")
   HALT close;
 END IF

CLOSE event
ReleaseMutex ( gui_hMutex )

'Power Builder*' 카테고리의 다른 글

파일 용량 제한  (0) 2009.01.05
Command line (cmd)  (0) 2009.01.05
파일 생성 (FileOpen)  (0) 2009.01.02
사용자 IP 가져오기  (0) 2009.01.02
트레이아이콘  (0) 2008.12.30
Posted by 회사원Z
:



// 현재 파일을 몇번 열었는지를 알기위한 ini 파일
string logcount
logcount = ProfileString("logcount.ini", "logcount", "logcount", "0")

integer li_FileNum
string li_path, ls_ip
ls_ip = space(50)
GetIpAddress(ls_ip, 50) //
ip알아오는 function

li_path = "NDreamlog.txt"

/* FileOpen함수는 open하려는 파일이 없으면 새로 생성을 하기 때문에
/* 생성하려는 경우가 아니라면 FileExists를 이용하여 존재여부를 확인해야한다
/* li_FileNum으로 파일번호를 생성하는 이유는 filewrite나 fileread등을 사용할 때
/* 파일번호를 이용하기 때문이다.*/
li_FileNum = FileOpen(li_path, LineMode!, Write!, Shared!, Append!)

FileWrite(li_FileNum, logcount + " " + string(today(), "yyyy-mm-dd hh:ss") + " " + ls_ip)


 

'Power Builder*' 카테고리의 다른 글

Command line (cmd)  (0) 2009.01.05
프로그램 중복실행 방지  (0) 2009.01.05
사용자 IP 가져오기  (0) 2009.01.02
트레이아이콘  (0) 2008.12.30
윈도우 화면중앙표시  (0) 2008.12.29
Posted by 회사원Z
:





Subroutine About ( ) library "getmacip.dll"
Function integer GetMACAddress ( ref string buf, integer len ) library "getmacip.dll"
Function integer GetIPAddress ( ref string buf, integer len ) library "getmacip.dll"


string ls_ip
ls_ip = space(50)

GetIpAddress(ls_ip, 50)
sle_ip.text = ls_ip  //-> IP Address 추출

GetMACAddress(ls_ip, 50)
sle_adress.text = ls_ip  //-> MAC Address 추출

'Power Builder*' 카테고리의 다른 글

프로그램 중복실행 방지  (0) 2009.01.05
파일 생성 (FileOpen)  (0) 2009.01.02
트레이아이콘  (0) 2008.12.30
윈도우 화면중앙표시  (0) 2008.12.29
한글입력모드 자동설정  (0) 2008.12.29
Posted by 회사원Z
:

트레이아이콘

2008. 12. 30. 14:31
Function boolean Shell_NotifyIcon ( long dwMessage, ref notifyicondata pnid ) Library "shell32.dll"
Function boolean SetForegroundWindow ( ulong hWnd ) Library "user32.dll"
Function long LoadImageA ( long hInst, string lpszName, uint uType, int cxDesired, int cyDesired, uint fuLoad ) Library "user32.dll"
Function long ExtractIconA ( long hInst, string lpszExeFileName, uint nIconIndex) Library "shell32.dll"
Function boolean DestroyIcon ( long hIcon ) Library "user32.dll"

'Power Builder*' 카테고리의 다른 글

파일 생성 (FileOpen)  (0) 2009.01.02
사용자 IP 가져오기  (0) 2009.01.02
윈도우 화면중앙표시  (0) 2008.12.29
한글입력모드 자동설정  (0) 2008.12.29
알람시계  (0) 2008.12.23
Posted by 회사원Z
:



OPEN Event

integer w, h
Environment env
GetEnvironment(env)
w = PixelsToUnits(env.ScreenWidth, XPixelsToUnits!)
h = PixelsToUnits(env.ScreenHeight, YPixelsToUnits!)
this.y = (h - this.height) / 2
this.x = (w - this.width) / 2


*Environment 선언문은 환경변수이며 GetEnvironment() 함수를 이용하여 컴퓨터 및 운영체제에 대한 정보를 알 수 있다.

'Power Builder*' 카테고리의 다른 글

사용자 IP 가져오기  (0) 2009.01.02
트레이아이콘  (0) 2008.12.30
한글입력모드 자동설정  (0) 2008.12.29
알람시계  (0) 2008.12.23
Sound play (wav파일)  (0) 2008.12.23
Posted by 회사원Z
:



Global External Functions

FUNCTION long ImmGetContext(long hWnd) LIBRARY "imm32.dll"
FUNCTION long ImmSetConversionStatus(long hWnd, long a, long b) LIBRARY "imm32.dll"



GetFocus Event

long mode
mode = ImmGetContext(handle(parent))
ImmSetConversionStatus(mode, 1, 0) //2번째 인수값 1 = 한글, 2 = 영어, 0 = 원래값

'Power Builder*' 카테고리의 다른 글

트레이아이콘  (0) 2008.12.30
윈도우 화면중앙표시  (0) 2008.12.29
알람시계  (0) 2008.12.23
Sound play (wav파일)  (0) 2008.12.23
스톱워치 (Stop watch) - 디지털화면  (0) 2008.12.22
Posted by 회사원Z
:

알람시계

2008. 12. 23. 19:26



 

w_main

 

open Event

 

ddlb_select.text = "10분 후"

now = string(now())

dw_1.object.p_2.Filename  = ".\images\" + left(now, 1) + ".bmp"
dw_1.object.p_3.Filename  = ".\images\" + mid(now, 2, 1) + ".bmp"
dw_1.object.p_4.Filename  = ".\images\" + mid(now, 4, 1) + ".bmp"
dw_1.object.p_5.Filename  = ".\images\" + mid(now, 5, 1) + ".bmp"

timer(1)

IF rb_direct.checked = TRUE THEN
 ddlb_select.Enabled = FALSE
ELSEIF rb_select.checked = TRUE THEN
 sle_h.Enabled = FALSE
 sle_m.Enabled = FALSE
END IF

 

 

timer Event

 

now = string(now())

dw_1.object.p_2.Filename  = ".\images\" + left(now, 1) + ".bmp"
dw_1.object.p_3.Filename  = ".\images\" + mid(now, 2, 1) + ".bmp"
dw_1.object.p_4.Filename  = ".\images\" + mid(now, 4, 1) + ".bmp"
dw_1.object.p_5.Filename  = ".\images\" + mid(now, 5, 1) + ".bmp"

IF time(now) = alarm_time THEN
 w_main.SetPosition(TopMost!)
 f_play("startup.wav")
 IF rb_direct.Checked = TRUE THEN
  messagebox("알람시간", left(string(alarm_time), 2)+"시 " + mid(string(alarm_time), 4,2) +"분 입니다.")
 ELSEIF rb_select.Checked = TRUE THEN
  messagebox("알람시간", left(string(alarm_time), 2)+"시 " + mid(string(alarm_time), 4,2) +"분 입니다.")
 END IF
 rb_direct.Enabled = TRUE
 rb_direct.Checked = TRUE
 sle_h.Enabled = TRUE
 sle_m.Enabled = TRUE
 sle_h.Text = ""
 sle_h.setFocus()
 sle_m.Text = ""
 ddlb_select.Enabled = FALSE
 ddlb_select.text = "10분 후"
 w_main.SetPosition(NoTopMost!)
END IF

 

 

 

 

pb_set (설정버튼)

 

clicked Event

 

IF rb_direct.checked = TRUE THEN
 alarm_time = time(sle_h.text + ":" + sle_m.text + ":00")
 rb_direct.Enabled = FALSE
 rb_select.Enabled = FALSE
 sle_h.Enabled = FALSE
 sle_m.Enabled = FALSE
ELSEIF rb_select.checked = TRUE THEN
 CHOOSE CASE ddlb_select.text
  CASE "10분 후"
   alarm_time = RelativeTime(now(), 600)
  CASE "20분 후"
   alarm_time = RelativeTime(now(), 1200)
  CASE "30분 후"
   alarm_time = RelativeTime(now(), 1800)
  CASE "40분 후"
   alarm_time = RelativeTime(now(), 2400)
  CASE "50분 후"
   alarm_time = RelativeTime(now(), 3000)
  CASE "한시간 후"
   alarm_time = RelativeTime(now(), 3600)
 END CHOOSE
 rb_direct.Enabled = FALSE
 rb_select.Enabled = FALSE
 ddlb_select.Enabled = FALSE
END IF

 

pb_reset(취소버튼)

 

clicked Event

 

rb_direct.Enabled = TRUE

rb_select.Enabled = TRUE
rb_direct.Checked = TRUE
sle_h.Enabled = TRUE
sle_m.Enabled = TRUE
sle_h.Text = ""
sle_h.setFocus()
sle_m.Text = ""
ddlb_select.Enabled = FALSE
ddlb_select.text = "10분 후"

 

오늘도 무식하게 짠 프로그램 공개입니다 ㅎㅎ

파빌8.0.2

'Power Builder*' 카테고리의 다른 글

윈도우 화면중앙표시  (0) 2008.12.29
한글입력모드 자동설정  (0) 2008.12.29
Sound play (wav파일)  (0) 2008.12.23
스톱워치 (Stop watch) - 디지털화면  (0) 2008.12.22
스톱워치 (Stop Watch)  (0) 2008.12.18
Posted by 회사원Z
:



Declare의 Local External Functions 부분에 아래와 같이 선언하여준다.

Function Boolean sndPlaySoundA(String s_file, UINT u_flags) Library "WINMM.dll"
Function UINT LoadLibraryA(String as_library) Library "kernel32"
Subroutine FreeLibrary(UINT HInstance) Library "kernel32"


Functions 부분에 아래와 같은 사용자Function을 등록한다.



Access : public
Return Type : (None)
Function Name : f_play
Argument Type : String
Argument Name : as_wave

UINT lu_instance
lu_instance = LoadLibraryA("WINMM.dll")
IF lu_instance = 0 THEN
 sndPlaySoundA(as_wave, 0)
 FreeLibrary(lu_instance)
END IF
return


그리고 사용하고자 하는 곳에서 함수호출만 해주면 된다.
예) f_play("startup.wav")
※ 파일 경로를 정확히 해줄 것.

'Power Builder*' 카테고리의 다른 글

한글입력모드 자동설정  (0) 2008.12.29
알람시계  (0) 2008.12.23
스톱워치 (Stop watch) - 디지털화면  (0) 2008.12.22
스톱워치 (Stop Watch)  (0) 2008.12.18
WindowType property for PowerBuilder controls  (0) 2008.12.18
Posted by 회사원Z
:






                                                                                                                              

w_main timer Event

i_sec = i_sec + 1

IF i_sec > 59 THEN
 i_min = i_min + 1
 i_sec = i_sec - 60
ELSEIF i_min > 59 THEN
 i_hour = i_hour + 1
 i_min = i_min - 60
END IF

s_hour = string(i_hour, "00")
s_min = string(i_min, "00")
s_sec = string(i_sec, "00")

dw_1.object.p_1.filename = ".\images\" + left(s_hour,1) + ".bmp"
dw_1.object.p_2.filename = ".\images\" + right(s_hour,1) + ".bmp"
dw_1.object.p_3.filename = ".\images\" + left(s_min,1) + ".bmp"
dw_1.object.p_4.filename = ".\images\" + right(s_min,1) + ".bmp"
dw_1.object.p_5.filename = ".\images\" + left(s_sec,1) + ".bmp"
dw_1.object.p_6.filename = ".\images\" + right(s_sec,1) + ".bmp"

                                                                                                                              

cb_1 clicked Event

IF THIS.text = "기록시작" THEN
 THIS.text = "기록정지"
 timer(1)
ELSEIF THIS.text = "기록정지" THEN
 THIS.text = "기록시작"
 timer(0)
 messagebox("알림", s_hour + "시간 " + s_min + "분 " + s_sec + "초 걸렸습니다.")
 i_hour=0;i_min=0;i_sec=0;
 dw_1.object.p_1.filename = ".\images\0.bmp"
 dw_1.object.p_2.filename = ".\images\0.bmp"
 dw_1.object.p_3.filename = ".\images\0.bmp"
 dw_1.object.p_4.filename = ".\images\0.bmp"
 dw_1.object.p_5.filename = ".\images\0.bmp"
 dw_1.object.p_6.filename = ".\images\0.bmp"
END IF

                                                                                                                                        


picture control은 dw를 FreeForm - External로 임시 db를 만들어서 그 안에서 출력하였습니다.

DataWindow를 사용하면 해당 DLL을 배포해야 합니다.
상위버전(8버전이상) 다른 분들은 마이그레이션으로 소스에서 실행해주시면 될듯합니다.

Default로 00:00:00 넣는것도 괜찮을꺼 같은데요? 최초 Default 이미지만 적용해주면 되니깐요
 
또치  별거 아니지만 Instance 변수로 선언시에 조금 귀찮지만은
Public, Protected, Private 로 정의해놓는게 차후에 큰 프로젝트 진행하기에 좋습니다.
어느부분까지 접근범위를 정할건가라니까요.

일반적으로 JAVA에서 메소드 정의하는 타입과 동일합니다.

Function도 역시 Access Type 정의를 해주시는게 좋죠
더 나아가서 Function은 아규먼트의 PassBy (변수 읽는 속성 타입) Value, ReadOnly, Reference
적용하는게 귀찮더라도 프로그램이 커지면 커질수록 좋습니다.
 
또치  마지막으로 관련 Tip하나..
Dynamic 을 통해서 이벤트나 펑션 호출시 포함되는 아규먼트는 ReadOnly는 불가능합니다.
예) wf_test(al_test) <-- al_test는 ReadOnly 타입 또는 Constant(상수)는 불가능

'Power Builder*' 카테고리의 다른 글

알람시계  (0) 2008.12.23
Sound play (wav파일)  (0) 2008.12.23
스톱워치 (Stop Watch)  (0) 2008.12.18
WindowType property for PowerBuilder controls  (0) 2008.12.18
날짜계산기  (0) 2008.12.12
Posted by 회사원Z
:





window Timer Event
--------------------------------------------------------------------------------
i_sec = i_sec + 1

IF i_sec > 59 THEN
i_min = i_min + 1
i_sec = i_sec - 60
ELSEIF i_min > 59 THEN
i_hour = i_hour + 1
i_min = i_min - 60
END IF

sle_1.text = string(i_hour, "00") + " : " + string(i_min, "00") + " : " + string(i_sec, "00")
--------------------------------------------------------------------------------


cb_1 Clicked Event
--------------------------------------------------------------------------------
IF THIS.text = "기록시작" THEN
THIS.text = "기록정지"
timer(1)
ELSEIF THIS.text = "기록정지" THEN
THIS.text = "기록시작"
timer(0)
messagebox("알림", string(i_hour) + "시간 " + string(i_min) + "분 " + string(i_sec) + "초 걸렸습니다.")
END IF
--------------------------------------------------------------------------------


다른방법
1. Datawindow Object의 Attribute 중 Timer interval은 내부적으로 Timer를 발생시킨다. 이 Option을 1000으로하여 1초마다 변화를 발생하게한뒤 Now() 함수를 쓴 Computed field를 만들어 Header에 위치시키면 시계가 된다. 물론 이 Datawindow는 Dummy column 한개의 External Datawindow로 만들면 될것이다. 
2. API를 통해서 SetTImer... 이것도 1/1000 초 단위로 Timer가 발생됩니다. 
3. sle_1.Text로 표현을 안해줘도 된다면 그냥 기록시작일때 Now()와 Today()를 가지고 있다가 
기록 종료하면 계산해서 걸린 시간을 표현


'Power Builder*' 카테고리의 다른 글

Sound play (wav파일)  (0) 2008.12.23
스톱워치 (Stop watch) - 디지털화면  (0) 2008.12.22
WindowType property for PowerBuilder controls  (0) 2008.12.18
날짜계산기  (0) 2008.12.12
Font.Weight  (0) 2008.12.12
Posted by 회사원Z
:

[적용]
  Windows

[설명]
  이 속성의 값은 윈도우 타입에 조건으로 지정된다.

 Child  Main(parent) Window 내에서만 존재할 수 있으며 Main Window에 종속적이다.
 Main  다른 모든 Window로부터 독립적이다.
 MDI  MicroHelp status bar가 없는 MDI frame 
 MDIHelp  MicroHelp status bar가 있는 MDI frame 
 Popup

 대게 Window 내의 Event를 보여주기도 하지만 Event가 Window 밖에 존재할 수도 있고
 경우에 따라서는 그런것들이 닫힌 Event를 Window가 Open된 후에 일어나기도 한다.
 Response

 사용자에게 정보를 획득하기 위해 보여지는 Window이며
 Focus를 잃을 수 없고 사용자가 응답할 때까지 닫히지 않는다.

[용법]
  페인터에서
   → Window Type에 조건으로 지정
    Window의 속성에서 General탭의 WindowType란의 Dropdown listbox에서 원하는 타입을 선택
  스크립트에서
   → 실행중에 WindowType 속성을 동적으로 변경할 수 없다.


[Popup, Reponse 차이점]
  1. 타 윈도우로 Focus 이동
   Popup만 가능, Reponse 불가능
  2. Event 처리 차이점
   Reponse : Open 또는 OpenWithParm이 기술 된 부분에서 Reponse 창이 닫혀야 실행
   Popup : Popup 윈도우가 열리더라도 Popup 창을 연 Event 부분 실행
 ※ Message Object를 이용하여 윈도우간 뭔가를 주고 받을려면 꼭 Reponse로 해야한다

'Power Builder*' 카테고리의 다른 글

스톱워치 (Stop watch) - 디지털화면  (0) 2008.12.22
스톱워치 (Stop Watch)  (0) 2008.12.18
날짜계산기  (0) 2008.12.12
Font.Weight  (0) 2008.12.12
CurrentRow()  (0) 2008.12.12
Posted by 회사원Z
:

날짜계산기

2008. 12. 12. 15:28






 w_main

- OPEN Event
sle_year.setfocus()

- KEY Event
IF KeyDown(KeyF1!) THEN
 open(w_about)
END IF


 pb_1

- CLICKED Event
//날짜 입력여부 검사
if sle_year.text="" or sle_month.text="" or sle_day.text="" then
 messagebox("알림", "날짜를 입력해주세요.")
 sle_year.setfocus()
else
 //입력한 날짜 표시( 예 : 2008-01-01)
 st_date.text = sle_year.text + "-" + sle_month.text + "-" + sle_day.text
 //입력된 날로부터 경과된 날 표시( 예 : 346)
 st_days.text = string(daysafter(date(st_date.text), today()))
 //입력된 날이 현재날짜보다 느릴 경우 입력된 날로부터 경과된 날의 표시 해제
 if long(st_days.text) < 0 then
  st_date.visible=false
  st_2.visible=false
  st_days.visible=false
  st_3.visible=false
 end if
 //입력한 날짜로부터 st_date에 입력한날이 경과된 날짜표시 (예 : 2008-04-10)
 st_caldayresult.text = string(RelativeDate(date(st_date.text), long(sle_caldays.text)))
//st_basicdate에 입력한 날이 오늘로부터 며칠 남았는가/지났는가 표시 ( 예 : 246)
 st_when.text = string(DaysAfter(RelativeDate(date(st_date.text), long(sle_basicdate.text)), today()))
//st_when이 0보다 크거나 같으면 (지났으면) 지났다고 표시 , 그 외엔 며칠 남았다교 표시
 if long(st_when.text) >= 0 then
  st_6.text = "일 된지"
  st_7.text = "일 지났습니다."
 else
  st_6.text = "일 까지"
  st_7.text = "일 남았습니다."
 end if
end if





'Power Builder*' 카테고리의 다른 글

스톱워치 (Stop Watch)  (0) 2008.12.18
WindowType property for PowerBuilder controls  (0) 2008.12.18
Font.Weight  (0) 2008.12.12
CurrentRow()  (0) 2008.12.12
DW내의 값으로 접근  (0) 2008.12.02
Posted by 회사원Z
:

Font.Weight

2008. 12. 12. 11:13

⊙ 설명
  글꼴의 굵기를 설정한다.

⊙ 사용법
  속성에서 Font 탭의 Bold의 Properties에서 사용

⊙ 값
  100 - Thin
  200 - Extra light
  300 - Light
  400 - Normal
  500 - Medium
  600 - Semibold
  700 - Bold
  800 - Extrabold
  900 - Heavy

⊙ 사용예
  선택된 행의 글꼴을 Bold로 그렇지 않은 행들은 Normal로 표시
  if(currentrow()=getrow(), 700, 400)

'Power Builder*' 카테고리의 다른 글

WindowType property for PowerBuilder controls  (0) 2008.12.18
날짜계산기  (0) 2008.12.12
CurrentRow()  (0) 2008.12.12
DW내의 값으로 접근  (0) 2008.12.02
DataWindow does not have UPDATE capability 에러발생  (0) 2008.11.28
Posted by 회사원Z
:

CurrentRow()

2008. 12. 12. 10:36


 

  • 설명
    현재 선택되어진 행의 번호를 리턴한다.
  • 구문
    CurrentRow()
  • 리턴값
    Long. 성공시에는 현재행의 번호를 리턴하지만 실패할 경우 0을 리턴한다.
  • 주의사항
    CurrentRow()가 언제나 화면에 보이는 행의 값을 리턴하는 것은 아니다. 만약 사용자가 7번째 행을 선택하고 스크롤바를 50번째 행으로 넘길지라도 CurrentRow()는 사용자가 50번째 행을 클릭하기 전 까지는 7을 리턴한다.

'Power Builder*' 카테고리의 다른 글

날짜계산기  (0) 2008.12.12
Font.Weight  (0) 2008.12.12
DW내의 값으로 접근  (0) 2008.12.02
DataWindow does not have UPDATE capability 에러발생  (0) 2008.11.28
RowsCopy  (0) 2008.11.28
Posted by 회사원Z
:


dwcontrol.object.data [ startrownum, startcolnum, endrownum, endcolnum ]

ex)
dw_detail.Object.acct_code[ll_row]

dw_detail DataWindow에서 선택된 로우의 acct_code의 ll_row번 째 값을 가져온다.

'Power Builder*' 카테고리의 다른 글

Font.Weight  (0) 2008.12.12
CurrentRow()  (0) 2008.12.12
DataWindow does not have UPDATE capability 에러발생  (0) 2008.11.28
RowsCopy  (0) 2008.11.28
SQL  (0) 2008.11.25
Posted by 회사원Z
:

원인: 다중테이블로 데이터윈도우를 만들었거나 데이터윈도우에서 컬럼등을 추가한후
     update propety를 갱신하지 않았을때 발생

해결책
데이터윈도우 페인터를 엽니다.
메뉴중 Rows>update propety.. 를 실행시킵니다.
먼저 왼쪽상단의 allow update 체크박스를 체크해줍니다.
다음 오른쪽 상단에서 업데이트하고자하는 테이블을 선택합니다.
(두개 이상의 테이블일 경우 update명령으로는 하나의 테이블밖에 저장못합니다.
나머지 테이블은 스크립트에서 수동으로 update시켜야합니다.)
다음 왼쪽하단에서 update 시키고자하는 컬럼들을 선택해줍니다.
(단 이때 선택한 테이블의 컬럼들만 선택해야 합니다.)
오른쪽 하단에서 해당테이블의 primary key를 선택해 줍니다.

'Power Builder*' 카테고리의 다른 글

CurrentRow()  (0) 2008.12.12
DW내의 값으로 접근  (0) 2008.12.02
RowsCopy  (0) 2008.11.28
SQL  (0) 2008.11.25
Window에서 SQL문 사용하기  (0) 2008.11.20
Posted by 회사원Z
:

RowsCopy

2008. 11. 28. 18:48
[설명]

DataWindow control (또는 DataStore object)에서 다른 곳으로 특정 범위의 row 복사하거나, 단일 DataWindow control (또는 DataStore object)내의 버퍼에서 다른 버퍼로 특정 범위의 row 복사한다.

[적용]

DataWindow controls, DataStore objects, child DataWindows

[문법]

dwcontrol.RowsCopy ( startrow, endrow, copybuffer, targetdw, beforerow, targetbuffer )

[Argument]

dwcontrol

row 복사하려는 DataWindow control, DataStore, 또는 child DataWindow 이름

startrow

복사하려는 번째 row 번호 (long )

endrow

복사하려는 마지막 row 번호 (long )

copybuffer

row 복사하려는 버퍼를 명시한 dwBuffer 열거형 데이터 타입의 :

· Primary!

· Delete!

· Filter!

targetdw

row 복사하려는 DataWindow control 이나 DataStore 이름. targetdw 동일한 DataWindow control (또는 DataStore object) 가능하고 다른 DataWindow control (또는 DataStore object) 가능하지만, child DataWindow 불가능하다.

beforerow

복사된 row 삽입되기 직전의 row 번호 (long ). 마지막 row 이후에 삽입하려면, 존재하는 row 수보다 임의의 값을 사용한다.

targetbuffer

복사된 row에관한 대상 버퍼를 명시하는 dwBuffer 열거형 데이터 타입의 :

· Primary!

· Delete!

· Filter!

[Return ]

Integer.

처리에 성공하면 1을 리턴하고 에러가 발생하면 -1 리턴한다. argument 값중에 NULL 있으면, RowCopy 함수는 NULL 리턴한다.

[용법]

RowsCopy 함수를 사용할 , primary 버퍼로 복사된 row 상태는 NewModified!이므로, Update 요청하면 PowerBuilder SQL INSERT 문장을 DBMS 보낼 것이다.

RowsCopy 함수를 사용할 , DataWindow DataStore내의 drop-down DataWindow 관한 자료는 InsertRow 함수를 호출할 때처럼 자동으로 retrieve 되지 않으므로 반드시 대상 DataWindow내의 child DataWindow 관하여 Retrieve 함수를 호출하여야 한다.

RowsCopy 함수의 용도는 다음과 같다:

· 기존의 데이터를 바탕으로 새로운 row 생성할 있도록 하나이상의 row 복사본을 만든다

· 선택한 row들을 다른 DataWindow 복사하여 특정 범위의 row 인쇄한다

[예제]

* 다음 문장은 dw_1 현재 row부터 모든 row dw_2 primary 버퍼에 복사한다.

dw_1.RowsCopy(dw_1.GetRow(), dw_1.RowCount(), Primary!, dw_2, 1, Primary!)

'Power Builder*' 카테고리의 다른 글

DW내의 값으로 접근  (0) 2008.12.02
DataWindow does not have UPDATE capability 에러발생  (0) 2008.11.28
SQL  (0) 2008.11.25
Window에서 SQL문 사용하기  (0) 2008.11.20
PB Function  (0) 2008.11.12
Posted by 회사원Z
:

SQL

2008. 11. 25. 16:16
CONNECT,UPDATE, DISCONNECT
 
파워빌더 애플리케이션이 데이터베이스에 접속하고 그 데이터베이스를 조작하는데 두 가지 방법이 있다.
하나는 파워스크립트 언어로 sql을 수행하는 스크립트를 작성하는 것이고, 다른 하나는 데이터원도우를 이용하는 것이다.
아래에 나오게 될 예제들은 파워스트립트 언어로 sql을 수행하여 메인프레임의 batch작업을 수행하는 것들이다.
이 스크립트는 비 대화식의 작업작업에서 부터 큰 작업까지 처리한다. 대신 데이터의 입력작업과 같이 사용자와 대화식으로 수행되는 작업에는 데이터 원도우를 사용한다.
 
파워스크립트에서 sql명령을 사용하는데는 두가지 방법이 있다.
.삽입된 sql - 다른 파워스크립트문과 구별없이 sql 명령들을 스크립트에 직접 첨가한다.
.동적 sql - sql 명령들을 하나의 문자열의 변수로 저장하여 데이터베이스에 보내어 수행한다.
두가지 방법중 삽입된 sql은 더 간단하고 직접적이다.
동적 sql은 더 강력하고 융통성있는 방법이며 실행시간까지 알 수 없는 파리미터들에 대한 명령들을 작성할수 있다.

데이터베이스 상품관점에서 볼때 파워스크립트는 호스트(host)언어이다.
ex1) 삽입된 UPDATA문이 있는 스크립트
Transaction trans1
trans1 = CREATE Transaction
trans1.DBMS =" ODBC"
trans1.Database =" Video Store DB"
trans1.UserId =" dba"
trans1.DBParm =" Connectstring = 'DSN = Video Store DB'"
CONNECT USING trans1;
UPDATE customer
   SET address = 'dandong namgu ulsan'
 WHERE firstname = 'park'
USING trans1;
DISCONNECT USING trans1;
DISTORY trans1

실제 애플리케이션에서는 정확히 이와같이 스크립트를 작성하지는 않는다.
CONNECT, UPDATE 그리고 DISCONNECT문들은 모두 그 애플리케이션의 한곳이 아니라 다른 이벤트 스크립트에 각각 놓을수 있다. 또한 trans1 대신에 sqlca라는 특별한 변수를 사용할 경우에는 이 코드의 몇줄을 삭제하여야 한다. 하지만 기본적으론 이런 골격을 갖춘다는 좋은예이다..
 
SQL문과 파워스크립트문의 차이점.
1. sql문은 세미콜론으로 끝나야 하지만 파워스크립트는 그렇지 않다.
2. 파워스크립트 문은 한줄이 넘어가면 "&"를 사용해야 하지만 sql은 그렇지않다.
 
트랜잭션 객체
바로위의 예제(1)에서 trans1이라는 이름의 변수를 많이 사용하고 있다.
대부분의 애플리케이션에서는 sqlca라는 이름의 변수를 사용하는데, 이는 파워빌더의 특별한 내장변수로 몇가지 단계를 줄여준다. 그전에 trans1은 트랜잭션 객체의 이름이다. 트랜잭션객체는 구조체와 매우 비슷한 것으로 데이터베이스 접속에 관한 정보를 저장하여 파워빌더 애플리케이션과 데이터베이스 사이의 모든 상호작용을 한다.
 
1-1. 트랜잭션 객체의 선언, 생성, 소멸
Transaction trans1;          // 선언 - 변수 trans1을 'Transaction'자료형 변수로 선언
trans1 = CREATE Transcation  // 생성 - 트랜잭션 객체를하나 생성 (메모리를 할당하고 그 값을 초기화)
DESTORY trans1               // 소멸 - 객체를 메모리에서 제거하고 그메모리를 반환.
 
1-2. 트랜잭션 객체의 접속 속성들
DBMS : 'ODBC' 또는 'Oracle'와 같은 데이터베이스 서버의 종류
필수
ServerName : 데이터베이스 서버의 이름
Database : 데이터베이스 이름
UserID : 사용자의 데이터베이스 ID
DBPass : 사용자의 패스워드
LlgID : 사용자의 서버 로그인 ID
LogPass : 사용자의 서버 로그인 패스워드
Lock : 트란잭션 수행하는 동안 얼마나& locking이 수행되는지 결정하는&" isolationlevel"
DBParm : 데이터베이스 서버에 의존적인 추가적인 접속 파라미터들
필수
AutoCommit : 자동적으로& commit할 것인지를 결정 (True or False)
 
1-3. 삽입된 SQL
위의 예제(1)에서 아래의 문장들은 삽입된 SQL이다.
CONNECT USING trans1;      //데이터베이스에 접속, 이것은데이터베이스 페인트에서 File/Connect 메뉴를 선택하는 것과 같다.
UPDATE customer
SET address = 'dandong namguulsan'
WHERE firstname = 'park'
USING trans1;
DISCONNECT USING trans1;   //데이터베이스의 접속을 단절.
 
1-4. 삽입된 SQL의 USING 절
한번의 트랜잭선 객체 변수를 선언하여 초기화하면 그것을 각 삽입된 SQL문의 마지막에 USING 절로 마무리짓는다.
USING절은 그 SQL 문을 올바른 데이터베이스에 보내기 위해 필요한 것이다.
애플리케이션에서 여러개의 데이터베이스에 접속하면 그 각각에 대해 별도의 트랜잭션객체를 선언하여야 한다.
그리고 USING 절을 이용하여 해당 데이터베이스를 올바르게 인식시킨다.
디폴트는 USING sqlca이며 디폴트로 지정하였을 경우 따로 지정을 인식시킬 필요는 없다.
 
실제의 예제
실제 프로그래밍에서는 아래의 몇가지 있다.
1. 오류 처리루틴을 첨가해야 한다.
2. 트랜잭션 객체를 sqlca를 사용하는것이 편리하다.
3. 모든 스크립트에서 매번 트랜잭션을 접속하고 접속을 끊는것보다 애플리케이션이 시작될때
   한번 접속한후 계속 접속상태로 두는것이 더좋다.
4. 위의 예제에서는 그 트랜잭션 객체의 속성들에 대한 값들을 일일이 코딩하였다.
   그러나 그 값들을 PB.INI나 다른 .INI파일로부터 가져오도록 하면 그 애플리케이션을 보다 융통성있게 관리할수 있다.
 
1-1. 오류처리
오류반환속성 : 내용
반환값
자료형
SqlCode : 성공 또는 실패여부
성공 : 0, 실패 : -1, 처리없음 : 100
long
SqlRorw : 처리된 행들의 갯수
long
SqlDBCode : 데이터베이스가 명시하는 오류코드
long
SqlErrText : 오류발생시 오류메세지
string
SqlReturnData : 유용한 정보메세지
string
ex2) 오류처리의 예
 UPDATE customer
 SET    address = 'dandong namgu ulsan'
 WHERE  firstname = 'park'
 USING  trans1;
IF trans1.sqlcode <> 0 THEN
    MessageBox("Error on Update",&
               "Error Code:" + String(trans1.SqlDbCode) +&
               " -nError Message =" + trans1.sqlErrText, &
               StopSign!)
    RETURN
END IF

위에 예제는 sql실행시 에러처리의 예이며 connect와 disconect 다음의 문장에도 에러처리를 첨가하여야 한다.
1-2. Sqlca의 사용 SQL통신영역(Communications Area)
파워빌더는 자동적으로 하나의 전역 트랜잭션객체 변수를 선언하고 생성한다.
그것이 salca이다. sqlca를 사용하였을 경우의 이점은
1. sqlca를 선언, 생성, 소멸할 필요가 없다. 이작업들은 파워빌더가 자동적으로 해준다.
2. 모든 sql 문 뒤에 using 절을 사용할 필요가 없다, 파워빌더가 디폴트로 USING sqlca를 첨가한다.
ex3) sqlca를 사용한 스크립트
sqlca.DBMS =" ODBC"
sqlca.Database =" Video Store DB"
sqlca.UserId =" dba"
sqlca.DBParm =" Connectstring = 'DSN = Video Store DB'"
CONNECT USING trans1;
UPDATE customer
SET    address = 'dandong namgu ulsan'
WHERE  firstname = 'park'
DISCONNECT;

1-3. 전역 접속(Global Connection)
보통 애플리케이션이 수행되는 동안에는 데이터베이스에 계속 연결된 상태로 있기를 원한다. 그래서 CONNECT 의 적절한 사용위치는 애플리케이션의 'open'이벤트 스크립트에 기술하며, DISCONNECT 의 적절한 사용위치는 애플리케이션의'close'이벤트 스크립트에 기술한다. 이렇게 하면 다른 스크립트에서 더이상 CONNECT, DISCONNECT를 기술할 필요가 없으며 대부분의 서버에서 CONNECT는 매우늦은 연산이므로 가능한 적게 사용하는 것이 좋다.
 
1-4. INI 파일로부터 접속 파라미터 읽기
스크립트에서 트랜잭션 속성들의 값을 직접코딩하는 것은 대부분의 실-세계애플리케이션에서 융통성이 없어지므로 그 속성의 일부 또는전부를 .INI 파일에서 읽도록 해야 한다. 각 사용자가 PB.INI파일을 가지고 있다고 확신한다면 그 파일을 사용할수 있다. (또는 그 애플리케이션만의 .INI 파일을 별도로 가질수 있다.)
다음 예제는 PB.INI 파일에서 'Video Store'라는명칭의 데이터베이스의 접속 파라미터를 정의하는 예이다.
ex4) PB.INI의 PROFILE 섹션
[Profile Video Stoe DB]
DBMS = ODBC
Database = Video Store DB
UserID =
DatabasePassword =
LogPassword =
ServerName =
LogID =
DbParm = Connectring = 'DSN = Video Store DB; UID = dba'
Autocommit = 0
Prompt = 0
다음 예제는 PB.INI로 부터 그파라미터를 읽어와서 sqlca의 속성들에 저장하는 방법을 보여준다.
파워빌더는 .INI 파일의 파라미터를 읽기위해 ProfileString 함수를 제공한다.
ex5) PB.INI로부터 트랜잭션 속성읽기
String   ls_inifile, ls_section, ls_dbms
ls_inifile =" PB.INI"
ls_section =" PROFILE Video Store DB"
ls_dbms = ProfileString(ls_infile, ls_section," DBMS","" )
IF ls_dbms ="" THEN
    MessageBox("Error on Connect to Video Store DB", &
               "Unable to read DBMS vender from the"+&
                ls_section +" section of INI file"  +&
                ls_inifile,                          &
                stopsign!)
    RETURN
END IF
sqlca.Database = ProfileString(ls_inifile. ls_section," Database","" )
sqlca.ServerName = ProfileString(ls_inifile. ls_section," ServerName","" )
sqlca.UserID = ProfileString(ls_inifile. ls_section," UserID","" )
sqlca.DBPass = ProfileString(ls_inifile. ls_section," DatabasePassword","" )
sqlca.LogId = ProfileString(ls_inifile. ls_section," LogId","" )
sqlca.Lock = ProfileString(ls_inifile. ls_section," Lock","" )
sqlca.DBParm = ProfileString(ls_inifile. ls_section," DBParm","" )
sqlca.DBMS = ls_dbms
CONNECT;

Null, Commit, Rollback
1. 널(Nul)값 처리
데이터베이스 테이블의 열들은 널값을 가질수있다. 널값은 공백 문자열이나 숫자 0 과는 같지않다. 종종 파워스크립트 프로그래밍을 할 때 널값에대한 특별한 처리가 필요하다.
WHERE 문에서의 예) ........... WHERE ... IS NULL;, 또는...............WHERE ... IS NOT NULL;
INSERT 문에서의 예) ........... VALUES ('9999', '8888',NULL, NULL)
UPDATE 문에서의 예) .......... SET remark = NULL WHERE.....;
1-1. 파워스크립트 산술연산에서의 널값
널값을 가지고 산술연산을 하면 그 결과 역시널값이 된다.
ex) IF IsNull(lr_a) THEN
             i = 0
        ELSE
             i= lr_a * 0.2 / 10
        END IF
만약 그 변수가 문자열 또는 다른 형의 변수라면 산술연산을 위해 비슷한 널의 처리가 필요하다.


1-2. 널 변수들과 컨트롤 속성들
SingleLineEdit 컨트롤의 Text 속성 또는 필드컨트롤의 비슷한 속성들을 널로 지정하였을 경우 예를 들어 sle_city.Text = ls_city 이 문장은 무시되고 그 컨드롤의 Text는 변경되지 않는다. 이 널값을 공백문자로 처리하려면 다음과 같은코드를 첨가 하여야 한다.
ex) IF IsNull(ls_city) THEN
             sle_city.Text =""
         ELSE
             sle-city.Text = ls_city
        END IF


1-3. SQL 산술연산의 널값들
sql문에서 산술연산이 가능하며, sql도 널값을 파워스크립트와 같은 방식으로 처리한다. 예를 들어 어떤 식의 일부의 결과가 널이라면 그식 전체의 결과가 널이 된다. 만약 널을 0과 같이 처리하려면 다음과 같이 한다.
ex) UPDATE pay
    SET totalpay = IsNull(sales, 0) + IsNull(tax, 0);
sql에 있는 isnull함수는 파위스크립트의 isnull함수와 다르다, 이함수는 널이 아닌 첫번째 파라미터를 반환한다.
위의 예제에서 sales나 tax가 널값이면 다음 파라미터인 0을 반환하는 것이다.


1-4. 지시(Indicator) 변수들
변수에 널 값이 지정되었는지 알아보는 가장쉬운 방법은 위에서 기술된 바와 같이 isnull함수를 사용하는 것이다.
다른 한가지 방법은 지시변수를 사용하는 것이다.
이것은 into문에 있는 값의 다음에 위치하는 별도의 변수이다,
만약 그값이 정상이면 지시변수는 0을 반환하고 널일경우 -1, 데이터 반환 오류일경우 -2를반환한다.
ex) SELECT city, openbalance
    INTO   :ls_city    :indvar_city,
           :ls_openbal :indvar_openbal
    FROM   customer
    WHERE  custid ='7777';
IF indvar_city = -1 THEN .......          //city의 값이 널
IF indvar_openval = -1 THEN .......       //openvalance의 값이 널


2. 트랜잭션 - Commit, Rollback
하나의 트랜잭션은 성공 또는 실패의 단위로써 sql 문들의 집합이다. 이는 데이터베이스의 무결성을 보장하기 위한방법이다. 서버마다 그 구문이 조금씩 다른데, ANSI-표준 SQL에서는하나의 트랜잭션이 그 데이터베이스에 영향을 미치는 INSERT 또는 UPDATE와 같은 명령들로 시작하고, COMMIT나 ROLLBACK과 같은 명령을 사용하여 끝낸다.
ex) execute multiple SQL statement here
IF everything worked THEN
      COMMIT;
ELSE
      ROLLBACK;
END IF
commit는 sql 문들에 의한 데이터베이스의 변경을 영구적으로 만든다. 반면, roolback은 그 변경들을 모두 취소시킨다.  이두경우 모두 그 트랜잭션을 끝내는 것이다. 그다음에 나오는 insert나 update와 같은 sql 문이 새로운 트랜잭션을 시작한다.
파워빌더는 commit와 roolback을 삽입된 sql의 형태로 지원한다.
그래서 위와 같이 그 명령들을 스크립트에 포함하여 사용할수 있으며 필요에 따라 using절을 수반할 수도 있다.


2-1. AutoCommit
파워스크립트의 트랜잭션 객체는 autocommit라는 속성을 가지고 있는데 이 속성은 트랜잭션에 중요한 영향을 미친다.
autocommit는 불린(boolean)값을 가지며 데이터베이스에 connect하기전이나 후에 그 값을 지정할 수 있다.
sqlca.AutoCommit = False
CONNECT;
autocommit을 지원하는 데이터베이스 상품에서는
 . autocommit의 값을 true로 지정하면 트랜잭션이하나도 없게 된다.
   그래서 각 sql 명령은 그 즉시데이터베이스에 적용된다. 이 경우 명시적인 commit나 rollback는 아무런 의미가 없다.
 . qutocommit의 값을 false로 지정하면 모든 sql명령들이 트랜잭션의 일부분이 되며,
    매번작업을 완료하기 위해 commit나 rollback를 수행해야 한다.
AutoCommit는 트랜잭션 객체의 속성들중 하나이다.그러므로 다른 속성들과 같이 그 값을 지정할수있다.
sqlca.DBMS =" ......."
sqlca.Databaxe =" ......"
.......
.......
sqlca.AutoCommit = False
COMMIT;
AutoCommit 의 디폴트 값은 True이다.


한 애플리케이션에서 AutoCommit의 값은 계속해서 바꿀 수가 있다. 그래서 필요에 따라 트란잭션처리를 변경할수 있다.
예를들어 다소 간단한 모듈일 경우 는시작모듈에서 autocommit의 값을 true로,
복잡한 모듈일 경우 시작에서 autocommit의 값을 false로 지정한다.
autocommit의 값을 변경하기 위해 disconnect를 하고다시 connect할 필요는 없다.

'Power Builder*' 카테고리의 다른 글

DataWindow does not have UPDATE capability 에러발생  (0) 2008.11.28
RowsCopy  (0) 2008.11.28
Window에서 SQL문 사용하기  (0) 2008.11.20
PB Function  (0) 2008.11.12
파워빌더 팁  (0) 2008.11.11
Posted by 회사원Z
:
DataWindow가 아닌 Window에서 SQL문을 사용할 때는
다른거 없다 그냥 SQL문을 그대로 써준다. 굳ㅋ
단! 파워빌더의 변수를 사용할 때는 변수명 앞에 콜론(:)을 꼭 붙여준다.

INSERT INTO pos_store_stock_member_BarcodePrinterLog (storeNo, mobile, userip)
VALUES (:storeno, :mobile, :userip);
COMMIT;


이런식으로 밸류에 들어갈 변수들은 :를 꼭 써줄것.
그리고 자료가 변경될 때는 끝에 commit을 붙이는걸 잊으면 안된다!!!!

또 SELECT문을 써서 데이터를 불러올 때 변수에 저장하고 싶으면

SELECT mobile INTO : mobile
FROM  pos_store_stock_member
WHERE  storeNo = :storeno AND mobile = :sle_mobile.text;


이런식으로 INTO를 써준다.

'Power Builder*' 카테고리의 다른 글

RowsCopy  (0) 2008.11.28
SQL  (0) 2008.11.25
PB Function  (0) 2008.11.12
파워빌더 팁  (0) 2008.11.11
데이터윈도우 함수  (0) 2008.11.11
Posted by 회사원Z
:

PB Function

2008. 11. 12. 15:17

AcceptText PowerScript Function

◆ 기 능

DataWindow edit control의 내용을 DataWindow control buffer의 current item에 적용시킨다. edit control에 있는 data는 item에 저장되기 전에 column에 대한 validation rule을 통과해야만 한다.

◆ 적 용

DataWindow controls과 child DataWindows

◆ 문 법

Parameter

Description

datawindowname

에디트 컨트롤에 내장된 자료를 받아들이고자하는 데이터윈도우이름과 자식 데이터원도우

DataWindowName.AcceptText ()

◆ 반환값

Long. 정상적으로 수행되면 1, 실패하면 -1을 리턴한다.

◆ 사용법

사용자가 DataWindow에서 item에서 item으로 이동할 때 사용자가 edit한 data를 맞는지 확인하고 받아들인다.사용자가 window에서 다른 control로 즉시 바꾼 후 DataWindow item을 기록할 때 DataWindow는 그 data를 받아들이지 않는다. 그 data는 edit control에 남아있다.

DataWindow object가 사용자가 edit한 data를 포함하고 있다는 것을 확인하는 AcceptText()를 사용한다. AcceptText를 ItemChanged event에서 호출하지 말아야 한다.

예제

이 예제는 사용자가 데이터윈도우 오브직트의 칼럼안에 사번과 같은 키값을 입력하고 ok button을 클릭할것이라는 기대를 하는 경우이다. clicked event를 위한 이 script는 기재된 내용을 확인하고 그것을 데이터윈도우 콘트롤안에 위치하기 위해 accepttext를 호출한다. 그때 이 script는 킷값의 행을 검색하기 위해 retrieve함수안에 아이템을 사용한다.

IF dw_emp.AcceptText() = 1 then

dw_emp.Retrieve(dw_emp.GetItemString(dw_emp.GetRow(),dw_emp.GetColum()))

END IF

command button의 click 사건을 위한 이 script는 dw_emp 데이터 윈도우안의 텍스트를 적용시키고 balance 열이 0보다 큰 행의 수를 센다.

Integer I, count

dw_emp.AcceptText()

FOR I = 1 to dw_emp.rowcount()

IF dw_emp.GetItemNumber(I, 'balance') > 0 THEN

count = count +1

END IF

NEXT

cliked 사건을 위한 이 script는 child datawindow안의 텍스트를 적용한다.

DataWindowChild dwc

integer rtncode

rtncode = dw_emp.GetChild("emp_id",dwc)

dwc.SetTransObject(sqlca)

dwc.Retrieve("argument")

.....

dwc.AcceptText()

AddItem PowerScript Function

■ 기능

임의의 리스트박스의 리스트 값에 새로운 항목을 추가한다.

■ 문법

listboxname.AddItem(item)

Parameter Description

'Power Builder*' 카테고리의 다른 글

SQL  (0) 2008.11.25
Window에서 SQL문 사용하기  (0) 2008.11.20
파워빌더 팁  (0) 2008.11.11
데이터윈도우 함수  (0) 2008.11.11
네이밍 규칙  (0) 2008.11.11
Posted by 회사원Z
:

파워빌더 팁

2008. 11. 11. 17:49
윈도우간 여러변수 전달하기
윈도우 오픈시 값을 전달할때 여러 값을 구조체 하나로 공용해서 사용하는 방법
윈도우 오픈시 값을 전달하기 위해서 OpenWithParm()이라는 함수를 사용하게 됩니다
여러값을 전달하고자 할때는 구조체를 정의해서 해당 구조체에 값을 넣어 전달하고, 받는 쪽에선
Message.PowerObjectParm을 이용해서 받지요.
그런데 여러값을 전달하는 윈도우가 많게 되면 구조체도 많이 정의해야 됩니다. 구조체를 많이 정의
하면 프로그램 크기가 커지고 해서 어떤 프로그래머는 구조체에 의한 값 전달보다는 전역변수를 사용
하여 값을 전달하는 방식으로 사용하기도 하죠.
하지만 아래와 같이 활용하면 구조체를 하나만 만들고도 여러값을 전달하는 경우 각 구조가 달라도
서로 공유해서 사용 할 수가 있습니다.
먼저 구조체를 다음과 같이 정의합니다.
Variable Name에는 "s[]" , Type에는 "string" 으로 구조체를 정의합니다.
이렇게 하면 가변적 문자열 배열이 생성되죠.
계속해서 double형 변수 d[], datetime형 변수 dt[] 를 만듭니다.
이것을 str_parms라는 구조체로 저장합니다.
오픈하는 스크립트는 다음과 같이 작성하면 됩니다.
str_parms l_str_parms
//전달에 필요한 값을 정의
l_str_parms.s[1] = "홍길동"
l_str_parms.s[2] = "대풍시스템"
OpenWithParm(w_abc, l_str_parms)
받는 쪽의 스크립트는 다음과 같이 작성합니다.
str_parms l_str_parms
l_str_parms = Message.PowerObjectParm
//받은 값을 가지고 사용
// if l_str_parms.s[1] = "홍길동" then ....
위와 같이 사용하면 전체시스템에서 윈도우간에 여러 값을 전달받을때
구조체 하나만을 이용해서 자유로이 값을 전달받을 수 있게 된다.
─────────────────────────────────────
PowerBuilder [Tip63] row의 순서를 바꿔보자.
dragdrop을 이용하여 row의 순서를 바꾸게 해보겠습니다.
데이타 윈도우에서 row를 선택하면 화살표가 나타나게 합니다.
이부분은 timer event를 이용합니다.
//window의 timer event
if ib_mousedown then
dw_1.Drag(Begin!)
end if
Timer(0)
//delcare instance variable
boolean ib_mousedown = False
//declare userevent
pbm_dwnlbuttonup을 이용하여 ue_lbuttonup event를 만든다.
//dw_1의 ue_lbuttonup event
ib_mousedown = False
//dw_1의 clicked event
if row = 0 then Return
this.SelectRow(0, False)
this.SelectRow(row, True)
ib_mousedown = true
Timer(0.2)
//dw_1의 dragdrop event
long ll_selrow, ll_newrow
stringls_row
IF DraggedObject() = this THEN
parent.SetRedraw(false)
ll_selrow = this.GetSelectedRow(0)
ls_row = this.GetObjectAtPointer()
if ls_row = '' then
ll_newrow = this.RowCount() + 1
else
ll_newrow = Long(Mid(ls_row, Pos(ls_row, "~t") + 1))
end if
this.RowsMove(ll_selrow, ll_selrow, Primary!, this, ll_newrow, Primary!)
this.SelectRow(0, False)
if ll_newrow > ll_selrow then ll_newrow --
this.SelectRow(ll_newrow, True)
parent.SetRedraw(true)
END IF
─────────────────────────────────────



선택된 ROW를 입체적으로 보이게...
이 함수는 script에서 사용하는 함수가 아니라 datawindow에서 사용하는 함수입니다.
이함수는 focus가 어떤 row에 위치했을때 그 row number를 넘겨줍니다.
이번팁은 currentrow를 이용해서 현재의 row를 선택했을때 3d효과를 보여주게 만들어주는 것입니다.
우린 현재 row를 선택할때 datawindow의 rowfocuschanged event에
dw_1.SelectRow(0, False)
dw_1.SelectRow(currentrow,True)
를 써서 파란색 바를 나타나게 하죠~
아니면
dw_1.SetRowFocusIndicator(Hand!)
를 사용해서 손가락 모양으로 현재의 row를 나타나게 하든지...
3D효과를 한번 나타나게 해보자구요~ 자 DataWindow로 가보세요~ 그리고 칼럼을 선택했죠?
좀 귀찮긴 하지만 각각의 칼럼위에 TEXT OBJECT를 하나씩 가져다 놔야해요.
물론 TEXT는 없게 하구요.
그리고 각 칼럼의 위에 있는 TEXT OBJEC의 BORDER TYPE을 3D-Raised로 만들구요..
그리고 각각의 text object의 property에서 expresstions tab으로 들어갑니다.
visible 항목이 보이죠? 그 항목에 If(CurrentRow( ) = GetRow( ), 1, 0)
라고 적습니다.
───────────────────────────────────────


datawindow----->html table로
datawindow를 html(hyper text makeup language) table형식으로
파워빌더 5.0에서는 기존에 4.0 까지 지원되지 않았던 html포멧이 지원되죠.
우린 기존에 excel이나 txt형식으로는 export를 많이 했었죠.
하지만 html format이 있는걸 보신분은 많이 없으실거예요.
자 datawidow로 가보세요.
칼럼을 선택하고 preview를 하세요.
File menu의 save rows as..를 선택하시구~
file 형식을 HTML Table을 선택하시구 이름을 주세요~
그럼...xxxx.html이라는 화일이 생성이 됩니다.
그리구 웹브라우저에서 이 화일을 열어보시면..
데이타들이 html의 테이블로 구성이 되어 나옵니다~~!
───────────────────────────────────────



유도라를 이용한 email 전송
유도라는 인터넷에서 email을 받고 보내는 가장 보편적인 프로그램이지요.
유도라 pro2.2를 가지고 설명합니다.
먼저 유도라의 옵션을 다음과 같이 맞춰놔야 합니다.
옵션에서 왼쪽의 MAPI를 선택하고 "Use Eudora MAPI Server"에서 "Always"를 선택.
메시지를 전송하는 함수는 다음과 같습니다.
매개변수:a_s_recipient, a_s_subject, a_s_notetext.
리턴값 : boolean (함수성공여부)
mailSession m_mail_session
mailReturnCode m
mailMessage m_message
m_mail_session = CREATE mailSession
m = m_mail_session.MailLogon()
IF m <> mailReturnSuccess! THEN
DESTROY m_mail_session
MessageBox('Mail', 'Could not connect to the mail program. Make sure the mail program is
running.', StopSign!)
return FALSE
END IF
// Populate the mailMessage structure
m_message.Recipient[1].name = a_s_recipient
m_message.Subject = a_s_subject
m_message.NoteText = a_s_notetext
// create the mail message
m = m_mail_session.mailSend(m_message)
IF m <> mailReturnSuccess! THEN
m_mail_session.MailLogoff()
DESTROY m_mail_session
MessageBox('Mail', 'There was an error sending the mail message.', StopSign!)
return FALSE
END IF
m_mail_session.MailLogoff()
DESTROY m_mail_session
return TRUE // success
───────────────────────────────────────



More Speed From Oracle
More Speed From Oracle
SQL문장을 Oracle에 보낼때 파빌은 모든 변수값을 다음과같이 치환시킨다.
String ls_Ken = "Ken%"
SELECT * FROM employee WHERE name LIKE :ls_Ken;
변수값 치환
SELECT * FROM employee WHERE name LIKE 'Ken%';
Oracle로 보낸다.
SQL이 Oracle에서 실행될때 몇가지 단계를 거치게되는데 그중 한 단계가 explain plan 단계다.
oracle parses가 SQL을 분석하여 최적의 검색경로를 찾는 과정으로써 SQL실생시간의 약 25%를 차지한
다.
oracle은 보다 빠른 수행속도를 얻기위해 cache를 갖고있다. 즉 똑같은 SQL 질의가 있을경우 SQL
parse와 explain plan설정의 과정을 생략하고 cache에 있는 내용을 재사용하게 된다. 따라서 똑같은
SQL문장을 사용할경우 25%의 수행속도 상승효과를 볼 수 있다.
하지만 똑같은 SQL문장이라 할지라도 ls_ken의 내용이 다를경우 oracle은 같은 SQL문장으로 인식하지
않는다. 따라서 Explain plan을 산출하는 과정을 거치게 된다.
Explain plan과정을 생략하고자 한다면...즉 binding되는 변수가 일정하다
면 변수의 값을 SQL문장에 치환시키지말고 변수관련 정보를 Oracle에 보내도록한다. 이럴경우 변수의
값이 다를지라도 oracle은 cache에 있는 Explain plan을 재사용하게된다.
파빌이 변수치환과정을 거치지 않게 하기위한 방법은 pb.ini내용에 다음 문장을 추가하면된다.
StaticBind = 0
또는
StaticBind = 'No'
Script에서 기술할경우
SQLCA.dbParm = "StaticBind = 0"
또는
SQLCA.dbParm = "StaticBind = 'No'"
이렇게 하면 파워빌더는 변수값까지 치환한 SQL문장을 만들지 않고 binding변수 정보를 oracle에 보
내게 된다. 그렇게 함으로써 cache에 있는 Explain plan정보 재사용율을 높일 수 있다.
───────────────────────────────────────



title로 sort를
datawindow를 만들면 COLUME NAME은 있지만 칼럼의 HEADER부분에 그칼럼의
LABEL들은 이름이 없죠.
DEFAULT로 <NO NAME>이렇게 잡혀 있어요.
그부분에 COL_TEXT_1, COL_TEXT_2,COL_TEXT_3이라고 이름을 주겠습니다.
그리고 dw_1의 click event에 다음과 같이 적어보세요~
CHOOSE CASE dwo.name
CASE "col_text_1"
dw_1.SetSort("col_1 A")
dw_1.Sort()
CASE "col_text_2"
dw_1.SetSort("col_2 A")
dw_1.Sort()
CASE "col_text_3"
dw_1.SetSort("col_3 A")
dw_1.Sort()
END CHOOSE
그러면 header부분을 눌렀을때..선택된 칼럼을 키값으로 sort가 되겠죠?
저는 microhelp를 적용했지요. 어떤내용의 칼럼인지를 설명했어요~
CHOOSE CASE dwo.name
CASE "col_text_1"
w_mdi.SetMicroHelp("c = a + b")
CASE "col_text_2"
w_mdi.SetMicroHelp("d = a / b")
CASE "col_text_3"
w_mdi.SetMicroHelp("d = a * b")
CASE ELSE
w_mdi.SetMicroHelp(" ")
END CHOOSE
───────────────────────────────────────



누적치 구하기
DataWindow에서 우리가 어떤 값의 누적치를 구하고 싶을때 간단하게 함수 하나만 사용을 해주면 됩니
다.
어떤것이냐..바로 CumulativeSum입니다.
다음과 같은 레포트로 출력을 하고 싶습니다.
Quantity Running Total
5,000 5,000
2,500 7,500
3,000 10,500
12,000 22,500
제가 구하고 싶은것은 quantity의 running total이죠.
그럼 running total은 다음과 같은 컴퓨트 필드를 하나 만들어보세요.
cumulativeSum( quantity for all )
───────────────────────────────────────



하나의 윈도우를 여러번 오픈~!...
이번팁은 하나의 윈도우를 여러개처럼 사용하기 위한 것입니다.
같은 스타일의 윈도우는 하나만 만들면 여러번 오픈할수 있습니다.
그만큼..어플리케이션의 부피도 줄일수 있는거죠.
w_comm_sheet란 윈도우를 하나 만들어 봅시다~. 윈도우의 스타일은 그냥 main윈도우로 하면 되구요.
//w_mdi의 m_mdi.new 메뉴의 script
w_comm_sheetlw_sheet //이부분이 하나의 윈도우를 여러개처럼
사용하기 위해 선언하는 부분이다.
OpenSheet (lw_sheet, w_main, 0, layered!)
이랬을때 new메뉴를 선택하면 같은 윈도우가 여러개 열리게 됩니다~
자 이렇게 된경우엔 너무 밋밋하죠.
윈도우의 title에 serial number를 준다면 조금 세련되어 보일라나?
//w_comm_sheet의 open event에 다음과 같이 써보세요~
Window lw_count_sheet
Integerli_count
lw_count_sheet = w_main.GetFirstSheet ()
If IsValid (lw_count_sheet) Then
Do
li_count += 1
lw_count_sheet = w_main.GetNextSheet (lw_count_sheet)
Loop While IsValid (lw_count_sheet)
End If
This.Title = "Sheet #" + String(li_count)
───────────────────────────────────────



여러 Display value를 갖는 DDDW...
DropDownDataWindow(DDDW)를 사용하면 코드의 입력시 편하긴 한데...
코드와 코드명을 동시에 보여줄려고 하면 dddw로는 불가능해 보이죠.
하지만 dddw로 가능합니다. 다음과 같이.....
dddw로 사용하려는 datawindow design시에 보여주려는 두개의 필드를
compute field로 만드는 겁니다. 정말 간단하죠.
───────────────────────────────────────



pb5.0에서 toolbar의 disable
파워빌더 5.0에서 사용중에
갑자기 툴바중에서 몇개가 disable 되는 현상이 있더군요.
요거때문에 파워빌더 죽이고 다시실행시키지 마시고 툴바에서 오른쪽마우스 클릭을 해서 나오는 메뉴
에서 customize을 선택하면 오픈되는 customize 윈도우에서 custom 선택하고 OK버튼을 클릭.
───────────────────────────────────────



DataWindow, refer to data
DataWindow에 product_id라는 column이 있다.
product_id값을 검사하여 product_id값이 변경되면 글자색도 변경하고자 한다.
이런 경우 현재 row의 product_id값과 다음 row의 product_id값을 비교할 수
있다면 간단해진다.
DataWindow에서 각각의 column은 마치 배열처럼 취급할 수 있다.
즉 row는 column의 첨자라고 볼 수 있다.
이러한 특징은 script 작성시에 많이 느낄 수 있을 것이다.
그러나 DataWindow field에선 좀 다르다.
현재 row는 0이고 그 다음 row는 -1, -2, -3으로 나간다.
그 전 row는 1,2,3,4.. 가 된다.
따라서 위의 문제가 아주 간단히 해결된다.
if ( product_id = product_id[-1], rgb(0, 0, 0), rgb(255, 0, 0) )
이러한 식을 product_id 의 color property에 기술하면 간단히 해결된다.
- http://www.magicnet.net/purepower/puretips/index.html -
───────────────────────────────────────



DDDW Trick
Parent DataWindow가 retrieve되는 시점에 DropDown DataWindow(dddw)의 모든 내용이 retrieve된다.
어떤 사람이 parent datawindow의 clicked event에서 dddw.retrieve()를 하면된다는 그러한 솔루션을
제공한적이 있었다.그것이 틀리다고 볼수는 없다.
하지만 문제가 있다.
clicked event는 user가 dropdown 화살표를 click하던 일반 text column을 click하던간에 event가 발
생된다는 것이다. 만일 click하는 지점이 일반문자(dddw의 화살표 옆에 있는 문자말고...)라면
program은 dddw.retrieve()하지말아야 한다. 따라서 그 방법은 이들간의 click 지점이 어딘지를 구분
해야하는 script가 필요하다.
GetObjectAtPointer()와 GetClickedColumn()함수는 dddw가 click되어졌는지 아닌지를 알려주진 못한
다.
따라서 몇가지 내부적인 Hacking에 의해 올바른 event는 pbm_dwndropdown이라는 결론에 이르게 되었
다.
그래서 solution은 다음과 같다.
user event ue_dddw_dropdown을 만들자(pbm_dwndropdown을 mapping)
그리고 다음과 같은 script를 작성한다.
1) DataWindowChild dwc
dwGetChild(GetColumnName(), dwc)
dwc.SetTransObject(SQLCA)
dwc.retrieve()
위의 것은 기본적인 기능을 구현한 것이고 다음은 여러 개선사항을 첨가한 예다.
2) dwGetChild(GetColumnName(), dwc)
// 만약 dwc.rowcount()>1 이라면 그러면 dddw는 이미 한번
// drop down했다는 것이다. 따라서 귀찮게 다시 retrieve() 할필요없다.
// 또하나 주의할것이 있다. dddw는 하나의 단일 row 즉 blank인
// 단일 row를 기본적으로 갖는다.
if dwc.rowcount() > 1 then return
dwc.SetTransObject(SQLCA)
dwc.retrieve()
3) ... // same as that in (1).
dwc.retrieve(GetText())
dddw의 SQL문장:
select country_name from contry_lookup
where country_name like :retrieve_argument + "%"
위의 것은 만약 user가 'ca'를 입력해서 dropdown 화살표를 click하면 국가이름 의 목록이 아주 보기
좋게 drop down될것이다.
cambodia
cameroon
canada
하지만 france나 sussia같은 국가명은 retrieve되지 않는다. 왜냐하면 SQL문장의 like구문에 의해 ca
로 시작하는 것만 retrieve하기 때문이다.
이건 retrieve량을 줄이게되어 메모리 절약등의 효과도 있게된다.
그런데 만일 dddw가 employee_name이고 department field가 있다고 생각한다면...
회사의 사원은 상당히 많다 따라서 department에 'Information Service'라고 입력한다. 그리고
employee_name field로 이동하여 dddw의 화살표를 click한면 dddw는 오직 Information Service에서
일하는 사원만을 retrieve하게된다.
... // same as that in (1)
dwc.retrieve(GetItemString(GetRow(), "department"))
dddw의 SQL문장:
select employee_name from employee_table
where department = :retrieve_argument
여기까지의 설명에서 주 요점 사항으로 기억할것은 pbm_dwndropdown event를 이해하고 사용하는 것이
다. 이건 undocumented event다.
───────────────────────────────────────



DW에서 like사용시 null컬럼나오...
table test 의 컬럼이
empno,name,deptname,address,phone
(사번,이름,부서명,주소,전화번호)
라고 할때 datawindow를 디자인할때 주소로 검색할 경우
retrieve argument를 r_address 라고 할때
select empno,name,deptname,address,phone
from test
where address = :r_address;
로 정의한다.
그런데, 전체를 검색하기 위해 r_address 의 값을 '%'로 주었을 경우
address 컬럼이 null인 경우는 가져오지 못한다.
이럴 경우 다음과 같이 한다.
select empno,name,deptname,address,phone
from test
where ((address = :r_address) or (address is null and :r_address = '%'))
───────────────────────────────────────



DW list에서 현재 row의 표시
datawindow로 만든 리스트에서 현재 row를 표시하는 방법은 여러가지가 있지요.
가장 많이 쓰는 방법은 RowFocusChanged 이벤트에서
Selectrow(0,false)
SelectRow(GetRow(),true)
라고 적는 방법이 있죠.
위와 같이 하면 키보드의 위화살표,아래화살표로 리스트를 이동할 때 현재 row가 반전되서 나옵니다.
그런데 dw로 만든 list에서 중복선택할 경우는 현재 row를 표현한다는게 어렵지요.
선택한 row를 반전시켜야 하는데, 현재 row를 반전시킬 수도 없고....
이럴때
dw_employee.SetRowFocusIndicator() 를 사용하는 것입니다.
dw_employee.SetRowFocusIndicator(FocusRect!)라고 미리 정해 놓으면
현재 row는 점선사각형으로 표현되죠. 그리고 선택한 row는 반전시키면 되고.
───────────────────────────────────────



DropDownListBox의 Reset
DropDownListBox 가 처음 선택하지 않은 상태로 하려면?
Allow Editing 이 가능할 경우에는 ddlb_1.text = "" 로 하면 초기화가 되지만
Allow Editing 이 불가능할 경우에는 ddlb_1.text = "" 로 해도 초기화가 되지 않는다.
이럴 경우에는
SelectItem() 함수를 사용한다.
ddlb_1.SelectItem(0) 하면 초기에 선택되지 않은 상태로 초기화 할 수 있다.
───────────────────────────────────────



Powersoft사의 21세기 date
PowerBuilder 5.0과 InfoMaker 5.0이외에도 다음과 같이 Powersoft사가 이전에 발표한 버전의 제품에
서도 21세기를 대비한 Date가 지원된다.
PowerBuilder 3.0 이상의 PowerBuilder 제품 InfoMaker 4.0 이상의 InfoMaker 제품이 PowerBuilder과
동일하게 지원한다. PowerMaker 3.0과 PowerViewer 3.0에서는 PowerBuilder 3.0과 동일하게 Date를
지원한다.
Date형과 DateTime형의 데이터는 입력과 디스플레이 용도의 모든 형식으로 지원되며 Date의 진행도
적확히 파악되어 2000년 이상의 데이터까지도 표현 가능하다.
Date는 PowerBuilder내에서 Format과 Edit Mask 등 , 여러 형식으로 표현할 수 있다. 특히 Date는 MM
, DD , YY를 1에서 4까지의 자릿수를 이용하여 4자리 , 6자리 , 8자리 등의 어떠한 조합으로도 구성
할 수 있다.
이것은 개발자가 어플리케이션에 대해서 사전에 결정해야 할 사항이다.
* 2자리의 년도
년도가 2자리로 표시되면 PowerBuilder와 InfoMaker는 다음과 같이 세기를 선택한다
구간 PowerBuilder와 InfoMaker의 가정
00 과 49사이 첫 두자리를 20으로 가정
50 과 99사이 첫 두자리를 19으로 가정
만일 출생일 등의 1950년 이전의 데이터가 있다면 항상 그것을 4자리의 년도로 정의하여
PowerBuilder와 InfoMaker가 올바르게 인식할 수 있도록 유의해야 한다.
* Date의 유효 범위
PowerBuilder와 InfoMaker는 1000 ~ 3000년의 년도를 지원한다.
* 윤년의 처리
PowerBuilder와 InfoMaker가 윤년에 대해서 사용하는 알고리즘은 다음과 같다
년도는 4로 나뉘어져야 하며 만약 100으로도 나뉘어진다면 400으로도 나뉘어져야 한다.
그러므로 1900년은 윤년이 아니고 2000년은 윤년이다.
* S-Designor의 경우
S-Designor의 경우 Date의 처리는 상관없다.
Date의 형식은 개발자가 Domain과 Data Element를 모두 정의하므로 원하는 형태로 표시된다.
툴에 의해 취급되는 데이터는 없다.
───────────────────────────────────────



Dynamic DW Object and Compile...
DataWindow control 이나 DataStore의 Object을 실행시에 Dynamic하게 변경시킬 수 있다.
이런 프로그램은 실행파일을 만들때 PBR(PowerBuilder Resource) file에 DataWindow Object name을
기술해줘야 한다.
DW Object을 dynamic하게 변동시키면 PowerBuilder에서는 문제없이 잘 실행되지만 실행파일을 만들어
보면 에러가 발생한다.
다음과 같이 dynamic하게 하는 경우는 반드시 PBR file을 작성해야한다.
dw_1.dataobject = 'd_employee_maint'
PBR file이 필요한 이유는 DataWindow object 이름이 인용부호로 둘러싸여 있기 때문에 compiler가
실행파일 만들때 DataWindow object이라고 인식하지 못한다.
따라서 DataWindow Object으로 포함시키지 않게된다.
그렇기 때문에 반드시 PBR file에 다음과 같은 내용을 기술해주어야한다.
employee.pbl(d_employee_maint) PBR file은 매모장같은 곳에서 작성하여 .pbr 확장자로 저장시키면
된다.
그런다음에 실행파일을 만드는 Project painter에서 PBR file 이름을 포함시켜 주면 된다.
───────────────────────────────────────



Change the DW Error Message .....
Change the DW Error Message Title
DataWindow에서 값을 입력하다보면 'DataWinodw Error'라는 Title의 Message Box가 나타납니다.
영어로 쓰여져있고 일반 End User들에게는 생소한 영문이라서 눈에 거슬렸는데 이 title을 원하시는
내용으로 변경하는 방법이 있습니다. DataWindow attribute에는 Message.Title이란 것이 있습니다.
이부분을 수정하면 됩니다.
dw_1.Modify("DataWindow.Mesage.Title = '입력오류'")
───────────────────────────────────────



어플리케이션의 환경
IF env.machinecode THEN //어플리케이션의 실행코드
sle_1.Text = "Machine Code"
ELSE
sle_1.Text = "P-Code"
END IF
st_colors.text =string(env.numberofcolors) //화면의 색상
st_height.text = string(env.screenheight) //화면의 높이
st_width.text = string(env.screenwidth) //화면의 너비
───────────────────────────────────────



파워빌더의 버전은???
/* Declare */
Environment env
INTEGER resp
/* Variable Setting */
resp = GetEnvironment(env) //시스템 환경을 읽어오는 함수
CHOOSE CASE env.pbtype //현재 인스톨된 파워빌더의 type
CASE enterprise!
sle_1.Text = 'Enterprise'
CASE desktop!
sle_1.Text = 'Desktop'
END CHOOSE
IF env.win16 THEN
sle_2.Text = Trim(sle_1.Text) + "/16" + ' ' + STRING(env.pbmajorrevision) + '.' + &
STRING(env.pbminorrevision) + '.' + STRING(env.pbfixesrevision)
ELSE
sle_2.Text = Trim(sle_1.Text) + "/32" + ' ' + STRING(env.pbmajorrevision) + '.' + &
STRING(env.pbminorrevision) + '.' + STRING(env.pbfixesrevision)
END IF
───────────────────────────────────────



시스템환경을 체크해보자(os)
/* Declare */
Environment env
INTEGER resp
/* Variable Setting */
resp = GetEnvironment(env) //시스템 환경을 읽어오는 함수
CHOOSE CASE env.OSType //OS TYPE(파워빌더는 7개 인식)
CASE aix!
sle_1.Text = 'AIX'
CASE hpux!
sle_1.Text = 'HPUX'
CASE macintosh!
sle_1.Text = 'MacIntosh'
CASE osf1!
sle_1.Text = 'OSF1'
CASE sol2!
sle_1.Text = 'Solaris 2'
CASE Windows!
sle_1.Text = 'Windows'
CASE Windowsnt!
sle_1.Text = 'Windows NT'
END CHOOSE
sle_2.Text = Trim(Sle_1.Text) + ' ' + STRING(env.osmajorrevision) + &
'.' + STRING(env.osminorrevision) + &
'.' + STRING(env.osfixesrevision)
───────────────────────────────────────



시스템환경을 체크해보자(cpu)
/* Declare */
Environment env
INTEGER resp
/* Variable Setting */
resp = GetEnvironment(env) //시스템 환경을 읽어오는 함수
CHOOSE CASE env.cputype //CPU의 TYPE(파워빌더는 14개 인식)
CASE alpha!
sle_1.text = 'Alpha'
CASE hppa!
sle_1.text = 'HPPA'
CASE i286!
sle_1.text = '286'
CASE i386!
sle_1.text = '386'
CASE i486!
sle_1.text = '486'
CASE m68000!
sle_1.text = '68000'
CASE m68020!
sle_1.text = '68020'
CASE m68030!
sle_1.text = '68030'
CASE m68040!
sle_1.text = '68040'
CASE mips!
sle_1.text = 'MIPS'
CASE pentium!
sle_1.text = 'Pentium'
CASE powerpc!
sle_1.text = 'PowerPC'
CASE rs6000!
sle_1.text = 'RS6000'
CASE sparc!
sle_1.text = 'Sparc'
END CHOOSE
───────────────────────────────────────



Null 값 핸들링시에
이번 Tip은 DataWindow Painter에서 NULL값을 처리하는 작은 트릭입니다.
일반적으로 '급여:' + String(salary) 라는 computed field를 사용할 수 있겠는데 만약 salary
column의 값이 NULL인 경우 field또한 NULL값을 취하게 되어 아무런 값도 나타나지 않게 됩니다.
때문에 대개의 경우 IF문을 사용하지만 여기서는 String함수를 그대로 이용하는 방법을 소개합니다.
String함수의 mask는 number를 보기좋게 변환시켜주는 역할을 합니다.
mask는 number의 4가지 양태를 각각 지정할 수 있습니다.
즉 음수,양수,0,NULL 각각에 해당하는 mask를 semicolon으로 구분하여 별도로 지정합니다.
생략하는 경우 맨앞에 나타나는 mask로 처리됩니다.
'급여:' + string(salary, "#,##0; ; ; '(unknown)'")
위와같이 computed field를 사용하면 4번째 mask가 NULL인 경우에 적용됩니다.
즉 NULL인경우 '급여:(unknown)'이라고 나타나게 됩니다. 2번째,3번째는 생략되었기 때문에 1번째
mask 적용을 받게 됩니다.
───────────────────────────────────────



파워빌더에서 전화걸기
Declare 밑에
Local External Function에다가 다음과 같이 쓰시고
//////////////////////////////
Function int OpenComm (string lpComName, uint wInQueue, uint wOutQueue) Library "user.exe"
Function int CloseComm (int nCid) Library "user.exe"
Function int WriteComm (int nCid, string lpBuf, int nsize) Library "user.exe"
Function int FlushComm (int nCid, int nQueue) Library "user.exe"
//////////////////////////////
int li_comid
int li_rc
String ls_port // Poer No.
String ls_buffer /* 전화 번호(에를 들어 Pre Dial 이 있다면
9,01410 이런식으로*/
li_comid = OpenComm(ls_port,128,128)
If li_comid < 0 Then
If li_comid = -2 Then
Messagebox("Port: "+ ls_port + " In - Use","Error")
Else
Messagebox("Port: " + ls_port, "Error")
End If
Return -1
End If
Flushcomm(li_comid,0)
Flushcomm(li_comid,1)
li_rc = WriteComm(li_comid, ls_buffer, len(ls_buffer))
MessageBox("Dialing " + Left(ls_buffer,len(ls_buffer) - 2),"Hit Ok to hang up
modem")
CloseComm(li_comid)
return 1
───────────────────────────────────────



내방식대로의 마이크로 헬프 #2...
/* uf_set_clock */
/* scope : public, parameters :없음 return 값 : 없음 */
/************************************************************************/
st_login_time.text = string(gd_logindt, "mm/dd") + " " + string(gd_logindt, "h:mm:ss")
st_clock.text = string(today(), "mm/dd") + " " + string(now(), "h:mm:ss")
/************************************************************************/
/* uf_set_msg */
/* scope : public, parameters :as_msg(string) return 값 : 없음 */
/************************************************************************/
st_msg.text = '' + as_msg
/************************************************************************/
/* window의 Open Event */
/************************************************************************/
//Window의 Open Script
int x,y
uo_msg.uf_init(w_main.true) //user object를 초기화한다.
timer(60) //1분마다 timer를 발생시킨다.
x = this.workspacewidth()
y = this.workspaceheight() - 1
mdi_1.move(1,1) //work space를 초기 위치로 설정한다.
// window의 Timer Event
/*1분마다 user object에 시각을 나타낸다. */
uo_msg.uf_set_clock()
/* scope :public, parameters : s_color('R':Red(에러,데이타가 없음,경고메시지)
/* 'B':Blue(진행중임을 나타내는 메시지)
/* 'N':Black(성공,ok,information..)
/* return 값 : 1:ok, -1 :error or bad arg
/******************************************************************************/
IF len(s_msg) < 1 THEN RETURN -1
CHOOSE CASE s_color
CASE 'R'
w_main.uo_msg.st_msg.textcolor = 255
w_main.uo_msg.uf_set_msg(s_msg)
CASE 'B'
w_main.uo_msg.st_msg.textcolor = 167
w_main.uo_msg.uf_set_msg(s_msg)
CASE 'B'
w_main.uo_msg.st_msg.textcolor = RGB(0,0,0)
w_main.uo_msg.uf_set_msg(s_msg)
CASE ELSE
RETURN -1
END CHOOSE
RETURN 1
───────────────────────────────────────



내방식대로의 마이크로 헬프 #1...
1) userobject내의 instance 변수를 정의한다.
Window iw_parent_window
Integer ii_menu_ht = 0
Boolean ib_show_clock
Integer ii_resizeable_offset
2) userobject용 함수만들고 저장하기
uf_init(window,boolean): 오브젝트가 놓여 있는 윈도우의 open event에서
호출되어야 한다. 첫번째 변수는 윈도우를 등록하고
두번째는 object에 시각을 나타낼 것인지 아닌지를
결정한다.이 함수는 오직 한번만 호출된다.
uf_resize() : 모 윈도우의 Resize Event에서 호출된다. 이것은 모
윈도우의 크기나,바뀔때 나타낼 크기와 위치를 변경한다.
uf_set_clock() : 모 윈도우의 Timer Event 에서 호출된다.
이것은 현재의 시각을 표시한다.
uf_set_msg(string) : Object Bar의 왼쪽부터 해당 메시지를 표시한다.
Null string은 메시지를 지운다.
/************************************************************************/
/* uf_init */
/* scope : public, parameters : aw_win(window), ab_clock_on(boolean) */
/* return값 : 없음 */
/************************************************************************/
iw_parent_window = aw_win
//만약 메뉴가 있다면 메뉴의 크기만큼 보장하기 위해서
IF len(iw_parent_window.menuname) > 0 THEN
ii_menu_ht = 175
ELSE
ii_menu_ht = 98
END IF
//해당 윈도우가 Resize속성일때..
IF aw_win.resizable THEN
ii_resizeable_offset = 0
ELSE
ii_resizeable_offset = 16
END IF
//시각을 표시하기 원하면 초기 시간을 SET한다.
ib_show_clock = ab_clock_on
IF not ib_show_clock THEN
HIDE(st_clock)
ELSE
uf_set_clock()
END IF
//윈도우의 속성에 맞게 크기를 조정한다. 그리고 사용자를 표시한다.
uf_resized()
st_user.text = '' + gs_userid
/************************************************************************/
/* uf_resized */
/* scope : public, parameters :없음 return 값 : 없음 */
/************************************************************************/
//uf_init()함수가 실행되지 않았을때이다.
IF ii_memi_ht = 0 THEN RETURN
//user object 의 크기나 위치를 변경할 때 성능을 위하여 hide시킨다.
Hide(This)
//모 윈도우의 크기대로 user object의 크기를 변경한다.
This.Width = iw_parent_window.Width
//각 Component의 크기를 변경한다.
st_clock.x = iw_parent_window.Width - (st_clock.Width + 38)
st_login_time.x = st_clock.x - (st_login_time.Width + 12)
st_msg.Width = st_login_time.x - (st_msg.x + 12)
//모 윈도우의 맨 하단으로 오브젝트를 이동한다.
Move{(This, 1, iw_parent_window.height - (this.height + ii_menu_ht) + &
ii_resizeable_offset)}
Show(This)
───────────────────────────────────────



MDI frame 작업공간
하나 이상의 컨트롤을 갖는 mdi frame을 custom mdi라고 한다.
MDI frame에 컨트롤을 추가하면 작업 공간을 바꾸어야 한다.
프레임에서 모든 컨트롤들은 일관된 이미지를 주기 위하여 위치와 크기가 정해져야 한다.
따라서 custom MDI frame을만들때는 frame의 resize event에서 mdi_1의 추가된 컨트롤의 위치와 크기
를 바꾸어 준다.
처음 custom MDI frame에서 MDI_1의 높이와 넓이는 0이다. 만약 작업 공간이 없으면 Sheets는 열리지
만 보이지 않으며, 작업 공간보다 Sheet가 더 크면 잘라져 버린다.
다음의 예처럼 마이크로 헬프의 기능을 대체하기 위해 userobject를 만든다고 하면, mdi의 크기가 조
정이 되어야 할 것이다.
1) 먼저 작업공간(mdi_1)의 넓이와 높이를 얻는다.
int li_width, li_height
li_width = w_genapp_frame.WorkSpaceWidth()
li_height = w_genapp_frame.WorkSpaceHeight()
2) 새로 추가한 control을 제외한 새로운 작업 공간(mdi_1)의 크기를 계산한다.
li_height = li_height - (cb_print.y + cb_print.height)
li_height = li_height - MDI_1.MicroHelpHeight
li_height = li_height + WorkSpaceY()
3) 추가한 Control의 위치를 이동시킨다.
mdi_1.Move (WorkSpaceX(), cb_print.y + cb_print.height)
4) 작업 공간(mdi_1)을 변경한다.
mdi_1.Resixe(li_width, li_height)
───────────────────────────────────────



AVI 화일 보기
두개의 API함수를 사용해야 합니다.
micSendStringA()함수, 연주장치에 명령을 내보내는 역할을 합니다.
mdiGetErrorStringA()함수, 처리과정중에 관계된 에러를 보고합니다.
역시 API함수를 사용하기 위해서는 Declare Menu에서 Local External Function을 선언해야 합니다.
Function UINT LoadLibraryA(String as_library) Library "kernel32"
Subroutine FreeLibrary(UINT HInstance) Library "kernel32"
Function Boolean mciGetErrorStringA(long errorStr, ref string buffer,
int wlength) Library "WINMM.dll"
Function Long mciSendStringA(ref string command, ref string returnstring,
int wlength, UINT wcallback) Library "WINMM.dll"
Script는 좀 깁니다.
string ls_command, ls_buffer, ls_file, ls_path, ls_driver
long ll_error
UINT lu_lib
//멀티미디어 Library가 install되어 있는지를 loadlibraryA함수로 확인 합니다.
IF lu_lib <> 0 Then
MessageBox("오류",'멀티미디어 디바이스 라이브러리가 없습니다.', StopSign!)
Else
FreeLibrary(lu_lib)
//AVIVideo device에 대한 registry를 찾는다 RegistryGet()함수가 0을
//return하면 video playback device를 갖고 있는것이고 -1을 return
//하면 컴퓨터에 비디오 실행을 위한 장치가 구성되어 있지 않다는 의미.
ls_buffer = "HKEY_LOCAL_MACHINE₩System₩CurrentControlSet₩Control" + &
"₩MediaResources₩MCI₩AVIVideo"
ll_error = RegistryGet(ls_buffer,"Driver",ls_driver
IF ll_error = -1 Then
MessageBox('오류','설치된 비디오 드라이브가 없습니다.', StopSign!)
Else
//device를 open하기 위해 command string을 작성한다.
//open하기 위한 file과 AVIVedeo Type, alias를 지정한다.
//alias는 후에 멀티미디어 함수 호출때 사용하기 위한것이므로 아무
//렇게나 주어도 상관없다.
ls_buffer = Fill(char(0),255)
ls_command = "open music.avi type avivideo alias cartoon"
ll_error = mciSendStringA(ls_command, ls_buffer, 255, &
Handle(Parent))
//device를 open하는 동안 Error가 발생하였으면 ErrorMessage를 얻어서 보여준다.
//정상적으로 open되면 mcisendStringA()함수에게 alias를 사용해서 file을 실행하라고 알려준다.
If ll_error <> 0 Then
mciGetErrorStringA(ll_error, ls_buffer, 255)
MessageBox('오류', ls_buffer)
Else
//연주가 끝났는지를 확인하기 위해서 Yield()함수를 사용한다.
Yield()
ls_command = 'play cartoon notify'
mciSendStringA(ls_command, ls_buffer,255, &
Handle(Parent))
Yield()
End If
End If
End If
window에서 pbm_mmmcinotify event ID를 이용 User Event를 만듭니다.
비디오 파일의 연주가 끝나면 이 이벤트가 구동하게 됩니다.
stript는...
String ls_command, ls_buffer
//device를 닫는다.
ls_command = 'close cartoon'
mciSendStringA(ls_command, ls_buffer, 255, Handle(this))
Yield()
───────────────────────────────────────



WAV 화일 불러오기
waveform audio file을 연주하기 위해선 API함수를 사용해야 합니다.
이 함수는 SndPlaySoundA()함수입니다.
두개의 Parameter를 취하는데 하나는 .WAV file name 또하나는 연주하는 방법.
먼저 API함수를 사용하기 위해서는 Declare Menu에서 Local External Function을 선언해야 합니다.
Function Boolean sndPlaySoundA(String s_file, UINT u_flags) Library "WINMM.dll"
Function UINT LoadLibraryA(String as_library) Library "kernel32"
Subroutine FreeLibrary(UINT HInstance) Library "kernel32"
위에서 LoadLibraryA()함수는 멀티미디어 Library가 있는지 확인하는 함수. 그런다음
sndPlaySoundA()함수로 .WAV file을 전달한다. 연주가 끝난후에 메모리를 해제하기 위해서
FreeLibrary()함수가 호출된다.
다음의 예제 소스를 f_play라는 함수로 만들어 필요시에 사용하면 편리합니다.
return value는 None이고 Access 속성은 Public입니다.
UINT lu_instance
lu_instance = LoadLibraryA("WINMM.dll")
IF lu_instance = 0 THEN
sndPlaySoundA(as_wave, 0)
FreeLibrry(lu_instance)
END IF
return
위의 함수사용은 아주 간단합니다.
as_wave는 Argument로 받는겁니다.
즉 f_play("sound.wav")하면 됩니다.
sndPlaySoundA()함수에서 .WAV file을 지정할때 Path에 들어있는 file 이어야 합니다.
그렇지 않으면 Directory도 지정해주어야 합니다.
두번째 Argument는 여러가지가 있습니다.
SND_SYNC 0 sound를 연주하고 return되기 전에 종료한다.
SND_ASYNC 1 sound를 연주하고 연주하는중에 return한다.
SND_NODEFAULT 2 WAV fiel이 발견되지 않았다면 default sound가 연주되지 않는다.
SND_MEMORY 4 file name이 memory안에 있는 image를 가리키고 있다.
SND_LOOP 8 SndPlaySound가 file name에 대해 NULL값을 가지고 호출될 때까지 연주한다.
SND_NOSTOP 16 현재 sound가 연주중이면 FALSE를 return한다.
지정한 sound file이 발견되지 않으면 함수는 소리를 연주하지 않고 FALSE를 return합니다.
SND_NOSTOP Argument가 지정되어 있고 또 다른 Sound가 현재 연주중인 경우에도 FALSE가 return됩니
다.
───────────────────────────────────────



MultiLineEdit에서의 텝키사용
MultiLineEdit에서 입력중에 Tab key를 누르면 tab order 순서에 따라 focus가 이동된다.
이때 발생하는 event는 pbm_keydown 또는 pbm_dnwkey인데 이들 event를 직접 가로채서 MultiLineEdit
에 tab문자나 Spaces문자를 입력하게 하는것은 힘들다.
하지만 Tab key에의한 Focus이동을 허용하지 않고 Tab문자나 Spaces문자를 MultiLineEdit에 입력하게
하고자 한다면 MultiLineEdit의 LoseFocus Event에서 Tab Key가 눌려졌는지를 KeyPress()함수를 이용
해서 처리할 수 있다.
Tab Key가 눌려졌다면 원하는 문자를 입력하고 나서 User Event를 Post시켜서 focus를 SetFocus()함
수를 사용해서 다시 MultiLineEdit로 돌려놓는다.
LostFocus Event
IF KeyDown(KeyTab!) THEN
this.ReplaceText(" ")
this.PostEvent("ue_setfocus")
END IF
───────────────────────────────────────



OpenWithParm
OpenWithParm을 사용하면 Open되는 Window로 필요한 parameter를 넘겨줄 수 있다.
하지만 PB에선 하나의 변수만 넘길 수 있다.(여러개를 넘길때는 structure를 사용하세용~~)
예를 들어서 OpenWithParm(w_abc,"hello"))은 PB의 global 변수인
Message.StringParm에 저장되어 전달된다.
OpenWithParm(w_abc, 34)하면 Global 변수인 Message.DoubleParm에 저장되어 전달된다.
그밖에 다른 Type의 값들인 경우는 MessagePowerObjectParm에 저장되어 전달된다.
그럼 하나이상의 값을 어떻게 전달할 수 있는가... 그건 structure object을 사용하면 된다.
structure object에 unbounded array를 정의하면 필요한 갯수만큼을 전달할 수 있다
unbounded array는 실행시에 배열의 크기를 결정하는 형식이므로 얼마든지 많은 값을 전달할 수 있
다.
structure painter에서 'Variable Name'을 s[]로하고 'Type'을 string으로 한다.
그럼 배열 s[]는 string을 저장할 수 있다.
계속해서 필요한 여러 Type의 배열을 정의해준다.
예를 들어서 double type의 d[], boolean type의 b[], datetime type의 dt[] 등으로 같은 structure
안에 각각을 정의한다.
structure 이름을 str_parms로 한다면 아래와 같이 활용할 수 있다.
//Script에서 정의한 str_parms type의 structure 변수를 선언한다.
str_parms l_str_parms
//전달하고자 하는 값을 Type에 맞는 structure의 member에 치환시킨다.
l_str_parms.s[1] = "Smith"
l_str_parms.s[2] = s_company_name
OpenWithParm(w_abc, l_str_parms)
//w_abc의 Open event
//앞전의 script에서 보낸 structure가 전역변수인
//Message.PowerObjectParm에 저장되어 있다.
str_parms l_str_parms
l_str_parms = Message.PowerObjectParm
//여기서 전달받은 structure의 각각의 값을 사용한다.
//(ex. l_str_parms.s[1], etc.)
위와같은 방식은 CloseWithReturn 함수에서도 똑같이 적용된다.
───────────────────────────────────────



Window를 항상 Top위치에
Window가 다른 Window들 보다 항상 Top에 있어야할 필요가 있는 경우가 있다.
Win3.1에서의 시계가 Option으로 항상 위에 있게 할 수 있게 되어있었다.
PowerBuilder에서는 이것을 아주 간단히 구현할 수 있도록 SetPosition() method로써 제공하고있다.
SetPosition()에 사용되는 argument로서 TopMost!와 NoTopMost!가 있다.
이밖에 Behind!, ToTop!, ToBottom!이 있다.
winobj.SetPosition(TopMost!)로 하면 Window는 항상 Top위치에 있게 된다.
이를 해제할려면 winobj.SetPosition(NoTopMost!)로 하면 된다.
이밖에 ToTop!은 Window들 중에서 가장 높은 Top위치로 올리는 것이고,
ToBottom!은 Window들 중에서 가장 낮은 Bottom위치로 내리는 것이다.
Behind!를 사용할때는 Argument가 더 추가되어서 여러 Window들 중에서 몇번째 위치로 올려놓을 것인
지를 지정해주어야 된다.
SetPosition() Method는 Window Object뿐만 아니라 Window에 있는 다양한 Object에도 적용가능하다.
예를 들어서 겹쳐있는 DataWindow의 위치를 변화시켜줄 필요가 있는 경우에도 사용할 수 있다.
───────────────────────────────────────



시리얼 통신
Serila comunications: a 32bit modem dialer
Win3.x에서 16bit PowerBuilder로 communication ports를 사용하는 것은 간단하다.
하지만 Win95/NT에서는 좀 어려운 작업이 필요하다.
왜냐하면 이들 OS는 communication port를 다른 방식으로 사용하기 때문이다.
즉 port를 file처럼 사용한다.
게다가 Win32 API 함수를 사용해야 한다.
또한 communication port file은 특별한 file이기 때문에 매우 특별한 방법으로
사용해야 한다.
먼저 Win32 API 함수가 필요하다.
/* To create a file */
function long CreateFileA(
ref string lpszName,
long fdwAccess,
long fdwShareMode,
long lpsa,
long fdwCreate,
long fdwAttrsAndFlags,
long hTemplateFile ) library "kernel32.dll"
/* to write to the file */
function boolean WriteFile(
long hFile,
ref string lpBuffer,
long nNumberOfBytesToWrite,
ref long lpNumberOfBytesWritten,
st_overlapped lpOverlapped ) library "kernel32.dll"
/* To close the file */
function long GetLastError() library "kernel32.dll"
/* To get error information */
function boolean CloseHandle(long hObject ) library "kernel32.dll"
위 4개의 API함수 ProtoType을 PowerBuilder에서 Global External Fucntions
정의하는 곳에 기술하면 된다. 그럼 Script에서 참조할 수 있다.
st_overlapped는 communication port로 쓰기를 시도할때 사용하는 structure다.
이것을 PB에서 정의한다.
$PBExportHeader$st_overlapped.srs
global type st_overlapped from structure
long Internal
long Internalhigh
long offset
long offsethigh
long hevent
end type
다음 예는 모뎀이 어떻게 전화를 거는지를 보여준다.
그외의 자세한 사항은 Win32 API HelpFile에 설명되어있다.
PowerBuilder에 있는 Watcom C++ compile에 보면 Helpfile이 있다.
/* declare the needed variables */
long ll_comid
long lnull
st_overlapped lst_overlapped
long ll_written
string ls_Port
string ls_Number
string ls_CRLF = "~r~n"
/* some constant, see helpfile for more information */
long GENERAL_WRITE = 1073741824
long SHARE_MODE = 0
long OPEN_EXISTING = 3
long FILE_FLAG_OVERLAPPED = 1073741824
/* port and number to dial */
ls_Port = "COM2"
ls_Number = "ATDT 0306090146" + ls_CRLF
setnull(lnull)
/* open the port by creating the 'file' */
ll_Comid = CreateFileA(ls_port,GENERAL_WRITE,SHARE_MODE,lnull, &
OPEN_EXISTING,FILE_FLAG_OVERLAPPED,lnull)
IF ll_ComId >= 0 THEN
/* write the number to the port */
writefile(ll_ComId, ls_Number,len( ls_Number),ll_written, lst_overlapped)
messagebox("Yo!","Press Enter To Disconnect")
writefile(ll_ComId, ls_CRLF,len(ls_CRLF),ll_written, lst_overlapped)
ELSE
/* display error */
messagebox(string(ll_Comid),getlasterror())
END IF
/* close always */
closehandle(ll_ComId)
───────────────────────────────────────



칼럼이름 저장하기
Looping through DataWindow Objects
DataWindow에 있는 Column의 이름을 저장하는 방법입니다.
String ls_string[]
int i
any ll_count
ll_count = dw_1.Object.Datawindow.Column.count
For i = 1 to integer(ll_count)
ls_string[i] = dw_1.Describe("#"+String(i)+".Name")
Next
이렇게하면 ls_string에 Column 이름이 들어가게 되죠.
"#"+String(i)+".Name"을 잘 보세요.
Modify함수나 Describe함수에서 #1,#2 등은 Column을 의미합니다.
즉 DataWindow에서 Table의 Column을 선택할때 상단의 selection list 에 나오는 column의 순서를 #1
등으로 표시하는 겁니다.
그럼 #1은 dwobject과 같은 type을 갖게 됩니다.
따라서 dwobject.name처럼 사용하면되죠.
DataWindow의 Itemchanged event에서 사용하는 dwobject처럼 사용하는 겁니다.
───────────────────────────────────────



Selected Rows
DataWindow에서 SelectRow함수를 이용하면 DropDownListBox처럼 Row를 마우스로 선택하는 효과를 얻
을 수 있다. 또한 동시에 여러개의 Row를 선택할 수 있다.
이건 DataWindow를 DropDownListBox처럼 사용할 수 있다.
이런 SelectRow함수는 DataWindow의 RowFocusChanged 또는 Clicked Event에 주로 기술한다.
또한 SelectRow함수로 선택된 Row의 색깔은 파란색으로 반전 된다. 이렇게 사용자가 선택한 Row가 몇
개나 되는지 또한 선택된 Row의 특정 Column의 값을 얻고자 한다면 흔히들 GetSelectedRow함수를 사
용해서 loop
를 돌리게 된다.
하지만 loop대신 한줄로 해결할 수 있다.
long dept_id[]
dept_id = dw_1.object.dept_id.selected
하면 column dept_id의 값이 dept_id라는 배열에 모두 저장된다.
배열의 DataType은 column의 DataType과 일치하게 선언하면 된다.
즉 선택된 Row의 dept_id라는 column의 값이 dept_id라는 배열에 치환된다.
───────────────────────────────────────



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
───────────────────────────────────────



문자를 반짝이게(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을 줘야 한다.
───────────────────────────────────────



자동 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()
───────────────────────────────────────



SetMicroHelp
마우스를 어떤 control위로 이동시키면 microhelp message가 뿌려지는 프로그램을 본 일이 있을것이
다.
이걸 파빌에서 구현하기 위한 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에 등록된다.
───────────────────────────────────────



pbm_syscommand Event
파빌 프로그래밍을 하다보면 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
───────────────────────────────────────



Path 지정
파빌로 만든 프로그램을 설치할때 필요한 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₩Powersoft Shared;c:₩SQLANY50₩win32'하면 Windows는 실
행파일에 필요한 내용을 찾을 수 있게된다.
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)
Update된 특정 Row의 칼럼만 다시 Retrieve 하기
간단하다. Reselectrow() 함수를 사용하면 됨.
보통 모든 칼럼대비 10% 미만의 변화가 있을때 사용함이 유용하며 그 이상일때는 완
전한 Retrieve() 함수의 사용이 보다 빠르다.
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를 사용하는게
속편하고 행복한(?) 방법이다.

'Power Builder*' 카테고리의 다른 글

Window에서 SQL문 사용하기  (0) 2008.11.20
PB Function  (0) 2008.11.12
데이터윈도우 함수  (0) 2008.11.11
네이밍 규칙  (0) 2008.11.11
Power Builder 8로 마이그레이션 (pbl파일 열기)  (0) 2008.10.31
Posted by 회사원Z
:
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지

'Power Builder*' 카테고리의 다른 글

PB Function  (0) 2008.11.12
파워빌더 팁  (0) 2008.11.11
네이밍 규칙  (0) 2008.11.11
Power Builder 8로 마이그레이션 (pbl파일 열기)  (0) 2008.10.31
파워빌더 8.0(7.0) 배포목록  (0) 2008.10.28
Posted by 회사원Z
:

네이밍 규칙

2008. 11. 11. 09:10

클래스

Prefix

예제

Application

(none)

pbdelta

CheckBox

cbx

cbx_ec

Command Button

cb

cb_close

Connection

cn

cn_known

Context Information

cxinfo

cxinfo_ec

Context Keyword

cxk

cxk_ic

Custom Visual Object

c

c_gradient

Datastore

ds

ds_stockreport

Datawindow Control

dw

dw_ec

Datawindow Object

d

d_stockreport

Drop Down List Box

ddlb

ddlb_states

Drop Down Picture List Box

ddplb

ddplb_stateswithflags

Dynamic Description Area

dda

dda_ec

Dynamic Staging Area

dsa

dsa_ic

Edit Mask

em

em_phonenumber

Error

err

err_ec

Function

f

f_calculatetotal

Graph

gr

gr_sales

Group Box

gb

gb_flashing

Horizontal Scroll Bar

hsb

hsb_ec

Inet

in

in_ic

Inet Result

ir

ir_pbdrresults

List Box

lb

lb_ic

List View

lv

lv_files

Mail Session

ms

ms_spencer

Menu

m

m_ec

Message

msg

msg_inabottle

Multi Line Edit

mle

mle_notepad

Non Visual Object

nc

nc_ec_list

Non Visual Object Autoinstantiate

nca

nca_string

Ole Control

oc

oc_bull

Ole Object

oo

oo_spooky

Ole Storage

ostg

ostg_ec

Ole Stream

ostm

ostm_ic

Picture

p

p_ec

Picture Button

pb

pb_delta

Picture List Box

plb

plb_ic

Pipeline Control

plc

plc_pump

Pipeline Object

pl

pl_oilandgas

Profiling

pr

pr_face

Query

q

q_bigselect

Radio Button

rb

rb_male

Rich Text Edit

rte

rte_colourcode

Service

srv

srv_charge

Single Line Edit

sle

sle_autoselect

Static Text

st

st_blink

Structure

s

s_tallbuilding

Tab

tab

tab_folder

Timing

tmg

tmg_clock

Trace Tree

trt

trt_oak

Transaction

tr

tr_ec

Transport

tp

tp_ic

Tree View

tv

tv_directory  

Vertical Scroll Bar

vsb

vsb_Percentage

Window

w

w_ic


'Power Builder*' 카테고리의 다른 글

파워빌더 팁  (0) 2008.11.11
데이터윈도우 함수  (0) 2008.11.11
Power Builder 8로 마이그레이션 (pbl파일 열기)  (0) 2008.10.31
파워빌더 8.0(7.0) 배포목록  (0) 2008.10.28
DataWindow 를 PDF 로 저장하기  (0) 2008.10.28
Posted by 회사원Z
:

1. Workspace를 새로 만든다.
2. Target에서 Existing Application를 선택하면 탐색기창이 뜨는데 이곳에서 마이그레이션할 PBL의 어플리케이션을 선택
3. 라이브러리 리스트에 이전에 선택된 PBL을 라이브러리에 포함
4. 마이그레이션이 완료되면 Workspace 안에 새로운 Target과 PBL리스트를 볼 수 있다.

'Power Builder*' 카테고리의 다른 글

데이터윈도우 함수  (0) 2008.11.11
네이밍 규칙  (0) 2008.11.11
파워빌더 8.0(7.0) 배포목록  (0) 2008.10.28
DataWindow 를 PDF 로 저장하기  (0) 2008.10.28
파워빌더 함수정리  (0) 2008.10.28
Posted by 회사원Z
:


다음은 파워빌더 8로 구현된 애플리케이션을 배포할 때 필요한 런타임 파일 목록입니다.
배포할 때 개발자는 애플리케이션 구동에 필요한 파일들만을 설치해주면 됩니다.
예를 들어 PBVM80.DLL이나 LIBJCC.DLL은 배포되는 모든 애플리케이션에 필요하지만,
PBRTC80.DLL은 리치텍스트 컨트롤이나 리치텍스트 데이터윈도우를 사용하는
애플리케이션에만 인스톨해 주면 됩니다.

파일명        해당 조건
---------------------------------------------------------
PBVM80.DLL    All
LIBJCC.DLL    All
PBDWE80.DLL   DataWindows and DataStores
PBRTC80.DLL   Rich Text
PBFNT80.INI   Mapping unavailable fonts
PBLAB80.INI   Label DataWindow presentation style predefined formats
PBTRA80.DLL   Database connection tracing

설치된 경로 > C:\Program Files\Sybase\Shared\PowerBuilder
설치될 경로 > 설치할 프로그램 폴더, System Path 또는 Path가 지정된 특정 폴더

 

 

다음은 파워빌더 8이 제공하는 자체 데이터베이스 드라이버의 목록 입니다.
처음 두 자리는 PB로 시작되고 다음 세 자리는 데이터베이스 구분입니다.
그리고 나머지 두 자리는 파워빌더 버전을 나타냅니다.

파일명        해당 조건
---------------------------------------------------------
PBIN780.DLL   INFORMIX I-Net 7
PBIN980.DLL   INFORMIX I-Net 9
PBMSS80.DLL   Microsoft SQL Server 6 and 7
PBO7380.DLL   Oracle 7.3
PBO8480.DLL   Oracle 8.0.x and Oracle8i 8.1.x
PBDIR80.DLL   Sybase DirectConnect
PBSYC80.DLL   Sybase Adaptive Server Enterprise CT-LIB
PBSYJ80.DLL   Sybase Adaptive Server Enterprise CT-LIB for EAServer deployment only

설치된 경로 > C:\Program Files\Sybase\Shared\PowerBuilder
설치될 경로 > 설치할 프로그램 폴더, System Path 또는 Path가 지정된 특정 폴더

 

<파워빌더 ODBC 인터페이스>

다음은 파워빌더7.0과 인포메이커 애플리케이션이, ODBC를 사용하여 데이터베이스에
접속하고자 할 때 필요한 파일 목록입니다.

파일명        설명
---------------------------------------------------------
PBODB80.DLL   PowerBuilder ODBC interface
PBODB80.INI   PowerBuilder ODBC initialization file

설치된 경로 > C:\Program Files\Sybase\Shared\PowerBuilder
설치될 경로 > 설치할 프로그램 폴더, System Path 또는 Path가 지정된 특정 폴더
             INI파일과 DLL파일은 반드시 같은 디렉토리에 위치해야 합니다.

 

<마이크로소프트 ODBC 파일>

개발된 애플리케이션이 ODBC를 이용하여, 데이터베이스에 접속할 경우,
다음의 마이크로소프트 ODBC 3.5파일들이 필요합니다.
보통 윈도우 설치시 함께 설치되어 있습니다.
다시 설치할 필요가 있으면 설치 CD 안에 Support 폴더에 있는 MDAC_TYP.EXE을
실행하여 업데이트할 수 있습니다.

파일명        설명
---------------------------------------------------------
DS16GT.DLL    Microsoft ODBC driver manager, DLLs, and Help files
DS32GT.DLL 
ODBC32.DLL  
ODBC32GT.DLL 
ODBCAD32.EXE 
ODBCCP32.CPL 
ODBCCP32.DLL  
ODBCCR32.DLL 
ODBCINST.CNT  
ODBCINST.HLP  
ODBCINT.DLL 
ODBCTRAC.DLL

설치된 경로 > Windows system directory
설치될 경로 > Windows system directory

 

<어댑티브 서버 애니웨어 파일>

개발한 PowerBuilder 애플리케이션이 어댑티브 서버 에니웨어(ASA)데이터베이스를 사용한다면,
배포시 ASA의 ODBC 데이터베이스 드라이버와 ASA DBMS를 함께 배포하셔야 합니다.
개발된 애플리케이션이 독립형(stand-alone) 데이터베이스를 사용할 경우에는
ASA의 데스크탑 런타임 모듈을 최종 사용자의 PC에 무상으로 배포하실 수 있습니다.
이 런타임 모듈은 사용자가 데이터베이스내에 있는 데이터를 조회하거나 변경하는 것은 허용하나,
데이터베이스의 스키마(schema)를 변경하는 것은 허용되지 않습니다.
또한 트랜젝션 로그(Transaction logs)나 저장 프로시져(Stored procedures),
트리거(Trigger)를 지원하지 않습니다.
ASA(Adaptive Server Anywhere)드라이버와 런타임 엔진 그리고 기타 지원 파일들을 모두 인스톨
하실 때는 파워빌더 인스톨 CD에 있는 "Support" 디렉토리에 있는 파일들을 설치 하십시오.

파일명        설명
---------------------------------------------------------
DBODBC7.DLL    ASA ODBC driver
DBBACKUP.EXE   ASA backup utility
DBCON7.DLL     Connection dialog box, required if you do not provide your own dialog box and
              your end users are to create their own data sources, if they need to enter
              user IDs and passwords when connecting to the database, or if they need to
              display the Connection dialog box for any other purpose
DBISQLC.EXE    Interactive SQL utility
DBLGEN7.DLL    Language-specific string library (EN indicates the English version)
DBLIB7.DLL     Interface library
DBODTR7.DLL    ODBC translator, required if your application relies on OEM to ANSI character set conversion
DBTOOL7.DLL    ASA database tools
DBUNLOAD.EXE   ASA unload utility
DBVALID.EXE    ASA validation utility
RTENG7.EXE     제한적 용도의 런타임 엔진
DBCTRS7.DLL    Performance utility
DBSERV7.DLL    Server utility
DBWTSP7.DLL    Tools support

설치된 경로 > C:\Program Files\Sybase\SQL Anywhere 7\win32
설치될 경로 > 설치할 프로그램 폴더, System Path 또는 Path가 지정된 특정 폴더
             기타지원 파일들은 반드시 DBODBC7.DLL이 있는 디렉토리에 설치되어야 합니다.
ODBC 정보설정> ODBC에 대한 정보를 레지스트리에 등록해야 합니다.

- ODBC.INI
프로그램을 특정 데이터소스에 ODBC를 통해 연결하려면 레지스트리 정보 중 'ODBC.INI' 항목에
데이터소스에 대한 정의가 필요합니다.
'ODBC.INI'항목은 'HKEY_CURRENT_USER' 또는 'HKEY_LOCAL_MACHINE'에 있는데 앞에 것은
사용자 DSN에 등록되는 내용이며 뒤에 것은 시스템 DSN에 등록되는 것입니다.
DSN에 대한 설정내용은 제어판의 'ODBC 데이터 원본 관리자'에서 확인할 수 있습니다.
이 내용은 프로그램이 데이베이스를 구동할 때 제공할 정보들입니다.

[HKEY_CURRENT_USER\SOFTWARE\ODBC\ODBC.INI\MyApp DB]
"Driver"="C:\Program Files\Sybase\SQL Anywhere 7\win32\dbodbc7.dll"
"Start"="c:\program files\sybase\SQL Anywhere 7\win32\rteng7.exe -c8m"
"UID"="dba"
"PWD"="sql"
"Description"="Database for my application"
"DatabaseFile"="C:\Program Files\myapps\myapp.db"
"AutoStop"="Yes"

[HKEY_CURRENT_USER\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources]
"MyApp DB"="Adaptive Server Anywhere 7.0"

- ODBCINST.INI
프로그램이 실행될 PC에 설치된 ODBC 드라이버에 대한 정보입니다.
드라이버 설치정보는 제어판의 'ODBC 데이터 원본 관리자'에서 확인할 수 있습니다.

[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers]
"Adaptive Server Anywhere 7.0"="Installed"
"PB Merant OEM 3.60 32-BIT Sybase"="Installed"

[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\Adaptive Server Anywhere 7.0]
"Driver"="c:\program files\sybase\SQL Anywhere 7\win32\dbodbc7.dll"
"Setup"="c:\program files\sybase\SQL Anywhere 7\win32\dbodbc7.dll"

 


프로그램이 OLE DB를 사용한다면 마이크로소프트의 Data Access 콤포넌트가 설치되어 있어야 합니다.
설치되어 있지 않다면 설치CD의 Support 폴더에 있는 MDAC_TYP.EXE를 실행하여 설치할 수 있습니다.

파일명        설명
---------------------------------------------------------
PBOLE80.DLL   PowerBuilder OLE DB interface required for all OLE DB connections

GLOSSARY.HLP  License and help files and administration utilities required for all PB MERANT OLE DB data providers
INODBC.LIC  
IVODBC.LIC  
PBADMIN.CNT  
PBADMIN.EXE  
PBADMIN.HLP  
PBADMINR.DLL  
PBBAS07.DLL  
PBBAS07.HLP  
PBBAS07R.DLL  
PBUTL07.DLL  
PBUTL07R.DLL

PBIF907.CNT    PB MERANT Informix 7.x and 9.x
PBIF907.DLL  
PBIF907.HLP   
PBIF907R.DLL 

PBOR707.CNT    PB MERANT Oracle 7
PBOR707.DLL   
PBOR707.HLP   
PBOR707R.DLL

PBOR807.CNT    PB MERANT Oracle 8
PBOR807.DLL   
PBOR807.HLP   
PBOR807R.DLL 

PBSYB07.CNT    PB MERANT Sybase
PBSYB07.DLL  
PBSYB07.HLP  
PBSYB07R.DLL 

설치된 경로 > C:\Program Files\Sybase\Shared\MerantOLEDB
설치될 경로 > 설치할 프로그램 폴더, System Path 또는 Path가 지정된 특정 폴더

 

 

프로그램이 JDBC를 통해 데이터베이스에 연결할 때 필요한 파일들입니다.

파일명        설명
---------------------------------------------------------
PBJDB80.DLL   PowerBuilder JDBC DB Driver (JDB) for the Microsoft Java VM and the Sun JRE 1.1 or 1.2 or later Java VM
pbjdbc11.jar  Java package for PowerBuilder JDB driver and JRE 1.1
pbjdbc12.jar  Java package for PowerBuilder JDB driver and JRE 1.2 or later

다음은 자바 가상머신에서 JDM 과 JDS를 사용할 때 필요한 파일들입니다.
파일명        설명
---------------------------------------------------------
PBJDM80.DLL   PowerBuilder JDBC DB Driver (JDM) for the Microsoft Java virtual machine (deprecated)
PBJDS80.DLL   PowerBuilder JDBC DB Driver (JDS) for the Sun JRE 1.1 Java virtual machine (deprecated)

설치된 경로 > C:\Program Files\Sybase\Shared\PowerBuilder
설치될 경로 > 설치할 프로그램 폴더, System Path 또는 Path가 지정된 특정 폴더

다음은 자바 CLASSPATH에 대한 레지스트리 정보입니다.(사용환경에 따라 다를 수 있습니다)
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]
"CLASSPATH"="C:\Program Files\sybase\shared\PowerBuilder\pbjdbc12.jar;C:\Program Files\sybase\shared\Sun\jdk122\lib\classes.zip;


* EAServer와 웹 어플리케이션 관련 배포파일은 생략했습니다.
 관련 내용은 파워빌더 Online Book을 참조하시면 됩니다.

'Power Builder*' 카테고리의 다른 글

네이밍 규칙  (0) 2008.11.11
Power Builder 8로 마이그레이션 (pbl파일 열기)  (0) 2008.10.31
DataWindow 를 PDF 로 저장하기  (0) 2008.10.28
파워빌더 함수정리  (0) 2008.10.28
SQLCODE 값 정리  (0) 2008.10.28
Posted by 회사원Z
:


 

파워빌더 9.0 부터 데이터윈도우를 저장할 수 있는 방법으로, 공개 소프트웨어인 Ghostscript 를 사용하는 방법과 FOP 방법이 있다. PDF 로 변환하고자 하는 데이터 오브젝트의 Properties>DataExport 부분을 보면 하단부의 그림과 같다.

Format to configure 에서 PDF 를 선택하면, Method 에서 어떤 방식으로 만들지를 선택하게 된다.

 


 
a) Ghostscript 사용한 방법
 
윈도우 API 를 이용한 프로그램(ghostscript)을 이용하는 방법은 데이터윈도우에 있는 내용을 거의 그대로 표현해 줄 수 있다. 파워빌더 9.0 초기에는 동작이 제대로 되지 않는 문제(라인이나 그림 표현에 있어서..)가 있었지만 지금은 거의 완벽하게 그림, line 등 데이터윈도우에 있는 내용을 제대로 표현을 해준다.
Ghostscript 프로그램은 공개 소프트웨어로, 무료로 사용할 수 있으며, 아래의 사이트에서 7.05 나 7.06 을 다운받아서 사용하면 된다.
 
파워빌더 에서는 7.05 와 7.06 에서 최적화되어 있으니 다른 버전을 사용할 때에는 원하는 결과가 제대로 나오지 않을 수 있다.
ghostscript 를 설치할 때의 경로는 ..\Sybase\Shared\PowerBuilder 밑에 작성하면 된다.
Ghostscript 을 인스톨 했다면, 이제 PDF 로 변환하고자 하는 데이터오브젝트의 설정 값을 바꿔주어야 한다.
PDF 로 변환하고자 하는 데이터 오브젝트의 Properties>DataExport 탭에서 아래의 그림과 같이 설정한다.
 
 

 
‘PDF로 저장’버튼의 Clicked 이벤트에 다음과 같이 스크립트를 작성하면 된다. 코드의 작성은 그냥 일반적인 Saveas 와 같다.
 
Dw_1.Saveas("C:\test.pdf", PDF!, True)
 
실행 후, ‘PDF로 저장’버튼을 누르면 약 1,2 초간 프로세스가 수행되며, 윈도우의 상태바에 다음과 같은 프린트 화면이 나타나게 되며, PDF 로 저장되게 된다.
 

 
 
여기서 로딩되는 프린터는 Sybase DataWindow PS 이다.
 
저장되어진 Test.Pdf 파일을 Acrobat Reader 로 읽어보면,
 
 

 
다음과 같이 해당하는 데이터 윈도우를 색상 및 체크박스의 ‘V’ 표시 까지도 정확하게 PDF 로 저장해 주는 것을 확인 할 수 있을 것이다. 만약 BackGround 에 그림이 있는 경우도 동일하게 PDF 로 저장되어진다.
 
런타임배포시, ..\Sybase\Shared\PowerBuilder\drivers 밑에 PSCRPTUI.DLL 파일과 PSCRIPT.DLL 파일을 파워빌더 런타임 파일들과 같이 포함시켜서 배포하면 되며, 각각의 클라이언트에, 파워빌더 런타임 파일들이 인스톨되는 디렉토리 밑에 ghostscript 을 설치해야 한다.
 
b) FOP 을 사용한 방법
 
이 방법은 JAVA 를 이용해서 PDF 를 생성하기 때문에 폰트의 제약과 함께 데이터윈도우에 있는 내용을 그대로 저장할 없고, 라인이나, 그림 등은 제대로 PDF 로 저장되지 않는다. 또한, 배포 시 fonts 파일, java runtime, fop 를 모두 한꺼번에 배포해야 하는 어려움이 있기 때문에, 비교적 사용이 간편하고, 결과값또한 우수한 Ghostscript을 사용해서 PDF로 변환하기를 권장한다.

출처 : http://eas.penta.co.kr/pbnews/0410/saveaspdf.htm

'Power Builder*' 카테고리의 다른 글

네이밍 규칙  (0) 2008.11.11
Power Builder 8로 마이그레이션 (pbl파일 열기)  (0) 2008.10.31
파워빌더 8.0(7.0) 배포목록  (0) 2008.10.28
파워빌더 함수정리  (0) 2008.10.28
SQLCODE 값 정리  (0) 2008.10.28
Posted by 회사원Z
:

1. 데이터형 검사 및 변환 함수

  Char : bolb, 정수, 문자열을 문자로 바꿔서 반환

  Dec : 문자열의 내용을 10진수로 바꿔서 반환

  Double : 문자열의 내용을 Double로 바꿔서 반환

  Integer : 문자열의 내용을 정수로 바꿔서 반환

  Long : 문자열의 내용을 Long 으로 바꿔서 반환

  Real : 문자열의 내용을 실수로 바꿔서 반환

  Date : 데이터베이스로 부터 읽은 DateTime 으로부터 Date값만을 가져온다.

  DateTime : Date나 Time 값을 DateTime값으로 바꿔서 반환

  IsDate : 지정한 문자열이 유효한 Date값을 지녔는지 검사

  IsNull : 넘어온 인자가 Null 인지 검사

  IsNumber : 지정한 문자열이 숫자값을 지녔는지 검사

  IsTime : 지정한 문자열이 Time 값을 지녔는지 검사

  String : 지정한 형식으로 문자열을 연다

  Time : 데이터베이스로 부터 읽은 DateTime 으로부터 Time값만을 가져온다

 

2. 날짜, 요일, 시간 함수

  Day : 일자를 구한다

  DayName : 주간의 요일명을 구한다

  DayNumber : 주간의 요일을 숫자로 표현한다 ( 일요일은 1)

  DaysAfter : 지정한 날짜에 N일 전, 후를 구한다.

  Hour : 주어진 시간의 시를 구한다

  Minute : 주어진 시간의 분을 구한다

  Month : 주어진 시간의 월을 구한다

  Now : PC의 시스템 시간을 구한다

  RelativeDate : 주어진 날짜를 기준으로 n일 후의 날짜를 구한다.

  RelativeTime : 주어진 시간을 기준으로 n초 후의 시간을 구한다

  Second : 주어진 시간의 초 값을 구한다

  Today : PC의 시스템 날짜를 구한다

  Year : 주어진 날짜의 년 값을 구한다

 

3. 수치 처리 함수

  Abs : 수치의 절대값을 얻는다

  Ceiling : 지정한 수보다 크거나 같은 최소 정수를 구한다

  Cos : 주어진 각도의 코사인 값을 구한다

  Exp : e를 number만큼 거듭제곱한 값을 구한다

  Fact : 계승값을 구한다 (4! = 4* 3* 2* 1)

  Int : 소수점 이하를 버리고 가장 가까운 정수로 반환

  Log : 지정 숫자의 자연로그를 반환

  LogTen : 지정 숫자에 대한 밑이 10인 로그값 반환

  Max : 두 수중 큰 값 반환

  Min : 두 수중 작은 값 반환

  Mod : 두 수를 나눈 나머지 반환

  Pi : 3.14159...

  Rand : 난수를 생성

  Randomize : 난수 발생을 초기화

  Round : 숫자를 지정한 자릿수로 반올림

  Sign : 숫자의 부호 결정 ( 양수 : 1 음수 : -1 0 : 0)

  Sin : 주어진 각도의 사인값 반환

  Sqrt : 양의 제곱근 반환

  Tan : 주어진 값의 탄젠트값 반환

  Truncate : 소수점 이하 버리고 정수 반환

 

4. 프린트 함수

  Print : 현재 글꼴로 문자열을 인쇄

  PrintBitmap : 지정한 인쇄공간에 비트맵 이미지 인쇄

  PrintCancel : 인쇄취소

  PrintClose : 현재 페이지 프린터에 보내고 인쇄 종료

  PringDefineFont : 인쇄시의 폰트 지정

  PrintLine : 지정한 위치에 지정한 굵기로 선 그린다

  PrintOpen : 인쇄작업 시작, 인쇄 번호 할당

  PrintOval : 지정한 위치에 지정한 굵기로 타원을 그린다

  PrintPage : 현재 페이지 프린터에 보내고 새로운 페이지 셋한다

  PrintRect : 지정한 위치에 지정한 굵기로 사각형 그린다

  PrintRoundRect : 지정한 위치에 지정한 굵기로 둥근 모서리의 사각형 그린다

  PrintSend : 지정한 문자열 프린터에 보낸다

  PrintSetFont : 현재 인쇄 작업에 대한 글꼴 지정

  PrintSetSpacing : 라인간 너비를 지정

  PrintSetUp : 프린터 설정 다이얼로그 부름

  PrintText : 지정한 위치에 지정한 문자 인쇄

  PrintWidth : 현재 글꼴에서 지정된 문자열의 넓이

  PrintX : 커서의 X좌표

  PrintY : 커서의 Y좌표

 

5. 문자열 처리 함수

  Asc : 문자열의 첫번째 문자의 Ascii값 반환

  Char : 주어진 Ascii값에 해당하는 문자 반환

  Fill : 지정한 문자 반복시켜 문자열 만듬

  Left : 문자열의 시작부터 지정한 수 까지의 문자 반환

  LeftTrim : 문자열 시작에 있는 공백 제거

  Len : 문자열 길이 반환

  Lower : 주어진 문자열 내의 대문자를 소문자로 고쳐 반환

  Mid : 주어진 문자열에서 시작위치, 끝위치 지정해 문자열의 일정부분만 반환

  Pos : 다른 문자열에서 주어진 문자열의 위치 반환

  Replace : 문자열 일부 다른 문자열로 바꿈

  Right : 문자열의 끝에서부터 지정한 수의 문자 반환

  RightTrim : 문자열의 끝에 있는 공백 제거

  Space : 지정한 길이로 공백 문자열 얻는다

  Trim : 문자열의 시작과 끝의 공백 제거

  Upper : 지정한 문자열 내의 소문자를 대문자로 고쳐 반환

 

6. 시스템 및 환경 함수

  Clipboard : 윈도우 클립보드의 내용 얻는다

  GetApplication : 현재 어플리케이션의 핸들을 구한다

  CommandParm : 어플리케이션 실행시 지정된 파라미터가 있으면 그 값을 구한다

  GetEnvironment : 시스템의 운영체제와 프로세서 등과 같은 정보를 얻는다

  Handle : Windows Sdk 함수를 부르기 위해 사용

  Post : 지정한 윈도우에 대한 메세지를 메세지큐 마지막에 삽입

  ProfileInt : 지정한 프로파일에서 숫자값 얻어온다

  ProfileString : 지정한 프로파일에서 문자열 얻어온다

  Restart : 스크립트 실행 중지, 모든 윈도우 close, 데이터베이스 commit 후 연결끊고 어플리케이션 다시 실행

  Run : 지정한 어플리케이션 실행

  Send : 지정한 윈도우에 메세지를 순차적으로 보낸다

  SetProfileString : 지정한 프로파일 값 저장

  ShowHelp : 도움말 파일을 읽어 파워빌더 어플리케이션에서 사용할 수 있다

  SignalError : 어플리케이션 레벨에서의 시스템 에러를 발생한다

  Yeild : 반복문 안에서 다른 오브젝트나 어플리케이션의 메세지가 발생됐는지 체크할 수 있게 한다

 

7. 시간처리 함수

  CPU : 현재 실행중인 파워빌더 어플리케이션의 시작 부터 현재 까지의 CPU 시간을 반환

  Idle : 사용자가 아무런 입력 없이 지정한 시간이 흐르면 Idle이벤트 호출

  Timer : 지정한 윈도우에 일정한 간격의 타이머 지정하여 타이머 이벤트 호출

 

8. 배열(Array)처리 함수 

  LowerBound : 지정한 배열의 하위 경계

  UpperBound : 지정한 배열의 상위 경계


9. Bolb관련 함수 

  Blob       : 텍스트 데이터를 Blob 데이터로 변환 또는 복사

  BlobEdit   : PB가 지원하는 데이터를 Blob변수로 복사

  BlobMid    : Blob 데이터 문자열에서 N번째 문자를 반환

  Len        : 문자열의 길이

 

10. DDE클라이언트 함수 

  CloseChannel : OpenChannel함수로 열린 DDE서버 어플리케이션의 채널을 닫는다.

  ExecRemote : 서버 어플리케이션에게 명령 실행을 요구한다.

  GetDataDDE : 연결된 서버 어플리케이션으로부터 새로운 데이터를 받아온다.

  GetDataDDEOrigin : 연결된 서버 어플리케이션으로부터 원래의 데이터를 받아온다.

  GetRemote : 서버 어플리케이션에게 데이터를 요구한다.

  OpenChannel : DDE서버 어플리케이션을 연다.

  RespondRemote : 서버에게 명령 또는 데이터가 클라이언트에게 받아들여졌는지를 알려준다.

  SetRemote : 서버 어플리케이션에게 지정한 값을 설정하도록 한다.

  StartHotLink : 서버 어플리케이션과의 연결을 시작한다.

  StopHotLink : 서버 어플리케이션과의 연결을 종료한다.


11. DDE서버 함수 

  GetCommandDDE : 클라이언트 어플리케이션이 보낸 명령을 구한다.

  GetCommandDDEOrigin : 어떤 클라이언트 어플리케이션이 명령을 보냈는지 구한다.

  GetDataDDE : 클라이언트 어플리케이션이 보낸 데이터를 구한다.

  GetDataDDEOrigin : 어떤 클라이언트 어플리케이션이 데이터를 보냈는지 구한다.

  RespondRemote : 클라이언트에게 명령 또는 데이터가 서버에게 받아들여졌는지를 알려준다.

  SetDataDDE : 클라이언트 어플리케이션에게 데이터를 보낸다.

  StartServerDDE : 파워빌더를 서버로 동작하게 한다.

  StopServerDDE : 파워빌더가 서버로 동작하는 것을 중지한다.


12. 파일처리 함수 

  FileClose : 파일 닫기

  FileDelete : 파일 삭제

  FileExists : 파일 존재 유/무

  FileLength : 파일 길이

  FileOpen : 파일 열기

  FileRead : 파일 읽기

  FileSeek : 파일 내 위치 이동

  FileWrite : 파일에 쓰기

  GetFileOpenName : 파일 열기 공통 다이얼로그 열기

  GetFileSaveName : 파일 저장 공통 다이얼로그 열기


13. 라이브러리 함수 

  LibraryCreate : 라이브러리 생성

  LibraryDelete : 라이브러리 삭제

  LibrarDirectory : pb라이브러리 파일의 모든 오브젝트의 리스트를 구한다.

  LibraryExport : 라이브러리 파일의 모든 오브젝트를 Export한다.

  LibraryImport : 지정한 라이브러리 파일에서 오브젝트를 Import한다.


14. MAPI함수 

  mailAddress : 메일 메세지에 주소를 주거나 주소 리스트를 보여준다.

  mailDELETEMessage : 메일 메시지를 지운다.

  mailGetMessages : 메지시 id를 얻어온다.

  mailHandle : 내부 메일 시스템 핸들을 얻어온다.

  mailLogOff : 메세징 시스템과의 세션을 끊는다.

  mailLogOn : 메세징 시스템과의 세션을 시작한다.

  mailReadMessage : 메일 메시지를 읽는다.

  mailRecipientDetails : 지정된 수취인의 주소 정보를 보여준다.

  mailResolveRecipient : 불분명한 수취인 명을 결정한다.

  mailSaveMessage : 사용자 수신함에 새로운 메시지를 생성하거나 기존에 있는 메시지를

                               대체한다.

  mailSend : 메일 메시지를 보낸다.

 

15. 그밖의 함수

  Beep : 정해진 시간(초단위)동안 경고음 발생

  DBHandle : DBMS의 핸들 반환

  IsValid : 지정한 윈도우가 열려있는지 검사

  KeyDown : 사용자가 특정한 키 눌렀는지 검사

  MesseageBox : 메세지박스 출력

  PixelsToUnits : Pixel을 파워빌더의 Unit으로 변환

  RGB : 특정 색상 표현하는 Long 형 값 반환

  SetNull : 변수의 유형에 상관없이 Null 로 지정

  SetPointer : 마우스포인터를 지정한 모양으로 변환

  TypeOf : 오브젝트의 형 결정 Checkbox, Picture of RadioButton 등..

  UnitsToPixels : 파워빌더의 Unit을 Pixel로 변환

 

[출처] 햄도한다 - 파워빌더 함수 정리|작성자 ㅎ ㅐ엠


'Power Builder*' 카테고리의 다른 글

네이밍 규칙  (0) 2008.11.11
Power Builder 8로 마이그레이션 (pbl파일 열기)  (0) 2008.10.31
파워빌더 8.0(7.0) 배포목록  (0) 2008.10.28
DataWindow 를 PDF 로 저장하기  (0) 2008.10.28
SQLCODE 값 정리  (0) 2008.10.28
Posted by 회사원Z
:

카테고리

More More* (98)
iPHONE* (7)
Power Builder* (31)
HTML5* (2)
CSS3* (1)
jQuery & JavaScript* (17)
ASP* (20)
MSSQL* (10)
ETC* (10)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

달력

«   2025/05   »
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

글 보관함