Visual Basic .NET Interface (Unicode)
This chapter describes functions used by the Visual Basic .NET interface that supports Unicode, with examples.
Since int data can be assigned to an IntPtr object that is used to support Unicode in Visual Basic, Visual Basic .NET’s Unicode interface and Visual Basic .NET’s general interface are compatible. For more information about Visual Basic .NET’s general interface, refer to Visual Basic .NET Interface (General). |
1. Overview
A Visual Basic .NET interface has interface modules that define functions' prototypes to call a client library.
If the following interface modules are installed, functions provided by a Tmax client library can be called and used.
Module | Description |
---|---|
atmi.vb |
Module that defines ATMI functions' prototypes. |
fdl.vb |
Module that defines field key functions' prototypes. |
TmaxMacros.vb |
Class that defines macros for user convenience. |
WinApi.vb |
Module that defines prototypes of functions provided by Windows. |
The Visual Basic .NET interface provides the following functions.
Function | Description |
---|---|
Displays data in the "STATLIN" field key and an error message of tpurcode. |
|
Displays an error message and an error code of an FDL function. |
|
Makes up a tpstart_t structure, which is a buffer used to connect to a Tmax system. |
|
Gets string data from a buffer allocated in memory through tpalloc(). |
|
Gets binary data from a buffer allocated in memory through tpalloc(). |
|
Returns data in a field with a specified name and location as a byte array value by using fbget_tu(), the Tmax FDL function. |
|
Returns data in a field with a specified name and location as a CARRAY value by using fbget_tu(), the Tmax FDL function. |
|
Returns data in a field with a specified name and location as a Double value by using fbget_tu(), the Tmax FDL function. |
|
Returns data in a field with a specified name and location as a Single value by using fbget_tu(), the Tmax FDL function. |
|
Returns data in a field with a specified name and location as an Integer value by using fbget_tu(), the Tmax FDL function. |
|
Returns data in a field with a specified name and location as a Long value by using fbget_tu(), the Tmax FDL function. |
|
Returns data in a field with a specified name and location as a Short value by using fbget_tu(), the Tmax FDL function. |
|
Returns data in a field with a specified name and location as a String value by using fbget_tu(), the Tmax FDL function. |
|
Stores CARRAY data in a buffer allocated in memory through tpalloc(). |
|
Stores binary data in a buffer allocated in memory through tpalloc(). |
|
Saves data to a field with a specified name and location as a byte array value by using fbchg_tu(), the Tmax FDL function. |
|
Saves data to a field with a specified name and location as a Char value by using fbchg_tu(), the Tmax FDL function. |
|
Saves data to a field with a specified name and location as a Double value by using fbchg_tu(), the Tmax FDL function. |
|
Saves data to a field with a specified name and location as a Single value by using fbchg_tu(), the Tmax FDL function. |
|
Saves data to a field with a specified name and location as an Integer value by using fbchg_tu(), the Tmax FDL function. |
|
Saves data to a field with a specified name and location as a Long value by using fbchg_tu(), the Tmax FDL function. |
|
Saves data to a field with a specified name and location as a Short value by using fbchg_tu(), the Tmax FDL function. |
|
Saves data to a field with a specified name and location as a String value by using fbchg_tu(), the Tmax FDL function. |
For information about prototypes and descriptions of ATMI and field key functions, refer to Tmax Reference Guide and Tmax Application Development Guide. |
2. Functions
2.1. ErrorMsg
Displays data in the "STATLIN" field key and an error message of tpurcode. ErrorMsg() is defined in the TmaxMacros.vb file.
The data and error message is displayed in MsgBox. If the error message is sent from a server, both the error message and a user-desired message are displayed in MsgBox.
-
Prototype
Public Shared Function ErrorMsg (ByVal pBuffer As IntPtr, ByVal msg As String) As Integer
-
Parameter
Parameter Description pBuffer
Pointer of a buffer.
msg
Data to be displayed.
-
Return value
Return value Description 1
Function call succeeded.
-1
Function call failed.
-
Example
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
-
Related functions
FdlErrorMsg()
2.2. FdlErrorMsg
Displays an error message and an error code of an FDL function in MsgBox.
-
Prototype
Public Shared Function FdlErrorMsg(ByVal msg As String) As Integer
-
Parameter
Parameter Description msg
Data to be displayed.
-
Return value
Return value Description 1
Function call succeeded.
-1
Function call failed.
-
Example
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
-
Related functions
ErrorMsg()
2.3. FilltpstartBuf
Makes up a tpstart_t structure, which is a buffer used to connect to a Tmax system.
-
Prototype
Public Shared Function FilltpstartBuf(ByVal pBuffer As IntPtr, _ ByVal startInfop As tpstart_t) As Integer
-
Parameter
Parameter Description pBuffer
Buffer allocated in memory through tpalloc().
startInfo
tpstart_t variable.
-
Return value
Return value Description 0 (primary host)
1 (backup host)
Function call succeeded.
-1
Function call failed.
-
Example
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
Gets string data from a buffer allocated in memory through tpalloc().
-
Prototype
Public Shared Function GETCAR(ByVal pBuffer As IntPtr, _ByRef value As String, _ByVal len As Integer) As Integer
-
Parameter
Parameter Description pBuffer
Buffer allocated in memory through tpalloc().
value
Data to be read.
len
Length of data to be read.
-
Return value
Return value Description 1
Function call succeeded.
-1
Function call failed.
-
Example
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
-
Related functions
PUTCAR()
2.5. GETCAR2
Gets binary data from a buffer allocated in memory through tpalloc().
-
Prototype
Public Shared Function GETCAR2(ByVal pBuffer As IntPtr, _ByRef value() As Byte, _ByVal len As Integer) As Integer
-
Parameter
Parameter Description pBuffer
Buffer allocated in memory through tpalloc().
value
Data to be read.
len
Length of data to be read.
-
Return value
Return value Description 1
Function call succeeded.
-1
Function call failed.
-
Example
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
-
Related functions
PUTCAR2()
2.6. GETCAR3
Returns data in a field with a specified name and location by using fbget_tu(), the Tmax FDL function. The field name is specified in fldName (the 2nd parameter) and the field location is specified in nth (the 3rd parameter). The data is returned through value (the 4th parameter), which is a byte array.
-
Prototype
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
-
Parameter
Parameter Description pFBUF
Buffer allocated in memory through tpalloc() or fballoc().
fldName
Name of a field to be read from a field buffer (pFBUF).
nth
Sequence number of a field to be read.
value
Field data to be read.
len
Length of field data to be read.
-
Return value
Return value Description 1
Function call succeeded.
-1
Function call failed.
-
Example
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
-
Related functions
GETINT(), GETLONG(), GETDOUBLE(), GETFLOAT(), GETSHORT(), GETVAR(), GETCHR()
2.7. GETCHR
Returns data in a field with a specified name and location by using fbget_tu(), the Tmax FDL function. The field name is specified in fldName (the 2nd parameter) and the field location is specified in nth (the 3rd parameter). The data is returned through value (the 4th parameter), which is CARRAY.
While GETVAR() returns String data, GETCHR() returns CARRAY data. Since a specific data length is necessary for CARRAY, the length is specified through a parameter. A specific data length is not necessary for String because String data has NULL at the end.
-
Prototype
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
-
Parameter
Parameter Description pFBUF
Buffer allocated in memory through tpalloc() or fballoc().
fldName
Name of a field to be read from a field buffer (pFBUF).
nth
Sequence number of a field to be read.
value
Field data to be read.
len
Length of field data to be read.
-
Return value
Return value Description 1
Function call succeeded.
-1
Function call failed.
-
Example
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
-
Related functions
GETINT(), GETLONG(), GETDOUBLE(), GETFLOAT(), GETSHORT(), GETCAR3(), GETVAR()
2.8. GETDOUBLE
Returns data in a field with a specified name and location by using fbget_tu(), the Tmax FDL function. The field name is specified in fldName (the 2nd parameter) and the field location is specified in nth (the 3rd parameter). The data is returned through value (the 4th parameter), which is Double.
-
Prototype
Public Shared Function GETDOUBLE(ByVal pFBUF As IntPtr, _ByRef fldName As String, _ByVal nth As Integer, _ByRef value As Double) As Integer
-
Parameter
Parameter Description pFBUF
Buffer allocated in memory through tpalloc() or fballoc().
fldName
Name of a field to be read from a field buffer (pFBUF).
nth
Sequence number of a field to be read.
value
Field data to be read.
-
Return value
Return value Description 1
Function call succeeded.
-1
Function call failed.
-
Example
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
-
Related functions
GETINT(), GETLONG(), GETFLOAT(), GETSHORT(), GETCAR3(), GETVAR(), GETCHR()
2.9. GETFLOAT
Returns data in a field with a specified name and location by using fbget_tu(), the Tmax FDL function. The field name is specified in fldName (the 2nd parameter) and the field location is specified in nth (the 3rd parameter). The data is returned through value (the 4th parameter), which is Single.
-
Prototype
Public Shared Function GETFLOAT(ByVal pFBUF As IntPtr,_ByRef fldName As String, _ByVal nth As Integer, _ByRef value As Single) As Integer
-
Parameter
Parameter Description pFBUF
Buffer allocated in memory through tpalloc() or fballoc().
fldName
Name of a field to be read from a field buffer (pFBUF).
nth
Sequence number of a field to be read.
value
Field data to be read.
-
Return value
Return value Description 1
Function call succeeded.
-1
Function call failed.
-
Example
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
-
Related functions
GETINT(), GETLONG(), GETDOUBLE(), GETSHORT() GETCAR3(), GETVAR(), GETCHR()
2.10. GETINT
Returns data in a field with a specified name and location by using fbget_tu(), the Tmax FDL function. The field name is specified in fldName (the 2nd parameter) and the field location is specified in nth (the 3rd parameter). The data is returned through value (the 4th parameter), which is Integer.
-
Prototype
Public Shared Function GETINT(ByVal pFBUF As IntPtr, _ByRef fldName As String, _ByVal nth As Integer, _ByRef value As Integer) As Integer
-
Parameter
Parameter Description pFBUF
Buffer allocated in memory through tpalloc() or fballoc().
fldName
Name of a field to be read from a field buffer (pFBUF).
nth
Sequence number of a field to be read.
value
Field data to be read.
-
Return value
Return value Description 1
Function call succeeded.
-1
Function call failed.
-
Example
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
-
Related functions
GETLONG(), GETDOUBLE(), GETFLOAT(), GETSHORT(), GETCAR3(), GETVAR(), GETCHR()
2.11. GETLONG
Returns data in a field with a specified name and location by using fbget_tu(), the Tmax FDL function. The field name is specified in fldName (the 2nd parameter) and the field location is specified in nth (the 3rd parameter). The data is returned through value (the 4th parameter), which is Long.
-
Prototype
Public Shared Function GETLONG(ByVal pFBUF As IntPtr, _ByRef fldName As String, _ByVal nth As Integer, _ByRef value As Long) As Integer
-
Parameter
Parameter Description pFBUF
Buffer allocated in memory through tpalloc() or fballoc().
fldName
Name of a field to be read from a field buffer (pFBUF).
nth
Sequence number of a field to be read.
value
Field data to be read.
-
Return value
Return value Description 1
Function call succeeded.
-1
Function call failed.
-
Example
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
-
Related functions
GETINT(), GETDOUBLE(), GETFLOAT(), GETSHORT(), GETCAR3(), GETVAR(), GETCHR()
2.12. GETSHORT
Returns data in a field with a specified name and location by using fbget_tu(), the Tmax FDL function. The field name is specified in fldName (the 2nd parameter) and the field location is specified in nth (the 3rd parameter). The data is returned through value (the 4th parameter), which is Short.
-
Prototype
Public Shared Function GETSHORT(ByVal pFBUF As IntPtr, _ByRef fldName As String, _ByVal nth As Integer, _ByRef value As Short) As Integer
-
Parameter
Parameter Description pFBUF
Buffer allocated in memory through tpalloc() or fballoc().
fldName
Name of a field to be read from a field buffer (pFBUF).
nth
Sequence number of a field to be read.
value
Field data to be read.
-
Return value
Return value Description 1
Function call succeeded.
-1
Function call failed.
-
Example
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
-
Related functions
GETINT(), GETLONG(), GETDOUBLE(), GETFLOAT(), GETCAR3(), GETVAR(), GETCHR()
2.13. GETVAR
Returns data in a field with a specified name and location by using fbget_tu(), the Tmax FDL function. The field name is specified in fldName (the 2nd parameter) and the field location is specified in nth (the 3rd parameter). The data is returned through value (the 4th parameter), which is String.
-
Prototype
Public Shared Function GETVAR(ByVal pFBUF As IntPtr, _ByRef fldName As String, _ByVal nth As Integer, _ByRef value As String) As Integer
-
Parameter
Parameter Description pFBUF
Buffer allocated in memory through tpalloc() or fballoc().
fldName
Name of a field to be read from a field buffer (pFBUF).
nth
Sequence number of a field to be read.
value
Field data to be read.
-
Return value
Return value Description 1
Function call succeeded.
-1
Function call failed.
-
Example
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
-
Related functions
GETINT(), GETLONG(), GETDOUBLE(), GETFLOAT(), GETSHORT(), GETCAR3(), GETCHR()
2.14. PUTCAR
Stores CARRAY data in a buffer allocated in memory through tpalloc().
-
Prototype
Public Shared Function PUTCAR(ByVal pBuffer As IntPtr, _ByVal value As String, _ByVal len As Integer) As Integer
-
Parameter
Parameter Description pBuffer
Buffer allocated in memory through tpalloc().
value
CARRAY data to be stored.
len
Length of CARRAY data to be stored.
-
Return value
Return value Description 1
Function call succeeded.
-1
Function call failed.
-
Example
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
-
Related functions
GETCAR()
2.15. PUTCAR2
Stores binary data in a buffer allocated in memory through tpalloc().
-
Prototype
Public Shared Function PUTCAR2(ByVal pBuffer As IntPtr, _ByRef value() As Byte, _ByVal len As Integer) As Integer
-
Parameter
Parameter Description pBuffer
Buffer allocated in memory through tpalloc().
value
Binary data to be stored.
len
Length of binary data to be stored.
-
Return value
Return value Description 1
Function call succeeded.
-1
Function call failed.
-
Example
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
-
Related functions
GETCAR2()
2.16. PUTCAR3
Saves data to a field with a specified name and location by using fbchg_tu(), the Tmax FDL function. The field name is specified in fldName (the 2nd parameter) and the field location is specified in nth (the 3rd parameter). The data to be saved is value (the 4th parameter), which is a byte array. This PUTCAR3 function is used to handle binary data.
If a specified filed already has data, the existing data will be replaced with a given data. If a specified filed already has no data, a given data will be saved.
-
Prototype
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
-
Parameter
Parameter Description pFBUF
Buffer allocated in memory through tpalloc() or fballoc().
fldName
Name of a field to be stored in a field buffer (pFBUF).
nth
Sequence number of a field to be stored.
value
Binary data to be stored.
len
Length of binary data to be stored.
-
Return value
Return value Description 1
Function call succeeded.
-1
Function call failed.
-
Example
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
-
Related functions
PUTINT(), PUTLONG(), PUTSHORT(), PUTDOUBLE(), PUTFLOAT(), PUTVAR(), PUTCHR()
2.17. PUTCHR
Saves data to a field with a specified name and location by using fbchg_tu(), the Tmax FDL function. The field name is specified in fldName (the 2nd parameter) and the field location is specified in nth (the 3rd parameter). The data to be saved is value (the 4th parameter), which is Char.
If a specified filed already has data, the existing data will be replaced with a given data. If a specified filed already has no data, a given data will be saved.
-
Prototype
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
-
Parameter
Parameter Description pFBUF
Buffer allocated in memory through tpalloc() or fballoc().
fldName
Name of a field to be stored in a field buffer (pFBUF).
nth
Sequence number of a field to be stored.
value
Char data to be stored.
len
Length of Char data to be stored.
-
Return value
Return value Description 1
Function call succeeded.
-1
Function call failed.
-
Example
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
-
Related functions
PUTINT(), PUTLONG(), PUTSHORT(), PUTDOUBLE(), PUTFLOAT(), PUTCAR3(), PUTVAR()
2.18. PUTDOUBLE
Saves data to a field with a specified name and location by using fbchg_tu(), the Tmax FDL function. The field name is specified in fldName (the 2nd parameter) and the field location is specified in nth (the 3rd parameter). The data to be saved is value (the 4th parameter), which is Double.
If a specified filed already has data, the existing data will be replaced with a given data. If a specified filed already has no data, a given data will be saved.
-
Prototype
Public Shared Function PUTDOUBLE(ByVal pFBUF As IntPtr, _ByVal fldName As String, _ByVal nth As Integer, _ByRef value As Double) As Integer
-
Parameter
Parameter Description pFBUF
Buffer allocated in memory through tpalloc() or fballoc().
fldName
Name of a field to be stored in a field buffer (pFBUF).
nth
Sequence number of a field to be stored.
value
Double data to be stored.
-
Return value
Return value Description 1
Function call succeeded.
-1
Function call failed.
-
Example
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
-
Related functions
PUTINT(), PUTLONG(), PUTFLOAT(), PUTSHORT(), PUTCAR3(), PUTVAR(), PUTCHR()
2.19. PUTFLOAT
Saves data to a field with a specified name and location by using fbchg_tu(), the Tmax FDL function. The field name is specified in fldName (the 2nd parameter) and the field location is specified in nth (the 3rd parameter). The data to be saved is value (the 4th parameter), which is Single.
If a specified filed already has data, the existing data will be replaced with a given data. If a specified filed already has no data, a given data will be saved.
-
Prototype
Public Shared Function PUTFLOAT(ByVal pFBUF As IntPtr, _ByVal fldName As String, _ByVal nth As Integer, _ByRef value As Single) As Integer
-
Parameter
Parameter Description pFBUF
Buffer allocated in memory through tpalloc() or fballoc().
fldName
Name of a field to be stored in a field buffer (pFBUF).
nth
Sequence number of a field to be stored.
value
String data to be stored.
-
Return value
Return value Description 1
Function call succeeded.
-1
Function call failed.
-
Example
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
-
Related functions
PUTINT(), PUTLONG(), PUTSHORT(), PUTDOUBLE(), PUTCAR3(), PUTVAR(), PUTCHR()
2.20. PUTINT
Saves data to a field with a specified name and location by using fbchg_tu(), the Tmax FDL function. The field name is specified in fldName (the 2nd parameter) and the field location is specified in nth (the 3rd parameter). The data to be saved is value (the 4th parameter), which is Integer.
If a specified filed already has data, the existing data will be replaced with a given data. If a specified filed already has no data, a given data will be saved.
-
Prototype
Public Shared Function PUTINT(ByVal pFBUF As IntPtr, _ByVal fldName As String, _ByVal nth As Integer, _ByRef value As Integer) As Integer
-
Parameter
Parameter Description pFBUF
Buffer allocated in memory through tpalloc() or fballoc().
fldName
Name of a field to be stored in a field buffer (pFBUF).
nth
Sequence number of a field to be stored.
value
Integer data to be stored.
-
Return value
Return value Description 1
Function call succeeded.
-1
Function call failed.
-
Example
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
-
Related functions
PUTLONG(), PUTDOUBLE(), PUTFLOAT(), PUTSHORT(), PUTCAR3(), PUTVAR(), PUTCHR()
2.21. PUTLONG
Saves data to a field with a specified name and location by using fbchg_tu(), the Tmax FDL function. The field name is specified in fldName (the 2nd parameter) and the field location is specified in nth (the 3rd parameter). The data to be saved is value (the 4th parameter), which is Long.
If a specified filed already has data, the existing data will be replaced with a given data. If a specified filed already has no data, a given data will be saved.
-
Prototype
Public Shared Function PUTLONG(ByVal pFBUF As IntPtr, _ByVal fldName As String, _ByVal nth As Integer, _ByRef value As Long) As Integer
-
Parameter
Parameter Description pFBUF
Buffer allocated in memory through tpalloc() or fballoc().
fldName
Name of a field to be stored in a field buffer (pFBUF).
nth
Sequence number of a field to be stored.
value
Long data to be stored.
-
Return value
Return value Description 1
Function call succeeded.
-1
Function call failed.
-
Example
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
-
Related functions
PUTINT(), PUTDOUBLE(), PUTFLOAT(), PUTSHORT(), PUTCAR3(), PUTVAR(), PUTCHR()
2.22. PUTSHORT
Saves data to a field with a specified name and location by using fbchg_tu(), the Tmax FDL function. The field name is specified in fldName (the 2nd parameter) and the field location is specified in nth (the 3rd parameter). The data to be saved is value (the 4th parameter), which is Short.
If a specified filed already has data, the existing data will be replaced with a given data. If a specified filed already has no data, a given data will be saved.
-
Prototype
Public Shared Function PUTSHORT(ByVal pFBUF As IntPtr, _ByVal fldName As String, _ByVal nth As Integer, _ByRef value As Short) As Integer
-
Parameter
Parameter Description pFBUF
Buffer allocated in memory through tpalloc() or fballoc().
fldName
Name of a field to be stored in a field buffer (pFBUF).
nth
Sequence number of a field to be stored.
value
Short data to be stored.
-
Return value
Return value Description 1
Function call succeeded.
-1
Function call failed.
-
Example
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
-
Related functions
PUTINT(), PUTLONG(), PUTFLOAT(), PUTDOUBLE(), PUTCAR3(), PUTVAR(), PUTCHR()
2.23. PUTVAR
Saves data to a field with a specified name and location by using fbchg_tu(), the Tmax FDL function. The field name is specified in fldName (the 2nd parameter) and the field location is specified in nth (the 3rd parameter). The data to be saved is value (the 4th parameter), which is String.
If a specified filed already has data, the existing data will be replaced with a given data. If a specified filed already has no data, a given data will be saved.
-
Prototype
Public Shared Function PUTVAR(ByVal pFBUF As IntPtr, _ByVal fldName As String, _ByVal nth As Integer, _ByVal value As String) As Integer
-
Parameter
Parameter Description pFBUF
Buffer allocated in memory through tpalloc() or fballoc().
fldName
Name of a field to be stored in a field buffer (pFBUF).
nth
Sequence number of a field to be stored.
value
String data to be stored.
-
Return value
Return value Description 1
Function call succeeded.
-1
Function call failed.
-
Example
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
-
Related functions
PUTINT(), PUTLONG(), PUTSHORT(), PUTDOUBLE(), PUTFLOAT(), PUTCAR3(), PUTCHR()
3. Example Program
The following describes an example program that queries, modifies, deletes, and adds names, positions, managers in charge, joining dates, salaries, contracted periods, and departments with a key of an account ID. Filed key buffers are used in the program.
3.1. Program Organization
Each program consists of the following files. Add atmi.vb, fdl.vb, TmaxMacros.vb, and WinAPI.vb as modules for this project.
-
Common program
File Description demo.f
Defines field key buffers.
tmconfig.m
Tmax configuration file.
-
Client program
File Description AssemblyInfo.vb
File that sets the default values used during assembly.
CodeFile1.vb
Automatically created file in a Visual Basic .NET interface.
EmployeeGrid.resx
Automatically created file in a Visual Basic .NET interface.
EmployeeGrid.vb
Program that shows a search result.
EmployeeMgr.resx
Automatically created file in a Visual Basic .NET interface.
EmployeeMgr.sln
Automatically created file in a Visual Basic .NET interface.
EmployeeMgr.suo
Automatically created file in a Visual Basic .NET interface.
EmployeeMgr.vb
Main program that processes search, modification, deletion, and addition.
EmployeeMgr.vbproj
Automatically created file in a Visual Basic .NET interface.
EmployeeMgr.vbproj.user
Automatically created file in a Visual Basic .NET interface.
TmaxMacros.vb
Class that defines macros for user convenience.
WinAPI.vb
Module that defines prototypes of functions provided by Windows.
atmi.vb
Module that defines ATMI functions' prototypes.
fdl.vb
Modlule that defines field key functions' prototypes.
-
Server program
File Description emp_c.mk
Makefile.
emp_c.pc
Server program that provides services. AIX and Oracle 9i are used.
3.2. Program Description
The following describes each program.
-
Client program
Item Description Tmax connection
Connection is established with tpstart_t.
Buffer
'fdl' files need to be created by compiling FIELD KEY buffers and field structure files with the fdlc utility.
Communication
Synchronous communication is made by using tpcall(). A send buffer and a receive buffer are specified separately.
Transaction
TMS assigns auto transactions.
-
Server program
Item Description Service
FDLSELECT and FDLINSERT are written.
Database
Oracle database is used. Database information is specified in SVRGROUP of a system
3.3. Common Program
DataBase EMP Table
The following is an example table to be created in a database.
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
Field Key Buffer Definition
The following is an example file that defines a field key buffer.
<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 Configuration
The following is an example Tmax configuration file.
<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. Client Program
Main Screen
The following is a Form design for the main screen.
The following describes each component in the Form design.
Control Name | Control Type | Remarks |
---|---|---|
EmployeeMgrForm |
Form |
Caption="Employee Management Program" |
LabelErr |
Label |
Caption="Error" |
BtnExit |
Command button |
Caption="Exit" |
BtnIns |
Command button |
Caption="Add" |
BtnDel |
Command button |
Caption="Delete" |
BtnUdt |
Command button |
Caption="Modify" |
BtnSel |
Command button |
Caption="Search" |
EditName |
Text box |
|
EditEmpNo |
Text box |
|
EditDept |
Text box |
|
EditComm |
Text box |
|
EditSal |
Text box |
|
EditDate |
Text box |
|
EditMgr |
Text box |
|
EditJob |
Text box |
|
MList |
Text box |
|
BtnReturn |
Text box |
The following is an example main design program for employee management.
Option Explicit ' Closing a search window ' Private Sub BtnReturn_Click() Hide EmployeeMgr.Show End Sub ' Function that shows a search result when the search button is clicked ' Private Sub Form_Activate() ' tpstart execution function ' 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 if a transation started and 0 if not ' ' tpstart ' tmaxStart ' Initializing the value of whether a transaction starts ' txbool = 0 initS = vbCrLf & vbTab & vbTab & vbTab & "***** Search Result *****" & vbCrLf & vbTab & "=================================================" & vbCrLf & vbTab & "EmpNo Name Position Mgr JoinDate Salary COMM Dept" & vbCrLf & vbTab & "=================================================" & vbCrLf & vbCrLf If EmployeeMgr.EditEmpNo.text = "" Then MsgBox "Enter an employee number." Hide EmployeeMgr.Show Exit Sub End If ' Allocating a buffer to send data ' Isendbuf = fballoc(100, 1024) If Isendbuf = Null Then TmaxError ("fballoc") Call fbfree(Isendbuf) tmaxEnd Exit Sub End If ' Allocating a buffer to receive data ' Irecvbuf = fballoc(100, 1024) If Irecvbuf = Null Then TmaxError ("fballoc") Call fbfree(Irecvbuf) tmaxEnd Exit Sub End If ' Getting an employee number from Employee management 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 ' Requesting a search servcie ' 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 ' Getting float data from a SAL data field. ' ' The function is defined in 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 ' Displaying returned data in the text box ' 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 ' Freeing allocated buffers ' Call fbfree(ByVal Isendbuf&) Call fbfree(ByVal Irecvbuf&) ' tpend execution function ' tmaxEnd Exit Sub End Sub ' tpstart ' Private Sub tmaxStart() Dim ret As Integer ' Loading a configuration file. ' ' Defined in the atmi.bas file. ' ' Declare Function tmaxreadenv Lib "TMAX4GL.DLL"(ByVal envfile As String, ByVal label As String) As Long' ' For more information, refer to "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 ' Function that displays Oracle errors ' 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
The following is an example program that manages employees.
<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 " Code created in Windows Form Designer " #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 if a transation started and 0 if not ' ' tpstart ' tmaxStart() ' Initializing the value of whether a transaction starts ' txbool = 0 If EditEmpNo.Text = "" Then MsgBox("Enter an employee number.") tmaxEnd() Exit Sub End If ' Allocating a buffer to send data ' Isendbuf = fballoc(100, 1024) If Isendbuf = 0 Then Call fbfree(Isendbuf) tmaxEnd() Exit Sub End If ' Allocating a buffer to receive data ' 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 ' Starting a transaction ' Iret = tx_begin() If Iret = -1 Then txbool = 1 Call ExitSub(txbool, Isendbuf, Irecvbuf) Else txbool = 1 End If ' Requesting a modification service ' 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 ' Freeing allocated buffers ' Saving the transaction ' 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 if a transation started and 0 if not ' ' tpstart ' tmaxStart() ' Initializing the value of whether a transaction starts ' txbool = 0 If EditEmpNo.Text = "" Then MsgBox("Enter an employee number.") tmaxEnd() Exit Sub End If value = Trim(EditEmpNo.Text) ' Allocating a buffer to send data ' Isendbuf = fballoc(100, 1024) If Isendbuf = 0 Then Call fbfree(Isendbuf) tmaxEnd() Exit Sub End If ' Allocating a buffer to receive data ' 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 ' Starting a transaction ' Iret = tx_begin() If Iret = -1 Then txbool = 1 Call ExitSub(txbool, Isendbuf, Irecvbuf) Else txbool = 1 End If ' Requesting a search servcie ' Iret = tpcall("FDLDELETE", Isendbuf, 0, Irecvbuf, Irbuflen, 0) If Iret = -1 Then ViewErr(Irecvbuf) Call ExitSub(txbool, Isendbuf, Irecvbuf) End If ' Saving the transaction ' 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 if a transation started and 0 if not ' ' tpstart ' tmaxStart() ' Initializing the value of whether a transaction starts ' txbool = 0 If EditEmpNo.Text = "" Then MsgBox("Enter an employee number.") tmaxEnd() Exit Sub End If ' Allocating a buffer to send data ' Isendbuf = fballoc(100, 1024) If Isendbuf = 0 Then Call fbfree(Isendbuf) tmaxEnd() Exit Sub End If ' Allocating a buffer to receive data ' 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 ' Starting a transaction ' Iret = tx_begin() If Iret = -1 Then txbool = 1 Call ExitSub(txbool, Isendbuf, Irecvbuf) Else txbool = 1 End If ' Requesting a modification service ' Iret = tpcall("FDLINSERT", Isendbuf, 0, Irecvbuf, Irbuflen, 0) If Iret = -1 Then ViewErr(Irecvbuf) Call ExitSub(txbool, Isendbuf, Irecvbuf) End If ' Saving the transaction ' 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 ' Freeing allocated buffers ' Call fbfree(Isendbuf) Call fbfree(Irecvbuf) ' tpend ' tmaxEnd() Exit Sub End Sub Private Sub tmaxStart() Dim ret As Integer Dim envFile As String ' Loading a configuration file. ' ' Defined in the atmi.bas file. ' ' Declare Function tmaxreadenv Lib "TMAX4GL.DLL" (ByVal envfile As String, ByVal label As String) As Long ' ' For more information, refer to "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 Error Message Box
The following is a message box that shows an Oracle error.
The following is an example configuration that is necessary to display Oracle errors.
' Function that displays Oracle errors 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
Search Screen
The following is a Form design for the search screen.
The following describes each component in the From design.
Control Name | Control Type | Property that must Be Modified |
---|---|---|
EmployeeGrid |
Form |
Caption="Employee Information List" |
ListTextBox |
Text box |
MultiLine=True |
BtnReturn |
Command button |
Caption="Back" |
The following is an example search screen design program for employee management.
<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 " Code created in Windows Form Designer " #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 if a transation started and 0 if not ' ' tpstart ' tmaxStart() ' Initializing the value of whether a transaction starts ' txbool = 0 ' Allocating a buffer to send data ' Isendbuf = fballoc(100, 1024) If Isendbuf = 0 Then Call fbfree(Isendbuf) tmaxEnd() Exit Sub End If ' Allocating a buffer to receive data ' 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 ' Requesting a search servcie ' Iret = tpcall("FDLSELECT", Isendbuf, 0, Irecvbuf, Irbuflen, 0) If Iret = -1 Then ViewErr(Irecvbuf) initS = vbCrLf & vbTab & vbTab & vbTab & "***** Search Result *****" & vbCrLf & vbTab & "==========================================" & vbCrLf & vbTab & "EmpNo Name Position Mgr JoinDate Salary COMM Dept" & 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 ' Displaying a returned data in a text box ' 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 & "***** Search Result *****" & vbCrLf & vbTab & "==========================================" & vbCrLf & vbTab & "EmpNo Name Position Mgr JoinDate Salary COMM Dept" & vbCrLf & vbTab & "==========================================" & vbCrLf & vbCrLf ListTextBox.Text = initS & outputS LabelErr.Text = "SAL = " & dvalue ' Freeing allocated buffers ' Call fbfree(Isendbuf) Call fbfree(Irecvbuf) ' tpend execution function ' 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 ' Freeing allocated buffers ' Call fbfree(Isendbuf) Call fbfree(Irecvbuf) ' tpend ' tmaxEnd() End End Sub Public Sub tmaxStart() Dim ret As Integer Dim envFile As String ' Loading a configuration file. ' ' Defined in the atmi.bas file. ' ' Declare Function tmaxreadenv Lib "TMAX4GL.DLL" (ByVal envfile As String, ByVal label As String) As Long ' ' For more information, refer to "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 " Code created in Windows Form Designer " Public Sub New() MyBase.New() 'This call is necessary in Windows Form Designer. InitializeComponent() 'Add an initialization process after calling InitializeComponent(). End Sub 'Form cleans up components by redefining 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 'The following is necessary for Windows Form Designer. Private components As System.ComponentModel.IContainer 'Note: The following procedure is necessary for Windows Form Designer. 'Modify the procedure by using Windows Form Designer. 'Do not modify the procedure by using a code editor. 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) & "Hello" ' '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 = "Back" ' '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 = "Employee Information List" 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 if a transation started and 0 if not ' ' tpstart ' tmaxStart() ' Initializing the value of whether a transaction starts ' txbool = 0 ' Allocating a buffer to send data ' Isendbuf = fballoc(100, 1024) If Isendbuf = 0 Then Call fbfree(Isendbuf) tmaxEnd() Exit Sub End If ' Allocating a buffer to receive data ' 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 ' Requesting a search servcie ' Iret = tpcall("FDLSELECT", Isendbuf, 0, Irecvbuf, Irbuflen, 0) If Iret = -1 Then ViewErr(Irecvbuf) initS = vbCrLf & vbTab & vbTab & vbTab & "***** Search Result *****" & vbCrLf & vbTab & "==========================================" & vbCrLf & vbTab & "EmpNo Name Position Mgr JoinDate Salary COMM Dept" & 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 ' Displaying returned data in the text box ' 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 & "***** Search Result *****" & vbCrLf & vbTab & "==========================================" & vbCrLf & vbTab & "EmpNo Name Position Mgr JoinDate Salary COMM Dept" & vbCrLf & vbTab & "==========================================" & vbCrLf & vbCrLf ListTextBox.Text = initS & outputS LabelErr.Text = "SAL = " & dvalue ' Freeing allocated buffers ' Call fbfree(Isendbuf) Call fbfree(Irecvbuf) ' tpend execution function ' 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 ' Freeing allocated buffers ' Call fbfree(Isendbuf) Call fbfree(Irecvbuf) ' tpend ' tmaxEnd() End End Sub Public Sub tmaxStart() Dim ret As Integer Dim envFile As String ' Loading a configuration file. ' ' Defined in the atmi.bas file.' ' Declare Function tmaxreadenv Lib "TMAX4GL.DLL" (ByVal envfile As String, ByVal label As String) As Long ' ' For more information, refer to "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. Server Program
Service Program
The following is an example service program.
<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) ; } /********************************************************************* * Error Handling: If a service error occurs, the error will be entered in a buffer and then sent to a client. ********************************************************************/ 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,"The user has no privilege."); break; default: strcpy(err_msg, "An input error message has not been registered."); } 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) { /* An error message is set. ******/ switch(err_code) { case -500: /* SYSTEM error */ strcpy(err_msg, "Failed to create a file."); break; case -502: strcpy(err_msg,"Could not call an internal service."); break; case -504: strcpy(err_msg, "This is a socket communication error."); break; case -505: /* When a change was made in another transaction */ /* "[%s] was changed in another transaction after it was queried. \n\nHandle it after querying it again.": Handling in CLIENT */ strcpy(err_msg, "does not exist."); break; case -5002: strcpy(err_msg, "Contact with a technical team."); break; default: strcpy(err_msg, "An application error message has not been registered."); } } 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
The following is an example Makefile that builds emp_c.pc into a Tmax application
<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