Ich habe mal eine Frage zum automatischen Anlagen von DS in einer Zwischentabelle.
* eine Tabelle tblworkorder mit Probanden als DS
* eine Tabelle tblBatterien mit Batterien als DS, die den Probanden zugeordnet werden können
* eine Zwischentabelle ztblBatterien, deren DS die Fremdschlüssel von tblworkorder (IDWO_F) und tblBatterien (IDBAT_F) enthalten.
Damit lassen sich jedem m Probanden n Batterien zuordnen.
Neue Probanden werden angelegt mit einem Formular, das auf tblworkorder basiert.
Frage: Wie kann man das machen, dass, wenn ein neuer Proband in "tblworkorder" angelegt wird, auch automatisch in ztblBatterien ein DS entsteht, der in IDBAT_F den Wert "9" erhält?
Carl
Hallo,
versuche es mal so:
Im Ereignis "Nach Aktualisierung" des Feldes mit dem Namens des Probanten.
If Me.NewRecord = True
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("ztblBatterien")
rs.AddNew
rs!IDWO_F = Me.ID 'neue Probant ID aus dem Formular
rs!IDBAT_F = 9
rs.Update
rs.Close: Set rs = Nothing
End If
ungetestet
Okay, ich setze mich heute Abend ran.
Was ich zwischenzeitlich auch als Idee hatte war,
* im Formular für das Anlegen des neuen DS
* ein UFO basierend auf der Zwischentabelle (ztblBatterien)
* in diesem UFO ein Feld für [IDBAT_F] mit einem einzelnen Kombi
* und dieses Kombi die "9" als voreingestellte Option
Dann passiert folgendes:
* wenn der neue DS in tblworkorder angelegt wird, OHNE dass in dem UFO das Kombi angeklickt wurde, wird in der Zwischentabelle KEIN DS angelegt
* wenn der neue DS in tblworkorder angelegt wird, wenn vorher in dem UFO das Kombi KURZ angeklickt wurde, wird erfolgreich sowohl in der DS in tblworkorder, als auch der DS in der Zwischentabelle angelegt.
Ich würde nur gern den Mitarbeiter davon entlasten, in dem Kombi eine Option auswählen zu müssen, über die er sich zum Zeitpunkt des Anlegens des DS noch nicht klar ist.
Carl
Hallo,
folge meinem Vorschlag.
Wenn ich mir jetzt aber das letzte Bild aus Deinem anderen Thema ansehe, so habe ich erhebliche Zweifel an der Sinnhaftigkeit Deines Tuns.
Wie bereits gesagt, programmierst versuchst Du krampfhaft Dinge zu relaisieren, die auf Grund des Aufbaus der DB unlogisch sind. Und somit nur ungeeigneten Formularen führen.
Ja, ich denke schon, dass an Deinen Bedenken was dran ist. Aber ich bin schon froh, überhaupt mal eine Zuordnungstabelle hinbekommen zu haben. Und das mit dem Filtern funktioniert ja. Immerhin sind die 12 Felder weg, und das ist zumindest schonmal normaler als vorher.
Carl
Private Sub WOName_AfterUpdate()
If Me.NewRecord Then
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("ztblBatterien")
rs.AddNew
rs!IDWO_F = Me.ID 'neue Probant ID aus dem Formular
rs!IDBAT_F = 9
rs.Update
rs.Close: Set rs = Nothing
End If
End Sub
Da kommt der fehler 3201
kann das sein, dass es ist, weil beim verlassen des Felder der DS noch nicht angelegt wird? Siehe Bild
Hallo Carl,
Höchstwahrscheinlich. Speichere den DS zunächst
If Me.NewRecord Then
Me.Dirty = False
.
.
Beachte, dass dadurch aber auch die Ereignisse Form_Before- und
-AfterUpdate ausgelöst werden.
gruss ekkehard
Zitat von: Beaker s.a. am Juni 14, 2018, 12:36:13
Hallo Carl,
Höchstwahrscheinlich. Speichere den DS zunächst
If Me.NewRecord Then
Me.Dirty = False
.
.
Beachte, dass dadurch aber auch die Ereignisse Form_Before- und
-AfterUpdate ausgelöst werden.
gruss ekkehard
Ja, Du hast Recht, da löst er beim Verlassen des Feldes das Speichern aus, ohne auf die anderen Eingaben zu warten.
Siehst Du eine Möglichkeit, bei dem UFO (siehe Abbildung) die Eingabe des Wertes "9" in das Feld IDBAT_F zu erzwingen, ohne dass der User etwas tun muss?
Carl
Hallo,
ZitatSiehst Du eine Möglichkeit, bei dem UFO (siehe Abbildung) die Eingabe des Wertes "9" in das Feld IDBAT_F zu erzwingen, ohne dass der User etwas tun muss?
sag mal, liest Du eigentlich die Beiträge sorgfältig ?
Das ist doch bereits in meinem Vorschlag realisiert, oder siehst Du die 9 nicht ?
Was könnte diese Codezeile wohl bedeuten?
rs!IDBAT_F = 9Ich habe nur den Code zum Speichern vergessen.
Ich hatte in #5 geantwortet, dass mit diesem Code bei Verlassen des Feldes mit dem Namen der Fehler 3201 eintritt. (siehe Bild)
Private Sub WOName_AfterUpdate()
If Me.NewRecord Then
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("ztblBatterien")
rs.AddNew
rs!IDWO_F = Me.ID 'neue Probant ID aus dem Formular
rs!IDBAT_F = 9
rs.Update
rs.Close: Set rs = Nothing
End If
End Sub
Es ist nicht nur das Namensfeld anzulegen, sondern weitere Felder. Das wird erst mit dem Button 122 ausgelöst.
Hier mal der gesamte Code des Formulars:
'Prozedur für das Anlegen eines neuen Probanden
Sub VerzeichnisAnlegen()
On Error Resume Next
MkDir DLookup("Hilfstexte", "tblHilfstexte", "ID=1") & Me!WOOrdnername
FileCopy "S:\AusO_Projekt-workorder_Bauer\Datenbanken\autorentool\!dateivorlagen\!Manual.docx", "S:\AusO_Projekt-workorder_Bauer\Datenbanken\autorentool\workorderkatalog\" & Me!WOOrdnername & "\Manual.docx"
FileCopy "S:\AusO_Projekt-workorder_Bauer\Datenbanken\autorentool\!dateivorlagen\!Instruktion.docx", "S:\AusO_Projekt-workorder_Bauer\Datenbanken\autorentool\workorderkatalog\" & Me!WOOrdnername & "\Instruktion.docx"
MkDir "S:\AusO_Projekt-workorder_Bauer\Datenbanken\autorentool\workorderkatalog\" & Me!WOOrdnername & "\!Versionsgeschichte"
MkDir "S:\AusO_Projekt-workorder_Bauer\Datenbanken\autorentool\workorderkatalog\" & Me!WOOrdnername & "\Beispiele"
MkDir "S:\AusO_Projekt-workorder_Bauer\Datenbanken\autorentool\workorderkatalog\" & Me!WOOrdnername & "\Materialien"
MkDir "S:\AusO_Projekt-workorder_Bauer\Datenbanken\autorentool\workorderkatalog\" & Me!WOOrdnername & "\!Versionsgeschichte\20xxxxxx Urspruengliches Material"
DoCmd.RunCommand acCmdSaveRecord
DoCmd.Close
End Sub
Private Sub Befehl122_Click()
On Error GoTo Err_Befehl122_Click
DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
'Verzeichnis anlegen für den jeweiligen Probanden
VerzeichnisAnlegen
Exit_Befehl122_Click:
Exit Sub
Err_Befehl122_Click:
MsgBox Err.Description
Resume Exit_Befehl122_Click
End Sub
Private Sub cmdSchließen_Click()
On Error GoTo Err_cmdSchließen_Click
Me.Undo
DoCmd.Close acForm, "frmworkorderNEU", acSaveNo
Exit_cmdSchließen_Click:
Exit Sub
Err_cmdSchließen_Click:
MsgBox Err.Description
Resume Exit_cmdSchließen_Click
End Sub
Private Sub WOName_AfterUpdate()
If Me.NewRecord Then
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("ztblBatterien")
rs.AddNew
rs!IDWO_F = Me.ID 'neue Probant ID aus dem Formular
rs!IDBAT_F = 9
rs.Update
rs.Close: Set rs = Nothing
End If
End Sub
Private Sub WOName_BeforeUpdate(Cancel As Integer)
If ((IsNull(Me![WOName])) Or (Me![WOName] = "")) Then
Cancel = True
End If
End Sub
Carl
Hallo,
ZitatIch hatte in #5 geantwortet, dass mit diesem Code bei Verlassen des Feldes mit dem Namen der Fehler 3201 eintritt.
Daraufhin gab es von Ekkehard in #6 den Vorschlag zum Speichern.
Worauf Du schriebst:
ZitatJa, Du hast Recht, da löst er beim Verlassen des Feldes das Speichern aus,
Und im oben gezeigten Code fehlt jetzt wieder die Zeile zum Speichern.
Das hat mit dem weiteren Erfassen von Daten zum Probanten nichts zu tun, absolut nichts. Es wird jediglich automatisch ein Datensatz in der Zwischentabelle angelegt (im Hintergrund, das siehst Du nicht) was Du ja wolltest.
Dieser Code bewirkt, dass er das Formular ganz speichern und schließen möchte, aber nicht kann, weil im Feld für den Ordnername kein Ordner eingetragen ist. (Dadurch kommt der Fehler 3314)
Private Sub WOName_AfterUpdate()
If Me.NewRecord Then
Me.Dirty = False
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("ztblBatterien")
rs.AddNew
rs!IDWO_F = Me.ID 'neue Probant ID aus dem Formular
rs!IDBAT_F = 9
rs.Update
rs.Close: Set rs = Nothing
End If
End Sub
Access wartet also beim Verlassen des Feldes mit dem Namen nicht auf die Eingabe in anderen Feldern und den Button 122, sondern versucht sofort, die ganze Routine des Anlegens auszuführen.
Carl
Hallo Carl,
Dann musst du eben in "Form_BeforeUpdate" eine Prüfung auf
Pflichtfelder einbauen. Oder das Ganze gleich vom "WOName_AfterUpdate"
ins "Form_AfterUpdate" verschieben. Da ist der DS dann auch
schon gespeichert.
gruss ekkehard
Ich habe es vergeblich mit Form_AfterUpdate und Form_Close versucht. Wahrscheinlich geht es deshalb nicht, weil Form ja kein Feld ist und dann der Term "If Me.NewRecord" nicht zieht.
Ich habe auch nach 3 Tagen intensiven Probierens keine Kraft mehr. Für so ein spezielles Problem findet man nichts im Internet.
Private Sub Form_AfterUpdate()
If Me.NewRecord Then
'Me.Dirty = False
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("ztblBatterien")
rs.AddNew
rs!IDWO_F = Me.ID 'neue Probant ID aus dem Formular
rs!IDBAT_F = 9
rs.Update
rs.Close: Set rs = Nothing
End If
End Sub
Es wäre wahrscheinlich gelöst, wenn man das Kombi anweisen könnte, auf jedem Fall einen bestimmten Wert einzuspeichern, unabhängig davon, ob in ihm etwas angewählt wurde. Also auf Formularebene eine Speicherung im Kombi erzwingen - nicht als Standardwert.
Carl
Hallo Carl,
Zitatweil Form ja kein Feld ist und dann der Term "If Me.NewRecord
Das ist ja auch eine Eigenschaft des Forms (Me). Du befindest dich doch
auf dem HFo, oder?
ZitatEs wäre wahrscheinlich gelöst, wenn man das Kombi anweisen könnte, auf jedem Fall einen bestimmten Wert einzuspeichern
Welches Kombi, und wozu? Du speicherst doch einen konstanten Wert
im Code (=0). Ein Kombi kommt da doch gar nicht vor.
gruss ekkehard
Ich kann den DS in der Zwischentabelle erfolgreich anlegen, wenn ich ein UFO auf Basis der Zwischentabelle in diesem Formular habe und der User in diesem Ufo eine Kombi anklickt. (Siehe anderen Thread.) Dann funktioniert alles super und so ist die Sache mit der Zwischentabelle ja auch standardmäßig gedacht, wie ich gelesen habe: Ein Hafo, ein Ufo, eine passende Verknüpfung und wenn gebraucht, wird in der Zwischentabelle ein DS passend zum Eintrag in der Haupttabelle angelegt.
Das Problem ist, dass der User zum Anklicken des Kombis im Ufo eine Entscheidung treffen muss, die aber zum Zeitpunkt der Anlage des neuen Datensatzes noch nicht getroffen werden kann. Er wird also nicht wissen, was er wählen soll und deshalb wird auch in der Zwischentabelle kein DS ausgelöst.
Deshalb habe ich für die Zwischentabelle einen stummen Wert "9" vorgesehen, mit dem in jedem Falle ein DS in der Zwischentabelle angelegt werden soll, egal wie der user agiert.
Das Kombi legt aber keine DS mit einem Standardwert an. Mit einem Standardwert lassen sich nur (seit Millisekunden) bestehende Felder füllen, aber keine DS initial anlegen. Man muss offenbar in das Kombi klicken.
Welche Lösung kennst Du?
Carl
Hallo,
ich kann das Problem nicht ganz nachvollziehen.
Das Anlegen eines Datensatzes in der Zwischentabelle mit dem Dummywert 9 zusammen mit der ID des Probanten hat doch mit dem Ufo nichts zu tun. Das geschieht doch völlig unabhängig. Das Ufo muss dann einen Datensatz zeigen, nämlich den mit der ID 9 der Batterietabelle.
Und ich dachte, dass Access die verknüpften DS nur dann erstellen kann, wenn beide Tabellen geladen sind. Und das erfolgt durch das Hafo (Haupttabelle) und das Ufo (Zwischentabelle).
Und dann muss zuerst der DS in der Haupttabelle entstehen und wenn der besteht, dann den DS in der Zwischentabelle angelegt werden.
Carl
Hallo,
es wird das Hafo benötigt, weil dort beim Anlegen eines neuen Probanten dessen ID entsteht. Du musst bei einem neuen Probanten nur mindestens ein Feld ausfüllen, damit diese Autowert ID angelegt wird. Der Datensatz muss nicht gespeichert werden (das war eine falsche Annahme), denn es wird ja auf das Formaularfeld verwiesen und da steht die Zahl dann drin.
Bei der Gelegenheit eine Frage: Ist diese ID ein Autowert ?
Okay, ich habs ohne If gemacht!! Bin zufrieden mit der Lösung.
Ich habe das If weg gelassen, das Formular macht die Routine jetzt einfach in jedem Fall, aber es wird ja auch nur zum Anlegen verwendet
Carl