Discussion:
Endlosformular - Datensatz hinzufügen/löschen
(zu alt für eine Antwort)
Jens Müller
2009-05-11 08:44:30 UTC
Permalink
Hallo zusammen,

ich möchte in einem Endlosformular (Unterformular) den 'leeren'
Datensatz nicht anzeigen lassen. Dies habe ich durch
|Private Sub Form_Current()
| Me.Form.AllowAdditions = False
|End Sub
auch erreicht.

Nun möchte ich jedoch auf Knopfdruck einen leeren Datensatz anzeigen
lassen. Der ergooglete Ereigniseintrag des Buttons lautet:
|Private Sub cmd_plus_Click()
| Me.Form.AllowAdditions = True
| DoCmd.GoToRecord , , acNewRec
|End Sub

Ich erhalte aber einen Laufzeitfehler '2105' Sie können nicht zu dem
angegebenen Datensatz springen. Beim debuggen lande ich auf der Zeile
| DoCmd.GoToRecord , , acNewRec

Kann mir jemand einen Tip geben, wo es hakt (A03)?

Dank & Gruß
Jens
--
"The only proof that intelligent life exists in the universe
is that it hasn't tried to contact us yet." - Calvin
Stefan Dase
2009-05-11 09:12:01 UTC
Permalink
Hallo Jens!
Post by Jens Müller
Nun möchte ich jedoch auf Knopfdruck einen leeren Datensatz anzeigen
|Private Sub cmd_plus_Click()
| Me.Form.AllowAdditions = True
| DoCmd.GoToRecord , , acNewRec
|End Sub
Ich erhalte aber einen Laufzeitfehler '2105' Sie können nicht zu dem
angegebenen Datensatz springen. Beim debuggen lande ich auf der Zeile
| DoCmd.GoToRecord , , acNewRec
Wird ein neuer, leerer Datensatz im Endlosformular angezeigt? Wenn ja,
wo befindet sich die Schaltfläche "cmd_plus", im Haupt- oder
Unterformular (UF)?

Problem mit dem DoCmd ist, dass es quasi einen Menübefehl aufruft. Daher
muss dein Fokus auch im UF sein, wenn zu dem neuen Datensatz gesprungen
werden soll.

Um den Fokus auf ein UF zu setzen siehe die Access F.A.Q. unter
www.donkarl.com?FAQ4.2.

Viele Grüße,
Stefan
Jens Müller
2009-05-11 09:28:33 UTC
Permalink
Hallo Stefan,
Post by Stefan Dase
Post by Jens Müller
Nun möchte ich jedoch auf Knopfdruck einen leeren Datensatz anzeigen
|Private Sub cmd_plus_Click()
| Me.Form.AllowAdditions = True
| DoCmd.GoToRecord , , acNewRec
|End Sub
Ich erhalte aber einen Laufzeitfehler '2105' Sie können nicht zu dem
angegebenen Datensatz springen. Beim debuggen lande ich auf der Zeile
| DoCmd.GoToRecord , , acNewRec
Wird ein neuer, leerer Datensatz im Endlosformular angezeigt?
Nein, ich habe die Anzeige ja durch
|Private Sub Form_Current()
| Me.Form.AllowAdditions = False
|End Sub
abgestellt.
Post by Stefan Dase
Wenn ja, wo befindet sich die Schaltfläche "cmd_plus", im Haupt- oder
Unterformular (UF)?
Im Formularkopf des Unterformulars.
Post by Stefan Dase
Problem mit dem DoCmd ist, dass es quasi einen Menübefehl aufruft. Daher
muss dein Fokus auch im UF sein, wenn zu dem neuen Datensatz gesprungen
werden soll.
Das sollte er doch sein, wenn der Knopf im Unterformular ist, oder?

Kommentiere ich wie folgt aus
|Private Sub cmd_plus_Click()
| Me.Form.AllowAdditions = True
| 'DoCmd.GoToRecord , , acNewRec
|End Sub
erscheint der neue, leere Datensatz. In dem Moment, wo ich reinklicke,
verschwindet er aber wieder.

Gruß
Jens
--
"The only proof that intelligent life exists in the universe
is that it hasn't tried to contact us yet." - Calvin
Josef Poetzl
2009-05-11 09:36:16 UTC
Permalink
Hallo!

Jens Müller schrieb:
[...]
Post by Jens Müller
Nein, ich habe die Anzeige ja durch
|Private Sub Form_Current()
| Me.Form.AllowAdditions = False
|End Sub
abgestellt.
[...]
Post by Jens Müller
Kommentiere ich wie folgt aus
|Private Sub cmd_plus_Click()
| Me.Form.AllowAdditions = True
| 'DoCmd.GoToRecord , , acNewRec
|End Sub
erscheint der neue, leere Datensatz. In dem Moment, wo ich reinklicke,
verschwindet er aber wieder.
.. weil du ihn als Reaktion auf Form.Current in der sub Form_Current
wieder ausschaltest. ;-)


mfg
Josef
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
Jens Müller
2009-05-11 09:45:57 UTC
Permalink
Hallo Josef,
Post by Josef Poetzl
[...]
Post by Jens Müller
Nein, ich habe die Anzeige ja durch
|Private Sub Form_Current()
| Me.Form.AllowAdditions = False
|End Sub
abgestellt.
[...]
Post by Jens Müller
Kommentiere ich wie folgt aus
|Private Sub cmd_plus_Click()
| Me.Form.AllowAdditions = True
| 'DoCmd.GoToRecord , , acNewRec
|End Sub
erscheint der neue, leere Datensatz. In dem Moment, wo ich reinklicke,
verschwindet er aber wieder.
.. weil du ihn als Reaktion auf Form.Current in der sub Form_Current
wieder ausschaltest. ;-)
Ja, das ist nachvollziehbar, aber kannst Du mir auch einen Tip geben,
wie ich dem Herr werde?

Gruß
Jens
--
"The only proof that intelligent life exists in the universe
is that it hasn't tried to contact us yet." - Calvin
Josef Poetzl
2009-05-11 10:11:09 UTC
Permalink
Hallo!
Post by Jens Müller
Post by Josef Poetzl
[...]
Post by Jens Müller
Nein, ich habe die Anzeige ja durch
|Private Sub Form_Current()
| Me.Form.AllowAdditions = False
|End Sub
abgestellt.
[...]
Post by Jens Müller
Kommentiere ich wie folgt aus
|Private Sub cmd_plus_Click()
| Me.Form.AllowAdditions = True
| 'DoCmd.GoToRecord , , acNewRec
|End Sub
erscheint der neue, leere Datensatz. In dem Moment, wo ich reinklicke,
verschwindet er aber wieder.
.. weil du ihn als Reaktion auf Form.Current in der sub Form_Current
wieder ausschaltest. ;-)
Ja, das ist nachvollziehbar, aber kannst Du mir auch einen Tip geben,
wie ich dem Herr werde?
Ich bin mir nicht sicher, was du genau erreichen willst, aber
vielleicht suchst du so etwas:

1. Beim Initialisieren des Formulars AllowAdditions ausschalten.
z. B. als Reaktion auf Form.Load
private sub Form_Load()
me.AllowAdditions = false
end sub
... vermutlich kannst du das aber auch auslassen, wenn du die
Eigenschaft im Entwurfsmodus auf "Nein" setzt.

2. Klick auf "Plus"
Private Sub cmd_plus_Click()
Me.AllowAdditions = True
DoCmd.GoToRecord , , acNewRec
end sub

3. kein weiteres Anfügen ohne Plus-Klick erlauben
Private Sub Form_AfterInsert()
Me.AllowAdditions = False
End Sub


Jetzt gibt es allerdings noch ein Problem, wenn das Formular als
verknüpftes UF verwendet wird.
Solltest du nach dem Betätigen der "Plus"-Schaltfläche keinen DS
anfügen und im HF zum nächsten DS wechseln, bleibt AllowAddition auf
True.

Das könntest du eventuell über Form.ApplyFilter abfangen.
Private Sub Form_ApplyFilter(Cancel As Integer, ApplyType As Integer)
Me.AllowAdditions = False
End Sub

Vielleicht ist aber auch eine Steuerung vom HF aus sinnvoller.
(Z. B. als Reaktion auf HF.Current.)


mfg
Josef
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
Jens Müller
2009-05-11 11:10:18 UTC
Permalink
Hallo Josef,
Post by Josef Poetzl
Ich bin mir nicht sicher, was du genau erreichen willst,
Ich möchte vorhandene Datensätze anzeigen, per Knopfdruck die
Möglichkeit geben, einen vorhandenen zu löschen bzw. einen neuen anzulegen.
Post by Josef Poetzl
1. Beim Initialisieren des Formulars AllowAdditions ausschalten.
z. B. als Reaktion auf Form.Load
private sub Form_Load()
me.AllowAdditions = false
end sub
... vermutlich kannst du das aber auch auslassen, wenn du die
Eigenschaft im Entwurfsmodus auf "Nein" setzt.
2. Klick auf "Plus"
Private Sub cmd_plus_Click()
Me.AllowAdditions = True
DoCmd.GoToRecord , , acNewRec
end sub
3. kein weiteres Anfügen ohne Plus-Klick erlauben
Private Sub Form_AfterInsert()
Me.AllowAdditions = False
End Sub
Jetzt gibt es allerdings noch ein Problem, wenn das Formular als
verknüpftes UF verwendet wird.
Solltest du nach dem Betätigen der "Plus"-Schaltfläche keinen DS
anfügen und im HF zum nächsten DS wechseln, bleibt AllowAddition auf
True.
Das könntest du eventuell über Form.ApplyFilter abfangen.
Private Sub Form_ApplyFilter(Cancel As Integer, ApplyType As Integer)
Me.AllowAdditions = False
End Sub
Vielleicht ist aber auch eine Steuerung vom HF aus sinnvoller.
(Z. B. als Reaktion auf HF.Current.)
Vielleicht ist das aber auch zu aufwändig. Ich hätte gedacht, es gibt
eine relativ einfache Lösung dafür. Ich habe den Eindruck, die
Fehleranfälligkeit wird dadurch erhöht und steht in keinem Verhältnis zu
einem 'kosmetischen' Effekt.

Danke für die Erleuchtung,
Gruß
Jens
--
"The only proof that intelligent life exists in the universe
is that it hasn't tried to contact us yet." - Calvin
Lutz Uhlmann
2009-05-11 11:22:43 UTC
Permalink
Du könntest das Anlegen / Bearbeiten eines Datensatzes ja auch in ein
Extra-Formular auslagern (acFormAdd / acFormEdit ) ...

Da kann man dann auch etwas ausschweifender arbeiten, da wesentlich mehr
Platz als im Endlosformular vorhanden ist.
Jens Müller
2009-05-11 11:31:35 UTC
Permalink
Post by Lutz Uhlmann
Du könntest das Anlegen / Bearbeiten eines Datensatzes ja auch in ein
Extra-Formular auslagern (acFormAdd / acFormEdit ) ...
Da kann man dann auch etwas ausschweifender arbeiten, da wesentlich mehr
Platz als im Endlosformular vorhanden ist.
Es handelt sich (leider nur) um 2, maximal 3 Datensätze im
Endlosformular pro Datensatz im Hauptformular. Darum fand ich auch den
neuen, leeren Datensatz störend...

Gruß
Jens
--
"The only proof that intelligent life exists in the universe
is that it hasn't tried to contact us yet." - Calvin
Karl Donaubauer
2009-05-11 12:25:27 UTC
Permalink
Post by Jens Müller
ich möchte in einem Endlosformular (Unterformular) den 'leeren'
Datensatz nicht anzeigen lassen. Dies habe ich durch
Post by Jens Müller
Private Sub Form_Current()
If Not Me.NewRecord Then
Post by Jens Müller
Post by Jens Müller
Me.Form.AllowAdditions = False
End If
Post by Jens Müller
Post by Jens Müller
End Sub
auch erreicht.
Nun möchte ich jedoch auf Knopfdruck einen leeren Datensatz anzeigen
Post by Jens Müller
Private Sub cmd_plus_Click()
Me.Form.AllowAdditions = True
DoCmd.GoToRecord , , acNewRec
End Sub
Ich erhalte aber einen Laufzeitfehler '2105' Sie können nicht zu dem
angegebenen Datensatz springen. Beim debuggen lande ich auf der Zeile
Post by Jens Müller
DoCmd.GoToRecord , , acNewRec
Kann mir jemand einen Tip geben, wo es hakt (A03)?
s.o.
Das schaltet die Anzeige der neuen Datensätze solange ein
bis zu einem bereits gespeicherten DS gewechselt wird.
--
HTH
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com
3. SQL Server-Entwickler-Konferenz - Nürnberg im Mai
Jens Müller
2009-05-11 12:53:14 UTC
Permalink
Post by Karl Donaubauer
Post by Jens Müller
ich möchte in einem Endlosformular (Unterformular) den 'leeren'
Datensatz nicht anzeigen lassen. Dies habe ich durch
Post by Jens Müller
Private Sub Form_Current()
If Not Me.NewRecord Then
Post by Jens Müller
Post by Jens Müller
Me.Form.AllowAdditions = False
End If
Post by Jens Müller
Post by Jens Müller
End Sub
Bis auf den (zu vernachlässigenden) Schönheitsfehler, dass ich nach
Eingabe einen neuen, leeren Datensatz zu sehen bekomme, ganz wunderbar.

Diesen kriege ich mit
Private Sub Form_AfterInsert()
Me.Form.AllowAdditions = False
End Sub
leider erst weg, wenn ich reinklicke.

Wunderbar,
1000 Dank
Jens
--
"The only proof that intelligent life exists in the universe
is that it hasn't tried to contact us yet." - Calvin
Josef Poetzl
2009-05-11 13:38:56 UTC
Permalink
Hallo!
Post by Jens Müller
Post by Karl Donaubauer
Post by Jens Müller
ich möchte in einem Endlosformular (Unterformular) den 'leeren'
Datensatz nicht anzeigen lassen. Dies habe ich durch
Post by Jens Müller
Private Sub Form_Current()
If Not Me.NewRecord Then
Post by Jens Müller
Post by Jens Müller
Me.Form.AllowAdditions = False
End If
Post by Jens Müller
Post by Jens Müller
End Sub
Bis auf den (zu vernachlässigenden) Schönheitsfehler, dass ich nach
Eingabe einen neuen, leeren Datensatz zu sehen bekomme, ganz wunderbar.
Diesen kriege ich mit
Private Sub Form_AfterInsert()
Me.Form.AllowAdditions = False
End Sub
leider erst weg, wenn ich reinklicke.
Du könntest den DS eventuell auch direkt nach GoToRecord erzeugen.
Private Sub cmd_plus_Click()
Me.Form.AllowAdditions = True
DoCmd.GoToRecord , , acNewRec

' eine Änderung veranlassen (damit wird DS im Form erzeugt):
me!einDatenfeld = me!einDatenfeld

' Da DS nun im Formular vorhanden ist,
' kann AllowEdits abgedreht werden:
Me.Form.AllowAdditions = false
End Sub

Das hat dann aber den Schönheitsfehler, dass der Anwender die Eingabe
nicht abbrechen kann und der DS bestehen bleibt, solange er nicht
gelöscht wird.

Eine weitere Variante wäre, statt auf AfterInsert auf BeforeInsert zu
reagieren.
Private Sub cmd_plus_Click()
Me.AllowAdditions = True
DoCmd.GoToRecord , , acNewRec
End Sub

Private Sub Form_BeforeInsert(Cancel As Integer)
me!einDatenfeld = me!einDatenfeld
Me.Dirty = False
Me.AllowAdditions = False
End Sub

Auch hier wird der DS gespeichert, aber erst nachdem der Anwender den
ersten Wert in ein Steuerelement eingeben hat.


Ein ganz anderer Ansatz wäre noch so etwas:
Im Formularfuß werden ungebundene Steuerelemente untergebracht. Der
Formularfuß ist normalerweise ausgeblendet. Erst bei Klick auf das
Plus wird dieser angezeigt.

Private Sub cmd_plus_Click()
Me.Formularfuß.Visible = True
End Sub

Wenn du dann noch im Fuß eine "OK"-Schaltfläche einbaust, könntest du
als Reaktion auf deren Klick-Ereignis den DS per Code anfügen und den
Formularfuß wieder ausblenden. (oder spätestens beim DS-Wechsel bzw.
beim Klicken auf einen "Abbrechen"-Button, wird der Fuß ausgeblendet)
Damit wäre kein AllowAdditions=True erforderlich.


Welcher Lösungsansatz für dein Vorhaben am besten passt, musst du
selbst herausfinden. ;-)
Vermutlich wird es am besten sein, wenn du dir die Auslöse-Reihenfolge
der Ereignisse ansiehst, um die passende Kombination zu finden.


mfg
Josef
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
Jens Müller
2009-05-12 09:18:00 UTC
Permalink
[Gelöst: Endlosformular zeigt leeren Datensatz nicht an]
Post by Josef Poetzl
Post by Jens Müller
Bis auf den (zu vernachlässigenden) Schönheitsfehler, dass ich nach
Eingabe einen neuen, leeren Datensatz zu sehen bekomme, ganz wunderbar.
Diesen kriege ich mit
Private Sub Form_AfterInsert()
Me.Form.AllowAdditions = False
End Sub
leider erst weg, wenn ich reinklicke.
Eine weitere Variante wäre, statt auf AfterInsert auf BeforeInsert zu
reagieren.
Private Sub cmd_plus_Click()
Me.AllowAdditions = True
DoCmd.GoToRecord , , acNewRec
End Sub
Private Sub Form_BeforeInsert(Cancel As Integer)
me!einDatenfeld = me!einDatenfeld
Me.Dirty = False
Me.AllowAdditions = False
End Sub
Ich versuche gerade, diese Variante umzusetzen, erhalte aber einen
Laufzeitfehler '3201' Der Datensatz kann nicht hinzugefügt oder geändert
werden, da ein Datensatz in der Tabelle 'tab_Nutzungskategorie' mit
diesem Datensatz in Verbindung stehen muss.

Anstatt me!einDatenfeld habe ich das die Tabelle des Unterformulars mit
der Tabelle tab_Nutzungskategorie verbindende Feld eingesetzt.

Klappt aber nicht. :-(

Gruß
Jens
--
"The only proof that intelligent life exists in the universe
is that it hasn't tried to contact us yet." - Calvin
Josef Poetzl
2009-05-12 09:34:57 UTC
Permalink
Hallo!
Post by Jens Müller
Post by Josef Poetzl
Eine weitere Variante wäre, statt auf AfterInsert auf BeforeInsert zu
reagieren.
Private Sub cmd_plus_Click()
Me.AllowAdditions = True
DoCmd.GoToRecord , , acNewRec
End Sub
Private Sub Form_BeforeInsert(Cancel As Integer)
me!einDatenfeld = me!einDatenfeld
Me.Dirty = False
Me.AllowAdditions = False
End Sub
Ich versuche gerade, diese Variante umzusetzen, erhalte aber einen
Laufzeitfehler '3201' Der Datensatz kann nicht hinzugefügt oder geändert
werden, da ein Datensatz in der Tabelle 'tab_Nutzungskategorie' mit
diesem Datensatz in Verbindung stehen muss.
Anstatt me!einDatenfeld habe ich das die Tabelle des Unterformulars mit
der Tabelle tab_Nutzungskategorie verbindende Feld eingesetzt.
Du meinst die Felder, die die Beziehung zw. den beiden Tabellen
herstellen?
... dann hast du genau das Feld erwischt, dessen Wert du nicht ändern
solltest. :-)

eventuell klappt es damit so:
me!fiNutzungskategorie = me.Parent!idNutzungskategorie

Das würde ich aber nicht machen, sondern ein anderes Datenfeld
verwenden, damit die Access-Routine (HF/UF-Verknüpfung) ganz normal
ablaufen kann.
Irgendein Textfeld, dass der Benutzer befüllen kann, wird es doch
bestimmt geben.


mfg
Josef
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
Jens Müller
2009-05-12 10:02:13 UTC
Permalink
Hallo,
Post by Josef Poetzl
Post by Jens Müller
Post by Josef Poetzl
Eine weitere Variante wäre, statt auf AfterInsert auf BeforeInsert zu
reagieren.
Private Sub cmd_plus_Click()
Me.AllowAdditions = True
DoCmd.GoToRecord , , acNewRec
End Sub
Private Sub Form_BeforeInsert(Cancel As Integer)
me!einDatenfeld = me!einDatenfeld
Me.Dirty = False
Me.AllowAdditions = False
End Sub
Ich versuche gerade, diese Variante umzusetzen, erhalte aber einen
Laufzeitfehler '3201' Der Datensatz kann nicht hinzugefügt oder geändert
werden, da ein Datensatz in der Tabelle 'tab_Nutzungskategorie' mit
diesem Datensatz in Verbindung stehen muss.
Anstatt me!einDatenfeld habe ich das die Tabelle des Unterformulars mit
der Tabelle tab_Nutzungskategorie verbindende Feld eingesetzt.
Du meinst die Felder, die die Beziehung zw. den beiden Tabellen
herstellen?
Ja
Post by Josef Poetzl
... dann hast du genau das Feld erwischt, dessen Wert du nicht ändern
solltest. :-)
:-(
Post by Josef Poetzl
me!fiNutzungskategorie = me.Parent!idNutzungskategorie
Das würde ich aber nicht machen, sondern ein anderes Datenfeld
verwenden, damit die Access-Routine (HF/UF-Verknüpfung) ganz normal
ablaufen kann.
Irgendein Textfeld, dass der Benutzer befüllen kann, wird es doch
bestimmt geben.
Nicht in der betreffenden Tabelle. Diese hat vier Felder:
1. ID_Blah -> Autowert
2. ID_Betrieb -> darüber läuft die Verknüpfung mit dem Hauptformular
3. ID_Nutzung \
4. ID_Teilflaeche |- in beide soll der Nutzer eintragen, allerdings
sind es Kombifelder, in denen die Auswahl strikt vorgegeben ist, deshalb
bestehen Beziehungen zu anderen Tabellen als Datenquellen. ID_Nutzung
ist mit der Tabelle verknüpft, die im Laufzeitfehler (s.o.) genannt wird.
Gebe ich Me!ID_Blah = Me!ID_Blah ein, bleibt der Laufzeitfehler unverändert.

Ist es möglich, mir in ein paar kurzen Sätzen zu erklären, was durch den
Code überhaupt erreicht wird?

Dank & Gruß
Jens
--
"The only proof that intelligent life exists in the universe
is that it hasn't tried to contact us yet." - Calvin
Josef Poetzl
2009-05-12 10:19:31 UTC
Permalink
Hallo!
[...]
Post by Jens Müller
Post by Josef Poetzl
Post by Josef Poetzl
Private Sub Form_BeforeInsert(Cancel As Integer)
me!einDatenfeld = me!einDatenfeld
Me.Dirty = False
Me.AllowAdditions = False
End Sub
[...]
Post by Jens Müller
Post by Josef Poetzl
Irgendein Textfeld, dass der Benutzer befüllen kann, wird es doch
bestimmt geben.
1. ID_Blah -> Autowert
2. ID_Betrieb -> darüber läuft die Verknüpfung mit dem Hauptformular
3. ID_Nutzung \
4. ID_Teilflaeche |- in beide soll der Nutzer eintragen, allerdings
sind es Kombifelder, in denen die Auswahl strikt vorgegeben ist, deshalb
bestehen Beziehungen zu anderen Tabellen als Datenquellen. ID_Nutzung
ist mit der Tabelle verknüpft, die im Laufzeitfehler (s.o.) genannt wird.
Gebe ich Me!ID_Blah = Me!ID_Blah ein, bleibt der Laufzeitfehler unverändert.
Ist es möglich, mir in ein paar kurzen Sätzen zu erklären, was durch den
Code überhaupt erreicht wird?
Ich kann es versuchen. ;-)

BeforeInsert läuft an, bevor die Eingabe des ersten Wertes (egal ob
über Textfeld oder Kombifeld usw.) erfolgt ist.
Daher muss man dafür sorgen, dass es auf jeden Fall zu einer
DS-Änderung kommt, sonst würde Me.AllowAdditions = False die Eingabe
verhindern.
Teste den Code einmal ohne /me!einDatenfeld = me!einDatenfeld/ dann
wirst du sofort sehen, was ich meine.

Das mit dem Textfeld war nur ein Beispiel. Natürlich kannst du auch
ein Kombinationsfeld verwenden.
(Du kannst nur jene Steuerelemente nicht verwenden, die einen Autowert
oder das Datenfeld zur HF/UF-Verknüpfung beinhalten.)


mfg
Josef
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
Jens Müller
2009-05-12 11:34:48 UTC
Permalink
Post by Josef Poetzl
[...]
Post by Jens Müller
Post by Josef Poetzl
Post by Josef Poetzl
Private Sub Form_BeforeInsert(Cancel As Integer)
me!einDatenfeld = me!einDatenfeld
Me.Dirty = False
Me.AllowAdditions = False
End Sub
[...]
Post by Jens Müller
Post by Josef Poetzl
Irgendein Textfeld, dass der Benutzer befüllen kann, wird es doch
bestimmt geben.
1. ID_Blah -> Autowert
2. ID_Betrieb -> darüber läuft die Verknüpfung mit dem Hauptformular
3. ID_Nutzung \
4. ID_Teilflaeche |- in beide soll der Nutzer eintragen, allerdings
sind es Kombifelder, in denen die Auswahl strikt vorgegeben ist, deshalb
bestehen Beziehungen zu anderen Tabellen als Datenquellen. ID_Nutzung
ist mit der Tabelle verknüpft, die im Laufzeitfehler (s.o.) genannt wird.
Gebe ich Me!ID_Blah = Me!ID_Blah ein, bleibt der Laufzeitfehler unverändert.
Ist es möglich, mir in ein paar kurzen Sätzen zu erklären, was durch den
Code überhaupt erreicht wird?
Ich kann es versuchen. ;-)
[...]
Dankeschön!
Post by Josef Poetzl
Das mit dem Textfeld war nur ein Beispiel. Natürlich kannst du auch
ein Kombinationsfeld verwenden.
(Du kannst nur jene Steuerelemente nicht verwenden, die einen Autowert
oder das Datenfeld zur HF/UF-Verknüpfung beinhalten.)
Ich glaube, ich habe das nicht klar genug erläutert. Die in dem
Laufzeitfehler ('3201' Der Datensatz kann nicht hinzugefügt oder
geändert werden, da ein Datensatz in der Tabelle 'tab_Nutzungskategorie'
mit diesem Datensatz in Verbindung stehen muss) erwähnte Tabelle ist
keine Datenquelle für Haupt- oder Unterformular, sondern nur eine
'Datenherkunft' für ein Kombinationsfeld. Ich kann jedoch beide
'unabhängigen' Felder nicht verwenden, denn der Laufzeitfehler bleibt...

Ich vermute / befürchte, dass durch die vielfältigen Beziehungen in
meiner Datenbank die Lösung des Problems erschwert wird.

Dank & Gruß
Jens
--
"The only proof that intelligent life exists in the universe
is that it hasn't tried to contact us yet." - Calvin
Jens Müller
2009-05-14 07:40:48 UTC
Permalink
Hallo,

ich habe mich jetzt entschieden, diese Sache erst mal ruhen zu lassen.
Danke für die aufgezeigten Möglichkeiten, ich werde diese sicher an
anderer Stelle gwinnbringend nutzen...

Also habe ich den betreffenden Code auskommentiert. Leider kann ich
jetzt aber keine Daten mehr im betreffenden Unterformular einfügen.
Einzige Ausnahme ist, wenn ich explizit AllowAdditions = True setze:
Private Sub Form_Current()
'If Not Me.NewRecord Then
' Me.Form.AllowAdditions = False
'End If
Me.Form.AllowAdditions = True
End Sub

Irgendwo muss sich also noch ein 'False' verbergen. Da ich es im
VB-Code-Fenster des Formulars nicht finden kann, bin ich etwas ratlos.
Gibt es einen tiefergehenden Suchbefehl o.ä. um die betreffende Stelle
zu lokalisieren?

Gruß
Jens
--
"The only proof that intelligent life exists in the universe
is that it hasn't tried to contact us yet." - Calvin
Karl Donaubauer
2009-05-14 08:20:15 UTC
Permalink
Post by Jens Müller
ich habe mich jetzt entschieden, diese Sache erst mal ruhen zu lassen.
Danke für die aufgezeigten Möglichkeiten, ich werde diese sicher an
anderer Stelle gwinnbringend nutzen...
Also habe ich den betreffenden Code auskommentiert. Leider kann ich
jetzt aber keine Daten mehr im betreffenden Unterformular einfügen.
Private Sub Form_Current()
'If Not Me.NewRecord Then
' Me.Form.AllowAdditions = False
'End If
Me.Form.AllowAdditions = True
End Sub
Irgendwo muss sich also noch ein 'False' verbergen. Da ich es im
VB-Code-Fenster des Formulars nicht finden kann, bin ich etwas ratlos.
Gibt es einen tiefergehenden Suchbefehl o.ä. um die betreffende Stelle
zu lokalisieren?
Mit "einfügen" meinst du nur neue Datensätze?
Bestehende kannst du ändern?

Die Eigenschaft "Anfügen zulassen" des Formulares steht auf Ja?

Ansonsten sollte es reichen, den kompletten Code mit <Strg>+<F>
nach "AllowAdditions" zu durchsuchen.
--
HTH
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com
3. SQL Server-Entwickler-Konferenz - Nürnberg im Mai
Jens Müller
2009-05-14 08:27:43 UTC
Permalink
Post by Karl Donaubauer
Post by Jens Müller
Irgendwo muss sich also noch ein 'False' verbergen. Da ich es im
VB-Code-Fenster des Formulars nicht finden kann, bin ich etwas ratlos.
Gibt es einen tiefergehenden Suchbefehl o.ä. um die betreffende Stelle
zu lokalisieren?
Mit "einfügen" meinst du nur neue Datensätze?
Ja
Post by Karl Donaubauer
Bestehende kannst du ändern?
Ja
Post by Karl Donaubauer
Die Eigenschaft "Anfügen zulassen" des Formulares steht auf Ja?
Ja
Post by Karl Donaubauer
Ansonsten sollte es reichen, den kompletten Code mit <Strg>+<F>
nach "AllowAdditions" zu durchsuchen.
Das habe ich gemacht. Kein Ergebnis (außer den Auskommentierten).

Ratlos,
Jens

BTW, kannst Du mir einen Tip geben, wie ich vorgehen muss, um die
Anzeige des Eingabefeldes über eine Variable zu steuern? So könnte ich
den von Dir vorgeschlagenen Knopf 'Eingabe aktivieren' auch zum
deaktivieren verwenden... Meine Kenntnisse beschränken sich auf die
bash. VB hat da bestimmt eine andere Syntax...
--
"The only proof that intelligent life exists in the universe
is that it hasn't tried to contact us yet." - Calvin
Jens Müller
2009-05-14 08:45:41 UTC
Permalink
Post by Jens Müller
Post by Karl Donaubauer
Ansonsten sollte es reichen, den kompletten Code mit <Strg>+<F>
nach "AllowAdditions" zu durchsuchen.
Das habe ich gemacht. Kein Ergebnis (außer den Auskommentierten).
OK, nach zwei mal hin und her stellen, hat Access es jetzt übernommen.

Gruß
Jens
Post by Jens Müller
BTW, kannst Du mir einen Tip geben, wie ich vorgehen muss, um die
Anzeige des Eingabefeldes über eine Variable zu steuern? So könnte ich
den von Dir vorgeschlagenen Knopf 'Eingabe aktivieren' auch zum
deaktivieren verwenden... Meine Kenntnisse beschränken sich auf die
bash. VB hat da bestimmt eine andere Syntax...
--
"The only proof that intelligent life exists in the universe
is that it hasn't tried to contact us yet." - Calvin
Karl Donaubauer
2009-05-14 08:53:14 UTC
Permalink
Post by Jens Müller
...
BTW, kannst Du mir einen Tip geben, wie ich vorgehen muss, um die
Anzeige des Eingabefeldes über eine Variable zu steuern? So könnte ich
den von Dir vorgeschlagenen Knopf 'Eingabe aktivieren' auch zum
deaktivieren verwenden... Meine Kenntnisse beschränken sich auf die
bash. VB hat da bestimmt eine andere Syntax...
Ich bin nicht sicher, ob ich verstehe, was du meinst mit
Post by Jens Müller
Anzeige des Eingabefeldes über eine Variable zu steuern
Falls du den Zustand von AllowAdditions mit dem selben Knopf
hin- und herschalten willst, sollte sowas reichen:

Me.AllowAdditions = Not Me.AllowAdditions
--
HTH
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com
3. SQL Server-Entwickler-Konferenz - Nürnberg im Mai
Jens Müller
2009-05-14 09:01:01 UTC
Permalink
Post by Karl Donaubauer
Post by Jens Müller
...
BTW, kannst Du mir einen Tip geben, wie ich vorgehen muss, um die
Anzeige des Eingabefeldes über eine Variable zu steuern? So könnte ich
den von Dir vorgeschlagenen Knopf 'Eingabe aktivieren' auch zum
deaktivieren verwenden... Meine Kenntnisse beschränken sich auf die
bash. VB hat da bestimmt eine andere Syntax...
Ich bin nicht sicher, ob ich verstehe, was du meinst mit
Post by Jens Müller
Anzeige des Eingabefeldes über eine Variable zu steuern
Falls du den Zustand von AllowAdditions mit dem selben Knopf
Ja, meine ich. Mein Versuch sah so aus:
Private Sub Form_Current()
If Not Me.NewRecord Then
Me.Form.AllowAdditions = False
EINGABE = 0
End If
End Sub

Private Sub cmd_Eingabe_Click()
If EINGABE = 0 Then
Me.Form.AllowAdditions = True
DoCmd.GoToRecord , , acNewRec
EINGABE = 1
Else
Me.Form.AllowAdditions = False
EINGABE = 0
End If
End Sub

Funktioniert nur leider nicht. Gibt auch keine Fehlermeldung...
Post by Karl Donaubauer
Me.AllowAdditions = Not Me.AllowAdditions
Bestechen einfach, ich erhalte aber einen Laufzeitfehler, da bei dem
'abschaltenden' Klick auch wieder 'DoCmd.GoToRecord , , acNewRec'
ausgeführt wird. Also brauche ich doch eine If/else-Funktion, oder?

Dank & Gruß
Jens
--
"The only proof that intelligent life exists in the universe
is that it hasn't tried to contact us yet." - Calvin
Karl Donaubauer
2009-05-14 09:06:12 UTC
Permalink
Post by Jens Müller
Post by Karl Donaubauer
...
Falls du den Zustand von AllowAdditions mit dem selben Knopf
Private Sub Form_Current()
If Not Me.NewRecord Then
Me.Form.AllowAdditions = False
EINGABE = 0
End If
End Sub
Private Sub cmd_Eingabe_Click()
If EINGABE = 0 Then
Me.Form.AllowAdditions = True
DoCmd.GoToRecord , , acNewRec
EINGABE = 1
Else
Me.Form.AllowAdditions = False
EINGABE = 0
End If
End Sub
Funktioniert nur leider nicht. Gibt auch keine Fehlermeldung...
Post by Karl Donaubauer
Me.AllowAdditions = Not Me.AllowAdditions
Bestechen einfach, ich erhalte aber einen Laufzeitfehler, da bei dem
'abschaltenden' Klick auch wieder 'DoCmd.GoToRecord , , acNewRec'
ausgeführt wird. Also brauche ich doch eine If/else-Funktion, oder?
Du brauchst keine Variable, weil du immer den Zustand
von AllowAdditions abfragen kannst:

Private Sub cmd_Eingabe_Click()

Me.AllowAdditions = Not Me.AllowAdditions

If Me.AllowAdditions = True Then
DoCmd.GoToRecord , , acNewRec
End If

End Sub
--
HTH
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com
3. SQL Server-Entwickler-Konferenz - Nürnberg im Mai
Jens Müller
2009-05-14 09:13:19 UTC
Permalink
Post by Karl Donaubauer
Post by Karl Donaubauer
Falls du den Zustand von AllowAdditions mit dem selben Knopf
[...]
Post by Karl Donaubauer
Post by Karl Donaubauer
Me.AllowAdditions = Not Me.AllowAdditions
Bestechend einfach, ich erhalte aber einen Laufzeitfehler, da bei dem
'abschaltenden' Klick auch wieder 'DoCmd.GoToRecord , , acNewRec'
ausgeführt wird. Also brauche ich doch eine If/else-Funktion, oder?
Du brauchst keine Variable, weil du immer den Zustand
Private Sub cmd_Eingabe_Click()
Me.AllowAdditions = Not Me.AllowAdditions
If Me.AllowAdditions = True Then
DoCmd.GoToRecord , , acNewRec
End If
End Sub
Ja, sehr einleuchtend! :-)

1000 Dank & Gruß
Jens
--
"The only proof that intelligent life exists in the universe
is that it hasn't tried to contact us yet." - Calvin
Karl Donaubauer
2009-05-12 11:25:41 UTC
Permalink
Post by Jens Müller
Post by Karl Donaubauer
Post by Jens Müller
ich möchte in einem Endlosformular (Unterformular) den 'leeren'
Datensatz nicht anzeigen lassen. Dies habe ich durch
Post by Jens Müller
Private Sub Form_Current()
If Not Me.NewRecord Then
Post by Jens Müller
Post by Jens Müller
Me.Form.AllowAdditions = False
End If
Post by Jens Müller
Post by Jens Müller
End Sub
Bis auf den (zu vernachlässigenden) Schönheitsfehler, dass ich nach
Eingabe einen neuen, leeren Datensatz zu sehen bekomme, ganz wunderbar.
...
Klar, und wie du an Josefs Varianten siehst, ist es ein Gewürge,
das sauber zu regeln. Einfacher und unglaublich einleuchtend für
den Anwender ist es, wenn du auf den Knopf statt "Neuer Datensatz"
sowas wie "Eingabemodus" draufschreibst.
--
;-)
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com
3. SQL Server-Entwickler-Konferenz - Nürnberg im Mai
Jens Müller
2009-05-12 11:38:09 UTC
Permalink
Post by Karl Donaubauer
Post by Jens Müller
Post by Karl Donaubauer
Post by Jens Müller
ich möchte in einem Endlosformular (Unterformular) den 'leeren'
Datensatz nicht anzeigen lassen. Dies habe ich durch
Post by Jens Müller
Private Sub Form_Current()
If Not Me.NewRecord Then
Post by Jens Müller
Post by Jens Müller
Me.Form.AllowAdditions = False
End If
Post by Jens Müller
Post by Jens Müller
End Sub
Bis auf den (zu vernachlässigenden) Schönheitsfehler, dass ich nach
Eingabe einen neuen, leeren Datensatz zu sehen bekomme, ganz wunderbar.
...
Klar, und wie du an Josefs Varianten siehst, ist es ein Gewürge,
das sauber zu regeln.
Ich hatte die leise Hoffnung, dass es dafür eine ähnlich einfache Lösung
gibt, wie die mit der Du mir zuvor weitergeholfen hast.
Post by Karl Donaubauer
Einfacher und unglaublich einleuchtend für den Anwender ist es, wenn
du auf den Knopf statt "Neuer Datensatz" sowas wie "Eingabemodus"
draufschreibst.
Auch wenn das keine Lösung im ursprünglich von mir gedachtem Wege ist,
finde ich sie bestechend einfach. :-)

Dank & Gruß
Jens
--
"The only proof that intelligent life exists in the universe
is that it hasn't tried to contact us yet." - Calvin
Michael
2009-05-14 11:32:32 UTC
Permalink
Hallo Jens,
evtl so?

Option Compare Database
Option Explicit
Dim a as byte

Private Sub Form_Current()
if a = 1 then
Me.Form.AllowAdditions = True
DoCmd.GoToRecord , , acNewRec
Me.Form.AllowAdditions = False
a=0
end if
End Sub

Private Sub cmd_plus_Click()
a = 1
Call Form_Current()

End Sub

Michael
Post by Jens Müller
Hallo zusammen,
ich möchte in einem Endlosformular (Unterformular) den 'leeren'
Datensatz nicht anzeigen lassen. Dies habe ich durch
|Private Sub Form_Current()
| Me.Form.AllowAdditions = False
|End Sub
auch erreicht.
Nun möchte ich jedoch auf Knopfdruck einen leeren Datensatz anzeigen
|Private Sub cmd_plus_Click()
| Me.Form.AllowAdditions = True
| DoCmd.GoToRecord , , acNewRec
|End Sub
Ich erhalte aber einen Laufzeitfehler '2105' Sie können nicht zu dem
angegebenen Datensatz springen. Beim debuggen lande ich auf der Zeile
| DoCmd.GoToRecord , , acNewRec
Kann mir jemand einen Tip geben, wo es hakt (A03)?
Dank & Gruß
Jens
--
"The only proof that intelligent life exists in the universe
is that it hasn't tried to contact us yet." - Calvin
Jens Müller
2009-05-14 12:00:48 UTC
Permalink
Post by Michael
Option Compare Database
Option Explicit
Dim a as byte
Private Sub Form_Current()
if a = 1 then
Me.Form.AllowAdditions = True
DoCmd.GoToRecord , , acNewRec
Me.Form.AllowAdditions = False
a=0
end if
End Sub
Private Sub cmd_plus_Click()
a = 1
Call Form_Current()
End Sub
Das funktioniert bei mir nicht, verzichtet aber leider auch auf jede
Fehlermeldung...

Gruß

Jens
--
"The only proof that intelligent life exists in the universe
is that it hasn't tried to contact us yet." - Calvin
Karl Donaubauer
2009-05-14 12:06:53 UTC
Permalink
Post by Jens Müller
Post by Michael
Option Compare Database
Option Explicit
Dim a as byte
Private Sub Form_Current()
if a = 1 then
Me.Form.AllowAdditions = True
DoCmd.GoToRecord , , acNewRec
Me.Form.AllowAdditions = False
a=0
end if
End Sub
Private Sub cmd_plus_Click()
a = 1
Call Form_Current()
End Sub
Das funktioniert bei mir nicht, verzichtet aber leider auch auf jede
Fehlermeldung...
Kein Wunder, denn der neue Datensatz verschwindet halt sofort,
wenn er gleich wieder ein AllowAdditions = False macht. Hatten wir
ja schon in der Diskussion, dass der neue DS gespeichert werden
muss, um nicht mehr als neu zu gelten.
--
cu
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com
3. SQL Server-Entwickler-Konferenz - Nürnberg im Mai
Loading...