'PB Tips'에 해당되는 글 1건

  1. 2012.11.29 [PowerBuilder News 05년06월] PB Tips!!! - 출처:PentaSystems
Powerbuilder2012. 11. 29. 13:54
http://pbdc.pe.kr/zeroboard/zboard.php?id=news&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=30&PHPSESSID=3b4f14bbea7f333bfdfcf1e3775d65c4

PowerBuilder Tips

이후 내용은 파워빌더 헬프데스크에 접수된 한달간의 문의 중 일부를 발췌해낸 것 입니다. 
파워빌더 헬프데스크는 http://eas.penta.co.kr/help에 등록해 주시면 서비스를 받으실 수 있습니다.  


질문)
파워빌더에서생성한 active X를 jsp에서 사용하려고 합니다. 
귀사에서 제시한 예제를 보면 pbd화일을 easerver/에 복사한 후 easerver를 실행하라고 나왔는데 easerver없이 파워빌더에서 
생성한 active X를 사용할 수는 없는지요
답변)
파워빌더 ActiveX를 사용한다는 것은 파워빌더 UI를 파워빌더 ActiveX 관련 모듈( PBRX90.OCX )과 파워빌더 런타임을 이용하여
브라우저에서 보여준다는 말입니다. 따라서 EAServer가 없이도 파워빌더 화면을 ActiveX 모듈을 이용하여 브라우저에서 보여줄 
수가 있는데, 다만, 브라우저에 보여주려고 하는 파워빌더 UI가 비지니스 로직( 데이터 조회 또는 저장, SQL 문장 등...)을 가지고
있다면 이러한 비지니스 로직 처리를 위해 EAServer를 사용하라는 이야기 입니다. 
만약 이러한 비지니스 로직을 EAServer에서 처리하지 않고 파워빌더 UI에서 그대로 처리한다면 클라이언트/서버 환경에서처럼
브라우저를 사용하는 모든 사용자한테 DBMS 클라이언트 모듈, 파워빌더 런타임, ActiveX 관련 모듈 등을 설치하고 환경을 잡아 
주어야하는 복잡한 과정이 있기때문에 EAServer를 사용하여 이러한 복잡한 배포 절차를 없애는 의미에서 EAServer를 사용하라고
권장하는 것입니다. 물론 다른  WAS( WebLogic, WebSphere등 )는 파워빌더를 지원하지 못하기 때문에 사용할 수가 없겠죠.


질문)
사용했던 버전인 PB8.0.3 (#9703)   -> 정식배포판 PB8.0.4 (#10501) 설치 ->  PB8.0.4 (#10784) 최종 패치 설치 8.0.3버젼에서는
오류가 없었는데, 패치 적용후 컴파일 시 User Object에서 오류발생 하였습니다. 변수이름에 @를 인식하지 못하는 것 같습니다.
답변) 
일단 테스트 결과로 현재의 문제를 확인하였습니다. 
파워빌더 9 에서도 Syntax Error로 Import 자체가 안되는걸로 봐서는 @가 지원되지 않는듯 싶습니다. 자세한 사항은 좀더 확인을
해봐야 겠지만 일단 상위버전에서 문제가 되니 일단은 안쓰는 방향으로 돌아가야 할 듯 싶습니다.
원칙적으로 파워빌더에서의 Function 이름에는 특수문자를 사용할 수 없게 되어 있습니다.


질문)
datawindow 작성시 메뉴 Rows -> Srored Procedure Update... 라는 메뉴가 있는데 어떻게 사용하는건지 알고싶습니다.
답변) 
해당 기능은 Stored Procedure 로 데이터를 Update, Insert, Delete하는 기능입니다. 
Update나 Insert, Delete 로직을 가진 Stored Procedure를 작성하여 원하는 기능의 SP를 각각 지정하여 IN, OUT 파라미터로
지정한 컬럼들에 Datawindow의 컬럼들을 매칭시켜주시면 됩니다. dw_컨트롤.Update() 함수 실행시 해당 Row의 상태값이 따라 
Insert가 될 것인지, Update가 될 것인지, Delete가 될것인지를 결정하여 해당 SP로 실행이 되게 되며, 
SP가 설정되어 있지 않은 사항에 대해서는 일반 적으로 실행되는 DW의 SQL이 수행됩니다. 


질문)
dw내에서 command button 사용법을 알고자 합니다. 특정 dw내에 command button을 만들어 이 dw가 활성화되었을 때 원하는 
스크립트를 수행하도록 할 수 있는 방법을 알고 계시면 답변 부탁드립니다. dw내의 button clicked event에서는 사용할 수 있는 
event가 하나뿐인데, 여러 개의 버튼을 만들어 사용을 한다면 어떻게 해야 하나요? 
답변) 
DataWindow Control의 이벤트중 buttonclicked의 Argment값을 보시면 dwobject Type의 dwo가 있습니다. 
아래 스크립터처럼 사용하시면 됩니다. 
String ls_buttonname 
ls_buttonname = dwo.name 
Choose casel s_buttonname 
    case 'b_save' 
Choose end


질문)
현재 INFORMIX와 PB10을 연동하여 다국어를 입력/출력하는 시스템을 개발테스트 중에 있습니다. 
(중국에서 한글/중문을 모두 지원해야 합니다.) 각각의 CLIENT OS에서는 각각의 언어를 지원하나 다른 언어간에는 각각의 문자만 
지원하고 있습니다. CLIENT OS와 관계없이 다국어를 표현할 수는 없는 것인지 궁금합니다. 
[TEST] 
SERVER(중문) + 한글 OS에서 한글입력/출력->성공 
SERVER(중문) + 중문 OS에서 중문입력/출력->성공 
SERVER(중문) + 중문 OS에서 한글입력 + 한글OS에서 출력->실패 
SERVER(중문) + 한글 OS에서 한글입력 + 중문 OS에서 출력->실패 
각각의 TEST는 IME를 사용하여 각각의 언어를 입력하였습니다. 
답변) 
Native Drive에서는 unicode가 지원불가능합니다.  ODBC로 연결하여야만 가능합니다.


질문)
EAServer 가 아래 메세지 후에 자주 다운이 됩니다..
( AFLIB Message: 18011/11/0: DLL lookup for 'af_dll_lookup()' failed, OS Message: 'oraclient8.dll') 
메세지가 의미하는게 무엇인지....다운되는 원인이 무엇인지 알고 싶습니다. 또 계속 로그에 
The Current Version is Developer Version 
IIOPCurrentSessions Limit Reached   
아래아 같은 메세지가 뿌려지는데..어떤 버젼이 안맞는건지...답변부탁드립니다.
답변) 
1.DLL lookup for 'af_dll_lookup()' failed, OS Message: 'oraclient8.dll' 
Connection Cache 설정에 입력된 'oraclient8.dll'을 해당 서버에서 찾을 수 없기 때문에 발생하는 메시지 입니다. 
이 dll 명칭은 보통 클라이언트 버전에 따라 ora804.dll, ora805.dll 등으로 다를 수 있습니다.
2. The Current Version is Developer Version 
설치된 EAServer 는 개발자 버전입니다.  개발자 버전에는 http & iiop 연결 수에 제한이 있습니다.


질문)
EAServer를 사용하는중 메모리 사용량이 계속하여 올라갑니다. 
5일에서 1주일 정도면 사용량이 거의 100% 까지 올라가네요. 해당 서버가 EAServer로만 사용되는 것이 아니라서 문제가 매우 
심각합니다. 
현재 Jaguar를 shutdown 했다 restart를 하는 방법으로 임시로 문제를 해결하고는 있는데요. 
이처럼 메모리 사용량이 계속하여 올라가는 경우는 어떤 경우인지 그리고 확인사항이 있다면 무엇인지 다방면으로 알려주셨으면
합니다. 
답변) 
Create Object 후 이를 Destory 하지않아 발생하는 전형적인 증상입니다. 
서버단 PB 컴포넌트 스크립트를 꼼꼼히 살펴보시면 해당 유형을 찾을 수 있을겁니다.


질문)
외부에서 commandparm 으로 인자 값을 받아서 datawindow 에 컬럼에 thread로 인자값을 넣으려고 합니다 
APP.EXE TEST1 
APP.EXE TEST2 
datawindows 
test1 
test2 
가 들어 가야 합니다.
thread 개념으로 해야 하는데 도무지 어떤 방법을 써야 할지, 현재 프로그램이 위와같이 실행하면-_- 2개 프로그램이 따로 실행이
됩니다 
쓰레드를 사용하려면 원도우 안에서 프로그램안에서 인자값을 받아야 하나요?
commandparm으로 인자값을 받아서 쓰레드 처리하는 방법은 없나요?
답변) 
파워빌더로 만든 실행화일을 인자값을 달리해서 두번호출하면 두개의 실행화일이 따로따로 동작하는건 당연한 결과입니다. 
말씀하신대로 구현하려면 Mutex를 사용하시고 먼저 실행된 EXE의 핸들값이나 프로세스아이디를 가져와서 특정 event를 발생시키는
방법으로 하셔야 할것같습니다.


질문)
1.    Stored Procedure가 추가된 DataWindow를 GetFullState 할때 에러가 납니다. 
Stored Procedure가 추가된 DataWindow는 GetFullState 할 수 없는건가요? 
그리고 Stored Procedure가 추가된 DataWindow의 제약사항이 있으면 알려주세요.
예를 들어 GetFullState , Getchanges 등 
2.  데이타를 blob 타입이 아닌 string 타입으로   클라이언트에 가져와 importstring한후 
    update row나 delete row을 했을때 dw_list.update시 문제가 될수 있는지 궁금합니다. 
    ll_rv = dw_1.retrieve(la_arry[]) 
    ls_data = dw_1.Describe("DataWindow.data") 
    dw_list.importstring(ls_data) 
        : 
        :수정,삭제 작업 
        : 
    dw_list.update()
답변) 
1. 테스트 데이타윈도우를 만들어 테스트해본결과 이상이 없습니다. 가지고 계신 데이타윈도우로 테스트를 해야 정확한 결과를 
알수있을꺼 같습니다. 번거러우시더라도 pbl에 테스트하신 윈도우와 데이타윈도우 sp 소스및 sp를 만들수있게 테이블레이아웃을 
같이 보내주시면 저희쪽에서 테스트 후 연락드리겠습니다.
2. 서버에서 데이타값만 String 으로 추출하여 blob타입으로 변환후 클라이언트에서 다시 String 값으로 변환하시고 
ImportString후 ResetUpdate() 함수를 호출후 사용하시면 됩니다. 


질문)
여러개의 DW를 하나의 엑셀로 저장하고 싶은데 예를 들어 하나의 엑셀파일에서 시트별로.. 
DW_1 은 SHEET1 
DW_2 는 SHEET2 
DW_3 은 SHEET3 
이렇게 만들고 싶은데 방법 좀 가르쳐 주십시오. 
답변) 
직접 엑셀 쉬트에 값을 넣는 방법을 사용하셔야 할것같습니다. 아래스크립터를 참고하시기 바랍니다. 
1. Global External Function 선언 
FUNCTION UInt FindWindowA( Ulong className, string winName )  LIBRARY "user32.dll" 
FUNCTION UInt SetFocus( int winHand )  LIBRARY "user32.dll" 
2. 해당 스크립트 작성 
OleObject     myOleObject 
int           i_Result,rc 
String        excel_title 
UInt          excel_handle 
myOleObject = Create OleObject //ole 오브젝트 생성 
i_Result = myOleObject.ConnectToNewObject( "excel.application" ) 
// 엑셀에 연결 
excel_title = myOleObject.Application.Caption 
myOleObject.Application.Visible = True 
excel_handle = FindWindowA( 0, excel_title ) 
SetFocus( excel_handle ) 
myOleObject.WorkBooks.Open("c:\mmm.xls") 
// c:\mmm.xls 을 불러온다. 
myOleObject.WindowState = 2 
// 엑셀윈도우의 상태 지정 1-normal, 2-min, 3-max 
//sheet1의 A1셀의 데이터를 불러올때 
double a // 엑셀 데이터타입에 맞는 형을 선언 
a = myOleobject.application.workbooks(1).worksheets(1).Range( "A1" ).Value 
//만약 sheet2에 접근하려면 아래처럼 합니다. 
//a = myOleobject.application.workbooks(1).worksheets(2).Range( "A1" ).Value 
//sheet1의 A4에 'Park'이라는 값을 넣으려면 아래처럼 
myOleobject.application.workbooks(1).worksheets(1).Range( "A4" ).Value = 'Park' 
myoleobject.application.workbooks(1).Save() //엑셀저장 
myoleobject.application.workbooks(1).SaveAs("c:\mmm3.xls") 
//mmm3.xls로 새이름으로 저장하는 방법 
//다른 엑셀명령도 위처럼 사용가능하지 않을까 싶네요 (여러가지 해보지를 못해서..) 
myoleobject.DisConnectObject() //연결종료 
Destroy myoleobject //오브젝트 제거


질문)
OLE Object에 Bmp파일명이 표시되는데, 그림만 표시할 수 없나요? 
헤더정보가 저장되기 때문이라면, 현재까지는 현재 현상없이 사용했었습니다. 파빌 패치도 안 했는데,  아래는 소스입니다. 
   result = GetFileOpenName("Select File", docname, named, "BMP", & 
                                       + "BMP Files (*.BMP),*.BMP," + "ALL Files (*.*),*.*") 
   ole_1.InsertFile(docname)
답변) 
OLE Control 을 이용해서 그림파일등을 표현할 경우, 파워빌더 OLE Control 은 Container 역할만 수행하고 실제 보여질 내용은
OLE Server Application 에서 만들게 됩니다. 이전과 다르게 나온다는 것은 OLE Server Application 에 변화가 생겼을 가능성이 
높습니다. 예를 들면 OS 가 바뀌면서 그림판 프로그램 버전이 틀려지는 경우죠. 그림 파일만 보여주길 원하신다면, OLE 대신 
Picture Control 을 이용하시는게 맞을 것 같습니다.


질문)
첨부한 팝업창을 보시면...(위쪽 검색부분은 dw_acc란 데이터윈도우, 아래쪽에 내용이 조회되는 부분은 dw_detail 데이터윈도우
입니다.) 아래의 조회버튼을 눌러 아래 데이터윈도우에 내용을 조회합니다. 
이때. 반드시 retrieve.as needed ...option을 'Yes'로 주어 부분범위처리가 가능한 상태로 조회합니다.
조회버튼을 누른 후 데이터가 화면에 보이기 시작하자마자 바로, 위쪽의 대분류 dropdown listbox(또는)dropdown datawindow)에서 
다른 값을 선택하면. Only cancel command is allowed when the rows are pending 에러가 뜹니다. 
이 에러는 꼭 retrieve.as needed ...option이 Yes로 되어있을 때만 납니다. 조언을 부탁드립니다.
OLTP인 프로그램의 성격상 부분범위처리는 꼭 필요하거든요. 이 기능을 못 쓴다면 말이 제대로 안될것 같습니다.
아래는 위쪽 검색 부분 데이터 윈도우(dw_acc)의 itemchanged event입니다. 
-------------------------------- 
datawindowchild dw_child 
String ls_lcatCd, ls_mcatCd 
Choose Case dwo.name 
Case 'lcatcd' 
dw_acc.GetChild('mcatcd' , dw_child) 
dw_child.SetTransObject(sqlca) 
dw_child.Retrieve(data) 
Case 'mcatcd' 
dw_acc.AcceptText() 
ls_lcatCd = dw_acc.Object.lcatcd[1] 
dw_acc.Object.scatcd[1] = '' 
dw_acc.GetChild('scatcd' , dw_child) 
dw_child.SetTransObject(sqlca) 
dw_child.Retrieve(ls_lcatCd, data) 
Case 'scatcd' 
dw_acc.AcceptText() 
ls_lcatCd = dw_acc.Object.lcatcd[1] 
ls_mcatCd = dw_acc.Object.mcatcd[1] 
dw_acc.Object.vscatcd[1] = '' 
dw_acc.GetChild('vscatcd' , dw_child) 
dw_child.SetTransObject(sqlca) 
dw_child.Retrieve(ls_lcatCd, ls_mcatCd , data) 
End Choose 
답변) 
retrieve.as needed 옵션이 설정한 상태에서 작업이 완료되기 전에 다른 작업으로 이동하려고 하기때문에 발생하는 메시지 입니다. 
만약 DDDW나 DDLB를 선택해서 다른 작업으로 이동하려고 한다면, 먼저 retrieve.as needed 옵션을 해제하고 작업이 이루어지도록
스크립트를 작성해 보시기 바랍니다. 
예) 
1. 데이터윈도우에 retrieve.asneeded 옵션 TRUE 
2. 데이터 조회. 
3. 원하는 작업이 끝났을때 retrieve.asneeded 옵션 행위 중지. 즉 DDDW나 DDLB에서 다른 아이템을 선택하려고 할때 
retrieve.asneeded 옵션을 중지하게 하면 될 것 같습니다.( DBCancel() 함수 사용 ) 
위의 과정으로 다시 테스트 해 보시기 바랍니다.


질문)
얼마전에 같은 질문을 드렸었는데, 급한일로 잠시 접고 있다가, 이제 다시 권한관리를 하려합니다. 
제가 하려는것은. PB의 메뉴에 대한 권한을 사용자별로 관리하려고 합니다.
현재, PB실행시 상단의 큰 메뉴들은 사용자별 권한을 가지고 활성화 혹은 비활성화 하고 있는데, 이제부터는 메뉴안의 또다른 작은
메뉴들까지도 권한을 관리할 예정입니다. 
지난번에 가르쳐주신 PB의 sample코드를 확인해보니, m_frame의 메뉴를 보여주고 활성화/비활성화를 체크하는 것은 가능할듯 
싶습니다. 그렇다면 사용자별로 각각 가지고 있는 권한을 어떻게 관리해야 할까요. 
예를 들면, 철수는 A,  B_1, B_2,  C_5, D 라는 화면이 활성화되어야하고, 영희는 A,  B_3, B_4, C_1, C_5, 라는 화면이 활성화
되어야한다면, (A, 라고 하면 A밑의 모든 하위메뉴는 포함되는 것임.) 
PB의 샘플코드에서처럼 menu를 display하고 enabled를 true/ false로 지정하면 그 작업한 내용은 사용자별로 테이블에 저장되야
합니다. 그리고 다음에 그 사용자가 어플리케이션에 로그인한다면 권한 부여된 메뉴만 활성화되어야겠지요. 
(사용자별로 enabled=false로 될 menu의 name을 string변수로 테이블에 저장됩니다. 
user: 강은경 
str_비활성화될_menu_name : m_file,m_file2,m_file3 
기본적으로 menu는 모두 enabled=true해놓구, 어플리케이션 실행시,   user에해당되는 'str_비활성화될_menu_name'을 테이블에서 
읽어와 ','를 기준으로 잘라가면서   menu_name을 구분하여 m_frame.구분한 menu_name.enabled=false  이렇게 하면 어떨까 
생각중입니다. 그런데, 이 또한 구분한 menu_name부분이 string 이므로 에러가 날듯 싶네요,,
제 생각에 방향이 잡히도록 조언을 듣고 싶습니다.
답변) 
권한관리를 하기위한 방법으로 메뉴의 enabled의 프러퍼티를 조정하여 사용권한을 조정하는 방법을 선택하신거 같군요. 
거기에 따른 권한테이블 구성을 어떻게 하느냐의 사항은 테이블을 잘 설계하여 데이타를 용이하게 저장 및 조회를 하여 기능구현을
효과적으로 할 수있게  하는데 촛점이 맞춰져야 합니다. 먼저 스트링으로 등록하여 특정문자로 잘라서 사용하는법을 생각하신거 
같은데 데이타관리상 좋지않은 설계입니다. 
어떻게 설계하는냐는 저희가 다룰문제는 아니지만 데이타모델링 교육이나 테이블설계에 관련된 교육을 받아보시는편이 좋을것
같습니다. 일반적으로 권한테이블 구성은 유저 ID에 사용가능한 윈도우명이나 사용불가능한 윈도우명을 멀티로 가지고 있거나 
하는 방법을 생각해볼수있는데 많은 윈도우를 관리하여야 한다면 이또한 좋은방법은 아닙니다. 
윈도우의 레벨을 정한다음 그룹으로 묶어서 관리하는 방법을 생각할수도있습니다.


질문)
1. 파워빌더 자료실의 최홍식님께서 올려놓은 파빌9.0으로 PDF만들기에서 Ghostscript로 해서 9.0개발 당시 오류였던 라인 
등의 깨지는 문제점을 해결했다고 했습니다. 
2. 그래서 9.0을 설치해서 PDF파일로 생성은 잘되었습니다. 
3. 그런데, 클라이언트에게 베포시에 pscrptui.dll, pscript.dll파일과 ghostscript를 인스톨되는 폴더 밑에 설치하라고 
했는데, 그렇게 해서 pdf파일을 생성해 봤으나, 생성이 되질 않습니다. 
4. 제가 궁금한것은 베포시 무슨 파일이 필요하며, 또한 꼭 ghostscript를 설치해야지만 되는 것인지 알고 싶습니다.
파빌만으로는 안되는 지요? 된다면 방식을 알려주시면 고맙겠습니다.
답변) 
배포시 필요한 파일은, PSCRIPT.DLL,PSCRPTUI.DLL,PSCRIPT.DRV 이렇게 3가지 입니다.  PSCRIPT.DRV 파일이 빠졌군요. 
아울러, 파빌만으로 되는 방법은 아쉽게도 없습니다. 
Ghostscript 를 이용해서 PDF 로 만들어주는 방법은 해당 DataWindow를 Ghostscript 를 통해서 받아내서 .ps
(Ghostscript 을 통해 생성된 파일) 파일을 PDF 로 파싱해주는 것입니다. 
프린터 등록정보에 보시면 Sybase DataWindow PS 라는 것을 통해서 만들어 지게 됩니다. 
생성되지 않는 곳을 보면,  Sybase DataWindow PS 가 생성되지 않았을 것이며, 이 이유는 해당 DRV 파일이 없었기 때문입니다 .


질문)
Library Tree 에서 마우스 오른쪽 클릭하면 보였던 메뉴(예를 들어... copy.. Migration..등등)의 메뉴를 보려고 하면 파워빌더
자체가 죽어버립니다.
답변) 
다음 사항을 확인해 보시기 바랍니다. 
1. 파워빌더 VM 체크 
    동일 버전의 DLL( PBVM70.DLL, PBDWE70.DLL, LIBJCC.DLL )이 패스상에 여러개 존재하는지 확인 
    파워빌더 Shared 폴더에만 있어야 합니다. 
2. 파워빌더 7 버전을 최종 버전까지 패치 
3. 개발자 O/S 확인 
    Windows 95 또는 98인경우에 알수 없는 오류가 종종 발생하곤했습니다. 
4. 라이브러리( PBL )를 네트웍 드라이버에서 공유하여 사용하고 있는 경우 
   개발자 PC에 라이브러리를 복사하고 개발자 PC에 있는 라이브러리를 가지고 작업한다. 
5. 실제로 라이브러리 페인터에서 보이는 PBL이 깨진 경우 
    다른 PBL을 선택하였을때는 정상적인데, 특정 PBL을 선택했을때만 발생하는 경우에는 라이브러리(PBL)가 
    깨졌다고 의심을 해 볼 수가 있습니다. 이때는 다른 방법이 없습니다. 백업 받은 소스를 다시 사용하셔야 합니다.


질문)
데이타윈도우의 Event중에서 itemfocuschanged라는 Event는 있는데 itemlostfocus는 없는지요? 
column의 focus가 이동하는 시점에 해당column의 값을 체크하여 처리해야하는 내용이 있어서요.
답변) 
없습니다. ItemChanged 이벤트에서 입력한값의 유효성을 체크하시는 방법이 일반적입니다.
특이한 상황을 제외하고는 EditChanged, ItemChanged, itemfocuschanged 이벤트를 활용하여 기능을 구현하시면 됩니다.



질문)
datawindow 에서 Column 의 속성이 number type 이고 datawindow 에서 data 수정시 246 => 삭제하게 되면 나오는 messagebox 
첨부참조 커서도 얾겨 지지 않고 메세지 box 가 나오게 되는데 나오지 않게 하는 방법좀 알려주세요
답변) 
itemerror 이벤트에 Return 1 이라고 기술하시면 됩니다.



질문)
- StartServerDDE(...) 했습니다. 
  해당 윈도우에서 dde server 를 기동했다는 것을 알수 있는 함수 가 있나요?
답변) 
StartServerDDE() 함수의 도움말을 보면 이 함수의 Return 값 중에 -1 이라는 값이 넘어 오면 DDE서버로 이미 실행되어 있다라는 
의미라고 되어 있습니다. 이 함수의 Return 값 -1로 원하시는 일을 할 수 있을 것입니다.


질문)
Sequelink ODBC Edition 을 가지고 Progress를 연결을 했습니다 정상적으로 연결됨. 그리고 나서 파워빌더 Database Profiles
에서 ODBC 설정 방법을 알고싶습니다.
답변) 
우선 파워빌더에서 ODBC 드라이버를 이용하여 연결하려고한다면, "제어판->관리도구->ODBC관리자"에 가서 먼저 
DSN( Data Source Name )을 하나 만들어서 연결이 되는지를 확인합니다. 
이곳에서 연결이 되었다면, 파워빌더의 툴바에 DB Profile에서 ODBC 항목을 선택하고 New버튼을 클릭하여 Data Source 항목에 
제어판의 ODBC관리도구에서 추가한 DSN이름을 지정하고 ID와 PWD를 지정하고 확인하시면 됩니다.


질문)
배포화일로 만들면 db에 커넥이 되지 않습니다. 프로그램상에서 DB연결은 ADO.NET 으로 했구요.. 현재 버젼으로 사용자들에게 
배포할때의 필요한 DLL들을 가르쳐 주셨으면 합니다. 
기존 7점대부터 버젼을 계속 8점대 9점대로 올려서 DLL들이 마구섞여있네요 이참에 정리좀 했으면 합니다.
답변) 
배포 DLL을 잘 모를경우게 가장 간단히 해결하실 수 있는 방법은 Sybase>Shared>PowerBuilder 폴더에 있는 pbpack100.exe 를 
사용 하십시오. 해당 실행 파일은 배포용 실행 모듈을 패키징 해주는 프로그램입니다. 
필요한 항목들만 체크하여 만드시면 아주 간단히 배표용 msi 파일을 만드실 수 있습니다. 
구체적으로 체크를 해보자면 DLL을 체크해 드리면... 
pbvm100.dll 
libjcc.dll    
libjlog.dll 
pbdwe100.dll 
pbado100.dll  - ADO.NET 을 사용하는 경우 
pbdata100.dll - ADO.NET 을 사용하는 경우 
atl71.dll         - 10.2 에서 새로 추가되어 이 DLL 이 없으면 
                      'LoadLibrary Error - The PowerBuilder runtime DLLs could not loaded.' 
                       라고 에러가 발생합니다.    
mfc71u.dll      - PB10 이 MFC 7.1 버전으로 만들어졌기 때문에 필요함 
msvcp71.dll   - PB10 이 MFC 7.1 버전으로 만들어졌기 때문에 필요함 
msvcr71.dll    - PB10 이 MFC 7.1 버전으로 만들어졌기 때문에 필요함 
atl71.dll, mfc71u.dll, msvcp71.dll, msvcr71.dll 은 .net framework 이 설치되어 있으면 대부분 설치가 되어 있지만, 
그렇지 않을 경우 에러가 발생하므로 추가하였습니다.


질문)
MSWINSCK.OCX TCP/IP 프로토콜 RF ID CARD READER 연결 하기 위해 MSWINSCK.OCX를 사용 해보기로 하였습니다.
IP 와 PORT와 통하여 연결을 해보았는데 연결은 되는데 DATA를 가져올수가 없더군요
답변) 
현재 환경을 살펴보니 OS로 Win2003을 사용하고 계시는것 같군요. 
기본적으로 파워빌더 9는 Win2003을 보장하지 않으며, 10.2 버전도 배포용으로만 제한적으로 지원되어집니다. 
파워빌더 9.02가 지원되는 Win NT, Win2000에서 사용하시길 권장 드립니다. 
또한 해당 OCX파일에 대한 문의는 저희의 기술 지원 범위를 벗어난 질문이므로, MS에 문의를 해보시는게 더 정확한 답변을 
받으실 수 있을것 같습니다.


질문)
1. 테이타 윈도우에서 버튼을 배경색을 파란색 글자색을 흰색으로 해서 저자을 하면 데이타 윈도우에서는 버튼이 정상적으로 
화면에 표시가 됩니다. 윈도우내에서 데이타 윈도우을 함께 화면에 표시을 하면 버튼색이 흰색(약간 회색)으로 변경이 되어
글자가 표시가 안됨 - 컴파일후 배포해도 문제가 발생함
2.화면이 4등분됨 
-          데이타 윈도우에서 스크롤바가 작동하지 않음. 현재 나타나 문제점입니다. 
-          이것들은 테마을 "윈도우고전" 으로 변경해서 사용하면 문제 발생하지 않음. 해결방법을 알려주세요. 
요즘들어 XP기본셋팅이 XP테마가 기본인데 이 테마을 "윈도우고전"으로 프로그램 실행시 변경하는 방법이 있음 함께 
-          알려주세요
답변) 
EXE파일을 만들때 옵션을 보시면 New Visual Style Controls 항목이 있습니다. 
해당 옵션을 체크하면 XP 스타일로 컨트롤들이 반영되며, 체크 박스의 체크를 푸시면 윈도우 고전 스타일로 EXE파일이 
생성 됩니다. 
해상 항목으로 체크하여 데트스 해보십시오.
또한 두번째 사항은 구현도 안될 뿐더러 어떤 현상인지 짐작하기가 어렵습니다. 
두번째 사항도 윈도우 고전 스타일에서는 잘 작동하는 사항이라면 위의 사항을 체크하고 테스트 해보시기 바랍니다.


질문)
파워빌더 자체에서 sql server를 지원할때는 이상이 없었는데 (9.0에서도 이상없습니다.) 
파워빌더10에서는 ODBC로 연결을 해야 하더군요 ODBC로 연결후 파워빌더에서 데이터 윈도우 상으로 확인시에는 문제가 
없으나 실행중에 첨부한 이미지의 에러가 뜹니다. 
잘못된 커서라 하는데 커서 조치 바랍니다. 참고로 데이터 윈도우의 쿼리에 아규먼트(:as_date, :as_sno)를 
declare @as_date varchar(08) 
           ,@as_sno varchar(03) 
SELECT @as_date = :a_date 
       ,@as_sno = :a_sno 
이렇게 선언해서 사용합니다. 
마지막으로 파워빌더10부터 sql2000의 디비 프로파일이 사라졌는데 앞으로도 지원계획이 전무한건지 기술적으로 
임시 빠진것인지 답변바랍니다. 
C/S환경에서 sql2000을 접속하려면 현재 사용중인 클라이언트에 ODBC설정을 일일이 다 해줘야하는 상황입니다
답변) 
PB10 에서 MS-SQL의 Native Driver가 빠진 이유는 MS의 정책 입니다. 
PB10 에서는 ADO.NET 또는 OLE Microsoft OLE DB를 사용 권장합니다. 
해당 드라이버가 Native Driver의 역활을 하오니 ODBC 말고 해당 드라이버를 연결하여 테스트 해보십시오.
ADO.NET드라이버가 설치 되기 위해서는 MS .NET Framework이 설치 되어야 합니다. 
MS .NET Framework이 설치되어 있지 않은 경우엔 윈도우 업데이트 사이트에 가셔서 Update하셔서 설치 하시면 됩니다.


질문)
180 * 1024.1 = 184,338 -> 이게 정답인데.. 184,337 이 나옵니다... 
DB에 소수점 밑에 데이타가 있으려니 했는데 그게 아니더군요. 그래서 그냥 External Datawindow로 아래와 같이 생성하였습니다.
aaa -> Decimal(2) 
bbb -> Decimal(2) 
그 다음 컴퓨터 필드를 생성하고 아래와 생성.. 
Truncate(aaa * bbb, 0) 
그 다음에 Preview 하고 Insert 버튼 클릭후 아래와 같이 데이타 입력합니다. 
-------------------------------------------- 
aaa             bbb        Truncate(aaa * bbb, 0) 
180            1024.1          184337 
-------------------------------------------- 
위와 같은 결과가 나옵니다. 계산기로 두드려보면 정확하게 184338이 나옵니다.. 
위의 예제는 현재 달라 금액을 원화로 환산하는 경우이며.. 원화 환산시에는 소수점 이하는 절사를 해야합니다.
답변) 
데이타윈도우  Truncate() 함수의 파워빌더 HELP의 내용을 보시면 computed field에서 사용하실때 
Truncate (x + 0.0000001, n )로 해야 한다고 나와있습니다. 불편하지만 메뉴얼대로 사용하는방법과 스크립터로 계산을 하셔야 
합니다.


질문)
PB6.5 에서 PB10로 Migration중에 Error발생 하였습니다. 
C0114: Error scanning object source entry: ac500_wm 
Error가 나타나서 Regenerage를 해봐도 똑같은 Error가 나타납니다. Error의 원인이 무엇인지 알고 싶습니다. 
교육은 7월에 받을 예정인데 미리 한번 작업을 해볼려고 했던 것입니다.
답변) 
Error scanning object source entry 라는 것은 해당 오브젝트가 제대로 Migration 되지 않았을 때에 발생되는 것입니다. 
6.5 버전에서, 해당 Object 를 export 하신후, 파워빌더10에 pbl 에 import 하시고, Regenerate 를 다시 해보시기 바랍니다.
만약, 이 오브젝트가 상속 받아진것이라면 조상단 또한 동일 작업을 해주십시요.


질문)
decimal type(10진수)의 데이터를 hexa type(16진수)의 데이터로 바꾸는 법을 알고 싶습니다. 
파워빌더 자체에서는 이런 함수가 없는 것 같은데, 이와 관련된 소스가 있으시면 알려주시면 감사하겠습니다.
답변) 
Long → Hex (String Type) 변환 Function 예제입니다. 
public function string of_convert_long_to_hex (long al_value); 
ulong    ll_value 
string   ls_hex[] = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"} 
string   ls_return 
ll_value = al_value 
do 
   ls_return = ls_hex[mod(ll_value,16)+1] + ls_return 
   ll_value /= 16 
loop while ll_value > 0 
return ls_return 
end function


질문)
window 의 control[] 과 같이 Datawindow 내의 control을 배열로 가저와서 활용하고 싶습니다. 가능한지요.
답변) 
dw_controlname.object.__get_attribute("ColumnName",TRUE) 함수를 이용하면 DWObject 를 구할 수 있습니다. 
아래 예제를 참고하세요. 
dwobject ldwo_controls[] 
string   ls_controls, ls_control 
integer  li_fr_pos, li_to_pos, li_cnter 
ls_controls = dw_1.describe("datawindow.objects") 
li_cnter = 0 
li_fr_pos = 1 
li_to_pos = pos(ls_controls, '~t') 
do while (li_to_pos > 0) 
   ls_control = mid(ls_controls, li_fr_pos, li_to_pos - li_fr_pos) 
   li_cnter += 1 
   ldwo_controls[li_cnter] = dw_1.object.__get_attribute(ls_control, true) 
   li_fr_pos = li_to_pos + 1 
   li_to_pos = pos(ls_controls, '~t', li_fr_pos) 
loop 
ls_control = mid(ls_controls, li_fr_pos) 
li_cnter += 1 
ldwo_controls[li_cnter] = dw_1.object.__get_attribute(ls_control, true) 
for li_cnter = 1 to upperbound(ldwo_controls) 
   messagebox('dwo name', string(ldwo_controls[li_cnter].name)) 
next


질문)
칼럼길이가 싸이즈 만큼 데이타가 자동으로 맞추어서 정렬되는 기능을 사용하고 싶습니다. 
--- Detail Explanation ----- 
Property For Column 
General Tab,  Alignment에서 justify를 선택하면 실행 되어야 하는 기능입니다.
답변) 
파워빌더 헬프 중 Alignment 의 Justify! 부분을 보시면 아래와 같습니다. 
"Wrapped text is justified. The last line of text is not stretched to fill the area. So for a single line of text, 
justified alignment will appear to have no effect." 
즉, 마지막 라인은 Stretch 되지 않기 때문에 Single Line 에는 효과가 없습니다. 
Justify 속성은 Multi Line 편집 시 에만 적용됩니다.


질문)
PB10/Informix9.4/InformixNet(ClientSDK) 환경에서   DB 테이블 내용을 조회하여 다른 테이블에 Insert 하는 경우 에러발생함. 
- 에러: PowerBuilder Fatal Error 
        Please contact Sybase supporting engineer 
- 참고로 PB10은 최근 패치버젼(PB10 Build 5502,...,8035)을 모두 설치한 상태입니다. 
- PB7,8,9 에서는 정상적으로 잘 작동되는 프로그램입니다. 
- 아무래도 PB10의 치명적 결함인것 같습니다. 
- 참조화일: kimm.sch(스키마), kimm.unl(텍스트데이터), kimm.xls (엑셀데이터) 
            penta.pbl(PB예제화일) 
- 버튼의 script 는 아래와 같습니다. 
-------------------------------------------------------------------------------------------------------------- 
string t_pno, t_name_h, t_kcode01_code_nm, t_kcode03_code_nm 
string t_car_no, t_driver, t_flag 
integer chk_exist, cnt 
cnt = 0 
//// KIMM -> 복사 -> kimm_test 예제 
DELETE FROM KIMM_TEST ; 
DECLARE cursor_kta CURSOR FOR 
      SELECT pno, name, dept_nm, jikgup, car_no, car_driver, flag 
              FROM   kimm 
      order  by pno ; 
OPEN cursor_kta ; 
DO WHILE sqlca.SQLCode = 0 
FETCH cursor_kta 
INTO :t_pno, :t_name_h, :t_kcode01_code_nm, :t_kcode03_code_nm, :t_car_no, :t_driver, :t_flag ; 
IF sqlca.SQLCode <> 0 THEN 
CONTINUE 
END IF 

t_pno = trim(t_pno) 
t_name_h = trim(t_name_h) 
t_kcode01_code_nm = trim(t_kcode01_code_nm) 
t_kcode03_code_nm = trim(t_kcode03_code_nm) 
t_car_no = trim(t_car_no) 
t_driver = trim(t_driver) 
t_flag = trim(t_flag) 

INSERT INTO kimm_test 
(pno, name, dept_nm, jikgup, car_no, car_driver, flag) 
VALUES 
(:t_pno, :t_name_h, :t_kcode01_code_nm, :t_kcode03_code_nm, :t_car_no, :t_driver, :t_flag) ; 
IF SQLCA.SQLCode = -1 THEN 
MessageBox('Insert 에러', 'during insert kimm_test') 
ROLLBACK USING SQLCA; 
return 
END IF 
cnt++ 
LOOP 
CLOSE cursor_kta ; 
COMMIT USING SQLCA; 
MessageBox('종료', '레코드 수 : ' + string(cnt)) 
답변) 
먼저 데이터베이스 연결 옵션에 SQLCA.DBParm = "DisableBind=1" 이 부분을 추가하고 테스트 해 보시기 바랍니다. 
정확한 오류의 내용이 보일 것입니다. 저희가 보내주신 파일을 참고로하여 테스트 했을때 별 문제 없이 제대로 들어가는 것을 
확인하였습니다.


질문)
조회건수가 2000장 입니다. 프린트 옵션에서 range에 1-999 까지는 제대로 출력이 되는데요.. 
1000장 이상만 들어가면 1페이지 부터 출력이 되거든요 ? 소스코드는 별 이상이 없는듯 한데..부탁드립니다.
답변) 
페이지의 범위를 주실때 아래와 같이 - 앞 뒤로 스페이스를 주고 테스트 해보십시오. 
======================================================= 
dw_1.Object.DataWindow.Print.Page.Range='1000 - 1001' 
======================================================= 
현재 테스트 했던 PC는 파워빌더 9.0 #7171 버전에서는 위와같이 설정을 하지 않아도 제대로 출력 되는걸로 봐서는 Build 버전에
따라 약간의 차이가 있는 듯 싶습니다. 
일단 위와 같이 - 앞뒤로 스페이스를 주고 테스트 해보십시오.
만일 테스트 후에도 동일하다면 Buil 번호를 되는 버전으로 맞추는 차선책을 선택 하셔야 할 듯 싶습니다.


질문)
PowerBuilder 7.0.3 버전에서 PB10.0으로 업그레이드를 실행하던 중에 발견된 문제점 들입니다. 
[Table 구조] 
g_cd VARCHAR2(04) /* 과목코드(NEiS) */ 
o_cd VARCHAR2(04) /* 과목코드(csa) */ 
g_name VARCHAR2(50) /* 과목명 */ 
[오동작 데이터 ※Tab을 구분자로 함] 
// 과목코드, 과목코드(csa), 과목명 순 
6412, C/S, 셑트롤 
1423, 'C/S', 롤러컽 
▶ DB연결시 Disable Unicode Support에 체크하고 필드에 직접 데이터를 입력 후 저장하면 
셑트롤에서 '셑' 한글자만 저장되고 이후 수정, 삭제 모두 불가
답변) 
이전에 질문하신 DB 한글 인식문제와 같은 증상입니다. 
KSC5601 에는 존재하지 않는 '셑', '컽' 캐릭터를 사용했기 때문에 발생하는 현상입니다.  
이는 Disable Unicode Support 옵션을 선택하고, Disable Bind 기능을 활성화 시키면 이상없이 저장됩니다만, 근본적인 해결책은
MSWIN949 캐릭터셋을 이용하셔야합니다.


질문)
** 기본 환경이 한글/중문 같이 사용 하는 환경입니다.
1. PB10을 사용하는데... 지원 가능한 OS 버젼은 어떤것 인가요(win 2000 에서 사용 가능 한가요)? 
2. 런타임 DLL 배포시 기존사용한(PB7) DLL 과 겹치거나 충돌나는 DLL들이 있는지요? 
3. 현업사용자와 개발자가 한 PC에서 PB7 과 PB10을 같이 사용 가능한가요? 
4. 환경 
   -- ORACLE -- 
   DICT.BASE               2 
   DEFAULT_TEMP_TABLESPACE TEMP 
   DBTIMEZONE              +00:00 
   NLS_LANGUAGE            AMERICAN 
   NLS_TERRITORY           AMERICA 
   NLS_CURRENCY            $ 
   NLS_ISO_CURRENCY        AMERICA 
   NLS_NUMERIC_CHARACTERS  ., 
   NLS_CHARACTERSET        UTF8 
   NLS_CALENDAR            GREGORIAN 
   NLS_DATE_FORMAT         DD-MON-RR 
   NLS_DATE_LANGUAGE       AMERICAN 
   NLS_SORT                BINARY 
   NLS_TIME_FORMAT         HH.MI.SSXFF AM 
   NLS_TIMESTAMP_FORMAT    DD-MON-RR HH.MI.SSXFF AM 
   NLS_TIME_TZ_FORMAT      HH.MI.SSXFF AM TZR 
   NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR 
   NLS_DUAL_CURRENCY       $ 
   NLS_COMP                BINARY 
   NLS_LENGTH_SEMANTICS    BYTE 
   NLS_NCHAR_CONV_EXCP     FALSE 
   NLS_NCHAR_CHARACTERSET  UTF8 
   NLS_RDBMS_VERSION       9.2.0.1.0 
   
   -- CLIENT -- 
   OS  - 중문 XP 
   레지스트리 - KO16MSWIN949 사용 
   글씨 폰트  - Arial    
   위와 같은 환경에서 PB7로 개발된 프로그램으로 자료입력(간체) 
   PB 10에서 PB7로 입력한 자료 조회시 간자체 깨짐. 
   글자 깨짐을 없애는 방법은 무엇인가요?
답변) 
1. PB10을 사용하는데... 지원 가능한 OS 버젼은 어떤것 인가요(win 2000 에서 사용 가능 한가요)?  
   윈도우 XP(SP2) / 2000(SP4)/ 2003(배포) 을 지원합니다.   
   파워빌더 Technote 자료실 → '파워빌더의 버전별 비교자료 (8, 9 10)'를 참고하세요.  
2. 런타임 DLL 배포시 기존사용한(PB7) DLL 과 겹치거나 충돌나는 DLL들이 있는지요? LIBJCC.DLL 하나가 이름이 겹칩니다. 
3. 현업사용자와 개발자가 한 PC에서 PB7 과 PB10을 같이 사용 가능한가요? 
   현업사용자는 버젼별로 각각 실행파일 설치 폴더를 달리하고 DLL 파일도 설치 폴더에 위치시키세요. DLL 파일을 PATH 
설정된 폴더(예 system32 폴 더) 에 위치시키면LIBJCC.DLL 파일이 충돌합니다. 개발자는 PB7 과 PB10 을 설치 폴더를 달리해서 
사용하실 수 있습니다. 
   예) C:\SYBASE\PB7\PowerBuilder 7.0 
       C:\SYBASE\PB10\PowerBuilder 10.0 
4. PB 10에서 PB7로 입력한 자료 조회시 간자체 깨짐. 글자 깨짐을 없애는 방법은 무엇인가요? 
   PB7 에서 어떤 방법으로 중국어를 입력하셨는지 모르겠지만, PB10에서 다국어를 사용 하시려면 DB 클라이언트 설정도 UTF8 로
설정하세요.


질문)
자료중 첨부파일로 저장해야 하는 경우가 있는데 이런 경우는 어떻게 처리하는지요. 
장애접수를 처리하는 업무인데 접수내용중 파일을 첨부하여 저장해야는 경우입니다. 
EAServer를 사용하여 구현하려고 하는데 방법을 알켜주시기 바랍니다.
답변) 
1. 직접 UPLOAD 할 파일을 읽어 BLOB 형태로 서버에전송 서버에서는 이 BLOB 데이터를 특정 폴더에 FILEWRITE 하거나 DB 에
UPDATEBLOB 합니다. 
2. FTP 방식을 이용한 전송 
   파워빌더 자료실의 'FTP서버에 File Upload, Download, Delete하기' 를 참고하세요.


질문)
vc++ 작성된 ocx 를 사용하는데 함수 파라미터가  VARIANT 형입니다. 파워빌더에서  VARINANT형을 사용하는 방법이 있을까요?
답변) 
VC의 VARIANT 타입은 파워빌더의 ANY 타입으로 대응가능합니다. 다만, ANY Type은 External Function 호출 시 
Pass By Reference 방식을 지원하지 않습니다. Pass By Value 방식으로 사용가능한지 확인해 보시기 바랍니다.
또한, PB10 인 경우 송.수신하는 데이터 String Character Type을 맞춰주셔야 합니다. (Ansi 혹은 Unicode)


질문)
datawindow 에 구성시에 두개의 datawindow 배치법을 알고 싶습니다. 
하나의 datawindow 를 생성하고 화면을 반을 나누어서 왼쪽은 A list 가 조회되고 오른쪽은 B list 가조회되고 두개의 List 는
각각 row수도 틀리며 별개로 조회가 되어야 합니다. datawindow 생성하고 report 2개를 사용하니 보여지는 화면이 Report
양식으로 나옵니다. 한개의 datawindow 에서 2개의 List 를 조회 할 수 있는 법좀 부탁합니다. 
답변) 
현재 사용하신 방법대로 Nested Report를 사용하시는 방법도 하나의 방법이 될 수 있으나 궁극적인 사용 목적과는 다소 거리가 
있습니다. 
Nested Report는 Row Base의 Detail 한 정보를 보여주기 위해 사용하는 Datawindow이므로 현재와 같이 각각 다른 
Datawindow를 하나의 Datawindow에 Display하시는 방법으로는 Composite Datawindow를 사용하시는게 맞습니다. 
Datawindow를 생성하실때 Composite 을 선택하시면 여러개의 Datawindow를 선택해서 설정하실 수 있습니다. 
Composite DW를 사용해 보십시오. 단 한가지 숙지 하셔야 할 점은... Nested Report나 Composite Datawindow는 Report 전용 
Datawindow라는 사실입니다. 그렇기 때문에 화면 조회시 Print Preview 모드로 나타납니다. 
위에서 제시한 두가지 방법의 Datawindow를 사용하는 방법으로는 Report Type이 아니길 바라는건 불가능합니다.
유감스럽게도 Report Type이 아닌 형태로 데이터를 각각 조회하시려면 Datawindow Control을 두개 사용하시는 방법밖엔 
없습니다.


* 락(樂)님에 의해서 게시물 이동되었습니다 (2005-08-10 08:47)
Posted by Julyus