Keinen Eintrag in DB machen wenn Auswahl leer

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    Keinen Eintrag in DB machen wenn Auswahl leer

    Hallo und Guten Abend liebes Forum

    Folgendes Problem (wahrscheinlich Denkfehler) habe ich.

    Ich haben 2 Comboboxen Cbox1 und Cbox2. In den beiden Comboboxen stehen div. Einträge zur Auswahl. Wird ein Eintrag ausgewählt, kann ich diesem Eintrag einen Wert (Zahl) zuweisen.

    Beispiel: Combobox1 Einträge Wert1 (in Textbox)
    -----------CTP Bruch bleibt leer
    -----------CTP Pano N95 bleibt leer
    -----------CTP Pano Bruch bleibt leer
    -----------CTP N95 80

    Combobox2 Einträge Wert2 (in Textbox)
    -----------CTP Bruch 5
    -----------CTP Pano N95 bleibt leer
    -----------CTP Pano Bruch bleibt leer
    -----------CTP N95 bleibt leer

    Diese Wert werden nun in die DB eingetragen und das klappt wunderbar mit diesen Code:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub BtnAbschicken_Click(sender As Object, e As EventArgs) Handles BtnAbschicken.Click
    2. If ConnectDatabase() = True Then
    3. If CheckValidInput(TxtAuftragsnummer.Text) = True And
    4. CheckValidIsLetter(CbBearbeiter.Text) = True And
    5. CheckValidIsLetter(TxtProduktbezeichnung.Text) = True And
    6. CheckValidIsLetter(CbPlattenname1.Text) = True And
    7. CheckValidInput(TxtStueckzahl1.Text) = True Then
    8. Dim cmdplatte As New MySqlCommand("INSERT INTO `DWP`.`tbl_plattenabgang_buchen` (`Auftrag`, `Bearbeiter`, `Produktbezeichnung`, `Auftragsfertigstellung`, `Zeit`, `BemerkungAuftrag`, `BemerkungPlatte`, `" & CbPlattenname1.Text & "`, `" & CbPlattenname2.Text & "`) VALUES (@Auftrag, @Bearbeiter, @Produktbezeichnung, @Auftragsfertigstellung, @Zeit, @BemerkungAuftrag, @BemerkungPlatte, '" & TxtStueckzahl1.Text & "', '" & TxtStueckzahl2.Text & "')", con)
    9. Try
    10. cmdplatte.Parameters.AddWithValue("Auftrag", TxtAuftragsnummer.Text)
    11. cmdplatte.Parameters.AddWithValue("Bearbeiter", CbBearbeiter.Text)
    12. cmdplatte.Parameters.AddWithValue("Produktbezeichnung", TxtProduktbezeichnung.Text)
    13. cmdplatte.Parameters.AddWithValue("Auftragsfertigstellung", DatumAuftragsfertigstellung.Value)
    14. cmdplatte.Parameters.AddWithValue("Zeit", TimeAuftragsfertigstellung.Value)
    15. cmdplatte.Parameters.AddWithValue("BemerkungAuftrag", TxtBemerkungAuftrag.Text)
    16. cmdplatte.Parameters.AddWithValue(CbPlattenname1.Text, TxtStueckzahl1.Text)
    17. cmdplatte.Parameters.AddWithValue("BemerkungPlatte", TxtBemerkungPlatte1.Text)
    18. cmdplatte.Parameters.AddWithValue(CbPlattenname2.Text, TxtStueckzahl2.Text)
    19. Catch myerror As MySqlException
    20. 'fehler meldung und fehlercode anzeigen
    21. MessageBox.Show("Es ist ein Fehler aufgetreten" & vbCrLf & myerror.Message & vbCrLf & "Errorcode: " & myerror.Number, "MySQL Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    22. End Try
    23. cmdplatte.ExecuteNonQuery()
    24. MessageBox.Show("Plattenbuchung erfolgreich eingetragen", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
    25. Else
    26. MessageBox.Show("Es ist ein Fehler aufgetreten" & vbCrLf & "Nicht alle Angaben enthalten gültige Werte.", "Eingabefehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    27. If CheckValidInput(TxtAuftragsnummer.Text) = False Then
    28. TxtAuftragsnummer.Select()
    29. ElseIf CheckValidIsLetter(CbBearbeiter.Text) = False Then
    30. CbBearbeiter.Select()
    31. ElseIf CheckValidIsLetter(TxtProduktbezeichnung.Text) = False Then
    32. TxtProduktbezeichnung.Select()
    33. ElseIf CheckValidIsLetter(CbPlattenname1.Text) = False Then
    34. CbPlattenname1.Select()
    35. ElseIf CheckValidInput(TxtStueckzahl1.Text) = False Then
    36. TxtStueckzahl1.Select()
    37. End If
    38. End If
    39. End If
    40. RefreshData()
    41. End Sub




    Nun zu meinem Problem:

    Es kann auch sein, das ich nur Combobox1 auswähle und Combobox2 leer bleibt. Also keinen Eintrag weil nicht benötigt.
    Nun bekomme ich folgende Fehlermeldung:
    MySql.Data.MySqlClient.MySqlException: "Unknown column '' in 'field list'"

    Wie kann ich einen leeren Eintrag machen bzw. verhindern oder wie kann ich das lösen von 2 Einträgen einen leeren nicht zu machen? Also ich kann 2 machen muss aber nicht zwingend.
    Ich hoffe Ihr versteht mein Dilemma bzw. was ich vorhabe machen zu können.

    Gruß und Danke

    Gebhard
    Bilder
    • Screenshot 2024-01-27 184141.png

      136,98 kB, 1.564×1.180, 244 mal angesehen
    Ich kanns mir vorstellen. Da haste das Problem, dass du ja einen sehr rigiden Insert-Befehl hast.
    Wenn du da nu ne Spalte weglässt, meckert natürlich die Datenbank. Unknown column '' in 'field list' heißt eine Spalte mit leerem Namen hat die Tabelle nicht.

    Mit typisierten DataTables kann man flexiblere Inserts und Updates gestalten, mainly übernimmt das dann ein SqlCommandBuilder für dich.
    Sind aber zwei Themen für sich, da sollte man ein bisschen Zeit investieren.

    Aber warte mal warum kann der User die Spaltennamen vorgeben? Die Tabelle ist doch immer gleich also auch die Spaltennamen...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Hallo Haudruferzappeltnoch

    Na ja, was DB-Struktur und Programmierung betrifft bin ich eine "Pfei..." aber ich lerne gerne dazu.

    Der User muss doch auswählen können, welchen "Artikel" er verwenden und wieviele. Er kann zwischen 4 Artikeln auswählen. Also er wählt z.b. CTP N95 aus und davon braucht er 80 Stück. So. Jetzt gehen wärend der Produktion 5 Artike CTP N95 kaputt. Also wählt er CTP Bruch aus und gibt 5 Stück ein.
    Also 2 Einträge.... CTP N95 ---> 80 Stück und CTP Bruch ---> 5 Stück

    Jetzt das gleiche nochmals nur das nichts Kaputt geht. Also CTP N95 ---> 80 Stück und alle anderen Artikel bleiben leer oder 0 wie auch immer.

    Wie kann ich das Programmtechnisch umsetzen einen leeren Eintrag nicht zu machen?

    Ich habe schon versucht z.b. zu Programmiern

    VB.NET-Quellcode

    1. If CbPlattenname2.Text = "" Then
    aber das funktioniert auch nicht.

    Ich hoffe du versteht was ich meine.

    Gruß Gebhard
    Ahja jetzt verstehe ich warum.

    Nene, da musste eben die Query flexibler gestalten (immer alle möglicherweise relevanten Spalten rein):

    SQL-Abfrage

    1. INSERT INTO DWP.tbl_plattenabgang_buchen (Auftrag, Bearbeiter, Produktbezeichnung, Auftragsfertigstellung, Zeit, BemerkungAuftrag, BemerkungPlatte, CTPN95Spaltenname, CTPBruchSpaltenname, CTPPanoSpaltenname, CTPPanoBruchSpaltenname) VALUES (@Auftrag, @Bearbeiter, @Produktbezeichnung, @Auftragsfertigstellung, @Zeit, @BemerkungAuftrag, @BemerkungPlatte, @CTPN95Wert, @CTPBruchWert, @CTPPanoWert, @CTPPanoBruchWert)

    Das hat zwei Vorteile
    - da kannste zum Beispiel dem Parameter für CTPPano 0 zuweisen (ich schätze in einer Spalte mit Stückinformation willste nicht "" stehen haben, vor allem weil da auch der Datentyp fragwürdig gewählt wäre)
    - du wirst kein Opfer von SqlInjection, hätte ich auch schon von Beginn an erwähnen sollen.

    (Diese ` brauchste nur wenn es Namenskonflikte innerhalb der DB geben könnte mit den Bezeichnungen.)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Hallo

    In der DB habe ich das so gelöst. Siehe Anhang

    So einen INSERT habe ich schon probiert. Problem war hierbei, das Ich der Auswahl in der Combobox den Wert aus der Textbox zuweisen muss. Also Wähle ich aus der Combobox CTP N95 aus wird der Wert aus der Textbox1 (80 Stück) CTP N95 zugewiesen und in die DB eingetragen.

    VB.NET-Quellcode

    1. cmdplatte.Parameters.AddWithValue(CbPlattenname1.Text, TxtStueckzahl1.Text)

    Wenn ich das so mache wie Du vorgeschlagen hast wie sieht das MySqlCommand aus?

    VB.NET-Quellcode

    1. cmdplatte.Parameters.AddWithValue(CTP Bruch, TxtStueckzahl1.Text)

    VB.NET-Quellcode

    1. cmdplatte.Parameters.AddWithValue(CTP Pano N95, TxtStueckzahl1.Text)

    VB.NET-Quellcode

    1. cmdplatte.Parameters.AddWithValue(CTP Pano Bruch, TxtStueckzahl1.Text)

    VB.NET-Quellcode

    1. cmdplatte.Parameters.AddWithValue(CTP N95, TxtStueckzahl1.Text)


    Dann wir doch in alle Spalten der Wert TxtStueckzahl1.Text eingetragen?

    Knopf im Kopf!!
    Bilder
    • Bild2.jpg

      347,67 kB, 1.447×1.224, 67 mal angesehen
    • Bild3.jpg

      167,43 kB, 2.245×612, 61 mal angesehen
    Wenn keine Combobox für CTP Pano ausgewählt wurde, warum willst da denn einen Textbox.Text reinhängen?
    cmdplatte.Parameters.AddWithValue("CTP Pano Bruch", String.Empty) geht ja auch.

    Andersrum, wenn alles ausgewählt wurde, muss das doch so aussehen:

    VB.NET-Quellcode

    1. cmdplatte.Parameters.AddWithValue("CTP Bruch", TxtStueckzahl1.Text)
    2. cmdplatte.Parameters.AddWithValue("CTP Pano N95", TxtStueckzahl2.Text)
    3. cmdplatte.Parameters.AddWithValue("CTP Pano Bruch", TxtStueckzahl3.Text)
    4. cmdplatte.Parameters.AddWithValue("CTP N95", TxtStueckzahl4.Text)
    Soweit korrekt?

    Deine Stückzahl ist in der DB also tatsächlich ein Text... warum keine Zahl? int?
    Dann wärs oben entsprechend cmdplatte.Parameters.AddWithValue("CTP Pano Bruch", 0)
    Guten Morgen Haudrauf......

    Danke für deine Ideen und Tipps. Ich glaube, das es nicht möglich ist es so umzusetzen wie ich wollte. Ich habe es jetzt so gelöst.

    Ich wollte die "Labels" CTP Bruch usw. durch die Combobox ersetzen aber das klappte leider nicht.

    VB.NET-Quellcode

    1. Private Sub BtnAbschicken_Click(sender As Object, e As EventArgs) Handles BtnAbschicken.Click
    2. If ConnectDatabase() = True Then
    3. If CheckValidInput(TxtAuftragsnummer.Text) = True And
    4. CheckValidIsLetter(CbBearbeiter.Text) = True And
    5. CheckValidIsLetter(TxtProduktbezeichnung.Text) = True Then
    6. Dim cmdplatte As New MySqlCommand("INSERT INTO `DWP`.`tbl_plattenabgang_buchen` (`Auftrag`, `Bearbeiter`, `Produktbezeichnung`, `Auftragsfertigstellung`, `Zeit`, `BemerkungAuftrag`, `BemerkungPlatte`, `CTP Bruch`, `CTP Pano N95`, `CTP Pano Bruch`, `CTP N95`) VALUES (@Auftrag, @Bearbeiter, @Produktbezeichnung, @Auftragsfertigstellung, @Zeit, @BemerkungAuftrag, @BemerkungPlatte, @CTPBruch, @CTPPanoN95, @CTPPanoBruch, @CTPN95)", con)
    7. Try
    8. cmdplatte.Parameters.AddWithValue("Auftrag", TxtAuftragsnummer.Text)
    9. cmdplatte.Parameters.AddWithValue("Bearbeiter", CbBearbeiter.Text)
    10. cmdplatte.Parameters.AddWithValue("Produktbezeichnung", TxtProduktbezeichnung.Text)
    11. cmdplatte.Parameters.AddWithValue("Auftragsfertigstellung", DatumAuftragsfertigstellung.Value)
    12. cmdplatte.Parameters.AddWithValue("Zeit", TimeAuftragsfertigstellung.Value)
    13. cmdplatte.Parameters.AddWithValue("BemerkungAuftrag", TxtBemerkungAuftrag.Text)
    14. cmdplatte.Parameters.AddWithValue("CTPBruch", TxtStueckCTPBruch.Text)
    15. cmdplatte.Parameters.AddWithValue("BemerkungPlatte", TxtBemerkungPlatte1.Text)
    16. cmdplatte.Parameters.AddWithValue("CTPPanoN95", TxtStueckCTPPanoN95.Text)
    17. cmdplatte.Parameters.AddWithValue("CTPPanoBruch", TxtStueckCTPPanoBruch.Text)
    18. cmdplatte.Parameters.AddWithValue("CTPN95", TxtStueckCTPN95.Text)
    19. Catch myerror As MySqlException
    20. 'fehler meldung und fehlercode anzeigen
    21. MessageBox.Show("Es ist ein Fehler aufgetreten" & vbCrLf & myerror.Message & vbCrLf & "Errorcode: " & myerror.Number, "MySQL Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    22. End Try
    23. cmdplatte.ExecuteNonQuery()
    24. MessageBox.Show("Plattenbuchung erfolgreich eingetragen", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
    25. Else
    26. MessageBox.Show("Es ist ein Fehler aufgetreten" & vbCrLf & "Nicht alle Angaben enthalten gültige Werte.", "Eingabefehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    27. If CheckValidInput(TxtAuftragsnummer.Text) = False Then
    28. TxtAuftragsnummer.Select()
    29. ElseIf CheckValidIsLetter(CbBearbeiter.Text) = False Then
    30. CbBearbeiter.Select()
    31. ElseIf CheckValidIsLetter(TxtProduktbezeichnung.Text) = False Then
    32. TxtProduktbezeichnung.Select()
    33. End If
    34. End If
    35. End If
    36. RefreshData()
    37. End Sub


    Die Form sieht jetzt nicht so "Elegant" aus wie vorher, aber es Funktioniert so wie ich wollte.

    Ach ja!!

    Deine Stückzahl ist in der DB also tatsächlich ein Text... warum keine Zahl? int?


    Habe ich auch geändert. Ist natürlich eine Zahl und kein Text.

    Danke nochmals und einen ruhigen Sonntag

    Gruß Gebhard
    Bilder
    • Bild1.jpg

      151,61 kB, 1.560×981, 66 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Typhoon“ ()

    Die Labels haben auch noch verschiedene Styleoptionen, wenns dir darum geht.

    Ich denke ansonsten brauchst du eine andere Datenstruktur. Statt einer Tabelle für alles, brauchst zwei Tabellen einmal für Aufträge und einmal für Produkte, wobei die Produkte nen Fremdschlüssel für den Auftrag kriegen.
    Und naja das macht dann auch ganz vieles in der Anwendung anders. Ich schätze das geht dann so Richtung einem von EDRs vier Views