내용 목차
본 장은 Power Builer 인터페이스에서 사용하는 함수와 예제를 설명한다.
Power Builder는 모든 데이터를 문자열로 간주하며 포인터라는 개념이 없어서 직접적으로 Tmax 클라이언트 라이브러리를 사용할 수 없다. 따라서 개별 데이터의 타입을 유지하고 Power Builder에서 제공하는 각종 PowerObject를 효율적으로 사용할 수 있도록 하기 위한 User Object(tmax.pbd)를 제공한다.
Power Builder에는 데이터 정보를 유지하며 다양한 데이터 프레젠테이션 기능을 가진 DataWindow라는 매우 편리한 PowerObject가 있다. Power Builder가 시장에서 가장 강력한 애플리케이션-개발 소프트웨어 패키지 중에 속하는 큰 이유 중에 하나가 DataWindow 기능을 포함하고 있기 때문이다.
하지만 기존의 클라이언트 라이브러리에서 제공하는 데이터 포맷을 그대로 DataWindow에 적용할 수 없기 때문에 개발자는 많은 불편을 겪었다. 이러한 점을 해결하기 위해 tmax.pbd에서는 결과 데이터 포맷을 Power Builder의 DataWindow에서 직접 사용할 수 있는 형태로 변경하였다. 이로 인해 개발자는 별도의 작업을 하지 않고 데이터를 조작할 수 있다.
다음은 tmax.pbd에서 제공하는 함수의 목록이다.
함수 | 설명 |
---|---|
f_data | 데이터 문자열을 만드는 함수이다. |
f_datadel | 데이터 문자열을 만드는 함수이다. |
f_fdata | 데이터 문자열을 만드는 함수이다. |
f_fdatadel | 데이터 문자열을 만드는 함수이다. |
f_form | Form 문자열을 만드는 함수이다. |
f_getdata | Form과 동일한 구성으로 이루어진 output 내용 중 특정 위치의 문자열로 반환하는 함수이다. |
isblocked | Blocking 상태인지를 검사하는 함수이다. |
pb_etpcall | 이미지 데이터를 처리하기 위한 함수이다. |
pb_getunsold | 비요청 메시지를 수신하기 위한 함수이다. |
pb_IsBlocked | Blocking 상태인지를 검사하는 함수이다. |
pb_reset | 현재 접속된 연결을 즉시 해제하는 함수이다. |
pb_tmaxreadenv | 파일에 저장된 접속할 시스템의 정보를 읽어서 환경변수에 새로운 값을 설정하는 함수이다. |
pb_tpacall | 비동기 서비스 호출을 수행하는 함수이다. |
pb_tpalloc | itype으로 지정된 유형의 버퍼를 할당하고 주소를 반환하는 함수이다. |
pb_tpbroadcast | 지정한 클라이언트에 메시지를 전달하는 함수이다. |
pb_tpcall | 동기 처리 함수이다. |
pb_tpcallw | DataWindow를 사용하여 동기형으로 Tmax 서비스를 호출하기 위한 함수이다. |
pb_tpcancel | pb_tpacall()로 반환된 구별자를 취소하는 함수이다. |
pb_tpcommit | 트랜잭션의 작업을 Commit하는 데 사용되는 함수이다. |
pb_tpconnect | 대화형 서비스와 통신을 연결하는 함수이다. |
pb_tpconv | cd에 의해 지정된 대화형 서비스에 대해 메시지를 송수신하는 함수이다. |
pb_tpdiscon | 대화의 연결을 강제로 끊고 TPEV_DISCONIMM 이벤트를 발생시키는 함수이다. |
pb_tpend | Tmax 시스템과의 접속을 해제하는 함수이다. |
pb_tpfcall | 파일로부터 입력 데이터를 받아들일 수 있으며 결과 데이터를 파일에 저장할 수 있는 함수이다. |
pb_tpfree | pb_tpalloc()으로 얻은 버퍼를 해제하는 함수이다. |
pb_tpget | 첫 번째 파라미터에서 지정한 주소에 해당하는 데이터를 두 번째 파라미터에서 지정한 버퍼에 세 번째 파라미터에서 지정한 size만큼 읽어 오는 함수이다. |
pb_tpgetrply | pb_tpacall()에 의해서 보낸 요청에 대한 응답을 받는 데 사용하는 함수이다. |
pb_tpgetunsol | 비요청 수신 메시지를 처리하기 위한 함수이다. |
pb_tpput | 첫 번째 파라미터에서 지정한 주소에 두 번째 파라미터에서 지정한 데이터를 세번째 파라미터에서 지정한 size만큼 저장하는 함수이다. |
pb_tprecv | 대화형 통신에서 데이터를 수신하는 데 사용되는 함수이다. |
pb_tpreset | 현재 접속된 연결을 즉시 해제하는 함수이다. |
pb_tpsend | 대화형 통신에서 상대방에게 데이터를 송신하는 데 사용되는 함수이다 |
pb_tpset_timeout | 서버에 설정되어 있는 서비스 제한시간인 Blocking Timeout 시간을 변경할 때 사용되는 함수이다. |
pb_tpsetunsol | 비요청 수신 메시지를 받도록 설정하는 함수이다. |
pb_tpstart | Tmax와 접속을 맺는 함수이다. |
pb_tptobackup | 클라이언트가 Tmax 시스템에 연결할 때 처음부터 백업 시스템에 연결하는 경우 사용하는 함수이다. |
pb_tx_begin | 전역(global) 트랜잭션을 시작하는 함수이다. |
pb_tx_commit | 트랜잭션의 작업을 Commit하는 데 사용하는 함수이다. |
pb_tx_rollback | 트랜잭션의 작업을 Rollback하는 데 사용하는 함수이다. |
pb_tx_set_commit_return | when_return값을 통해서 전역 트랜잭션의 Commit 시점을 결정하는 함수이다. |
pb_tx_set_transaction_control | control에 지정된 값을 통해서 pb_tx_commit()이나 pb_tx_rollback()이 반환되기 전에 새로운 트랜잭션의 시작 여부를 결정하는 함수이다. |
pb_tx_set_transaction_timeout | 트랜잭션의 Timeout을 설정하는 함수이다. |
pb_uotmax_ver | tmax.pbdd의 버전을 보여주는 함수이다. |
pb_tx_info | 전역 트랜잭션 정보를 알려주는 함수이다. |
tp_abort | 트랜잭션을 작업을 중단(abort)하는 데 사용하는 함수이다. |
tp_acall | 비동기 서비스 호출을 수행하는 함수이다. |
tp_begin | 전역 트랜잭션을 시작하는 함수이다. |
tp_broadcast | 지정한 클라이언트에 메시지를 전달하는 함수이다. |
tp_call | 동기형으로 Tmax 서비스를 호출하기 위한 함수이다. |
tp_cancel | tp_acall()로 반환된 구별자를 취소하는 함수이다. |
tp_commit | 트랜잭션 작업을 Commit 하는 데 사용하는 함수이다. |
tp_connect | 대화형 서비스와 통신을 연결하는 함수이다. |
tp_conv | cd에 의해 지정된 대화형 서비스에 대해 메시지를 송수신하는 함수이다. |
tp_discon | 대화의 연결을 강제로 끊고, TPEV_DISCONIMM 이벤트를 발생시키는 함수이다. |
tp_fcall | 동기형으로 Tmax 서비스를 호출하기 위한 함수이다. |
tp_getrply | 비동기형 통신에서 데이터를 수신하는 함수이다. |
tp_init | Tmax와의 접속을 맺는 함수이다. |
tp_recv | 대화형 통신에서 데이터를 수신하는 함수이다. |
tp_send | 대화형 통신에서 상대방에게 데이터를 송신하는 함수이다. |
tp_subscribe | 서버에서 tppost()에 의해 전달되는 메시지를 받기 위한 함수이다. |
tp_term | Tmax 시스템과의 접속을 해제하는 함수이다. |
tp_unsubscrib | tp_subscribe(), tp_setunsol()에 의해 윈도우(hwnd)에서 메시지를 받도록 지정한 것을 해제하는 함수이다. |
tpbegin | pb_tx_set_transaction_timeout()과 pb_tx_begin()의 기능을 한 번에 수행할 수 있는 함수이다. |
tuxcall | 동기형으로 Tmax 서비스를 호출하기 위한 함수이다. |
tuxedo_compat | 일부 API의 동작에 대해서 Tuxedo 라이브러리와의 호환성을 제공한다. |
tuxreadenv | 파일에 저장된 접속할 시스템의 정보를 읽어서 환경변수에 새로운 값을 설정하는 함수이다. |
DataWindow(혹은 DataWindowChild, DataStore)에 있는 Column명과 Data를 TAB("~t")으로 구분하고, 각 Column명-Data 쌍은 NewLine("~n")으로 구분하는 문자열을 만든다. 이 문자열은 pb_tpcall에서 input 부분에 사용할 수 있다. DataWindow, DataWindowChild, DataStore의 데이터 중 수정된 Row만 꺼내온다.
프로토타입
f_data ( {DataWindow | DataWindowChild | Datastore} ds_in ) returns string
파라미터
파라미터 | 설명 |
---|---|
ds_in | 입력으로 사용되는 PowerBuilder Object이다. |
반환값
DataWindow(혹은 DataWindowChild, DataStore)에 있는 Column명과 데이터를 TAB("~t")과 NewLine("~n")으로 구분된 형태의 문자열로 반환한다.
예제
string itype, input, form[], output[] … itype = "STRING~t~n" input = uo_tmax.f_data(dw_input) + & "~n” … ret = uo_tmax.pb_tpcall("TOUPPER", itype, input, form[], output[]) if ret < 0 then error processing … end if …
관련함수
f_datadel(), f_fdatadel(), pb_tpcall(), pb_tpacall(), pb_tpconnect()
f_datadel()은 DataWindow의 DeletedBuffer에서 데이터 문자열을 만드는 함수로, DataWindow(혹은 DataWindowChild, DataStore)에 있는 Column명과 data를 TAB("~t")으로 구분하고, 각 Column명-Data 쌍은 NewLine("~n")으로 구분하는 문자열을 만든다. 이 문자열은 pb_tpcall에서 input 부분에 사용할 수 있다.
f_data()는 dwDelBuf 변수가 TRUE 일 경우 DeletedBuffer의 data도 함께 문자열을 만드는 반면에 f_datadel()은 dwDelBuf 변수의 상태에 관계없이 DeletedBuffer의 데어터에 대해서만 문자열로 만든다. DeletedBuffer는 사용자가 DeleteRow() 함수를 사용할 때 삭제될 데이터가 임시로 보관되는 버퍼로 f_datadel()이 정상적으로 동작하기 위해서는 DataWindow가 update 가능해야 한다.
DeleteRow를 했을 때 DeletedBuffer에 데이터가 들어가기 위해서는 다음 사항을 주의해야 한다.
– DataWindow의 'Allow Update' (Power Builder의 [Rows] > [Update Properties..] 메뉴 참조)가 체크되어 있어야 한다.
– ImportString을 수행한 후에 ResetUpdate를 하지 않고 DeleteRow를 한 경우에는 DeleteBuffer에 해당 Row가 저장되지 않는다.
프로토타입
f_datadel ( {DataWindow | DataWindowChild | Datastore} ds_in ) returns string
파라미터
파라미터 | 설명 |
---|---|
ds_in | 입력으로 사용되는 PowerBuilder Object (DataWindow, DataWindowChild, DataStore 가능)이다. |
반환값
DataWindow(혹은 DataWindowChild, DataStore)의 DeletedBuffer에 있는 데이터를 TAB("~t")과 NewLine("~n")으로 구분된 형태의 문자열로 반환한다
예제
string itype, input, form[], output[] … itype = "STRING~t~n" input = uo_tmax.f_datadel(dw_input) + & "~n" … ret = uo_tmax.pb_tpcall("TOUPPER", itype, input, form[], output[]) if ret < 0 then error processing … end if …
관련함수
f_fdata(), f_fdatadel(), pb_tpcall(), pb_tpacall(), pb_tpconnect()
데이터 문자열을 만드는 함수로 DataWindow(혹은 DataWindowChild, DataStore)의 데이터 중 수정된 Row만을 꺼내온다. DataWindow에 있는 수정된 Row의 Column명과 데이터를 f_data와 동일한 포맷으로 filehandle값의 파일에 기록한다. 즉, Column명과 데이터는 TAB("~t")으로 구분하고, 각 Column명-Data 쌍은 NewLine("~n")으로 구분하는 문자열을 만든다.
프로토타입
f_fdata ( {Datastore|DataWindow|DataWindowChild} ds_in, integer filehandle ) returns integer
파라미터
파라미터 | 설명 |
---|---|
ds_in | 입력으로 사용되는 PowerBuilder Object(DataWindow, DataWindowChild, DataStore 가능)이다. |
filehandle | 임시 파일의 파일 구분자이다. 서버 호출 후 반환된 데이터에서 꺼내올 필드명을 지정하는 문자열의 integer filehandle은 pb_tpfcall()에서 네 번째 파라미터인 입력 임시 파일에 사용할 수 있다. |
반환값
반환값 | 설명 |
---|---|
0 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다(예 : 파일에 쓰는 것에 실패한 경우 등). |
예제
... InputFile ="c:\temp\fdata0.txt" InputFile = FileOpen(InputFile, StreamMode!, Write!, LockReadWrite!, Replace!) ... uo_tmax.f_fdata(dw_input, InputFile) if FileClose(InputFile) <> 1 then error processing … end if ... if uo_tmax.tp_fcall(input, form, output, inputfilename, fform, foutput) = -1 then error processing … end if ...
관련함수
f_data(), f_datadel(), f_fdatadel()
데이터 문자열을 만드는 함수로 DataWindow(혹은 DataWindowChild, DataStore)의 데이터 중 DeleteBuffer에 저장되어 있는 Row만을 꺼내온다. DataWindow에 있는 수정된 Row의 Column명과 데이터를 f_data와 동일한 포맷으로 filehandle값의 파일에 기록한다. 사용 방법은 f_data() 함수를 참고한다.
DeleteRow를 했을 때 DeletedBuffer에 데이터가 들어가기 위해서는 다음 사항을 주의해야 한다.
- DataWindow의 "Allow Update" (Power Builder의 [Rows] > [Update Properties..] 메뉴 참조)가 체크되어 있어야 한다.
- ImportString을 수행한 후에 ResetUpdate를 하지 않고 DeleteRow를 한 경우에는 DeleteBuffer에 해당 Row가 저장되지 않는다.
프로토타입
f_fdatadel ( {Datastore|DataWindow|DataWindowChild} ds_in, integer filehandle ) returns integer
파라미터
파라미터 | 설명 |
---|---|
ds_in | 입력으로 사용되는 PowerBuilder Object (DataWindow, DataWindowChild, DataStore 가능)이다. |
filehandle | 임시 파일의 파일 구분자이다. |
반환값
반환값 | 설명 |
---|---|
0 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다(예 : 파일에 쓰는 것에 실패한 경우 등). |
관련함수
f_data(), f_datadel(), f_fdata()
Form 문자열을 만드는 함수로 DataWindow(혹은 DataWindowChild, DataStore)에 있는 Column명을 pb_tpcall의 4번째 인수에서 사용할 수 있는 형태의 문자열로 반환한다.
각 Column명을 NewLine("~n")으로 구분하여 나열하고 마지막에 NewLine("~n")을 하나 더 추가한 문자열을 만든다.
프로토타입
f_form ( {Datastore|DataWindow|DataWindowChild} ds_in) returns string
파라미터
파라미터 | 설명 |
---|---|
ds_in | 입력으로 사용되는 PowerBuilder Object (DataWindow, DataWindowChild, DataStore 가능)이다. |
반환값
DataWindow(혹은 DataWindowChild, DataStore)에 있는 Column명을 NewLine("~n")으로 구분된 형태의 문자열로 만들어 반환한다.
예제
string itype, input, form[], output[] … itype = "STRING~t~n" input = uo_tmax.f_data(dw_input) + & "~n" form[1] = uo_tmax.f_form(dw_input) … ret = uo_tmax.pb_tpcall("TOUPPER", itype, input, form[], output[]) if ret < 0 then error processing … end if …
관련함수
pb_tpcall(), pb_tpgetrply(), pb_tprecv(), pb_tpconv()
Form과 동일한 구성으로 이루어진 output 내용 중 arg_row번째 배열의 arg_col_name의 값을 문자열로 반환하는 함수이다.
프로토타입
f_getdata ( string form, string odata, integer arg_row, string arg_col_name ) returns string
파라미터
파라미터 | 설명 |
---|---|
form | 서비스 처리 결과 odata의 구성 형태 STRUCT 버퍼인 경우에는 사용된 구조체의 각 멤버로 구성되며 FIELD KEY 버퍼인 경우에는 사용된 필드명으로 구성된다. 이때 각 멤버 혹은 필드명은 NewLine("~n")으로 구분되고 마지막에는 NewLine("~n")을 추가하여 Form의 끝을 알린다. 최종적인 Form 배열의 끝을 나타내기 위해 NewLine("~n")으로 구성된 Form을 추가한다. |
odata | 서비스 처리 결과를 저장할 버퍼 데이터는 PowerBuilder의 ImportString 함수를 사용하여 간단하게 데이터를 DataWindow에 넣을 수 있도록 TAB("~t")으로 구분되어 있고, 각 Row는 NewLine("~n")으로 구분되어 있다. |
arg_row | 찾으려는 문자열이 위치한 Row이다. |
arg_col_name | 찾으려는 문자열이 위치한 Column이다. |
반환값
해당하는 문자열을 반환한다.
예제
string itype, input, form[], output[] … itype = "STRING~t~n" input = uo_tmax.f_data(dw_input) + & "~n" form[1] = uo_tmax.f_form(dw_input) … ret = uo_tmax.pb_tpcall("TOUPPER", itype, input, form[], output[]) if ret < 0 then error processing … end if …
Blocking 상태인지를 검사하는 함수이다. Blocking 상태란 서비스를 호출하고 있는 중이라는 의미이다.
서비스를 호출하고 있는 상태에서는 다른 서비스를 호출할 수 없다. 서비스를 호출하고 있는 동안 다른 버튼을 클릭하거나 혹은 버튼을 2번 클릭해서 서비스를 다시 호출하려면 에러가 발생한다. 따라서 서비스를 호출하는 버튼에서는 가장 처음에 이 함수를 호출하여 수행 중이면 대기하라는 메시지를 보내는 것이 바람직하다.
프로토타입
isblocked () returns integer
반환값
반환값 | 설명 |
---|---|
1 | Blocking 상태인 경우이다. |
예제
… ret = uo_tmax.isBlocked() if ret = 0 then MessageBox("pb_isBlocked", "NO BLOCK " + string(uo_tmax.tperrno)) else MessageBox("pb_isBlocked", "BLOCKING") end if …
관련함수
pb_isblocked()
함수의 사용 방법은 pb_tpcall과 동일하며 기존의 pb_tpcall이 가진 기능 외에 이미지 데이터를 처리하기 위한 함수이다. 이 경우에는 반드시 FIELD KEY 버퍼를 사용해야 하며 특정 필드명을 사용해야 하는 제약사항이 있다. 이미지 데이터를 송신할 때에는 "FILENAM", 이미지 데이터를 수신할 때는 "NEWFILE"이라는 필드명으로 파일이 지정되어야 한다. 그리고 실질적인 이미지 데이터는 TP_BITMAP이라는 CARRAY형의 필드명으로 전송된다.
이미지를 송신할 때에는 전송할 파일명을 "FILENAM"이라는 필드명으로 input에 지정되어야 하며(이 데이터는 4M 이상이 되어도 처리될 수 있다), 클라이언트 라이브러리에서는 이 필드명으로 지정된 파일에서 이미지 데이터를 읽어 들여 "TP_BITMAP"이라는 필드명으로 데이터를 실어 서버에 보낸다.
이미지를 수신할 때에는 서버에서 보내는 이미지 데이터를 저장할 파일명을 "NEWFILE"이라는 필드명으로 idata에 지정해야 한다. 서비스 프로그램 내에서는 "TP_BITMAP"라는 필드명으로 데이터를 실어 보내고 클라이언트 라이브러리에서는 "NEWFILE" 필드명으로 지정된 파일에 이미지 데이터를 저장한다. 이 경우 수신 버퍼 내에 "NEWFILE" 필드명으로 데이터가 존재해야 한다.
프로토타입
pb_etpcall(string svcname, string itype, string idata, string form[], ref string odata[]) returns integer
파라미터
파라미터 | 설명 |
---|---|
svcname | 호출할 서비스명을 의미한다. |
itype | 사용한 버퍼의 타입 문자열 형태로 TAB("~t")을 이용하여 문자열을 분리하고 NewLine("~n")을 이용하여 라인의 끝을 나타낸다. |
idata | 처리하고자 하는 데이터가 저장될 버퍼 문자열 형태로 TAB("~t")을 이용하여 입력 데이터를 분리하고 NewLine("~n")을 이용하여 라인의 끝을 나타낸다. |
form | 서비스 처리 결과 odata의 구성 형태 STRUCT 버퍼인 경우에는 사용된 구조체의 각 멤버로 구성되며 FIELD KEY 버퍼인 경우에는 사용된 필드명으로 구성된다. 각 멤버 혹은 필드명은 NewLine("~n")으로 구분되고 마지막에는 NewLine("~n")을 추가하여 Form의 끝을 알린다. 최종적인 Form 배열의 끝을 나타내기 위해 NewLine("~n")으로 구성된 Form을 추가한다. |
odata | 서비스 처리 결과를 저장할 버퍼 각 데이터는 PowerBuilder의 ImportString 함수를 사용하여 간단하게 데이터를 DataWindow에 넣을 수 있도록 TAB("~t")으로 구분되어 있고, 각 Row는 NewLine("~n")으로 구분되어 있다. |
다음은 Tmax의 Instance 변수이다. 이 중 flags와 timeout은 서비스 호출 전에 설정되는 값이며 나머지는 서비스 호출 후 설정되는 값이다.
변수 | 설명 |
---|---|
msg | 서비스 프로그램에서 보내온 메시지이다. |
tperrno | 에러가 발생한 경우 에러 코드가 저장될 버퍼이다. |
tpurcode | 서버에서 보내온 User Code(tpreturn의 두 번째 인수)가 저장될 버퍼이다. |
flags | pb_tpcall에서 사용되는 flags는 다음과 같다.
[참고] tuxedo_compat(true) 설정의 경우 flags에 대한 동작이 달라진다. 자세한 내용은 tuxedo_compat()을 참고한다. |
timeout | pb_tx_set_transaction_timeout에서 사용되는 Blocking Timeout 시간을 의미한다. |
반환값
반환값 | 설명 |
---|---|
0 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 저장되고, msg에 에러 메시지가 저장된다. |
예제
long ret string itype, idata, form[], odata[] string FileName = "c:\abc.bmp" if isnull(sle_1.text) or sle_1.text = '' then error processing … end if itype = "FML~t~n" /*FILE을 upload하기 위해 FILENAM 필드에 파일명을 설정한다.*/ idata = "FILENAM~t" + FileName + "~n" form[1] = "~n" odata[1] = space(1024) ret = uo_tmax.pb_etpcall("IMGSAVE", itype, idata, form[], odata[]) if ret < 0 then error processing … end if
관련함수
f_data(), f_datadel(), f_form(), tuxedo_compat()
비요청 메시지를 수신하기 위한 함수이다. Power Builder에서는 라이브러리 내의 메모리에 접근할 수 없다. 따라서 비요청 메시지를 수신하기 위해서 Power Builder에서 메모리를 확보하여 이를 라이브러리에 전달하여 수신해야 한다.
비요청 메시지를 수신하면 pb_tpsetunsol()에서 설정된 윈도우에 mid와 데이터의 길이를 전달한다. 해당 윈도우에서는 데이터의 길이만큼 메모리를 확보하여 pb_getunsold() 함수를 호출하면 지정된 메모리에 데이터를 저장한다. pb_tpsetunsol(), pb_getunsold()를 사용하여 비요청 수신 메시지를 받을 때는 반드시 u_tmax의 instance 변수인 flags에 TPUNSOL_HND로 설정을 한 후 pb_tpstart()를 한다.
프로토타입
pb_getunsold ( ref string odata, integer len, unsignedinteger mid ) returns integer
파라미터
파라미터 | 설명 |
---|---|
odata | 비요청 수신 데이터를 받을 버퍼를 설정한다. |
len | 비요청 수신 데이터의 길이이다. |
mid | 메시지 구분자이다. |
반환값
반환값 | 설명 |
---|---|
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
오류
tperrno에 에러 코드가 설정된다.
에러 코드 | 설명 |
---|---|
TPEINVAL | 입력 파라미터가 유효하지 않은 경우로 rcvbuf가 NULL이거나 mid가 0보다 작은 경우이다. |
TPEITYPE | Power Builder에서 확보된 메모리 영역이 수신 데이터보다 작은 경우에 발생한다. |
TPEOTYPE | 수신 데이터가 없거나 부적절한 경우이다. |
TPEMATCH | 주어진 mid에 해당하는 데이터가 없는 경우이다. |
예제
uo_tmax.flags = uo_tmax.TPUNSOL_HND … ret = uo_tmax.pb_tpsetunsol ( HANDLE(this), "", 1025, uo_tmax.TPBROADCAST ) if ret = -1 then error processing … end if … unsoldata = space(1024) ret = uo_tmax.pb_getunsold(unsoldata, rlen, 1025) if ret < 0 then error processing … end if …
관련함수
pb_tpsetunsol()
Blocking 상태인지 검사하는 함수이다. Blocking 상태란 서비스를 호출하고 있는 중이라는 의미이다.
서비스를 호출하고 있는 상태에서는 다른 서비스를 호출할 수 없다. 서비스를 호출하고 있는 동안 다른 버튼을 클릭하거나 혹은 버튼을 2번 클릭해서 서비스를 다시 호출하면 에러가 발생한다. 따라서 서비스를 호출하는 버튼에서는 가장 처음에 이 함수를 호출하여 수행 중이면 대기하라는 메시지를 보내는 것이 바람직하다.
프로토타입
pb_isblocked () returns integer
반환값
반환값 | 설명 |
---|---|
1 | Blocking 상태인 경우이다. |
예제
… ret = uo_tmax.pb_isBlocked() if ret = 0 then MessageBox("pb_isBlocked", "NO BLOCK " + string(uo_tmax.tperrno)) else MessageBox("pb_isBlocked", "BLOCKING") end if …
관련함수
isBlocked()
pb_reset는 현재 접속된 연결을 즉시 해제하는 함수이다. 클라이언트 모듈에 TPESYSTEM 에러가 발생하는 경우는 거의 네트워크 오류이므로 Tmax 시스템에 재접속하는 것을 권장한다. pb_reset() 함수는 이런 경우 사용된다. 우선 pb_reset()으로 접속을 해제하고, 서비스를 재요청하거나 Tmax 시스템을 다시 연결한다.
프로토타입
pb_reset () returns integer
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
오류
tperrno에 에러 상황에 해당되는 코드가 설정된다.
에러 코드 | 설명 |
---|---|
TPESYSTEM | Tmax 시스템 에러가 발생함을 의미한다. 자세한 정보는 로그 파일에 기록된다. |
TPEOS | 운영체제에 에러가 발생함을 의미한다. |
예제
long ret u_tmax uo_tmax uo_tmax = CREATE u_tmax uo_tmax.usr_name = 'tmaxclient' uo_tmax.clt_name = 'cilent01' uo_tmax.dom_pwd = 'tmax' uo_tmax.usr_pwd = 'client01' uo_tmax.flags = uo_tmax.TPUNSOL_IGN … ret = uo_tmax.pb_tpstart() if ret < 0 then error processing … end if … ret = uo_tmax.pb_tpreset() if ret < 0 then error processing … endif
pb_tmaxreadenv()는 파일에 저장된 접속할 시스템의 정보를 읽어서 환경변수에 새로운 값을 설정하는 함수이다. Tmax 시스템과 접속하기 위한 정보를 환경변수에 설정하기 때문에 이 함수는 Tmax 시스템에 접속하기 전에 수행되어야 한다. Tmax 시스템과 접속하기 위해서는 몇 가지 환경변수를 시스템에 등록해야 한다. 이렇게 등록된 환경변수를 참조하여 pb_tpstart()로 Tmax 시스템과 연결한다.
일반적으로 환경변수는 운영체제에 따라 정의하는 파일이 달라진다. UNIX의 경우 csh는 <.cshrc>에, ksh는 <.profile>에 정의하고, DOS의 경우에는 <autoexec.bat> 파일에 정의한다. 그러나 접속할 시스템이 2개 이상일 경우 클라이언트는 상황에 따라 접속하고자 하는 시스템을 변경할 수 있다. 또는 관리상의 문제로 환경변수 파일을 이용하는 경우가 있다. 이 경우 환경변수에 2개의 시스템에 대한 정보를 등록할 수 없으므로 파일에 환경변수를 등록하여 사용할 수 있다.
[TMAX] TMAX_HOST_ADDR=168.126.185.131 TMAX_HOST_PORT=8800 SDLFILE=C:\tmax\sample\sdl\tmax.sdl FDLFILE=C:\tmax\sample\fdl\tmax.fdl TMAX_CONNECT_TIMEOUT=2
프로토타입
pb_tmaxreadenv(string env_file, string section) returns integer
파라미터
파라미터 | 설명 |
---|---|
env_file | 접속할 시스템의 환경 정보가 저장된 파일명이다. 이 파일은 텍스트 형태로 일정한 형식에 맞게 등록되어 있어야 한다. |
section | 파일 내에 등록된 환경 정보의 구분자, 즉 2개 이상의 시스템 정보를 하나의 파일에 등록할 경우에 각 시스템을 구별할 수 있는 값이다. |
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
오류
에러 코드에 대한 자세한 사항은 “Tmax Reference Guide”의 “3.1.20. tmaxreadenv”를 참고한다.
예제
long ret u_tmax uo_tmax uo_tmax = CREATE u_tmax … ret = uo_tmax.pb_tmaxreadenv("./tmax.env", "TMAX") if ret < 0 then error processing … end if …
관련함수
pb_tpstart(), pb_tpend()
비동기 서비스 호출을 수행하는 함수로, 비동기형 통신은 클라이언트가 서비스를 요청하고 다른 일을 계속할 수 있으며, 응답을 받고자 할 때 해당 요청에 대한 응답을 받는다. 요청에 대한 응답을 받을 때(pb_tpgetrply())는 pb_tpacall()을 호출할 때 반환되는 참조 구별자를 사용한다. 서비스를 요청하는 pb_tpacall()은 호출할 때 즉시 반환되어 다른 일을 처리할 수 있다. 응답을 받기 위해 호출하는 pb_tpgetrply()는 응답이 도착하거나 Timeout될 때까지 Blocking되어 기다린다.
프로토타입
pb_tpacall ( string svcname, string itype, string idata ) returns integer
파라미터
파라미터 | 설명 |
---|---|
svcname | 호출할 서비스명을 의미한다. |
itype | 사용한 버퍼의 타입 문자열 형태로 TAB("~t")을 이용하여 문자열을 분리하고 NewLine("~n")을 이용하여 라인의 끝을 나타낸다. |
idata | 처리할 데이터가 저장될 버퍼 문자열 형태로 TAB("~t")을 이용하여 입력 데이터를 분리하고 NewLine("~n")을 이용하여 라인의 끝을 나타낸다. |
반환값
반환값 | 설명 |
---|---|
1 이상의 cd값 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 저장된다. |
오류
에러 코드에 대한 자세한 사항은 “Tmax Reference Guide”의 “3.1.24. tpacall”을 참고한다.
예제
string input, itype, form[], output[] int length, cd, ret length = len(before.text) itype = "STRUCT~tkstrdata~n" input = string(length) + "~t" + before.text + "~n" form[1] = "len~n" + "sdata~n" + "~n" form[2] = "~n" output[1] = space(1024) cd = uo_tmax.pb_tpacall("SYNC", itype, input) if cd < 0 then error processing … end if ret = uo_tmax.pb_tpgetrply(cd, form, output) if ret < 0 then error processing … end if
관련함수
pb_tpgetrply(), pb_tpcancel(), pb_tpcall()
pb_tpalloc()은 itype으로 지정된 유형의 버퍼를 할당하고 그에 대한 주소를 반환하는 함수로 <tmax4gl.dll>의 tpalloc()을 호출한다. 유형에 따라 isubtype과 ilen은 선택적으로 지정할 수 있으며 이후 새로 생성된 pb_b~ 함수와 pb_tpput, pb_tpget 등의 함수의 buf 인자에 사용하게 된다.
지정된 버퍼 유형이 하위 유형을 사용할 수 있다면, pb_tpalloc()을 호출할 경우 반드시 isubtype을 지정해야 한다. 지정된 버퍼 유형이 하위 유형을 사용하지 않는다면, subtype은 무시된다(보통 0이 사용된다). 할당된 버퍼의 크기는 기본 크기인 1024Byte 이상이다.
함수에 대한 자세한 내용은 “Tmax Reference Guide”의 “3.1.27. tpalloc”을 참고한다.
프로토타입
pb_tpalloc ( string itype, string isubtype, long ilen ) returns long
파라미터
파라미터 | 설명 |
---|---|
itype | 할당할 버퍼의 타입을 의미한다. (예: 'STRUCT' , 'STRING', 'CARRAY', 'FIELD') |
isubtype | 지정된 버퍼 유형의 하위 유형을 의미한다. |
ilen | 할당할 버퍼의 size를 의미한다. (기본값 : 1024) |
반환값
반환값 | 설명 |
---|---|
address | 함수 호출에 성공한 경우이다. |
0 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
오류
tperrno에 에러 코드가 설정된다.
에러 코드 | 설명 |
---|---|
TPEINVAL | 인수가 유효하지 않음을 의미한다. (예: NULL 형식) |
TPENOENT | 알 수 없는 유형 혹은 하위 유형이다. STRUCT 버퍼 유형인 경우 하위 유형이(구조체의 태그명) SDLFILE에 존재하지 않는 경우 발생한다. 클라이언트에서 tpstart()를 호출하지 않거나 호출하기 전에 tpalloc()으로 STRUCT 버퍼를 할당한 경우에도 동일한 에러가 발생한다. |
TPESYSTEM | Tmax 시스템 에러가 발생함을 의미한다. 자세한 정보는 로그 파일에 기록된다. |
TPEOS | 메모리를 할당받지 못하는 운영체제에 에러가 발생함을 의미한다. |
TPEOTYPE | 요청되는 서버의 자료형이 구조체 버퍼인데 해당 서버가 컴파일할 때 구조체 파일과 함께 컴파일되지 않은 경우이다. |
예제
long ret long buf u_tmax uo_tmax uo_tmax = CREATE u_tmax uo_tmax.usr_name = 'tmaxclient' uo_tmax.clt_name = 'cilent01' uo_tmax.dom_pwd = 'tmax' uo_tmax.usr_pwd = 'client01' uo_tmax.flags = uo_tmax.TPUNSOL_IGN … ret = uo_tmax.pb_tpstart() if ret < 0 then error processing … end if … buf = uo_tmax.pb_tpalloc("CARRAY", "", 40000) …
프로토타입
pb_tpbroadcast ( string nodename, string usrname, string cltname, string data ) returns integer
파라미터
파라미터 | 설명 |
---|---|
nodename | 메시지를 전달할 클라이언트가 속한 노드명이다. |
usrname | 메시지를 전달할 사용자명으로 pb_tpstart()일 때 설정하는 usrname과 일치해야 메시지가 전달된다. |
cltname | 메시지를 전달할 클라이언트명으로 pb_tpstart()일 때 설정하는 cltname과 일치해야 메시지가 전달된다. |
data | 처리할 데이터가 저장될 버퍼 문자열 형태로 TAB("~t")을 이용하여 입력 데이터를 분리하고 NewLine("~n")을 이용하여 라인의 끝을 나타낸다. |
nodename, usrname, cltname은 모두 대상 클라이언트를 선택하는 데 사용되는 논리적인 이름이다. 이름 지정에는 와일드 카드(wildcard) 문자가 사용될 수 있다. usrname과 cltname은 설정되는 이름 중간에 물음표(?)나 애스터리스크(*) 등의 와일드 카드가 들어갈 수 있으나, nodename은 이름 전체를 대신하여 애스터리스크(*)만이 사용될 수 있다. 또한 NULL값이 사용될 수 있는데, 이는 모든 클라이언트에 대응되는 와일드 카드로 동작한다.
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
오류
에러 코드에 대한 자세한 사항은 “Tmax Reference Guide”의 “3.1.29. tpbroadcast”를 참고한다.
예제
string nodename, usrname, cltname, data int ret … nodename = "tmax" usrname = "*" cltname = "*" data = sle_input.text ret = uo_tmax.pb_tpbroadcast(nodename, usrname, cltname, data) if ret < 0 then error processing … end if …
동기 처리 함수로, 처리 결과를 받을 때까지 대기한다. 처리할 데이터를 idata에 저장하고 지정된 서비스를 svcname에 입력한 뒤 서비스를 호출한다. 처리된 결과는 Form에 지정된 column의 데이터로 odata에 저장된다.
프로토타입
pb_tpcall(string svcname, string itype, string idata, string form[], ref string odata[]) returns integer
파라미터
파라미터 | 설명 |
---|---|
svcname | 호출할 서비스명을 의미한다. |
itype | 사용한 버퍼의 타입 문자열 형태로 TAB("~t")을 이용하여 문자열을 분리하고 NewLine("~n")을 이용하여 라인의 끝을 나타낸다.
|
idata | 처리할 데이터가 저장될 버퍼 문자열 형태로 TAB("~t")을 이용하여 입력 데이터를 분리하고 NewLine("~n")을 이용하여 라인의 끝을 나타낸다. |
form | 서비스 처리 결과 odata의 구성 형태로, STRUCT 버퍼인 경우에는 사용된 구조체의 각 멤버로 구성되며 FIELD KEY 버퍼인 경우에는 사용된 필드명으로 구성된다. 각 멤버 혹은 필드명은 NewLine("~n")으로 구분되고 마지막에는 NewLine("~n")을 추가하여 Form의 끝을 알린다. 최종적인 Form 배열의 끝을 나타내기 위해 NewLine("~n")으로 구성된 Form을 추가한다. |
odata | 서비스 처리 결과를 저장할 버퍼의 각 데이터는 PowerBuilder의 ImportString 함수를 사용하여 간단하게 데이터를 DataWindow에 넣을 수 있도록 TAB("~t")으로 구분되어 있고, 각 Row는 NewLine("~n")으로 구분되어 있다. |
다음은 Tmax의 인스턴스 변수이며 이 중 flags와 timeout은 서비스 호출 전에 설정되는 값이며 나머지는 서비스 호출 후 설정되는 값이다.
변수 | 설명 |
---|---|
msg | 서비스 프로그램에서 보내온 메시지이다. |
tperrno | 에러가 발생한 경우 에러 코드가 저장될 버퍼이다. |
tpurcode | 서버에서 보내온 User Code(tpreturn의 두 번째 인수)가 저장될 버퍼이다. |
flags | pb_tpcall에서 사용되는 flags는 다음과 같다.
|
timeout | pb_tx_set_transaction_timeout에서 사용되는 Blocking Timeout 시간값을 의미한다. |
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정되고, msg에 에러 메시지가 저장된다. |
오류
에러 코드에 대한 자세한 사항은 “Tmax Reference Guide”의 “3.1.30. tpcall”을 참고한다.
예제
STRUCT 버퍼를 사용할 경우
string itype, input, form[], output[] int ret itype = "STRUCT~t" + "kstrdata~n" input = string(len(before.text)) + "~t" + before.text + "~n" form[1] = "len" + "~n" + & "sdata" + "~n" + & "~n" form[2] = "~n" output[1] = space(1024) uo_tmax.flags = uo_tmax.TPNOCHANGE uo_tmax.timeout = 50 ret = uo_tmax.pb_tpcall("SYNC", itype, input, form, output) if ret < 0 then messagebox("ERROR","tpcall Failed : Error Code =" + string(uo_tmax.tperrno)) return end if afterlen.text = uo_tmax.f_getdata(form[1], output[1], 1, "len") afterdata.text = uo_tmax.f_getdata(form[1], output[1], 1, "sdata")
FIELD KEY 버퍼를 사용할 경우
long ret string itype, input, form[], output[] if isnull(sle_1.text) or sle_1.text = '' then … end if itype = "FIELD~t~n" input = "INPUT~t" + sle_1.text + "~n" form[1] = "OUTPUT~n~n" form[2] = "~n" output[1] = space(40) ret = uo_tmax.pb_tpcall("FDLTOUPPER", itype, input, form[], output[]) if ret < 0 then error processing … end if …
관련함수
pb_tpacall(), pb_tpgetrply()
DataWindow를 사용하여 동기형으로 Tmax 서비스를 호출하기 위한 함수이다. iobject에 지정된 PowerObject를 입력하여 서비스를 호출한 후, 반환된 결과를 oobject에 지정된 PowerObject에 넣는다. 이 함수는 FIELD 버퍼를 사용한다.
프로토타입
pb_tpcallw ( string svcname, powerobject iobject[], powerobject oobject[] ) returns integer
파라미터
파라미터 | 설명 |
---|---|
svcname | 호출할 서비스명을 의미한다. |
iobject | iobject에 지정된 PowerObject를 입력하여 서비스를 호출한다. |
oobject | 서비스 호출 후 반환된 결과를 oobject에 지정된 Power Object에 넣는다. |
input에 사용할 수 있는 Object는 다음과 같다.
Object | 설명 |
---|---|
DataWindow, DataWindowChild, DataStore | Column명을 FIELD 버퍼의 필드명으로 사용한다. 수정된 Row만을 데이터로 사용한다. |
SingleLineEdit, MultiLineEdit | Control.Tag명을 FIELD 버퍼의 필드명으로 사용한다. Control.Text를 데이터로 사용한다. |
StaticText, EditMask | Control.Tag명을 FIELD 버퍼의 필드명으로 사용한다. Control.Text를 데이터로 사용한다. |
ListBox | Control.Tag명을 FIELD 버퍼의 필드명으로 사용한다. 선택된 모든 항목을 데이터로 사용한다. |
DropDownListBox | Control.Tag명을 FIELD 버퍼의 필드명으로 사용한다. 선택된 항목만 데이터로 사용한다. |
CheckBox | Control.Tag명을 FIELD 버퍼의 필드명으로 사용한다. 체크되어있는 경우에만 데이터로 사용한다. |
RadioButton | Control.Tag명을 FIELD 버퍼의 필드명으로 사용한다. 체크되어있는 경우에만 데이터로 사용한다. |
output에 사용할 수 있는 Object는 input에 사용할 수 있는 것과 동일하다. ListBox와 DropDownListBox의 경우에는 데이터를 추가한다. 다음은 사용되는 uo_tmax의 인스턴스 변수에 대한 설명이다.
변수 | 설명 |
---|---|
Append | TRUE일 때 output에 DataWindow가 지정되는 경우, DataWindow에 있던 기존의 데이터를 삭제하지 않고 추가만 한다. (기본값: FALSE) |
DelBuf | TRUE일 때 input에 DataWindow가 지정되는 경우, DataWindow의 DeleteBuffer와 PrimaryBuffer에서 데이터를 꺼낸다. (기본값: TRUE ) |
DataOnFail | TRUE일 때, 서비스가 실패한 경우에도 데이터를 화면에 출력한다. (기본값: FALSE) |
AppData | 서비스를 호출할 때마다 자동으로 추가되는 데이터를 pb_tpcall()의 input 형태로 지정한다. |
DateFmt, TimeFmt, DateTimeFmt | Date/Time/DateTime형의 Column값일 때 String형으로 변환할 때 참조되는 포맷을 지정한다. |
pb_tpcallw 내부적으로 pb_tpcall을 사용하므로 위의 변수 이외에, pb_tpcall()에서 사용되는 변수도 참고한다.
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정되고, msg에 에러 메시지가 저장된다. |
예제
long ret windowobject indata[], outdata[] indata[1] = dw_1 indata[2] = sle_input outdata[1] = dw_2 uo_tmax.flags = 0; ret = uo_tmax.pb_tpcallw ("SVC1", indata, outdata) if ret < 0 then error processing … end if
관련함수
pb_tpcall(), tuxcall()
pb_tpcancel()은 pb_tpacall()로 반환된 구별자를 취소하는 함수로, 호출한 서비스에 대해 수신을 취소한다. 전역 트랜잭션에 해당되는 구별자를 취소하려고 하면 에러가 발생하며, 호출이 성공하면 cd를 더 이상 사용할 수 없다. 이 함수를 이용하여 수신을 취소한 경우에는 해당 트랙잭션은 Commit할 수 없고 Rollback만 가능하다.
프로토타입
pb_tpcancel ( integer cd ) returns integer
파라미터
파라미터 | 설명 |
---|---|
cd | pb_tpacall()이 반환한 참조 구별자이다. |
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정되고, msg에 에러 메시지가 저장된다. |
오류
에러 코드에 대한 자세한 사항은 “Tmax Reference Guide”의 “3.1.32. tpcancel”을 참고한다.
예제
string input, itype, form[], output[] int length, cd, ret length = len(before.text) itype = "STRUCT~tkstrdata~n" input = string(length) + "~t" + before.text + "~n" form[1] = "len~n" + "sdata~n" + "~n" form[2] = "~n" output[1] = space(1024) cd = uo_tmax.pb_tpacall("SYNC", itype, input) if cd < 0 then error processing … end if ret = uo_tmax.pb_tpcancel(cd) if ret < 0 then error processing … end if
관련함수
pb_tpacall(), pb_tpgetrply()
트랜잭션의 작업을 Commit하는 데 사용되는 함수이다.
프로토타입
pb_tpcommit () returns integer
반환값
반환값 | 설명 |
---|---|
0 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
오류
에러 코드에 대한 자세한 사항은 “Tmax Reference Guide”의 “3.1.86. tx_commit”을 참고한다.
예제
… if _is_tx <> true then … end if ret = uo_tmax.pb_tpcommit() if ret < 0 then error processing … end If _is_tx = false …
관련함수
pb_tx_begin(), pb_tx_rollback(), pb_tpbegin()
pb_tpconnect()는 대화형 서비스와 통신을 연결하는 함수로 연결된 서버와 클라이언트는 쌍방향으로 pb_tpsend(), pb_tprecv()로 데이터를 주고받는다.
프로토타입
pb_tpconnect ( string svcname, string itype, string idata, long arg_flag ) returns integer
파라미터
파라미터 | 설명 |
---|---|
svcname | 호출할 대화형 서비스명을 의미한다. |
itype | 사용한 버퍼의 타입 문자열 형태로 TAB("~t")을 이용하여 문자열을 분리하고 NewLine("~n")을 이용하여 라인의 끝을 나타낸다. |
idata | 처리할 데이터가 저장될 버퍼 문자열 형태로 TAB("~t")을 이용하여 입력 데이터를 분리하고 NewLine("~n")을 이용하여 라인의 끝을 나타낸다. |
arg_flag | flags값이다. |
pb_tpconnect()에서 사용할 수 있는 flags값은 다음과 같다.
flags값 | 설명 |
---|---|
TPNOTRAN | pb_tpconnect() 호출자가 트랜잭션 모드 상태에서 이 flags를 설정하여 svc 서비스를 요청하였다면, svc서비스는 트랜잭션 모드에서 제외되어 수행된다. 트랜잭션 모드에서 svc가 트랜잭션을 지원하지 않는 서비스라면 pb_tpconnect()가 트랜잭션 모드에서 호출되는 경우 flags는 반드시 TPNOTRAN으로 설정해야 한다. 트랜잭션 pb_tpconnect()를 호출할 때, TPNOTRAN으로 설정되었어도 여전히 트랜잭션 Timeout의 영향을 받는다. TPNOTRAN으로 호출된 서비스가 실패하였을 경우 호출자의 트랜잭션에는 영향을 미치지 않는다. |
TPSENDONLY | 연결이 완료된 후 함수 호출자는 처음 데이터를 송신만 할 수 있고 요청된 서비스만 할 수 있도록 설정하는 flags로, 호출자가 처음 통신 제어권을 가진다. TPSENDONLY나 TPRECVONLY 중 하나는 반드시 지정되어야 한다. |
TPRECVONLY | 연결이 완료된 후 함수 호출자는 데이터를 수신할 수만 있고 요청된 서비스가 처음 데이터를 송신을 시작하도록 하는 flags로, 요청된 서비스가 처음 통신 제어권을 가진다. TPSENDONLY나 TPRECVONLY 중 하나는 반드시 지정되어야 한다. |
TPNOTIME | TPNOTIME flag는 함수 호출자가 Blocking Timeout을 무시하고 응답이 수신될 때까지 계속해서 기다리겠다는 것을 의미한다. 그러나 트랜잭션 Timeout 내에서 pb_tpconnect()를 한 경우에는 여전히 Blocking Timeout이 적용된다. |
TPSIGSTRT | 시그널 인터럽트(signal Interrupt)를 수용하고자 할 때 사용한다. 내부에서 시그널 인터럽트가 발생하여 시스템 함수 호출이 방해될 때 시스템 함수가 재호출된다. flags가 설정되지 않고 시그널 인터럽트가 발생하였다면 함수는 실패하고 tperrno에 TPGOTSIG가 설정된다. |
반환값
반환값 | 설명 |
---|---|
참조될 구별자 (1 이상의 cd값) | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정되고, msg에 에러 메시지가 저장된다. |
오류
에러 코드에 대한 자세한 사항은 “Tmax Reference Guide”의 “3.1.34. tpconnect”를 참고한다.
예제
int ret, cd string itype, otype, idata, form[], odata[] itype = "STRING~t~n" otype = "STRING~t~n" idata = string(len(before.text)) + "~t" + before.text + "~n" odata[1] = space(1024) cd = uo_tmax.pb_tpconnect("CONV", itype, idata, uo_tmax.TPRECVONLY) if cd < 0 then error processing … end if ret = uo_tmax.pb_tprecv(cd, form, odata, uo_tmax.TPFLAGS) if ret < 0 then if uo_tmax.revent <> uo_tmax.TPEV_SENDONLY or & uo_tmax.revent = uo_tmax.TPEV_SVCSUCC then error processing … end if … end if
관련함수
pb_tpsend(), tp_tprecv(), pb_tpdiscon()
cd에 의해 지정된 대화형 서비스에 대해 메시지를 송수신하는 함수이다. tp_conv()는 Tmax에서 지원하는 버퍼 유형 중 FIELD 버퍼를 사용한다.
프로토타입
pb_tpconv ( long cd, string itype, string idata, ref string form[], ref string odata[], long arg_flag ) returns integer
파라미터
파라미터 | 설명 |
---|---|
cd | tp_connect()가 반환한 참조 cd 구별자이다. |
itype | 사용한 버퍼의 타입 문자열 형태로 TAB("~t")을 이용하여 문자열을 분리하고 NewLine("~n")을 이용하여 라인의 끝을 나타낸다.
|
idata | 서비스명을 포함하여 데이터 문자열을 구성한다. 문자열 형태로 TAB("~t")을 이용하여 입력 데이터를 분리하고 NewLine("~n")을 이용하여 라인의 끝을 나타낸다. |
form | 서비스 처리 결과 odata의 구성 형태 필드명은 NewLine("~n")으로 구분되고 마지막에는 NewLine("~n")을 추가하여 Form의 끝을 알린다. 최종적인 Form 배열의 끝을 나타내기 위해 NewLine("~n")으로 구성된 Form을 추가한다. |
odata | 서비스 처리 결과를 저장할 버퍼의 각 데이터는 PowerBuilder의 ImportString 함수를 사용하여 간단하게 데이터를 DataWindow에 넣을 수 있도록 TAB("~t")으로 구분되어 있고, 각 Row는 NewLine("~n") 으로 구분되어 있다. |
arg_flag | pb_tpsend(), pb_tprecv()에서 사용한 flags값을 모두 사용할 수 있다. |
예제
int ret, cd string idata, itype itype = "FIELD~t~n" input = "INPUT~t" + sle_1.text + "~n" form[1] = "OUTPUT~n~n" form[2] = "~n" output[1] = space(1024) cd = uo_tmax.tp_connect(idata, uo_tmax.TPRECVONLY) if cd < 0 then error processing … end if ret = uo_tmax.pb_tpconv(cd, itype, idata, form, output, uo_tmax.TPNOFLAGS) if ret < 0 then if uo_tmax.revent <> uo_tmax.TPEV_SENDONLY or & uo_tmax.revent = uo_tmax.TPEV_SVCSUCC then error processing … end if … end if …
pb_tpdiscon()은 대화의 연결을 강제로 해제하고, TPEV_DISCONIMM 이벤트를 발생시키는 함수로, 대화형 통신을 시작한 측에서만 호출할 수 있다.
프로토타입
pb_tpdiscon ( integer cd ) returns integer
파라미터
파라미터 | 설명 |
---|---|
cd | pb_tpconnect()가 반환한 참조 구별자를 의미한다. |
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
오류
에러 코드에 대한 자세한 사항은 “Tmax Reference Guide”의 “3.1.37. tpdiscon”을 참고한다.
예제
int ret, cd string itype, otype, idata, form[], odata[] itype = "STRING~t~n" otype = "STRING~t~n" idata = string(len(before.text)) + "~t" + before.text + "~n" odata[1] = space(1024) cd = uo_tmax.pb_tpconnect("CONV", itype, idata, uo_tmax.TPSENDONLY) if cd < 0 then error processing … end if ret = uo_tmax.pb_tpdiscon(cd) if ret < 0 then error processing … end if
관련함수
pb_tpconnect(), tp_tpsend(), pb_tprecv()
프로토타입
pb_tpend() returns integer
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
오류
에러 코드에 대한 자세한 사항은 “Tmax Reference Guide”의 “3.3.3. tpend”를 참조한다.
예제
long ret u_tmax uo_tmax uo_tmax = CREATE u_tmax … ret = uo_tmax.pb_tpend() if ret < 0 then error processing … end if
관련함수
tp_term()
pb_tpcall() 함수를 확장한 형태로 파일로부터 입력 데이터를 받아들일 수 있으며 결과 데이터를 파일에 저장할 수 있다. Tmax에서 지원하는 버퍼 유형 중 FILED 버퍼를 사용하며 결과 데이터 중 form에 지정된 필드의 데이터는 output에 저장되며 fform에 지정된 필드의 데이터는 fodata의 파일에 저장된다.
프로토타입
pb_tpfcall ( string svcname, string itype, string idata, string form[], ref string odata[], string ifilename, string fform[], ref string fodata[] ) returns integer
파라미터
파라미터 | 설명 |
---|---|
svcname | 호출할 서비스명을 의미한다. |
itype | 사용한 버퍼의 타입 문자열 형태로 TAB("~t")을 이용하여 문자열을 분리하고 NewLine("~n")을 이용하여 라인의 끝을 나타낸다. |
idata | 처리할 데이터가 저장될 버퍼 문자열 형태로 TAB("~t")을 이용하여 입력 데이터를 분리하고 NewLine("~n")을 이용하여 라인의 끝을 나타낸다. |
form | 서비스 처리 결과 odata의 구성 형태 STRUCT 버퍼인 경우에는 사용된 구조체의 각 멤버로 구성되며 FIELD KEY 버퍼인 경우에는 사용된 필드명으로 구성된다. 각 멤버 혹은 필드명은 NewLine("~n")으로 구분되고 마지막에는 NewLine("~n")을 추가하여 Form의 끝을 알린다. 최종적인 Form 배열의 끝을 나타내기 위해 NewLine("~n")으로 구성된 Form을 추가한다. |
odata | 서비스 처리 결과를 저장할 버퍼 각 데이터는 PowerBuilder의 ImportString 함수를 사용하여 간단하게 데이터를 DataWindow에 넣을 수 있도록 TAB("~t")으로 구분되어 있고, 각 Row는 NewLine("~n")으로 구분되어 있다. |
ifilename | 입력할 데이터가 저장되어 있는 파일의 형태는 필드명과 데이터를 TAB("~t")으로 구분하고 데이터의 끝부분을 표시하는 NewLine("~n")을 덧붙인다. (예: FIELD_NAME1+ "~t" + VALUE1+ "~n" + & FIELD_NAME2+ "~t" +VALUE2+ "~n" + & "~n") |
fform | 서비스 처리 결과 fodata의 구성 형태 STRUCT 버퍼인 경우에는 사용된 구조체의 각 멤버로 구성되며 FIELD KEY 버퍼인 경우에는 사용된 필드명으로 구성된다. 각 멤버 혹은 필드명은 NewLine("~n")으로 구분되고 마지막에는 NewLine("~n")을 추가하여 Form의 끝을 알린다. 최종적인 Form 배열의 끝을 나타내기 위해 NewLine("~n")으로 구성된 Form을 추가한다. |
fodata | 서비스 처리 결과를 저장할 파일명을 의미한다. |
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정되고, msg에 에러 메시지가 저장된다. |
예제
... InputFile ="c:\temp\fdata0.txt" InputFile = FileOpen(InputFile, StreamMode!, Write!, LockReadWrite!, Replace!) ... uo_tmax.f_fdata(dw_input, InputFile) if FileClose(InputFile) <> 1 then error processing … end if ... ret = uo_tmax.pb_tpfcall("FCALL", itype, input, form, output, inputfilename, fform, foutput) if ret = -1 then error processing … end if ...
관련함수
f_fdata
pb_tpfree()는 pb_tpalloc()으로 얻은 버퍼를 해제하는 함수이다.
tpfree()는 버퍼를 해제하기 전에 이와 관련된 정보도 제거한다. pb_tpfree()가 정상적으로 수행되면 buf는 XATMI 루틴에 파라미터로 전달될 수 없으며 다른 방식으로 사용될 수 없다.
프로토타입
pb_tpfree ( long buf )
파라미터
파라미터 | 설명 |
---|---|
buf | 이전에 pb_tpalloc()으로 얻은 버퍼에 대한 주소이다. buf가 NULL이면, 아무 일도 일어나지 않는다. 버퍼를 제거하는 과정에서 일부 버퍼 유형은 관련 데이터나 상태 정보를 해제할 필요가 있다. |
반환값
pb_tpfree()는 함수 호출자에게 아무 값도 반환하지 않는다.
예제
long ret long buf u_tmax uo_tmax uo_tmax = CREATE u_tmax … ret = uo_tmax.pb_tpstart() if ret < 0 then error processing … end if … buf = uo_tmax.pb_tpalloc("CARRAY", "", 40000) if buf = 0 then error process … end if … pb_tpfree(buf)
관련함수
pb_tpalloc()
첫 번째 파라미터에서 지정한 주소에 해당하는 데이터를 두 번째 파라미터에서 지정한 버퍼에 세 번째 파라미터에서 지정한 size만큼 읽어 오는 함수이다.
Power Builder에서는 char *라는 주소 개념이 없기 때문에 long형의 주소를 <pb.dll>에 전달하게 되며 <pb.dll>로부터 해당 주소에 있는 string 데이터를 받아 두 번째 파라미터로 입력한다.
프로토타입
pb_tpget ( long buf, ref string loc, long size ) returns long
파라미터
파라미터 | 설명 |
---|---|
buf | 읽어 올 데이터의 주소를 long형으로 지정한다. |
loc | 지정한 주소에 해당하는 데이터를 <pb.dll>로부터 전달받은 후 loc에 저장한다. |
size | 읽어 올 데이터의 길이를 지정한다. |
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
오류
tperrno에 에러 코드가 설정된다.
에러 코드 | 설명 |
---|---|
TPEINVAL | 입력 파라미터가 유효하지 않은 경우로 rcvbuf가 NULL이거나 mid가 0보다 작은 경우이다. |
TPEITYPE | Power Builder에서 확보된 메모리 영역이 수신 데이터보다 작은 경우에 발생한다. |
TPEOTYPE | 수신 데이터가 없거나 부적절한 경우이다. |
TPEMATCH | 주어진 mid에 해당하는 데이터가 없는 경우이다. |
예제
ret_string = Space(20) ll_ret = uo_tmax.pb_tpget(buf, ret_string, 20)
관련함수
pb_tpput()
pb_tpacall()에서 보낸 요청에 대한 응답을 받는 데 사용하는 함수로, 기본적으로 Blocking 통신이다. 일단 호출하면 응답을 받거나 Blocking Timeout이 발생할 때까지 기다린다. Timeout이 발생하면 호출은 실패하고 tperrno에 TPETIME가 설정된다.
프로토타입
pb_tpgetrply ( integer cd, ref string form[], ref string odata[] ) returns integer
파라미터
파라미터 | 설명 |
---|---|
cd | pb_tpacall()이 반환한 참조 구별자 요청된 것에 대응하는 응답을 구별할 수 있도록 한다. |
form | 서비스 처리 결과 odata의 구성 형태 STRUCT 버퍼인 경우에는 사용된 구조체의 각 멤버로 구성되며 FIELD KEY 버퍼인 경우에는 사용된 필드명으로 구성된다. 각 멤버 혹은 필드명은 NewLine("~n")으로 구분되고 마지막에는 NewLine("~n")을 추가하여 Form의 끝을 알린다. 최종적인 Form 배열의 끝을 나타내기 위해 NewLine("~n")으로 구성된 Form을 추가한다. |
odata | 서비스 처리 결과를 저장할 버퍼 각 데이터은 PowerBuilder의 ImportString 함수를 사용하여 간단하게 데이터를 DataWindow에 넣을 수 있도록 TAB("~t")으로 구분되어 있고, 각 Row는 NewLine("~n")으로 구분되어 있다. |
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정되고, msg에 에러 메시지가 저장된다. |
오류
에러 코드에 대한 자세한 사항은 “Tmax Reference Guide”의 “3.1.53. tpgetrply”를 참고한다.
예제
string input, itype, form[], output[] int length, cd, ret length = len(before.text) itype = "STRUCT~tkstrdata~n" input = string(length) + "~t" + before.text + "~n" form[1] = "len~n" + "sdata~n" + "~n" form[2] = "~n" output[1] = space(1024) cd = uo_tmax.pb_tpacall("SYNC", itype, input) if cd < 0 then error processing … end if ret = uo_tmax.pb_tpgetrply(cd, form, output) if ret < 0 then error processing … end if
관련함수
f_form(), pb_tpacall(), pb_tpcancel(), pb_tpcall()
비요청 수신 메시지를 처리하기 위한 함수로 pb_tpsetunsol()과 다르게 Blocking될 수 있으므로 사용할 경우 주의한다. 자세한 사항은 “Tmax Reference Guide”의 “3.3.5. tpgetunsol”을 참고한다.
프로토타입
pb_tpgetunsol ( integer types, string form[], ref string odata[], integer arg_flags ) returns integer
파라미터
파라미터 | 설명 |
---|---|
types | 비요청 메시지 수신 타입을 설정한다. 설정할 수 있는 값은 'TPBROADCAST', 'TPSENDTOCLI'이다. |
form | 비요청 수신 데이터의 Form을 설정한다. |
odata | 비요청 수신 데이터를 받을 버퍼를 설정한다. |
arg_flag | Blocking 처리 여부를 결정하는 파라미터로 다음 중에 하나를 설정한다.
|
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
오류
tperrno에 에러 코드가 설정된다.
에러 코드 | 설명 |
---|---|
TPEINVAL | 입력 파라미터가 유효하지 않은 경우로, rcvbuf가 NULL이거나 mid가 0보다 작은 경우이다. |
TPEITYPE | Power Builder에서 확보된 메모리 영역이 수신 데이터보다 작은 경우에 발생한다. |
TPEOTYPE | 수신 데이터가 없거나 부적절한 경우이다. |
TPEMATCH | 주어진 mid에 해당하는 데이터가 없는 경우이다. |
예제
string form[], tmp[] … tmp[1] = space(30) ret = uo_tmax.pb_tpgetunsol(uo_tmax.TPBROADCAST, form[], tmp[], uo_tmax.TPBLOCK) if ret < 0 then error processing … end if …
관련함수
pb_tpsetunsol(), pb_getunsold()
첫 번째 파라미터에서 지정한 주소에 두 번째 파라미터로 지정한 데이터를 세 번째 파라미터로 지정한 size만큼 저장하는 함수이다.
프로토타입
pb_tpput ( long buf, any value, long size ) returns long
파라미터
파라미터 | 설명 |
---|---|
buf | 저장할 데이터의 주소를 long형으로 지정한다. |
loc | 해당 주소에 저장할 데이터를 지정한다. |
size | 저장할 데이터의 길이를 지정한다. |
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
오류
tperrno에 에러 코드가 설정된다.
에러 코드 | 설명 |
---|---|
TPEINVAL | 입력 파라미터가 유효하지 않은 경우로 rcvbuf가 NULL이거나 mid가 0보다 작은 경우이다. |
TPEITYPE | Power Builder에서 확보된 메모리 영역이 수신 데이터보다 작은 경우에 발생한다. |
TPEOTYPE | 수신 데이터가 없거나 부적절한 경우이다. |
TPEMATCH | 주어진 mid에 해당하는 데이터가 없는 경우이다. |
예제
blob lb_tmp bytes_read = FileRead(li_FileNum, lb_tmp) ll_ret = uo_tmax.pb_tpput(buf, lb_tmp, bytes_read)
관련함수
pb_tpget()
pb_tprecv()는 대화형 통신에서 데이터를 수신하는 데 사용된다. 호출자는 반드시 통신 제어권을 가지고 있지 않아야 한다.
프로토타입
pb_tprecv ( integer cd, ref string form[], ref string odata[], long arg_flag ) returns integer
파라미터
파라미터 | 설명 |
---|---|
cd | pb_tpconnect()가 반환한 참조 구별자를 의미한다. |
form | 서비스 처리 결과 odata의 구성 형태 STRUCT 버퍼인 경우에는 사용된 구조체의 각 멤버로 구성되며 FIELD KEY 버퍼인 경우에는 사용된 필드명으로 구성된다. 각 멤버 혹은 필드명은 NewLine("~n")으로 구분되고 마지막에는 NewLine("~n")을 추가하여 Form의 끝을 알린다. 최종적인 Form 배열의 끝을 나타내기 위해 NewLine("~n")으로 구성된 Form을 추가한다. |
odata | 서비스 처리 결과를 저장할 버퍼 각 데이터는 PowerBuilder의 ImportString 함수를 사용하여 간단하게 데이터를 DataWindow에 넣을 수 있도록 TAB("~t")으로 구분되어 있고, 각 Row는 NewLine("~n")으로 구분되어 있다. |
arg_flag | flags값이다. |
pb_tprecv()에서 사용할 수 있는 flags값은 다음과 같다.
flags값 | 설명 |
---|---|
TPNOBLOCK | 데이터가 도착할 때까지 기다리지 않는다. 수신할 수 있는 데이터가 있으면 이를 반환한다. 이 flags가 지정되지 않고 수신할 수 있는 데이터가 없으면 호출자는 데이터가 도착할 때까지 기다린다. |
TPNOTIME | 함수 호출자가 Blocking Timeout을 무시하고 응답이 수신될 때까지 계속해서 기다리겠다는 것을 의미한다. 그러나 트랜잭션 Timeout 내에서 pb_tprecv()를 한 경우에는 여전히 Blocking Timeout이 적용된다. |
TPSIGRSTRT | 시그널 인터럽트를 수용하려고 할 때 사용한다. 내부에서 시그널 인터럽트가 발생하여 시스템 함수 호출이 방해될 때 시스템 함수 호출이 재실행된다. 이 flags가 설정되지 않은 경우 시그널 인터럽트가 발생했다면 함수는 실패하고(tperrno에 에러 코드가 설정된다) TPGOTSIG가 설정된다. |
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. |
함수의 반환값이 -1인 경우는 2가지로 나누어 볼 수 있다. 하나는 에러가 발생한 경우이고, 다른 하나는 이벤트가 발생한 경우이다. 따라서 -1을 반환했을 때 먼저 어느 경우인지 확인해야 한다.
에러가 발생한 경우에는 tperrno에 PB_TPEEVENT 이외의 에러 코드가 저장되고, 이벤트가 발생한 경우에는 tperrno에 PB_TPEEVENT(숫자로는 22)값이 저장되며 revent에는 다음의 값 중 하나가 저장된다.
값 | 설명 |
---|---|
TPEV_DISCONIMM (숫자 1) | 대화 시작자가 pb_tpdiscon()을 사용하여 연결을 강제로 종료했다는 것을 의미한다. 또한 통신 에러 등으로 인하여 연결이 종료되었을 때에도 이 이벤트가 저장된다. |
TPEV_SVCERR (숫자 2) | 서비스가 비정상적으로 종료한 경우를 의미한다. |
TPEV_SVCFAIL (숫자 4) | 서비스에서 TPFAIL로 tpreturn한 경우이다. |
TPEV_SVCSUCC (숫자 8) | 서비스에서 SUCCESS로 반환한 경우이다(정상 종료). |
TPEV_SENDONLY (숫자 32) | 연결된 상대방 프로그램에서 통신 제어권을 포기하였다. TPEV_SENDONLY 이벤트의 수신자는 데이터를 송신할 수는 있지만 수신자가 제어권을 넘길 때까지는 어떤 데이터도 수신할 수 없다. |
PB_TPEV_SVCSUCC, PB_TPEV_SVCFAIL | tpurcoode에 서비스에서 송신한 User Code가 저장된다. |
오류
에러 코드에 대한 자세한 사항은 “Tmax Reference Guide”의 “3.1.66. tprecv”를 참고한다.
예제
int ret, cd string itype, otype, idata, form[], odata[] itype = "STRING~t~n" otype = "STRING~t~n" idata = string(len(before.text)) + "~t" + before.text + "~n" odata[1] = space(1024) cd = uo_tmax.pb_tpconnect("CONV", itype, idata, uo_tmax.TPSENDONLY) if cd < 0 then error processing … end if ret = uo_tmax.pb_tprecv(cd, form, odata, uo_tmax.TPNOFLAGS) if ret < 0 then if uo_tmax.revent <> uo_tmax.TPEV_SENDONLY or & uo_tmax.revent = uo_tmax.TPEV_SVCSUCC then error processing … end if … end if
관련함수
pb_tpconnect(), tp_tprecv(), pb_tpdiscon()
pb_tpreset()은 현재 접속된 연결을 즉시 해제하는 함수이다. 클라이언트 모듈에 TPESYSTEM 에러가 발생하는 경우는 거의 네트워크 오류이므로 Tmax 시스템에 재접속하는 것이 좋다. 이 경우 pb_tpreset()을 사용하여 접속된 연결을 해제하고 서비스를 재요청하거나 Tmax 시스템에 다시 접속한다.
프로토타입
pb_tpreset () returns integer
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
오류
에러 코드에 대한 자세한 사항은 "Tmax Reference Guide"를 참고한다.
예제
long ret u_tmax uo_tmax uo_tmax = CREATE u_tmax uo_tmax.usr_name = 'tmaxclient' uo_tmax.clt_name = 'cilent01' uo_tmax.dom_pwd = 'tmax' uo_tmax.usr_pwd = 'client01' uo_tmax.flags = uo_tmax.TPUNSOL_IGN … ret = uo_tmax.pb_tpstart() if ret < 0 then error processing … end if … ret = uo_tmax.pb_tpreset() if ret < 0 then error processing … endif
pb_tpsend()는 대화형 통신에서 상대방에게 데이터를 송신하는 데 사용되는 함수로, 호출자는 반드시 통신 제어권을 가지고 있어야 한다.
프로토타입
pb_tpsend ( integer cd, string itype, string idata, long arg_flag ) returns integer
파라미터
파라미터 | 설명 |
---|---|
svcname | pb_tpconnect()가 반환한 참조 구별자이다. |
itype | 사용한 버퍼의 타입 문자열 형태로 TAB("~t")을 이용하여 문자열을 분리하고 NewLine("~n")을 이용하여 라인의 끝을 나타낸다. |
idata | 처리할 데이터가 저장될 버퍼 문자열 형태로 TAB("~t")을 이용하여 입력 데이터를 분리하고 NewLine("~n")을 이용하여 라인의 끝을 나타낸다. |
arg_flag | flags값이다. |
pb_tpsend()에서 사용할 수 있는 flags값은 다음과 같다.
flags값 | 설명 |
---|---|
TPRECVONLY | TPRECVONLY flags는 호출자가 데이터를 송신한 후 통신 제어권을 상대방에게 넘긴다는 의미이다. 따라서 호출자는 다시 통신 제어권을 넘겨받기 전까지 pb_tpsend()를 호출할 수 없다. 대화 상대방 수신자는 pb_tprecv()로 데이터를 수신하면서 통신 제어권을 갖게 됨을 의미하는 TPEV_SENDONLY 이벤트를 수신하게 된다. 수신자 또한 다시 통신 제어권을 상대방에게 넘기기 전까지 pb_tprecv()를 호출할 수 없다. |
TPNOBLOCK | Blocking 상황에서(예를 들어 내부 버퍼가 전달될 메시지로 가득찬 경우) 데이터와 이벤트는 송신되지 않는다. TPNOBLOCK flags를 설정하지 않고 pb_tpsend()를 호출할 경우 Blocking 상황이 발생하면 호출자는 Timeout(트랜잭션 또는 Blocking Timeout 중 하나)이 발생하거나 상황이 완화될 때까지 기다린다. |
TPNOTIME | TPNOTIME flag는 함수 호출자가 Blocking Timeout을 무시하고 응답이 수신될 때까지 계속해서 기다리겠다는 것을 의미한다. 그러나 트랜잭션 timeout 내에서 pb_tpconnect()를 한 경우에는 여전히 트랜잭션 timeout이 적용된다. |
TPSIGSTRT | 시그널 인터럽트를 수용하고자 할 때 사용한다. 내부에서 시그널 인터럽트가 발생하여 시스템 함수 호출이 방해될 때 시스템 함수가 재호출된다. flags가 설정되지 않고 시그널 인터럽트가 발생했다면 함수는 실패하고 tperrno에 TPGOTSIG가 설정된다. |
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. |
함수의 반환값이 -1인 경우는 2가지로 나누어 볼 수 있다. 하나는 에러가 발생한 경우이고, 다른 하나는 이벤트가 발생한 경우이다. 따라서 -1을 반환했을 때, 어느 경우인지를 먼저 확인해야 한다.
에러가 발생한 경우에는 tperrno에 에러 코드(PB_TPEEVENT 이외의 값)이 저장되고, 이벤트가 발생한 경우에는 tperrno에 PB_TPEEVENT(숫자로는 22)값이 저장되며 revent에는 다음의 값 중 하나가 저장된다
값 | 설명 |
---|---|
TPEV_DISCONIMM (숫자 1) | 대화 시작자가 pb_tpdiscon()을 사용하여 연결을 강제로 종료했다는 것을 의미한다. 또한 통신 에러 등으로 인하여 연결이 끊어졌을 때에도 이 이벤트가 저장된다. |
TPEV_SVCFAIL (숫자 4) | 서비스에서 TPFAIL로 tpreturn한 경우를 의미한다. |
TPEV_SVCERR (숫자 2) | 서비스가 비정상적으로 종료한 경우를 의미한다. |
PB_TPEV_SVCSUCC, PB_TPEV_SVCFAIL | tpurcoode에 서비스에서 송신한 User Code가 저장된다. |
오류
에러 코드에 대한 자세한 사항은 “Tmax Reference Guide”의 “3.1.69. tpsend”를 참고한다.
예제
int ret, cd string itype, otype, idata, form[], odata[] itype = "STRING~t~n" otype = "STRING~t~n" idata = string(len(before.text)) + "~t" + before.text + "~n" odata[1] = space(1024) cd = uo_tmax.pb_tpconnect("CONV", itype, idata, uo_tmax.TPSENDONLY) if cd < 0 then error processing … end if ret = uo_tmax.pb_tpsend(cd, itype, idata, uo_tmax.TPRECVONLY) if ret < 0 then error processing … endif
관련함수
pb_tpconnect(), tp_tprecv(), pb_tpdiscon()
pb_tpset_timeout()은 서버에 설정되어 있는 서비스 제한시간, Blocking Timeout 시간을 변경할 때 사용하는 함수로, 서비스 제한시간을 설정한 경우 arg_timeout 동안 서비스 요청에 대한 응답을 기다린다. arg_timeout에 설정된 시간이 지나도록 응답을 수신하지 못하면 Timeout 에러를 발생하고, 요청한 서비스에 대한 응답을 기다리지 않고 서비스 실패로 반환된다.
pb_tpset_timeout()은 pb_tpset_timeout()이 호출된 이후의 서비스 요청에 적용되며, 다시 pb_tpset_timeout()이 호출되거나, 그렇지 않으면 클라이언트나 서버 프로세스가 종료될 때까지 유효하다. pb_tpset_timeout()이 사용되지 않는다면, Blocking Timeout으로 Tmax 환경 파일에 설정된 BLOCKTIME이 적용된다.
프로토타입
pb_tpset_timeout ( integer arg_timeout ) returns integer
파라미터
파라미터 | 설명 |
---|---|
arg_timeout | 서비스 제한시간으로 arg_timeout 동안 서비스 요청에 대한 응답을 기다린다. (단위: 초) |
반환값
반환값 | 설명 |
---|---|
0 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
오류
에러 코드에 대한 자세한 사항은 “Tmax Reference Guide”의 “3.1.71. tpset_timeout”을 참고한다.
예제
long ret long buf u_tmax uo_tmax uo_tmax = CREATE u_tmax uo_tmax.usr_name = 'tmaxclient' uo_tmax.clt_name = 'cilent01' uo_tmax.dom_pwd = 'tmax' uo_tmax.usr_pwd = 'client01' uo_tmax.flags = uo_tmax.TPUNSOL_IGN … ret = uo_tmax.pb_tpstart() if ret < 0 then error processing … end if … buf = uo_tmax.pb_tpalloc("CARRAY", "", 40000) … ret = uo_tmax.pb_tpset_timeout(5) if ret < 0 then error processing … end if … ret = uo_tmax.pb_tpcall("SYNC", itype, input, form, output)
비요청 수신 메시지를 받도록 설정하는 함수이다. 이렇게 수신된 메시지는 pb_getunsold()를 통해서 비요청 수신 메시지를 처리하게 된다. pb_tpsetunsol(), pb_getunsold()를 사용하여 비요청 수신 메시지를 받을 때는 반드시 u_tmax의 instance 변수인 flags에 TPUNSOL_HND로 설정한 후 pb_tpstart()를 한다.
프로토타입
pb_tpsetunsol (unsignedinteger hwnd, string ename, unsignedinteger mid, long arg_flags) returns integer
파라미터
파라미터 | 설명 |
---|---|
hwnd | 윈도우 핸들이다. |
ename | 이벤트명으로, tppost를 사용하는 경우에 의미가 있으며 이 경우에는 서비스명과 일치해야 데이터를 수신할 수 있다 |
mid | 메시지 구분자로 이를 통해서 자신의 메시지를 찾아서 전달한다. |
arg_flags | 비요청 메시지 타입을 설정한다. 설정할 수 있는 값은 'TPBROADCAST', 'TPSENDTOCLI'이다. |
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
오류
tperrno에 에러 코드가 설정된다.
에러 코드 | 설명 |
---|---|
TPEINVAL | 입력 파라미터가 적절하지 않은 경우이다. (예: 이벤트의 길이가 최댓값(16)을 넘는 경우) |
예제
… uo_tmax.flags = uo_tmax.TPUNSOL_HND … ret = uo_tmax.pb_tpsetunsol ( HANDLE(this), "", 1025, uo_tmax.TPBROADCAST ) if ret = -1 then error processing … end if … unsoldata = space(1024) ret = uo_tmax.pb_getunsold(unsoldata, rlen, 1025) if ret < 0 then error processing … end if …
관련함수
pb_getunsold()
Tmax와 접속을 맺는 함수로, 이 함수를 호출하기 전에 Tmax와 접속하기 위한 환경변수가 지정되어야 한다. 접속 대상 서버의 IP 주소(TMAX_ HOST_ADDR), 접속 대상 서버의 포트 번호(TMAX_HOST_PORT)가 지정되어 있어야 한다. 또한 구조체를 사용할 경우 SDLFILE의 경로를, FIELD(FDL) 버퍼를 사용할 경우 FDLFILE의 경로를 환경변수에 등록해야 한다.
다음은 환경변수를 지정하는 방법이다.
DOS의 경우
<autoexec.bat>를 이용한다.
SET TMAX_HOST_ADDR=192.168.0.1 서버 IP 주소 SET TMAX_HOST_PORT=8888 서버 포트 번호 SET SDLFILE=C:\tmax\sdl\tmax.sdl 구조체 타입 사용 SET FDLFILE=C:\tmax\fdl\tmax.fdl FIELD 타입 사용
UNIX(Korn Shell)의 경우
<.profile>을 이용한다.
export TMAX_HOST_ADDR=192.168.0.1 서버 IP 주소 export TMAX_HOST_PORT=8888 서버 포트 번호 export SDLFILE=C:\tmax\sdl\tmax.sdl 구조체 타입 사용 export FDLFILE=C:\tmax\fdl\tmax.fdl FIELD 타입 사용
다음은 함수에 대한 설명이다.
프로토타입
pb_tpstart() returns integer
u_tmax의 인스턴스 변수
변수 | 설명 |
---|---|
usr_name | 사용자 접속 usr_name 식별자이다. |
clt_name | 클라이언트 접속 식별자이다. |
dom_pwd | 도메인 접속 암호이다. |
usr_pwd | 사용자 접속 암호이다. |
flags | 비요청 메시지 유형과 시스템 접근 방법을 결정한다.
|
반환값
반환값 | 설명 |
---|---|
0 또는 1 | 함수 호출에 성공한 경우이다.
|
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
오류
에러 코드에 대한 자세한 사항은 “Tmax Reference Guide”의 “3.3.10. tpstart”를 참고한다.
예제
long ret u_tmax uo_tmax uo_tmax = CREATE u_tmax uo_tmax.usr_name = 'tmaxclient' uo_tmax.clt_name = 'cilent01' uo_tmax.dom_pwd = 'tmax' uo_tmax.usr_pwd = 'client01' uo_tmax.flags = uo_tmax.TPUNSOL_IGN … ret = uo_tmax.pb_tpstart() if ret < 0 then error processing … end if …
관련함수
pb_tmaxreadenv(), tp_init()
클라이언트가 Tmax 시스템에 연결하는 함수인 pb_tpstart()는 연결하려는 서버가 비정상적이어서 연결할 수 없을 경우 자동적으로 백업 시스템에 연결을 시도한다. pb_tptobackup()은 처음부터 백업 시스템에 연결하는 함수로, 사용자가 임의로 백업 시스템에 연결하고자 할 때 사용한다.
pb_tptobackup()은 파라미터로 TPSTART_T를 받지 않으므로 보안이 필요한 시스템에는 접속할 수 없다. 이 함수로 연결될 백업 시스템은 보안에 관련된 항목을 환경 파일에 설정하면 접속할 수 없다. tptobackup()을 사용하려면 TMAX_BACKUP_ADDR과 TMAX_BACKUP_PORT를 시스템 환경 파일(예: Korn Shell의 <.profile>)에 등록해야 한다.
프로토타입
pb_tptobackup () returns integer
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
오류
에러에 대한 자세한 내용은 “Tmax Reference Guide”의 “3.3.12. tptobackup”을 참고한다.
예제
long ret u_tmax uo_tmax uo_tmax = CREATE u_tmax … ret = uo_tmax.pb_tptobackup() if ret < 0 then error processing … end if …
전역 트랜잭션을 시작하는 함수로 함수 호출자는 트랜잭션 모드가 된다. 일단 트랜잭션이 시작되면, 호출자는 현재 트랜잭션을 완료하기 위해서 pb_tx_commit() 또는 pb_tx_rollback()을 호출해야 한다.
프로토타입
pb_tx_begin () returns integer
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
오류
에러 코드에 대한 자세한 사항은 “Tmax Reference Guide”의 “3.1.85. tx_begin”을 참고한다.
예제
… if _is_tx <> true then ret = uo_tmax.pb_tx_begin() if ret < 0 then error processing … end if _is_tx = true end If …
관련함수
pb_tx_commit(), pb_tx_rollback()
트랜잭션의 작업을 Commit하는 데 사용하는 함수이다.
프로토타입
pb_tx_commit () returns integer
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
오류
에러 코드에 대한 자세한 사항은 “Tmax Reference Guide”의 “3.1.86. tx_commit”을 참고한다.
예제
… if _is_tx <> true then … end if ret = uo_tmax.pb_tx_commit() if ret < 0 then error processing … end If _is_tx = false …
관련함수
pb_tx_begin(), pb_tx_rollback()
트랜잭션의 작업을 Rollback하는 데 사용되는 함수이다.
프로토타입
pb_tx_rollback () returns integer
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
오류
에러 코드에 대한 자세한 사항은 “Tmax Reference Guide”의 “3.1.88. tx_rollback”을 참고한다.
예제
… ret = uo_tmax.pb_tpcall("INSERT", itype, input, form[], output[]) if ret < 0 then if _is_tx = true then ret = uo_tmax.pb_tx_rollback() if ret < 0 then error processing … end if _is_tx = false end if error processing … end if …
관련함수
pb_tx_begin(), pb_tx_commit(), pb_tx_info()
when_return값을 통해서 전역 트랜잭션의 Commit 시점을 결정하는 함수이다.
프로토타입
pb_tx_set_commit_return ( long w_return ) returns integer
파라미터
파라미터 | 설명 |
---|---|
w_return | 사용 가능한 값은 다음과 같다.
|
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
오류
에러 코드에 대한 자세한 사항은 “Tmax Reference Guide”의 “3.1.89. tx_set_commit_return”을 참고한다.
예제
… if ret = uo_tmax.pb_tx_set_commit_return(uo_tmax.TX_COMMIT_COMPLETED) if ret < 0 then error processing … end if if _is_tx <> true then ret = uo_tmax.pb_tx_begin() if ret < 0 then error processing … end if _is_tx = true end If …
관련함수
pb_tx_info()
control에 지정된 값을 통해서 pb_tx_commit()이나 pb_tx_rollback()이 반환되기 전에 새로운 트랜잭션의 시작 여부를 결정하는 함수이다. 초기에 지정된 control값은 TX_UNCHAINED이다.
프로토타입
pb_tx_set_transaction_control ( long control ) returns integer
파라미터
파라미터 | 설명 |
---|---|
control | 사용할 수 있는 값은 다음과 같다.
|
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
오류
에러 코드에 대한 자세한 사항은 “Tmax Reference Guide”의 “3.1.90. tx_set_transaction_control”을 참고한다.
예제
… if ret = uo_tmax.pb_tx_set_transaction_control(uo_tmax.TX_CHAINED) if ret < 0 then error processing … end if if _is_tx <> true then ret = uo_tmax.pb_tx_begin() if ret < 0 then error processing … end if _is_tx = true end If …
관련함수
pb_tx_info()
프로토타입
pb_tx_set_transaction_timeout ( long timeout ) returns integer
파라미터
파라미터 | 설명 |
---|---|
timeout | 시간을 설정한다. |
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
오류
에러 코드에 대한 자세한 사항은 “Tmax Reference Guide”의 “3.1.91. tx_set_transaction_timeout”을 참고한다.
예제
… if ret = uo_tmax.pb_tx_set_transaction_timeout(5) if ret < 0 then error processing … end if if _is_tx <> true then ret = uo_tmax.pb_tx_begin() if ret < 0 then error processing … end if _is_tx = true end If …
관련함수
pb_tx_info()
pb_uotmax_ver()는 tmax.pbd의 버전을 조회하는 함수이다.
프로토타입
pb_uotmax_ver () returns string
반환값
tmax.pbd의 버전을 반환한다.
전역 트랜잭션 정보를 조회하는 함수이다. 트랜잭션 xid에 대한 정보를 u_tmax의 data, when_return, transaction_control, transaction_timeout 및 transaction_stat에 설정한다.
프로토타입
pb_tx_info () returns integer
반환값
반환값 | 설명 |
---|---|
1 | 트랜잭션 모드에서 호출된 경우이다. Tmax의 인스턴스 변수값이 설정된다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
반환값이 1이면 Tmax의 인스턴스 변수값이 설정된다.
값 | 설명 |
---|---|
data | 현재 트랜잭션 ID값으로 "머신 번호:CLH 번호:브랜치 번호"로 구성된다. |
when_return | commit_return의 현재 설정값으로 pb_tx_set_commit_return()으로 변경된다. |
transaction_control | 트랜잭션 control의 현재 설정값으로 pb_tx_set_transaction_control()로 변경된다. |
transaction_timeout | 현재 트랜잭션의 timeout값으로 pb_tx_set_transaction_timeout()으로 변경된다. |
transaction_stat | 현재 트랜잭션 상태값이다. |
오류
에러 코드에 대한 자세한 사항은 “Tmax Reference Guide”의 “3.1.87. tx_info”를 참고한다.
예제
… if _is_tx <> true then ret = uo_tmax.pb_tx_begin() if ret < 0 then error processing … end if _is_tx = true end If if ret = uo_tmax.pb_tx_info() if ret < 0 then error processing … end if … end if
관련함수
pb_tx_begin(), pb_tx_commit(), pb_tx_rollback()
프로토타입
tp_abort ( long arg_flags ) returns integer
파라미터
파라미터 | 설명 |
---|---|
arg_flags | 현재는 사용하지 않는다. 사용자가 어떤 값을 전달해도 에러가 발생하지 않도록 지원한다. |
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
예제
… ret = uo_tmax.pb_tpcall("INSERT", itype, input, form[], output[]) if ret < 0 then if _is_tx = true then ret = uo_tmax.tp_abort(0) if ret < 0 then error processing … end if _is_tx = false end if error processing … end if …
관련함수
tp_begin(), tp_commit()
비동기 서비스 호출을 수행하는 함수이다. 서비스를 호출하고 응답을 기다리는 대신, 응답을 받을 때 (“1.2.56. tp_getrply” 참조) 사용하기 위한 참조 구별자를 반환한다. 여러 개의 서비스를 동시에 호출한 후 그 결과를 받거나, 서비스를 호출한 후 응답을 기다리는 동안 다른 작업을 할 필요가 있을 때 사용한다.
tp_acall() 함수는 Tmax에서 지원하는 버퍼 유형 중 FIELD 버퍼를 사용한다.
프로토타입
tp_acall ( ref string idata ) returns integer
파라미터
파라미터 | 설명 |
---|---|
idata | 서비스명을 포함하여 데이터 문자열을 구성한다. 문자열 형태로 TAB("~t")을 이용하여 입력 데이터를 분리하고 NewLine("~n")을 이용하여 라인의 끝을 나타낸다. |
반환값
반환값 | 설명 |
---|---|
1이상의 cd값 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
예제
string input, form[], odata[] int cd, ret … input = "SRVCNM" + "~t" + "TOUPPER" + "~n" + & "FIELD_NAME1" + "~t" + "VALUE1" + "~n" + & "FIELD_NAME2" + "~t" + "VALUE2" + "~n" + & "~n" form[1] = "OUTPUT~n~n" form[2] = "~n" output[1] = space(1024) cd = uo_tmax.tp_acall(input) if cd < 0 then error processing … end if ret = uo_tmax.tp_getrply(cd, form, output) if ret < 0 then error processing … end if
관련함수
pb_tpacall(), tp_getrply()
전역 트랜잭션을 시작하는 함수로, 함수 호출자는 트랜잭션 모드가 된다. 일단 트랜잭션이 시작되면 호출자는 현재 트랜잭션을 완료하기 위해서 tp_commit() 또는 tp_abort()를 호출해야 한다.
프로토타입
tp_begin ( unsignedlong timeout, long arg_flags ) returns integer
파라미터
파라미터 | 설명 |
---|---|
timeout | 트랜잭션이 종료되어야 하는 제한시간이다. 제한시간 이내에 트랜잭션이 종료되지 않으면 Timeout 에러가 발생하여 트랜잭션은 중단된다. (단위: 초) |
arg_flags | 현재 사용하지 않는다. |
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
예제
… if _is_tx <> true then ret = uo_tmax.tp_begin(10, 0) if ret < 0 then error processing … end if _is_tx = true end If …
관련함수
tp_commit(), tp_abort()
프로토타입
tp_broadcast ( string nodename, string usrname, string cltname, string idata ) returns integer
파라미터
파라미터 | 설명 |
---|---|
nodename | 메시지를 전달할 클라이언트가 속한 노드명이다. |
usrname | 메시지를 전달할 사용자명으로, pb_tpstart()일 경우 설정하는 usrname과 일치해야 메시지가 전달된다. |
cltname | 메시지를 전달할 클라이언트명으로, pb_tpstart()일 경우 설정하는 cltname과 일치해야 메시지가 전달된다. |
idata | 서비스명을 포함하여 data 문자열을 구성한다. 문자열 형태로 TAB("~t")을 이용하여 입력 데이터를 분리하고 NewLine("~n")을 이용하여 라인의 끝을 나타낸다. |
파라미터인 nodename, usrname, cltname은 모두 대상 클라이언트를 선택하는 데 사용되는 논리적인 이름이다. 이름 지정에는 와일드 카드(wildcards) 문자가 사용될 수 있다. usrname과 cltname은 설정되는 이름 중간에 물음표(?)나 애스터리스크(*)등의 와일드 카드가 들어갈 수 있으나 nodename는 이름 전체를 대신하여 애스터리스크(*)만이 사용될 수 있다. 또한 NULL값이 사용될 수 있는데, 이는 모든 클라이언트에 대응되는 와일드 카드로 동작한다.
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
예제
string nodename, usrname, cltname, data int ret …. nodename = "tmax" usrname = "*" cltname = "*" data = "SRVCNM" + "~t" + "BROAD" + "~n" + & "FIELD_NAME1" + "~t" + "VALUE1" + "~n" + & "~n" ret = uo_tmax.tp_broadcast(nodename, usrname, cltname, data) if ret < 0 then error processing … end if …
관련함수
pb_tpbroadcast()
동기형으로 Tmax 서비스를 호출하기 위한 함수로, idata를 이용하여 서비스를 호출하고 반환된 결과를 form에 지정된 Column의 데이터를 odata에 넣는다. tp_call()은 Tmax에서 지원하는 버퍼 유형 중 FIELD(FDL) 버퍼를 사용한다
프로토타입
tp_call ( string idata, string form[], ref string odata[] ) returns integer
파라미터
파라미터 | 설명 |
---|---|
idata | 서비스명을 포함하여 데이터 문자열을 구성한다. 문자열 형태로 TAB("~t")을 이용하여 입력 데이터를 분리하고 NewLine("~n")을 이용하여 라인의 끝을 나타낸다. |
form | 서비스 처리 결과 odata의 구성 형태 필드명은 NewLine("~n")으로 구분되고 마지막에는 NewLine("~n")을 추가하여 Form의 끝을 알린다. 최종적인 Form 배열의 끝을 나타내기 위해 NewLine("~n")으로 구성된 Form을 추가한다. |
odata | 서비스 처리 결과를 저장할 버퍼의 각 데이터는 PowerBuilder의 ImportString 함수를 사용하여 간단하게 데이터를 DataWindow에 넣을 수 있도록 TAB("~t")으로 구분되어 있고, 각 Row는 NewLine("~n")으로 구분되어 있다. |
다음은 Tmax의 인스턴스 변수이다. 이 중 flags와 timeout은 서비스 호출 전에 설정되는 값이고, 나머지는 서비스 호출 후 설정되는 값이다.
변수 | 설명 |
---|---|
msg | 서비스 프로그램에서 보내온 메시지이다. |
tperrno | 에러가 발생한 경우 에러 번호가 저장될 버퍼이다. |
tpurcode | 서버에서 보내온 User Code(tpreturn의 두 번째 인수)가 저장될 버퍼이다. |
flags | pb_tpcall에서 사용되는 flags는 다음과 같다.
[참고] tuxedo_compat(true) 설정의 경우 flags에 대한 동작이 달라진다. 자세한 내용은 tuxedo_compat()을 참고한다. |
timeout | pb_tx_set_transaction_timeout에서 사용되는 Blocking Timeout값이다. |
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정되고, msg에 에러 메시지가 저장된다. |
예제
… input = "SRVCNM" + "~t" + "TOUPPER" + "~n" + & "FIELD_NAME1" + "~t" + "VALUE1" + "~n" + & "FIELD_NAME2" + "~t" + "VALUE2" + "~n" + & "~n" form[1] = "OUTPUT~n~n" form[2] = "~n" output[1] = space(1024) ret = uo_tmax. tp_call(input, form, output) if ret < 0 then error processing … end if …
관련함수
pb_tpcall(), f_data(), f_datadel(), f_form(), tuxcall()
tp_cancel()은 tp_acall()로 반환된 구별자를 취소한다. 따라서 호출한 서비스에 대해 수신을 취소하게 된다. 수신을 취소한 경우 해당 트랜잭션은 Commit할 수 없고 Rollback만 가능하다.
프로토타입
tp_cancel ( integer cd ) returns integer
파라미터
파라미터 | 설명 |
---|---|
cd | tp_acall()이 반환한 참조 구별자이다. |
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
예제
string input, form[], odata[] int cd, ret … input = "SRVCNM" + "~t" + "TOUPPER" + "~n" + & "FIELD_NAME1" + "~t" + "VALUE1" + "~n" + & "FIELD_NAME2" + "~t" + "VALUE2" + "~n" + & "~n" form[1] = "OUTPUT~n~n" form[2] = "~n" output[1] = space(1024) cd = uo_tmax.tp_acall(input) if cd < 0 then error processing … end if ret = uo_tmax.pb_tpcancel(cd) if ret < 0 then error processing … end if
관련함수
tp_acall(), tp_getrply()
트랜잭션 작업을 Commit하는 데 사용하는 함수이다.
프로토타입
tp_commit ( long arg_flags ) returns integer
파라미터
파라미터 | 설명 |
---|---|
arg_flags | 현재는 사용하지 않는다. |
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
예제
… if _is_tx <> true then … end if ret = uo_tmax.tp_commit(0) if ret < 0 then error processing … end If _is_tx = false …
관련함수
tp_begin(), tp_abort()
tp_connect()는 대화형 서비스와 통신을 연결하는 함수이다. 함수로 연결된 서버와 클라이언트는 쌍방향으로 tp_send(), tp_recv()를 이용하여 데이터를 주고받는다. tp_connect() 함수는 Tmax에서 지원하는 버퍼 유형 중 FIELD 버퍼를 사용한다.
프로토타입
tp_connect ( string idata, long arg_flag ) returns integer
파라미터
파라미터 | 설명 |
---|---|
idata | 서비스명을 포함하여 데이터 문자열을 구성한다. 문자열 형태로 TAB("~t")을 이용하여 입력 데이터를 분리하고 NewLine("~n")을 이용하여 라인의 끝을 나타낸다. |
arg_flag | flags값이다. |
tp_connect()에서 사용할 수 있는 flags값은 다음과 같다.
flags값 | 설명 |
---|---|
TPNOTRAN | pb_tpconnect() 호출자가 트랜잭션 모드 상태에서 이 flags를 설정하여 svc 서비스를 요청했다면, svc 서비스는 트랜잭션 모드에서 제외되어 수행된다. 트랜잭션 모드에서 svc가 트랜잭션을 지원하지 않는 서비스라면, pb_tpconnect()가 트랜잭션 모드에서 호출되는 경우 flags는 반드시 TPNOTRAN으로 설정해야 한다. 트랜잭션 모드 내에서의 pb_tpconnect()를 호출할 때, TPNOTRAN으로 설정되었어도 여전히 트랜잭션 Timeout에 영향을 받는다. TPNOTRAN으로 호출된 서비스가 실패한 경우 호출자의 트랜잭션에는 영향을 미치지 않는다. |
TPSENDONLY | 연결이 완료된 후 함수 호출자는 처음 데이터를 송신만 할 수 있고, 요청된 서비스만 할 수 있도록 설정하는 flags이다. 호출자가 처음 통신 제어권을 가진다. TPSENDONLY나 TPRECVONLY 중 하나는 반드시 지정되어야 한다. |
TPRECVONLY | 연결이 완료된 후 함수 호출자는 데이터를 수신할 수만 있고, 요청된 서비스가 처음 데이터를 송신을 시작하도록 하는 flags이다. 요청된 서비스가 처음 통신 제어권을 가진다. TPSENDONLY나 TPRECVONLY 중 하나는 반드시 지정되어야 한다. |
TPNOTIME | TPNOTIME flags는 함수 호출자가 Blocking Timeout을 무시하고 응답이 수신될 때까지 계속해서 기다리겠다는 것을 의미한다. 그러나 트랜잭션 Timeout 내에서 pb_tpconnect()를 한 경우에는 여전히 트랜잭션 Timeout이 적용된다. |
TPSIGSTRT | 시그널 인터럽트를 수용할 때 사용한다. 내부에서 시그널 인터럽트가 발생하여 시스템 함수 호출이 방해될 때 시스템 함수가 재호출된다. flags가 설정되지 않고 시그널 인터럽트가 발생했다면, 함수는 실패하고 tperrno에 TPGOTSIG가 설정된다. |
반환값
반환값 | 설명 |
---|---|
참조될 구별자 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
예제
int ret, cd string idata idata = "SRVCNM" + "~t" + "CONV" + "~n" + & "FIELD_NAME1" + "~t" + "VALUE1" + "~n" + & "FIELD_NAME2" + "~t" + "VALUE2" + "~n" + & "~n" cd = uo_tmax.tp_connect(idata, uo_tmax.TPRECVONLY) if cd < 0 then error processing … end if …
관련함수
tp_send(), tp_recv(), tp_conv(), tp_discon()
tp_conv()는 cd에 의해 지정된 대화형 서비스에 대해 메시지를 송수신하는 함수로, Tmax에서 지원하는 버퍼 유형 중 FIELD 버퍼를 사용한다.
프로토타입
tp_conv ( integer cd, string idata, ref string form[], ref string odata[], long arg_flag ) returns integer
파라미터
파라미터 | 설명 |
---|---|
cd | tp_connect()가 반환한 참조 구별자를 의미한다. |
idata | 서비스명을 포함하여 데이터 문자열을 구성한다. 문자열 형태로 TAB("~t")을 이용하여 입력 데이터를 분리하고 NewLine("~n")을 이용하여 라인의 끝을 나타낸다. |
form | 서비스 처리 결과 odata의 구성 형태 필드명은 NewLine("~n")으로 구분되고 마지막에는 NewLine("~n")을 추가하여 Form의 끝을 알린다. 최종적인 Form 배열의 끝을 나타내기 위해 NewLine("~n")으로 구성된 Form을 추가한다. |
odata | 서비스 처리 결과를 저장할 버퍼 각 데이터는 PowerBuilder의 ImportString 함수를 사용하여 간단하게 데이터를 DataWindow에 넣을 수 있도록 TAB("~t")으로 구분되어 있고, 각 Row는 NewLine("~n")으로 구분되어 있다. |
arg_flag | 사용할 수 있는 값은 pb_tpsend(), pb_tprecv()에서 사용한 flags값을 모두 사용할 수 있다. |
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. |
함수의 반환값이 -1인 경우는 2가지로 나누어 볼 수 있다. 하나는 에러가 발생한 경우이고, 다른 하나는 이벤트가 발생한 경우이다. -1을 반환했을 때, 어느 경우인지를 먼저 확인해야 한다.
에러가 발생한 경우에는 tperrno에 에러 코드(PB_TPEEVENT 이외의 값)이 저장되고, 이벤트가 발생한 경우에는 tperrno에 PB_TPEEVENT(숫자로는 22)값이 저장되며 revent에는 다음의 값 중 하나가 저장된다
값 | 설명 |
---|---|
TPEV_DISCONIMM (숫자 1) | 대화 시작자가 pb_tpdiscon()을 사용하여 연결을 강제로 종료했다는 것을 의미한다. 또한 통신 에러 등으로 인하여 연결이 종료되었을 때에도 이 이벤트가 저장된다. |
TPEV_SVCERR (숫자 2) | 서비스 함수가 비정상적으로 종료한 경우이다. |
TPEV_SVCFAIL (숫자 4) | 서비스에서 TPFAIL로 tpreturn한 경우이다. |
TPEV_SENDONLY (숫자 32) | 연결된 상대방 프로그램에서 통신 제어권을 포기하였다. TPEV_SENDONLY 이벤트의 수신자는 데이터를 송신할 수는 있지만 수신자가 제어권을 넘길 때까지는 어떤 데이터도 수신할 수 없다. |
PB_TPEV_SVCSUCC, PB_TPEV_SVCFAIL | tpurcoode에 서비스에서 송신한 User Code가 저장된다. |
오류
에러 코드에 대한 자세한 사항은 “Tmax Reference Guide”의 “3.1.24. tpacall”를 참고한다.
예제
int ret, cd string idata idata = "SRVCNM" + "~t" + "CONV" + "~n" + & "FIELD_NAME1" + "~t" + "VALUE1" + "~n" + & "FIELD_NAME2" + "~t" + "VALUE2" + "~n" + & "~n" form[1] = "OUTPUT~n~n" form[2] = "~n" output[1] = space(1024) cd = uo_tmax.tp_connect(idata, uo_tmax.TPRECVONLY) if cd < 0 then error processing … end if ret = uo_tmax.tp_conv(cd, idata, form, output, uo_tmax.TPNOFLAGS) if ret < 0 then if uo_tmax.revent <> uo_tmax.TPEV_SENDONLY or & uo_tmax.revent = uo_tmax.TPEV_SVCSUCC then error processing … end if … end if …
관련함수
tp_connect(), tp_discon(), tp_send(), tp_recv()
tp_discon()은 대화의 연결을 강제로 종료하고 TPEV_DISCONIMM 이벤트를 발생시키는 함수이다.
대화형 서비스를 종료하는 정상적인 방법은 서비스에서 tpreturn을 수행하는 것이지만, 대화형 서비스를 연결한 클라이언트에서 필요에 의해 즉시 연결을 종료시킬 때 사용한다. 함수를 호출하면 이후에 서비스에서 오는 데이터는 유실되고 해당 트랜잭션에 대해서는 중단만 가능하다.
프로토타입
tp_discon ( integer cd ) returns integer
파라미터
파라미터 | 설명 |
---|---|
cd | tp_connect()가 반환한 참조 구별자를 의미한다. |
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
예제
int ret, cd string idata idata = "SRVCNM" + "~t" + "CONV" + "~n" + & "FIELD_NAME1" + "~t" + "VALUE1" + "~n" + & "FIELD_NAME2" + "~t" + "VALUE2" + "~n" + & "~n" cd = uo_tmax.tp_connect(idata, uo_tmax.TPRECVONLY) if cd < 0 then error processing … end if ret = uo_tmax.tp_discon(cd) if ret < 0 then error processing … end if …
관련함수
pb_tpconnect(), tp_tpsend(), pb_tprecv()
동기형으로 Tmax 서비스를 호출하기 위한 함수로, 확장한 형태로 메모리로부터 입력 데이터를 받아들일 뿐 아니라 파일로부터도 입력 데이터를 받아들일 수 있으며 결과 데이터를 메모리와 파일에 동시에 저장할 수 있다.
Tmax에서 지원하는 버퍼 유형 중 FIELD(FDL) 버퍼를 사용하며 결과 데이터는 form에, 지정된 필드의 데이터는 odata에 저장되며 fform에 지정된 필드의 데이터는 foutdata의 파일에 저장된다.
프로토타입
tp_fcall ( string idata, string form[], ref string odata[], string ifilename, string fform[], ref string foutdata[] ) returns integer
파라미터
파라미터 | 설명 |
---|---|
idata | 서비스명을 포함하여 데이터 문자열을 구성한다. 문자열 형태로 TAB("~t")을 이용하여 입력 데이터를 분리하고 NewLine("~n")을 이용하여 라인의 끝을 나타낸다. |
form | 서비스 처리 결과 odata의 구성 형태 필드명은 NewLine("~n")으로 구분되고 마지막에는 NewLine("~n")을 추가하여 Form의 끝을 알린다. 최종적인 Form 배열의 끝을 나타내기 위해 NewLine("~n")으로 구성된 Form을 추가한다. |
odata | 서비스 처리 결과를 저장할 버퍼 각 데이터는 PowerBuilder의 ImportString 함수를 사용하여 간단하게 데이터를 DataWindow에 넣을 수 있도록 TAB("~t")으로 구분되어 있고, 각 Row는 NewLine("~n")으로 구분되어 있다. |
ifilename | 입력할 데이터가 저장되어 있는 파일명의 형태는 필드명과 데이터를 TAB("~t")으로 구분하고 데이터의 끝부분을 표시하는 NewLine("~n")을 덧붙인다. |
fform | 서비스 처리 결과 fodata의 구성 형태 필드명은 NewLine("~n")으로 구분되고 마지막에는 NewLine("~n")을 추가하여 Form의 끝을 알린다. 최종적인 Form 배열의 끝을 나타내기 위해 NewLine("~n")으로 구성된 Form을 추가한다. |
foutdata | 서비스 처리 결과를 저장할 파일명이다. |
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정되고, msg에 에러 메시지가 저장된다. |
예제
... InputFile ="c:\temp\fdata0.txt" InputFile = FileOpen(InputFile, StreamMode!, Write!, LockReadWrite!, Replace!) ... uo_tmax.f_fdata(dw_input, InputFile) if FileClose(InputFile) <> 1 then error processing … end if ... ret = uo_tmax.tp_fcall(input, form, output, inputfilename, fform, foutput) if ret = -1 then error processing … end if ...
관련함수
pb_tpfcall(), f_data(), f_datadel(), f_form()
비동기형 통신에서 데이터를 수신하는 함수로 tp_acall()에 의해서 보낸 요청에 대한 응답을 받는 데 사용되며 Tmax에서 지원하는 버퍼 유형 중 FIELD 버퍼를 사용한다. form 및 output은 tp_call()의 구성 파라미터와 동일하다.
프로토타입
tp_getrply ( integer cd, ref string form[], ref string odata[] ) returns integer
파라미터
파라미터 | 설명 |
---|---|
cd | tp_acall()이 반환한 참조 구별자로써 요청된 것에 대응하는 응답을 구별할 수 있도록 한다. |
form | 서비스 처리 결과 odata의 구성 형태 필드명은 NewLine("~n")으로 구분되고 마지막에는 NewLine("~n")을 추가하여 Form의 끝을 알린다. 최종적인 Form 배열의 끝을 나타내기 위해 NewLine("~n")으로 구성된 Form을 추가한다. |
odata | 서비스 처리 결과를 저장할 버퍼 각 데이터는 PowerBuilder의 ImportString 함수를 사용하여 간단하게 데이터를 DataWindow에 넣을 수 있도록 TAB("~t")으로 구분되어 있고, 각 Row는 NewLine("~n")으로 구분되어 있다. |
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정되고, msg에 에러 메시지가 저장된다. |
예제
string input, form[], odata[] int cd, ret … input = "SRVCNM" + "~t" + "TOUPPER" + "~n" + & "FIELD_NAME1" + "~t" + "VALUE1" + "~n" + & "FIELD_NAME2" + "~t" + "VALUE2" + "~n" + & "~n" form[1] = "OUTPUT~n~n" form[2] = "~n" output[1] = space(1024) cd = uo_tmax.tp_acall(input) if cd < 0 then error processing … end if ret = uo_tmax.tp_getrply(cd, form, output) if ret < 0 then error processing … end if
관련함수
pb_tpgetrply(), tp_acall()
Tmax와의 접속을 맺는 함수이다. pb_tpstart()와 같은 환경변수 설정이 요구된다.
프로토타입
tp_init () returns integer
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
예제
long ret u_tmax uo_tmax uo_tmax = CREATE u_tmax uo_tmax.usr_name = 'tmaxclient' uo_tmax.clt_name = 'cilent01' uo_tmax.dom_pwd = 'tmax' uo_tmax.usr_pwd = 'client01' uo_tmax.flags = uo_tmax.TPUNSOL_IGN … ret = uo_tmax.tp_initt() if ret < 0 then error processing … end if …
관련함수
pb_tpstart()
tp_recv()는 대화형 통신에서 데이터를 수신하는 함수로, 호출자가 제어권을 갖지 않는 프로그램에서만 사용할 수 있다. tp_recv()는 Tmax에서 지원하는 버퍼 유형 중 FIELD 버퍼를 사용한다.
프로토타입
tp_recv ( integer cd, ref string form[], ref string odata[], long arg_flag ) returns integer
파라미터
파라미터 | 설명 |
---|---|
cd | pb_tpconnect()가 반환한 참조 구별자이다. |
form | 서비스 처리 결과 odata의 구성 형태 필드명은 NewLine("~n")으로 구분되고 마지막에는 NewLine("~n")을 추가하여 Form의 끝을 알린다. 최종적인 Form 배열의 끝을 나타내기 위해 NewLine("~n")으로 구성된 Form을 추가한다. |
odata | 서비스 처리 결과를 저장할 버퍼 각 데이터는 PowerBuilder의 ImportString 함수를 사용하여 간단하게 데이터를 DataWindow에 넣을 수 있도록 TAB("~t")으로 구분되어 있고, 각 Row는 NewLine("~n")으로 구분되어 있다. |
arg_flag | flags값이다. |
tp_recv()에서 사용하는 flags값은 다음과 같다.
flags값 | 설명 |
---|---|
TPNOBLOCK | 데이터가 도착할 때까지 기다리지 않는다. 수신 가능한 데이터가 있으면 이를 반환한다. flags가 지정되지 않고 수신 가능한 데이터가 없으면 호출자는 데이터가 도착할 때까지 기다린다. |
TPNOTIME | 함수 호출자가 Blocking Timeout을 무시하고 응답이 수신될 때까지 계속해서 기다리겠다는 것을 의미한다. 그러나 트랜잭션 Timeout 내에서 pb_tprecv()를 한 경우에는 여전히 트랜잭션 Timeout이 적용된다. |
TPSIGRSTRT | 시그널 인터럽트를 수용할 때 사용한다. 내부에서 시그널 인터럽트가 발생하여 시스템 함수 호출이 방해되면 시스템 함수 호출이 재실행된다. 이 flags가 설정되지 않은 경우에 시그널 인터럽트가 발생했다면 함수는 실패하고 tperrno에 TPGOTSIG가 설정된다. |
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. |
함수의 반환값이 -1인 경우는 2가지로 나누어 볼 수 있다. 하나는 에러가 발생한 경우이고, 다른 하나는 이벤트가 발생한 경우이다. -1을 반환했을 때, 어느 경우인지를 먼저 확인해야 한다.
에러가 발생한 경우에는 tperrno에 PB_TPEEVENT 이외의 에러 코드가 저장되고, 이벤트가 발생한 경우에는 tperrno에 PB_TPEEVENT(숫자로는 22)값이 저장되며 revent에는 다음의 값 중 하나가 저장된다.
값 | 설명 |
---|---|
TPEV_DISCONIMM (숫자 1) | 대화 시작자가 pb_tpdiscon()을 사용하여 연결을 강제로 종료한 것을 의미한다. 또한 통신 에러 등으로 인하여 연결이 끊어진 경우에도 해당 이벤트가 저장된다. |
TPEV_SVCERR (숫자 2) | 서비스 함수가 비정상적으로 종료한 경우이다. |
TPEV_SVCFAIL (숫자 4) | 서비스에서 TPFAIL로 tpreturn한 경우이다. |
TPEV_SVCSUCC (숫자 8) | 서비스에서 SUCCESS로 반환한 경우이다(정상 종료). |
TPEV_SENDONLY (숫자 32) | 연결된 상대방 프로그램에서 통신 제어권을 포기하였다. TPEV_SENDONLY 이벤트의 수신자는 데이터를 송신할 수는 있지만 수신자가 제어권을 넘길 때까지는 어떤 데이터도 수신할 수 없다. |
PB_TPEV_SVCSUCC, PB_TPEV_SVCFAIL | tpurcoode에 서비스에서 송신한 User Code가 저장된다. |
예제
int ret, cd string itype, otype, idata, form[], odata[] idata = "SRVCNM" + "~t" + "CONV" + "~n" + & "FIELD_NAME1" + "~t" + "VALUE1" + "~n" + & "FIELD_NAME2" + "~t" + "VALUE2" + "~n" + & "~n" cd = uo_tmax.tp_connect(idata, uo_tmax.TPRECVONLY) if cd < 0 then error processing … end if ret = uo_tmax.tp_recv(cd, form, odata, uo_tmax.TPNOFLAGS) if ret < 0 then if uo_tmax.revent <> uo_tmax.TPEV_SENDONLY or & uo_tmax.revent = uo_tmax.TPEV_SVCSUCC then error processing … end if … end if
관련함수
tp_connect(), tp_discon(), tp_send(), tp_conv()
대화형 통신에서 상대방에게 데이터를 송신하는 함수로, 호출자는 반드시 통신 제어권을 가지고 있어야 한다. tp_send()는 Tmax에서 지원하는 버퍼 유형 중 FIELD 버퍼를 사용한다.
프로토타입
tp_send ( integer cd, string idata, long arg_flag ) returns integer
파라미터
파라미터 | 설명 |
---|---|
cd | pb_tpconnect()가 반환한 참조 구별자를 의미한다. |
idata | 서비스명을 포함하여 데이터 문자열을 구성한다. 문자열 형태로 TAB("~t")을 이용하여 입력 데이터를 분리하고 NewLine("~n")을 이용하여 라인의 끝을 나타낸다. |
arg_flag | flags값이다. |
tp_send()에서 사용할 수 있는 flags값은 다음과 같다.
flags값 | 설명 |
---|---|
TPRECVONLY | TPRECVONLY flags는 호출자가 데이터를 송신한 후 통신 제어권을 상대방에게 넘긴다는 의미이다. 따라서 호출자는 다시 통신 제어권을 넘겨받기 전까지 pb_tpsend()를 호출할 수 없다. 대화 상대방 수신자는 pb_tprecv()로 데이터를 수신하면서 통신 제어권을 갖게됨을 의미하는 TPEV_SENDONLY 이벤트를 수신하게 된다. 수신자 또한 다시 통신 제어권을 상대방에게 넘기기 전까지 pb_tprecv()를 호출할 수 없다. |
TPNOBLOCK | Blocking 상황인 경우(예를 들어, 내부 버퍼가 전달될 메시지로 가득찬 경우)에 데이터와 이벤트는 송신되지 않는다. TPNOBLOCK flags 설정 없이 pb_tpsend() 호출할 때, Blocking 상황이 발생하면 호출자는 Timeout(트랜잭션 또는 Blocking Timeout 중 하나)이 발생하거나 상황이 완화될 때까지 기다린다. |
TPNOTIME | TPNOTIME flags는 함수 호출자가 Blocking Timeout을 무시하고 응답이 수신될 때까지 계속해서 기다리겠다는 것을 의미한다. 그러나 트랜잭션 Timeout 내에서 pb_tpconnect()를 한 경우에는 여전히 트랜잭션 Timeout이 적용된다. |
TPSIGSTRT | 시그널 인터럽트를 수용할 때 사용한다. 내부에서 시그널 인터럽트가 발생하여 시스템 함수 호출이 방해될 때 시스템 함수가 재호출된다. 만약, 이 flags가 설정되지 않고 시그널 인터럽트가 발생했다면 함수는 실패하고 tperrno에 TPGOTSIG가 설정된다. |
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. |
함수의 반환값이 -1인 경우는 2가지로 나누어 볼 수 있다. 하나는 이벤트가 발생한 경우이고, 다른 하나는 에러가 발생한 경우이다. 따라서 -1을 반환했을 때, 어느 경우인지를 먼저 확인해야 한다.
이벤트가 발생한 경우에는 tperrno에 PB_TPEEVENT(숫자로는 22)값이 저장되며 revent에는 다음의 값 중 하나가 저장된다.
값 | 설명 |
---|---|
TPEV_DISCONIMM (숫자 1) | 대화 시작자가 pb_tpdiscon()을 사용하여 연결을 강제로 종료한 것을 의미한다. 또한 통신 에러 등으로 인하여 연결이 종료된 경우에도 해당 이벤트가 저장된다. |
TPEV_SVCERR (숫자 2) | 서비스 함수가 비정상적으로 종료한 경우이다. |
TPEV_SVCFAIL (숫자 4) | 서비스에서 TPFAIL로 tpreturn한 경우이다. |
예제
int ret, cd string itype, otype, idata, form[], odata[] idata = "SRVCNM" + "~t" + "CONV" + "~n" + & "FIELD_NAME1" + "~t" + "VALUE1" + "~n" + & "FIELD_NAME2" + "~t" + "VALUE2" + "~n" + & "~n" cd = uo_tmax.tp_connect(idata, uo_tmax.TPSENDONLY) if cd < 0 then error processing … end if ret = uo_tmax.tp_send(idata, uo_tmax.TPRECVONLY) if ret < 0 then error processing … end if …
관련함수
tp_connect(), tp_discon(), tp_recv(), tp_conv()
서버에서 tppost()에 의해 전달되는 메시지를 받기 위한 함수이다. event_name에 지정된 이름을 갖는 메시지가 tppost()된 경우 hwnd로 지정한 윈도우에 message_id로 지정한 윈도우 이벤트가 발생하도록 설정한다. 메시지가 왔을 때 해당 윈도우의 윈도우 이벤트 처리 루틴으로 Message.WordParm에 메시지의 ID가 전달된다. 이 값은 get_evtname() 혹은 get_data()에서 메시지를 식별하는 ID로 사용된다. 설정된 것을 해제하려면 tp_unsubscribe()를 사용한다.
프로토타입
tp_subscribe (unsignedinteger hwnd, string event_name, unsignedinteger message_id) returns integer
파라미터
파라미터 | 설명 |
---|---|
hwnd | 윈도우 핸들을 의미한다. |
event_name | 이벤트명을 설정한다. |
message_id | 메시지 ID를 의미한다. |
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
관련함수
tp_unsubscribe()
프로토타입
tp_term () returns integer
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
예제
long ret u_tmax uo_tmax uo_tmax = CREATE u_tmax … ret = uo_tmax.tp_term() if ret < 0 then error processing … end if
관련함수
pb_tpend()
tp_subscribe(), tp_setunsol()에 의해 윈도우(hwnd)에서 메시지를 받도록 지정한 것을 해제하는 함수이다.
프로토타입
tp_unsubscribe ( unsignedinteger hwnd ) returns integer
파라미터
파라미터 | 설명 |
---|---|
hwnd | 윈도우 핸들을 의미한다. |
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
관련함수
tp_subscribe()
pb_tpbegin()은 pb_tx_set_transaction_timeout()과 pb_tx_begin()의 기능을 한 번에 수행할 수 있는 함수이다. Tuxedo에서 사용하는 것과 동일한 형식이므로 Tuxedo용으로 개발된 애플리케이션을 별다른 변환 절차 없이 사용할 수 있다.
프로토타입
pb_tpbegin ( unsignedlong arg_timeout ) returns integer
파라미터
파라미터 | 설명 |
---|---|
arg_timeout | pb_tx_set_transaction_timeout()에 설정하는 값과 동일한 의미를 가지는 것으로 트랜잭션 Timeout 시간을 입력하게 된다. (단위: 초) |
반환값
“1.2.42. pb_tx_set_transaction_timeout”과 “1.2.37. pb_tx_begin”을 참고한다.
예제
long ret u_tmax uo_tmax uo_tmax = CREATE u_tmax uo_tmax.usr_name = 'tmaxclient' uo_tmax.clt_name = 'cilent01' uo_tmax.dom_pwd = 'tmax' uo_tmax.usr_pwd = 'client01' uo_tmax.flags = uo_tmax.TPUNSOL_IGN … ret = uo_tmax.pb_tpstart() if ret < 0 then error processing … end if … ret = uo_tmax.pb_tpbegin(7)
관련함수
pb_tx_set_transaction_timeout(), pb_tx_begin()
동기형으로 Tmax 서비스를 호출하기 위한 함수이다. sobject에 지정된 PowerObject를 입력하여 서비스를 호출한 후 반환되어 온 결과를 robject에 지정된 PowerObject에 넣어준다.
tuxcall()은 Tmax에서 지원하는 버퍼 유형 중 FIELD 버퍼를 사용한다. sobject에 사용할 수 있는 Object는 다음과 같다.
Object | 설명 |
---|---|
DataWindow, DataWindowChild, DataStore | Column명을 FIELD 버퍼 필드명으로 사용한다. 수정된 Row만을 데이터로 사용한다. |
SingleLineEdit, MultiLineEdit | Control.Tag명을 FIELD 버퍼 필드명으로 사용한다. Control.Text를 데이터로 사용한다. |
taticText, EditMasks | Control.Tag명을 FIELD 버퍼 필드명으로 사용한다. Control.Text를 데이터로 사용한다. |
ListBox | Control.Tag명을 FIELD 버퍼 필드명으로 사용한다. 선택된 모든 항목을 데이터로 사용한다. |
DropDownListBox | Control.Tag명을 FIELD 버퍼 필드명으로 사용한다. 선택된 항목만 데이터로 사용한다. |
CheckBox | Control.Tag명을 FIELD 버퍼 필드명으로 사용한다. 체크된 경우에만 데이터로 사용한다. |
RadioButton | Control.Tag명을 FIELD 버퍼 필드명으로 사용한다. 체크된 경우에만 데이터로 사용한다. |
robject에 사용할 수 있는 Object는 input에 사용할 수 있는 것과 동일하다. ListBox와 DropDownListBox의 경우에는 데이터를 추가한다. 사용되는 u_tmax의 인스턴스 변수는 다음과 같다.
변수 | 설명 |
---|---|
dwAppend | TRUE일 때 robject에 DataWindow가 지정되는 경우 DataWindow에 있던 기존의 데이터를 삭제하지 않고 추가만 한다. (기본값: FALSE) |
dwDelBuf | TRUE일 때 sobject에 DataWindow가 지정되는 경우 DataWindow의 DeleteBuffer와 PrimaryBuffer에서 데이터를 꺼낸다. (기본값: TRUE) |
DataOnFail | TRUE일 때 서비스가 실패한 경우에도 데이터를 화면에 출력한다. (기본값: FALSE) |
AuxData | 서비스를 호출할 때마다 자동으로 추가되는 데이터를 tp_call()의 input 형태로 지정한다. |
DateFmt, TimeFmt, DateTimeFmt | Date/Time/DateTime 형의 Column값일 때 String형으로 변환할 경우 참조되는 포맷을 지정한다. |
tuxcall()은 내부적으로 tp_call()을 사용하므로 위의 변수 이외에, tp_call()에서 사용되는 변수도 참고한다.
프로토타입
tuxcall ( string svcname, powerobject sobject[], ref powerobject robject[] ) returns integer
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정되고, msg에 에러 메시지가 저장된다. |
예제
long ret windowobject indata[], outdata[] indata[1] = dw_1 indata[2] = sle_input outdata[1] = dw_2 uo_tmax.flags = 0; ret = uo_tmax.tuxcall("SVC1", indata, outdata) if ret < 0 then error processing … end if
관련함수
tp_call(), pb_tpcallw()
tuxedo_compat()은 일부 API의 동작에 대해서 Tuxedo 라이브러리와의 호환성을 제공한다. 환경변수 PB_TUXCOMPAT 설정값을 'Y'로 지정해도 동일하게 동작한다. 변경 기능은 다음과 같다.
isBlocked()
TPNOBLOCK flags를 설정하면 서비스 요청(tp_call과 같은 함수 호출) 중에 다른 작업을 수행할 수 있다. isBlocked()를 호출하면 서비스 요청이 진행 중인 상태인지 확인이 가능하다.
msg 변수
서비스에서 리턴 데이터의 STATLIN 필드에 값을 설정하면 msg 인스턴스 변수에 해당 내용이 설정된다. 만약 서비스 호출이 실패하고, STATLIN 필드에 값이 없다면 msg에 tpstrerror(tperrno) 정보가 저장된다.
tp_fcall(), tp_fcall32()
filename을 입력하지 않더라도 TPEINVAL 에러가 발생하지 않게 된다.
flags값 기능의 변화
tuxcall(), tuxfcall32(), tp_call(), tp_call32(), tp_fcall(), tp_fcall32(), pb_etpcall() API에서 flags 설정에 따라 동작이 달라진다.
flags값 | 설명 |
---|---|
TPNOTRAN | 내부적으로 tx_begin, tx_commit을 수행하지 않는다. 이 flags를 설정하지 않으면 매번 API를 호출할 때마다 호출 전후로 tx_begin(), tx_commit()을 호출하게 된다. |
TPNOBLOCK | 내부적으로 tpacall()을 사용하며 tpgetrply()를 호출할 때마다 yield()를 호출한다. 서비스 요청을 처리하는 동안 사용자 인터페이스가 Blocking되지 않고 다른 작업을 처리할 수 있다. 응답이 올때까지 내부적으로 매번 1000 microsecond 동안 tpusleep()를 수행한 다음 yield()를 호출한다. tpusleep 시간을 변경하려면 tuxedo_noblock_usleep 인스턴스 변수의 값을 microsecond 단위로 재정의한다. |
tuxedo_compat() 함수의 프로토타입과 파라미터, 반환값에 대한 설명은 다음과 같다.
프로토타입
tuxedo_compat(boolean sw) returns boolean
파라미터
파라미터 | 설명 |
---|---|
sw | true로 설정하면 호환성을 제공한다. |
반환값
반환값 | 설명 |
---|---|
true | 함수 호출에 성공한 경우이다. |
false | 함수 호출에 실패한 경우이다. |
예제
boolean ret u_tmax uo_tmax uo_tmax = CREATE u_tmax … ret = uo_tmax.tuxreadenv("tmax.env", "TMAX") if ret = false then error processing end if ret = uo_tmax.tuxedo_compat(true) if ret = false then error processing end if uo_tmax.tuxedo_noblock_usleep = 500
관련함수
pb_tmaxreadenv(), tuxcall(), tuxfcall32(), tp_call(), tp_call32(), tp_fcall(), tp_fcall32(), pb_etpcall(), isBlocked()
tuxreadenv()는 파일에 저장된 접속할 시스템의 정보를 읽어서 환경변수에 새로운 값을 설정하는 함수이다. Tmax 시스템과 접속하기 위한 정보를 환경변수에 설정하기 때문에 이 함수는 Tmax 시스템에 접속하기 전에 수행되어야 한다. 등록된 환경변수를 참조하여 pb_tpstart()(또는 tp_init())로 Tmax 시스템과 연결한다.
일반적으로 환경변수는 운영체제에 따라 정의하는 파일이 달라진다. UNIX의 경우 csh는 <.cshrc>에, ksh는 <.profile>에 정의하고, DOS의 경우에는 <autoexec.bat> 파일에 정의한다. 그러나 접속할 시스템이 2개 이상일 경우 클라이언트는 상황에 따라 접속할 시스템을 변경할 수 있다. 이 경우 환경변수에 2개의 시스템에 대한 정보를 등록할 수 없으므로 파일에 환경변수를 등록하여 사용할 수 있다.
프로토타입
tuxreadenv ( string env_file, string section ) returns integer
파라미터
파라미터 | 설명 |
---|---|
env_file | 접속할 시스템의 환경 정보가 저장된 파일명이다. 이 파일은 텍스트 형태로 일정한 형식에 맞게 등록되어 있어야 한다. |
section | 파일 내에 등록된 환경 정보의 구분자, 즉 2개 이상의 시스템 정보를 하나의 파일에 등록할 경우에 각각의 시스템을 구별할 수 있는 값이다. |
반환값
반환값 | 설명 |
---|---|
1 | 함수 호출에 성공한 경우이다. |
-1 | 함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다. |
예제
long ret u_tmax uo_tmax uo_tmax = CREATE u_tmax … ret = uo_tmax.tuxreadenv("./tmax.env", "TMAX") if ret < 0 then error processing end if
관련함수
pb_tmaxreadenv()
사원번호를 키값으로 이름, 직책, 담당임원, 입사일, 봉급, 계약기간과 부서를 조회, 수정, 삭제 및 입력하는 프로그램이다. 사용되는 버퍼는 필드키 버퍼를 사용하였다.
프로그램은 다음과 같이 구성되어 있다.
공통 프로그램
프로그램 파일 | 설명 |
---|---|
demo.f | 필드키 버퍼를 정의한 파일이다. |
tmconfig.m | Tmax 환경설정 파일이다. |
클라이언트 프로그램
프로그램 파일 | 설명 |
---|---|
demo.pbl | 클라이언트 프로그램이다. |
서버 프로그램
프로그램 파일 | 설명 |
---|---|
emp_c.pc | 서비스 프로그램(Oracle 소스)이다. |
emp_c.mk | Makefile이다. |
다음은 각 프로그램의 특징이다.
클라이언트 프로그램
기능 | 설명 |
---|---|
User Object 연결 | tmax.pbd를 애플리케이션에 링크한다. |
버퍼 유형 | FIELD KEY 버퍼, 필드키 파일을 fdlc 유틸리티로 컴파일하여 'fdl' 파일 생성이 필요하다. |
통신 유형 | pb_tpcall()을 이용한 동기 통신을 한다. |
트랜잭션 여부 | 조회, 수정, 삭제, 입력할 경우 모두 트랜잭션 처리을 처리한다. |
Tmax 연결 | 서비스를 수행할 때마다 접속하고, 서비스를 완료할 경우 접속을 해제한다. |
서버 프로그램
기능 | 설명 |
---|---|
서비스 | FDLSELECT, FDLUPDATE, FDLDELETE, FDLINSERT를 작성한다. |
데이터베이스 지정 | Oracle 데이터베이스를 사용한다. 시스템 구성 파일의 SVRGROUP에 데이터베이스 정보를 지정한다. |
다음은 DB operation을 위한 기본 테이블의 예제이다.
EMPNO NUMBER NOT NULL P1 ENAME VARCHAR(16) JOB VARCHAR(16) MGR NUMBER HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER
다음은 필드키 버퍼를 정의한 파일의 예제이다.
<demo.f>
#For tmax demo employee program EMPNO 7500 long - - ENAME 7501 string - - JOB 7502 string - - MGR 7503 long - - DATE 7504 string - - SAL 7505 float - - COMM 7506 float - - DEPTNO 7507 long - - E_TYPE 9009 long - - E_CODE 9010 long - - E_MSG 9011 string - - E_TMP 9012 long - -
다음은 Tmax 환경설정 파일의 예제이다.
<tmconfig.m>
*DOMAIN dom1 SHMKEY = 70000, MAXUSER = 200, MINCLH = 1, MAXCLH = 5, TPORTNO = 8888, BLOCKTIME = 200, TXTIME = 200 *NODE tmax1 TMAXDIR = "/home/tmax", APPDIR = "/home/tmax/appbin", PATHDIR = "/home/tmax/path", TLOGDIR = "/home/tmax/log/tlog", SLOGDIR = "/home/tmax/log/slog" ULOGDIR = "/home/tmax/log/ulog" *SVRGROUP svg1 NODENAME = tmax1, DBNAME = ORACLE, OPENINFO = "ORACLE_XA+Acc=P/scott/tiger+SesTm=60", TMSNAME = svg1_tms *SERVER emp_c SVGNAME = svg1, MIN = 1 *SERVICE FDLSELECT SVRNAME = emp_c FDLUPDATE SVRNAME = emp_c FDLDELETE SVRNAME = emp_c FDLINSERT SVRNAME = emp_c
다음은 프로그램을 실행할 경우 나타나는 초기화면이다. 화면은 8개의 singleline editor와 1개의 데이터 윈도우, 6개의 버튼으로 구성된다.
각 버튼의 기능에 대한 설명이다.
조회
'사원번호'를 입력하고 [조회] 버튼을 클릭하면, 사원번호가 ±50 범위 내에 있는 데이터가 DataWindow에 출력된다. 해당 기능을 구현한 스크립트 예제는 조회 버튼 실행 스크립트를 참고한다.
다음은 프로그램 조회 결과 화면이다.
[돌아가기] 버튼을 클릭하면 프로그램의 초기화면으로 이동한다. 해당 기능을 구현한 스크립트 예제는 돌아가기 버튼 실행 스크립트를 참고한다.
수정
'사원번호'와 수정하려는 데이터를 입력하고 [수정] 버튼을 클릭하면, 입력된 데이터만 수정된다. 해당 기능을 구현한 스크립트 예제는 수정 버튼 실행 스크립트를 참고한다.
삭제
'사원번호'로만 삭제할 수 있다. 해당 기능을 구현한 스크립트 예제는 삭제 버튼 실행 스크립트를 참고한다.
입력
모든 데이터를 입력한다. 해당 기능을 구현한 스크립트 예제는 입력 버튼 실행 스크립트를 참고한다.
종료
프로그램을 종료한다. 해당 기능을 구현한 스크립트 예제는 종료 버튼 실행 스크립트를 참고한다.
u_tmax uo_tmax boolean btxRun, bConnect
*tmaxconnect () returns Boolean IF uo_tmax.pb_tpstart()<0 THEN st_err.text = ("서버에 연결할 수 없습니다.\n tpstart() Failed: Error Code =" + string(uo_tmax.tperrno)) return FALSE END IF return TRUE *inputcheck ( integer inputnum ) returns Boolean IF isnull( sle_empno.text ) OR sle_empno.text = "" THEN st_err.text = "사원번호는 꼭 입력해야 합니다." return FALSE END IF IF( inputnum = 1) THEN return TRUE IF isnull( sle_name.text ) OR sle_name.text = "" THEN goto errormsg IF isnull( sle_job.text ) OR sle_job.text = "" THEN goto errormsg IF isnull( sle_mgr.text ) OR sle_mgr.text = "" THEN goto errormsg IF (len(sle_date.text) <>8 ) THEN goto errormsg IF isnull( sle_sal.text ) OR sle_sal.text = "" THEN goto errormsg IF isnull( sle_comm.text ) OR sle_comm.text = "" THEN goto errormsg IF isnull( sle_dept.text ) OR sle_dept.text = "" THEN goto errormsg return TRUE errormsg: st_err.text = "모든 항목을 입력해야 하며, 입사일은 8자리(YYYYMMDD)로 입력해야 합니다." return FALSE *clearwindow () returns Booleansle_empno.clear() sle_name.clear() sle_job.clear() sle_mgr.clear() sle_date.clear() sle_sal.clear() sle_comm.clear() sle_dept.clear() sle_empno.setfocus() *errorprocess ( string infomsg ) st_err.text = InfoMsg IF( btxRun = TRUE ) THEN uo_tmax.pb_tx_rollback() btxRun = FALSE END IF IF( bconnect = TRUE ) THEN uo_tmax.pb_tpend() bconnect = FALSE END IF *successprocess ( string infomsg ) st_err.text = InfoMsg IF( btxRun = TRUE ) THEN uo_tmax.pb_tx_commit() btxRun = FALSE END IF IF( bconnect = TRUE ) THEN uo_tmax.pb_tpend() bconnect = FALSE END IF
string FileName uo_tmax = CREATE u_tmax uo_tmax.flags = 0 FileName ="D:\PB\MyProgram\tmax.env" IF uo_tmax.pb_tmaxreadenv( FileName, "tmax1") <0 THEN messagebox( "Eviroment Error","Enviroment File Loading Failed : Error Code =" + string(uo_tmax.tperrno)) return END IF open(w_demo)
다음은 [조회] 버튼을 이용하여 조회를 실행하기 위한 예제이다.
string itype, idata, form[], odata[] IF(inputcheck(1) = FALSE) THEN return itype = "FIELD~t~n" idata = "EMPNO"+"~t"+sle_empno.text+"~n" form[1] ="EMPNO~n" + & "ENAME~n" + & "JOB~n" + & "MGR~n" + & "DATE~n" + & "SAL~n" + & "COMM~n" + & "DEPTNO~n" + & "E_TYPE~nE_CODE~nE_MSG~nE_TMP~n~n" form[2] = "~n"//"E_TYPE~nE_CODE~nE_MSG~nE_TMP~n~n" odata[1] = space(1024) bConnect = tmaxconnect() IF bConnect = FALSE THEN errorprocess( "서버에 연결할 수 없습니다.") return END IF IF uo_tmax.pb_tpcall("FDLSELECT", itype, idata, form[], odata[]) <0 THEN errorprocess( uo_tmax.f_getdata(form[1], odata[1], 1, "E_MSG") ) return END IF dw_out.importstring(odata[1]) dw_out.visible = TRUE cb_back.visible = TRUE cb_sel.enabled = FALSE cb_udt.enabled = FALSE cb_del.enabled = FALSE cb_ins.enabled = FALSE cb_exit.enabled = FALSE successprocess( sle_empno.text + "번의 정보를 찾았습니다.")
다음은 [수정] 버튼을 이용하여 수정을 실행하기 위한 예제이다.
string itype, idata, form[], odata[] IF(inputcheck(0) = FALSE) THEN return itype = "FIELD~t~n" idata = "EMPNO~t" + sle_empno.text+"~n" + & "ENAME~t"+sle_name.text+"~n" + & "JOB~t"+sle_job.text+"~n" + & "MGR~t"+sle_mgr.text+"~n" + & "DATE~t" +sle_date.text+"~n" + & "SAL~t" +sle_sal.text+"~n" + & "COMM~t" +sle_comm.text+"~n" + & "DEPTNO~t" +sle_dept.text+"~n~n" form[1] = "E_TYPE~nE_CODE~nE_MSG~nE_TMP~n~n" form[2] = "~n" odata[1] = space(1024) bConnect = tmaxconnect() IF bConnect = FALSE THEN errorprocess( "서버에 연결할 수 없습니다.") return END IF IF btxrun = FALSE THEN IF uo_tmax.pb_tx_begin()<0 THEN errorprocess( "pb_tx_begin Error") return END IF btxrun = TRUE END IF IF uo_tmax.pb_tpcall("FDLUPDATE", itype, idata, form[], odata[])<0 THEN errorprocess( "Error:\n"+uo_tmax.f_getdata(form[1], odata[1], 1, "E_MSG") ) return END IF clearwindow() successprocess( sle_empno.text + "번 데이터가 수정되었습니다." )
다음은 [삭제] 버튼을 이용하여 삭제를 실행하기 위한 예제이다.
int ret string itype, idata, form[], odata[] IF(inputcheck(1) = FALSE) THEN return itype = "FIELD~t~n" idata = "EMPNO"+"~t"+sle_empno.text+"~n~n" form[1] = "E_TYPE~nE_CODE~nE_MSG~nE_TMP~n~n" form[2] = "~n" odata[1] = space(1024); bConnect = tmaxconnect() IF bConnect = FALSE THEN errorprocess( "서버에 연결할 수 없습니다.") return END IF IF btxrun = FALSE THEN IF uo_tmax.pb_tx_begin()<0 THEN errorprocess( "pb_tx_begin Error") return END IF btxrun = TRUE END IF IF uo_tmax.pb_tpcall("FDLDELETE", itype, idata, form[], odata[])<0 THEN errorprocess( uo_tmax.f_getdata(form[1], odata[1], 1, "E_MSG") ) return END IF successprocess( sle_empno.text + "번 데이터가 삭제되었습니다." ) clearwindow()
다음은 [입력] 버튼을 이용하여 입력을 실행하기 위한 예제이다.
long ret string itype, idata, form[], odata[] IF(inputcheck(0) = FALSE) THEN return itype = "FIELD~t~n" idata = "EMPNO~t"+sle_empno.text+"~n" + & "ENAME~t"+sle_name.text+"~n" + & "JOB~t"+sle_job.text+"~n" + & "MGR~t"+sle_mgr.text+"~n" + & "DATE~t"+sle_date.text+"~n" + & "SAL~t"+sle_sal.text+"~n" + & "COMM~t"+sle_comm.text+"~n" + & "DEPTNO~t"+sle_dept.text+"~n" + & "~n" form[1] = "E_TYPE~nE_CODE~nE_MSG~nE_TMP~n~n" form[2] = "~n" odata[1] = space(1024); bConnect = tmaxconnect() IF bConnect = FALSE THEN errorprocess( "서버에 연결할 수 없습니다.") return END IF IF btxrun = FALSE THEN IF uo_tmax.pb_tx_begin()<0 THEN errorprocess( "pb_tx_begin Error") return END IF btxrun = TRUE END IF IF uo_tmax.pb_tpcall("FDLINSERT", itype, idata, form[], odata[])<0 THEN errorprocess( uo_tmax.f_getdata(form[1], odata[1], 1, "E_MSG") ) return END IF successprocess( sle_empno.text + "번 데이터가 추가되었습니다." ) clearwindow()
다음은 [종료] 버튼을 이용하여 종료를 실행하기 위한 예제이다.
close(w_demo)
다음은 [돌아가기] 버튼을 이용하여 프로그램 초기화면으로의 이동을 실행하기 위한 예제이다.
int i cb_sel.enabled = TRUE cb_udt.enabled = TRUE cb_del.enabled = TRUE cb_ins.enabled = TRUE cb_exit.enabled = TRUE FOR i=1 to (dw_out.rowcount()+2) dw_out.deleterow ( 1 ) NEXT clearwindow() dw_out.visible = FALSE cb_back.visible = FALSE
다음은 서비스 프로그램의 예제이다.
#include <stdio.h> #include <ctype.h> #include <tuxinc/macro.h> #include "../../fdl/demo_fdl.h" EXEC SQL include sqlca.h; EXEC SQL INCLUDE ORACA; EXEC ORACLE OPTION (ORACA=YES); EXEC ORACLE OPTION (RELEASE_CURSOR=YES); #define INP 1 #define ORA 2 #define TMX 3 #define APP 4 EXEC SQL begin declare section; int h_empno; char h_ename[11]; char h_job[10]; int h_mgr; char h_date[11]; float h_sal; float h_comm; int h_deptno; EXEC SQL end declare section; void svc_error(long type, long err_code, char *msg, long tmp); FDLINSERT( TPSVCINFO *msg ) { FBUF *rcvbuf; int i, occurrence; rcvbuf = (FBUF *)msg->data; h_empno = h_mgr = h_sal = h_comm = h_deptno = 0; memset( h_ename, 0x00, sizeof( h_ename ) ); memset( h_job, 0x00, sizeof( h_job ) ); memset( h_date, 0x00, sizeof( h_date ) ); occurrence = fbkeyoccur(rcvbuf, EMPNO); for (i=0; i< occurrence; i++){ fbget_tu ( rcvbuf, EMPNO, i, (char *)&h_empno, 0 ); fbget_tu ( rcvbuf, MGR, i, (char *)&h_mgr, 0 ); fbget_tu ( rcvbuf, SAL, i, (char *)&h_sal, 0 ); fbget_tu ( rcvbuf, COMM, i, (char *)&h_comm, 0 ); fbget_tu ( rcvbuf, DEPTNO,i, (char *)&h_deptno, 0 ); fbget_tu ( rcvbuf, ENAME, i, (char *)h_ename, 0 ); fbget_tu ( rcvbuf, JOB , i, (char *)h_job, 0 ); fbget_tu ( rcvbuf, DATE , i, (char *)h_date, 0 ); EXEC SQL INSERT INTO emp( empno, ename, job, mgr, hiredate, sal,comm, deptno) VALUES ( :h_empno, :h_ename, :h_job, :h_mgr, to_date(:h_date,'yyyymmdd'), :h_sal, :h_comm, :h_deptno ); } if(sqlca.sqlcode != 0) goto LB_DBERROR; EXEC SQL WHENEVER SQLERROR goto LB_DBERROR; tpreturn(TPSUCCESS, 0L, (char *)rcvbuf, 0L, 0L); LB_DBERROR : EXEC SQL WHENEVER SQLERROR CONTINUE; svc_error(ORA, sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc, 0); } FDLDELETE( TPSVCINFO *msg ) { FBUF *rcvbuf; int i, occurrence; rcvbuf = ( FBUF *)msg->data; occurrence = fbkeyoccur(rcvbuf, EMPNO); for (i=0; i< occurrence; i++){ fbget_tu (rcvbuf, EMPNO, i, (char *)&h_empno , 0); EXEC SQL DELETE FROM emp WHERE empno = :h_empno; } if(sqlca.sqlcode != 0) goto LB_DBERROR; EXEC SQL WHENEVER SQLERROR goto LB_DBERROR ; EXEC SQL WHENEVER NOT FOUND goto LB_DBERROR ; tpreturn(TPSUCCESS, 0L, (char *)rcvbuf, 0L, 0L); LB_DBERROR : EXEC SQL WHENEVER SQLERROR CONTINUE; svc_error(ORA, sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc, 0); } FDLSELECT( TPSVCINFO *msg ) { FBUF *rcvbuf; FLDLEN fldlen; int i=0, ROWMEM=200, CHKROW=500; rcvbuf = (FBUF *)msg->data; if((rcvbuf=(FBUF *)tprealloc((char *)rcvbuf,ROWMEM*CHKROW))==NULL){ rcvbuf=(FBUF *)msg->data; goto LB_TMAXERROR ; } h_empno = h_mgr = h_sal = h_comm = h_deptno = 0; memset( h_ename, 0x00, sizeof( h_ename ) ); memset( h_job, 0x00, sizeof( h_job ) ); memset( h_date, 0x00, sizeof( h_date ) ); fbget_tu( rcvbuf, EMPNO, 0, (char *)&h_empno, &fldlen); EXEC SQL DECLARE DB_CUR CURSOR FOR SELECT nvl(empno,0), nvl(ename,' '), nvl(job,' '), nvl(to_char(hiredate,'yyyymmdd'),' '), nvl(mgr,0), nvl(sal,0), nvl(comm,0), nvl(deptno,0) FROM emp WHERE empno >= :h_empno-50 AND empno <= :h_empno+50; EXEC SQL OPEN DB_CUR; if(sqlca.sqlcode != 0) goto LB_DBERROR; EXEC SQL WHENEVER SQLERROR goto LB_DBERROR ; EXEC SQL WHENEVER NOT FOUND Do break ; while(1) { EXEC SQL FETCH DB_CUR INTO :h_empno, :h_ename, :h_job, :h_date, :h_mgr, :h_sal, :h_comm, :h_deptno; fbchg_tu(rcvbuf, EMPNO, i,(char *)&h_empno, 0); fbchg_tu(rcvbuf, MGR, i,(char *)&h_mgr, 0); fbchg_tu(rcvbuf, SAL, i,(char *)&h_sal, 0); fbchg_tu(rcvbuf, DEPTNO, i,(char *)&h_deptno, 0); fbchg_tu(rcvbuf, COMM, i,(char *)&h_comm, 0); fbchg_tu(rcvbuf, ENAME, i,(char *)h_ename, 0); fbchg_tu(rcvbuf, JOB, i,(char *)h_job, 0); fbchg_tu(rcvbuf, DATE, i,(char *)h_date, 0); i++; } if (i < 1) goto LB_DBERROR; EXEC SQL CLOSE DB_CUR; tpreturn(TPSUCCESS, 0L, (char *)rcvbuf, 0L, 0L); LB_DBERROR : EXEC SQL WHENEVER SQLERROR CONTINUE; EXEC SQL CLOSE DB_CUR ; svc_error(ORA, sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc, 0L) ; LB_TMAXERROR : EXEC SQL WHENEVER SQLERROR CONTINUE; EXEC SQL CLOSE DB_CUR ; svc_error(TMX, tperrno, "", 0L) ; } FDLUPDATE( TPSVCINFO *msg ) { FBUF *rcvbuf ; int i, occurrence; rcvbuf = (FBUF *)msg->data; h_empno = h_mgr = h_sal = h_comm = h_deptno = 0; memset( h_ename, 0x00, sizeof( h_ename ) ); memset( h_job, 0x00, sizeof( h_job ) ); memset( h_date, 0x00, sizeof( h_date ) ); occurrence = fbkeyoccur(rcvbuf, EMPNO); for (i=0; i< occurrence; i++) { fbget_tu ( rcvbuf, EMPNO, i, (char *)&h_empno, 0); fbget_tu ( rcvbuf, ENAME, i, (char *)h_ename, 0); fbget_tu ( rcvbuf, JOB, i, (char *)h_job, 0); fbget_tu ( rcvbuf, MGR, i, (char *)&h_mgr, 0); fbget_tu ( rcvbuf, SAL, i, (char *)&h_sal, 0); fbget_tu ( rcvbuf, COMM, i, (char *)&h_comm,0); fbget_tu ( rcvbuf, DEPTNO,i, (char *)&h_deptno,0); fbget_tu ( rcvbuf, DATE , i, (char *)h_date, 0 ); EXEC SQL UPDATE emp SET ename = nvl(:h_ename, ename), job = nvl(:h_job, job), mgr = :h_mgr, hiredate = nvl(to_date(:h_date,'yyyymmdd') ,hiredate), sal = :h_sal, comm = :h_comm, deptno = :h_deptno WHERE empno = :h_empno; if(sqlca.sqlcode != 0) goto LB_DBERROR; EXEC SQL WHENEVER SQLERROR goto LB_DBERROR; EXEC SQL WHENEVER NOT FOUND goto LB_DBERROR; } tpreturn(TPSUCCESS, 0L, (char *)rcvbuf, 0L, 0L); LB_DBERROR : EXEC SQL WHENEVER SQLERROR CONTINUE; svc_error(ORA, sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc, 0L) ; } /********************************************************************* * 에러처리 : 서비스에서 오류가 발생하면 그 오류를 버퍼에 넣어 클라이언트로 보낸다. ********************************************************************/ void svc_error(long type, long err_code, char *msg, long tmp) { FBUF *transf; char *svcname; char err_msg[100]; char temp[100]; int i = 0; printf("type ==>[%ld]\n", type); printf("err_code ==>[%ld]\n", err_code); printf("msg ==>[%s]\n", msg); strcpy(err_msg, msg); if ((transf = (FBFR *)tpalloc("FML", NULL, 0)) == NULL) { printf("tpalloc failed! errno = %d\n", tperrno); } switch(type) { case INP: switch(err_code) { case -1000: strcpy(err_msg, "해당 사용자에게 권한이 없습니다."); break; default: strcpy(err_msg, "Input Error Message가 등록되어 있지 않습니다."); } break; case ORA: if (strlen(err_msg)== 0) strcpy(err_msg, sqlca.sqlerrm.sqlerrmc); break; case TMX: if (strlen(err_msg)== 0) strcpy(err_msg, tpstrerror(tperrno)); break; case APP: if (strlen(err_msg)== 0) { /* err_mssg=""이면 오류메시지를 setting한다. ******/ switch(err_code) { case -500: /* SYSTEM 관련 오류 */ strcpy(err_msg, "File생성 오류입니다."); break; case -502: strcpy(err_msg, "내부 서비스를 호출하지 못했습니다."); break; case -504: strcpy(err_msg, "소켓 통신 오류입니다."); break; case -505: /* 다른 transation에서 수정되었을 경우 MSG처리 */ /* "조회 이후에 다른 곳에서 [%s]자료가 변경되었습니다. \n\n다시 조회한 후 처리하십시오.": CLIENT에서 처리 */ strcpy(err_msg, "이 없습니다."); break; case -5002: strcpy(err_msg, "전산실에 문의하십시오."); break; default: strcpy(err_msg, "Application Error Message가 등록되어 있지 않습니다."); } } break; } /* ROLLBACK */ EXEC SQL WHENEVER SQLERROR CONTINUE; EXEC SQL ROLLBACK; fbchg_tu ( transf, E_TYPE, i, (char *)&type,0); fbchg_tu ( transf, E_CODE, i, (char *)&err_code,0); fbchg_tu ( transf, E_MSG, i, (char *)err_msg,0); fbchg_tu ( transf, E_TMP, i, (char *)&tmp,0); tpreturn(TPFAIL, 0, (char *)transf, 0L, 0L); }
다음은 emp_c.pc 소스를 Tmax 애플리케이션으로 만드는 Makefile의 예제이다.
include $(ORACLE_HOME)/precomp/lib/env32.mk ORALIBDIR = $(LIBHOME) ORALIB = -L/home/oracle/OraHome/lib32/ -lclntsh -lld -lm `cat /home/oracle/OraHome/lib32/sysliblist` -lm -lc_r -lpthreads TARGET = emp_c APOBJS = emp_c.o NSDLOBJ = $(TMAXDIR)/lib/sdl.o #CC CC=cc #Oracle LIBS = -lsvr -loras OBJS = $(APOBJS) $(SVCTOBJ) SVCTOBJ = $(TARGET)_svctab.o CFLAGS = -q32 -O -I$(TMAXDIR) LDFLAGS = -brtl APPDIR = $(TMAXDIR)/appbin SVCTDIR = $(TMAXDIR)/svct TMAXLIBDIR = $(TMAXDIR)/lib # .SUFFIXES : .c .c.o: $(CC) $(CFLAGS) $(LDFLAGS) -c $< all: $(TARGET) $(TARGET): $(OBJS) $(CC) $(CFLAGS) $(LDFLAGS) -L$(TMAXLIBDIR) -o $(TARGET) -L$(ORALIBDIR) $(ORALIB) $(OBJS) $(LIBS) $(NSDLOBJ) mv $(TARGET) $(TMAXDIR)/appbin $(APOBJS): $(TARGET).pc proc iname=emp_c include=$(TMAXDIR) define=__LINUX_ORACLE_PROC__ $(CC) $(CFLAGS) $(LDFLAGS) -c $(TARGET).c $(SVCTOBJ): touch $(SVCTDIR)/$(TARGET)_svctab.c $(CC) $(CFLAGS) $(LDFLAGS) -c $(SVCTDIR)/$(TARGET)_svctab.c # clean: -rm -f *.o core $(TARGET) $(TARGET).lis