Neuigkeiten:

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

Mobiles Hauptmenü

Verschiedene Formularaufrufe -> verschiedene Ergebnisse (AC2007)

Begonnen von pjo12345, September 01, 2010, 15:17:39

⏪ vorheriges - nächstes ⏩

pjo12345

Hallo,

da habe ich schon wieder eine Frage:

Wenn ich mein Formular starte und auf NEU klicke werden die Textfelder mit den Werten des letzten Datensatzes gefüllt.

z.B.:
Private Sub PrimärOG_BeforeUpdate(Cancel As Integer)
   Me!PrimärOG.DefaultValue = Me!PrimärOG
End Sub


OK das funktioniert.
Rufe ich aber dieses Formular von einem anderen Formular aus auf oder lasse dieses Formular automatisch beim Start von Access öffnen, werden keine Werte mehr übernommen (DoCmd.OpenForm...).

Gibts Unterschiede beim Aufruf von Formularen, wenn diese aus einem zweiten Formular oder automatisch beim Start aufgerufen werden?

mfg pjo12345

***Kommasetzung nach Gefühl*** (Trefferquote 90%)

database

#1
Hallo,

JA und NEIN!

Entscheidend ist das zu Grunde liegende Ereignis.
In deinem Codebeispiel benutzt du das Ereignis 'Vor Aktualisierung' des Steuerelemets PrimärOG im Formular XY.

Um den Gleichen Effekt beim Öffnen des Formulars zu bewirken muss der Code in das Ereignis 'Beim Öffnen' oder 'Beim Laden' des Formulars wandern.
Um den Effekt bei Datensatzwechsel im Formular zu bewirken, sollte der Code ins Ereignis 'Beim Anzeigen' geschrieben werden.

Um den Default-Wert beim Öffnen des Formulars zu setzen:

Private Sub Form_Open(Cancel As Integer)
   Me!PrimärOG.DefaultValue = Me!PrimärOG
    'Wenn das Feld PrimärOG beim Öffnen des Formulars noch keinen Wert besitzt (Datenherkunft!)
    'Me!PrimärOG.DefaultValue = "EinAndererWert"
End Sub


Um den gleichen Effekt beim Datensatzwechsel zu erreichen:


Private Sub Form_Current()
   Me!PrimärOG.DefaultValue = Me!PrimärOG
    'Wenn das Feld PrimärOG beim Datensatzwechsel noch keinen Wert besitzt (Datenherkunft!)
    'Me!PrimärOG.DefaultValue = "EinAndererWert"
End Sub


Um das von einem anderen Formular aus zu veranlassen (das Zielformular muss geöffnet sein):

Private Sub DeinButton_Click()
   Forms!DeinFormular!PrimärOG.DefaultValue = Forms!DeinFormular!PrimärOG
    'Wenn das Feld PrimärOG beim Öffnen des Formulars noch keinen Wert besitzt (Datenherkunft!)
    'Forms!DeinFormular!PrimärOG.DefaultValue = "EinAndererWert"
End Sub


HTH

Peter

pjo12345

Habe es mal getestet. Klappt leider nicht. Wenn ich den Code bei Formular öffnen, laden oder anzeigen einfüge, dann bekomme ich die Fehlermeldung: "Typen unverträglich"

mfg pjo12345
***Kommasetzung nach Gefühl*** (Trefferquote 90%)

database

#3
Hallo,

Zitatdie Fehlermeldung: "Typen unverträglich"
... weist m.E. darauf hin, dass du einen Wert übergeben willst, der für das angesprochene Feld nicht zulässig ist - so z.B. einen Text in ein Zahlenfeld.
Das passiert allzuschnell, wenn das Formular als gebundenes Formular ausgeführt ist (trotzdem empfehlenswert!) und das betreffende Feld an ein numerisches Feld der Datenherkunft gebunden ist.

Du musst natürlich die übergebenen Werte schon den tatsächlichen Gegebenheiten anpassen, die kenne ich ja nicht.
Wenn also das Default Value eine Zahl sein muss, dann muss natürich auch eine Zahl übergeben werden.
Um einen eventuellen Null Fehler abzufangen KANNST du dabeidie NZ-Funktion verwenden.

Beispielsweise KÖNNTE das so aussehen:


Me!PrimärOG.DefaultValue = NZ(Me!PrimärOG,0)


...wodurch nun ins Feld PrimärOG als DefaultValue 0 übergeben wird, wenn PrimärOG beim Öffnen des Formulars KEINEN Wert enthält.


pjo12345

Hmm komisch....

Wenn ich Me!PrimärOG.DefaultValue = NZ(Me!PrimärOG,0) bei "Bei Laden" eintrage wird jetzt eine Null als DefaultValue übernommen, wenn ich das Formular aufrufe. Aber die Null steht auch da, wenn ich einen Wert eintrage, Datensatz speichere und per "NEU" einen neuen Datensatz erstelle. Im letzten Datensatz steht aber definitiv ein Wert für PrimärOG drin. Es ist ein gebundenes Textfeld, Format ist Zahl und es werden auch nur Zahlen eingetragen.

mfg pjo12345
***Kommasetzung nach Gefühl*** (Trefferquote 90%)

database

Hallo,

möglicherweise habe ich da was nicht ganz richtig verstanden ...  :-\

Du möchtest als Default Value den Wert aus dem letzten Datensatz ins Feld schreiben, wenn du einen neuen Datensatz erzeugst oder das Formular öffnest?

ZitatWenn ich mein Formular starte und auf NEU klicke werden die Textfelder mit den Werten des letzten Datensatzes gefüllt
Was ist NEU? Ist das eine Schaltfläche oder was meinst du damit?
Wenn eine Schaltfläche, dann poste mal bitte den Code des Click-Ereignisses.

pjo12345

Ich möchte als Default Value den Wert des letzten Datensatzes beim Öffnen des Formulars in das Feld schreiben.

Oder allgemein gesagt: Ich habe mehrere Datensätze. Es soll beim Öffnen des Formulars ein neuer Datensatz angelegt werden und die Werte vom letzten Datensatz übernommen werden (als Default Value oder auch anders). Jetzt werden die Werte geändert und sollen dann gespeichert werden.


Mit auf "NEU" klicken meine ich den Button oben im Menü von Access im Reiter Start (Access2007).

mfg pjo12345
***Kommasetzung nach Gefühl*** (Trefferquote 90%)

database

#7
Hallo,

tja in dem Fall stimmen natürlich die Codes NICHT.

Beim Öffnen des Formulars werden in der Regel die Daten des ersten Datensatzes der zu Grunde liegenden Tabelle angezeigt und nicht die Daten des Letzten.
Alo muss für jedes Feld der Wert des Lletzten Datensatzes ermittelt werden. Zwecmäßig kann das mit der ID der Datenherkunft bewerkstelligt werden.

Es müßte dann im Ereignis 'Beim Laden' des Formulars folgendes zum Ziel führen:


Private Sub Form_Load()
   
   Dim maxID as Long
   'Die letzte ID ermitteln
   maxID = DMax("ID","DeineTabelle")

   Me!PrimärOG.DefaultValue = DLookup("PrimärOG","DeineTabelle","ID=" & maxID)
   'den Vorgang für alle anderen Felder wiederholen
   Me!AnderesFeld.DefaultValue = DLookup("AnderesFeld","DeineTabelle","ID=" & maxID)
   '....
   '...

End Sub



ZitatMit auf "NEU" klicken meine ich den Button oben im Menü von Access im Reiter Start

Um den Effekt von oben auch in dem Fall zu erhalten müsste der Code auch ins Ereignis Form_Current (Beim Anzeigen)
Hierbei besteht aber nun die Problemeatik, dass dieses Ereignis auch ausgelöst wird, wenn du einen Datensatz zurück navigierst.
Daher müsste zuerst ermittelt werden, ob dieses der Fall ist oder nicht und im negativen Fall (es wurde ein neuer Datensatz angefordert) den Code ausführen
Möglich wird dieses, wenn du z.B. das ID Feld ins Formular aufnimmst. Im Fall eines neuen Datensatzes ist die ID noch nicht bekannt und dieser Umstand kann dazu verwendet werden, die Default-Werte zu setzen.
Also müsste m.E. folgender Code im Ereignis 'Beim Anzeiogen' ein befriedigendes Ergebnis liefern:


Private Sub Form_Current()
   
   If IsNull(Me!ID) Then    'Es wurde ein neuer Datensatz erzeugt, daher Start-Werte setzen
   
       Dim maxID as Long
       'Die letzte ID ermitteln
       maxID = DMax("ID","DeineTabelle")

       Me!PrimärOG = DLookup("PrimärOG","DeineTabelle","ID=" & maxID)
       'den Vorgang für alle anderen Felder wiederholen
       Me!AnderesFeld = DLookup("AnderesFeld","DeineTabelle","ID=" & maxID)
       '....
       '...

   End If

End Sub



Ist zwar ungetestet, sollte aber dennoch funktionieren :)
Versuch mal ...

Greets

pjo12345


@database: Dankeschön! ;D Der erste Tipp klappt wunderbar. Nur noch eine kleine Frage dazu. Das Zuweisen des Default Value Wertes bei einem Kombinationsfeld schlägt fehl. Da erscheint dann nur #Name?. Gibts da einen anderen Syntax oder geht das generell nicht? Als Felddatentyp habe ich "Text" ausgewählt.

Den zweiten Tipp probiere ich auch noch.

mfg pjo12345
***Kommasetzung nach Gefühl*** (Trefferquote 90%)

database

Hallo,

ZitatGibts da einen anderen Syntax oder geht das generell nicht
Wenn du das Kombifeld so erstellt hast, wie es richtigerweise sein soll (2 Spalten, Spaltenbreiten ... ID verborgen, Text anzeigen(z.B. 3cm)) dann musst du dem Kombifeld NACH seiner Befüllung mit Daten die ID des auszuwählenden Eintrags als Startwert zuweisen. In der Regel stellt dieser Wert einen Fremdschlüssel in deiner Formulartabelle dar, da die Werte eines Kombifeldes aus einer 1:n Beziehung zu einer Nachschlagetabelle stammen sollten.

Somit dürfte dann analog der vorigen Methoden ...

Me!DeinKombiFeld = DLookup("Schlüsselfeld","DeineTabelle","ID=" & maxID)

...zielführend sein.

Dem Kombifeld den Wert nicht als   Kombifeld.DefaultValue   zuweisen!

pjo12345

***Kommasetzung nach Gefühl*** (Trefferquote 90%)