• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 571
  • Last Modified:

I am computer programing illiterate I am requesting assistance writing code for a very simple program in VB2008

Here is what I need to accomplish.

I have a Charge Account Validation:

I need to create an application that allows the user to enter a charge account number.  (I need to design an appropriate user-interface).    

I am using 1 label, 1 text box, 1 button for this interface.

The application needs to determine whether the number is valid by comparing it to the numbers in the following lists:

5658845        4502125       7985843     3948383     2939848   4857874
3938482        4984588       9485757     7363873     1028339   4887483
2923731        3857567       6069798     9876555     2927376   8377361

The list of numbers should be stored in an array.    

A sequential search (i.e.,  for loop) should be used to locate the number entered by the user.   If the user enters a number that is in the array, the program should display an message indicating that the number is valid.   If the user enters a number that is not in the array, the program should display a message indicating that number is invalid.    

I also need a basic Try-Catch statement to catch any possible exceptions occurred during execution by displaying a message indicating that exception has an occurred.


I went into my VB book, copied some try catch statements and so far my try catch statements are not catching anything.  I am not able to reference the numbers.  I cant figure out how to loop the account numbers then recall them.  Basically I have no idea what I am doing.

Please help!

Here is what I have for code so far.  I am sure that I am way off base.

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckAccount.Click

        Dim numbers(,) As Integer = {{1, 2, 3, 4, 5, 6}, {7, 8, 9, 10, 11, 12}, {13, 14, 15, 16, 17, 18}}
        Dim txtAccountNumber() As Integer = {5658845, 4502125, 7985843, 3948383, 2939848, 4857874, 3938482, _
                                             4984588, 9485757, 7363873, 1028339, 4887483, 2923731, 3857567, _
                                             6069798, 9876555, 2927376, 8377361}

        numbers(0, 0) = 5658845
        numbers(0, 1) = 4502125
        numbers(0, 2) = 7985843
        numbers(0, 3) = 3948383
        numbers(0, 4) = 2939848
        numbers(0, 5) = 4857874
        numbers(1, 0) = 3938482
        numbers(1, 1) = 4984588
        numbers(1, 2) = 9485757
        numbers(1, 3) = 7363873
        numbers(1, 4) = 1028339
        numbers(1, 5) = 4887483
        numbers(2, 0) = 2923731
        numbers(2, 1) = 3857567
        numbers(2, 2) = 6069798
        numbers(2, 3) = 9876555
        numbers(2, 4) = 2927376
        numbers(2, 5) = 8377361


        Try

        Catch ex As FormatException
            MessageBox.Show("A format exception has occurd.  Please check entry.", "Entry Error")
        Catch ex As OverflowException
            MessageBox.Show("An overflow exception has occured.  Plese enter smaller value.", "Entry Error")
        Catch ex As Exception
            MessageBox.Show(ex.Message, ex.GetType.ToString)
        End Try

     
    End Sub
   
End Class
0
nosurf2day
Asked:
nosurf2day
  • 18
  • 11
  • 3
  • +1
1 Solution
 
Daniel WilsonCommented:
Sounds like homework ... but I'll give a couple hints.

I see no reason to have a 2-dimensional array.

You said you need a FOR loop ... so go ahead and add one after you set up your array of numbers.  If you run into trouble, post back & I'll see about another hint.
0
 
gisTimmyCommented:
I'm not sure why you declared a 2-dimensional array to store a 1-dimensional list of numbers. Also, you're initializing your 2-dimensional array as a 3-dimensional array.

When I have a list of values that is static, and I need to check to see if something is in it, I use a List so I can just call the Contains method. It's even better if the number of values varies.

Try this:
   
    ' Declare this variable in your class/module.
    Dim testNumberList As New List(Of Integer)

    ' Call this procedure on startup to load the List.
    Private Sub InitializeList()
        With testNumberList
            .Add(5658845)
            .Add(4502125)
            .Add(7985843)
            .Add(3948383)
            .Add(2939848)
            .Add(4857874)
            .Add(3938482)
            .Add(4984588)
            .Add(9485757)
            .Add(7363873)
            .Add(1028339)
            .Add(4887483)
            .Add(2923731)
            .Add(3857567)
            .Add(6069798)
            .Add(9876555)
            .Add(2927376)
            .Add(8377361)
        End With
    End Sub

    ' Use this code to see if a number is in the list.
    Private Function IsThisNumberInTheList(ByVal theNumberIWannaCheck As Integer
        Return testNumberList.Contains(theNumberIWannaCheck)
    End Function

 
0
 
nosurf2dayAuthor Commented:
Daniel your sort of correct it is a practice assignment to prepare us for our upcoming exam.  I have tried for hours to do this.  I used a multiple array because in the book it showed how to recall spots using one.  It barely talkes about using a list to recall from.  I made adjustment based on what timmy posted.  That helped me focus more where I needed to look in the book.

Timmy not all of your code worked.  I looked and made adjustments.  and this is what I have so far. The book tels me in the last statement to put

sum += number, but when I do it says that "Operator '+' is not defined for types 'integer' and 'system.collection.arraylist'.

I dont know what that means.  I am putting in exactly what the book says based on the example.

I am still faced with the problem, using the right catch statements.

Was I on target using the ones in the code above?

When I remove the last statement it gives me an invalidcastexception was unhandled

Unable to cast object of type 'System.Int32' to type 'System.Collections.ArrayList'.
0
Transaction-level recovery for Oracle database

Veeam Explore for Oracle delivers low RTOs and RPOs with agentless transaction log backup and transaction-level recovery of Oracle databases. You can restore the database to a precise point in time, even to a specific transaction.

 
nosurf2dayAuthor Commented:
I forgot to put the code in.  Here it is.

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckAccount.Click

        Dim AccountNumberList As New ArrayList
        With AccountNumberList
            .Add(5658845)
            .Add(4502125)
            .Add(7985843)
            .Add(3948383)
            .Add(2939848)
            .Add(4857874)
            .Add(3938482)
            .Add(4984588)
            .Add(9485757)
            .Add(7363873)
            .Add(1028339)
            .Add(4887483)
            .Add(2923731)
            .Add(3857567)
            .Add(6069798)
            .Add(9876555)
            .Add(2927376)
            .Add(8377361)
            Dim sum As Integer = 0
            For i As Integer = 0 To AccountNumberList.Count - 1
                AccountNumberList = AccountNumberList(i)

            Next
        End With

        Try

        Catch ex As FormatException
            MessageBox.Show("A format exception has occurd.  Please check entry.", "Entry Error")
        Catch ex As OverflowException
            MessageBox.Show("An overflow exception has occured.  Plese enter smaller value.", "Entry Error")
        Catch ex As Exception
            MessageBox.Show(ex.Message, ex.GetType.ToString)
        End Try

    End Sub

   
   
End Class
0
 
nosurf2dayAuthor Commented:
I removed the bottom half of the code to leave in the catch statements and they do absolutely nothing.  I dont understand?:
0
 
nosurf2dayAuthor Commented:
I  still have this portion that I need to work on as well.  I dont even know if this code is working because no matter what I put in it does nothing.

If the user enters a number that is in the array, the program should display an message indicating that the number is valid.   If the user enters a number that is not in the array, the program should display a message indicating that number is invalid.    

You also need a Try-Catch statement to catch any possible exceptions occurred during execution by displaying a message indicating that exception has an occurred.  
0
 
gisTimmyCommented:
nosurf2day:

Are you using Visual Basic.NET 2003 or 2005? The code I provided is for 2005, and uses generics which aren't available in 2003.

This code can't work as you expect:

            Dim sum As Integer = 0
            For i As Integer = 0 To AccountNumberList.Count - 1
                AccountNumberList = AccountNumberList(i)

            Next

because you are trying to set an ArrayList to be equal to an Integer. AccountNumberList(i) is a member of the ArrayList AccountNumberList - they can't be assigned to each other because they are different types.

   "The book tels me in the last statement to put

    sum += number, but when I do it says that "Operator '+' is not defined for
    types 'integer' and 'system.collection.arraylist'.

    I dont know what that means.  I am putting in exactly what the book
    says based on the example."

You can't use AccountNumberList += number either, for the same reason stated above.

1. Is your assignment to use arrays to do this? If so, Daniel Wilson's suggestion is a good starting point. If you need to loop through the array, look up For loops in your VB book.

2. In your Catch statements, use a different variable name for each Exception type you try to catch. You can't declare three different variables of different types with the same name.

3. Type Option Strict On at the top of your file and Visual Basic will show you the error in the code window.
0
 
nosurf2dayAuthor Commented:
I am using visual basic 2008, My practice assignment is stated on the first post.  

1. Yes, I am to store the list of numbers in an array.  I am looking at my book and its doesn't help from what I can tell.  In the For loop section, I have these examples.
a. For loop that adds then numbers 0 through 4, with a 2 step
b. For loop that adds the numbers 2,4,6,8,10, and 12, with a 2 step
c. For loop that adds the squares of 25, 15, 5, -5, and -15, with a step of -10
d. For loop that calculates a future value

I am not trying to add anything, I am just trying to locate a specified value

2.  When you say use a different variable name, are you referring to the Ex portion of each statement?



0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
Since this is NOT actual homework I think you will benefit greatly from seeing actual, complete, clean code.

There are other methods of doing this...the later versions of VB.Net have shortcut methods for Integer.Parse() that encapsulate the Try/Catch for you, and other structures besides a simple array that make it easier to work with collections.

Uh...good luck on that test!  =)

(...you haven't been sleeping in class have you?...)
Public Class Form1
 
    Private AccountNumbers() As Integer = _
        {5658845, 4502125, 7985843, 3948383, 2939848, 4857874, _
        3938482, 4984588, 9485757, 7363873, 1028339, 4887483, _
        2923731, 3857567, 6069798, 9876555, 2927376, 8377361}
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ' Attempt to convert the User Input into a Valid Integer Variable:
        Dim AccountNumber As Integer
        Try
            AccountNumber = Integer.Parse(TextBox1.Text)
        Catch ex As Exception
            MessageBox.Show(TextBox1.Text, "Invalid Account Number", MessageBoxButtons.OK, MessageBoxIcon.Error)
            TextBox1.Focus()
            Exit Sub
        End Try
 
        ' Sequentially Search the Array looking for a Match:
        Dim Found As Boolean = False
        For Each Account As Integer In AccountNumbers
            If AccountNumber = Account Then
                Found = True
                Exit For
            End If
        Next
 
        ' An alternative Searching syntax:
        For i As Integer = 0 To AccountNumbers.GetUpperBound(0)
            If AccountNumber = AccountNumbers(i) Then
                Found = True
                Exit For
            End If
        Next
 
        ' Inform the User of the Search Results:
        If Found Then
            Label1.Text = "Found!"
        Else
            Label1.Text = "Not Found!"
        End If
    End Sub
 
End Class

Open in new window

0
 
nosurf2dayAuthor Commented:
Thank You so much for this code help.  

Let me tell you, My book SUCKS!  This is much easier to understand.  What you wrote is what is in my book but it is scrambled all over the place.  Little bits from here, little bits from there.  I am not going to do good on this exam.  I can see it now.  And this is a practice problem.  The real deal is supposed to be harder.  WooBoy.

I have a few questions if you dont mind.

What is the difference between how you dim'd the account numbers and the way Timmy dim'd them?

You only show one catch statement, does this actually catch all exceptions? Would it notify me of the type of exception or does it just state that an exception was caught?

What are the differences between the search methods you chose?
I think I understand the first one.  If I am right it is looking for what was inputed within the account numbers.  If it matches then it gives me the statement.

The second one I am not sure, does it start from the first value and move through the list?  If so isn't that how the other one works as well?

I am sorry for having so many questions.  I really want to make a good grade on this exam, I like to go into every test armed with as much knowledge as possible.  My professor is not very approachable.

I inputted your code and with this code I have 4 errors.

1. Three errors reference "AccountNumbers is not declared".  Would I dim it as an integer to    declare it?


2. I am also getting error  "Handles clause requires a WIthEvents variable defined in the containing type or one of its base types." what is underlined is "Handles Button1.Click"  The button1 portion of this statement.



0
 
nosurf2dayAuthor Commented:
I notice that you dim'd accountnumber as Integer.  
If i remove the "s" then it tells me "Expression is of type 'Integer', which is not a collection type.

I have NO IDEA what that means.  I have it on strict option and it doesnt give me a hint on how to fix it.
0
 
nosurf2dayAuthor Commented:
oh, idle mind.  No haven't been sleeping in class.  My professor it from asia and is very hard to understand.  I also have been out of class due to surgery.  This class is exceptionally being there every day but I missed 1 class and man am I behind.  Reading the chapter doesn't seem to help at all.  His power point slides only go over exactly what is in the book.  I went to his office and he said everything he went over is on the slides.  I said I don't understand them.  He just kept saying its on the slides.  I said thanks for your time and I left.  And here I am.  Exam on thursday and not feeling good about it at all.
0
 
gisTimmyCommented:
nosurf2day:

Idle_Mind declared (Dim'd) the numbers as an array, which I see now is what you really needed.

Catch ex as Exception will catch all exceptions, so you don't need anymore unless you are trying to catch different types of exceptions differently.
0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
No problem...let's tackle your questions one at a time...  =)

(let me post responses to your questions and then we can revisit them as necessary)

"What is the difference between how you dim'd the account numbers and the way Timmy dim'd them?"

    Timmy is using a List.  It is a dynamic collection that can be modified easily.  It grows or shrinks automatically as you add/remove items and allows to do so anywhere in the list.  If you add/remove in the middle of the list it will shift everything for you.  You still can access a List using an Index though.

    I am using a traditional Array.  It is FIXED in size.  You can't add to it unless you explicitly "redimension" it using the "ReDim Preserve" keywords.  If you wanted to "remove" an item you would have to explicitly shift all the items above the one being removed to fill in the "hole" left behind where the removal was done and then ReDim Preserve it to the smaller Array size.  Likewise, if you wanted to insert an item you would have to ReDim Preserve it (the Preserve keeps the items currently in the array intact), then shift all the items up to make a "hole", and finally set the appropriate Index to the value being inserted.
0
 
nosurf2dayAuthor Commented:
Ahh, I see, and my list of account numbers is fixed, therefor I would use yours.  If I was going to be changing the amount of account numbers in the future then I would use timmy's.  His makes it much easier to adjust without me having to do anything versus yours, if there is a change then I would have to rewrite code every time.

Makes sense.  
0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
Next question:

    "You only show one catch statement, does this actually catch all exceptions? Would it notify me of the type of exception or does it just state that an exception was caught?"

There is only one catch statement because this is the only place in that code that could possibly throw an Exception.   It is considered good practice to enclose the smallest amount of code possible in a Try/Catch block so you can narrow down where the error occurred and react accordingly in subsequent code.

*** IT IS IMPORTANT TO NOTE THAT ONLY CODE <<< INSIDE >>> THE TRY/CATCH BLOCK WILL BE CAUGHT! ***

Since I used the base Exception type, ALL exceptions for the enclosed block would be caught.  The specific TYPE of exception is actually passed in the "ex" parameter of the Catch section.  You can display that to the user if desired like this:

        Try
            AccountNumber = Integer.Parse(TextBox1.Text)
        Catch ex As Exception
            MessageBox.Show("Error: " & ex.Message & vbCrLf & "Input: " & TextBox1.Text, "Invalid Account Number", MessageBoxButtons.OK, MessageBoxIcon.Error)
            TextBox1.Focus()
            Exit Sub
        End Try

If you wanted to have different pieces of code execute based on the exception then you would have to do something like your original attempt.

0
 
nosurf2dayAuthor Commented:
Wow, that last part is really tough.  I think i understand though what I am looking at.  Is it saying that I have thrown an error, and that error is ""?"" and that it is in textbox1 and it also displays that it is an invalid account number?
0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
The For Loops:

    "What are the differences between the search methods you chose?
I think I understand the first one.  If I am right it is looking for what was inputed within the account numbers.  If it matches then it gives me the statement.  ...  The second one I am not sure, does it start from the first value and move through the list?  If so isn't that how the other one works as well?"

The first one simply enumerates the Array and assigns each value in the Array to the "Account" variable so we can make a check against it:

        ' Sequentially Search the Array looking for a Match:
        Dim Found As Boolean = False
        For Each Account As Integer In AccountNumbers
            If AccountNumber = Account Then
                Found = True
                Exit For
            End If
        Next

With this approach we have no idea WHERE in the Array the match was found...only that the value was in fact there.  Additionally, this approach will only give you the items "in order"...you can't customize the order you retrieve them with.

The second approach uses what is called an "Index":

        ' An alternative Searching syntax:
        For i As Integer = 0 To AccountNumbers.GetUpperBound(0)
            If AccountNumber = AccountNumbers(i) Then
                Found = True
                Exit For
            End If
        Next

Here we are actually "grabbing" each value from the Array, in order, using the "i" variable (the Index).  The examples in your book demonstrate how you could use this approach to get the items out in a different order.  You could skip values or even go backwards if desired.  The GetUpperBound() function gives us the highest Index in the Array so we know where to stop the loop.

With the second approach, we actually know where the match was found in the Array with the "i" variable.  For your practice assignment this isn't needed but hopefully you could see how this additional information might be useful.  The approach you use really depends on what the current requirements are.

In the end, they both achieve the same goal...they are iterating over ALL the items in the Array from the first to the last and making a comparison with each item.
0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
Right.

This part builds up a String to display in the messagebox:

    "Error: " & ex.Message & vbCrLf & "Input: " & TextBox1.Text

The & (ampersand) symbol concatenates (joins) two strings together.

It will display "Error: " followed by the actual error message (retrieved using ex.Message).
The vbCrLf part makes it go down to the next line (vbCrLf = vbConstant/Carriage Return/LineFeed).
On the second line it will say "Input: " followed by the actual text the user typed into TextBox1.


0
 
nosurf2dayAuthor Commented:
Okay I am following you.  Dang, you should apply to my university.  You seem to know more about what your talking about than my professor.  Or at least you can convey your thoughts better.
0
 
nosurf2dayAuthor Commented:
ahh, I always wondered what vbCrLf meant.  It doesn't mention that in my book or at least I can't seem to find it.    This information really helps me out.  
0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
Below is the MessageBox.

The first parameter is displayed in the body.
The second parameter is the title.
The third parameter tells what buttons to display (you could use MessageBox to get limited responses from the user).
The forth parameter determines what kind of Icon (the red X on the left side) to display.
Sample-Error-Message.jpg
0
 
nosurf2dayAuthor Commented:
It bothers me when I see code that is abbreviated and it doesn't define it for you.  So your left asking yourself.  What the heck does that mean?
0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
Lol...it is a relic from the really old days of dot matrix line printers.  We don't really need a carriage return/line feed to make the text go down to the next line.

In fact, there is an alternative you can use...

These two are functionally equivalent:

    Dim msg As String = "Line1" & vbCrLf & "Line2"

    Dim msg As String = "Line1" & Environment.NewLine & "Line2"

It really doesn't make a difference when displaying things to the screen.

It WOULD make a difference if we were writing to a FILE though.

If we were actually on a *Nix (Unix) system it would properly convert NewLine to the right sequence as Carriage Return/Line Feed is the standard in Windows based systems but not in *Nix systems.

But I digress...  =\

0
 
nosurf2dayAuthor Commented:
You are a godsend, I must tell you.  You are answering many questions.  I would really like to keep in touch with you after this in case I have anymore questions about this course. It is over in just over a month and I cant wait.  I am not even a ISM major, but I have to take 2 computer programing classes for my general business major at my university.

Idle_Mind, I do still have these issues though with the code you gave me.

1. Three errors reference "AccountNumbers is not declared".  Would I dim it as an integer to    declare it?

2. I am also getting error  "Handles clause requires a WIthEvents variable defined in the containing type or one of its base types." what is underlined is "Handles Button1.Click"  The button1 portion of this statement.
0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
(My email address is in my profile.  Post a question here on EE and then you can email me to bring my attention to it.)

Moving on to the Error Messages:

    "1. Three errors reference "AccountNumbers is not declared".  Would I dim it as an integer to    declare it?"

If you look closely at my code, I have actually declared AccountNumbers OUTSIDE of the Button Cick Event Handler.  

It has been placed at the FORM level.  This means that it has "Form Scope".  Translated this means that the Array will exists as long as the Form does.  Declaring the Array inside the button handler makes it a "Local" variable.  It goes out of scope and is garbage collected when the button click code is complete.

I did this for several reasons:

    (a) The Array doesn't need to be recreated everytime we click the button.
    (b) The Array can be accessed from ANYWHERE within the Form.  If we had other methods/functions we could access the same array from all of them.
    (c) By moving it to the Form level, we don't end up recreating "local" arrays in each method/function where it would not only be a waste of typing but could possibly lead to logical errors if you changed the contents of the array in one place but not in another.

0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
The second Error was:

    "2. I am also getting error  "Handles clause requires a WIthEvents variable defined in the containing type or one of its base types." what is underlined is "Handles Button1.Click"  The button1 portion of this statement."

The part that is underlined tells Visual Basic that the preceding method should be fired when a specific event occurs.  In this case, it should be fired when the Click() event for Button1 occurs.

The rather cryptic message is simply trying to tell you that it can't find a control called "Button1".

You either:

    (a) Don't have a Button on your Form.
    (b) Have a Button on your Form but have called it something else.

0
 
nosurf2dayAuthor Commented:
You are correct, I labeled my button something else.  That was the problem.  When I find the account it give me a message inside the text box that it is valid or invalid.

Looking at your code makes so much sense.  I am finding things by looking into your code and pulling things out of the book.  Things are becoming much clearer now.  

I am fairly good with HTML, i had a roommate that taught me that code by ripping it off of web pages and using code prewritten and manipulating it to what I want it to do.  I am able to look at your code and change around some things that I want to change like the message box and have it state different things.

I like this.  It is getting easier to understand.  I will be keeping this post close to me.  You have helped me understand so much better what I am about to test on.  I will go over this code with a fine tooth comb.  If I have any more questions I will post them and email you to see if you can help. Which I am positive you can.  Hell its seems like you wrote the book.

Idle, I cant thank you enough.

Nosurf
0
 
nosurf2dayAuthor Commented:
You are the VB God in my book!
0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
Glad to be of help!  =)

I understand that without the "big picture" it can be next to impossible to join little unrelated snippets together into a working program that does a specific task.  It's great to see that you have a genuine desire to learn the basics/concepts even though you are not a computer science major.  Hopefully now that you have seen how a working program "flows" you'll be able to better tackle the next problem.

By the way, I know very little about HTML and web-related stuff so you've got one up on me there.  Lolz...

For future reference, please SPLIT the points among all participants whenever Accepting an answer specifically from me.  I personally hate participating in a question and not getting "recognized" at all for my efforts.  I'm sure no ill will was intended on your part though. ;)
0
 
nosurf2dayAuthor Commented:
How do you do that, splitting the points?  You are correct, I didnt realize that I designated points to you.  I  am very new on this site, less than a month I think.
0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
Hmmm...I usually only answer questions, not ask them, so I don't remember what it looks like from your side!  =\

Here are the help topics:
http://www.experts-exchange.com/help.jsp#hi100
http://www.experts-exchange.com/help.jsp#hi407

From the first link:

    "Each comment box has a button that says Accept Multiple Solutions. Click that, and you will see a page that allows you to assign points to any of the comments in the thread."

0
 
nosurf2dayAuthor Commented:
.drawkcab gnipyt siti ,driew si sihT  .niaga sknahT
0

Featured Post

Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

  • 18
  • 11
  • 3
  • +1
Tackle projects and never again get stuck behind a technical roadblock.
Join Now