Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Neuer Datensatz erscheint nicht in Tabelle

Begonnen von SeamusQDraide, November 21, 2023, 21:06:39

⏪ vorheriges - nächstes ⏩

SeamusQDraide

Hallo zusammen,

folgendes Problem:
Ich habe ein Formular, die Datenquelle ist eine Tabelle. Das Formular dient zum Anlegen eines neuen Datensatz in der Tabelle.
Problem: Wenn ich es schließe (DoCmd.Close), taucht der neue Datensatz nicht in der Tabelle auf.

Me.Requery oder
Me.Refresh oder
DoCmd.RunCommand acCmdRefresh oder
DoCmd.RunCommand acCmdSaveRecord
Me.Requery

lädt alles nicht den neuen Datensatz in die Tabelle!
Und um mich zu ärgern kann ich mit
Me.Requery
ordnungsgemäß geänderte Datensätze in der Tabelle updaten. Nur der neue Datensatz erscheint dort nicht >:(

Das geschieht erst über den Button "Alles aktualisieren" in der Menüleiste.

Wie kann ich den "Alles Aktualisieren" Befehl aus VBA aufrufen, bzw. die Tabelle gezielt aktualisieren?

Wie gesagt, die .refresh und .requery Methoden haben so nicht direkt funktioniert.
  •  

MzKlMu

#1
Hallo,
im Regelfall erfolgt Datensichten und die Bearbeitung immer über ein Formular. Das Formular ist ja an die Tabelle gebunden und zeigt immer alle Datensätze, auch den, den Du neu eingegeben hast.
Es ist daher völlig überflüssig die Tabelle extra zu aktualisieren. Die Tabelle darf auch nicht extra geöffnet sein. Wenn das Formular geschlossen wird und erst dann die Tabelle zur Ansicht geöffnet, ist der neue Datensatz in der Tabelle zu sehen. Aber wie gesagt, es ist nicht notwendig wenn mit Formularen gearbeitet wird die Tabelle vorher zu öffnen.
Gruß
Klaus
  •  

SeamusQDraide

#2
Hallo Klaus,

vielen Dank für die prompte Antwort! Ich glaub, ich muss da noch etwas mehr ins Detail gehen, dass passiert, wenn man Abends nach stundenlangem Probieren noch schnell eine Frage stellt...
Also Es beginnt mit einem Formular, dass auf einer Abfrage basiert. In dieser Abfrage taucht der Inhalt von mehreren Tabellen auf, unter anderem der Tabelle die ich neu eingeben will.:
qry1 = * from tbl1 and * from tbl2

tbl1 enthält eine Dienstleistung, tbl2 den Anbieter

Dabei steht tbl2 mit tbl1 in einer 1:n Beziehung, der Key von tbl2 steht demenstrpechend als intKey in tbl1.

Die Aufgabe lautet, einen neuen Dienstleistung (also neuer Datensatz in tbl1) anzulegen, wobei auch ein neuer Anbieter (neuer Datensatz in tbl2) benötigt wird.

Ich beginne mit frm1: Öffnet neuen Datensatz mit allen Felder von qry1, wobei die Felder aus tbl2 gesperrt sind. Hier schreibe ich quasi direkt in tbl1.
frm1 hat 2 Buttons.
1. "Wähle Anbieter" öffnet frm2, welches auf tbl2 basiert. Die Felder sind gegen Eingabe gesperrt, ein Filter hilft mir, die Daten eines existierenden Suppliers rauszusuchen. Beim Schließen wird folgender Code ausgeführt:
Sub cmdUpdateNeueDiensleistung_Click

'Duplikatcheck, Vollständigkeitscheck etc.
IDAnbieter = Me.AnbieterID 'der Primärschlüssel des Anbieters wird in einer Variablen abgelegt
Forms.frm1.intKey = IDAnbieter 'ich übergebe den Primärschlüssel des gewünschten Datensatz aus tbl2 in entsprechende Feld von tbl1
DoCmd.Close

End Sub

Bis hierher alles knorke, der ausgewählte, bereits existierende Anbieter erscheint in frm1.

2. Der Button "neuer Anbieter" öffnet frm2 auf einem neuem Datensatz, die Felder sind entsperrt. Ich gebe alles ein, sehe auch, dass ein neuer Primärschlüssel vergeben wird, führe den gleichen Code aus.
Ich sehe: Nichts. Der Anbieter ist in frm1 nicht zu sehen.
Wenn ich nach dem Schließen (also nach dem DoCmd.Close) von frm2 mit
forms.frm1.Requery
die Daten aktualisieren will, bekomme ich die Fehlermeldung 3101:
"Kannn in tbl2 (also der mit den Anbietern), keinen Datensatz mit passendem Schlüssel finden."

Was ist da los?

Edit: ich habe einen echt schmutzigen Workaround gefunden. Wenn ich frm2 schließe, mit IDAnbieter neu öffne und wieder schließe, dann klappt es:
Sub cmdUpdateNeueDiensleistung_Click

'Duplikatcheck, Vollständigkeitscheck etc.
IDAnbieter = Me.AnbieterID 'der Primärschlüssel des Anbieters wird in einer Variablen abgelegt
Forms.frm1.intKey = IDAnbieter 'ich übergebe den Primärschlüssel des gewünschten Datensatz aus tbl2 in entsprechende Feld von tbl1
DoCmd.Close
DoCmd.OpenForm "frm2", , , "key = " & IDAnbieter
Forms.frm1.intKey = IDAnbieter 'aus irgendeinem Grund muss ich den nochmal neu setzen...
DoCmd.Close

End Sub

Aber das ist natürlich maximal unelegant...
  •  

MzKlMu

Hallo,
kannst du bitte mal ein Bild des Beziehungsfensters hier zeigen.
Und erkläre den Ablauf mit den realen Tabellen und Feldnamen.
Gruß
Klaus
  •  

Beaker s.a.

Hallo,
ZitatIn dieser Abfrage taucht der Inhalt von mehreren Tabellen auf,
Sollte man nicht machen. - Prinzip: ein Form - eine Tabelle.
Nimm die Anbietertabelle raus und stelle sie in einem Kombi dar (PK und Name).
Binde das Kombi an das FK Feld bei den DL. Einen neuen Anbieter kannst du dann
über das NotInList-Ereignis anlegen. Da kannst du nämlich auch das Form dafür
öffnen. Siehe OH und hier.

gruss ekkehard
--
Frauen aller Länder vereinigt euch! Wir brauchen eine Wiedergeburt des Matriarchats.
Und schickt den Papst in die Wüste! Da kann er 40 Tage auf God(o)t warten.
  •  

MzKlMu

Hallo,
wahrscheinlich wäre auch Hafo-Ufo sinnvoll. Darum wäre auch ein Bild des Beziehungsfensters hilfreich zur Beurteilung.
Gruß
Klaus
  •  

SeamusQDraide

#6
Hallo zusammen,

vielen Dank für die Unterstützung. Im Anhang ein paar Screenshots. Die drei Tabellen im Screenshot der Beziehungen sind die Grundlage der Abfrage für das Formular "EditAssay". Das erste Form wird mit einem neuen Datensatz geöffnet, siehe Screenshot. Die beiden Buttons "Select Supplier" und "New Supplier" öffnen das Formular "Edit Sup". In beiden Fällen ist es das gleiche Formular, es sind nur leicht unterschiedliche Funktionalitäten freigegeben, um im einen Fall den Nutzer dazu zu bringen, einen existierenden Anbieter zu wählen (und den nicht zu verändern), bzw. einen neuen Anbieter mit vollständigem Datensatz anzulegen.
In Kürze: "Select" sperrt alle Felder für Eingaben und macht eine Filterfunktion bestehend aus zwei Komboboxen (Firma und Name der Ansprechperson) und einem "Filter"-Button sichtbar. Geöffnet wird ein inexistenter Datensatz (SupID = 0)
"New" ermöglicht die Eingabe in die Felder, versteckt die Filterfunktion und springt zu einem leeren Datensatz.
Wenn dies jeweils erledigt ist, schließen wir das ganze mit "Update New Assay". Hier der Code dazu:

Private Sub cmdUpdateNewAssay_Click()

If Me.txtCity.Locked = False Then 'stellt sicher, dass der Duplikatcheck nur im "Edit"-Modus läuft
    If Not (txtCompanyLoad = Me.txtCompany And txtConPersonLoad = Me!txtConPerson) Then 'Duplikatcheck nur, wenn sich etwas geändert hat
    Duplicate = DuplicateSupplier 'Duplicate supplier ist eine Funktion, die 1 zurückgibt, wenn der Supplier schon vorhanden ist
        If Duplicate = 1 Then
        MsgBox ("This Supplier already exists!")
        Exit Sub
        End If
    End If
End If

If IsNull(Me.SupID) Then 'Wenn das der Fall ist, sind keine Daten eingegeben worden -> Abbruch
MsgBox ("Please enter data, or use 'Undo and and Close'!")
Exit Sub
End If

CheckEntry = EmptyFields(Me.txtCompany, Me.txtConPerson, Me.cboCountry, Me.txtCity, Me.txtPoCode, Me.txtStreet, Me.txtNum, Me.txtPhone, Me.txtMail) 'CheckEntry ist eine Funktion, die auf eine Variable für jedes leere Feld +1 addiert und die Summe zurückgibt. Wenn CheckEntry >0 fehlen also noch Eingaben
If CheckEntry > 0 Then
MsgBox ("Please complete entry!")
Exit Sub
End If


NewSupID = Me.SupID

Forms.frmEditAssay.intSupplier = NewSupID

'die nächsten drei Zeilen leeren den Filter, der nur bei "Select Supplier" zugänglich ist
Call FieldsClear("cboSupSel", "cboContact")
Me.Filter = vbNullString
Me.FilterOn = False

DoCmd.Close

'Hier der Knackpunkt: Wenn ich nicht die drei folgenden Zeilen eingebe, sind im "New Supplier" Modus (also bei Eingabe eines neuen Datensatzes), nach dem Schließen die Supplier-Infos in frmEditAssay leer. Im "Select Supplier"-Modus werden die ausgewählten Daten angezeigt. Mit den drei folgenden Zeilen sind dann auch im "New Supplier" alle Daten da.

DoCmd.OpenForm "frmEditSupplier", , , "SupID = " & NewSupID
Forms.frmEditAssay.intSupplier = NewSupID
DoCmd.Close

End Sub

Ich hoffe, das war jetzt irgendwie hilfreich...

Viele Grüße
Seamus
  •  

Beaker s.a.

Ja, und ich bleibe bei meinem Vorschlag mit dem Kombi.
Musst du immer alle Daten des Suppliers sehen?
Die wichtigsten Daten neben dem Namen kannst du ja auch bei
einem Kombi sehen.
Und vor allem brauchst du keinen Check, denn es sind ja immer
alle zu sehen wenn die Box aufgeklappt ist. Und mit Autoergänzen
findest du auch in einer etwas längeren Liste schon eingetragene.
Wie gesagt dann neue über NotInList-Event.
--
Frauen aller Länder vereinigt euch! Wir brauchen eine Wiedergeburt des Matriarchats.
Und schickt den Papst in die Wüste! Da kann er 40 Tage auf God(o)t warten.
  •