2017-09-30 10 views
0

Je suis en train de réaliser un projet pour mon sujet de gestion de base de données. Je ne peux pas comprendre comment ajouter un montant à un montant ajouté précédemment. Pour l'instant, je ne peux que mettre à jour le montant. Voici le code. Je suis désolé si je ne peux pas bien l'expliquer.VB.net/MS Accès Dons mensuels Assistance système

J'ai 2 formes. Mon premier formulaire me permet d'entrer un nom de famille et de récupérer les données dans ma liste.

Mon deuxième formulaire me permet de récupérer les données que j'ai saisies dans mon premier formulaire et il apparaîtra sur une vue de liste séparée avec un onglet "Nom | Montant".

J'ai deux zones de texte. Un pour le nom de famille mis en lecture seule pour désactiver l'édition, et un autre pour le montant que je veux entrer.

Après avoir saisi un montant, disons 20, il mettra à jour sur la listview et ma base de données 20.

Le problème est que quand je rentre dans un nouveau montant pour le même nom de famille, disons 30, la 30 va remplacer le 20 mais il devrait être 50 parce que 20 + 30 = 50.

Je comprends la logique et j'ai essayé d'ajouter une autre zone de texte pour l'addition mais je ne connais tout simplement pas les codes pour cela.

This is Form 1: Adding of Last Name

This is form 2: Updating of Amount. Last Name set to readonly. No function for textbox3

Imports System.Data.OleDb 

Public Class Form2 
Dim conString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Israel De Leon\Documents\testing.accdb;" 
Dim con As OleDbConnection = New OleDbConnection(conString) 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\Database2.accdb 
Dim cmd As OleDbCommand 
Dim adapter As OleDbDataAdapter 
Dim dt As DataTable = New DataTable() 


Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load 

    'SET LISTVIEW PROPERTIES 
    ListView1.View = View.Details 
    ListView1.FullRowSelect = True 

    'Construct Columns 
    ListView1.Columns.Add("Last Name", 100) 
    ListView1.Columns.Add("Amount", 100) 
End Sub 

Private Sub UpdateLV(lname As String) 
    'Updates last name and amount entered into the database 
    Dim sql As String = "UPDATE Table1 SET LastName='" + TextBox1.Text + "',Amount='" + TextBox2.Text + "' WHERE LastName='" + lname + "'" 
    cmd = New OleDbCommand(sql, con) 

    'OPEN CON, EXECUTE, UPDATE, CLOSE 
    Try 
     con.Open() 
     adapter = New OleDbDataAdapter(cmd) 

     adapter.UpdateCommand = con.CreateCommand() 
     adapter.UpdateCommand.CommandText = sql 

     If (adapter.UpdateCommand.ExecuteNonQuery() > 0) Then 
      MsgBox("Successfully Updated") 

     End If 

     con.Close() 

     Retrieve() 
     ClearBox() 
    Catch ex As Exception 
     MsgBox(ex.Message) 
     con.Close() 
    End Try 

End Sub 

Private Sub Retrieve() 
    ListView1.Items.Clear() 
    'SQL STM 
    Dim sql As String = "SELECT * FROM Table1 " 
    cmd = New OleDbCommand(sql, con) 

    'OPEN CON, RETRIEVE, FILL LISTVIEW 
    Try 
     con.Open() 
     adapter = New OleDbDataAdapter(cmd) 

     adapter.Fill(dt) 

     'LOOP THROUGH DT 
     For Each row In dt.Rows 
      Populate(row(0), row(1)) 'Index of database row 
     Next 

     'CLEAR DATATABLE 
     dt.Rows.Clear() 
     con.Close() 
    Catch ex As Exception 
     MsgBox(ex.Message) 
     con.Close() 
    End Try 
End Sub 
Private Sub Populate(lname As String, aamount As String) 
    'ROW ARRAY 
    Dim row As String() = New String() {lname, aamount} 

    Dim item As ListViewItem = New ListViewItem(row) 

    'ADD TO ROWS COLLECTION 
    ListView1.Items.Add(item) 
End Sub 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Retrieve() 
End Sub 
Private Sub ListView1_MouseClick(sender As Object, e As MouseEventArgs) Handles ListView1.MouseClick 
    Dim llname As String = ListView1.SelectedItems(0).SubItems(0).Text 
    Dim amounts As String = ListView1.SelectedItems(0).SubItems(1).Text 

    TextBox1.Text = llname 
    TextBox2.Text = amounts 
End Sub 

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 
    Dim amounts As String = ListView1.SelectedItems(0).SubItems(0).Text 
    UpdateLV(amounts) 
End Sub 

Private Sub ClearBox() 
    TextBox1.Text = "" 
    TextBox2.Text = "" 
End Sub 

End Class

+0

Ceci est un prototype d'ailleurs. Ne me dérange pas la conception, j'ai vraiment besoin d'aide pour les fonctions. Je vous remercie!! –

+0

Aviez-vous vraiment un champ de base de données nommé _Amounts_ de type string (text in access)? – Steve

+0

@Steve Le type de données est un numéro bon monsieur. –

Répondre

1

opération mathématique ne doit pas être fait à l'aide de chaînes. C'est un vrai principe de base que de nombreux programmeurs VB.NET ne pensent pas assez grâce à la tolérance accordée par Option Strict Off dans les paramètres du projet VB.NET.
Si vous démarrez tout simplement un nouveau projet dans VB.NET, n'utilisez pas ce paramètre, mais activez-le dès que possible. Cela vous arrêtera lorsque vous essaierez d'utiliser des chaînes comme des nombres et vous forcer à faire la conversion appropriée et à vérifier les valeurs fournies.

donc votre code qui met à jour la quantité réécrite

Private Sub UpdateLV(lname As String) 

    ' Get the amount as a number (decimal for currency is the best) 
    Dim addAmt As Decimal 
    if Not decimal.TryParse(textbox2.Text, addAmt) Then 
     MessageBox.Show("Insert a valid amount please") 
     return 
    End If 

    ' Sanity check 
    if addAmt <= 0 Then 
     MessageBox.Show("Amount should be > 0") 
     return 
    End If 

    'Updates last name and amount entered into the database 
    Dim sql As String = "UPDATE Table1 SET [email protected] 
           ,[email protected] 
           WHERE [email protected]" 
    cmd = New OleDbCommand(sql, con) 
    Try 
     con.Open() 

     ' Using an adapter here is wrong. You use directly the command 
     cmd.Parameters.Add("@name", OleDbType.VarWChar).Value = textBox1.Text 
     cmd.Parameters.Add("@amt", OleDbType.Decimal).Value = addAmt 
     cmd.Parameters.Add("@oldname", OleDbType.VarWChar).Value = lName 
     If (cmd.ExecuteNonQuery() > 0) Then 
      MsgBox("Successfully Updated") 
     End If 
     con.Close() 
     Retrieve() 
     ClearBox() 
    Catch ex As Exception 
     MsgBox(ex.Message) 
     con.Close() 
    End Try 
End Sub 

Quelque chose d'autre n'est pas clair dans votre code. Quel est le but de changer aussi le nom de famille ici? Enfin, ne gardez pas d'objet de connexion global. Au lieu de cela, créez-le quand vous en avez besoin et détruisez-le ensuite avec l'instruction Using. Ce sera mieux pour votre empreinte de mémoire et pour votre base de données

+0

Pour être honnête avec vous @Steve Je suivais un guide youtube pour ajouter, mettre à jour, récupérer et supprimer et j'ai simplement traduit ce que j'ai appris sur ce prototype. Mes connaissances sont limitées et je ne comprends pas très bien votre question LastName. S'il s'agit de la partie lname As String, je me suis demandé pourquoi c'est là. Conclusion que j'ai trouvé est que c'est là pour que le nom de famille dans ma base de données peut être appelé avec l'utilisation de "WHERE". J'essaie de passer à travers ce sous-système le plus rapidement possible pour la défense de notre système de gestion la semaine prochaine. –

+0

_'Si vous venez de démarrer un nouveau projet dans VB.NET, n'utilisez pas ce paramètre mais réglez-le le plus rapidement possible sur Off'_ - Ne voulez-vous pas le changer en _ ** On ** _? –

+0

@Steve Je devais changer le MessageBox à MsgBox et le cmd.parameters.Add ("@ amt", OleDbType.Decimal) = addAmt me donne une erreur: Expression est une valeur et ne peut donc pas être la cible d'une affectation " –