PDA

Vollständige Version anzeigen : KundenNr in 5 Tabellen / Formularen ändern


Johnnygranat
20.03.2013, 06:58
Hallo,

ich hoffe, jemand kann mir bei folgendem Problem helfen:

In einer bestehenden Datenbank mit Back- und Frontend sind Kundendaten in 5 Tabellen hinterlegt. Über das Formular "Betreiber" (Anschrift, Telefon, etc.) kann ich weitere Formulare aufrufen (jedes ist einer Tabelle zugeordnet), die mir zusätzliche Daten liefern, z.B. Logbuch, Wartungsdaten, Gerätetypen + Seriennummern oder allgemeine Anlagendaten.
Jede Tabelle enthält neben der ID (Primärschlüssel) auch die Kundennummer.
Viele unserer Bestandskunden haben hier noch eine alte Kundennummer hinterlegt, die in anderen Systemen nicht mehr auftauchen.
Ich möchte jetzt per Befehlsschaltfläche im Formular "Betreiber" bei einigen Kunden die alte KD-Nr. durch die Neue ersetzen. Leider klappt es mit dem Code nicht und ich komme da nicht weiter:

Private Sub KundenNr_ändern_Click()
On Error GoTo Err_KundenNr_ändern_Click

Dim stKNneu As String

Do
stKNneu = InputBox("Bitte die neue Kundennummer eingeben!")
If StrPtr(stKNneu) = 0 Then
Exit Sub
Else
If stKNneu = "" Then
MsgBox "Es muß eine Kundennummer eingegeben werden", _
vbCritical + vbOKOnly, _
"Kundennummer fehlt"
End If
End If
Loop Until stKNneu <> ""

Forms!Frm_Betreiber!KundenNr = stKNneu
Forms!Frm_Anlagen!KundenNr = stKNneu
Forms!Frm_Historie!KundenNr = stKNneu
Forms!Frm_Wartung!KundenNr = stKNneu
Forms!Frm_Wechselrichter!KundenNr = stKNneu


Exit_KundenNr_ändern_Click:
Exit Sub

Err_KundenNr_ändern_Click:
MsgBox Err.Description
Resume Exit_KundenNr_ändern_Click

End Sub

Leider fehlt mir hier das Wissen, wie und wo ich die neue Kundennummer hinschreiben muss. Ins Formular oder geht das auch direkt in die 5 Tabellen?

Weiterhin würde ich auch gerne noch eine Abfrage einbauen, ob die eingegebene neue Kundennummer 6-stellig ist. Falls nicht, sollte eine erneute Eingabe gefordert werden.

Vielen Dank schon einmal für eure Mühe.

fraeser
20.03.2013, 08:00
Z.B. so (sofern KundenNr eine Zahl ist, kein String):

DoCmd.RunSQL "UPDATE tbl_Anlagen SET KundenNr = " & stKNneu & " WHERE KundenNr = " & stKNalt

CptChaos
20.03.2013, 08:51
sind Kundendaten in 5 Tabellen hinterlegt.
Sicher dass das so ist?
Wenn ja solltest Du Dir bei Gelegenheit Gedanken über das Datenmodell machen, Identische Informationen in unterschiedlichen Tabellen widersprechen der Normalisierung und somit einem ordentlichem Datenmodell.

Johnnygranat
20.03.2013, 08:58
Sicher dass das so ist?
Wenn ja solltest Du Dir bei Gelegenheit Gedanken über das Datenmodell machen, Identische Informationen in unterschiedlichen Tabellen widersprechen der Normalisierung und somit einem ordentlichem Datenmodell.

Ja, es gibt 5 Tabellen. Diese enthalten aber bis auf die ID und Kundennummer unterschiedliche Informationen.
Wie ich schon geschrieben habe, ist jedem Formular eine Tabelle mit den entsprechenden Daten zugeordnet (Stammdaten, Anlagendaten, Gerätedaten, Wartungsdaten und Historie/Logbuch).

CptChaos
20.03.2013, 09:01
Ich kenne Deine Anwendung nicht.
Aber wenn identische Daten (hier die Kundennummer) mehrfach vorgehalten wird, ist was faul.
Zu den genannten Daten gehört m.E. noch eine Tabelle welche die Kundendaten generell hält.
Über den Primärschlüssel wird diese mit den bestehenden Tabellen in Bezug gesetzt.
Somit müsstet Du in der aktuellen Situation auch nur an einer Stelle (nämlich der Kundendaten-Tabelle) und nicht an 5 die Daten ändern!

Johnnygranat
20.03.2013, 09:28
@fraeser: Vielen Dank, das klappt wie gewünscht. Kann ich die 5 Meldungen ("Sie beabsichtigen 1 Zeile(n) zu aktualisieren...") irgendwie abschalten oder - noch besser - durch eine einzelne Bestätigung ersetzen?

@CptChaos: Ich werde mal versuchen, das zu ändern und die KundenNr nur in der Stammdaten-Tabelle einzutragen. Dann hätte ich ja auch automatisch nur noch 1 Änderung zu bestätigen. :) Mal sehen, ob es klappt ...

fraeser
20.03.2013, 09:40
Ja, vor der ersten Zeile:
DoCmd.SetWarnings False

Am Ende wieder auf True setzen.

Johnnygranat
20.03.2013, 13:15
Ich habe jetzt alles umgebaut und die KundenNr nur noch in 1 Tabelle drin, die Abfragen und Berichte sind auch angepasst und alles läuft perfekt.

Private Sub KundenNr_ändern_Click()
On Error GoTo Err_KundenNr_ändern_Click

Dim stKNalt As String
Dim stKNneu As String

stKNalt = Me.KundenNr

Do
stKNneu = InputBox("Bitte die neue Kundennummer eingeben!")
If StrPtr(stKNneu) = 0 Then
Exit Sub
Else
If stKNneu = "" Then
MsgBox "Es muß eine Kundennummer eingegeben werden", _
vbCritical + vbOKOnly, _
"Kundennummer fehlt"
End If
End If
Loop Until stKNneu <> ""

DoCmd.SetWarnings False
DoCmd.RunSQL "UPDATE Tab_Betreiber SET KundenNr = " & stKNneu & " WHERE KundenNr = " & stKNalt
DoCmd.RunCommand acCmdSaveRecord
DoCmd.Requery
DoCmd.SetWarnings True

Exit_KundenNr_ändern_Click:
Exit Sub

Err_KundenNr_ändern_Click:
MsgBox Err.Description
Resume Exit_KundenNr_ändern_Click

End Sub

Jetzt fehlt nur noch eine Kleinigkeit, die ich mir wünsche:
Ich würde ich auch gerne noch eine Abfrage einbauen, ob die eingegebene neue Kundennummer 6-stellig ist. Falls nicht, sollte eine erneute Eingabe gefordert werden.

Könnt ihr mir dabei auch noch helfen?

CptChaos
20.03.2013, 13:22
If Len(stKNeu) = 6 Then
...
End If

Anne Berg
20.03.2013, 13:32
Hi,

ich hätte da folgenden Vorschlag für dich: stKNneu = InputBox("Bitte die neue Kundennummer eingeben!")
If StrPtr(stKNneu) = 0 Then
stKNneu = vbNullString
ElseIf stKNneu = "" Then
MsgBox "Es muß eine Kundennummer eingegeben werden", vbCritical + vbOKOnly, "Kundennummer fehlt"
ElseIf Len(stKNneu) <> 6 Then
Msgbox "Kundennummer muss 6-stellig sein", vbCritical + vbOkOnly, "Kundennummer ungültig"
stKNneu = vbNullString
End If

Johnnygranat
20.03.2013, 13:48
Jetzt läuft alles so, wie ich es mir vorgestellt habe.
Vielen herzlichen Dank für eure Unterstützung und die guten Tips.

hcscherzer
20.03.2013, 15:15
Die Anweisung mit dem Aus- und Wiedereinschalten der Warnungen kannst Du Dir ersparen, wenn Du den SQL Befehl nicht über das Makro RunSQL abfeuerst, sondern über die execute-Methode
Und, der Vollständigkeit halber empfehle ich, die SQL Anweisung nicht direkt an .execute zu übergeben sondern in einer Variablen zwischenzuspeichern ... das macht sich gut, wenn die Anweisung fehlerhaft ist.dim sqlc as string
sqlc = "UPDATE Tab_Betreiber ..."
currentdb.execute sqlc, dbfailonerror