제4장 Visual Basic .net 인터페이스(유니코드)

내용 목차

4.1. 개요
4.2. 함수
4.2.1. ErrorMsg
4.2.2. FdlErrorMsg
4.2.3. FilltpstartBuf
4.2.4. GETCAR
4.2.5. GETCAR2
4.2.6. GETCAR3
4.2.7. GETCHR
4.2.8. GETDOUBLE
4.2.9. GETFLOAT
4.2.10. GETINT
4.2.11. GETLONG
4.2.12. GETSHORT
4.2.13. GETVAR
4.2.14. PUTCAR
4.2.15. PUTCAR2
4.2.16. PUTCAR3
4.2.17. PUTCHR
4.2.18. PUTDOUBLE
4.2.19. PUTFLOAT
4.2.20. PUTINT
4.2.21. PUTLONG
4.2.22. PUTSHORT
4.2.23. PUTVAR
4.3. 예제 프로그램
4.3.1. 프로그램 구성
4.3.2. 프로그램 특징
4.3.3. 공통 프로그램
4.3.4. 클라이언트 프로그램
4.3.5. 서버 프로그램

본 장에서는 유니코드를 지원하는 Visual Basic .net 인터페이스에서 사용하는 함수와 예제를 설명한다.

참고

유니코드를 지원하기 위해 사용되는 IntPtr 객체는 Visual Basic의 경우 int 타입을 할당할 수 있으므로 일반 Visual Basic .net 인터페이스와 호환이 가능하다. 일반 Visual Basic .net 인터페이스에 대한 자세한 내용은 “제5장 Visual Basic .net 인터페이스(일반)”를 참조한다.

4.1. 개요

Visual Basic .net 인터페이스에는 클라이언트 라이브러리를 호출할 수 있도록 함수의 프로토타입을 정의한 인터페이스 모듈이 존재한다.

개발자는 다음의 인터페이스 모듈을 설치하면 편리하게 Tmax 클라이언트 라이브러리에서 제공하는 함수를 호출하여 사용할 수 있다.

모듈설명
atmi.vbatmi 함수에 대한 프로토타입 정의 모듈이다.
fdl.vb필드키 함수에 대한 프로토타입 정의 모듈이다.
TmaxMacros.vb사용자의 편리를 위한 매크로 정의 클래스이다.
WinApi.vbWindows에서 제공하는 함수를 호출하기 위한 프로토타입 정의 모듈이다.

다음은 Visual Basic .net 인터페이스에서 제공하는 함수의 목록이다.

함수설명
ErrorMsgfieldkey "STATLIN"에 실린 내용과 tpurcode의 에러 메시지를 출력하는 함수이다.
FdlErrorMsgFDL 함수에 대한 에러를 출력하는 함수이다.
FilltpstartBufTmax 시스템과 연결하기 위해 설정해야 하는 버퍼인 tpstart_t 구조체를 구성하는 함수이다.
GETCARString 데이터를 tpalloc()으로 메모리에 할당된 버퍼로부터 읽어 오는 함수이다.
GETCAR2Binary 데이터를 tpalloc()으로 메모리에 할당된 버퍼로부터 읽어 오는 함수이다.
GETCAR3Tmax FDL 함수인 fbget_tu()를 이용하여 지정한 fldName에 지정된 필드명의 nth 순번에 해당하는 필드 데이터를 value(Byte array)로 반환하는 함수이다.
GETCHRTmax FDL 함수인 fbget_tu()를 이용하여 지정한 fldName에 지정된 필드명의 nth 순번에 해당하는 필드 데이터를 value(CARRAY)로 반환하는 함수이다.
GETDOUBLETmax FDL 함수인 fbget_tu()를 이용하여 지정한 fldName에 지정된 필드명의 nth 순번에 해당하는 필드 데이터를 value(Double)로 반환하는 함수이다.
GETFLOATTmax FDL 함수인 fbget_tu()를 이용하여 지정한 fldName에 지정된 필드명의 nth 순번에 해당하는 필드 데이터를 value(Single)로 반환하는 함수이다.
GETINTTmax FDL 함수인 fbget_tu()를 이용하여 지정한 fldName에 지정된 필드명의 nth 순번에 해당하는 필드 데이터를 value(Integer)로 반환하는 함수이다.
GETLONGTmax FDL 함수인 fbget_tu()를 이용하여 지정한 fldName에 지정된 필드명의 nth 순번에 해당하는 필드 데이터를 value(Long)로 반환하는 함수이다.
GETSHORTTmax FDL 함수인 fbget_tu()를 이용하여 지정한 fldName에 지정된 필드명의 nth 순번에 해당하는 필드 데이터를 value(Short)로 반환하는 함수이다.
GETVARTmax FDL 함수인 fbget_tu()를 이용하여 지정한 fldName에 지정된 필드명의 nth 순번에 해당하는 필드 데이터를 value(String)로 반환하는 함수이다.
PUTCARCARRAY 데이터를 tpalloc()으로 메모리에 할당된 버퍼에 저장하는 함수이다.
PUTCAR2Binary 데이터를 tpalloc()으로 메모리에 할당된 버퍼에 저장하는 함수이다.
PUTCAR3Tmax FDL 함수인 fbchg_tu()를 이용하여 지정한 nth에 해당하는 순번으로 fldName에 지정된 필드명에 value값(Byte array)을 저장하는 함수이다.
PUTCHRTmax FDL 함수인 fbchg_tu()를 이용하여 지정한 nth에 해당하는 순번으로 fldName에 지정된 필드명에 value값(Char)을 저장하는 함수이다.
PUTDOUBLETmax FDL 함수인 fbchg_tu()를 이용하여 지정한 nth에 해당하는 순번으로 fldName에 지정된 필드명에 value값(Double)을 저장하는 함수이다.
PUTFLOATTmax FDL 함수인 fbchg_tu()를 이용하여 지정한 nth에 해당하는 순번으로 fldName에 지정된 필드명에 value값(Single)을 저장하는 함수이다.
PUTINTTmax FDL 함수인 fbchg_tu()를 이용하여 지정한 nth에 해당하는 순번으로 fldName에 지정된 필드명에 value값(Integer)을 저장하는 함수이다.
PUTLONGTmax FDL 함수인 fbchg_tu()를 이용하여 지정한 nth에 해당하는 순번으로 fldName에 지정된 필드명에 value값(Long)을 저장하는 함수이다.
PUTSHORTTmax FDL 함수인 fbchg_tu()를 이용하여 지정한 nth에 해당하는 순번으로 fldName에 지정된 필드명에 value값(Short)을 저장하는 함수이다.
PUTVARTmax FDL 함수인 fbchg_tu()를 이용하여 지정한 nth에 해당하는 순번으로 fldName에 지정된 필드명에 value값(String)을 저장하는 함수이다.

참고

atmi 함수와 필드키 함수에 대한 프로토타입 및 기능은 "Tmax Reference Guide""Tmax Application Development Guide"를 참고한다.

4.2. 함수

4.2.1. ErrorMsg

fieldkey "STATLIN"에 실린 내용과 tpurcode의 에러 메세지를 출력하는 함수로 TmaxMacros.vb 파일에 정의되어 있다.

매크로 내용을 보면 fieldkey "STATLIN"에 실린 내용과 tpurcode의 내용을 MsgBox로 보여준다. 서버에서 에러 메시지가 온 경우라면 사용자가 출력하고자 하는 msg와 함께 서버의 메시지를 MsgBox로 보여준다.

  • 프로토타입

    Public Shared Function ErrorMsg (ByVal pBuffer As IntPtr, ByVal msg As String) 
    As Integer
  • 파라미터

    파라미터설명
    pBuffer버퍼의 포인터이다.
    msg출력하고자 하는 데이터이다.
  • 반환값

    반환값설명
    1함수 호출에 성공한 경우이다.
    -1함수 호출에 실패한 경우이다.
  • 예제

    Dim lsndbuf, lrcvbuf  As IntPtr
    Dim rlen, lret As Integer
                    
    lret = tpcall("FDLTOUPPER", lsndbuf, 0, lrcvbuf, rlen, TPNOFLAGS)
    If lret < 0 Then
       ErrorMsg(lrcvbuf, "FDLTOUPPER") 
    End If
  • 관련함수

    FdlErrorMsg()

4.2.2. FdlErrorMsg

FDL 함수에 대한 에러를 출력하는 함수이다. 이 함수를 호출하면 msg와 에러값을 MsgBox로 보여준다.

  • 프로토타입

    Public Shared Function FdlErrorMsg(ByVal msg As String) 
    As Integer
  • 파라미터

    파라미터설명
    msg출력하고자 하는 데이터이다.

  • 반환값

    반환값설명
    1함수 호출에 성공한 경우이다.
    -1함수 호출에 실패한 경우이다.

  • 예제

    Dim lsndbuf As Integer
    Dim lret As Integer
                    
    lret = fbput(lsndbuf, fbget_fldkey("INPUT"), txtSmallF.Text, txtSmallF.TextLength)
    If lret < 0 Then
        FdlErrorMsg("fbput")
    End If
  • 관련함수

    ErrorMsg()

4.2.3. FilltpstartBuf

Tmax 시스템과 연결하기 위해 설정해야 하는 버퍼인 tpstart_t 구조체를 구성하는 함수이다.

  • 프로토타입

    Public Shared Function FilltpstartBuf(ByVal pBuffer As IntPtr, 
                       _ ByVal startInfop As tpstart_t) 
    As Integer
  • 파라미터

    파라미터설명
    pBuffertpalloc()으로 메모리에 할당된 버퍼이다.
    startInfotpstart_t형으로 선언된 변수이다.

  • 반환값

    반환값설명

    0 (primary host)

    1 (backup host)

    함수 호출에 성공한 경우이다.
    -1함수 호출에 실패한 경우이다.

  • 예제

    Dim lsndbuf  As IntPtr
    Dim lret  As Integer
    Dim cinfo As tpstart_t
    
    lsndbuf = tpalloc("TPSTART", "", 0)
    If lsndbuf = 0 Then
       error processing
    End If
    
    cinfo.cltname = "tmax" + Chr(0)
    cinfo.usrname = "tmax" + Chr(0)
    cinfo.dompwd = "xamt" + Chr(0)
    cinfo.usrpwd = "batman" + Chr(0)
    cinfo.flags = TPUNSOL_HND
    
    lret = FilltpstartBuf(lsndbuf, cinfo)
    If ret < 0 Then
       error processing
    End If
    
    ret = tpstart(lsndbuf)
    If ret < 0 Then
       error processing
    End

4.2.4. GETCAR

String 데이터를 tpalloc()으로 메모리에 할당된 버퍼로부터 읽어 오는 함수이다.

  • 프로토타입

    Public Shared Function GETCAR(ByVal pBuffer As IntPtr, _ByRef value As String, 
                                  _ByVal len As Integer) 
    As Integer
  • 파라미터

    파라미터설명
    pBuffertpalloc()으로 메모리에 할당된 버퍼이다.
    value읽어 올 데이터이다.
    len읽어 올 데이터의 길이이다.
  • 반환값

    반환값설명
    1함수 호출에 성공한 경우이다.
    -1함수 호출에 실패한 경우이다.
  • 예제

    Dim lsndbuf As IntPtr
    Dim lret As Integer
    Dim tempS As String
    
    lsndbuf = tpalloc("STRING", "", 0)
    lret = GETCAR(lrcvbuf, tempS, 10)
    If lret < 0 Then
       error processing
    End If
  • 관련함수

    PUTCAR()

4.2.5. GETCAR2

Binary 데이터를 tpalloc()으로 메모리에 할당된 버퍼로부터 읽어 오는 함수이다.

  • 프로토타입

    Public Shared Function GETCAR2(ByVal pBuffer As IntPtr, 
                     _ByRef value() As Byte, _ByVal len As Integer) 
    As Integer
  • 파라미터

    파라미터설명
    pBuffertpalloc()으로 메모리에 할당된 버퍼이다.
    value읽어 올 데이터이다.
    len읽어 올 데이터의 길이이다.

  • 반환값

    반환값설명
    1함수 호출에 성공한 경우이다.
    -1함수 호출에 실패한 경우이다.

  • 예제

    Dim lsndbuf As IntPtr
    Dim lret As Integer
    Dim tempB() As Byte
    
    lsndbuf = tpalloc("STRING", "", 0)
    
    lret = GETCAR2(lrcvbuf, tempB, 1024)
    If lret < 0 Then
       error processing
    End If
  • 관련함수

    PUTCAR2()

4.2.6. GETCAR3

Tmax FDL 함수인 fbget_tu()를 이용하여 지정한 fldName에 지정된 필드명의 nth 순번에 해당하는 필드 데이터를 value로 반환하는 함수로, value값은 Byte array가 된다.

  • 프로토타입

    Public Shared Function GETCAR3(ByVal pFBUF As IntPtr, _ByRef fldName As String, 
                                  _ByVal nth As Integer, _ByRef value() As Byte, 
                                  _ByRef len As Integer) 
    As Integer
  • 파라미터

    파라미터설명
    pFBUFtpalloc()또는 fballoc()으로 메모리에 할당된 버퍼이다.
    fldName필드 버퍼(pFBUF)에서 읽어 오려는 필드명이다.
    nth필드 순번이다.
    value읽어 올 필드 데이터이다.
    len읽어 올 필드 데이터의 길이이다.

  • 반환값

    반환값설명
    1함수 호출에 성공한 경우이다.
    -1함수 호출에 실패한 경우이다.

  • 예제

    Dim lsndbuf As IntPtr
    Dim lret As Integer
    Dim tempB() As Byte
    Dim len As Integer
    
    lsndbuf = fballoc(10, 100)
    
    lret = GETCAR3(lsndbuf, "TP_BITMAP", 0, tempB, len)
    If lret < 0 Then
       error processing
    End If
  • 관련함수

    GETINT(), GETLONG(), GETDOUBLE(), GETFLOAT(), GETSHORT(), GETVAR(), GETCHR()

4.2.7. GETCHR

Tmax FDL 함수인 fbget_tu()를 이용하여 지정한 fldName에 지정된 필드명의 nth 순번에 해당하는 필드 데이터를 value로 반환하는 함수로, value값은 CARRAY가 된다.

GETVAR은 String인데 반해 GETVAR은 CARRAY이다. CARRAY는 길이를 명시적으로 표현해야 하기 때문에 함수에 문자열의 길이를 나타내는 len값을 파라미터로 받는다. 참고로 String형은 문자열의 끝에 NULL값이 있다.

  • 프로토타입

    Public Shared Function GETCHR(ByVal pFBUF As IntPtr, _ByRef fldName As String, 
                                 _ByVal nth As Integer, _ByRef value As Char, 
                                 _ByRef len As Integer) 
    As Integer
  • 파라미터

    파라미터설명
    pFBUFtpalloc()또는 fballoc()으로 메모리에 할당된 버퍼이다.
    fldName필드 버퍼(pFBUF)에서 읽어 오려는 필드명이다.
    nth필드 순번이다.
    value읽어 올 필드 데이터이다.
    len읽어 올 필드 데이터의 길이이다.

  • 반환값

    반환값설명
    1함수 호출에 성공한 경우이다.
    -1함수 호출에 실패한 경우이다.

  • 예제

    Dim lsndbuf As IntPtr
    Dim lret As Integer
    Dim tempC As Char
    Dim len As Integer
    
    lsndbuf = fballoc(10, 100)
    
    lret = GETCHR(lsndbuf, "CHR", 0, tempC, len)
    If lret < 0 Then
       error processing
    End If
  • 관련함수

    GETINT(), GETLONG(), GETDOUBLE(), GETFLOAT(), GETSHORT(), GETCAR3(), GETVAR()

4.2.8. GETDOUBLE

Tmax FDL 함수인 fbget_tu()를 이용하여 지정한 fldName에 지정된 필드명의 nth 순번에 해당하는 필드 데이터를 value로 반환하는 함수로, value값은 Double이 된다.

  • 프로토타입

    Public Shared Function GETINT(ByVal pFBUF As IntPtr, _ByRef fldName As String, 
                                 _ByVal nth As Integer, _ByRef value As Double) 
    As Integer
  • 파라미터

    파라미터설명
    pFBUFtpalloc() 또는 fballoc() 함수로 메모리에 할당된 버퍼이다.
    fldName필드 버퍼(pFBUF)에서 읽어 오려는 필드명이다.
    nth필드 순번이다.
    value읽어 올 필드 데이터이다.

  • 반환값

    반환값설명
    1함수 호출에 성공한 경우이다.
    -1함수 호출에 실패한 경우이다.

  • 예제

    Dim lsndbuf As IntPtr
    Dim lret As Integer
    Dim tempID As Double
    
    lsndbuf = fballoc(10, 100)
    lret = GETDOUBLE(lsndbuf, "DOUBLEDATA", 0, tempD)
    If lret < 0 Then
       error processing
    End If
  • 관련함수

    GETINT(), GETLONG(), GETFLOAT(), GETSHORT(), GETCAR3(), GETVAR(), GETCHR()

4.2.9. GETFLOAT

Tmax FDL 함수인 fbget_tu()를 이용하여 지정한 fldName에 지정된 필드명의 nth 순번에 해당하는 필드 데이터를 value로 반환하는 함수로, value값은 Single이 된다.

  • 프로토타입

    Public Shared Function GETFLOAT(ByVal pFBUF As IntPtr,_ByRef fldName As String,
                                   _ByVal nth As Integer, _ByRef value As Single) 
    As Integer
  • 파라미터

    파라미터설명
    pFBUFtpalloc() 또는 fballoc() 함수로 메모리에 할당된 버퍼이다.
    fldName필드 버퍼(pFBUF)에서 읽어 오려는 필드명이다.
    nth필드 순번이다.
    value읽어 올 필드 데이터이다.

  • 반환값

    반환값설명
    1함수 호출에 성공한 경우이다.
    -1함수 호출에 실패한 경우이다.

  • 예제

    Dim lsndbuf As IntPtr
    Dim lret As Integer
    Dim tempS As Single
    lsndbuf = fballoc(10, 100)
    lret = GETFLOAT(lsndbuf, "TAPE_SENT", 0, tempS)
    If lret < 0 Then
       error processing
    End If
  • 관련함수

    GETINT(), GETLONG(), GETDOUBLE(), GETSHORT() GETCAR3(), GETVAR(), GETCHR()

4.2.10. GETINT

Tmax FDL 함수인 fbget_tu()를 이용하여 지정한 fldName에 지정된 필드명의 nth 순번에 해당하는 필드 데이터를 value로 반환하는 함수로, value값은 Integer가 된다.

  • 프로토타입

    Public Shared Function GETINT(ByVal pFBUF As IntPtr, _ByRef fldName As String, 
                                 _ByVal nth As Integer, _ByRef value As Integer) 
    As Integer
  • 파라미터

    파라미터설명
    pFBUFtpalloc() 또는 fballoc()으로 메모리에 할당된 버퍼이다.
    fldName필드 버퍼(pFBUF)에서 읽어 오려는 필드명이다.
    nth필드 순번이다.
    value읽어 올 필드 데이터이다.

  • 반환값

    반환값설명
    1함수 호출에 성공한 경우이다.
    -1함수 호출에 실패한 경우이다.

  • 예제

    Dim lsndbuf As IntPtr
    Dim lret As Integer
    Dim tempI As Integer
    
    lsndbuf = fballoc(10, 100)
    
    lret = GETINT(lsndbuf, "INTDATA", 0, tempI)
    If lret < 0 Then
       error processing
    End If
  • 관련함수

    GETLONG(), GETDOUBLE(), GETFLOAT(), GETSHORT(), GETCAR3(), GETVAR(), GETCHR()

4.2.11. GETLONG

Tmax FDL 함수인 fbget_tu()를 이용하여 지정한 fldName에 지정된 필드명의 nth 순번에 해당하는 필드 데이터를 value로 반환하는 함수로, value값은 Long이 된다.

  • 프로토타입

    Public Shared Function GETLONG(ByVal pFBUF As IntPtr, _ByRef fldName As String, 
                                  _ByVal nth As Integer, _ByRef value As Long) 
    As Integer
  • 파라미터

    파라미터설명
    pFBUFtpalloc() 또는 fballoc()으로 메모리에 할당된 버퍼이다.
    fldName필드 버퍼(pFBUF)에서 읽어 오려는 필드명이다.
    nth필드 순번이다.
    value읽어 올 필드 데이터이다.

  • 반환값

    반환값설명
    1함수 호출에 성공한 경우이다.
    -1함수 호출에 실패한 경우이다.

  • 예제

    Dim lsndbuf As IntPtr
    Dim lret As Integer
    Dim tempL As Long
    
    lsndbuf = fballoc(10, 100)
    
    lret = GETINT(lsndbuf, "LONGDATA", 0, tempL)
    If lret < 0 Then
       error processing
    End If
  • 관련함수

    GETINT(), GETDOUBLE(), GETFLOAT(), GETSHORT(), GETCAR3(), GETVAR(), GETCHR()

4.2.12. GETSHORT

Tmax FDL 함수인 fbget_tu()를 이용하여 지정한 fldName에 지정된 필드명의 nth 순번에 해당하는 필드 데이터를 value로 반환하는 함수로, value값은 Short가 된다.

  • 프로토타입

    Public Shared Function GETSHORT(ByVal pFBUF As IntPtr, _ByRef fldName As String, 
                                   _ByVal nth As Integer, _ByRef value As Short) 
    As Integer
  • 파라미터

    파라미터설명
    pFBUFtpalloc() 또는 fballoc()으로 메모리에 할당된 버퍼이다.
    fldName필드 버퍼(pFBUF)에서 읽어 오려는 필드명이다.
    nth필드 순번이다.
    value읽어 올 필드 데이터이다.

  • 반환값

    반환값설명
    1함수 호출에 성공한 경우이다.
    -1함수 호출에 실패한 경우이다.

  • 예제

    Dim lsndbuf As IntPtr
    Dim lret As Integer
    Dim tempS As Short
    
    lsndbuf = fballoc(10, 100)
    
    lret = GETSHORT(lsndbuf, "SUPER_NUM", 0, tempS)
    If lret < 0 Then
       error processing
    End If
  • 관련함수

    GETINT(), GETLONG(), GETDOUBLE(), GETFLOAT(), GETCAR3(), GETVAR(), GETCHR()

4.2.13. GETVAR

Tmax FDL 함수인 fbget_tu()를 이용하여 지정한 fldName에 지정된 필드명의 nth 순번에 해당하는 필드 데이터를 value로 반환하는 함수로, value값은 String이 된다.

  • 프로토타입

    Public Shared Function GETVAR(ByVal pFBUF As IntPtr, _ByRef fldName As String, 
                                 _ByVal nth As Integer, _ByRef value As String) 
    As Integer
  • 파라미터

    파라미터설명
    pFBUFtpalloc() 또는 fballoc()으로 메모리에 할당된 버퍼이다.
    fldName필드 버퍼(pFBUF)에서 읽어 오려는 필드명이다.
    nth필드 순번이다.
    value읽어 올 필드 데이터이다.

  • 반환값

    반환값설명
    1함수 호출에 성공한 경우이다.
    -1함수 호출에 실패한 경우이다.

  • 예제

    Dim lsndbuf As IntPtr
    Dim lret As Integer
    Dim tempS As String
    
    lsndbuf = fballoc(10, 100)
    
    lret = GETVAR(lsndbuf, "FILENAM", 0, tempS)
    If lret < 0 Then
       error processing
    End If
  • 관련함수

    GETINT(), GETLONG(), GETDOUBLE(), GETFLOAT(), GETSHORT(), GETCAR3(), GETCHR()

4.2.14. PUTCAR

CARRAY 데이터를 tpalloc()으로 메모리에 할당된 버퍼에 저장하는 함수이다.

  • 프로토타입

    Public Shared Function PUTCAR(ByVal pBuffer As IntPtr, _ByVal value As String, 
                                 _ByVal len As Integer) 
    As Integer
  • 파라미터

    파라미터설명
    pBuffertpalloc()으로 메모리에 할당된 버퍼이다.
    value저장할 String 데이터이다.
    len저장할 String 데이터의 길이이다.

  • 반환값

    반환값설명
    1함수 호출에 성공한 경우이다.
    -1함수 호출에 실패한 경우이다.

  • 예제

    Dim lsndbuf As IntPtr
    Dim rlet As Integer
    Dim tempS As String
    
    lsndbuf = tpalloc("CARRAY", "", 0)
    tempS = txtString.Text
            
    lret = PUTCAR(lsndbuf, tempS, tempS.Length)
    If lret < 0 Then
       MsgBox("PUTCAR fail…[" & tpstrerror(gettperrno()) & "]")
    End If
  • 관련함수

    GETCAR()

4.2.15. PUTCAR2

Binary 데이터를 tpalloc()으로 메모리에 할당된 버퍼에 저장하는 함수이다.

  • 프로토타입

    Public Shared Function PUTCAR2(ByVal pBuffer As IntPtr, _ByRef value() As Byte, 
                                 _ByVal len As Integer) 
    As Integer
  • 파라미터

    파라미터설명
    pBuffertpalloc()으로 메모리에 할당된 버퍼이다.
    value저장할 Binary 데이터이다.
    len저장할 Binary 데이터의 길이이다.

  • 반환값

    반환값설명
    1함수 호출에 성공한 경우이다.
    -1함수 호출에 실패한 경우이다.

  • 예제

    Dim lsndbuf As IntPtr
    Dim lret As Integer
    Dim tempB() As Short
    
    Dim fs As FileStream
    Dim br As BinaryReader
    Dim FilePath As String
    
    lsndbuf = tpalloc("CARRAY", "", 0)
    
    fs = New FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.None)
    br = New BinaryReader(fs)
    ReDim tempB(CInt(fs.Length))
        br.Read(tempBr, 0, CInt(fs.Length))
        br.Close()
        fs.Close()
    
    lret = PUTCAR2(lsendbuf, tempB, Cint(fs.Length))
    If lret < 0 Then
       MsgBox("PUTCAR2 fail…[" & tpstrerror(gettperrno()) & "]")
    End If
  • 관련함수

    GETCAR2()

4.2.16. PUTCAR3

Tmax FDL 함수인 fbchg_tu()를 이용하여 지정한 nth에 해당하는 순번으로 fldName에 지정된 필드명에 value값을 저장하는 함수로, value값은 Byte array가 된다. 이 함수는 Binary 데이터를 처리하려고 할 때 사용된다.

fbchg_tu() 함수를 사용하므로 필드 순번(nth)에 기존의 데이터가 있을 경우 주어진 데이터(value)로 변경되고, 필드 순번에 기존의 데이터가 없을 경우 주어진 데이터가 자동으로 필드에 추가된다.

  • 프로토타입

    Public Shared Function PUTCAR3(ByVal pFBUF As IntPtr, _ByVal fldName As String,
                                  _ByVal nth As Integer, _ByRef value() As Byte,
                                  _ByVal len As Integer) 
    As Integer
  • 파라미터

    파라미터설명
    pFBUFtpalloc() 또는 fballoc()으로 메모리에 할당된 버퍼이다.
    fldName필드 버퍼(pFBUF)에 저장할 필드명이다.
    nth필드 순번이다.
    value저장할 Binary 데이터이다.
    len저장할 Binary 데이터의 길이이다.

  • 반환값

    반환값설명
    1함수 호출에 성공한 경우이다.
    -1함수 호출에 실패한 경우이다.

  • 예제

    Dim lsndbuf As IntPtr
    Dim lret As Integer
    Dim tempB() As Short
    
    Dim fs As FileStream
    Dim br As BinaryReader
    Dim FilePath As String
    
    lsndbuf = fballoc(10, 100)
    
    fs = New FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.None)
    br = New BinaryReader(fs)
    ReDim tempB(CInt(fs.Length))
           br.Read(tempBr, 0, CInt(fs.Length))
           br.Close()
           fs.Close()
    
    lret = PUTCAR3(lsendbuf, "TP_BITMAP", 0, tempB, Cint(fs.Length))
    If lret < 0 Then
       error processing
    End If
  • 관련함수

    PUTINT(), PUTLONG(), PUTSHORT(), PUTDOUBLE(), PUTFLOAT(), PUTVAR(), PUTCHR()

4.2.17. PUTCHR

Tmax FDL 함수인 fbchg_tu()를 이용하여 지정한 nth에 해당하는 순번으로 fldName에 지정된 필드명에 value값을 저장하는 함수로, value값은 Char가 된다.

fbchg_tu() 함수를 사용하므로 필드 순번(nth)에 기존의 데이터가 있을 경우 주어진 데이터(value)로 변경이 되고, 필드 순번에 기존의 데이터가 없을 경우 주어진 데이터가 자동으로 필드에 추가된다.

  • 프로토타입

    Public Shared Function PUTCHR(ByVal pFBUF As IntPtr, _ByVal fldName As String, 
                                 _ByVal nth As Integer, _ByRef value As Char, 
                                 _ByVal len As Integer) 
    As Integer
  • 파라미터

    파라미터설명
    pFBUFtpalloc() 또는 fballoc()으로 메모리에 할당된 버퍼이다.
    fldName필드 버퍼(pFBUF)에 저장할 필드명이다.
    nth필드 순번이다.
    value저장할 Char 데이터이다.
    len저장할 Char 데이터의 길이이다.

  • 반환값

    반환값설명
    1함수 호출에 성공한 경우이다.
    -1함수 호출에 실패한 경우이다.

  • 예제

    Dim lsndbuf As IntPtr
    Dim lret As Integer
    Dim tempC As Char
    
    lsndbuf = fballoc(10, 100)
    tempC = New String("a").ToCharArray()
            
    lret = PUTCHR(lsndbuf, "CHR", 0, tempC(0), 1)
    If lret < 0 Then
       error processing
    End If
  • 관련함수

    PUTINT(), PUTLONG(), PUTSHORT(), PUTDOUBLE(), PUTFLOAT(), PUTCAR3(), PUTVAR()

4.2.18. PUTDOUBLE

Tmax FDL 함수인 fbchg_tu()를 이용하여 지정한 nth에 해당하는 순번으로 fldName에 지정된 필드명에 value값을 저장하는 함수로, value값은 Double이 된다.

fbchg_tu() 함수를 사용하므로 필드 순번(nth)에 기존의 데이터가 있을 경우 주어진 데이터(value)로 변경이 되고, 필드 순번에 기존의 데이터가 없을 경우 주어진 데이터가 자동으로 필드에 추가된다.

  • 프로토타입

    Public Shared Function PUTDOUBLE(ByVal pFBUF As IntPtr, 
                                 _ByVal fldName As String, _ByVal nth As Integer, 
                                 _ByRef value As Double) 
    As Integer
  • 파라미터

    파라미터설명
    pFBUFtpalloc()또는 fballoc()으로 메모리에 할당된 버퍼이다.
    fldName필드 버퍼(pFBUF)에 저장할 필드명이다.
    nth필드 순번이다.
    value저장할 Double 데이터이다.

  • 반환값

    반환값설명
    1함수 호출에 성공한 경우이다.
    -1함수 호출에 실패한 경우이다.
  • 예제

    Dim lsndbuf As IntPtr
    Dim lret As Integer
    Dim tempD As Double
    
    lsndbuf = fballoc(10, 100)
    tempD = CDbl(txtDouble.Text)
            
    lret = PUTDOUBLE(lsndbuf, "DOUBLEDATA", 2, tempD)
    If lret < 0 Then
       error processing
    End If
  • 관련함수

    PUTINT(), PUTLONG(), PUTFLOAT(), PUTSHORT(), PUTCAR3(), PUTVAR(), PUTCHR()

4.2.19. PUTFLOAT

Tmax FDL 함수인 fbchg_tu()를 이용하여 지정한 nth에 해당하는 순번으로 fldName에 지정된 필드명에 value값을 저장하는 함수로, value값은 Single이 된다. fbchg_tu() 함수를 사용하므로 필드 순번(nth)에 기존의 데이터가 있을 경우 주어진 데이터(value)로 변경이 되고, 필드 순번에 기존의 데이터가 없을 경우 주어진 데이터가 자동으로 필드에 추가된다.

  • 프로토타입

    Public Shared Function PUTFLOAT(ByVal pFBUF As IntPtr, 
                                 _ByVal fldName As String, _ByVal nth As Integer, 
                                 _ByRef value As Single) 
    As Integer
  • 파라미터

    파라미터설명
    pFBUFtpalloc()또는 fballoc()으로 메모리에 할당된 버퍼이다.
    fldName필드 버퍼(pFBUF)에 저장할 필드명이다.
    nth필드 순번이다.
    value저장할 String 데이터이다.
  • 반환값

    반환값설명
    1함수 호출에 성공한 경우이다.
    -1함수 호출에 실패한 경우이다.
  • 예제

    Dim lsndbuf As IntPtr
    Dim lret As Integer
    Dim tempS As Single
    
    lsndbuf = fballoc(10, 100)
    tempS = CSng(txtSingle.Text)
            
    lret = PUTFLOAT(lsndbuf, "TAPE_SENT", 2, tempS)
    If lret < 0 Then
       error processing
    End If
  • 관련함수

    PUTINT(), PUTLONG(), PUTSHORT(), PUTDOUBLE(), PUTCAR3(), PUTVAR(), PUTCHR()

4.2.20. PUTINT

Tmax FDL 함수인 fbchg_tu()를 이용하여 지정한 nth에 해당하는 순번으로 fldName에 지정된 필드명에 value값을 저장하는 함수로, value값은 Integer가 된다. fbchg_tu() 함수를 사용하므로 필드 순번(nth)에 기존의 데이터가 있을 경우 주어진 데이터(value)로 변경되고, 필드 순번에 기존의 데이터가 없을 경우 주어진 데이터가 자동으로 필드에 추가된다.

  • 프로토타입

    Public Shared Function PUTINT(ByVal pFBUF As IntPtr, _ByVal fldName As String, 
                                 _ByVal nth As Integer, _ByRef value As Integer) 
    As Integer
  • 파라미터

    파라미터설명
    pFBUFtpalloc() 또는 fballoc()함수로 메모리에 할당된 버퍼이다.
    fldName필드 버퍼(pFBUF)에 저장할 필드명이다.
    nth필드 순번이다.
    value저장할 Integer 데이터이다.

  • 반환값

    반환값설명
    1함수 호출에 성공한 경우이다.
    -1함수 호출에 실패한 경우이다.

  • 예제

    Dim lsndbuf As IntPtr
    Dim lret As Integer
    Dim tempI As Integer
    
    lsndbuf = fballoc(10, 100)
    tempI = CInt(txtInt.Text)
            
    lret = PUTINT(lsndbuf, "INTDATA", 2, tempI)
    If lret < 0 Then
       error processing
    End If
  • 관련함수

    PUTLONG(), PUTDOUBLE(), PUTFLOAT(), PUTSHORT(), PUTCAR3(), PUTVAR(), PUTCHR()

4.2.21. PUTLONG

Tmax FDL 함수인 fbchg_tu()를 이용하여 지정한 nth에 해당하는 순번으로 fldName에 지정된 필드명에 value값을 저장하는 함수로, value값은 Long이 된다.

fbchg_tu()를 사용하므로 필드 순번(nth)에 기존의 데이터가 있을 경우 주어진 데이터(value)로 변경되고, 필드 순번에 기존의 데이터가 없을 경우 주어진 데이터가 자동으로 필드에 추가된다.

  • 프로토타입

    Public Shared Function PUTLONG(ByVal pFBUF As IntPtr, 
                                _ByVal fldName As String, _ByVal nth As Integer,
                                _ByRef value As Long) 
    As Integer
  • 파라미터

    파라미터설명
    pFBUFtpalloc()또는 fballoc()으로 메모리에 할당된 버퍼이다.
    fldName필드 버퍼(pFBUF)에 저장할 필드명이다.
    nth필드 순번이다.
    value저장할 Long 데이터이다.
  • 반환값

    반환값설명
    1함수 호출에 성공한 경우이다.
    -1함수 호출에 실패한 경우이다.
  • 예제

    Dim lsndbuf As IntPtr
    Dim lret As Integer
    Dim tempL As Long
    
    lsndbuf = fballoc(10, 100)
    tempL = CLong(txtLong.Text)        
    
    lret = PUTLONG(lsndbuf, "LONGDATA", 2, tempL)
    If lret < 0 Then
       error processing
    End If
  • 관련함수

    PUTINT(), PUTDOUBLE(), PUTFLOAT(), PUTSHORT(), PUTCAR3(), PUTVAR(), PUTCHR()

4.2.22. PUTSHORT

Tmax FDL 함수인 fbchg_tu()를 이용하여 지정한 nth에 해당하는 순번으로 fldName에 지정된 필드명에 value값을 저장하는 함수로, value값은 Short가 된다.

fbchg_tu() 함수를 사용하므로 필드 순번(nth)에 기존의 데이터가 있을 경우 주어진 데이터(value)로 변경이 되고, 필드 순번에 기존의 데이터가 없을 경우 주어진 데이터가 자동으로 필드에 추가된다.

  • 프로토타입

    Public Shared Function PUTSHORT(ByVal pFBUF As IntPtr, 
                                  _ByVal fldName As String, _ByVal nth As Integer, 
                                  _ByRef value As Short) 
    As Integer
  • 파라미터

    파라미터설명
    pFBUFtpalloc() 또는 fballoc()으로 메모리에 할당된 버퍼이다.
    fldName필드 버퍼(pFBUF)에 저장할 필드명이다.
    nth필드 순번이다.
    value저장할 Short 데이터이다.

  • 반환값

    반환값설명
    1함수 호출에 성공한 경우이다.
    -1함수 호출에 실패한 경우이다.

  • 예제

    Dim lsndbuf As IntPtr
    Dim lret As Integer
    Dim tempS As Short
    
    lsndbuf = fballoc(10, 100)
    tempS = CShort(txtShort.Text)
            
    lret = PUTSHORT(lsndbuf, "SUPER_NUM", 2, tempS)
    If lret < 0 Then
       error processing
    End If
  • 관련함수

    PUTINT(), PUTLONG(), PUTFLOAT(), PUTDOUBLE(), PUTCAR3(), PUTVAR(), PUTCHR()

4.2.23. PUTVAR

Tmax FDL 함수인 fbchg_tu()를 이용하여 지정한 nth에 해당하는 순번으로 fldName에 지정된 필드명에 value값을 저장하는 함수로, value값은 String이 된다.

fbchg_tu() 함수를 사용하므로 필드 순번(nth)에 기존의 데이터가 있을 경우 주어진 데이터(value)로 변경이 되고, 필드 순번에 기존의 데이터가 없을 경우 주어진 데이터가 자동으로 필드에 추가된다.

  • 프로토타입

    Public Shared Function PUTVAR(ByVal pFBUF As IntPtr, _ByVal fldName As String, 
                                 _ByVal nth As Integer, _ByVal value As String) 
    As Integer
  • 파라미터

    파라미터설명
    pFBUFtpalloc()또는 fballoc()으로 메모리에 할당된 버퍼이다.
    fldName필드 버퍼(pFBUF)에 저장할 필드명이다.
    nth필드 순번이다.
    value저장할 String 데이터이다.
  • 반환값

    반환값설명
    1함수 호출에 성공한 경우이다.
    -1함수 호출에 실패한 경우이다.
  • 예제

    Dim lsndbuf As IntPtr
    Dim lret As Integer
    Dim tempS As String
    
    lsndbuf = fballoc(10, 100)
    tempS = txtString.Text
            
    lret = PUTVAR(lsndbuf, " FILENAME ", 2, tempS)
    If lret < 0 Then
       error processing
    End If
  • 관련함수

    PUTINT(), PUTLONG(), PUTSHORT(), PUTDOUBLE(), PUTFLOAT(), PUTCAR3(), PUTCHR()

4.3. 예제 프로그램

account id를 키값으로 조회, 수정, 삭제, 입력하는 프로그램이며 사용되는 버퍼는 필드키 버퍼를 사용하였다.

4.3.1. 프로그램 구성

atmi.vb, fdl.vb, TmaxMacros.vb, WinAPI.vb를 모듈로 프로젝트에서 추가한다.

  • 공통 프로그램

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

    프로그램 파일설명
    AssemblyInfo.vbassembly할 때 사용되는 기본값을 설정하는 파일이다.
    CodeFile1.vbVisual Basic .net 인터페이스에서 자동으로 생성되는 파일이다.
    EmployeeGrid.resxVisual Basic .net 인터페이스에서 자동으로 생성되는 파일이다.
    EmployeeGrid.vb조회의 결과를 보여주는 프로그램이다.
    EmployeeMgr.resxVisual Basic .net 인터페이스에서 자동으로 생성되는 파일이다.
    EmployeeMgr.slnVisual Basic .net 인터페이스에서 자동으로 생성되는 파일이다.
    EmployeeMgr.suoVisual Basic .net 인터페이스에서 자동으로 생성되는 파일이다.
    EmployeeMgr.vb메인 프로그램이다. 조회, 수정, 삭제, 입력을 수행한다.
    EmployeeMgr.vbprojVisual Basic .net 인터페이스에서 자동으로 생성되는 파일이다.
    EmployeeMgr.vbproj.userVisual Basic .net 인터페이스에서 자동으로 생성되는 파일이다.
    TmaxMacros.vb사용자의 편의를 위한 매크로 정의 클래스이다.
    WinAPI.vbWindows에서 제공하는 함수를 호출하기 위한 프로토타입을 정의한 모듈이다.
    atmi.vbatmi 함수에 대한 프로토타입을 정의한 모듈이다.
    fdl.vb필드키 함수에 대한 프로토타입을 정의한 모듈이다.
  • 서버 프로그램

    프로그램 파일설명
    emp_c.mkMakefile이다.
    emp_c.pc서비스를 하는 서버 프로그램이다. AIX와 Oracle 9i를 사용한다.

4.3.2. 프로그램 특징

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

  • 클라이언트 프로그램

    기능설명
    Tmax 연결tpstart_t 인자로 연결한다.
    버퍼 유형FIELD KEY 버퍼, 구조체 파일을 fdlc 유틸리티로 컴파일하여 'fdl' 파일 생성이 필요하다.
    통신 유형tpcall()을 이용한 동기 통신, 보내는 버퍼와 받는 버퍼를 다르게 지정한다.
    트랜잭션 여부TMS에서 AutoTransaction을 부여한다.
  • 서버 프로그램

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

4.3.3. 공통 프로그램

DataBase EMP Table

다음은 데이터베이스에 작성할 테이블 스페이스 구조의 예제이다.

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

4.3.4. 클라이언트 프로그램

메인화면

다음은 메인화면 Form 디자인 화면이다.

다음은 예제에서 사용할 메인화면 Form 디자인 구성표이다.

컨트롤 이름컨트롤 종류비고
EmployeeMgrFormFormCaption="사원관리 프로그램"
LabelErr라벨Caption="오류"
BtnExit커맨드 버튼Caption="종료"
BtnIns커맨드 버튼Caption="입력"
BtnDel커맨드 버튼Caption="삭제"
BtnUdt커맨드 버튼Caption="수정"
BtnSel커맨드 버튼Caption="조회"
EditName텍스트 박스 
EditEmpNo텍스트 박스 
EditDept텍스트 박스 
EditComm텍스트 박스 
EditSal텍스트 박스 
EditDate텍스트 박스 
EditMgr텍스트 박스 
EditJob텍스트 박스 
MList텍스트 박스 
BtnReturn텍스트 박스 

다음은 사원관리 메인 디자인 프로그램의 예제이다.

Option Explicit
' 조회 창을 닫기 '
Private Sub BtnReturn_Click()
    Hide
    EmployeeMgr.Show

End Sub
' 조회 버튼 Click시 조회 리스트 결과를 보여줄 함수 '
Private Sub Form_Activate()

    ' tpstart 실행 함수 '
    tmaxStart
    
    Dim Isendbuf As IntPtr
    Dim Irecvbuf As IntPtr
    Dim Irbuflen As Long
    Dim Iret As Integer
    Dim text As String
    Dim value As Long
    Dim dvalue As Double
    Dim svalue As Single
    Dim lenL As Long
    Dim initS, outputS As String
    Dim empnoS, enameS, jobS, mgrS, dateS, salS, commS, deptnoS As String
    Dim cntL As Long
    Dim eNo As Long
    Dim txbool As Integer ' 트랜잭션이 시작되면 1, 아니면 0 '

    ' tpstart '
      tmaxStart

    ' 트랜잭션 시작 유무 초기화 '
      txbool = 0
    
    initS = vbCrLf & vbTab & vbTab & vbTab & "***** 검색결과 *****" 
           & vbCrLf & vbTab & "=================================================" 
           & vbCrLf & vbTab & "사원번호 이름 직책 담당임원 입사일 봉급 COMM 부서" 
           & vbCrLf & vbTab & "=================================================" 
           & vbCrLf & vbCrLf
        
    If EmployeeMgr.EditEmpNo.text = "" Then
        MsgBox "사원번호를 입력해 주세요."
        Hide
        EmployeeMgr.Show
        Exit Sub
    End If
    
    ' 보낼 데이터를 위한 버퍼 할당 '
    Isendbuf = fballoc(100, 1024)
    If Isendbuf = Null Then
        TmaxError ("fballoc")
        Call fbfree(Isendbuf)
        tmaxEnd
        Exit Sub
    End If
    
    ' 받을 데이터를 위한 버퍼 할당 '
    Irecvbuf = fballoc(100, 1024)
    If Irecvbuf = Null Then
        TmaxError ("fballoc")
        Call fbfree(Irecvbuf)
        tmaxEnd
        Exit Sub
    End If
    
    ' 사원관리 Form에서 사원번호를 가지고 옵니다.
    eNo = Trim(EmployeeMgr.EditEmpNo.text)
    Iret = fbput(ByVal Isendbuf, ByVal fbget_fldkey("EMPNO"), eNo, ByVal lenL)
    If Iret = -1 Then
        Call ExitSub(txbool, Isendbuf, Irecvbuf)
    End If
 
    ' 조회 서비스를 요청 '
    Iret = tpcall(ByVal "FDLSELECT", ByVal Isendbuf, ByVal 0, Irecvbuf, Irbuflen, 
                  ByVal 0)
    If Iret = -1 Then
        ViewErr (Irecvbuf)
        Call ExitSub(txbool, Isendbuf, Irecvbuf)
    End If
    
    cntL = fbkeyoccur(ByVal Irecvbuf, ByVal fbget_fldkey("EMPNO"))
    
    Dim i As Long
    
    For i = 0 To cntL - 1
       
        Iret = GETLONG(ByVal Irecvbuf, "EMPNO", i, value)
        If Iret = -1 Then
            TmaxError ("GETLONG(EMPNO)")
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If
        empnoS = value
    
        Iret = GETVAR(ByVal Irecvbuf, "ENAME", i, text)
        If Iret = -1 Then
            TmaxError ("GETVAR(ENAME)")
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If
        enameS = text
    
        Iret = GETVAR(ByVal Irecvbuf, "JOB", i, text)
        If Iret = -1 Then
            TmaxError ("GETVAR(JOB)")
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If
        jobS = text
    
        Iret = GETLONG(ByVal Irecvbuf, "MGR", i, value)
        If Iret = -1 Then
            TmaxError ("GETLONG(MGR)")
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If
        mgrS = value
    
        Iret = GETVAR(ByVal Irecvbuf, "DATE", i, text)
        If Iret = -1 Then
            TmaxError ("GETVAR(DATE)")
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If
        dateS = text
        
        ' SAL 데이터 필드에서 float 데이터를 가져옵니다. '
        ' comm.bas에 함수가 정의되있습니다. '
        Iret = fbget_tu(ByVal Irecvbuf, ByVal fbget_fldkey("SAL"), i, svalue, 0)
        If Iret = -1 Then
            FdlErrorMsg ("fbget_tu")
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If
        salS = svalue
    
        Iret = GETFLOAT(ByVal Irecvbuf, "COMM", i, svalue)
        If Iret = -1 Then
            TmaxError ("GETFLOAT(COMM)")
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If
        commS = svalue
        
        Iret = GETLONG(ByVal Irecvbuf, "DEPTNO", i, value)
        If Iret = -1 Then
            TmaxError ("GETLONG(DEPTNO)")
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If
        deptnoS = value & vbCrLf
    
        outputS = outputS & "       " & empnoS & vbTab & enameS & vbTab &
               jobS & vbTab & mgrS & vbTab & dateS & vbTab & 
               salS & vbTab & commS & vbTab & deptnoS
    
    Next i
    
    InfoText.text = initS & outputS
    ' 반환된 데이터를 텍스트 박스에 출력 '
    LabelErr.Caption = "SAL = " & dvalue
    
    Call ExitSub(txbool, Isendbuf, Irecvbuf)

End Sub

Private Sub ExitSub(txbool As Integer, Isendbuf As IntPtr, Irecvbuf As IntPtr)
    If txbool = 1 Then
        tx_rollback
    End If
    
    ' 할당된 버퍼 해제 '
    Call fbfree(ByVal Isendbuf&)
    Call fbfree(ByVal Irecvbuf&)
    
    ' tpend 실행 함수 '
    tmaxEnd
    
    Exit Sub
    
End Sub

' tpstart '
Private Sub tmaxStart()
    Dim ret As Integer
    
    ' 환경설정 파일을 불러옵니다. '
    ' atmi.bas 파일에 정의 되있습니다. '
    ' Declare Function tmaxreadenv Lib "TMAX4GL.DLL"(ByVal envfile As String, 
                                                    ByVal label As String) As Long'
    ' 자세한 설명은 "Tmax Reference Guide"를 참고하십시오. '
    ret = tmaxreadenv("C:\tmax.env", "aix5l389")
    If ret < 0 Then
        TmaxError ("tmaxreadenv")
        Exit Sub
    End If
    
    ret = tpstart(ByVal 0&)
    If ret = -1 Then
        LabelErr.Caption = "tpstart error = " & gettperrno()
        TmaxError ("tpstart")
        Exit Sub
    Else
        LabelErr.Caption = "tpstart return value = " & ret & " tpstart success"
    End If
    
End Sub
' tpend '
Private Sub tmaxEnd()
    Dim ret As Integer
    ret = tpend()
    If ret = -1 Then
        LabelErr.Caption = "tpend error = " & gettperrno()
        TmaxError ("tpend")
        Exit Sub
    Else
        LabelErr.Caption = "tpreturn return value = " & ret
    End If
    
End Sub

' 오라클에 대한 에러를 출력해주는 함수 '
Private Sub ViewErr(ByVal a As IntPtr)

'E_TYPE     9009    long    -   -
'E_CODE     9010    long    -   -
'E_MSG      9011    string  -   -
'E_TMP      9012    long    -   -

    Dim typeL As Long
    Dim codeL As Long
    Dim msgS As String
    Dim tmpL As Long
    Dim Iret As Integer
            
    Iret = fbget_tu(ByVal a, ByVal fbget_fldkey("E_TYPE"), 0, typeL, 0)
           
    If Iret = -1 Then
        FdlErrorMsg ("fbget_tu")
        Exit Sub
    End If

    Iret = fbget_tu(ByVal a, ByVal fbget_fldkey("E_CODE"), 0, codeL, 0)
    If Iret = -1 Then
        FdlErrorMsg ("fbget_tu")
        Exit Sub
    End If
        
    Iret = GETVAR(ByVal a, "E_MSG", 0, msgS)
    Iret = fbget_tu(ByVal a, ByVal fbget_fldkey("E_TMP"), 0, tmpL, 0)
    If Iret = -1 Then
        FdlErrorMsg ("fbget_tu")
        Exit Sub
    End If
    MsgBox ("Error Type : "&typeL&" ,Code :"&codeL&" ,Message :"&msgS&" 
            ,Tmp : " & tmpL)

End Sub

다음은 사원관리 처리 프로그램의 예제이다.

<EmployeeMgr.vb>

Option Strict Off
Option Explicit On 

Imports WindowsApplication1.TmaxUtils.TmaxMacros

Public Class EmployeeMgr
    Inherits System.Windows.Forms.Form

    Public Shared EmpNo As Integer

#Region " Windows Form 디자이너에서 생성한 코드 "
#End Region

    Private Sub BtnExit_Click(ByVal sender As System.Object, 
                              ByVal e As System.EventArgs) Handles BtnExit.Click
        End
    End Sub

    Function getEmpNo()
        Return EmpNo
    End Function

    Protected Overrides Sub Finalize()
        MyBase.Finalize()
    End Sub

    Private Sub BtnSel_Click(ByVal sender As System.Object, 
                             ByVal e As System.EventArgs) Handles BtnSel.Click
        Dim EmpGrid As EmployeeGrid
        EmpGrid = New EmployeeGrid()

        Hide()
        EmpGrid.EmpNo = EditEmpNo.Text()
        EmpGrid.ShowDialog()
        Show()
    End Sub

    Private Sub BtnUdt_Click(ByVal sender As System.Object, 
                             ByVal e As System.EventArgs) Handles BtnUdt.Click

        Dim Isendbuf As IntPtr
        Dim Irecvbuf As IntPtr
        Dim Irbuflen As Long
        Dim Iret As Long
        Dim text As String
        Dim value As Long
        Dim dvalue As Double
        Dim svalue As Single
        Dim txbool As Integer ' 트랜잭션이 시작되면 1, 아니면 0 '

        ' tpstart '
        tmaxStart()

        ' 트랜잭션이 시작 유무 초기화 '
        txbool = 0

        If EditEmpNo.Text = "" Then
            MsgBox("사원번호를 입력해 주세요.")
            tmaxEnd()
            Exit Sub
        End If

        ' 보낼 데이터를 위한 버퍼 할당 '
        Isendbuf = fballoc(100, 1024)

        If Isendbuf = 0 Then
            Call fbfree(Isendbuf)
            tmaxEnd()
            Exit Sub
        End If

        ' 받을 데이터를 위한 버퍼 할당 '
        Irecvbuf = fballoc(100, 1024)

        If Irecvbuf = 0 Then
            Call fbfree(Irecvbuf)
            tmaxEnd()
            Exit Sub
        End If

        Iret = PUTLONG(Isendbuf, "EMPNO", 0, Trim(EditEmpNo.Text))
        If Iret = -1 Then
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If

        Iret = PUTVAR(Isendbuf, "ENAME", 0, Trim(EditName.Text))
        If Iret = -1 Then
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If

        Iret = PUTVAR(Isendbuf, "JOB", 0, Trim(EditJob.Text))
        If Iret = -1 Then
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If

        Iret = PUTLONG(Isendbuf, "MGR", 0, Trim(EditMgr.Text))
        If Iret = -1 Then
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If

        Iret = PUTVAR(Isendbuf, "DATE", 0, Trim(EditDate.Text))
        If Iret = -1 Then
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If

        Iret = PUTFLOAT(Isendbuf, "SAL", 0, Trim(EditSal.Text))
        If Iret = -1 Then
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If

        Iret = PUTFLOAT(Isendbuf, "COMM", 0, Trim(EditComm.Text))
        If Iret = -1 Then
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If

        Iret = PUTLONG(Isendbuf, "DEPTNO", 0, Trim(EditDept.Text))
        If Iret = -1 Then
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If

        ' 트랜잭션 시작 '
        Iret = tx_begin()
        If Iret = -1 Then
            txbool = 1
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        Else
            txbool = 1
        End If

        ' 수정 서비스를 요청 '
        Iret = tpcall("FDLUPDATE", Isendbuf, 0, Irecvbuf, Irbuflen, 0)

        LabelErr.Text = "sbuf = " & Isendbuf & ", rbuf = " & Irecvbuf

        If Iret < 0 Then
            ViewErr(Irecvbuf)
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If

        ' 할당된 버퍼 해제 

        ' 트랜잭션 저장 '
        Iret = tx_commit()
        If Iret < 0 Then
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        Else
            txbool = 0
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If

    End Sub

    Private Sub BtnDel_Click(ByVal sender As System.Object, 
                             ByVal e As System.EventArgs) Handles BtnDel.Click

        Dim Isendbuf As IntPtr
        Dim Irecvbuf As IntPtr
        Dim Irbuflen As Long
        Dim Iret As Long
        Dim text As String
        Dim value As Long
        Dim dvalue As Double
        Dim svalue As Single
        Dim txbool As Integer ' 트랜잭션이 시작되면 1, 아니면 0 '

        ' tpstart '
        tmaxStart()

        ' 트랜잭션이 시작 유무 초기화 '
        txbool = 0

        If EditEmpNo.Text = "" Then
            MsgBox("사원번호를 입력해 주세요.")
            tmaxEnd()
            Exit Sub
        End If

        value = Trim(EditEmpNo.Text)


        ' 보낼 데이터를 위한 버퍼 할당 '
        Isendbuf = fballoc(100, 1024)

        If Isendbuf = 0 Then
            Call fbfree(Isendbuf)
            tmaxEnd()
            Exit Sub
        End If

        ' 받을 데이터를 위한 버퍼 할당 '
        Irecvbuf = fballoc(100, 1024)

        If Irecvbuf = 0 Then
            Call fbfree(Irecvbuf)
            tmaxEnd()
            Exit Sub
        End If

        Iret = PUTLONG(Isendbuf, "EMPNO", 0, value)
        If Iret = -1 Then
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If

        ' 트랜잭션 시작 '
        Iret = tx_begin()
        If Iret = -1 Then
            txbool = 1
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        Else
            txbool = 1
        End If

        ' 조회 서비스를 요청 '
        Iret = tpcall("FDLDELETE", Isendbuf, 0, Irecvbuf, Irbuflen, 0)
        If Iret = -1 Then
            ViewErr(Irecvbuf)
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If


        ' 트랜잭션 저장 '
        Iret = tx_commit()
        If Iret < 0 Then
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        Else
            txbool = 0
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If


    End Sub

    Private Sub BtnIns_Click(ByVal sender As System.Object, 
                             ByVal e As System.EventArgs) Handles BtnIns.Click


        Dim Isendbuf As IntPtr
        Dim Irecvbuf As IntPtr
        Dim Irbuflen As Long
        Dim Iret As Long
        Dim text As String
        Dim value As Long
        Dim dvalue As Double
        Dim svalue As Single
        Dim txbool As Integer ' 트랜잭션이 시작되면 1, 아니면 0 '

        ' tpstart '
        tmaxStart()

        ' 트랜잭션 시작 유무 초기화 '
        txbool = 0

        If EditEmpNo.Text = "" Then
            MsgBox("사원번호를 입력해 주세요.")
            tmaxEnd()
            Exit Sub
        End If

        ' 보낼 데이터를 위한 버퍼 할당 '
        Isendbuf = fballoc(100, 1024)

        If Isendbuf = 0 Then
            Call fbfree(Isendbuf)
            tmaxEnd()
            Exit Sub
        End If

        ' 받을 데이터를 위한 버퍼 할당 '
        Irecvbuf = fballoc(100, 1024)

        If Irecvbuf = 0 Then
            Call fbfree(Irecvbuf)
            tmaxEnd()
            Exit Sub
        End If

        Iret = PUTLONG(Isendbuf, "EMPNO", 0, Trim(EditEmpNo.Text))
        If Iret = -1 Then
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If

        Iret = PUTVAR(Isendbuf, "ENAME", 0, Trim(EditName.Text))
        If Iret = -1 Then
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If

        Iret = PUTVAR(Isendbuf, "JOB", 0, Trim(EditJob.Text))
        If Iret = -1 Then
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If

        Iret = PUTLONG(Isendbuf, "MGR", 0, Trim(EditMgr.Text))
        If Iret = -1 Then
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If

        Iret = PUTVAR(Isendbuf, "DATE", 0, Trim(EditDate.Text))
        If Iret = -1 Then
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If

        Iret = PUTFLOAT(Isendbuf, "SAL", 0, Trim(EditSal.Text))
        If Iret = -1 Then
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If

        Iret = PUTFLOAT(Isendbuf, "COMM", 0, Trim(EditComm.Text))
        If Iret = -1 Then
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If

        Iret = PUTLONG(Isendbuf, "DEPTNO", 0, Trim(EditDept.Text))
        If Iret = -1 Then
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If

        ' 트랜잭션 시작 '
        Iret = tx_begin()
        If Iret = -1 Then
            txbool = 1
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        Else
            txbool = 1
        End If

        ' 수정 서비스를 요청 '
        Iret = tpcall("FDLINSERT", Isendbuf, 0, Irecvbuf, Irbuflen, 0)

        If Iret = -1 Then
            ViewErr(Irecvbuf)
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If


        ' 트랜잭션 저장 '
        Iret = tx_commit()
        If Iret < 0 Then
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        Else
            txbool = 0
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If

    End Sub

    Private Sub ExitSub(ByVal txbool As Integer, ByVal Isendbuf As IntPtr, 
                        ByVal Irecvbuf As IntPtr)

        If txbool = 1 Then
            tx_rollback()
        End If

        ' 할당된 버퍼 해제 '
        Call fbfree(Isendbuf)
        Call fbfree(Irecvbuf)

        ' tpend '
        tmaxEnd()

        Exit Sub
    End Sub

    Private Sub tmaxStart()
        Dim ret As Integer
        Dim envFile As String

        ' 환경설정 파일을 불러옵니다. '
        ' atmi.bas 파일에 정의되어 있습니다. '
        ' Declare Function tmaxreadenv Lib "TMAX4GL.DLL" (ByVal envfile As String, 
                                                          ByVal label As String) 
                                                          As Long '
        ' 자세한 설명은 "Tmax Reference Guide"를 참고하십시오. '
        envFile = "C:\tmax.env"
        ret = tmaxreadenv(envFile, "aix5l389")
        If ret < 0 Then
            MsgBox("Tmaxreadenv Error" & envFile)
            Exit Sub
        End If

        ret = tpstart(0&)
        If ret = -1 Then
            LabelErr.Text = "tpstart error = " & gettperrno()
        Else
            LabelErr.Text = "tpstart return value = " & ret & " tpstart success"
        End If

    End Sub

    Private Sub tmaxEnd()
        Dim ret As Integer
        ret = tpend()
        If ret = -1 Then
            LabelErr.Text = "tpend error = " & gettperrno()
        Else
            LabelErr.Text = "tpreturn return value = " & ret
        End If

    End Sub

Oracle 에러 출력 화면

다음은 Oracle 에러 출력 화면이다.

다음은 Oracle 에러 출력 화면을 실행하는 데 필요한 환경설정의 예제이다.

' 오라클에 대한 에러를 출력해 주는 함수 
    Private Sub ViewErr(ByVal a As IntPtr)

        'E_TYPE       9009    long    -   -
        'E_CODE       9010    long    -   -
        'E_MSG        9011    string  -   -
        'E_TMP        9012    long    -   -

        Dim typeL As Long
        Dim codeL As Long
        Dim msgS As String
        Dim tmpL As Long
        Dim Iret As Integer

        GETLONG(a, "E_TYPE", 0, typeL)
        GETLONG(a, "E_CODE", 0, codeL)
        GETVAR(a, "E_MSG", 0, msgS)
        GETLONG(a, "E_TMP", 0, tmpL)
        MsgBox("Error Type : " & typeL & " ,Code : " & codeL & " ,Message : 
               " & msgS & " ,Tmp : " & tmpL)
    End Sub
End Class

조회 화면 Form 디자인 화면

다음은 조회 화면 Form 디자인 화면이다.

다음은 예제에서 사용할 조회 화면 Form 디자인 구성표이다.

컨트롤 이름컨트롤 종류수정이 필요한 프로퍼티
EmployeeGridFormCaption="사원정보 목록"
ListTextBox텍스트 박스MultiLine=True
BtnReturn커맨드 버튼Caption="돌아가기"

다음은 사원관리 조회 화면 디자인 프로그램의 예제이다.

<EmployeeGrid.frm>

Option Strict Off
Option Explicit On 

Imports WindowsApplication1.TmaxUtils.TmaxMacros

Imports System.IO

Public Class EmployeeGrid
    Inherits System.Windows.Forms.Form

    Public Shared EmpNo As Integer

#Region " Windows Form 디자이너에서 생성한 코드 "
#End Region

    Private Sub BtnReturn_Click(ByVal sender As System.Object, 
                                ByVal e As System.EventArgs) Handles BtnReturn.Click
        Hide()
    End Sub

    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)

        Dim Isendbuf, Irecvbuf As IntPtr
        Dim Isendlen, Irecvlen As Integer
        Dim Irbuflen As Long
        Dim Iret As Integer
        Dim text As String
        Dim value As Long
        Dim dvalue As Double
        Dim svalue As Single
        Dim lenL As Integer
        Dim initS, outputS As String
        Dim empnoS, enameS, jobS, mgrS, dateS, salS, commS, deptnoS As String
        Dim cntL As Long
        Dim eNo As Long
        Dim i As Integer
        Dim txbool As Integer ' 트랜잭션이 시작되면 1, 아니면 0 '

        ' tpstart '
        tmaxStart()

        ' 트랜잭션 시작 유무 초기화 '
        txbool = 0

        ' 보낼 데이터를 위한 버퍼 할당 '
        Isendbuf = fballoc(100, 1024)
        If Isendbuf = 0 Then
            Call fbfree(Isendbuf)
            tmaxEnd()
            Exit Sub
        End If

        ' 받을 데이터를 위한 버퍼 할당 '
        Irecvbuf = fballoc(100, 1024)
        If Irecvbuf = 0 Then
            Call fbfree(Irecvbuf)
            tmaxEnd()
            Exit Sub
        End If

        Iret = fbput(Isendbuf, fbget_fldkey("EMPNO"), EmpNo, lenL)
        If Iret = -1 Then
            FdlErrorMsg("fbput")
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If

        ' 조회 서비스를 요청 '
        Iret = tpcall("FDLSELECT", Isendbuf, 0, Irecvbuf, Irbuflen, 0)
        If Iret = -1 Then
            ViewErr(Irecvbuf)
            initS = vbCrLf & vbTab & vbTab & vbTab & "***** 검색결과 *****" 
                    & vbCrLf & vbTab & "==========================================" 
                    & vbCrLf & vbTab & "사원번호 이름 직책 담당임원 입사일 봉급 COMM 부서" 
                    & vbCrLf & vbTab & "==========================================" 
                    & vbCrLf & vbCrLf
            ListTextBox.Text = initS & " "
            LabelErr.Text = "SAL = " & dvalue
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If

        Iret = fbkeyoccur(Irecvbuf, fbget_fldkey("EMPNO"))

        For i = 0 To Iret - 1

            ' 리턴 받은 데이터를 텍스트 박스에 출력 '
            Iret = GETLONG(Irecvbuf, "EMPNO", i, value)
            If Iret = -1 Then
                Call ExitSub(txbool, Isendbuf, Irecvbuf)
            End If
            empnoS = value

            Iret = GETVAR(Irecvbuf, "ENAME", i, text)
            If Iret = -1 Then
                Call ExitSub(txbool, Isendbuf, Irecvbuf)
            End If
            enameS = text

            Iret = GETVAR(Irecvbuf, "JOB", i, text)
            If Iret = -1 Then
                Call ExitSub(txbool, Isendbuf, Irecvbuf)
            End If
            jobS = text

            Iret = GETLONG(Irecvbuf, "MGR", i, value)
            If Iret = -1 Then
                Call ExitSub(txbool, Isendbuf, Irecvbuf)
            End If
            mgrS = value

            Iret = GETVAR(Irecvbuf, "DATE", i, text)
            If Iret = -1 Then
                Call ExitSub(txbool, Isendbuf, Irecvbuf)
            End If
            dateS = text

            Iret = fbget_tu(Irecvbuf, fbget_fldkey("SAL"), i, svalue, 0)
            If Iret = -1 Then
                Call ExitSub(txbool, Isendbuf, Irecvbuf)
            End If
            salS = svalue

            Iret = fbget_tu(Irecvbuf, fbget_fldkey("COMM"), i, svalue, 0)
            If Iret = -1 Then
                Call ExitSub(txbool, Isendbuf, Irecvbuf)
            End If
            commS = svalue

            Iret = GETLONG(Irecvbuf, "DEPTNO", i, value)
            If Iret = -1 Then
                Call ExitSub(txbool, Isendbuf, Irecvbuf)
            End If
            deptnoS = value & vbCrLf

            outputS = outputS & "       " & empnoS & vbTab & enameS & vbTab & jobS 
                     & vbTab & mgrS & vbTab & dateS & vbTab & salS & vbTab & commS 
                     & vbTab & deptnoS

        Next i

        initS = vbCrLf & vbTab & vbTab & vbTab & "***** 검색결과 *****" 
                & vbCrLf & vbTab & "==========================================" 
                & vbCrLf & vbTab & "사원번호 이름 직책 담당임원 입사일 봉급 COMM 부서" 
                & vbCrLf & vbTab & "==========================================" 
                & vbCrLf & vbCrLf
        ListTextBox.Text = initS & outputS
        LabelErr.Text = "SAL = " & dvalue

        ' 할당된 버퍼 해제 '
        Call fbfree(Isendbuf)
        Call fbfree(Irecvbuf)

        ' tpend 실행 함수 '
        tmaxEnd()
    End Sub

    Private Sub ExitSub(ByVal txbool As Integer, ByVal Isendbuf As IntPtr, 
                        ByVal Irecvbuf As IntPtr)

        If txbool = 1 Then
            tx_rollback()
        End If

        ' 할당된 버퍼 해제 '
        Call fbfree(Isendbuf)
        Call fbfree(Irecvbuf)

        ' tpend '
        tmaxEnd()

        End
    End Sub

    Public Sub tmaxStart()
        Dim ret As Integer
        Dim envFile As String

        ' 환경설정 파일을 불러옵니다. '
        ' atmi.bas 파일에 정의 되있습니다. '
        ' Declare Function tmaxreadenv Lib "TMAX4GL.DLL" (ByVal envfile As String, 
                                                   ByVal label As String) As Long '
        ' 자세한 설명은 "Tmax Reference Guide"를 참고하십시오. '
        envFile = "C:\tmax.env"
        ret = tmaxreadenv(envFile, "aix5l389")
        If ret < 0 Then
            MsgBox("Tmaxreadenv Error : " & envFile)
            End
        End If

        ret = tpstart(0&)
        If ret = -1 Then
            MsgBox("Tpstart Error")
            End
        Else
            LabelErr.Text = "tpstart return value = " & ret & " tpstart success"
        End If

    End Sub

    Public Sub tmaxEnd()
        Dim ret As Integer
        ret = tpend()
        If ret = -1 Then
            MsgBox("Tpend Error")
            End
        Else
            LabelErr.Text = "tpreturn return value = " & ret
        End If
    End Sub

    Private Sub ViewErr(ByVal a As IntPtr)

        'E_TYPE      9009    long    -   -
        'E_CODE      9010    long    -   -
        'E_MSG       9011    string  -   -
        'E_TMP       9012    long    -   -

        Dim typeL As Long
        Dim codeL As Long
        Dim msgS As String
        Dim tmpL As Long
        Dim Iret As Integer

        GETLONG(a, "E_TYPE", 0, typeL)
        GETLONG(a, "E_CODE", 0, codeL)
        GETVAR(a, "E_MSG", 0, msgS)
        GETLONG(a, "E_TMP", 0, tmpL)
        MsgBox("Error Type : " & typeL & " ,Code : " & codeL & " ,Message : 
               " & msgS & " ,Tmp : " & tmpL)

    End Sub
End ClassOption Strict Off
Option Explicit On 

Imports WindowsApplication1.TmaxUtils.TmaxMacros

Imports System.IO

Public Class EmployeeGrid
    Inherits System.Windows.Forms.Form

    Public Shared EmpNo As Integer

#Region " Windows Form 디자이너에서 생성한 코드 "

    Public Sub New()
        MyBase.New()

        '이 호출은 Windows Form 디자이너에 필요합니다.
        InitializeComponent()

        'InitializeComponent()를 호출한 다음에 초기화 작업을 추가하십시오.

    End Sub

    'Form은 Dispose를 재정의하여 구성 요소 목록을 정리합니다.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Windows Form 디자이너에 필요합니다.
    Private components As System.ComponentModel.IContainer

    '참고: 다음 프로시저는 Windows Form 디자이너에 필요합니다.
    'Windows Form 디자이너를 사용하여 수정할 수 있습니다.  
    '코드 편집기를 사용하여 수정하지 마십시오.
    Friend WithEvents BtnReturn As System.Windows.Forms.Button
    Friend WithEvents LabelErr As System.Windows.Forms.Label
    Protected WithEvents ListTextBox As System.Windows.Forms.TextBox
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.ListTextBox = New System.Windows.Forms.TextBox()
        Me.BtnReturn = New System.Windows.Forms.Button()
        Me.LabelErr = New System.Windows.Forms.Label()
        Me.SuspendLayout()
        '
        'ListTextBox
        '
        Me.ListTextBox.Location = New System.Drawing.Point(10, 12)
        Me.ListTextBox.Multiline = True
        Me.ListTextBox.Name = "ListTextBox"
        Me.ListTextBox.Size = New System.Drawing.Size(472, 272)
        Me.ListTextBox.TabIndex = 0
        Me.ListTextBox.TabStop = False
        Me.ListTextBox.Text = "TextBox" & Microsoft.VisualBasic.ChrW(13) 
                               & Microsoft.VisualBasic.ChrW(10) & "안녕"
        '
        'BtnReturn
        '
        Me.BtnReturn.Location = New System.Drawing.Point(392, 288)
        Me.BtnReturn.Name = "BtnReturn"
        Me.BtnReturn.Size = New System.Drawing.Size(88, 32)
        Me.BtnReturn.TabIndex = 1
        Me.BtnReturn.Text = "돌아가기"
        '
        'LabelErr
        '
        Me.LabelErr.Location = New System.Drawing.Point(20, 294)
        Me.LabelErr.Name = "LabelErr"
        Me.LabelErr.Size = New System.Drawing.Size(350, 23)
        Me.LabelErr.TabIndex = 2
        Me.LabelErr.Text = "Label1"
        '
        'EmployeeGrid
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
        Me.ClientSize = New System.Drawing.Size(492, 323)
        Me.Controls.AddRange(New System.Windows.Forms.Control() 
                   {Me.LabelErr, Me.BtnReturn, Me.ListTextBox})
        Me.Name = "EmployeeGrid"
        Me.Text = "사원정보 목록"
        Me.ResumeLayout(False)

    End Sub

#End Region

    Private Sub BtnReturn_Click(ByVal sender As System.Object, 
                                ByVal e As System.EventArgs) Handles BtnReturn.Click
        Hide()
    End Sub

    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)

        Dim Isendbuf, Irecvbuf As IntPtr
        Dim Isendlen, Irecvlen As Integer
        Dim Irbuflen As Long
        Dim Iret As Integer
        Dim text As String
        Dim value As Long
        Dim dvalue As Double
        Dim svalue As Single
        Dim lenL As Integer
        Dim initS, outputS As String
        Dim empnoS, enameS, jobS, mgrS, dateS, salS, commS, deptnoS As String
        Dim cntL As Long
        Dim eNo As Long
        Dim i As Integer
        Dim txbool As Integer ' 트랜잭션이 시작되면 1, 아니면 0 '

        ' tpstart '
        tmaxStart()

        ' 트랜잭션이 시작 유무 초기화 '
        txbool = 0

        ' 보낼 데이터를 위한 버퍼 할당 '
        Isendbuf = fballoc(100, 1024)
        If Isendbuf = 0 Then
            Call fbfree(Isendbuf)
            tmaxEnd()
            Exit Sub
        End If

        ' 받을 데이터를 위한 버퍼 할당 '
        Irecvbuf = fballoc(100, 1024)
        If Irecvbuf = 0 Then
            Call fbfree(Irecvbuf)
            tmaxEnd()
            Exit Sub
        End If

        Iret = fbput(Isendbuf, fbget_fldkey("EMPNO"), EmpNo, lenL)
        If Iret = -1 Then
            FdlErrorMsg("fbput")
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If

        ' 조회 서비스를 요청 '
        Iret = tpcall("FDLSELECT", Isendbuf, 0, Irecvbuf, Irbuflen, 0)
        If Iret = -1 Then
            ViewErr(Irecvbuf)
            initS = vbCrLf & vbTab & vbTab & vbTab & "***** 검색결과 *****" 
                  & vbCrLf & vbTab & "==========================================" 
                  & vbCrLf & vbTab & "사원번호 이름 직책 당당임원 입사일 봉급 COMM 부서" 
                  & vbCrLf & vbTab & "==========================================" 
                  & vbCrLf & vbCrLf
            ListTextBox.Text = initS & " "
            LabelErr.Text = "SAL = " & dvalue
            Call ExitSub(txbool, Isendbuf, Irecvbuf)
        End If

        Iret = fbkeyoccur(Irecvbuf, fbget_fldkey("EMPNO"))

        For i = 0 To Iret - 1

            ' 반환된 데이터를 텍스트 박스에 출력 '
            Iret = GETLONG(Irecvbuf, "EMPNO", i, value)
            If Iret = -1 Then
                Call ExitSub(txbool, Isendbuf, Irecvbuf)
            End If
            empnoS = value

            Iret = GETVAR(Irecvbuf, "ENAME", i, text)
            If Iret = -1 Then
                Call ExitSub(txbool, Isendbuf, Irecvbuf)
            End If
            enameS = text

            Iret = GETVAR(Irecvbuf, "JOB", i, text)
            If Iret = -1 Then
                Call ExitSub(txbool, Isendbuf, Irecvbuf)
            End If
            jobS = text

            Iret = GETLONG(Irecvbuf, "MGR", i, value)
            If Iret = -1 Then
                Call ExitSub(txbool, Isendbuf, Irecvbuf)
            End If
            mgrS = value

            Iret = GETVAR(Irecvbuf, "DATE", i, text)
            If Iret = -1 Then
                Call ExitSub(txbool, Isendbuf, Irecvbuf)
            End If
            dateS = text

            Iret = fbget_tu(Irecvbuf, fbget_fldkey("SAL"), i, svalue, 0)
            If Iret = -1 Then
                Call ExitSub(txbool, Isendbuf, Irecvbuf)
            End If
            salS = svalue

            Iret = fbget_tu(Irecvbuf, fbget_fldkey("COMM"), i, svalue, 0)
            If Iret = -1 Then
                Call ExitSub(txbool, Isendbuf, Irecvbuf)
            End If
            commS = svalue

            Iret = GETLONG(Irecvbuf, "DEPTNO", i, value)
            If Iret = -1 Then
                Call ExitSub(txbool, Isendbuf, Irecvbuf)
            End If
            deptnoS = value & vbCrLf

            outputS = outputS & "       " & empnoS & vbTab & enameS & vbTab & jobS & 
                 vbTab & mgrS & vbTab & dateS & vbTab & salS & vbTab & commS & 
                 vbTab & deptnoS

        Next i

        initS = vbCrLf & vbTab & vbTab & vbTab & "***** 검색결과 *****" 
                & vbCrLf & vbTab & "==========================================" 
                & vbCrLf & vbTab & "사원번호 이름 직책 담당임원 입사일 봉급 COMM 부서" 
                & vbCrLf & vbTab & "==========================================" 
                & vbCrLf & vbCrLf
        ListTextBox.Text = initS & outputS
        LabelErr.Text = "SAL = " & dvalue

        ' 할당된 버퍼 해제 '
        Call fbfree(Isendbuf)
        Call fbfree(Irecvbuf)

        ' tpend 실행 함수 '
        tmaxEnd()
    End Sub

    Private Sub ExitSub(ByVal txbool As Integer, ByVal Isendbuf As IntPtr, 
                        ByVal Irecvbuf As IntPtr)

        If txbool = 1 Then
            tx_rollback()
        End If

        ' 할당된 버퍼 해제 '
        Call fbfree(Isendbuf)
        Call fbfree(Irecvbuf)

        ' tpend '
        tmaxEnd()

        End
    End Sub

    Public Sub tmaxStart()
        Dim ret As Integer
        Dim envFile As String

        ' 환경설정 파일을 불러옵니다. '
        ' atmi.bas 파일에 정의되어 있습니다. '
        ' Declare Function tmaxreadenv Lib "TMAX4GL.DLL" (ByVal envfile As String, 
                                                   ByVal label As String) As Long '
        ' 자세한 설명은 "Tmax Reference Guide"를 참고하십시오. '
        envFile = "C:\tmax.env"
        ret = tmaxreadenv(envFile, "aix5l389")
        If ret < 0 Then
            MsgBox("Tmaxreadenv Error : " & envFile)
            End
        End If

        ret = tpstart(0&)
        If ret = -1 Then
            MsgBox("Tpstart Error")
            End
        Else
            LabelErr.Text = "tpstart return value = " & ret & " tpstart success"
        End If

    End Sub

    Public Sub tmaxEnd()
        Dim ret As Integer
        ret = tpend()
        If ret = -1 Then
            MsgBox("Tpend Error")
            End
        Else
            LabelErr.Text = "tpreturn return value = " & ret
        End If
    End Sub

    Private Sub ViewErr(ByVal a As IntPtr)

        'E_TYPE     9009    long    -   -
        'E_CODE     9010    long    -   -
        'E_MSG      9011    string  -   -
        'E_TMP      9012    long    -   -

        Dim typeL As Long
        Dim codeL As Long
        Dim msgS As String
        Dim tmpL As Long
        Dim Iret As Integer

        GETLONG(a, "E_TYPE", 0, typeL)
        GETLONG(a, "E_CODE", 0, codeL)
        GETVAR(a, "E_MSG", 0, msgS)
        GETLONG(a, "E_TMP", 0, tmpL)
        MsgBox("Error Type : " & typeL & " ,Code : " & codeL & " ,Message : 
                " & msgS & " ,Tmp : " & tmpL)

    End Sub
End Class

4.3.5. 서버 프로그램

서비스 프로그램

다음은 서비스를 하는 서버 프로그램의 예제이다.

<emp_c.pc>

#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의 예제이다.

<emp_c.mk>

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