질문)
타이머가 작동하다가 일정 시간 간격으로 자동으로 어떤 액션을 하게 하려고 합니다.
유저오브젝트(nvo)에서 timer를 사용할 수 있는 user event를 만드는 방법좀 알려주십시오.
timer() 함수는 window에서만 사용가능하고,
user event를 만들려고 Eevnt ID를 찾아보니 pbm_timer가 있던데...
스크립트를 어떻게 작성해야 사용가능할지 알 수가 없네요.
답변)
user object에서는 timing 이라는 오브젝트를 이용하시면 됩니다.
쓰시는 방법은 standard user object에서 timing를 상속 받아서 일반적인 유저 오브젝트 처럼 사용 하시
면 됩니다.
도움말을 살펴보면 start(), stop() 함수 그리고 timer 이벤트가 있는것을 보실 수 있습니다.
질문)
Composite DW 6개로 이루어진 Datawindow 를 다운로드 받고 싶습니다.
1. saveas 로 Composite DW 각각은 DownLoad 가 가능하나 파일 하나로 받을 수는 없을가요?
파일 포맷은 상관없습니다...(Excel 혹은 이미지 파일)
2. 내용은 다운되나 "선" 은 다운로드 되지 않습니다. 양식까지 다운 받을 수 없을까요?
답변)
1. composite는 saveas를 사용할 수 없습니다.
composite는 자체적으로 버퍼를 가지고 있는 것이 아니라 여러개의 데이터윈도우를 묶어 보이는 기능이
기 때문입니다. GetChild 함수를 써서 그 내에 nested 된 dw를 얻어온 뒤 그 데이터윈도우 각각에 대해
서 SaveAs는 가능할 것입니다.
2. dw_1.SaveAsAscii()를 한번사용해 보십시오.
질문)
DataStore ids_print
ids_print = Create DataStore
ids_print.DataObject = "eie010d10p"
ids_print.SetTransObject(sqlca)
인쇄를 하기 위해서 DataStore를 만들고.. 인쇄용 데이터윈도를 선언하는 시점에서 에러가 발생합니다..
위의 스크립트에서 "ids_print.DataObject = "eie010d10p" 란 스크립트에 주석을 달아놓구 실행을 하면
실행이 되구염.. 이 스크립트에.. 주석을 없애면.. 다시 에러가 발생하네요... 특별한 에러메세지는 없구
여
실행시 동작이 멈추어 버립니다.
답변)
"ids_print.DataObject = "eie010d10p"
부분에 문제가 있는것이 아니라 "eie010d10p" 데이터 윈도우에
문제가 있는 것 같습니다.
ids_print.SetTransObject(sqlca) 에서 Return값을 체크해 보십시오.
-1 이 Return 되는지요? -1이 Return 된다면 확실히 "eie010d10p" 데이터 윈도우에
문제가 있는 것이니 데이터윈도우를 재 생성하여야 합니다.
질문)
window Object 에서 Object 를 커서나 마우스로 이동시 X나 Y 의 포지션이
한번에 "32" 씩 이동을 합니다.. "1"씩 이동을 해야 하거든요..
버그인가요.. 옵션 수정으로 해결되나요.?
답변)
디자인시 컨트롤의 움직임은 옵션으로 설정하실 수 있습니다.
파워빌더의 메뉴에 보시면 Design > Options의 General 탭에 보시면 x, y Position을 설정할 수 있는 항
목이 있습니다.
최소 값이 4 이오니 최소로 설정을 하시면 되겠구요!!
Snap to Grid 체크박스가 체크가 되면 디자인 창에 보이는 Grid 크기만큼 자동으로 이동이 되오니
Detail 하게 디자인을 하시겠다하시면 해당 체크박스의 옵션을 풀어주십시오!!
그러면 Grid와는 무관하게 미세하게 디자인 조정이 가능합니다.
질문)
데이타 윈도우 출력을 할때 1장에 두개가 찍히게 했는데요 중간에 ---- 이선을 넣고 싶은데요.
데이타 윈도우는 출력은 group a 에 따라 반장씩 찍히게 했습니다.
a:1 aaaaa
b:1
c:1
------------- <--- 찍히고
a:2 bbbbb
b:1
c:1
<--- 페이지 마지막에는 찍히면 안되고
이렇게 찍히게 하고 싶은데 ----에 visible 체크를 어떻게 해야 할지 모르겠습니다. group a 가 변할때
해야 될 것 같은데 그것을 어떻게 체크하지요.
그리고 마지막에는 찍히면 안되거든요
답변)
항상 한 페이지당 고정적으로 두개의 데잍타가 나타나며 두 데이타의 경계선으로 라인을 넣고 싶으시다
는 말씀이시죠??
라인의 Visible Expression에 아래와 같이 작성을 하시면 되겠네요!!
============================================================================
IF ( getrow() = Long( Describe("DataWindow.LastRowOnPage) ) , 0 , 1 )
============================================================================
질문)
한 페이지의 출력이 너무 옆으로 길어서 강제적으로 A4사이즈로 페이지 카운트를 하면서 프린트 하고 싶
습니다. 가령 엑셀의 page break(||) 기능처럼 페이지를 분할해서 프린트 해는 방법은 없는지요?
답변)
일단 스크립트는 아래와 같구요!!
먼저 해주실 일은 원본 DataWindow를 가지고 SaveAs 하셔서 두개의 데이타윈도우를 더 만듭니다.
임의적으로 이름을 d_dw1, d_dw2로 설정했습니다.
d_dw1 의 데이타윈도우에서 SQL문장은 변경하시지 마시고 페인터에서 A4에서 짤리는 부분의 컬럼을 삭제
하고 저장합니다.
d_dw2는 d_dw1에서 제외된 컬럼만 남기고 모두 삭제합니다.
위와 같이 데이타윈도우를 만드신 후에 아래의 스크립트를 적용해 보십시오!!
DataStore lds_data, lds_dw1, lds_dw2
lds_data = CREATE DataStore
lds_data.DataObject = 'd_data'
lds_data.SetTransObject(SQLCA)
lds_data.Retrieve()
lds_dw1 = CREATE DataStore
lds_dw2 = CREATE DataStore
lds_dw1.DataObject = 'd_dw1'
lds_dw2.DataObject = 'd_dw2'
lds_data.ShareData(lds_dw1)
lds_data.ShareData(lds_dw2)
lds_dw1.Print()
lds_dw2.Print()
질문)
파워빌더8과 함께 제공되는 Sybase SQL AnyWhere 7을 이용하여 프로그램을 개발했는데
배포와 관련하여 어떤 화일들이 사용되는지 알고싶습니다.
특히 ODBC관련하여 알고 싶습니다.
만약 파워빌더 6.5에서 Sybase SQL Anywhere 7 을 사용한다면 어떤 문제점이 있고
사용이 가능하다면 배포와 관련하여 어떤 화일들이 사용되는지 알고싶습니다.
답변)
파워빌더 6.5인 경우 기술지원의 종료로 Sybase SQL Anywhere 7 의 사용시의 문제점을 저희도 알 수 없습
니다.
그리고 ASA는 번들용 제품입니다. 이 제품의 라이센스는 DB User 당 계산되오니 라이센스 비용도 지불하
셔야 합니다.
<파워빌더 ODBC 인터페이스>
다음은 파워빌더7.0과 인포메이커 애플리케이션이, ODBC를 사용하여 데이터베이스에
접속하고자 할 때 필요한 파일 목록입니다.
파일명 설명
---------------------------------------------------------
PBODB80.DLL PowerBuilder ODBC interface
PBODB80.INI PowerBuilder ODBC initialization file
설치된 경로 > C:Program FilesSybaseSharedPowerBuilder
설치될 경로 > 설치할 프로그램 폴더, 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 FilesSybaseSQL Anywhere 7win32
설치될 경로 > 설치할 프로그램 폴더, 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_USERSOFTWAREODBCODBC.INIMyApp DB]
"Driver"="C:Program FilesSybaseSQL Anywhere 7win32dbodbc7.dll"
"Start"="c:program filessybaseSQL Anywhere 7win32rteng7.exe -c8m"
"UID"="dba"
"PWD"="sql"
"Description"="Database for my application"
"DatabaseFile"="C:Program Filesmyappsmyapp.db"
"AutoStop"="Yes"
[HKEY_CURRENT_USERSOFTWAREODBCODBC.INIODBC Data Sources]
"MyApp DB"="Adaptive Server Anywhere 7.0"
- ODBCINST.INI
프로그램이 실행될 PC에 설치된 ODBC 드라이버에 대한 정보입니다.
드라이버 설치정보는 제어판의 'ODBC 데이터 원본 관리자'에서 확인할 수 있습니다.
[HKEY_LOCAL_MACHINESOFTWAREODBCODBCINST.INIODBC Drivers]
"Adaptive Server Anywhere 7.0"="Installed"
"PB Merant OEM 3.60 32-BIT Sybase"="Installed"
[HKEY_LOCAL_MACHINESOFTWAREODBCODBCINST.INIAdaptive Server Anywhere 7.0]
"Driver"="c:program filessybaseSQL Anywhere 7win32dbodbc7.dll"
"Setup"="c:program filessybaseSQL Anywhere 7win32dbodbc7.dll"
질문)
"kernel32.dll" 에 포함되어 있는 CreatFile,WriteFile,CloseHandle 함수를 쓸려고 하는데
파워빌더 Global External Function 에서 어떻게 변수들을 정의하고 값을 정의 하는지 알고 싶어서요.
MSDN 사이트 들어가봐도 약간 찾기가 힘드네요..그럼 수거하세요.
답변)
1. API 원형을 얻는다.
파워빌더에서 호출할 API 함수의 원형을 얻는다. 이러한 원형은 Windows API Bible 같은 책자나 또는
MSDN등의 네트웍에서 구할 수 있다.
예)
마이크로 소프트사의 정의:
BOOL GetFileVersionInfo(
LPTSTR lptstrFilename,
DWORD dwHandle,
DWORD dwLen,
LPVOID lpData);
2. 펑션인지 서브루틴인지 결정한다.
서브루틴은 리턴값이 없는 펑션 호출을 의미한다.
예: VOID GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer);
펑션은 위의 GetFileVersionInfo 예처럼 리턴 값을 가지고 있다.
3. 마이크로소프트의 데이타형을 파워빌더의 데이타형으로 바꾼다.
4. 전역/지역 외부 펑션의 지정
마이크로 소프트의 정의의 예는 다음과 같다. BOOL GetFileVersionInfo(LPTSTR lpstrFilename, DWORD
dwHandle,DWORD dwLen,LPVOID lpData);
이것을 위의 데이타형 표를 보고 파워빌더에 맞게 정의를 하면 된다. 다음은 그 결과를 보여준다 . 정의
하는 곳은 물론 Global/Local external function 에서 지정하면 된다.
PB 16비트
FUNCTION boolean GetFileVersionInfo(ref string filename,uint f_handle,uint f_length, ref lpdata
lpdata2) LIBRARY "ver.dll"
PB 32비트
FUNCTION boolean GetFileVersionInfoA(ref string filename,ulong f_handle,ulong f_length, ref
lpdata lpdata2) LIBRARY "version.dll"
참조 : 32비트에서 함수명에 A가 붙은 것은 16비트의 같은 이름의 함수와 구분하기 위해서 32비트 API가
나올때 붙여진 것이다.
5. 구조체의 생성
위의 예제의 함수에서는 lpData 라는 구조체를 쓰고 있다. 이러한 구조체를 위해서 앞서 말한바와 같이
책자나 네트웍등에서 구조체에 대한 정보를 얻어야 한다.
여기서 쓰는 lpData는 이러한구조를 가지고 있다.
LPDATA = { DWORD dwSignature ;
DWORD dwStrucVersion ;
DWORD dwFileVersionMS ;
DWORD dwFileVersionLS ;
DWORD dwProductVersionMS ;
DWORD dwProductVersionLS ;
DWORD dwFileFlagsMask ;
DWORD dwFileFlags ;
DWORD dwFileOS ;
DWORD dwFileType;
DWORD dwFileSubtype;
DWORD dwFileDateMS ;
DWORD dwFileDateLS }
파워빌더에서는 스트럭쳐 페인터를 이용하여 이러한 요소를 구축하면 된다. 만약 스트럭쳐의 요소들이 중
첩된 구조이거나 콜백루틴이 포함되어 있다면 파워빌더내에서 그 함수를 사용할 수 없다. 이러한 경우는
C DLL를 만들어서 다시 파워빌더에서 그것을 호출해야 한다.
6. 함수를 호출하는 스크립트작성
스크립트를 작성하기 위해서 이미 알고있듯이 선언된 함수들의 파라미터를 위해서 다음과 같은 선언문들
이 필요할 것이다.
ex)
boolean lb_rtn // Return code
long ls_filename // 1st argument - filename
ulong lu_hand // 2nd argument - f_handle
ulong lu_len // 3rd argument - f_length
lpdata lpdata2 // Last argument - assigning an instance of a structure
다음은 가장 어려운 부분이라 할 수 있는 아규먼트에 값들을 배정해주는(assignment)일이다. MSDN 이나
API 바이블 같은 참고서적을 활용하여 각각의 아규먼트들에 어떠한 형식의 값들이 들어가는 지 참조하여
작성해야 한다.
이 문서의 예제의 경우에 대한 스크립트의 작성 예는 다음과 같다.
GetFileVersionInfoA API함수를 위해서 원도우즈의 계산기가 좋은파일이라 생각된다.
boolean lb_rtn
long ls_filename
ulong lu_hand, lu_len
lpdata lpdata2
ls_filename = "c:windowscalc.exe"
setnull(lu_hand)
lu_len = 256
lb_rtn = GetFileVersionInfoA(ls_filename,lu_hand,lu_len,lpdata2)
// 결과값 출력
sle_1.text = string(lpdata2,dwSignature)
sle_2.text = string(lpdata2,dwStrucVersion)
sle_3.text = string(lpdata2,dwFileVersionMS)
sle_4.text = string(lpdata2,dwFileVersionLS)
sle_5.text = string(lpdata2,dwProductVersionMS)
sle_6.text = string(lpdata2,dwProductVersionLS)
sle_7.text = string(lpdata2,dwFileFlagsMask)
sle_8.text = string(lpdata2,dwFileFlags)
sle_9.text = string(lpdata2,dwFileOS)
sle_10.text = string(lpdata2,dwFileType)
sle_11.text = string(lpdata2,dwFileSubtype)
sle_12.text = string(lpdata2,dwFileDataMS)
sle_13.text = string(lpdata2,dwFileDataLS)
Messagebox("Return Code",string(lb_rtn))
지금까지 Win32 API 함수를 파워빌더에서 어떻게 정의하고 어떻게 사용하는지 GetFileVersionInfoA함수
의 예를 들어보았다. C/C++같은 언어처럼 API를 손쉽게 사용할 수는 없지만 이러한 방법을 이용하면 원도
우즈API를 이용하는데 도움이 되리라 생각한다.
기타 주의사항
1.참조하고자 하는 DLL의 비트를 반드시 확인하여야 한다. 16bit 응용프로그램이 32bit API를 호출할 수
없다.
2. 어떤함수들을 대소문자 구분을 하기때문에 주의하여야 한다.
3. 파워빌더 16비트에서 모든 핸들은 UINT이고 32비트는 ULONG이다.
4. 올바른 함수명을 사용하는지 반드시 확인하기 바란다. 32비트에서는 대부분의 함수들은 "A"가 함수명
뒤에 붙어있다. 이것은 기존의 같은 기능을 하는 16비트함수와 구분하기 위해서이다.
5. 전역과 지역 외부함수 선언. 만약 함수를 전역외부함수 선언에서 정의하면 응용프로그램 어디에서나
호출가능하고 지역외부함수로서 선언하면 선언된 윈도우 안에서만 호출가능하다. 지역함수는 전역보다 자
원을 적게쓰지만 그 차이는 매우 근소하다.
에러메시지와 의미
1. Error: Error opening DLL library < filename > for external function at line < line_number > in
the < eventname > event of object < object_name > of < window_name >
DLL이 없는 경우. DLL이 있을 경우는 응용프로그램에서 서로다른 bit수의 DLL을 호출하려는 경우 발생되
는 메시지. 또는 DLL이 깨졌을경우이거나 DLL포맷이 비 호환성일수 있다.
2. Error: Error calling external function < function_name > at line < line_number > in the <
event name > event of object < object_name > of < window_name >
이경우는 함수명을 잘못섰을 경우에 대부분일어난다. 함수명을 DLL안의 함수명과 일치하는지 확인한다.
3. Error: Specified argument type differs form required argument type at runtime in DLL function
< function_name >. ((invalid stack pointer on return form function call) at line < line_number >
in < event_name > event of object < object_name > of < window_name >.
DLL함수가 사용하는 데이타형이 틀릴경우 발생하는 메시지.
4. PB050: Caused an Invalid Page Fault in module PBSHR050.DLL @0137:1111163e
이 메시지는 함수를 호출한 후 그 즉시 발생할 수 도 있으며 또는 프로그램이 종료후에 일어날 수 있다.
모듈과 메모리주소가 다른경우에 일어난다.
질문)
3티어로 짠 프로그램을 웹으로 표현하려고합니다.
만약 엑티브 엑스로 만들때는 소스에 pbd이름을 코딩하는데..
클라이언트(html 창)을 실행할때 이 pbd들이 클라이언트 PC에 다운 되는겁니까?
아님 dll들만 다운되는 건가요?
답변)
pbd들이 모두 다운된 후 파워빌더 VM에 의해 실행되는 것입니다.
그러나 한번 다운된 pbd들은 IE의 인터넷 임시 파일 폴더에 저장되어 있다가
다시 같은 pbd가 호출되면 로컬 PC에서 실행되고 Web서버에서 가져오진 않습니다.
질문)
dw_1.SelectRow(ad_currow,True)
dw_1.SetFocus()
dw_1.SetColumn('rw80silinv')
로 컬럼에 포인터를 위치시킬경우 값의 앞에 커서가 입력상태로 깜박이는데
그 컬럼의 전체 값을 블럭으로 전체 값이 선택되게 하려면 어떻게 해야되나요?
답변)
DW의 ItemFocusChanged Event 에
IF dwo.name = 'rw80silinv' THEN
dw_1.SelectText( 1, Len(dw_1.GetText()))
END IF
하시는 방법과
DW의 Column 프라퍼티의 Edit의 Auto Selection을 설정하시는 방법 두가지중
맘에 드시는걸로 사용하십시오.
질문)
ActiveX로 구현된 모듈을 운영중 에 있습니다. 가끔 컴포넌트 호출 시 반응을 하지 않는 경우가 있습니
다. 자주 사용하는 업무를 별도로 그룹핑을 해서, 다른업무의 운영과는 별도로 작동을 시킬려고
합니다.
그래서, 서버를 업무 그룹단위로 iiop 포트를 설정해서 분할을 할려고 합니다. 방법과 주의해야 할 내용
이 있으면 알려주셨으면 합니다.
답변)
방법이 2가지가 있습니다.
1. Logical Server 로 분리하기
Jaguar Manager에서 Logical Server를 새로 만든 후 새로 추가한 Logical Server에
IIOP(&anp; HTTP)정보를 설정할 때 Port 번호만 다르게 주면 별개의 서버처럼 사용하실수 있습니다.
이때 새로 추가한 Logical Server에 컴포넌트를 재 Deploy한 후 이 서버에 접속하는
클라이언트의 Connection 오브젝트에서 IIOP의 Port정보를 변경하시면 됩니다...
자세한 내용은 저희 홈페이지의 EAServer 자료실에 올려 놨습니다!
2. 물리적으로 완전히 떼어내기!
예를 들어 EAServer 설치 경로가 다음과 같을때
C:SybaseEAServer
"EAServer" 폴더를 다른 드라이브나 또는 다른 이름으로 저장하고 각 폴더에 있는 Bin 디렉토리의
serverstart.bat 를 실행하면 완전히 분리된 멀티 EAServer를 실행할 수 있게 됩니다.
이때 주의 할 점은 앞서와 마찬가지로 두 EAServer의 Port정보(iiop, http 등등)가 서로 달라야 한다는
점입니다!
전자의 경우가 샴쌍둥이라면, 후자의 경우는 이란성 쌍둥이라 할 수 있습니다...
샴쌍둥이는 한놈이 아프면, 내장을 서로 공유하므로, 다른 놈도 편치 않은데, 이란성 쌍둥이는
서로가 독립 프로세스 이므로 상대방에게 영향을 주지 않습니다.
후자의 경우를 추천합니다...
질문)
파워빌더 7.0을 보유하고 있는데요
파워빌더 8.0 또는 9.0으로 업그레이드 버젼을 구매하려고 합니다.
현재 개발하려고 하는 건 클라이언트/서버 프로그램인데요.
현재 DB 의 컬럼명은 한글로 되어 있는 것이 많이 있거든요
파워빌더 7.0에서는 한글 컬럼명이 안되는 이유로 구매하려고 하는데요.
파워빌더 8.0과 9.0 의 가격이 동일하더군요.
클라이언트/서버 프로그램 개발시 파워빌더 8.0과 9.0의 차이점이 있다면
알려주셨으면 합니다.
9.0 구매시 문제점이 발생한다거나 기본적인 인터페이스가 많이 다르거나
한다면 개발시 어려움이 있을것 같거든요. 제가 알고 있기로는 인터페이스는
7.0과 그리 큰 차이점은 없는것으로 알고 있고요, C/S 개발부분은 거의 변화된것이
없다면, 9.0을 구매하여도 무방한 것인지 궁금합니다. 개발시에 문제점이 있다거나
프로그램 배포시 window 2000 또는 98 사용자들에게 어떤 문제점이 있는지 알고 싶군요.
답변 부탁드립니다.
답변)
일단 파워빌더 8부터 한글 테이블, 한글컬럼을 지원합니다.
실제 적용된 사이트들도 있구요!!
또한 지금은 파워빌더 9 출시로 파워빌더 8 판매가 중지된 상태이오며 지금 구입하신다면 파워빌더 9이
구매 가능하겠지요!!
파워빌더 8.0과 9.0은 인터페이스가 똑같다고 느낄만큼 동일합니다.
단지 8과 9의 차이라면 기능적인 부분이 더많이 추가가 되었다는 것이지요!!
또한 7에서 8로 갈때의 가장 큰 차이점이라면 Workspace와 Target이란 개념이 도입되었다는 것이지요!!
7에서 9로 가는데는 별다른 큰 문제가 되지 않습니다.
현재 7에서 9로 마이그레이션한 사이트도 있구요!!
배포상에 다소 문제가 되는 부분이 있다면 MS가 Win98을 Drop 한 이유로 파워빌더 9 의 지원 OS에서
Win98이 빠져 있다는 사실입니다.
보장하는 OS가 아니기에 Win98 OS 사용에는 다소 무리가 따르겠네요!!
질문)
파워빌더의 스크립트에 아래와 같이 기재하고 실행을 시키면
if dw_2.SaveAs(st_file.Text, Excel5!, false) = 1 then
MessageBox("파일 저장", "파일을 저장하였습니다.")
else
MessageBox("파일 선택 오류", "파일을 저장하지 못했습니다.", Exclamation!)
end if
오류메시지가 뜨고,
엑셀 파일을 열면 편집할 수 없다는 메시지가 나오면서 비어있는 파일이 열립니다.
모든 컴퓨터들에서 그러는 것이 아니라, 공통적인 원인이 없이 여러 컴퓨터들에서 발생이 합니다.
답변)
현재 스크립트상에 다소 오류가 있네요!!
====================================================
if dw_2.SaveAs(st_file.Text, Excel5!, false) = 1 then
====================================================
저장하실 File의 확장자 명과 저장하실 파일의 Type을 정확히 일치시켜 주셔야 합니다.
현재는 st_file.text 파일로 저장하시겠다고 스크립트가 되어있는데...
여기도 확장자가 틀렸네요!!
st_file.txt 가 되겠죠!!
또한 파일의 확장자는 text로 주시고 저장하는 파일의 타입을 Excel5! 로 주시면...
데이타가 저장이 된다 하더라도 Text 파일의 내용은 모두 깨져서 정확한 테이타 저장이 불가능 합니다.
타입을 정확히 일치시켜 주십시오!!
Text 파일로 저장을 하겠다면...
====================================================
if dw_2.SaveAs(st_file.txt, Text!, false) = 1 then
====================================================
Excel 파일로 저장을 하겠다면...
====================================================
if dw_2.SaveAs(st_file.xls, Excel5!, false) = 1 then
====================================================
질문)
EAServer운영시 내부 네트웍에서는 실행이 되나,
인터넷으로 VPN 접속한 상태에서 접속이 되지 않습니다.
지난번 답변에 IIOP포트를 오픈하라고 하셔서 오픈하였으나, 문제해결 되지 않았습니다.
EAServer에 추가로 설정해야 하는 사항이 있는가요..?
답변)
EAServer를 띄울때 IIOP 리슨어를 Host Name으로 설정하지 마시고
IP Address로 변경한후 실행시켜 보십시오.
방법은 ..SybaseEAServerbin 에 가시면 "setenv.bat" 가 있는데
이 파일을 Notepad등으로 열어서 ===> set JAGUAR_HOST_NAME=metal
부분을 IP로 설정하면 됩니다. ===> set JAGUAR_HOST_NAME=xxx.xxx.xxx.xxx
질문)
SaveAs() 함수에서
dwcontrol.SaveAs ( { filename, saveastype, colheading } ) saveastype 을 PSReport! ?Powersoft
Report (PSR) format 을
선택하였습니다. 그런데 저장된 화일을 어떤 editor로 열어 보아야 되는지 궁금합니다. 엑셀에서는 열리
지 않더군요. 답변주시면 고맙겠습니다.
답변)
PSR 파일을 볼 수 있는 것은 데이타윈도우 컨트롤입니다.
조회된 데이타를 가지고 있는 데이타윈도우로 보시면 되겠네요!!
말그대로 Report로...
사용은 아래와 같이 하시면 됩니다.
============================================
dw_1.DataObject = "C:test.psr"
============================================
질문)
일련번호 자료1 자료2
1 aaa 1
aaa 2
aaa 3
2 bbb 1
bbb 2
3 ddd 1
ddd 2
ddd 3
자료1,자료2가 있고
자료1로 Group이 되있을경우
DataWindow에서 일련번호를 만들려고 하는데 방법이 없을까요!!!
답변)
Computed Field에 아래와 같이 Expression을 주시면 됩니다.
===========================================================
cumulativeSum( 1 for all DISTINCT group잡은컬럼명 )
예) cumulativeSum( 1 for all DISTINCT dept_id )
===========================================================
질문)
안녕하세요*^^*
Composite로 출력문을 작성하고 있습니다.
composite_dw사진을 첨부하였는데 사진에서 보시는 바와 같이
composite내에 5개의 child데이터윈도우가 있습니다.
이들은 모두 하나의 argument를 받습니다.
데이터윈도우에서 테이블을 직접 불러와 보여주는 것도 있고
스크립트상에서 쿼리를 날려 modify로 넣어주는 것도 있습니다.
(d_inet_start, d_inet_junip, d_inet_jnuip_1, d_inet_junip_2, d_inet_end )
편의상 이들을 차례로 dw_1, dw_2, dw_3, dw_4, dw_5라고 명명했을 때
dw_2 에는 테이블1 내용과 테이블2 내용을 한페이지에만 같이 보여주고(스크립트상에서 쿼리로 modify
함) ,
dw_3 에는 테이블1 내용(데이터가 존재하는 만큼 페이지나오도록)을,
dw_4 에는 테이블2 내용(데이터가 존재하는 만큼 페이지나오도록)을 작성하여 놓았습니다.
(dw_1 과 dw_5는 시작과 끝페이지로서 무조건 보여집니다.)
dw_2의 데이터행 갯수가 11개 이하 일때는 dw_2를 보여주고 .
11개를 초과할 경우엔 dw_2는 감추고 dw_3과 dw_4를 보여주는 것입니다.
If li_rent_cnt <= 11 Then //li_rent_cnt는 테이블1에서 읽어온 데이터 갯수
dw_main.Object.dw_2.visible = TRUE
dw_main.Object.dw_3.visible = FALSE
dw_main.Object.dw_4.visible = FALSE
dw_main.Modify("dw_3.HideSnaked=Yes")
dw_main.Modify("dw_4.HideSnaked=Yes")
dw_main.Modify("dw_3.NewPage=No")
dw_main.Modify("dw_4.NewPage=No")
else
dw_main.Object.dw_2.visible = FALSE
dw_main.Object.dw_3.visible = TRUE
dw_main.Object.dw_4.visible = TRUE
dw_main.Modify("dw_3.HideSnaked=No")
dw_main.Modify("dw_4.HideSnaked=No")
dw_main.Modify("dw_3.NewPage=Yes")
dw_main.Modify("dw_4.NewPage=Yes")
end if
이렇게 조건을 주었더니 안보이는 부분은 빈페이지로 나오는데
이 빈 페이지를 없애는 방법이 없을 까요?
child 데이터윈도우의 visible체트를 처음부터 없애면 다른 페이지와 겹쳐져서 나오고
visible 체트를 해놓으면 안보여지는 곳이 빈페이지로 보여지고...(><)
dw_2와 dw_3을 똑같이 겹쳐놓고 위 그대로 실행했을 땐 둘중 하나만 보이게 되서
하나의 빈페이지는 안나오더군요...
그래서 dw_2를 늘려 dw_3 과 dw_4 를 다 포함하도록 겹쳐서 실행해봤지만,,,
그래도 dw_4자리의 빈페이지는 계속되네요,,^^;;;
조언좀 부탁드립니다....
답변)
Composite DW의 특성상 데이타가 없으면 나타나지 않는 특징이 있습니다.
현재의 경우는 데이타는 다 있는데 단지 Visible만 FALSE로 만들기 때문에 있는 데이타들이 그만큼 스페
이스를 차지해서 공백으로 print가 되는듯 하군요!!
스크립트상에서 Query 를 직접 세팅하는 경우도 있다고 하시니 잘 되었네요!!
dw_2가 보이든 dw_3,dw_4가 보이든 둘중 하나만 보이면 되는 것이지요??
보여지지 않아야 하는 Child DataWindow의 SQL문장을 수정해서 데이타가 한건도 조회되지 않도록 스크립
트에서 수정을 해주시면 되겠네요!!
==================================================================================
String ls_sql
Long ll_row
DataWindowChild ldw_child
dw_1.GetChild('dw_2', ldw_child)
ll_row = ldw_child.RowCount()
IF ll_row <= 11 THEN
// 원래의 SQL문장에 Where 절만 수정해서 데이타가 한건도 안나오도록 SQL 문장을 만든다.
ls_sql = " SELECT dept_id, dept_name FROM department WHERE 1 = 2"
ldw_child.SetTransObject(SQLCA)
ldw_child.SetSQLSelect(ls_new_sql)
ldw_child.Retrieve()
ELSE
//위와 반대로 dw_3, dw_4의 데이타가 없게 하면 해당 DW는 Display되지 않겠죠??
END IF
==================================================================================
타이머가 작동하다가 일정 시간 간격으로 자동으로 어떤 액션을 하게 하려고 합니다.
유저오브젝트(nvo)에서 timer를 사용할 수 있는 user event를 만드는 방법좀 알려주십시오.
timer() 함수는 window에서만 사용가능하고,
user event를 만들려고 Eevnt ID를 찾아보니 pbm_timer가 있던데...
스크립트를 어떻게 작성해야 사용가능할지 알 수가 없네요.
답변)
user object에서는 timing 이라는 오브젝트를 이용하시면 됩니다.
쓰시는 방법은 standard user object에서 timing를 상속 받아서 일반적인 유저 오브젝트 처럼 사용 하시
면 됩니다.
도움말을 살펴보면 start(), stop() 함수 그리고 timer 이벤트가 있는것을 보실 수 있습니다.
질문)
Composite DW 6개로 이루어진 Datawindow 를 다운로드 받고 싶습니다.
1. saveas 로 Composite DW 각각은 DownLoad 가 가능하나 파일 하나로 받을 수는 없을가요?
파일 포맷은 상관없습니다...(Excel 혹은 이미지 파일)
2. 내용은 다운되나 "선" 은 다운로드 되지 않습니다. 양식까지 다운 받을 수 없을까요?
답변)
1. composite는 saveas를 사용할 수 없습니다.
composite는 자체적으로 버퍼를 가지고 있는 것이 아니라 여러개의 데이터윈도우를 묶어 보이는 기능이
기 때문입니다. GetChild 함수를 써서 그 내에 nested 된 dw를 얻어온 뒤 그 데이터윈도우 각각에 대해
서 SaveAs는 가능할 것입니다.
2. dw_1.SaveAsAscii()를 한번사용해 보십시오.
질문)
DataStore ids_print
ids_print = Create DataStore
ids_print.DataObject = "eie010d10p"
ids_print.SetTransObject(sqlca)
인쇄를 하기 위해서 DataStore를 만들고.. 인쇄용 데이터윈도를 선언하는 시점에서 에러가 발생합니다..
위의 스크립트에서 "ids_print.DataObject = "eie010d10p" 란 스크립트에 주석을 달아놓구 실행을 하면
실행이 되구염.. 이 스크립트에.. 주석을 없애면.. 다시 에러가 발생하네요... 특별한 에러메세지는 없구
여
실행시 동작이 멈추어 버립니다.
답변)
"ids_print.DataObject = "eie010d10p"
부분에 문제가 있는것이 아니라 "eie010d10p" 데이터 윈도우에
문제가 있는 것 같습니다.
ids_print.SetTransObject(sqlca) 에서 Return값을 체크해 보십시오.
-1 이 Return 되는지요? -1이 Return 된다면 확실히 "eie010d10p" 데이터 윈도우에
문제가 있는 것이니 데이터윈도우를 재 생성하여야 합니다.
질문)
window Object 에서 Object 를 커서나 마우스로 이동시 X나 Y 의 포지션이
한번에 "32" 씩 이동을 합니다.. "1"씩 이동을 해야 하거든요..
버그인가요.. 옵션 수정으로 해결되나요.?
답변)
디자인시 컨트롤의 움직임은 옵션으로 설정하실 수 있습니다.
파워빌더의 메뉴에 보시면 Design > Options의 General 탭에 보시면 x, y Position을 설정할 수 있는 항
목이 있습니다.
최소 값이 4 이오니 최소로 설정을 하시면 되겠구요!!
Snap to Grid 체크박스가 체크가 되면 디자인 창에 보이는 Grid 크기만큼 자동으로 이동이 되오니
Detail 하게 디자인을 하시겠다하시면 해당 체크박스의 옵션을 풀어주십시오!!
그러면 Grid와는 무관하게 미세하게 디자인 조정이 가능합니다.
질문)
데이타 윈도우 출력을 할때 1장에 두개가 찍히게 했는데요 중간에 ---- 이선을 넣고 싶은데요.
데이타 윈도우는 출력은 group a 에 따라 반장씩 찍히게 했습니다.
a:1 aaaaa
b:1
c:1
------------- <--- 찍히고
a:2 bbbbb
b:1
c:1
<--- 페이지 마지막에는 찍히면 안되고
이렇게 찍히게 하고 싶은데 ----에 visible 체크를 어떻게 해야 할지 모르겠습니다. group a 가 변할때
해야 될 것 같은데 그것을 어떻게 체크하지요.
그리고 마지막에는 찍히면 안되거든요
답변)
항상 한 페이지당 고정적으로 두개의 데잍타가 나타나며 두 데이타의 경계선으로 라인을 넣고 싶으시다
는 말씀이시죠??
라인의 Visible Expression에 아래와 같이 작성을 하시면 되겠네요!!
============================================================================
IF ( getrow() = Long( Describe("DataWindow.LastRowOnPage) ) , 0 , 1 )
============================================================================
질문)
한 페이지의 출력이 너무 옆으로 길어서 강제적으로 A4사이즈로 페이지 카운트를 하면서 프린트 하고 싶
습니다. 가령 엑셀의 page break(||) 기능처럼 페이지를 분할해서 프린트 해는 방법은 없는지요?
답변)
일단 스크립트는 아래와 같구요!!
먼저 해주실 일은 원본 DataWindow를 가지고 SaveAs 하셔서 두개의 데이타윈도우를 더 만듭니다.
임의적으로 이름을 d_dw1, d_dw2로 설정했습니다.
d_dw1 의 데이타윈도우에서 SQL문장은 변경하시지 마시고 페인터에서 A4에서 짤리는 부분의 컬럼을 삭제
하고 저장합니다.
d_dw2는 d_dw1에서 제외된 컬럼만 남기고 모두 삭제합니다.
위와 같이 데이타윈도우를 만드신 후에 아래의 스크립트를 적용해 보십시오!!
DataStore lds_data, lds_dw1, lds_dw2
lds_data = CREATE DataStore
lds_data.DataObject = 'd_data'
lds_data.SetTransObject(SQLCA)
lds_data.Retrieve()
lds_dw1 = CREATE DataStore
lds_dw2 = CREATE DataStore
lds_dw1.DataObject = 'd_dw1'
lds_dw2.DataObject = 'd_dw2'
lds_data.ShareData(lds_dw1)
lds_data.ShareData(lds_dw2)
lds_dw1.Print()
lds_dw2.Print()
질문)
파워빌더8과 함께 제공되는 Sybase SQL AnyWhere 7을 이용하여 프로그램을 개발했는데
배포와 관련하여 어떤 화일들이 사용되는지 알고싶습니다.
특히 ODBC관련하여 알고 싶습니다.
만약 파워빌더 6.5에서 Sybase SQL Anywhere 7 을 사용한다면 어떤 문제점이 있고
사용이 가능하다면 배포와 관련하여 어떤 화일들이 사용되는지 알고싶습니다.
답변)
파워빌더 6.5인 경우 기술지원의 종료로 Sybase SQL Anywhere 7 의 사용시의 문제점을 저희도 알 수 없습
니다.
그리고 ASA는 번들용 제품입니다. 이 제품의 라이센스는 DB User 당 계산되오니 라이센스 비용도 지불하
셔야 합니다.
<파워빌더 ODBC 인터페이스>
다음은 파워빌더7.0과 인포메이커 애플리케이션이, ODBC를 사용하여 데이터베이스에
접속하고자 할 때 필요한 파일 목록입니다.
파일명 설명
---------------------------------------------------------
PBODB80.DLL PowerBuilder ODBC interface
PBODB80.INI PowerBuilder ODBC initialization file
설치된 경로 > C:Program FilesSybaseSharedPowerBuilder
설치될 경로 > 설치할 프로그램 폴더, 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 FilesSybaseSQL Anywhere 7win32
설치될 경로 > 설치할 프로그램 폴더, 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_USERSOFTWAREODBCODBC.INIMyApp DB]
"Driver"="C:Program FilesSybaseSQL Anywhere 7win32dbodbc7.dll"
"Start"="c:program filessybaseSQL Anywhere 7win32rteng7.exe -c8m"
"UID"="dba"
"PWD"="sql"
"Description"="Database for my application"
"DatabaseFile"="C:Program Filesmyappsmyapp.db"
"AutoStop"="Yes"
[HKEY_CURRENT_USERSOFTWAREODBCODBC.INIODBC Data Sources]
"MyApp DB"="Adaptive Server Anywhere 7.0"
- ODBCINST.INI
프로그램이 실행될 PC에 설치된 ODBC 드라이버에 대한 정보입니다.
드라이버 설치정보는 제어판의 'ODBC 데이터 원본 관리자'에서 확인할 수 있습니다.
[HKEY_LOCAL_MACHINESOFTWAREODBCODBCINST.INIODBC Drivers]
"Adaptive Server Anywhere 7.0"="Installed"
"PB Merant OEM 3.60 32-BIT Sybase"="Installed"
[HKEY_LOCAL_MACHINESOFTWAREODBCODBCINST.INIAdaptive Server Anywhere 7.0]
"Driver"="c:program filessybaseSQL Anywhere 7win32dbodbc7.dll"
"Setup"="c:program filessybaseSQL Anywhere 7win32dbodbc7.dll"
질문)
"kernel32.dll" 에 포함되어 있는 CreatFile,WriteFile,CloseHandle 함수를 쓸려고 하는데
파워빌더 Global External Function 에서 어떻게 변수들을 정의하고 값을 정의 하는지 알고 싶어서요.
MSDN 사이트 들어가봐도 약간 찾기가 힘드네요..그럼 수거하세요.
답변)
1. API 원형을 얻는다.
파워빌더에서 호출할 API 함수의 원형을 얻는다. 이러한 원형은 Windows API Bible 같은 책자나 또는
MSDN등의 네트웍에서 구할 수 있다.
예)
마이크로 소프트사의 정의:
BOOL GetFileVersionInfo(
LPTSTR lptstrFilename,
DWORD dwHandle,
DWORD dwLen,
LPVOID lpData);
2. 펑션인지 서브루틴인지 결정한다.
서브루틴은 리턴값이 없는 펑션 호출을 의미한다.
예: VOID GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer);
펑션은 위의 GetFileVersionInfo 예처럼 리턴 값을 가지고 있다.
3. 마이크로소프트의 데이타형을 파워빌더의 데이타형으로 바꾼다.
4. 전역/지역 외부 펑션의 지정
마이크로 소프트의 정의의 예는 다음과 같다. BOOL GetFileVersionInfo(LPTSTR lpstrFilename, DWORD
dwHandle,DWORD dwLen,LPVOID lpData);
이것을 위의 데이타형 표를 보고 파워빌더에 맞게 정의를 하면 된다. 다음은 그 결과를 보여준다 . 정의
하는 곳은 물론 Global/Local external function 에서 지정하면 된다.
PB 16비트
FUNCTION boolean GetFileVersionInfo(ref string filename,uint f_handle,uint f_length, ref lpdata
lpdata2) LIBRARY "ver.dll"
PB 32비트
FUNCTION boolean GetFileVersionInfoA(ref string filename,ulong f_handle,ulong f_length, ref
lpdata lpdata2) LIBRARY "version.dll"
참조 : 32비트에서 함수명에 A가 붙은 것은 16비트의 같은 이름의 함수와 구분하기 위해서 32비트 API가
나올때 붙여진 것이다.
5. 구조체의 생성
위의 예제의 함수에서는 lpData 라는 구조체를 쓰고 있다. 이러한 구조체를 위해서 앞서 말한바와 같이
책자나 네트웍등에서 구조체에 대한 정보를 얻어야 한다.
여기서 쓰는 lpData는 이러한구조를 가지고 있다.
LPDATA = { DWORD dwSignature ;
DWORD dwStrucVersion ;
DWORD dwFileVersionMS ;
DWORD dwFileVersionLS ;
DWORD dwProductVersionMS ;
DWORD dwProductVersionLS ;
DWORD dwFileFlagsMask ;
DWORD dwFileFlags ;
DWORD dwFileOS ;
DWORD dwFileType;
DWORD dwFileSubtype;
DWORD dwFileDateMS ;
DWORD dwFileDateLS }
파워빌더에서는 스트럭쳐 페인터를 이용하여 이러한 요소를 구축하면 된다. 만약 스트럭쳐의 요소들이 중
첩된 구조이거나 콜백루틴이 포함되어 있다면 파워빌더내에서 그 함수를 사용할 수 없다. 이러한 경우는
C DLL를 만들어서 다시 파워빌더에서 그것을 호출해야 한다.
6. 함수를 호출하는 스크립트작성
스크립트를 작성하기 위해서 이미 알고있듯이 선언된 함수들의 파라미터를 위해서 다음과 같은 선언문들
이 필요할 것이다.
ex)
boolean lb_rtn // Return code
long ls_filename // 1st argument - filename
ulong lu_hand // 2nd argument - f_handle
ulong lu_len // 3rd argument - f_length
lpdata lpdata2 // Last argument - assigning an instance of a structure
다음은 가장 어려운 부분이라 할 수 있는 아규먼트에 값들을 배정해주는(assignment)일이다. MSDN 이나
API 바이블 같은 참고서적을 활용하여 각각의 아규먼트들에 어떠한 형식의 값들이 들어가는 지 참조하여
작성해야 한다.
이 문서의 예제의 경우에 대한 스크립트의 작성 예는 다음과 같다.
GetFileVersionInfoA API함수를 위해서 원도우즈의 계산기가 좋은파일이라 생각된다.
boolean lb_rtn
long ls_filename
ulong lu_hand, lu_len
lpdata lpdata2
ls_filename = "c:windowscalc.exe"
setnull(lu_hand)
lu_len = 256
lb_rtn = GetFileVersionInfoA(ls_filename,lu_hand,lu_len,lpdata2)
// 결과값 출력
sle_1.text = string(lpdata2,dwSignature)
sle_2.text = string(lpdata2,dwStrucVersion)
sle_3.text = string(lpdata2,dwFileVersionMS)
sle_4.text = string(lpdata2,dwFileVersionLS)
sle_5.text = string(lpdata2,dwProductVersionMS)
sle_6.text = string(lpdata2,dwProductVersionLS)
sle_7.text = string(lpdata2,dwFileFlagsMask)
sle_8.text = string(lpdata2,dwFileFlags)
sle_9.text = string(lpdata2,dwFileOS)
sle_10.text = string(lpdata2,dwFileType)
sle_11.text = string(lpdata2,dwFileSubtype)
sle_12.text = string(lpdata2,dwFileDataMS)
sle_13.text = string(lpdata2,dwFileDataLS)
Messagebox("Return Code",string(lb_rtn))
지금까지 Win32 API 함수를 파워빌더에서 어떻게 정의하고 어떻게 사용하는지 GetFileVersionInfoA함수
의 예를 들어보았다. C/C++같은 언어처럼 API를 손쉽게 사용할 수는 없지만 이러한 방법을 이용하면 원도
우즈API를 이용하는데 도움이 되리라 생각한다.
기타 주의사항
1.참조하고자 하는 DLL의 비트를 반드시 확인하여야 한다. 16bit 응용프로그램이 32bit API를 호출할 수
없다.
2. 어떤함수들을 대소문자 구분을 하기때문에 주의하여야 한다.
3. 파워빌더 16비트에서 모든 핸들은 UINT이고 32비트는 ULONG이다.
4. 올바른 함수명을 사용하는지 반드시 확인하기 바란다. 32비트에서는 대부분의 함수들은 "A"가 함수명
뒤에 붙어있다. 이것은 기존의 같은 기능을 하는 16비트함수와 구분하기 위해서이다.
5. 전역과 지역 외부함수 선언. 만약 함수를 전역외부함수 선언에서 정의하면 응용프로그램 어디에서나
호출가능하고 지역외부함수로서 선언하면 선언된 윈도우 안에서만 호출가능하다. 지역함수는 전역보다 자
원을 적게쓰지만 그 차이는 매우 근소하다.
에러메시지와 의미
1. Error: Error opening DLL library < filename > for external function at line < line_number > in
the < eventname > event of object < object_name > of < window_name >
DLL이 없는 경우. DLL이 있을 경우는 응용프로그램에서 서로다른 bit수의 DLL을 호출하려는 경우 발생되
는 메시지. 또는 DLL이 깨졌을경우이거나 DLL포맷이 비 호환성일수 있다.
2. Error: Error calling external function < function_name > at line < line_number > in the <
event name > event of object < object_name > of < window_name >
이경우는 함수명을 잘못섰을 경우에 대부분일어난다. 함수명을 DLL안의 함수명과 일치하는지 확인한다.
3. Error: Specified argument type differs form required argument type at runtime in DLL function
< function_name >. ((invalid stack pointer on return form function call) at line < line_number >
in < event_name > event of object < object_name > of < window_name >.
DLL함수가 사용하는 데이타형이 틀릴경우 발생하는 메시지.
4. PB050: Caused an Invalid Page Fault in module PBSHR050.DLL @0137:1111163e
이 메시지는 함수를 호출한 후 그 즉시 발생할 수 도 있으며 또는 프로그램이 종료후에 일어날 수 있다.
모듈과 메모리주소가 다른경우에 일어난다.
질문)
3티어로 짠 프로그램을 웹으로 표현하려고합니다.
만약 엑티브 엑스로 만들때는 소스에 pbd이름을 코딩하는데..
클라이언트(html 창)을 실행할때 이 pbd들이 클라이언트 PC에 다운 되는겁니까?
아님 dll들만 다운되는 건가요?
답변)
pbd들이 모두 다운된 후 파워빌더 VM에 의해 실행되는 것입니다.
그러나 한번 다운된 pbd들은 IE의 인터넷 임시 파일 폴더에 저장되어 있다가
다시 같은 pbd가 호출되면 로컬 PC에서 실행되고 Web서버에서 가져오진 않습니다.
질문)
dw_1.SelectRow(ad_currow,True)
dw_1.SetFocus()
dw_1.SetColumn('rw80silinv')
로 컬럼에 포인터를 위치시킬경우 값의 앞에 커서가 입력상태로 깜박이는데
그 컬럼의 전체 값을 블럭으로 전체 값이 선택되게 하려면 어떻게 해야되나요?
답변)
DW의 ItemFocusChanged Event 에
IF dwo.name = 'rw80silinv' THEN
dw_1.SelectText( 1, Len(dw_1.GetText()))
END IF
하시는 방법과
DW의 Column 프라퍼티의 Edit의 Auto Selection을 설정하시는 방법 두가지중
맘에 드시는걸로 사용하십시오.
질문)
ActiveX로 구현된 모듈을 운영중 에 있습니다. 가끔 컴포넌트 호출 시 반응을 하지 않는 경우가 있습니
다. 자주 사용하는 업무를 별도로 그룹핑을 해서, 다른업무의 운영과는 별도로 작동을 시킬려고
합니다.
그래서, 서버를 업무 그룹단위로 iiop 포트를 설정해서 분할을 할려고 합니다. 방법과 주의해야 할 내용
이 있으면 알려주셨으면 합니다.
답변)
방법이 2가지가 있습니다.
1. Logical Server 로 분리하기
Jaguar Manager에서 Logical Server를 새로 만든 후 새로 추가한 Logical Server에
IIOP(&anp; HTTP)정보를 설정할 때 Port 번호만 다르게 주면 별개의 서버처럼 사용하실수 있습니다.
이때 새로 추가한 Logical Server에 컴포넌트를 재 Deploy한 후 이 서버에 접속하는
클라이언트의 Connection 오브젝트에서 IIOP의 Port정보를 변경하시면 됩니다...
자세한 내용은 저희 홈페이지의 EAServer 자료실에 올려 놨습니다!
2. 물리적으로 완전히 떼어내기!
예를 들어 EAServer 설치 경로가 다음과 같을때
C:SybaseEAServer
"EAServer" 폴더를 다른 드라이브나 또는 다른 이름으로 저장하고 각 폴더에 있는 Bin 디렉토리의
serverstart.bat 를 실행하면 완전히 분리된 멀티 EAServer를 실행할 수 있게 됩니다.
이때 주의 할 점은 앞서와 마찬가지로 두 EAServer의 Port정보(iiop, http 등등)가 서로 달라야 한다는
점입니다!
전자의 경우가 샴쌍둥이라면, 후자의 경우는 이란성 쌍둥이라 할 수 있습니다...
샴쌍둥이는 한놈이 아프면, 내장을 서로 공유하므로, 다른 놈도 편치 않은데, 이란성 쌍둥이는
서로가 독립 프로세스 이므로 상대방에게 영향을 주지 않습니다.
후자의 경우를 추천합니다...
질문)
파워빌더 7.0을 보유하고 있는데요
파워빌더 8.0 또는 9.0으로 업그레이드 버젼을 구매하려고 합니다.
현재 개발하려고 하는 건 클라이언트/서버 프로그램인데요.
현재 DB 의 컬럼명은 한글로 되어 있는 것이 많이 있거든요
파워빌더 7.0에서는 한글 컬럼명이 안되는 이유로 구매하려고 하는데요.
파워빌더 8.0과 9.0 의 가격이 동일하더군요.
클라이언트/서버 프로그램 개발시 파워빌더 8.0과 9.0의 차이점이 있다면
알려주셨으면 합니다.
9.0 구매시 문제점이 발생한다거나 기본적인 인터페이스가 많이 다르거나
한다면 개발시 어려움이 있을것 같거든요. 제가 알고 있기로는 인터페이스는
7.0과 그리 큰 차이점은 없는것으로 알고 있고요, C/S 개발부분은 거의 변화된것이
없다면, 9.0을 구매하여도 무방한 것인지 궁금합니다. 개발시에 문제점이 있다거나
프로그램 배포시 window 2000 또는 98 사용자들에게 어떤 문제점이 있는지 알고 싶군요.
답변 부탁드립니다.
답변)
일단 파워빌더 8부터 한글 테이블, 한글컬럼을 지원합니다.
실제 적용된 사이트들도 있구요!!
또한 지금은 파워빌더 9 출시로 파워빌더 8 판매가 중지된 상태이오며 지금 구입하신다면 파워빌더 9이
구매 가능하겠지요!!
파워빌더 8.0과 9.0은 인터페이스가 똑같다고 느낄만큼 동일합니다.
단지 8과 9의 차이라면 기능적인 부분이 더많이 추가가 되었다는 것이지요!!
또한 7에서 8로 갈때의 가장 큰 차이점이라면 Workspace와 Target이란 개념이 도입되었다는 것이지요!!
7에서 9로 가는데는 별다른 큰 문제가 되지 않습니다.
현재 7에서 9로 마이그레이션한 사이트도 있구요!!
배포상에 다소 문제가 되는 부분이 있다면 MS가 Win98을 Drop 한 이유로 파워빌더 9 의 지원 OS에서
Win98이 빠져 있다는 사실입니다.
보장하는 OS가 아니기에 Win98 OS 사용에는 다소 무리가 따르겠네요!!
질문)
파워빌더의 스크립트에 아래와 같이 기재하고 실행을 시키면
if dw_2.SaveAs(st_file.Text, Excel5!, false) = 1 then
MessageBox("파일 저장", "파일을 저장하였습니다.")
else
MessageBox("파일 선택 오류", "파일을 저장하지 못했습니다.", Exclamation!)
end if
오류메시지가 뜨고,
엑셀 파일을 열면 편집할 수 없다는 메시지가 나오면서 비어있는 파일이 열립니다.
모든 컴퓨터들에서 그러는 것이 아니라, 공통적인 원인이 없이 여러 컴퓨터들에서 발생이 합니다.
답변)
현재 스크립트상에 다소 오류가 있네요!!
====================================================
if dw_2.SaveAs(st_file.Text, Excel5!, false) = 1 then
====================================================
저장하실 File의 확장자 명과 저장하실 파일의 Type을 정확히 일치시켜 주셔야 합니다.
현재는 st_file.text 파일로 저장하시겠다고 스크립트가 되어있는데...
여기도 확장자가 틀렸네요!!
st_file.txt 가 되겠죠!!
또한 파일의 확장자는 text로 주시고 저장하는 파일의 타입을 Excel5! 로 주시면...
데이타가 저장이 된다 하더라도 Text 파일의 내용은 모두 깨져서 정확한 테이타 저장이 불가능 합니다.
타입을 정확히 일치시켜 주십시오!!
Text 파일로 저장을 하겠다면...
====================================================
if dw_2.SaveAs(st_file.txt, Text!, false) = 1 then
====================================================
Excel 파일로 저장을 하겠다면...
====================================================
if dw_2.SaveAs(st_file.xls, Excel5!, false) = 1 then
====================================================
질문)
EAServer운영시 내부 네트웍에서는 실행이 되나,
인터넷으로 VPN 접속한 상태에서 접속이 되지 않습니다.
지난번 답변에 IIOP포트를 오픈하라고 하셔서 오픈하였으나, 문제해결 되지 않았습니다.
EAServer에 추가로 설정해야 하는 사항이 있는가요..?
답변)
EAServer를 띄울때 IIOP 리슨어를 Host Name으로 설정하지 마시고
IP Address로 변경한후 실행시켜 보십시오.
방법은 ..SybaseEAServerbin 에 가시면 "setenv.bat" 가 있는데
이 파일을 Notepad등으로 열어서 ===> set JAGUAR_HOST_NAME=metal
부분을 IP로 설정하면 됩니다. ===> set JAGUAR_HOST_NAME=xxx.xxx.xxx.xxx
질문)
SaveAs() 함수에서
dwcontrol.SaveAs ( { filename, saveastype, colheading } ) saveastype 을 PSReport! ?Powersoft
Report (PSR) format 을
선택하였습니다. 그런데 저장된 화일을 어떤 editor로 열어 보아야 되는지 궁금합니다. 엑셀에서는 열리
지 않더군요. 답변주시면 고맙겠습니다.
답변)
PSR 파일을 볼 수 있는 것은 데이타윈도우 컨트롤입니다.
조회된 데이타를 가지고 있는 데이타윈도우로 보시면 되겠네요!!
말그대로 Report로...
사용은 아래와 같이 하시면 됩니다.
============================================
dw_1.DataObject = "C:test.psr"
============================================
질문)
일련번호 자료1 자료2
1 aaa 1
aaa 2
aaa 3
2 bbb 1
bbb 2
3 ddd 1
ddd 2
ddd 3
자료1,자료2가 있고
자료1로 Group이 되있을경우
DataWindow에서 일련번호를 만들려고 하는데 방법이 없을까요!!!
답변)
Computed Field에 아래와 같이 Expression을 주시면 됩니다.
===========================================================
cumulativeSum( 1 for all DISTINCT group잡은컬럼명 )
예) cumulativeSum( 1 for all DISTINCT dept_id )
===========================================================
질문)
안녕하세요*^^*
Composite로 출력문을 작성하고 있습니다.
composite_dw사진을 첨부하였는데 사진에서 보시는 바와 같이
composite내에 5개의 child데이터윈도우가 있습니다.
이들은 모두 하나의 argument를 받습니다.
데이터윈도우에서 테이블을 직접 불러와 보여주는 것도 있고
스크립트상에서 쿼리를 날려 modify로 넣어주는 것도 있습니다.
(d_inet_start, d_inet_junip, d_inet_jnuip_1, d_inet_junip_2, d_inet_end )
편의상 이들을 차례로 dw_1, dw_2, dw_3, dw_4, dw_5라고 명명했을 때
dw_2 에는 테이블1 내용과 테이블2 내용을 한페이지에만 같이 보여주고(스크립트상에서 쿼리로 modify
함) ,
dw_3 에는 테이블1 내용(데이터가 존재하는 만큼 페이지나오도록)을,
dw_4 에는 테이블2 내용(데이터가 존재하는 만큼 페이지나오도록)을 작성하여 놓았습니다.
(dw_1 과 dw_5는 시작과 끝페이지로서 무조건 보여집니다.)
dw_2의 데이터행 갯수가 11개 이하 일때는 dw_2를 보여주고 .
11개를 초과할 경우엔 dw_2는 감추고 dw_3과 dw_4를 보여주는 것입니다.
If li_rent_cnt <= 11 Then //li_rent_cnt는 테이블1에서 읽어온 데이터 갯수
dw_main.Object.dw_2.visible = TRUE
dw_main.Object.dw_3.visible = FALSE
dw_main.Object.dw_4.visible = FALSE
dw_main.Modify("dw_3.HideSnaked=Yes")
dw_main.Modify("dw_4.HideSnaked=Yes")
dw_main.Modify("dw_3.NewPage=No")
dw_main.Modify("dw_4.NewPage=No")
else
dw_main.Object.dw_2.visible = FALSE
dw_main.Object.dw_3.visible = TRUE
dw_main.Object.dw_4.visible = TRUE
dw_main.Modify("dw_3.HideSnaked=No")
dw_main.Modify("dw_4.HideSnaked=No")
dw_main.Modify("dw_3.NewPage=Yes")
dw_main.Modify("dw_4.NewPage=Yes")
end if
이렇게 조건을 주었더니 안보이는 부분은 빈페이지로 나오는데
이 빈 페이지를 없애는 방법이 없을 까요?
child 데이터윈도우의 visible체트를 처음부터 없애면 다른 페이지와 겹쳐져서 나오고
visible 체트를 해놓으면 안보여지는 곳이 빈페이지로 보여지고...(><)
dw_2와 dw_3을 똑같이 겹쳐놓고 위 그대로 실행했을 땐 둘중 하나만 보이게 되서
하나의 빈페이지는 안나오더군요...
그래서 dw_2를 늘려 dw_3 과 dw_4 를 다 포함하도록 겹쳐서 실행해봤지만,,,
그래도 dw_4자리의 빈페이지는 계속되네요,,^^;;;
조언좀 부탁드립니다....
답변)
Composite DW의 특성상 데이타가 없으면 나타나지 않는 특징이 있습니다.
현재의 경우는 데이타는 다 있는데 단지 Visible만 FALSE로 만들기 때문에 있는 데이타들이 그만큼 스페
이스를 차지해서 공백으로 print가 되는듯 하군요!!
스크립트상에서 Query 를 직접 세팅하는 경우도 있다고 하시니 잘 되었네요!!
dw_2가 보이든 dw_3,dw_4가 보이든 둘중 하나만 보이면 되는 것이지요??
보여지지 않아야 하는 Child DataWindow의 SQL문장을 수정해서 데이타가 한건도 조회되지 않도록 스크립
트에서 수정을 해주시면 되겠네요!!
==================================================================================
String ls_sql
Long ll_row
DataWindowChild ldw_child
dw_1.GetChild('dw_2', ldw_child)
ll_row = ldw_child.RowCount()
IF ll_row <= 11 THEN
// 원래의 SQL문장에 Where 절만 수정해서 데이타가 한건도 안나오도록 SQL 문장을 만든다.
ls_sql = " SELECT dept_id, dept_name FROM department WHERE 1 = 2"
ldw_child.SetTransObject(SQLCA)
ldw_child.SetSQLSelect(ls_new_sql)
ldw_child.Retrieve()
ELSE
//위와 반대로 dw_3, dw_4의 데이타가 없게 하면 해당 DW는 Display되지 않겠죠??
END IF
==================================================================================
Posted by Julyus