Imports cwbx
'---------------------------------------------------------------------
' This module shows how to send a request to a data queue and
' how to receive and process a data queue entry.
'
' You can send a request for an individual record or for a
' group of records.
'---------------------------------------------------------------------
Module Module1
'-------------------------------------------------------------
' (A)
' define constants used in the program
' CHANGE THESE FOR YOUR ENVIRONMENT
'-------------------------------------------------------------
Const AS400_NAME As String = "S103D64G"
Const SEND_DTAQ_NAME As String = "DQTESTRCV"
Const SEND_DTAQ_LIBRARY As String = "ASPNET"
Const RCV_DTAQ_NAME As String = "CRAIG"
Const RCV_DTAQ_LIBRARY As String = "ASPNET"
'-------------------------------------------------------------
' (B)
' constants and enumerations
'-------------------------------------------------------------
Const DQ_WAIT_FOREVER As Integer = -1
Const REQUEST_END As String = "*END"
Const REQUEST_GETCUST As String = "*GETCUST"
Const REQUEST_GETLIST As String = "*GETLIST"
Const RECEIVE_TYPE_CUSTOMER As String = "*CUSTOMER"
Const RECEIVE_TYPE_CUSTLIST As String = "*CUSTLIST"
Const RECEIVE_TYPE_CUSTEND As String = "*CUSTEND"
Const FIELD_RECTYPE As String = "RecType"
Const FIELD_CLIENT As String = "Client"
Const FIELD_CUSNUM As String = "CUSNUM"
Const FIELD_LSTNAM As String = "LSTNAM"
Const FIELD_INIT As String = "INIT"
Const FIELD_STREET As String = "STREET"
Const FIELD_CITY As String = "CITY"
Const FIELD_STATE As String = "STATE"
Const FIELD_ZIPCOD As String = "ZIPCOD"
Const FIELD_CDTLMT As String = "CDTLMT"
Const FIELD_CHGCOD As String = "CHGCOD"
Const FIELD_BALDUE As String = "BALDUE"
Const FIELD_CDTDUE As String = "CDTDUE"
Enum DataType As Integer
[String]
Zoned
End Enum
Enum SubfieldLength As Integer
Rectype = 10
Client = 10
Cusnum = 6
Lstnam = 8
Init = 3
Street = 13
City = 6
State = 2
Zipcod = 5
Cdtlmt = 4
Chgcod = 1
Baldue = 6
Cdtdue = 6
End Enum
Enum SubfieldDecimals As Integer
Cusnum = 0
Zipcod = 0
Cdtlmt = 0
Chgcod = 0
Baldue = 2
Cdtdue = 2
End Enum
Enum DisplayType As Integer
Field
Row
End Enum
'-------------------------------------------------------------
' (C)
' define converters used in the program
'-------------------------------------------------------------
Dim StrCvt As StringConverter = New StringConverter()
Dim ZonCvt As ZonedConverter = New ZonedConverter()
Sub Main()
'-------------------------------------------------------------
' (D)
' define AS400 System object
'-------------------------------------------------------------
Dim AS400 As New AS400System()
AS400.Define(AS400_NAME)
AS400.Signon()
'-------------------------------------------------------------
' (E)
' define structure object for communication with server program
'-------------------------------------------------------------
Dim DSData As New cwbx.Structure
DSData.Fields.Append(FIELD_RECTYPE, SubfieldLength.Rectype)
DSData.Fields.Append(FIELD_CLIENT, SubfieldLength.Client)
DSData.Fields.Append(FIELD_CUSNUM, SubfieldLength.Cusnum)
DSData.Fields.Append(FIELD_LSTNAM, SubfieldLength.Lstnam)
DSData.Fields.Append(FIELD_INIT, SubfieldLength.Init)
DSData.Fields.Append(FIELD_STREET, SubfieldLength.Street)
DSData.Fields.Append(FIELD_CITY, SubfieldLength.City)
DSData.Fields.Append(FIELD_STATE, SubfieldLength.State)
DSData.Fields.Append(FIELD_ZIPCOD, SubfieldLength.Zipcod)
DSData.Fields.Append(FIELD_CDTLMT, SubfieldLength.Cdtlmt)
DSData.Fields.Append(FIELD_CHGCOD, SubfieldLength.Chgcod)
DSData.Fields.Append(FIELD_BALDUE, SubfieldLength.Baldue)
DSData.Fields.Append(FIELD_CDTDUE, SubfieldLength.Cdtdue)
'-------------------------------------------------------------
' (F)
' prompt for the request type
'-------------------------------------------------------------
Dim Request As String = Prompt()
Dim Customer As String
If (Request = REQUEST_END) Then
End
End If
If (Request = REQUEST_GETCUST) Then
Customer = PromptCustomer()
StrCvt.Length = SubfieldLength.Cusnum
DSData.Fields(FIELD_CUSNUM).Value = StrCvt.ToBytes(Customer)
End If
'-------------------------------------------------------------
' (G)
' define DQWrite data queue, send request to server program
'-------------------------------------------------------------
Dim DQWrite As New DataQueue()
DQWrite.system = AS400
DQWrite.QueueName = SEND_DTAQ_NAME
DQWrite.LibraryName = SEND_DTAQ_LIBRARY
StrCvt.Length = SubfieldLength.Rectype
DSData.Fields(FIELD_RECTYPE).Value = StrCvt.ToBytes(Request)
StrCvt.Length = SubfieldLength.Client
DSData.Fields(FIELD_CLIENT).Value = StrCvt.ToBytes(RCV_DTAQ_NAME)
DQWrite.Write(DSData.Bytes)
'-------------------------------------------------------------
' (H)
' define DQRead data queue, retrieve first entry
'-------------------------------------------------------------
Dim DQRead As New DataQueue()
DQRead.system = AS400
DQRead.QueueName = RCV_DTAQ_NAME
DQRead.LibraryName = RCV_DTAQ_LIBRARY
DSData.Bytes = DQRead.Read(DQ_WAIT_FOREVER)
While True
Dim RecType As String = ParseStructureField(DSData, _
FIELD_RECTYPE, _
DataType.String, _
SubfieldLength.Rectype).Trim()
Select Case RecType
Case RECEIVE_TYPE_CUSTOMER
ProcessCustomer(DSData, DisplayType.Field)
End
Case RECEIVE_TYPE_CUSTLIST
ProcessCustomer(DSData, DisplayType.Row)
DSData.Bytes = DQRead.Read()
Case RECEIVE_TYPE_CUSTEND
WriteEnd()
End
Case Else
End
End Select
End While
End Sub
'''
''' Convenience method to parse a structure field from the data structure.
'''
'''
''' The data structure to parse.
'''
'''
''' The name of the field in the structure.
'''
'''
''' The type of data field.
'''
''' S - String
''' Z - Zoned
'''
'''
''' The length of the field
'''
'''
''' The value parsed from the structure for the field.
'''
Function ParseStructureField(ByVal DSData As cwbx.Structure, _
ByVal FieldName As String, _
ByVal FieldType As String, _
ByVal FieldLength As Integer) _
As String
Return ParseStructureField(DSData, _
FieldName, _
FieldType, _
FieldLength, _
0)
End Function
'''
''' Convenience method to parse a structure field from the data structure.
'''
'''
''' The data structure to parse.
'''
'''
''' The name of the field in the structure.
'''
'''
''' The type of data field.
'''
''' S - String
''' Z - Zoned
'''
'''
''' The length of the field
'''
'''
''' The number of decimal positions for a Zoned field.
'''
'''
''' The value parsed from the structure for the field.
'''
Function ParseStructureField(ByVal DSData As cwbx.Structure, _
ByVal FieldName As String, _
ByVal FieldType As String, _
ByVal FieldLength As Integer, _
ByVal FieldDecimals As Integer) _
As String
Dim ReturnString As String
Select Case FieldType.ToUpper()
Case DataType.String
StrCvt.Length = FieldLength
ReturnString = StrCvt.FromBytes(DSData(FieldName).Value)
Case DataType.Zoned
ZonCvt.Digits = FieldLength
ZonCvt.DecimalPosition = FieldDecimals
ReturnString = ZonCvt.FromBytes(DSData(FieldName).Value)
Case Else
ReturnString = String.Empty
End Select
Return ReturnString
End Function
'''
''' Process data for the requested customer
'''
'''
''' The structure of customer data.
'''
'''
''' How to display the data.
'''
''' F - display individual fields.
'''
''' R - display rows of data.
'''
Sub ProcessCustomer(ByVal DSData As cwbx.Structure, ByVal DisplayAs As String)
Dim RecType As String = ParseStructureField(DSData, _
FIELD_RECTYPE, _
DataType.String, _
SubfieldLength.Rectype)
Dim CUSNUM As Integer = Integer.Parse(ParseStructureField(DSData, _
FIELD_CUSNUM, _
DataType.Zoned, _
SubfieldLength.Cusnum, _
SubfieldDecimals.Cusnum))
Dim LSTNAM As String = ParseStructureField(DSData, _
FIELD_LSTNAM, _
DataType.String, _
SubfieldLength.Lstnam)
Dim INIT As String = ParseStructureField(DSData, _
FIELD_INIT, _
DataType.String, _
SubfieldLength.Init)
Dim STREET As String = ParseStructureField(DSData, _
FIELD_STREET, _
DataType.String, _
SubfieldLength.Street)
Dim CITY As String = ParseStructureField(DSData, _
FIELD_CITY, _
DataType.String, _
SubfieldLength.City)
Dim STATE As String = ParseStructureField(DSData, _
FIELD_STATE, _
DataType.String, _
SubfieldLength.State)
Dim ZIPCOD As Integer = Integer.Parse(ParseStructureField(DSData, _
FIELD_ZIPCOD, _
DataType.Zoned, _
SubfieldLength.Zipcod, _
SubfieldDecimals.Zipcod))
Dim CDTLMT As Integer = Integer.Parse(ParseStructureField(DSData, _
FIELD_CDTLMT, _
DataType.Zoned, _
SubfieldLength.Cdtlmt, _
SubfieldDecimals.Cdtlmt))
Dim CHGCOD As Integer = Integer.Parse(ParseStructureField(DSData, _
FIELD_CHGCOD, _
DataType.Zoned, _
SubfieldLength.Chgcod, _
SubfieldDecimals.Chgcod))
'/////////////////////////////////////////////////////////////
' Bug in Zoned Converter, does not pick up on BALDUE value
' in the first convert (returns as empty string).
' Second use of Zoned Converter for the same structure field
' returns the correct value.
'
' Note: bug occurs when .DecimalPosition is a non-zero
' value, previous uses of Zoned Converter with .DecimalPosition
' of 0 return correct values.
'/////////////////////////////////////////////////////////////
Dim BALDUEs As String = ParseStructureField(DSData, _
FIELD_BALDUE, _
DataType.Zoned, _
SubfieldLength.Baldue, _
SubfieldDecimals.Baldue)
Dim BALDUE As Decimal = Decimal.Parse(ParseStructureField(DSData, _
FIELD_BALDUE, _
DataType.Zoned, _
SubfieldLength.Baldue, _
SubfieldDecimals.Baldue))
Dim CDTDUE As Decimal = Decimal.Parse(ParseStructureField(DSData, _
FIELD_CDTDUE, _
DataType.Zoned, _
SubfieldLength.Cdtdue, _
SubfieldDecimals.Cdtdue))
Select Case DisplayAs
Case DisplayType.Field
Console.Clear()
Console.WriteLine("RecType: {0}", RecType)
Console.WriteLine("CUSNUM: {0}", CUSNUM)
Console.WriteLine("LSTNAM: {0}", LSTNAM)
Console.WriteLine("INIT: {0}", INIT)
Console.WriteLine("STREET: {0}", STREET)
Console.WriteLine("CITY: {0}", CITY)
Console.WriteLine("STATE: {0}", STATE)
Console.WriteLine("ZIPCOD: {0}", ZIPCOD)
Console.WriteLine("CDTLMT: {0}", CDTLMT)
Console.WriteLine("CHGCOD: {0}", CHGCOD)
Console.WriteLine("BALDUE: {0}", BALDUE)
Console.WriteLine("CDTDUE: {0}", CDTDUE)
WriteEnd()
Case DisplayType.Row
Console.WriteLine("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11}", _
RecType, _
CUSNUM, _
LSTNAM, _
INIT, _
STREET, _
CITY, _
STATE, _
ZIPCOD, _
CDTLMT, _
CHGCOD, _
BALDUE, _
CDTDUE)
End Select
End Sub
'''
''' Prompt for the type of request to process.
'''
'''
''' The type of request to process.
'''
''' *GETCUST - get an individual customer
'''
''' *GETLIST - get a list of customers
'''
''' *END - end the client and server program
'''
Function Prompt() As String
Console.Clear()
While True
Console.WriteLine("Enter your request { *GETCUST | *GETLIST | *END }")
Console.Write("Request > ")
Dim Request As String = Console.ReadLine().ToUpper()
If ((Request = REQUEST_GETCUST) Or _
(Request = REQUEST_GETLIST) Or _
(Request = REQUEST_END)) Then
Return Request
End If
End While
End Function
'''
''' Prompt for the customer number to retrieve.
'''
''' The customer number.
Function PromptCustomer() As String
Console.WriteLine("Enter customer number (6 digits)")
Console.Write("CUSTNO > ")
Dim CUSTNO As String = Console.ReadLine()
Return CUSTNO
End Function
'''
''' Write the "end" instructions.
'''
Sub WriteEnd()
Console.WriteLine("*** Press ENTER to end ***")
Console.ReadLine()
End Sub
End Module