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