Code: -------------------------------------------------------------- #Region " Deklarationen für Datenverbindung " Dim dbTreiber As String = "Microsoft.Jet.OLEDB.4.0" Dim dbQuelle As String = Application.StartupPath & "\dbFaktur.mdb" '1 Connection-Objekt wird benötigt: Dim objConnection As OleDb.OleDbConnection = _ New OleDb.OleDbConnection("Provider=" & dbTreiber & "; Data Source=" & dbQuelle) '5 Datenadapter, jeweils für Kunden-, Artikel- und Umsatztabelle, ServiceLaufendeNummer Dim adapterKunden As OleDb.OleDbDataAdapter Dim adapterMonteur As OleDb.OleDbDataAdapter Dim adapterArtikel As OleDb.OleDbDataAdapter Dim adapterUmsatz As OleDb.OleDbDataAdapter Dim adapterServiceUmsatz As OleDb.OleDbDataAdapter Dim adapterStundenzettel As OleDb.OleDbDataAdapter Dim adapterServiceLaufendeNummer As OleDb.OleDbDataAdapter ' TM 21032018
'1 Dataset, in dem dann 4 Tabellen gespeichert werden Dim objDataSet As DataSet '5 Views, jeweils für Kunden-, Artikel- und Umsatztabelle im DataSet, ServiceLaufendeNummer Dim viewKunden As DataView Dim viewMonteur As DataView Dim viewArtikel As DataView Dim viewUmsatz As DataView Dim viewServiceUmsatz As DataView Dim viewStundenzettel As DataView Dim viewServiceLaufendeNummer As DataView ' TM 21032018
'1 CommandBuilder für Umsatztabelle (nur in diese soll geschrieben werden) Dim objCommandBuilder As OleDb.OleDbCommandBuilder
'Globaler Zähler für Rechnungspositionen Dim Pos As Integer
#End Region
Private Sub ServiceBericht_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'Säubern der Views viewKunden = Nothing viewMonteur = Nothing viewArtikel = Nothing viewUmsatz = Nothing viewServiceUmsatz = Nothing viewStundenzettel = Nothing viewServiceLaufendeNummer = Nothing ' TM 21032018
'Erzeugen des DataSet-Objekts objDataSet = New DataSet()
'Öffnen der Verbindung zur Datenbank objConnection.Open()
'Kundendaten einholen adapterKunden = New OleDb.OleDbDataAdapter("SELECT KNR, [zuname] & ', ' & [vorname] AS Name FROM tabKunden", objConnection) adapterKunden.Fill(objDataSet, "tabKunden") viewKunden = New DataView(objDataSet.Tables("tabKunden"))
'Personaldaten einholen tabMonteur adapterMonteur = New OleDb.OleDbDataAdapter("SELECT PID, [VName] & ', ' & [NName] AS Monteur FROM tabMonteur", objConnection) adapterMonteur.Fill(objDataSet, "tabMonteur") viewMonteur = New DataView(objDataSet.Tables("tabMonteur"))
'Artikeldaten einholen adapterArtikel = New OleDb.OleDbDataAdapter("SELECT * FROM tabArtikel", objConnection) adapterArtikel.Fill(objDataSet, "tabArtikel") viewArtikel = New DataView(objDataSet.Tables("tabArtikel"))
'ServiceLaufendeNummmer einholen ----- TM 21032018 adapterServiceLaufendeNummer = New OleDb.OleDbDataAdapter("Select * FROM tabServiceLaufendeNummer", objConnection) adapterServiceLaufendeNummer.Fill(objDataSet, "tabServiceLaufendeNummer") viewServiceLaufendeNummer = New DataView(objDataSet.Tables("tabServiceLaufendeNummer"))
'Combobox für Kunden an Datenquelle binden Me.cboKunde.DataBindings.Add("Text", viewKunden, "Name") '*** siehe unten... Me.cboKunde.DataSource = viewKunden Me.cboKunde.DisplayMember = "Name"
'### Textfeld SNR Datenquelle binden 'Me.txtSNR.DataBindings.Add("Text", viewServiceLaufendeNummer, "Zeahler") 'Hier wird der Weert in die textbox geschrieben... Hier muss man ansetzen für die Nummer erhöhen '######## So hier den Code einsetzen zur Ermittlung der letzten Zählers ########
'Combobox für Service Personal an Datenquelle binden tabMonteur Me.cboMonteur.DataBindings.Add("Text", viewMonteur, "Monteur") Me.cboMonteur.DataSource = viewMonteur Me.cboMonteur.DisplayMember = "Monteur"
'Combobox für Artikel an Datenquelle binden 'Me.cboArtikel.DataBindings.Add("Text", viewArtikel, "Bezeichnung") 'Me.cboArtikel.DataSource = viewArtikel 'Me.cboArtikel.DisplayMember = "Bezeichnung"
'Combobox für Stundenzettel an Datenquelle binden Me.cboSArbeiten.DataBindings.Add("Text", viewStundenzettel, "Stundenzettel") '### "Stundenzettel" !!!!!!! wie bekomme ich in den unteren ComboBox das rein!!! 'Me.cboSArbeiten.DataBindings.Add("Text", viewStundenzettel, "SKDN") Me.cboSArbeiten.DataSource = viewStundenzettel Me.cboSArbeiten.DisplayMember = "Stundenzettel" '### So hier muss auch "Stundenzettel" stehen sonst werden die Unterzeilen ComboBox nicht mit angezeigt ....
'Bestimmen der neuen Servicenummer basierend auf Umsatztabelle der Datenbank adapterUmsatz = New OleDb.OleDbDataAdapter("SELECT MAX(SNR)+1 AS Maxnr FROM tabServiceUmsatz", objConnection) adapterUmsatz.Fill(objDataSet, "tabServiceUmsatz") viewUmsatz = New DataView(objDataSet.Tables("tabServiceUmsatz")) Me.txtSNR.DataBindings.Add("Text", viewUmsatz, "Maxnr")
'Umsatzdaten "normal" einholen (damit später in Umsatztabelle geschrieben werden kann) adapterServiceUmsatz = New OleDb.OleDbDataAdapter("SELECT * FROM tabServiceUmsatz", objConnection) adapterUmsatz.Fill(objDataSet, "tabServiceUmsatz") viewUmsatz = New DataView(objDataSet.Tables("tabServiceUmsatz"))
'************************************************************************* 'CommandBuilder zum Schreiben in Umsatztabelle konfigurieren adapterServiceUmsatz.SelectCommand = New OleDb.OleDbCommand("SELECT * FROM tabServiceUmsatz", objConnection) objCommandBuilder = New OleDb.OleDbCommandBuilder(adapterServiceUmsatz) '*************************************************************************
'##### txtSNR Textfeld binden tabServiceLaufendeNummer binden.... 'Me.txtSNR.DataBindings.Add(New Binding("Text", viewServiceLaufendeNummer, "Zeahler")) 'Wenn es aktiviert wird ist die KNR weg!!!!!!!!
'##### Combobox an Kundennummer viewKunden binden wenn Combobox ausgewählt wird ####### NEU TM 27092017 Me.txtKNR.DataBindings.Add(New Binding("Text", viewKunden, "KNR"))
erst einmal ein Hinweis. Der Code ist nur sehr schwer zu lesen und zu verstehen. Ich würde dir empfehlen die gesamte Datenzugriffslogik in ein eigenes Modul auszulagern. Außerdem führt das Lesen von Daten im Load-Event des Formulars in der Regel zu unschönem Einfrieren der Anzeige.
Aber nun zu deinem eigentlichen Problem. Eigentlich kann ich an dem Code nichts grundsätzlich falsches feststellen. Aber VB ist, was Databinding angeht, manchmal ein bisschen sperrig.
Was mir jedoch aufgefallen ist, ist dass du die beiden Textboxen mit ".Add(New Binding(..." bindest. Versuche mal, das "New Binding(..." wegzulassen und binde die Textboxen analog zu den Comboboxen mit txtKNR.DataBindings.Add("Text", viewKunden, "KNR").
Ist dir eigentlich bewusst, dass du txtSNR zweimal bindest (einmal an viewUmsatz und einmal an viewServiceLaufendeNummer)? Das könnte auch zu deinem Problem führen.
Manchmal hilft es, ein .DataBindings.Clear() vor dem .Add() einzufügen.