Solved

VB.Net Global Arrays Problem

Posted on 2011-03-24
10
733 Views
Last Modified: 2012-08-13
Hello everyone. I am a rusty old VB6 programmer (now working in VS2010 VB) and I am trying to read in a flat file. Parse it, sort it  and then spit it back out into multple pieces after the sort.

I have decided that since the files are quite small it would be easiest to read the contents into arrays. After which I I can sort the items and write my individual files back out to disk.

I have attached the code below.  At this point my hangup is with creating globally shared arrays and then populating them. Visual studio says I need to create a new instance.  

Please help me out.

Imports System
Imports System.IO
Public Class MyCommonStuff
    Public Shared partnum() As String
    Public Shared parts() As String
    Public Shared lineitems As New Integer
End Class


Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal E As System.EventArgs) Handles Button1.Click
        Dim lin As String
        ' Create an instance of StreamReader to read from a file.
        Dim sr As StreamReader = New StreamReader("C:\EDI\JDEDIIN")
        ' Read and display the lines from the file until the end
        ' of the file is reached.
        lin = sr.ReadLine()
        txt_Row1.Text = lin
        sr.Close()


    End Sub

    Private Sub btn_Parse_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Parse.Click
        Dim EDI As String
        Dim ident As String
        Dim EDIDate As String
        Dim Rtran As String
        Dim ltextlength As Long
        Dim Y As Integer
        Dim Z As Integer

        If txt_Row1.Text = Nothing Then GoTo lv

        EDI = txt_Row1.Text
        ltextlength = Len(EDI)
        MyCommonStuff.lineitems = (ltextlength - 80) / 80
        lbl_length.Text = "Parts in order: " + Str$(MyCommonStuff.lineitems)


        'Parse the front
        ident = Mid$(EDI, 13, 12)
        txt_CustIdent.Text = ident
        EDIDate = Mid$(EDI, 25, 8)
        txt_Date.Text = EDIDate
        Rtran = Mid$(EDI, 1, 80)
        txt_Retran.Text = Rtran


        'Parse the rest
        Do Until Y = MyCommonStuff.lineitems
            Y = Y + 1
            Z = Z + 80
            MyCommonStuff.partnum(Y) = Mid$(EDI, Z + 1, 12)    **** Problem kicks in on this line*****
            MyCommonStuff.parts(Y) = Mid$(EDI, Z + 1, 80)


        Loop
        lbl_LastPart.Text = "Last Part Number Read: " + MyCommonStuff.partnum(Y)

        lbl_Complete.Text = "Parse Complete"

lv:
    End Sub

    Private Sub btn_Upload1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Upload1.Click
        Dim linout As String
        Dim Y As Integer
        Dim Z As Integer

        Using sw As StreamWriter = New StreamWriter("C:\EDI\JDEDIIN2")

            'Prepare String & set variable
            Y = 0
            linout = txt_Retran.Text

            'Find part numbers to write

            Do Until Y = MyCommonStuff.lineitems
                Y = Y + 1
                linout = linout + MyCommonStuff.parts(Y)
            Loop
            sw.WriteLine(linout)

        End Using

    End Sub
End Class
0
Comment
Question by:bsofttech
10 Comments
 
LVL 29

Expert Comment

by:Paul Jackson
ID: 35210688
Change your mycommonstuff class to be shared that should fix it.

Public Shared Class MyCommonStuff
    Public Shared partnum() As String
    Public Shared parts() As String
    Public Shared lineitems As New Integer
End Class

0
 

Author Comment

by:bsofttech
ID: 35210715
I tried this change and Visual Studio comes back and says classes can not be shared and shows it as an error.

0
 
LVL 17

Accepted Solution

by:
Zhaolai earned 500 total points
ID: 35210738
I would recommend using List(Of String), instead of array, like this:

Public Class MyCommonStuff
    Public Shared partnum As New List(Of String)
    Public Shared parts As New List(Of String)
    Public Shared lineitems As Integer
End Class
....
            MyCommonStuff.partnum.Add(Mid$(EDI, Z + 1, 12))
            MyCommonStuff.parts.Add(Mid$(EDI, Z + 1, 80))
....
            For Each strPart in MyCommonStuff.parts
                linout = linout + strPart
            Loop
            sw.WriteLine(linout)
0
 
LVL 17

Expert Comment

by:nepaluz
ID: 35210777
to create a new instance of a class, you have to use the word NEW
e.g

Dim xString as New MyCommonStuff

xString.partnum = file.readalltext("MyFilePath")

Open in new window


you can not assign the partnum without instantiating the class first
0
 
LVL 17

Expert Comment

by:Zhaolai
ID: 35210803
@nepaluz, there is no need to instantiate the class, because partnum is shared.
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 17

Expert Comment

by:Zhaolai
ID: 35210872
oh, in my first post (ID: 35210738), change Loop to Next. :-)
0
 

Author Comment

by:bsofttech
ID: 35210899
Zhaolai.

Your solution works.  Please tell me one more thing though.

How do I display the last item or a specific item from the array?  Here is my current command in that layout. It throws an error.

  lbl_LastPart.Text = "Last Part Number Read: " + MyCommonStuff.partnum(Y)

I am trying to show the last item read on the screen. It would be handy to know how to show any item though.

Thanks Much.
0
 
LVL 17

Expert Comment

by:Zhaolai
ID: 35210927
lbl_LastPart.Text = "Last Part Number Read: " + MyCommonStuff.partnum(MyCommonStuff.partnum.Count -1)
0
 

Author Closing Comment

by:bsofttech
ID: 35210946
Wish this person was on my staff!
0
 
LVL 85

Expert Comment

by:Mike Tomlinson
ID: 35210989
You might find this snippet useful:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim FileName As String = "C:\Users\Mike\Documents\SomeFile.txt"
        Dim lines As New List(Of String)
        lines.AddRange(System.IO.File.ReadAllLines(FileName))

        Debug.Print("First Line: " & lines(0))
        Debug.Print("Last Line: " & lines(lines.Count - 1))
        Debug.Print("")

        For i As Integer = 0 To lines.Count - 1
            Debug.Print(i & ": " & lines(i))
        Next
    End Sub

Open in new window

0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Displaying an arrayList in a listView using the default adapter is rarely the best solution. To get full control of your display data, and to be able to refresh it after editing, requires the use of a custom adapter.
If you need to start windows update installation remotely or as a scheduled task you will find this very helpful.
In this fourth video of the Xpdf series, we discuss and demonstrate the PDFinfo utility, which retrieves the contents of a PDF's Info Dictionary, as well as some other information, including the page count. We show how to isolate the page count in a…
With the power of JIRA, there's an unlimited number of ways you can customize it, use it and benefit from it. With that in mind, there's bound to be things that I wasn't able to cover in this course. With this summary we'll look at some places to go…

863 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

26 Experts available now in Live!

Get 1:1 Help Now