Sunday, November 18, 2007

Appeon 화면 웹에서 인수 전달 방법, EA server Connection Cache를 자바에서 이용 방법

1. Appeon 으로 생성한 화면에서 인수 전달 방법
톰켓과 JSP를 사용 하여 만든 웹 사이트에 Appeon으로 만들 파빌 화면을 껴 넣어 작동 시키려고 합니다.
로그인 인증을 Appeon상에서 다시 받지 않고 JSP에서 로그인 한 값을 같이 사용 하려 합니다.

로그인 인증을 톰켓에서 하므로 세션이나 쿠키값이 톰켓을 상대로 저장 되어서 직접적인 사용은 힘들게
생각 되어, JSP에서 로그인시 세션 키 값을 유저 정보에 넣어 주고, JSP에서 Appeon페이지를 부를 적에
UserID와 비번, 그리고 세션키를 Form방식으로 전송 하여 Appeon페이지가 해당 값을 가지고 DB를 통하여
세션키 유무와 UserID, 비번을 비교 하여 화면을 보여 줄지 말지를 판단 하려 합니다.

질문... Appeon페이지로 Post방식이나 Get 방식의 인수를 넘겨 주려면 어떻게 해야 하나요?

답..

1. appeon에 파라메터 보내는 방식은 Get 방식으로만 넘길 수 있습니다.
appeon으로 만든 webapplication에 get방식으로 넘기시면 됩니다.
appeon에서 받아 들일수 있는 파라메터는 powerbuilder에서 처럼
application object에서 commandparm()함수를 이용하여 받을 수 있습니다.
말씀 하신 것처럼 form방식으로 보내신다면 PowerBuilder에서 잘라서 사용 하셔야 합니다.

예) http://host:port/webapp/?parameter
PB
String ls_param
ls_param = commandparm()



2. 현재 톰켓으로 만든 사이트를 EA Server로 옮길 생각 입니다.
한글 문제는 지난번에 문의 드린 적이 있고
같이 문의 드린 EA서버에서 셋팅 되어 있는 Connection cash를 jsp페이지나 EA 서버에서 도는
JAVA프로그램 들에서 사용 하는 것에 대한 질문 이었는데..
Connection cash 셋팅 하는것을 알려 주셨습니다.

다시 한번 문의 드립니다.

질문 : EA Server에 있는 Connection Cash를 JSP와 java 프로그램에서 사용하는 방법을 알고 싶습니다.

2. connection cache를 사용 하시려면 관련된 class를 import하여 사용 하셔야 합니다.
아래 예제는 아주 간단하게 작성 해 놓은 것입니다.
중요한 것은 cache를 다 사용 하신 다음에는 반드시 cache를 releaseConnection 함수를 이용하여
종료 시켜 주셔야 한다는 것입니다. 그리고 cache는 반드시 jdbc driver를 이용 하셔야 하구요.
예)
import com.sybase.jaguar.server.*;
import com.sybase.jaguar.jcm.*;

JCMCache _cache = null;
Connection conn = null;
Statement stmt= null;
ResultSet rts = null;
try{
//Get a JDBCconnection cache handle
//from JaguarConnection Manager
_cache = JCM.getCacheByName('ora_jdbc');

//get JDBC Connection class
conn = _cache.getConnection(JCMCache.JCM_WAIT);

stmt = con.createStatement();
stmt.execute("select 1 from dual");
rts = stmt.getResultSet();
//관련 처리....
_cache.releaseConnection(conn);
}catch(com.sybase.jaguar.util.JException je){
throw new SQLException("getConnection:Error getting Connection from cache");
}finally{
if( _cache != null){
try{
_cache.releaseConnection(conn);
}catch(com.sybase.jaguar.util.JException je){
System.out.println(je.getMessage());
}
}
}

Sunday, February 25, 2007

TriggerEvent와 Trigger Event, 그리고 상속

Powerbuilder에서 Object에 이벤트를 강제로 발생 시키는 방법은 크게 두가지가 있다.
첫번째로는 TriggerEvent 함수를 쓰는 방법과, 두번째로는 Trigger Event 키워드를 사용 하여 발생 시키는 방법.

이 글을 적게 된 이유는 상속과 관련해서 특정한 상황에서는 TriggerEvent 함수가 생각 처럼 작동 하지 않는다는 것을 적어 놓기 위해서다.

예를 들면

Object A가 있고, Object B가 있는데 Object B는 Object A를 상속 받은 객체이다.

ObjectA ObjectB
event1 event1

ObjectB는 ObjectA에 있는 event1도 같이 상속 받은 상태..
ObjectB의 특성상 event1을 바로 쓰지 못하고 조상의 event1의 리턴값을 보고, 그에 따라 추가 처리를 해 주어야 한다.

이럴 경우 ObjectB의 event1의 스크립트에서 바로 코딩을 해 주어 버리면, 조상 이벤트의 리턴값을 받아 오지 못한다.(왜냐면 파워 빌더가 자동으로 조상 이벤트 호출 후 자기 이벤트를 다시 호출 해주기 때문에 조상 이벤트가 리턴한 값은 따로 담지를 못한다. 원래 이벤트라는게 리턴코드를 생각 할 수 없으니까)
따라서 "Extented Ancestor Script"를 풀어 주어(이러면 조상 이벤트는 실행 하지 않는다.) 바로 내 스크립트를 실행 하게 하고, TriggerEvent("event1")이나 Trigger Event event1()을 써서, 리턴값을 받아 온 후 그 값에 따라 처리 하면 된다.

ex)

1 If super::TriggerEvent("event1") = 0 Then
2 If super::Trigger Event event1() = 0 Then
...
Else
...
End if

super는 조상을 뜻 한다.

하지만 여기서 두 개의 코드가 서로 다르게 실행 된다는게 문제다.

super::TriggerEvent("event1")

이 코드는 무한 루프에 빠지게 된다.

super::Trigger Event event1()

이 코드는 예상 대로 잘 수행 된다.

super::TriggerEvent("event1")는, super에 있는 TriggerEvent를 호출 하긴 하지만 super의 TriggerEvent가 자기 자신에게 직접 event1을 발생 시키지 않고 그냥 객체 자체에 이벤트를 발생 시켜서 자식의 event1이 다시 발생 하여 루프가 돌게 된다.

하지만 Trigger Event event1()은 직접 조상 객체에 이벤트를 발생 시키므로 잘 작동 한다. TriggerEvent는 아마도 PowerBuilder의 버그가 아닌가 싶다.

조상의 함수 TriggerEvent가 실행 되어 이벤트를 보내면 조상 객체 내에서 해결 해야 하는데, 그게 다시 자식 객체로 부터 이벤트가 먹어 들어 가니 이게 잘 못 된 것 같다.

Tuesday, December 26, 2006

파워빌더의 미약한 다형성(多形性, polymorphism)

데이타스토어는 업데이트시 에러가 나면 오류를 가로체지를 못한다.
가로 채려면 표준데이타스토어를 상속 받은 클래스를 사용 하여 DBerror 이벤트 부분에 처리 부분을 기술 해 주어야만 가능 하다.

이것을 자바의 핸들러 식으로 처리 할 수 없나 하고 알아보다 다형성을 생각 해 보았다.

하지만,

파워빌더는 다중 상속이 되지 않는다.
오로지 단일 상속이다.

더욱 않좋은 것은(?) 강제로 캐스팅도 불가능 하다.

따라서 자바의 implement나 c++의 가상 함수 같은 것은 구현이 불가 하다.

하지만, dynamic이라는 키워드를 사용하여 흉내는 낼 수 있다.

다음의 예를 보자

오브젝트는 아래와 같이 구성 하였다.
application
window w_1
window w_showmsg

w_1는 (none)showmessage(string as_1) 윈도함수를 가지고 있다.
내용은 MessageBox("", as_1) 이 한 줄을 가지고 있다.

w_showmsg도 (none)showmessage(string as_1) 윈도함수를 가지고 있다.
다만 내용은 없다.

아래는 application에 코딩한 내용이다.

1 w_showmsg lw_showmsg
2 w_1 lw_1

3 Open(lw_1, "w_1")
4 lw_showmsg = lw_1
5 lw_showmsg.showmessage("abc")

요렇게 하면 컴파일시에는 오류가 발생하지 않는다.
하지만 실행 하면 4번 줄에서 문제가 발생한다. 오류 내용은 “할당하려고 하지만 타입이 일치 하지 않는다” 이다. 타입이 달라 실행시간에 할당 자체가 허락 되지 않는다.

다음과 같이 바꾸어 보았다.

1 w_showmsg lw_showmsg
2 w_1 lw_1
3 window lw_window

4 Open(lw_1, "w_1")
5 lw_window = lw_1
6 lw_window.showmessage("abc")

이번에는 컴파일 해보면 6번 줄에서 오류가 난다. "Unknown function name:showmessage" 즉 없는 메소드, 아니 함수를 호출 한다 이 소리다.

그럼 어쩌면 될까?
이때 바로 dynamic 키워드를 쓰면 된다.
다음과 같이
1 w_showmsg lw_showmsg
2 w_1 lw_1
3 window lw_window

4 Open(lw_1, "w_1")
5 lw_window = lw_1
6 lw_window.dynamic showmessage("abc")
컴파일도 되고 실행도 잘 된다.

그럼 6번줄에서 showmessage 함수를 살짝 바꾸어 s1howmessage로 하면 어찌 될까?
컴파일은 잘 된다. 실행하면 다음과 같은 메시지가 뜬다.





말 그대로 동적으로 함수를 호출 하려 하였으나 해당 함수가 없다. 고로 참조나 잘못 된게 없나 찾아 봐라 이소리다.

dynamic과 try 구문을 이용하면 다형성을 조금이나마 흉내 낼수 있지 않을까 생각 해 본다.

Thursday, December 21, 2006

windowname.ParentWindow()

Description
Obtains the parent window of a window.
Controls
Window objects

Syntax
windowname.ParentWindow()




ArgumentDescription


windownameThe name of a window for which you want to obtain the parentobject


Return value
Window. Returns the parent of windowname. Returns a null object reference if an error occurs or if windowname is null.

Usage
The ParentWindow function, along with the pronoun Parent, allows you to write more general scripts by avoiding the coding of actual window names. Parent refers to the window that contains the current object or control - the local environment. ParentWindow returns the parent window of a specified window.

Whether a window has a parent depends on its type and how it was opened. You can specify the parent when you open the window. For windows that always have parents, PowerBuilder chooses the parent if you do not specify it. Response windows and child windows always have a parent window. The parent of a sheet in an MDI application is the MDI frame window. Pop-up windows have a parent window when they are opened from another window but when used in an MDI application, the parent of the pop-up is the MDI frame. A pop-up window opened from the application's Open event does not have a parent.

The ParentWindow property of the Menu object can be used like a pronoun in Menu scripts. It identifies the window with which the menu is associated when your program is running. For more information, see the PowerBuilder User's Guide.


이 함수는 윈도우 콘트롤에서만 쓸 수 있다.

ParentWindow함수는 Parent 키워드와 함께 실질 적인 윈도 이름을 쓰는 것을 피하고 보다 범용적인 코딩을 할 수 있게 한다.

Parent 는 객체(Object)나 콘트롤(Control)을 담고 있는 윈도를 참조 할 수 있다.

ParentWindow는 지정된 윈도우의 부모 윈도를 돌려 준다.

윈도가 부모를 가질 지 말지는 그 윈도우의 타입 혹은 윈도우가 어떻게 열렸는지에 달렸다.

윈도우를 열적에 부모 윈도우를 기술 할 수 있다.

항상 부모 윈도우를 가져야 하는 윈도우들의 경우, 우리가 부모 윈도우를 알려 주지 않으면, 파워빌더가 부모 윈도우를 선택 한다. Response windows와 child windows는 항상 부모 윈도우를 갖는다. MDI application에서 쓰이는 Sheet의 부모는 MDI Frame Window이다.
Pop-up Window는 다른 window에 의 해 열렸을 경우, 부모 윈도우를 갖는다. 단, MDI application이라면 Pop-up의 부모는 MDI Frame이다.

또한, application의 Open Event에서 열린 Pop-up window의 경우는 부모 윈도우를 갖지 않는다.

Menu Object에서는 ParentWindow가 명사 처럼 사용 될 수 있다.

이 경우 실행 단계에서의 메뉴와 관계 있는 윈도우를 구분 한다.


** Response와 child 형 윈도우는 항상 부모 윈도우를 갖는다 하였는데.. 내가 해 본 바에 의하면 child는 MDI에서 sheet상에서 열렸을 경우, 부모 윈도우로 해당 sheet를 돌려 준다. 하지만 response윈도우는 MDI Frame를 돌려 준다. 버그 인가? 설명이 잘못 된 것인가? 아뭏든 그렇다.

내가 당면한 문제는 윈도우 타입을 child로 놓고 화면을 OpenWithParm으로 띄우니, single line edit가 마우스로 찍어서는 입력이 되지 않는 다는 것이다. 그래서 Response 타입으로 놓으니, 부모 윈도우에서 가져 오는 것을 가져 오지 못하여 오류가 발생 한다.

위의 문제 점으로 ParentWindow()를 쓰면 MDI Frame을 돌려 주므로 여기에 GetActiveSheet()까지 써서 해당 부모 윈도우 타입의 변수에 할당(cast)하여 처리 하였다.

sle에 입력도 잘 되고 부모 윈도우에서 데이타도 잘 가져 온다.

Monday, November 20, 2006

Make column in datawindow transparent

아래 내용은 PBDN.NET에서 검색 한 내용 입니다.

http://www.pbdn.net/board/BoardShow.aspx?board_id=2&role=qna&page=1&c_id=4540&c_seq=2&sfield=total&svalue=%c5%f5%b8%ed

김주영님이 2005-02-22 오후 12:02:09에 남기신 글입니다.
Re:특정 문자를 투명하게 ?
>어느 특정 칼럼을 투명하게 나타낼수 있는 방법좀
>알려주시면 고맙겠습니다.
>

방금 스승님한태 전수받아 왔습니다

우선 "특정"컬럼만 투명하게 한다면 Modify를 사용해야하는건 아시죠??

Modify에서 ObjectName.BackGround.Color를 1087434968 값으로 주면

투명색이 됩니다

string ls_m= "wk_code.Background.color=~"1087434968~t if(wk_code='99991',RGB(254,252,175),1087434968)~""
dw_1.modify(ls_m)

============================================================
1087434968 을 16진수로 변환 하면 40D0F0D8 인데

40 다음이 RGB 값 인것 같다.
40은 RGB에서 표현 할 수 없는 값인데, 이진수로 표현 하면
아래 와 같다.
0100 0000

여기서 1이 있는 부분이 Background.Mode부분이 아닌가 싶다.
테스트 해 본 것에 의하면
40 00 00 00 = 1073741824
값을 넣어도 투명 설정이 가능 하다.

Sunday, September 24, 2006

A Bug of PowerBuilder 9

DataWindow is all of The PowerBuilder.

It is very Powerfull Component.

But PowerBuilder 9 Has a Bug on DataWindow with Group Part.

If i Scrolled DataWindow control what has a DataWindow with a Group, Then there are space between rows of in Scroll View.

I was asked