PowerBuilder Q & A, August 2009

질문1)
로그인을 하면서 mdi 프레임을 사용하여 특정 사용자에 따라서 메뉴를 다르게 하고 싶은데 방법을
부탁합니다.
예) mdi 프레임의 open event 에서
if gr_user_level='master' then
this.menuname = 'm_menu_master'
elseif gr_user_level='member' then
this.menuname = 'm_menu_member'
else
this.menuname = 'm_menu_null'
end if
이런식으로 실행하고 싶습니다
질문2)
파워빌더에서 작성한 텍스트 색상과 appeon web상에서 실행하면
텍스트 색상이 다르게 나타 납니다
예) 색상을 노랑색인데 검정색으로 나타납니다


질문1)
ChangeMenu() 함수를 사용하세요.
질문2)
PictureButton 텍스트 컬러는 PowerBuilder11 부터 지원가능합니다.
아직 Appeon에는 반영되지 않았기 때문입니다. 이 부분은 어느 버전에서
지원할 계획인지 확인해보겠습니다.


데이타윈도우의 칼럼에 포커스를 놓고 바코드를 스캔하면 스캔한 내용이 보입니다.
이 경우 2~3초후에 자동으로 후프로세스를 실행하고 싶은데 데이타윈도우 컨트롤 이벤트에는
timer이벤트가 없어서 방법을 모르겠습니다. 조언을 바랍니다.


정확하게 하시고 싶은 일이 어떤 일이신지요?
만약, 스캔후, 다른 컬럼을 찍고 또 스캔을 한다면, itemchanged 이벤트 쪽에 작성하시면
될 것이며. Timer 를 사용해서 주기적으로 하고 싶다면, 마찬가지로 Editchanged 쪽에
Timer 함수를 이용해서, 윈도우명을 지정하시고, 해당 윈도우의 Timer 이벤트 쪽에다가
각각의 컬럼으로 focus를 가지게 하면 되겠습니다.

group에서요 다른값이 몇개나 있는지 알고 싶은데 그럴경우는 어떻게 해야 하나요?
예를 들어, group 1에 10개 데이타중에서 a => 6, b => 4인 경우 a,b 두가지 이므로 2가 나오게
하고 할때 어떻게 해야되는지?
인포믹스같은 경우는 select count(distinct date) from dual 이런식으로 처리하면 되는데
compute expression에서는 어떻게 해야되는지 알려주세요

cumulativeSum( 1 for all distinct 그룹컬럼명 )을 이용하시면 됩니다.
감사합니다.


파워싱크 버전 : 2.9.4
증상: 새 프로그램을 개발 후 컴파일 후 파워싱크로 올렸으나 다음의 에러가 남
External DLL function getwindowsdirectorya cannot be called from a secured session at line
11 in ue_postopen event of object w_window 의 메시지 박스가 나옵니다.
특이?증상으로는 이 에러가 나온 이후 기존에 잘되던 프로그램도 새로 컴파일 한 경우는 위
에러가 납니다.
일전 비슷 증상건을 검색해서 답변에 나온거처럼 해당 사용 DLL을 체크해봤으나 윈도우폴더의
system32폴더에 아래 dll이 존재하는것을 확인했습니다.
FUNCTION ulong GetWindowsDirectoryA(ref string wdir, ulong buf) LIBRARY "kernel32.dll"

windows\system32 디렉토리에 보시면 pbrxs100.ocx 파일이 있을 겁니다.
이게 있으면 말씀하신 증상이 나타날 수 있습니다. 이 파일을 제거하면 말씀하신 증상이
사라집니다. ( PowerBuilder설치디렉토리\Shared\PowerBuilder 디렉토리에 있을 수도
있습니다. 이것도 찾아서 지우시는 것이 좋습니다)

소스 형상관리를 하고 싶습니다. Properties of Workspace 에 보면 source Control 탭에
Source control system : PB Native
user ID : ?
project : ?
Local Root Directory : ?
이렇게 되어 있습니다.
혹시 파빌11버전에서 자체적으로 형상관리(소스버전관리)가 가능한지?
만약 된다면 설정하는 방법좀 알려주세요
자세히좀 설명부탁드립니다.

Subversion 과 Apache , Pushok가 필요합니다.
이 부분은 검색해서 다운 받으시면 됩니다.
* 서버 구성
1. Apache 를 설치합니다.(2.x 버전) 2.2 와는 동작되어지지 않습니다.(버전에 주의하십시요)
2. Apache 설치 시 다음과 같은 화면이 나오는데 꼭 Apache modeule 부분을 체크해야 합니다.
3. Apache 의 Bin 폴더를 Path 에 추가합니다.
4. Subversion 을 설치합니다.
5. 저장공간 설정 ( cmd 에서..)
svnadmin --fs-type
fsfs create d:/svn/repository
위와 같은 명령을 통해서 svn repository 로 사용할 저장공간을 생성합니다.
6. 유저 설정 ( cmd 에서..)
htpasswd -cm e:/svn/svn-auth-file 유저명 을 통해 한명이상인 경우는 PPT 내용 참조.
7. httpd.conf 파일 modify ( 첨부 문서 참조)
LoadModule cgi_module modules/mod_cgi.so
LoadModule dav_module modules/mod_dav.so
위와 같이 두줄의 주석이 없는 것을 확인
이후에 맨 마지막에
DAV svn SVNPath d:/svn/repository Require valid-user # how to
authenticate a user AuthType Basic AuthName "Subversion repository" AuthUserFile
d:/svn/svn-auth-file
이 부분을 작성합니다.
여기까지 하고, Apache 서버가 정상작동되는것을 확인하면 서버쪽 설정은 끝난것입니다.
*
태그내의 /repos는 나중에 http로 접근할 때 http://서버주소/repos형식으로 붙입니다.
* Client 설정
1. svnscc.msi , TortoiseSVN-1.3.5.6804-svn-1.3.2.msi 를 설치합니다.
Proxy 먼저 설치합니다.
2. PowerBuilder 에서 설정
참고사항 Site 를 참고 하시고, User id 를 cmd 에서 작성한 id 로 설정
Project 를 눌러서 설정
3. 접속하시는 url 을 http://서버주소/repos 로 설정하시기 바랍니다.
4. connect 확인하시기 바랍니다.
참고 사항 Site :
http://dm.char.com.ua/pb/pbscc/pbscc.htm ,
http://dm.char.com.ua/pb/pbscc/qstart.htm


현재는 PBW 가 전혀 열리지 않습니다. 다른 application 의 PBW는 열림.
에러발생과정 : 배포파일 생성 중 갑자기 파워빌더 프로그램이 다운됨
=> 다시 파워빌더 실행하고 해당 PBW 을 오픈하니까 이전버전이므로 Migrate 해야된다는
메시지 표시됨.
=> Migrate 수행하고자 [OK] 를 누르니까 다시 파워빌더가 다운됨.
=> 이후로는 에러메시지도 표시되지 않고 PBW가 열리지 않음.
아마도 PBT 파일에 문제가 있는 것 같음


현재 PBW가 안열리면, PBT가 에러가 있으신 경우인 것 같습니다.
Temp로 임시 PBT를 생성하신 다음에 에러가 난 PBT의 PBL들을 PBT에 붙여주신 후에,
해당 PBL들의 오브젝트들을 우클릭 Regenerate 하시면 소스가 잘못된 것들이 있을 거고,
수정해서 반영하시면 정상적으로 동작합니다.
감사합니다.


===== 1. 스크립트 구문 ===
if w_emr_gcare.dw_1.update() <> 1 then
rollback using sqlca;
Messagebox('오류','등록에 실패하였습니다.')
return
end if
commit using sqlca;
===== 2. 테이블 업데이트 속성 ===
- Allow Updataes : check
- Table to Update : NURWSKD(테이블 명)
- Where Caluse for Update/Delete : Key Columns 선택됨
- Key Modification : Use Update 선택됨
- Updatable Columns : 모두 선택됨
- Uniqye Key Column(s) : PK만 선택됨
===== 3. 기타 정보 ===
1.해당 데이타 윈도우는 sheet에 존재합니다.
2.popup 창에서 작업을 합니다.
3.작업을 마친 후 popup 창에서 sheet에 있는 데이타 윈도우를 update합니다.
4.해당 프로그램의 로직뿐만 아니라 모든 작업이 가장 많이 발생하는 낮에는 전혀 문제없습니다.
5.해당 로직이 주로 발생하는 야간시간에 Locking이 발생합니다.
6.데이타윈도우에 대한 Update구문에서 Rollback이나 Commit를 거치지 않고 Locking이 발생
할 만한 소지를 찾아볼 수 없습니다.
7.유독 해당 로직이 많이 아니 해당 로직만 주로 발생하는(그래도 낮에보다는 덜합니다.) 밤에
locking이 발생합니다.
===== 4. 문의사항 ===
1.단순히 데이타윈도우를 업데이트 하는데 commit이나 rollback가 되지 않고 locking이 발생
할 수 있는지요?
2.해당 spid를 kill 시키면 다른 spid의 동일한 로직에서 또다시 locking이 발생합니다.

Where Caluse for Update/Delete 와 Key Modification 은 원하시는 연유에 의하여 현재
사용하고 계신 것으로 옵션을 변경한것이시죠?
그에 대해서는 아신다는 가정하에 말씀드리면, 현재의 상황설명으로는 뚜렷히 이유를
찾기가 힘드네요. Trace를 걸어서 실제 Query 가 어떻게 나가는지 원인을 분석해 보시기
바랍니다. Trace 설정 방법은 DB 연결 정보의
SQLCA.DBMS = "XXXX" 이 부분을 SQLCA.DBMS = "TRACE XXXX" 로 바꾸고 실행 하시면
원하시는 부분에 로그를 생성 시키실수 있습니다.


composite datawindow 안의 여러개의 Datawindow중 한개만 숨기고 싶은데요.
getChild한 object에서 visible 기능이 없네요.. 방법이 없을까요.
DatawindowChild ldw_child
this.retrieve()
this.setredraw(false) //this.setredraw(true)
this.getchild('d_child_1', ldw_child)
ldw_child.setdetailheight( 0, 0, 0)
위의 코딩처럼 visble 기능이 없어 setdetailheight 을 이용을 하니 비슷한 기능을 취할 수
있었지만, 하지만 이상하게도 화면이 뒤엉켜버립니다. (composite내에 10개 정도의 dw가 배치되어
있습니다.)
결론, composite datawindow 내에서 특정 Datawindow 를 숨기거나 사이즈등을 0으로 만들 수
있는 방법이 없을까요?


Composite 데이터윈도우 안에 있는 데이터오브젝트에 접근하는 방법은 아래와 같습니다.
DataWindow Syntax툴에서 Report로 접근을 하시면, Visible 속성을 제공합니다.
소스는 아래와 같습니다.
.Object..Visible='<0>'
적용하시면 정상적으로 동작합니다.
감사합니다.


오라클데이타의 어떤 테이블에서 특정컬럼이 varchar2(2000)이고 이런 컬럼이 5개가 있습니다.
그런데 이 테이블과 컬럼에 신규 입력시 dw_1.update()를 실행하면 다음과 같은 에러가
발생합니다. 각 항목에 null 없이 입력하면 신규저장이 됩니다.
데이타베이스 엑세스 에러가 발생했습니다. dberrorcode=1461 디버깅을 해보면
ORA-01461: LONG 값은 LONG 열에만 입력할 수 있습니다
No changes made to database.
INSERT INTO "SUE300TL" ( "SUE300_YEAR", "SUE300_SMT", "SUE300_CURI_NUM",
"SUE300_COURSE_CLS", "SUE300_GRAD_DIV", "SUE300_TEACH_OJT", "SUE300_ESTIMATE",
"SUE300_USER_ID", "SUE300_PGM_ID", "SUE300_UPD_DT", "SUE300_LANGUAGE", "SUE300_TEST_DIV",
"SUE300_SUSI", "SUE300_MIDDLE", "SUE300_LAST", "SUE300_ATTEND", "SUE300_REPORT",
"SUE300_DISCUSSION", "SUE300_ATTITUDE", "SUE300_ANNOUNCE", "SUE300_SERVICE",
"SUE300_TEST_ETC", "SUE300_OPEN_DIV", "SUE300_SYNOPSIS", "SUE300_TEST",
"SUE300_ASSIGNMENTS", "SUE300_INPUT_DT" ) VALUES ( :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 )
이렇게 발생합니다.

어제 원격으로 환경 및 스크립트등을 살펴본 결과 가장 먼저 확인해 보셔야 할 사항은
스크립트 중에 변수값을 할당받아 초기값을 셋팅해주는 부분에서 IsNull() 함수만을 이용해
비교해주셨는데.. 빈스트링일 경우 ( ls_test = '' ) 도 반드시 스크립트로 체크해주셔야
합니다. 하여 DB에서 값을 가져와 변수로 할당 받을시에는 아래 패턴에 맞추어서 작성해
주시기 바랍니다.
==========================================
IF IsNull(변수명) OR 변수명 = '' THEN
// 설정값
ENDIF
==========================================
어제 해결은 DB와 연결하는 SQLCA의 프로퍼티 설정부분에 다음과 같이 적어준다음 실행하여
정상 동작을 확인하였습니다.
-----------------------------------
SQLCA.DbParm = "DisableBind = 1"
-----------------------------------
DisableBind는 SQL문장을 DB에 저장시키고 파라메터만 넘기는 것을 사용하지 않겠다. 라는
의미입니다. "DisableBind = 0" 으로 설정하게 되면 변수에 값을 할당하지 않은 상태에서
DB쪽에 쿼리를 던지게 되고 이 쿼리를 DB에서는 문법검사만을 하고 난 다음 가지고 있게
됩니다. 이후 클라이언트쪽에서 조회에 필요한 파라메터들을 DB로 보내게 되면 이미 검증된
문법을 가지고 있으므로 문법의 오류는 체크하지 않고 바로 결과를 리턴해주게 됩니다.
"DisableBind = 1" 로 설정하게 되면 쿼리를 던질때마다 문법을 체크해주게 됩니다. 그
문법 안에 아귀먼트가 필요하다면 해당 아귀먼트에 해당 값을 정확하게 집어넣어 항상
완벽한 SQL 문장을 날리게 되는 것입니다.
물론 값이 설정된 상태에서 DB쪽에 요청을 하는 것이기에 정확하게 요청은 가능하나, 매번
문법의 검증을 거쳐야 하고, DB에 부하를 주게 되어 결과물을 생성하는데도 그 만큼의
시간이 소요될 수 있다는 단점을 가지고 있습니다.
좀더 정확한 쿼리의 내용을 보고 싶으시다면, 각 옵션에 따라서 어떻게 쿼리가 보이는지
DB Trace를 걸어서 로그로 남겨 확인해 보실수도 있습니다.
(DB Profile > Connection tab > Generate Trace 체크)
(DB 연결 스크립트의 "SQLCA.DBMS = "TRACE o90 ... " 처럼 Trace 키워드 추가)
본론으로 들어가 말씀을 드리자면..
현재 발생되는 에러는 "ORA-01461" 즉, 오라클쪽 에러입니다.
파워빌더는 생성된 쿼리를 DB쪽에 보내주는.. 역할만 하게 됩니다. (발생된 에러를 뿌려주는
역할을 할 뿐입니다.)
좀더 정확하게 말씀드리면면, 파워빌더가 자체가 DB와 관련된 일을 처리해 주는 것이
아니라, 트렌젝션객체(SQLCA)를 통해서 -> DB 인터페이스( -> DB 클라이언트 를 통해서
처리를 하게 됩니다. 오라클 에러를 많이 질문해주시는데, 근본적인 해결방법은 오라클
입장에서 접근하여 해결을 하셔야 합니다. 많은 검색 사이트에서 해당 에러로 검색을 먼저
해보시기 바랍니다. 파워빌더뿐 아니라, Java를 가지고 개발을 하거나, 웹 개발을 하거나..
등등에서 많이 발생되는 경우를 보시게 될 것입니다.
그때의 해결책을 역시 살펴보면, 툴에서 무언가를 해서 해결을 했다.
라는 답변은 없습니다. DB의 어떤 어떤 설정을 바꾸었더니 되더라.. 어떤것이 문제였더라..
등등의 DB와 관련된 해결책을 확인해 보실수 있을것입니다.
저희도 같은 내용으로 검색을 해본결과
=============================================
- http://blog.dreamwiz.com/leppk/10342196
=============================================
해당 블로그에 가장 깔끔하게 정리가 되어 있었습니다.
글의 가장 아랫쪽을 보시면.. 결론적으로 해결책에 대한 내용이 적혀져 있습니다.
그부분을 참고하셔서 접근을 해보시기 바랍니다.
DB와 관련된 부분이라 툴입장에서 직접적으로 도움을 드리지 못하고 이론상으로 말씀을 드리는
점 많은 양해바랍니다. 감사합니다.


파워빌더로 구현한 프로그램(C/S환경)에서 장비(삼성에어컨)쪽으로 XML을 이용한 통신을 할려고
합니다. 즉, 객실Check-In을 하면 XML 통신을 이용하여 에어컨이 자동으로 ON 대도록...
문제는 소켓통신이라고 하는데,통신용 DLL은 제공되지 않고... 소켓통신으로 해당 장비와
Connection만을 확인하고, 나머지는 XML로 내용을 보내면 된다고 합니다.
파워빌더에서 XML 통신을 한다고 하면, 어떻게 구현을 해야 하는지... XML의 기본형식인
ROOT, HEADER, METHOD 테그를 한거번에 보낼수 있는것인지...
XML 통신 예제나 설명이 필요합니다. 도와주세요.


일단 파워빌더는 소켓통신을 할 수가 없습니다. 그렇기 때문에 소켓통신을 위한 DLL이나
ActiveX 같은 모듈이 필요 합니다. 그리고 XML은 PowerBuilder9에서 부터 지원을 하고
있으며 Datawindow에서 또한 스키마를 작성하여 XML로 뽑아 낼 수 있습니다.
문제는 소켓통신을 위한 DLL 또는 ActiveX모듈은 컨트롤 하려는 제품 제조회사에서 제공을
받거나, 따로 만드셔야 할 것 같습니다.


하나의 데이터윈도우에 4개의 Nested DW가 있습니다. 이중에 하나의 Nested DW를 엑셀로
저장하고 싶습니다. 어떻게 해야 하는지요.


지금은 기본적으로 하시는 목적에 맞지 않는 작업을 하려고 하고 계신 것 같습니다.
네스티드의 목적은 아시겠지만, 마스터 디테일 구조의 데이터윈도우 입니다.
마스터에 따라 디테일이 조회가 되는 식이고, 그에 따라 기본 데이터윈도우에 디테일에
해당하는 데이터 오브젝트들이 끼어 들어가있는거죠.
또한, 예를 들어 프린터를 한다고 생각을 하면, 기본적으로
dw_xx.Print() 이렇게 사용 하게 됩니다.
그런데 지금같은 경우 저렇게 출력을 하면 원하시는 Nested Report 안에 있는
데이터오브젝트 하나만이 아닌 모두 출력이 되겠죠. 4개중 하나만 출력하고 싶으시다면?
당연히 그 출력하고 싶으신 데이터윈도우를 따로 빼서 출력해야겠죠.
출력할 때는 Nested에서 Master가 조회될 때 아규먼트를 그대로 주어서 출력하면 되겠죠.
각각의 객체에는 그에 따른 목적이 있습니다.
그 목적에 맞게 사용하시면 정확하게 하고자 하시는 것을 구현하실 수 있습니다.
또한 이러한 내용들은 헬프에도 자세히 나와있구요.
감사합니다.

Popular posts from this blog

5.1.2 - Bad destination host 'DNS Hard Error looking up