제1장 Power Builder 인터페이스

내용 목차

1.1. 개요
1.2. 함수
1.2.1. f_data
1.2.2. f_datadel
1.2.3. f_fdata
1.2.4. f_fdatadel
1.2.5. f_form
1.2.6. f_getdata
1.2.7. isblocked
1.2.8. pb_etpcall
1.2.9. pb_getunsold
1.2.10. pb_IsBlocked
1.2.11. pb_reset
1.2.12. pb_tmaxreadenv
1.2.13. pb_tpacall
1.2.14. pb_tpalloc
1.2.15. pb_tpbroadcast
1.2.16. pb_tpcall
1.2.17. pb_tpcallw
1.2.18. pb_tpcancel
1.2.19. pb_tpcommit
1.2.20. pb_tpconnect
1.2.21. pb_tpconv
1.2.22. pb_tpdiscon
1.2.23. pb_tpend
1.2.24. pb_tpfcall
1.2.25. pb_tpfree
1.2.26. pb_tpget
1.2.27. pb_tpgetrply
1.2.28. pb_tpgetunsol
1.2.29. pb_tpput
1.2.30. pb_tprecv
1.2.31. pb_tpreset
1.2.32. pb_tpsend
1.2.33. pb_tpset_timeout
1.2.34. pb_tpsetunsol
1.2.35. pb_tpstart
1.2.36. pb_tptobackup
1.2.37. pb_tx_begin
1.2.38. pb_tx_commit
1.2.39. pb_tx_rollback
1.2.40. pb_tx_set_commit_return
1.2.41. pb_tx_set_transaction_control
1.2.42. pb_tx_set_transaction_timeout
1.2.43. pb_uotmax_ver
1.2.44. pb_tx_info
1.2.45. tp_abort
1.2.46. tp_acall
1.2.47. tp_begin
1.2.48. tp_broadcast
1.2.49. tp_call
1.2.50. tp_cancel
1.2.51. tp_commit
1.2.52. tp_connect
1.2.53. tp_conv
1.2.54. tp_discon
1.2.55. tp_fcall
1.2.56. tp_getrply
1.2.57. tp_init
1.2.58. tp_recv
1.2.59. tp_send
1.2.60. tp_subscribe
1.2.61. tp_term
1.2.62. tp_unsubscrib
1.2.63. tpbegin
1.2.64. tuxcall
1.2.65. tuxedo_compat
1.2.66. tuxreadenv
1.3. 예제 프로그램
1.3.1. 프로그램 구성
1.3.2. 프로그램 특징
1.3.3. 공통 프로그램
1.3.4. 클라이언트 프로그램
1.3.5. 서버 프로그램

본 장은 Power Builer 인터페이스에서 사용하는 함수와 예제를 설명한다.

1.1. 개요

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_formForm 문자열을 만드는 함수이다.
f_getdataForm과 동일한 구성으로 이루어진 output 내용 중 특정 위치의 문자열로 반환하는 함수이다.
isblockedBlocking 상태인지를 검사하는 함수이다.
pb_etpcall이미지 데이터를 처리하기 위한 함수이다.
pb_getunsold비요청 메시지를 수신하기 위한 함수이다.
pb_IsBlockedBlocking 상태인지를 검사하는 함수이다.
pb_reset현재 접속된 연결을 즉시 해제하는 함수이다.
pb_tmaxreadenv파일에 저장된 접속할 시스템의 정보를 읽어서 환경변수에 새로운 값을 설정하는 함수이다.
pb_tpacall비동기 서비스 호출을 수행하는 함수이다.
pb_tpallocitype으로 지정된 유형의 버퍼를 할당하고 주소를 반환하는 함수이다.
pb_tpbroadcast지정한 클라이언트에 메시지를 전달하는 함수이다.
pb_tpcall동기 처리 함수이다.
pb_tpcallwDataWindow를 사용하여 동기형으로 Tmax 서비스를 호출하기 위한 함수이다.
pb_tpcancelpb_tpacall()로 반환된 구별자를 취소하는 함수이다.
pb_tpcommit트랜잭션의 작업을 Commit하는 데 사용되는 함수이다.
pb_tpconnect대화형 서비스와 통신을 연결하는 함수이다.
pb_tpconvcd에 의해 지정된 대화형 서비스에 대해 메시지를 송수신하는 함수이다.
pb_tpdiscon대화의 연결을 강제로 끊고 TPEV_DISCONIMM 이벤트를 발생시키는 함수이다.
pb_tpendTmax 시스템과의 접속을 해제하는 함수이다.
pb_tpfcall파일로부터 입력 데이터를 받아들일 수 있으며 결과 데이터를 파일에 저장할 수 있는 함수이다.
pb_tpfreepb_tpalloc()으로 얻은 버퍼를 해제하는 함수이다.
pb_tpget첫 번째 파라미터에서 지정한 주소에 해당하는 데이터를 두 번째 파라미터에서 지정한 버퍼에 세 번째 파라미터에서 지정한 size만큼 읽어 오는 함수이다.
pb_tpgetrplypb_tpacall()에 의해서 보낸 요청에 대한 응답을 받는 데 사용하는 함수이다.
pb_tpgetunsol비요청 수신 메시지를 처리하기 위한 함수이다.
pb_tpput첫 번째 파라미터에서 지정한 주소에 두 번째 파라미터에서 지정한 데이터를 세번째 파라미터에서 지정한 size만큼 저장하는 함수이다.
pb_tprecv대화형 통신에서 데이터를 수신하는 데 사용되는 함수이다.
pb_tpreset현재 접속된 연결을 즉시 해제하는 함수이다.
pb_tpsend대화형 통신에서 상대방에게 데이터를 송신하는 데 사용되는 함수이다
pb_tpset_timeout서버에 설정되어 있는 서비스 제한시간인 Blocking Timeout 시간을 변경할 때 사용되는 함수이다.
pb_tpsetunsol비요청 수신 메시지를 받도록 설정하는 함수이다.
pb_tpstartTmax와 접속을 맺는 함수이다.
pb_tptobackup클라이언트가 Tmax 시스템에 연결할 때 처음부터 백업 시스템에 연결하는 경우 사용하는 함수이다.
pb_tx_begin전역(global) 트랜잭션을 시작하는 함수이다.
pb_tx_commit트랜잭션의 작업을 Commit하는 데 사용하는 함수이다.
pb_tx_rollback트랜잭션의 작업을 Rollback하는 데 사용하는 함수이다.
pb_tx_set_commit_returnwhen_return값을 통해서 전역 트랜잭션의 Commit 시점을 결정하는 함수이다.
pb_tx_set_transaction_controlcontrol에 지정된 값을 통해서 pb_tx_commit()이나 pb_tx_rollback()이 반환되기 전에 새로운 트랜잭션의 시작 여부를 결정하는 함수이다.
pb_tx_set_transaction_timeout트랜잭션의 Timeout을 설정하는 함수이다.
pb_uotmax_vertmax.pbdd의 버전을 보여주는 함수이다.
pb_tx_info전역 트랜잭션 정보를 알려주는 함수이다.
tp_abort트랜잭션을 작업을 중단(abort)하는 데 사용하는 함수이다.
tp_acall비동기 서비스 호출을 수행하는 함수이다.
tp_begin전역 트랜잭션을 시작하는 함수이다.
tp_broadcast지정한 클라이언트에 메시지를 전달하는 함수이다.
tp_call동기형으로 Tmax 서비스를 호출하기 위한 함수이다.
tp_canceltp_acall()로 반환된 구별자를 취소하는 함수이다.
tp_commit트랜잭션 작업을 Commit 하는 데 사용하는 함수이다.
tp_connect대화형 서비스와 통신을 연결하는 함수이다.
tp_convcd에 의해 지정된 대화형 서비스에 대해 메시지를 송수신하는 함수이다.
tp_discon대화의 연결을 강제로 끊고, TPEV_DISCONIMM 이벤트를 발생시키는 함수이다.
tp_fcall동기형으로 Tmax 서비스를 호출하기 위한 함수이다.
tp_getrply비동기형 통신에서 데이터를 수신하는 함수이다.
tp_initTmax와의 접속을 맺는 함수이다.
tp_recv대화형 통신에서 데이터를 수신하는 함수이다.
tp_send대화형 통신에서 상대방에게 데이터를 송신하는 함수이다.
tp_subscribe서버에서 tppost()에 의해 전달되는 메시지를 받기 위한 함수이다.
tp_termTmax 시스템과의 접속을 해제하는 함수이다.
tp_unsubscribtp_subscribe(), tp_setunsol()에 의해 윈도우(hwnd)에서 메시지를 받도록 지정한 것을 해제하는 함수이다.
tpbeginpb_tx_set_transaction_timeout()과 pb_tx_begin()의 기능을 한 번에 수행할 수 있는 함수이다.
tuxcall동기형으로 Tmax 서비스를 호출하기 위한 함수이다.
tuxedo_compat일부 API의 동작에 대해서 Tuxedo 라이브러리와의 호환성을 제공한다.
tuxreadenv파일에 저장된 접속할 시스템의 정보를 읽어서 환경변수에 새로운 값을 설정하는 함수이다.

1.2. 함수

1.2.1. f_data

데이터 문자열을 만드는 함수이다.

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()

1.2.2. f_datadel

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()

1.2.3. f_fdata

데이터 문자열을 만드는 함수로 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()

1.2.4. 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()

1.2.5. f_form

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()

1.2.6. f_getdata

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
    …

1.2.7. isblocked

Blocking 상태인지를 검사하는 함수이다. Blocking 상태란 서비스를 호출하고 있는 중이라는 의미이다.

서비스를 호출하고 있는 상태에서는 다른 서비스를 호출할 수 없다. 서비스를 호출하고 있는 동안 다른 버튼을 클릭하거나 혹은 버튼을 2번 클릭해서 서비스를 다시 호출하려면 에러가 발생한다. 따라서 서비스를 호출하는 버튼에서는 가장 처음에 이 함수를 호출하여 수행 중이면 대기하라는 메시지를 보내는 것이 바람직하다.

  • 프로토타입

    isblocked () 
    returns integer
  • 반환값

    반환값설명
    1Blocking 상태인 경우이다.
  • 예제

    …
    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()

1.2.8. pb_etpcall

함수의 사용 방법은 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는 다음과 같다.

    • TPNOTRAN : Non Transaction Mode 서비스를 호출할 경우 사용한다.

    • TPNOCHANGE : 초기 할당 버퍼와 응답 버퍼의 유형의 일치를 보장한다.

    • TPNOBLOCK : Non Blocking Mode로 호출할 경우 사용한다.

    • TPNOTIME : Blocking Timeout을 무시한다.

    [참고]

    tuxedo_compat(true) 설정의 경우 flags에 대한 동작이 달라진다. 자세한 내용은 tuxedo_compat()을 참고한다.

    timeoutpb_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()

1.2.9. pb_getunsold

비요청 메시지를 수신하기 위한 함수이다. 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보다 작은 경우이다.
    TPEITYPEPower 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()

1.2.10. pb_IsBlocked

Blocking 상태인지 검사하는 함수이다. Blocking 상태란 서비스를 호출하고 있는 중이라는 의미이다.

서비스를 호출하고 있는 상태에서는 다른 서비스를 호출할 수 없다. 서비스를 호출하고 있는 동안 다른 버튼을 클릭하거나 혹은 버튼을 2번 클릭해서 서비스를 다시 호출하면 에러가 발생한다. 따라서 서비스를 호출하는 버튼에서는 가장 처음에 이 함수를 호출하여 수행 중이면 대기하라는 메시지를 보내는 것이 바람직하다.

  • 프로토타입

    pb_isblocked () 
    returns integer

  • 반환값

    반환값설명
    1Blocking 상태인 경우이다.

  • 예제

    …
    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()

1.2.11. pb_reset

pb_reset는 현재 접속된 연결을 즉시 해제하는 함수이다. 클라이언트 모듈에 TPESYSTEM 에러가 발생하는 경우는 거의 네트워크 오류이므로 Tmax 시스템에 재접속하는 것을 권장한다. pb_reset() 함수는 이런 경우 사용된다. 우선 pb_reset()으로 접속을 해제하고, 서비스를 재요청하거나 Tmax 시스템을 다시 연결한다.

  • 프로토타입

    pb_reset () 
    returns integer
  • 반환값

    반환값설명
    1함수 호출에 성공한 경우이다.
    -1함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다.
  • 오류

    tperrno에 에러 상황에 해당되는 코드가 설정된다.

    에러 코드설명
    TPESYSTEMTmax 시스템 에러가 발생함을 의미한다. 자세한 정보는 로그 파일에 기록된다.
    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

1.2.12. pb_tmaxreadenv

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()

1.2.13. pb_tpacall

비동기 서비스 호출을 수행하는 함수로, 비동기형 통신은 클라이언트가 서비스를 요청하고 다른 일을 계속할 수 있으며, 응답을 받고자 할 때 해당 요청에 대한 응답을 받는다. 요청에 대한 응답을 받을 때(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()

1.2.14. pb_tpalloc

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 버퍼를 할당한 경우에도 동일한 에러가 발생한다.

    TPESYSTEMTmax 시스템 에러가 발생함을 의미한다. 자세한 정보는 로그 파일에 기록된다.
    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)
    …

1.2.15. pb_tpbroadcast

지정한 클라이언트에 메시지를 전달하는 함수이다.

  • 프로토타입

    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
    …

1.2.16. pb_tpcall

동기 처리 함수로, 처리 결과를 받을 때까지 대기한다. 처리할 데이터를 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")을 이용하여 라인의 끝을 나타낸다.

    • STRUCT 버퍼 타입 itype = "STRUCT~tstruct_name~n"

    • STRING 버퍼 타입 itype ="STRING~t~n"

    • FIELD KEY 버퍼 타입 itype = "FIELD~t~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는 다음과 같다.

    • TPNOTRAN : Non Transaction Mode 서비스를 호출할 때 사용한다.

    • TPNOCHANGE : 초기 할당 버퍼와 응답 버퍼의 유형의 일치를 보장한다.

    • TPNOBLOCK : Non Blocking Mode로 호출할 때 사용한다.

    • TPNOTIME : Blocking Timeout을 무시한다.

    timeoutpb_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()

1.2.17. pb_tpcallw

DataWindow를 사용하여 동기형으로 Tmax 서비스를 호출하기 위한 함수이다. iobject에 지정된 PowerObject를 입력하여 서비스를 호출한 후, 반환된 결과를 oobject에 지정된 PowerObject에 넣는다. 이 함수는 FIELD 버퍼를 사용한다.

  • 프로토타입

    pb_tpcallw ( string svcname, powerobject iobject[], powerobject oobject[] ) 
    returns integer

  • 파라미터

    파라미터설명
    svcname호출할 서비스명을 의미한다.
    iobjectiobject에 지정된 PowerObject를 입력하여 서비스를 호출한다.
    oobject서비스 호출 후 반환된 결과를 oobject에 지정된 Power Object에 넣는다.

    input에 사용할 수 있는 Object는 다음과 같다.

    Object설명

    DataWindow,

    DataWindowChild,

    DataStore

    Column명을 FIELD 버퍼의 필드명으로 사용한다. 수정된 Row만을 데이터로 사용한다.

    SingleLineEdit,

    MultiLineEdit

    Control.Tag명을 FIELD 버퍼의 필드명으로 사용한다. Control.Text를 데이터로 사용한다.
    StaticText, EditMaskControl.Tag명을 FIELD 버퍼의 필드명으로 사용한다. Control.Text를 데이터로 사용한다.
    ListBoxControl.Tag명을 FIELD 버퍼의 필드명으로 사용한다. 선택된 모든 항목을 데이터로 사용한다.
    DropDownListBoxControl.Tag명을 FIELD 버퍼의 필드명으로 사용한다. 선택된 항목만 데이터로 사용한다.
    CheckBoxControl.Tag명을 FIELD 버퍼의 필드명으로 사용한다. 체크되어있는 경우에만 데이터로 사용한다.
    RadioButtonControl.Tag명을 FIELD 버퍼의 필드명으로 사용한다. 체크되어있는 경우에만 데이터로 사용한다.

    output에 사용할 수 있는 Object는 input에 사용할 수 있는 것과 동일하다. ListBox와 DropDownListBox의 경우에는 데이터를 추가한다. 다음은 사용되는 uo_tmax의 인스턴스 변수에 대한 설명이다.

    변수설명
    AppendTRUE일 때 output에 DataWindow가 지정되는 경우, DataWindow에 있던 기존의 데이터를 삭제하지 않고 추가만 한다. (기본값: FALSE)
    DelBufTRUE일 때 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()

1.2.18. pb_tpcancel

pb_tpcancel()은 pb_tpacall()로 반환된 구별자를 취소하는 함수로, 호출한 서비스에 대해 수신을 취소한다. 전역 트랜잭션에 해당되는 구별자를 취소하려고 하면 에러가 발생하며, 호출이 성공하면 cd를 더 이상 사용할 수 없다. 이 함수를 이용하여 수신을 취소한 경우에는 해당 트랙잭션은 Commit할 수 없고 Rollback만 가능하다.

  • 프로토타입

    pb_tpcancel ( integer cd ) 
    returns integer

  • 파라미터

    파라미터설명
    cdpb_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()

1.2.19. pb_tpcommit

트랜잭션의 작업을 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()

1.2.20. pb_tpconnect

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_flagflags값이다.

    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 중 하나는 반드시 지정되어야 한다.
    TPNOTIMETPNOTIME 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()

1.2.21. pb_tpconv

cd에 의해 지정된 대화형 서비스에 대해 메시지를 송수신하는 함수이다. tp_conv()는 Tmax에서 지원하는 버퍼 유형 중 FIELD 버퍼를 사용한다.

  • 프로토타입

    pb_tpconv ( long cd, string itype, string idata, ref string form[], 
                ref string odata[], long arg_flag ) 
    returns integer
  • 파라미터

    파라미터설명
    cdtp_connect()가 반환한 참조 cd 구별자이다.
    itype

    사용한 버퍼의 타입 문자열 형태로 TAB("~t")을 이용하여 문자열을 분리하고 NewLine("~n")을 이용하여 라인의 끝을 나타낸다.

    • STRUCT 버퍼 타입 itype = "STRUCT~tstruct_name~n"

    • STRING 버퍼 타입 itype ="STRING~t~n"

    • FIELD KEY 버퍼 타입 itype = "FIELD~t~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_flagpb_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
    …

1.2.22. pb_tpdiscon

pb_tpdiscon()은 대화의 연결을 강제로 해제하고, TPEV_DISCONIMM 이벤트를 발생시키는 함수로, 대화형 통신을 시작한 측에서만 호출할 수 있다.

  • 프로토타입

    pb_tpdiscon ( integer cd ) 
    returns integer
  • 파라미터

    파라미터설명
    cdpb_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()

1.2.23. pb_tpend

Tmax 시스템과의 접속을 해제하는 함수이다.

  • 프로토타입

    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()

1.2.24. pb_tpfcall

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

1.2.25. pb_tpfree

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()

1.2.26. pb_tpget

첫 번째 파라미터에서 지정한 주소에 해당하는 데이터를 두 번째 파라미터에서 지정한 버퍼에 세 번째 파라미터에서 지정한 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보다 작은 경우이다.
    TPEITYPEPower Builder에서 확보된 메모리 영역이 수신 데이터보다 작은 경우에 발생한다.
    TPEOTYPE수신 데이터가 없거나 부적절한 경우이다.
    TPEMATCH주어진 mid에 해당하는 데이터가 없는 경우이다.
  • 예제

    ret_string = Space(20)
    ll_ret = uo_tmax.pb_tpget(buf, ret_string, 20)
  • 관련함수

    pb_tpput()

1.2.27. pb_tpgetrply

pb_tpacall()에서 보낸 요청에 대한 응답을 받는 데 사용하는 함수로, 기본적으로 Blocking 통신이다. 일단 호출하면 응답을 받거나 Blocking Timeout이 발생할 때까지 기다린다. Timeout이 발생하면 호출은 실패하고 tperrno에 TPETIME가 설정된다.

  • 프로토타입

    pb_tpgetrply ( integer cd, ref string form[], ref string odata[] ) 
    returns integer
  • 파라미터

    파라미터설명
    cdpb_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()

1.2.28. pb_tpgetunsol

비요청 수신 메시지를 처리하기 위한 함수로 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 처리 여부를 결정하는 파라미터로 다음 중에 하나를 설정한다.

    • TPBLOCK : 함수를 호출할 때 Blocking 상태로 일방적인 메시지가 올 때까지 기다린다.

    • TPNOTIME : 함수를 호출할 때 Blocking하지 않고 메시지가 없으면 바로 다음 루틴을 수행한다.

  • 반환값

    반환값설명
    1함수 호출에 성공한 경우이다.
    -1함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다.
  • 오류

    tperrno에 에러 코드가 설정된다.

    에러 코드설명
    TPEINVAL입력 파라미터가 유효하지 않은 경우로, rcvbuf가 NULL이거나 mid가 0보다 작은 경우이다.
    TPEITYPEPower 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()

1.2.29. pb_tpput

첫 번째 파라미터에서 지정한 주소에 두 번째 파라미터로 지정한 데이터를 세 번째 파라미터로 지정한 size만큼 저장하는 함수이다.

  • 프로토타입

    pb_tpput ( long buf, any value, long size ) 
    returns long
  • 파라미터

    파라미터설명
    buf저장할 데이터의 주소를 long형으로 지정한다.
    loc해당 주소에 저장할 데이터를 지정한다.
    size저장할 데이터의 길이를 지정한다.
  • 반환값

    반환값설명
    1함수 호출에 성공한 경우이다.
    -1함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다.
  • 오류

    tperrno에 에러 코드가 설정된다.

    에러 코드설명
    TPEINVAL입력 파라미터가 유효하지 않은 경우로 rcvbuf가 NULL이거나 mid가 0보다 작은 경우이다.
    TPEITYPEPower 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()

1.2.30. pb_tprecv

pb_tprecv()는 대화형 통신에서 데이터를 수신하는 데 사용된다. 호출자는 반드시 통신 제어권을 가지고 있지 않아야 한다.

  • 프로토타입

    pb_tprecv ( integer cd, ref string form[], ref string odata[], long arg_flag ) 
    returns integer
  • 파라미터

    파라미터설명
    cdpb_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_flagflags값이다.

    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_SVCFAILtpurcoode에 서비스에서 송신한 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()

1.2.31. pb_tpreset

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

1.2.32. pb_tpsend

pb_tpsend()는 대화형 통신에서 상대방에게 데이터를 송신하는 데 사용되는 함수로, 호출자는 반드시 통신 제어권을 가지고 있어야 한다.

  • 프로토타입

    pb_tpsend ( integer cd, string itype, string idata, long arg_flag ) 
    returns integer

  • 파라미터

    파라미터설명
    svcnamepb_tpconnect()가 반환한 참조 구별자이다.
    itype사용한 버퍼의 타입 문자열 형태로 TAB("~t")을 이용하여 문자열을 분리하고 NewLine("~n")을 이용하여 라인의 끝을 나타낸다.
    idata처리할 데이터가 저장될 버퍼 문자열 형태로 TAB("~t")을 이용하여 입력 데이터를 분리하고 NewLine("~n")을 이용하여 라인의 끝을 나타낸다.
    arg_flagflags값이다.

    pb_tpsend()에서 사용할 수 있는 flags값은 다음과 같다.

    flags값설명
    TPRECVONLY

    TPRECVONLY flags는 호출자가 데이터를 송신한 후 통신 제어권을 상대방에게 넘긴다는 의미이다. 따라서 호출자는 다시 통신 제어권을 넘겨받기 전까지 pb_tpsend()를 호출할 수 없다.

    대화 상대방 수신자는 pb_tprecv()로 데이터를 수신하면서 통신 제어권을 갖게 됨을 의미하는 TPEV_SENDONLY 이벤트를 수신하게 된다. 수신자 또한 다시 통신 제어권을 상대방에게 넘기기 전까지 pb_tprecv()를 호출할 수 없다.

    TPNOBLOCKBlocking 상황에서(예를 들어 내부 버퍼가 전달될 메시지로 가득찬 경우) 데이터와 이벤트는 송신되지 않는다. TPNOBLOCK flags를 설정하지 않고 pb_tpsend()를 호출할 경우 Blocking 상황이 발생하면 호출자는 Timeout(트랜잭션 또는 Blocking Timeout 중 하나)이 발생하거나 상황이 완화될 때까지 기다린다.
    TPNOTIMETPNOTIME 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_SVCFAILtpurcoode에 서비스에서 송신한 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()

1.2.33. pb_tpset_timeout

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)

1.2.34. pb_tpsetunsol

비요청 수신 메시지를 받도록 설정하는 함수이다. 이렇게 수신된 메시지는 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()

1.2.35. pb_tpstart

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

    비요청 메시지 유형과 시스템 접근 방법을 결정한다.

    • TPUNSOL_IGN : 비요청 메시지를 무시한다.

    • TPUNSOL_POLL : 비요청 메시지를 수신한다(pb_tpgetunsol()로 수신).

    • TPUNSOL_HND : 비요청 메시지를 수신한다.

  • 반환값

    반환값설명
    0 또는 1

    함수 호출에 성공한 경우이다.

    • 0 : primary host에 접속을 시도한 경우이다.

    • 1 : backup host에 접속을 시도한 경우이다.

    -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()

1.2.36. pb_tptobackup

클라이언트가 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
    …

1.2.37. pb_tx_begin

전역 트랜잭션을 시작하는 함수로 함수 호출자는 트랜잭션 모드가 된다. 일단 트랜잭션이 시작되면, 호출자는 현재 트랜잭션을 완료하기 위해서 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()

1.2.38. pb_tx_commit

트랜잭션의 작업을 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()

1.2.39. 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()

1.2.40. pb_tx_set_commit_return

when_return값을 통해서 전역 트랜잭션의 Commit 시점을 결정하는 함수이다.

  • 프로토타입

    pb_tx_set_commit_return ( long w_return ) 
    returns integer
  • 파라미터

    파라미터설명
    w_return

    사용 가능한 값은 다음과 같다.

    • TX_COMMIT_DECISION_LOGGED : pb_tx_commit()으로 2PC(2 Phase Commit) 프로토콜에서 첫 번째 단계 수행 후에 반환하도록 한다. 따라서 빠른 결과값을 얻을 수 있는 반면 예상치 못한 결과값을 얻는 위험성이 내포되어 있다.

    • TX_COMMIT_COMPLETED : pb_tx_commit()으로 2PC(2 Phase Commit) 프로토콜을 완전히 수행한 후에 반환하도록 한다.

  • 반환값

    반환값설명
    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()

1.2.41. pb_tx_set_transaction_control

control에 지정된 값을 통해서 pb_tx_commit()이나 pb_tx_rollback()이 반환되기 전에 새로운 트랜잭션의 시작 여부를 결정하는 함수이다. 초기에 지정된 control값은 TX_UNCHAINED이다.

  • 프로토타입

    pb_tx_set_transaction_control ( long control ) 
    returns integer
  • 파라미터

    파라미터설명
    control

    사용할 수 있는 값은 다음과 같다.

    • TX_UNCHAINED : 새로운 트랜잭션을 시작하지 않는다. 이 경우에는 반드시 pb_tx_begin()을 통해서만 새로운 트랜잭션을 시작할 수 있다.

    • TX_CHAINED : pb_tx_commit()이나 pb_tx_rollback() 후에 자동으로 새로운 트랜잭션이 시작된다.

  • 반환값

    반환값설명
    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()

1.2.42. pb_tx_set_transaction_timeout

트랜잭션의 Timeout을 설정하는 함수이다.

  • 프로토타입

    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()

1.2.43. pb_uotmax_ver

pb_uotmax_ver()는 tmax.pbd의 버전을 조회하는 함수이다.

  • 프로토타입

    pb_uotmax_ver () 
    returns string
  • 반환값

    tmax.pbd의 버전을 반환한다.

1.2.44. pb_tx_info

전역 트랜잭션 정보를 조회하는 함수이다. 트랜잭션 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_returncommit_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()

1.2.45. tp_abort

트랜잭션 작업을 중단하는 데 사용하는 함수이다.

  • 프로토타입

    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.46. tp_acall

비동기 서비스 호출을 수행하는 함수이다. 서비스를 호출하고 응답을 기다리는 대신, 응답을 받을 때 (“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()

1.2.47. tp_begin

전역 트랜잭션을 시작하는 함수로, 함수 호출자는 트랜잭션 모드가 된다. 일단 트랜잭션이 시작되면 호출자는 현재 트랜잭션을 완료하기 위해서 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()

1.2.48. tp_broadcast

지정한 클라이언트에 메시지를 전달하는 함수이다.

  • 프로토타입

    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()

1.2.49. tp_call

동기형으로 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는 다음과 같다.

    • TPNOTRAN : Non Transaction Mode 서비스로 호출할 경우 사용한다.

    • TPNOCHANGE : 초기 할당 버퍼와 응답 버퍼의 유형의 일치를 보장한다.

    • TPNOBLOCK : Non Blocking Mode로 호출할 경우 사용한다.

    • TPNOTIME : Blocking Timeout을 무시한다.

    [참고]

    tuxedo_compat(true) 설정의 경우 flags에 대한 동작이 달라진다. 자세한 내용은 tuxedo_compat()을 참고한다.

    timeoutpb_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()

1.2.50. tp_cancel

tp_cancel()은 tp_acall()로 반환된 구별자를 취소한다. 따라서 호출한 서비스에 대해 수신을 취소하게 된다. 수신을 취소한 경우 해당 트랜잭션은 Commit할 수 없고 Rollback만 가능하다.

  • 프로토타입

    tp_cancel ( integer cd ) 
    returns integer
  • 파라미터

    파라미터설명
    cdtp_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()

1.2.51. tp_commit

트랜잭션 작업을 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()

1.2.52. tp_connect

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_flagflags값이다.

    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 중 하나는 반드시 지정되어야 한다.
    TPNOTIMETPNOTIME 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()

1.2.53. tp_conv

tp_conv()는 cd에 의해 지정된 대화형 서비스에 대해 메시지를 송수신하는 함수로, Tmax에서 지원하는 버퍼 유형 중 FIELD 버퍼를 사용한다.

  • 프로토타입

    tp_conv ( integer cd, string idata, ref string form[], ref string odata[], 
              long arg_flag ) 
    returns integer
  • 파라미터

    파라미터설명
    cdtp_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_SVCFAILtpurcoode에 서비스에서 송신한 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()

1.2.54. tp_discon

tp_discon()은 대화의 연결을 강제로 종료하고 TPEV_DISCONIMM 이벤트를 발생시키는 함수이다.

대화형 서비스를 종료하는 정상적인 방법은 서비스에서 tpreturn을 수행하는 것이지만, 대화형 서비스를 연결한 클라이언트에서 필요에 의해 즉시 연결을 종료시킬 때 사용한다. 함수를 호출하면 이후에 서비스에서 오는 데이터는 유실되고 해당 트랜잭션에 대해서는 중단만 가능하다.

  • 프로토타입

    tp_discon ( integer cd ) 
    returns integer
  • 파라미터

    파라미터설명
    cdtp_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()

1.2.55. tp_fcall

동기형으로 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()

1.2.56. tp_getrply

비동기형 통신에서 데이터를 수신하는 함수로 tp_acall()에 의해서 보낸 요청에 대한 응답을 받는 데 사용되며 Tmax에서 지원하는 버퍼 유형 중 FIELD 버퍼를 사용한다. form 및 output은 tp_call()의 구성 파라미터와 동일하다.

  • 프로토타입

    tp_getrply ( integer cd, ref string form[], ref string odata[] ) 
    returns integer
  • 파라미터

    파라미터설명
    cdtp_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()

1.2.57. tp_init

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()

1.2.58. tp_recv

tp_recv()는 대화형 통신에서 데이터를 수신하는 함수로, 호출자가 제어권을 갖지 않는 프로그램에서만 사용할 수 있다. tp_recv()는 Tmax에서 지원하는 버퍼 유형 중 FIELD 버퍼를 사용한다.

  • 프로토타입

    tp_recv ( integer cd, ref string form[], ref string odata[], long arg_flag ) 
    returns integer
  • 파라미터

    파라미터설명
    cdpb_tpconnect()가 반환한 참조 구별자이다.
    form서비스 처리 결과 odata의 구성 형태 필드명은 NewLine("~n")으로 구분되고 마지막에는 NewLine("~n")을 추가하여 Form의 끝을 알린다. 최종적인 Form 배열의 끝을 나타내기 위해 NewLine("~n")으로 구성된 Form을 추가한다.
    odata서비스 처리 결과를 저장할 버퍼 각 데이터는 PowerBuilder의 ImportString 함수를 사용하여 간단하게 데이터를 DataWindow에 넣을 수 있도록 TAB("~t")으로 구분되어 있고, 각 Row는 NewLine("~n")으로 구분되어 있다.
    arg_flagflags값이다.

    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_SVCFAILtpurcoode에 서비스에서 송신한 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()

1.2.59. tp_send

대화형 통신에서 상대방에게 데이터를 송신하는 함수로, 호출자는 반드시 통신 제어권을 가지고 있어야 한다. tp_send()는 Tmax에서 지원하는 버퍼 유형 중 FIELD 버퍼를 사용한다.

  • 프로토타입

    tp_send ( integer cd, string idata, long arg_flag ) 
    returns integer
  • 파라미터

    파라미터설명
    cdpb_tpconnect()가 반환한 참조 구별자를 의미한다.
    idata서비스명을 포함하여 데이터 문자열을 구성한다. 문자열 형태로 TAB("~t")을 이용하여 입력 데이터를 분리하고 NewLine("~n")을 이용하여 라인의 끝을 나타낸다.
    arg_flagflags값이다.

    tp_send()에서 사용할 수 있는 flags값은 다음과 같다.

    flags값설명
    TPRECVONLYTPRECVONLY flags는 호출자가 데이터를 송신한 후 통신 제어권을 상대방에게 넘긴다는 의미이다. 따라서 호출자는 다시 통신 제어권을 넘겨받기 전까지 pb_tpsend()를 호출할 수 없다. 대화 상대방 수신자는 pb_tprecv()로 데이터를 수신하면서 통신 제어권을 갖게됨을 의미하는 TPEV_SENDONLY 이벤트를 수신하게 된다. 수신자 또한 다시 통신 제어권을 상대방에게 넘기기 전까지 pb_tprecv()를 호출할 수 없다.
    TPNOBLOCKBlocking 상황인 경우(예를 들어, 내부 버퍼가 전달될 메시지로 가득찬 경우)에 데이터와 이벤트는 송신되지 않는다. TPNOBLOCK flags 설정 없이 pb_tpsend() 호출할 때, Blocking 상황이 발생하면 호출자는 Timeout(트랜잭션 또는 Blocking Timeout 중 하나)이 발생하거나 상황이 완화될 때까지 기다린다.
    TPNOTIMETPNOTIME 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()

1.2.60. tp_subscribe

서버에서 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()

1.2.61. tp_term

Tmax 시스템과의 접속을 해제하는 함수이다.

  • 프로토타입

    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()

1.2.62. tp_unsubscrib

tp_subscribe(), tp_setunsol()에 의해 윈도우(hwnd)에서 메시지를 받도록 지정한 것을 해제하는 함수이다.

  • 프로토타입

    tp_unsubscribe ( unsignedinteger hwnd ) 
    returns integer
  • 파라미터

    파라미터설명
    hwnd윈도우 핸들을 의미한다.

  • 반환값

    반환값설명
    1함수 호출에 성공한 경우이다.
    -1함수 호출에 실패한 경우이다. tperrno에 에러 코드가 설정된다.

  • 관련함수

    tp_subscribe()

1.2.63. tpbegin

pb_tpbegin()은 pb_tx_set_transaction_timeout()과 pb_tx_begin()의 기능을 한 번에 수행할 수 있는 함수이다. Tuxedo에서 사용하는 것과 동일한 형식이므로 Tuxedo용으로 개발된 애플리케이션을 별다른 변환 절차 없이 사용할 수 있다.

  • 프로토타입

    pb_tpbegin ( unsignedlong arg_timeout ) 
    returns integer
  • 파라미터

    파라미터설명
    arg_timeoutpb_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()

1.2.64. tuxcall

동기형으로 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를 데이터로 사용한다.
ListBoxControl.Tag명을 FIELD 버퍼 필드명으로 사용한다. 선택된 모든 항목을 데이터로 사용한다.
DropDownListBoxControl.Tag명을 FIELD 버퍼 필드명으로 사용한다. 선택된 항목만 데이터로 사용한다.
CheckBoxControl.Tag명을 FIELD 버퍼 필드명으로 사용한다. 체크된 경우에만 데이터로 사용한다.
RadioButtonControl.Tag명을 FIELD 버퍼 필드명으로 사용한다. 체크된 경우에만 데이터로 사용한다.

robject에 사용할 수 있는 Object는 input에 사용할 수 있는 것과 동일하다. ListBox와 DropDownListBox의 경우에는 데이터를 추가한다. 사용되는 u_tmax의 인스턴스 변수는 다음과 같다.

변수설명
dwAppendTRUE일 때 robject에 DataWindow가 지정되는 경우 DataWindow에 있던 기존의 데이터를 삭제하지 않고 추가만 한다. (기본값: FALSE)
dwDelBufTRUE일 때 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()

1.2.65. tuxedo_compat

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
  • 파라미터

    파라미터설명
    swtrue로 설정하면 호환성을 제공한다.
  • 반환값

    반환값설명
    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()

1.2.66. tuxreadenv

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()

1.3. 예제 프로그램

사원번호를 키값으로 이름, 직책, 담당임원, 입사일, 봉급, 계약기간과 부서를 조회, 수정, 삭제 및 입력하는 프로그램이다. 사용되는 버퍼는 필드키 버퍼를 사용하였다.

1.3.1. 프로그램 구성

프로그램은 다음과 같이 구성되어 있다.

  • 공통 프로그램

    프로그램 파일설명
    demo.f필드키 버퍼를 정의한 파일이다.
    tmconfig.mTmax 환경설정 파일이다.
  • 클라이언트 프로그램

    프로그램 파일설명
    demo.pbl클라이언트 프로그램이다.
  • 서버 프로그램

    프로그램 파일설명
    emp_c.pc서비스 프로그램(Oracle 소스)이다.
    emp_c.mkMakefile이다.

1.3.2. 프로그램 특징

다음은 각 프로그램의 특징이다.

  • 클라이언트 프로그램

    기능설명
    User Object 연결tmax.pbd를 애플리케이션에 링크한다.
    버퍼 유형FIELD KEY 버퍼, 필드키 파일을 fdlc 유틸리티로 컴파일하여 'fdl' 파일 생성이 필요하다.
    통신 유형pb_tpcall()을 이용한 동기 통신을 한다.
    트랜잭션 여부조회, 수정, 삭제, 입력할 경우 모두 트랜잭션 처리을 처리한다.
    Tmax 연결서비스를 수행할 때마다 접속하고, 서비스를 완료할 경우 접속을 해제한다.
  • 서버 프로그램

    기능설명
    서비스FDLSELECT, FDLUPDATE, FDLDELETE, FDLINSERT를 작성한다.
    데이터베이스 지정Oracle 데이터베이스를 사용한다. 시스템 구성 파일의 SVRGROUP에 데이터베이스 정보를 지정한다.

1.3.3. 공통 프로그램

DataBase EMP Table

다음은 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 환경설정

다음은 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

1.3.4. 클라이언트 프로그램

다음은 프로그램을 실행할 경우 나타나는 초기화면이다. 화면은 8개의 singleline editor와 1개의 데이터 윈도우, 6개의 버튼으로 구성된다.

각 버튼의 기능에 대한 설명이다.

  • 조회

    '사원번호'를 입력하고 [조회] 버튼을 클릭하면, 사원번호가 ±50 범위 내에 있는 데이터가 DataWindow에 출력된다. 해당 기능을 구현한 스크립트 예제는 조회 버튼 실행 스크립트를 참고한다.

    다음은 프로그램 조회 결과 화면이다.

    [돌아가기] 버튼을 클릭하면 프로그램의 초기화면으로 이동한다. 해당 기능을 구현한 스크립트 예제는 돌아가기 버튼 실행 스크립트를 참고한다.

  • 수정

    '사원번호'와 수정하려는 데이터를 입력하고 [수정] 버튼을 클릭하면, 입력된 데이터만 수정된다. 해당 기능을 구현한 스크립트 예제는 수정 버튼 실행 스크립트를 참고한다.

  • 삭제

    '사원번호'로만 삭제할 수 있다. 해당 기능을 구현한 스크립트 예제는 삭제 버튼 실행 스크립트를 참고한다.

  • 입력

    모든 데이터를 입력한다. 해당 기능을 구현한 스크립트 예제는 입력 버튼 실행 스크립트를 참고한다.

  • 종료

    프로그램을 종료한다. 해당 기능을 구현한 스크립트 예제는 종료 버튼 실행 스크립트를 참고한다.

전역 변수

u_tmax                uo_tmax
boolean               btxRun, bConnect

Window 함수

*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

Open 스크립트

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

1.3.5. 서버 프로그램

서비스 프로그램

다음은 서비스 프로그램의 예제이다.

#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);
}

Makefile

다음은 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