Visual Basic .net 인터페이스(유니코드)
본 장에서는 유니코드를 지원하는 Visual Basic .net 인터페이스에서 사용하는 함수와 예제를 설명한다.
유니코드를 지원하기 위해 사용되는 IntPtr 객체는 Visual Basic의 경우 int 타입을 할당할 수 있으므로 일반 Visual Basic .net 인터페이스와 호환이 가능하다. 일반 Visual Basic .net 인터페이스에 대한 자세한 내용은 Visual Basic .net 인터페이스(일반)를 참조한다. |
1. 개요
Visual Basic .net 인터페이스에는 클라이언트 라이브러리를 호출할 수 있도록 함수의 프로토타입을 정의한 인터페이스 모듈이 존재한다.
개발자는 다음의 인터페이스 모듈을 설치하면 편리하게 Tmax 클라이언트 라이브러리에서 제공하는 함수를 호출하여 사용할 수 있다.
모듈 | 설명 |
---|---|
atmi.vb |
atmi 함수에 대한 프로토타입 정의 모듈이다. |
fdl.vb |
필드키 함수에 대한 프로토타입 정의 모듈이다. |
TmaxMacros.vb |
사용자의 편리를 위한 매크로 정의 클래스이다. |
WinApi.vb |
Windows에서 제공하는 함수를 호출하기 위한 프로토타입 정의 모듈이다. |
다음은 Visual Basic .net 인터페이스에서 제공하는 함수의 목록이다.
함수 | 설명 |
---|---|
fieldkey "STATLIN"에 실린 내용과 tpurcode의 에러 메시지를 출력하는 함수이다. |
|
FDL 함수에 대한 에러를 출력하는 함수이다. |
|
Tmax 시스템과 연결하기 위해 설정해야 하는 버퍼인 tpstart_t 구조체를 구성하는 함수이다. |
|
String 데이터를 tpalloc()으로 메모리에 할당된 버퍼로부터 읽어 오는 함수이다. |
|
Binary 데이터를 tpalloc()으로 메모리에 할당된 버퍼로부터 읽어 오는 함수이다. |
|
Tmax FDL 함수인 fbget_tu()를 이용하여 지정한 fldName에 지정된 필드명의 nth 순번에 해당하는 필드 데이터를 value(Byte array)로 반환하는 함수이다. |
|
Tmax FDL 함수인 fbget_tu()를 이용하여 지정한 fldName에 지정된 필드명의 nth 순번에 해당하는 필드 데이터를 value(CARRAY)로 반환하는 함수이다. |
|
Tmax FDL 함수인 fbget_tu()를 이용하여 지정한 fldName에 지정된 필드명의 nth 순번에 해당하는 필드 데이터를 value(Double)로 반환하는 함수이다. |
|
Tmax FDL 함수인 fbget_tu()를 이용하여 지정한 fldName에 지정된 필드명의 nth 순번에 해당하는 필드 데이터를 value(Single)로 반환하는 함수이다. |
|
Tmax FDL 함수인 fbget_tu()를 이용하여 지정한 fldName에 지정된 필드명의 nth 순번에 해당하는 필드 데이터를 value(Integer)로 반환하는 함수이다. |
|
Tmax FDL 함수인 fbget_tu()를 이용하여 지정한 fldName에 지정된 필드명의 nth 순번에 해당하는 필드 데이터를 value(Long)로 반환하는 함수이다. |
|
Tmax FDL 함수인 fbget_tu()를 이용하여 지정한 fldName에 지정된 필드명의 nth 순번에 해당하는 필드 데이터를 value(Short)로 반환하는 함수이다. |
|
Tmax FDL 함수인 fbget_tu()를 이용하여 지정한 fldName에 지정된 필드명의 nth 순번에 해당하는 필드 데이터를 value(String)로 반환하는 함수이다. |
|
CARRAY 데이터를 tpalloc()으로 메모리에 할당된 버퍼에 저장하는 함수이다. |
|
Binary 데이터를 tpalloc()으로 메모리에 할당된 버퍼에 저장하는 함수이다. |
|
Tmax FDL 함수인 fbchg_tu()를 이용하여 지정한 nth에 해당하는 순번으로 fldName에 지정된 필드명에 value값(Byte array)을 저장하는 함수이다. |
|
Tmax FDL 함수인 fbchg_tu()를 이용하여 지정한 nth에 해당하는 순번으로 fldName에 지정된 필드명에 value값(Char)을 저장하는 함수이다. |
|
Tmax FDL 함수인 fbchg_tu()를 이용하여 지정한 nth에 해당하는 순번으로 fldName에 지정된 필드명에 value값(Double)을 저장하는 함수이다. |
|
Tmax FDL 함수인 fbchg_tu()를 이용하여 지정한 nth에 해당하는 순번으로 fldName에 지정된 필드명에 value값(Single)을 저장하는 함수이다. |
|
Tmax FDL 함수인 fbchg_tu()를 이용하여 지정한 nth에 해당하는 순번으로 fldName에 지정된 필드명에 value값(Integer)을 저장하는 함수이다. |
|
Tmax FDL 함수인 fbchg_tu()를 이용하여 지정한 nth에 해당하는 순번으로 fldName에 지정된 필드명에 value값(Long)을 저장하는 함수이다. |
|
Tmax FDL 함수인 fbchg_tu()를 이용하여 지정한 nth에 해당하는 순번으로 fldName에 지정된 필드명에 value값(Short)을 저장하는 함수이다. |
|
Tmax FDL 함수인 fbchg_tu()를 이용하여 지정한 nth에 해당하는 순번으로 fldName에 지정된 필드명에 value값(String)을 저장하는 함수이다. |
atmi 함수와 필드키 함수에 대한 프로토타입 및 기능은 Tmax Reference Guide 및 Tmax Application Development Guide를 참고한다. |
2. 함수
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()
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()
2.3. FilltpstartBuf
Tmax 시스템과 연결하기 위해 설정해야 하는 버퍼인 tpstart_t 구조체를 구성하는 함수이다.
-
프로토타입
Public Shared Function FilltpstartBuf(ByVal pBuffer As IntPtr, _ ByVal startInfop As tpstart_t) As Integer
-
파라미터
파라미터 설명 pBuffer
tpalloc()으로 메모리에 할당된 버퍼이다.
startInfo
tpstart_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
2.4. GETCAR
String 데이터를 tpalloc()으로 메모리에 할당된 버퍼로부터 읽어 오는 함수이다.
-
프로토타입
Public Shared Function GETCAR(ByVal pBuffer As IntPtr, _ByRef value As String, _ByVal len As Integer) As Integer
-
파라미터
파라미터 설명 pBuffer
tpalloc()으로 메모리에 할당된 버퍼이다.
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()
2.5. GETCAR2
Binary 데이터를 tpalloc()으로 메모리에 할당된 버퍼로부터 읽어 오는 함수이다.
-
프로토타입
Public Shared Function GETCAR2(ByVal pBuffer As IntPtr, _ByRef value() As Byte, _ByVal len As Integer) As Integer
-
파라미터
파라미터 설명 pBuffer
tpalloc()으로 메모리에 할당된 버퍼이다.
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()
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
-
파라미터
파라미터 설명 pFBUF
tpalloc()또는 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()
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
-
파라미터
파라미터 설명 pFBUF
tpalloc()또는 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()
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
-
파라미터
파라미터 설명 pFBUF
tpalloc() 또는 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()
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
-
파라미터
파라미터 설명 pFBUF
tpalloc() 또는 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()
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
-
파라미터
파라미터 설명 pFBUF
tpalloc() 또는 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()
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
-
파라미터
파라미터 설명 pFBUF
tpalloc() 또는 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()
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
-
파라미터
파라미터 설명 pFBUF
tpalloc() 또는 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()
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
-
파라미터
파라미터 설명 pFBUF
tpalloc() 또는 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()
2.14. PUTCAR
CARRAY 데이터를 tpalloc()으로 메모리에 할당된 버퍼에 저장하는 함수이다.
-
프로토타입
Public Shared Function PUTCAR(ByVal pBuffer As IntPtr, _ByVal value As String, _ByVal len As Integer) As Integer
-
파라미터
파라미터 설명 pBuffer
tpalloc()으로 메모리에 할당된 버퍼이다.
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()
2.15. PUTCAR2
Binary 데이터를 tpalloc()으로 메모리에 할당된 버퍼에 저장하는 함수이다.
-
프로토타입
Public Shared Function PUTCAR2(ByVal pBuffer As IntPtr, _ByRef value() As Byte, _ByVal len As Integer) As Integer
-
파라미터
파라미터 설명 pBuffer
tpalloc()으로 메모리에 할당된 버퍼이다.
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()
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
-
파라미터
파라미터 설명 pFBUF
tpalloc() 또는 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()
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
-
파라미터
파라미터 설명 pFBUF
tpalloc() 또는 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()
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
-
파라미터
파라미터 설명 pFBUF
tpalloc()또는 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()
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
-
파라미터
파라미터 설명 pFBUF
tpalloc()또는 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()
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
-
파라미터
파라미터 설명 pFBUF
tpalloc() 또는 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()
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
-
파라미터
파라미터 설명 pFBUF
tpalloc()또는 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()
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
-
파라미터
파라미터 설명 pFBUF
tpalloc() 또는 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()
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
-
파라미터
파라미터 설명 pFBUF
tpalloc()또는 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()
3. 예제 프로그램
account id를 키값으로 조회, 수정, 삭제, 입력하는 프로그램이며 사용되는 버퍼는 필드키 버퍼를 사용하였다.
3.1. 프로그램 구성
atmi.vb, fdl.vb, TmaxMacros.vb, WinAPI.vb를 모듈로 프로젝트에서 추가한다.
-
공통 프로그램
프로그램 파일 설명 demo.f
필드키 버퍼를 정의한 파일이다.
tmconfig.m
Tmax 환경설정 파일이다.
-
클라이언트 프로그램
프로그램 파일 설명 AssemblyInfo.vb
assembly할 때 사용되는 기본값을 설정하는 파일이다.
CodeFile1.vb
Visual Basic .net 인터페이스에서 자동으로 생성되는 파일이다.
EmployeeGrid.resx
Visual Basic .net 인터페이스에서 자동으로 생성되는 파일이다.
EmployeeGrid.vb
조회의 결과를 보여주는 프로그램이다.
EmployeeMgr.resx
Visual Basic .net 인터페이스에서 자동으로 생성되는 파일이다.
EmployeeMgr.sln
Visual Basic .net 인터페이스에서 자동으로 생성되는 파일이다.
EmployeeMgr.suo
Visual Basic .net 인터페이스에서 자동으로 생성되는 파일이다.
EmployeeMgr.vb
메인 프로그램이다. 조회, 수정, 삭제, 입력을 수행한다.
EmployeeMgr.vbproj
Visual Basic .net 인터페이스에서 자동으로 생성되는 파일이다.
EmployeeMgr.vbproj.user
Visual Basic .net 인터페이스에서 자동으로 생성되는 파일이다.
TmaxMacros.vb
사용자의 편의를 위한 매크로 정의 클래스이다.
WinAPI.vb
Windows에서 제공하는 함수를 호출하기 위한 프로토타입을 정의한 모듈이다.
atmi.vb
atmi 함수에 대한 프로토타입을 정의한 모듈이다.
fdl.vb
필드키 함수에 대한 프로토타입을 정의한 모듈이다.
-
서버 프로그램
프로그램 파일 설명 emp_c.mk
Makefile이다.
emp_c.pc
서비스를 하는 서버 프로그램이다. AIX와 Oracle 9i를 사용한다.
3.2. 프로그램 특징
다음은 프로그램의 특징이다.
-
클라이언트 프로그램
기능 설명 Tmax 연결
tpstart_t 인자로 연결한다.
버퍼 유형
FIELD KEY 버퍼, 구조체 파일을 fdlc 유틸리티로 컴파일하여 'fdl' 파일 생성이 필요하다.
통신 유형
tpcall()을 이용한 동기 통신, 보내는 버퍼와 받는 버퍼를 다르게 지정한다.
트랜잭션 여부
TMS에서 AutoTransaction을 부여한다.
-
서버 프로그램
기능 설명 서비스
FDLSELECT, FDLINSERT를 작성한다.
데이터베이스 지정
Oracle 데이터베이스를 사용한다. 시스템 구성 파일의 SVRGROUP에 데이터베이스 정보를 지정한다.
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
3.4. 클라이언트 프로그램
메인화면
다음은 메인화면 Form 디자인 화면이다.
다음은 예제에서 사용할 메인화면 Form 디자인 구성표이다.
컨트롤 이름 | 컨트롤 종류 | 비고 |
---|---|---|
EmployeeMgrForm |
Form |
Caption="사원관리 프로그램" |
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 디자인 구성표이다.
컨트롤 이름 | 컨트롤 종류 | 수정이 필요한 프로퍼티 |
---|---|---|
EmployeeGrid |
Form |
Caption="사원정보 목록" |
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
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