Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Automatisch DS in Zwischentabelle (Zuordnungstabelle) anlegen

Begonnen von Carl, Juni 13, 2018, 20:16:33

⏪ vorheriges - nächstes ⏩

Carl

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


MzKlMu

#1
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


Gruß Klaus

Carl

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

MzKlMu

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.
Gruß Klaus

Carl

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

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


Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Carl

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

MzKlMu

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 = 9
Ich habe nur den Code zum Speichern vergessen.
Gruß Klaus

Carl

#9
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

MzKlMu

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.
Gruß Klaus

Carl

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






Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Carl

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

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)