PDA

Vollständige Version anzeigen : neuen Datensatz anlegen


Thomas2705
22.01.2008, 21:14
Private Sub bf1_DblClick(Cancel As Integer)
Dim strsql As String
Dim rs As DAO.Recordset
Dim lngID As Long
Dim Antwort As Integer

If Me.Caption = "Datensuche Gewerbe und Unternehmen" Then
Antwort = MsgBox("Soll ein neuer DS angelegt werden?", 4 + 48 + 0, "VISION")
If Antwort = vbYes Then
strsql = "insert into a([a02]) VALUES ('Einzelunternehmen')"
CurrentDb.Execute strsql
Me.Requery

lngID = DMax("a00", "a")
DoCmd.OpenForm "a"
Set rs = Forms!a.RecordsetClone
rs.FindFirst "a00 = " & lngID
Forms!a.Bookmark = rs.Bookmark
rs.Close
Set rs = Nothing

Forms!a!a00.Visible = True
Forms!a!a02.Visible = True

End If
End If

End Sub


Erklärung: Beim Ereignis soll ein neuer DS angelegt werden der beimÖffnen von Form a angezeigt wird. D.h. Form a öffnent mit dem zuletzt angelegten DS. In Textfeld a02 wird der Text "Einzelunternehmen" eingefügt.

Problem: Es wird weder der Text in a02 eingefügt noch der letzte DS angezeigt. Es werden beliebeige DS angezeigt aber nicht was es soll.
Warum?

Thomas

Josef P.
22.01.2008, 21:23
Das Feld a00 ist ein Autowertfeld?

Anne Berg
22.01.2008, 21:29
Hallo Thomas, wenn schon die Anfügeabfrage nicht ausgeführt wird, scheint wohl etwas faul zu sein, ich sehe es aber auch nicht. Kommt denn die MsgBox?!

Füge mal eine Fehlerbehandlung ein (gehört in jede noch so kleine Prozedur!!) und füge den Parameter dbFailOnError ein, beim Execute (näheres s. Access-Hilfe).
Private Sub bf1_DblClick(Cancel As Integer)
On Error GoTo errProc
Dim strsql As String
Dim rs As DAO.Recordset
Dim lngID As Long
Dim Antwort As Integer

If Me.Caption = "Datensuche Gewerbe und Unternehmen" Then
Antwort = MsgBox("Soll ein neuer DS angelegt werden?", vbYesNo + vbExclamation, "VISION")
If Antwort = vbYes Then
strsql = "insert into a (a02) VALUES ('Einzelunternehmen')"
CurrentDb.Execute strsql, dbFailOnError
Me.Requery
.
.
.
EndProc:
Exit Sub
ErrProc:
MsgBox err.Description,,err.Number
Resume EndProc
End Sub
BTW: Warum tust du dir das an mit diesen nichtssagenden Objekt- und Feldbezeichnungen? Auch gibt es sprechende Access-Konstanten für die Parameter einer MsgBox uvm. Oder findest du es cool, dir den Umgang mit Access und das Programmieren im allgemeinen so kompliziert wie möglich zu machen? ;)

Thomas2705
22.01.2008, 21:37
Oh, ich freue mich sehr Euch "zu sehen". Guten Abend.

Ich glaube das o.g. sehr unverständlich ist deshalb versuche ich etwas deutlicher zu schreiben was ich will:

Ereignis:

Lege in Tabelle "a" neuen DS an (a00= Schlüssel)
Lege in Tabelle "a" Textfeld "a02" den Begriff "Einzelunternehmen"

öffne Form "a"
zeige in Form a mit den Feldern "a00" und "a02" (diese sind der Tabelle identisch) den zuletzt angelegten (bzw. gerade angelegten) DS in Tabelle a

Mehr ist es nicht. Ich finde keine Lösung.

Gute Nacht. Hoffentlich bis später.

Thomas

Thomas2705
22.01.2008, 21:43
Nachtrag für Anne: Warum tust du dir das an ...möglich zu machen?


Ich glaubte bisher das es eine gute Lösung ist wenn die Bezeichnung der Textfelder im Form auf der Bezeichnung der Datenfelder der Tabellen basieren. Ich kann kein Englisch und weil ich mich andauernd bei der Bezeichnung der Felder verschrieben habe, dachte ich so etwas wie meine Lösung ist eine gute Lösung?:(

Gute Nacht Anne

Anne Berg
22.01.2008, 22:05
Hallo Thomas, die Erläuterungen hätte ich jetzt nicht gebraucht. ;)

Ich habe mal nach deinem Muster ein Beispiel gebastelt, welches wie gewünscht funktioniert.
Dein Fall liegt offensichtlich doch noch etwas anders...

Leider hast du meine Frage nach der MsgBox nicht beantwortet. :(
(irgendwo muss man schließlich einhaken)

Deinen Nachtrag verstehe ich jetzt nicht. Mein Kommentar bezog sich auf Tabellen und Formulare namens "a", sowie Datenfelder von "a00" bis "a99" - wer soll da durchsteigen? :eek:

Thomas2705
24.01.2008, 14:34
Anne,
Du bist mir unheimlich.:boah: Keine Frau in meinem langen Leben hat es bisher verstanden Lösungen für ein Problem zu geben was ich noch nicht einmal beschreiben kann.

Dein Muster funktioniert manchmal in meiner DB, nur manchmal und ich weiß nicht wie ich es beschreiben soll (mir fehlen die Worte (eine Mischung aus Hoffnungslosigkeit, Wut und Schwachsinn)).:stupid:

Ich habe eine DB mit den betreffenden Form angehängt. Gehe form"a"/Datensuche/Kunden/Ereignis/pop4/neuer DS. (nicht an der Msgbox- Darstellung stören lassen!)

Zur Frage der Bezeichnungen. Ich habe doch nur diese eine DB. Ich glaube eindeutige Bezeichnungen der Tabellen und Form ohne "kryptische Verschlüsselungen" machen mir die Arbeit leichter. Parallel dokumentiere ich alles was ich bezeichne extra als Papierversion.

Thomas

Anne Berg
24.01.2008, 15:10
So, nachdem ich mich nun eine Weile durch deine Formulare doppelgeklickt habe kommt die Frage: Wo ist das Problem?
Nachtrag: komisch - eben ging's noch! :confused:

PS: Was sind denn für dich "kryptische Verschlüsselungen" ? :eek:

Anne Berg
24.01.2008, 15:19
Hallo noch einmal,

ich würde folgendes ändern:
anstelle von Me.Requery (das Form ist ungebunden, da gibt es nichts zu aktualisieren) schreibst du Forms!a.Requery.
Das OpenForm kannst du streichen, denn der Aufruf kommt ja von dort.

Und dann würde ich das PopUp-Form schließen nach getaner Arbeit...

Thomas2705
24.01.2008, 15:23
Anne, wie soll ich Deinen Nachtrag verstehen? Geht es oder geht es nicht?

Bei mir geht dieses Ding nicht. Ich meine manchmal geht es und dann wieder nicht. Es raubt mir Kraft und Ruhe.

"kryptische Verschlüsselungen":

dokzuk= Dokumente zum Kunden
vertrzknd= Verträge zum Kunden

Ich verschreibe mich bei solchen oder ähnlichen Bezeichnungen und dann geht dieses Ding es noch weniger.

Anne Berg
24.01.2008, 15:32
Thomas, hast du meine zweite Antwort verpasst?

PS:
Wenn du so kompliziert denkst, verstehe ich, dass du damit ein Problem hast. Ich hätte da einfach so etwas wie "doku", "vert", etc. gewählt und "zum Kunden" sollte sich doch wohl aus dem Kontext erkennen lassen.

Thomas2705
24.01.2008, 15:37
Thomas, hast du meine zweite Antwort verpasst?
- jetzt habe ich Sie.

Wenn du so kompliziert denkst... Sag nicht so etwas! Ich bin ein Mann und denke sehr einfach!;)

Hoffentlich komme ich mit der zweiten Antwort jetzt ein Stück vorwärts. Ich danke Dir.

Thomas

Thomas2705
24.01.2008, 15:40
:dance: Es geht, es geht... :biggrinl:

Thomas2705
03.02.2008, 11:34
Es gibt ein Form "a". Im HF eingebettet ein UFO "ufo1" mit Daten aus form "aa"

Datenquelle in Form "a" ist indentisch mit Form "aa".

Nach Ereignis im form "msgbox" soll neuer DS in Tabelle "a" angelegt und Form "a" und ufo1!form "aa" aktualisiert werden.

Der code macht fast alles bis auf die aktualisierung im Form "a" und "aa". Was fehlt?

Form "msgbox" hat Eigenschaft popup

Case "Betriebe"

strsql = "insert into a([a02]) VALUES ('Einzelunternehmen')"
CurrentDb.Execute strsql
Forms!a.Requery

lngID = DMax("a00", "a")
DoCmd.OpenForm "a"


Set rs = Forms!a.RecordsetClone
rs.FindFirst "a00 = " & lngID
Forms!a.Bookmark = rs.Bookmark
rs.Close
Set rs = Nothing

DoCmd.Close acForm, "msgbox"

End Select

Arne Dieckmann
03.02.2008, 12:00
<span style="font-family:Courier New;color:#000080;">Forms!a.Requery</span> (sorry, das machst du ja schon - wird der Case-Zweig für "Betriebe" denn durchlaufen?) und <span style="font-family:Courier New;color:#000080;">Forms!a!Ufo1.Requery</span> (wenn das nicht geht: <span style="font-family:Courier New;color:#000080;">Forms!a!Ufo1.Form.Requery</span>) könnten helfen.

ebs17
03.02.2008, 12:08
Anmerkung: Kann es sein, dass Du "um die Ecke" denkst und vielleicht auch so programmierst:
Es gibt ein Form "a". Im HF eingebettet ein UFO "ufo1" mit Daten aus form "aa"
Datenquelle in Form "a" ist indentisch mit Form "aa".

Wenn ich mich jetzt nicht verheddert habe, heißt das doch, alle drei Forms haben die gleiche Datenquelle (das UFo evtl. etwas gefiltert)?

"Es ist ein Zeichen von Genialität, schwierige Dinge einfach auszudrücken."

Und Deine "Bezeichnungspolitik", die Anne schon bemängelt hat, trägt nun auch nicht gerade zu einem schnellen Verständnis bei.

Thomas2705
03.02.2008, 12:17
Hallo Arne, beides funktioniert nicht.

Wenn ufo1 nicht mit Daten aus Form "aa" geladen wurde, lassen sich Daten ergänzen. o.g. code läuft wunderbar.

Wenn ufo1 form "aa" mit Daten aus einem vorhergehenden Ereignis geladen wurde funktioniert der code nicht mehr.
Die case anweisung wird durchgeführt. Es werden auch Daten in den Tabellen angelegt aber das Form wird nicht aktualisiert.

Thomas

Arne Dieckmann
03.02.2008, 12:20
Und du denkst jetzt, dass wir ohne Kenntnis des ominösen anderen Ereignisses dem Ganzen auf die Schliche kommen? :confused:

Vielleicht sind auch nur bestimmte Formulareigenschaften für das komische Verhalten zuständig (ich denke da an "Daten eingeben" etc. - wie sehen diese für HF und UFo aus?). Gibt es Filter, die aktiv sind? Kann es an Verknüpfungen zwischen HF und UFo liegen?

Thomas2705
03.02.2008, 12:22
Kann es sein, dass Du "um die Ecke" denkst und vielleicht auch so programmierst:


Hallo Ebs, ja das kann sein. Ich versuche ein Instrument zu spielen ohne wirklich die Noten zu kennen. Sag mir bitte nicht das ich unmusikalisch bin!

Form "a" hat die gleiche Datenquelle wie form "aa". Ufo 1 ist kein Form.

Form "aa" ist bestandteil von Form "a" und wird durch ein vorhergehenden Ereignis aufgerufen:

DoCmd.OpenForm "a", acNormal, "", "a00=" & Me.a00

Forms!a!ufo1.SourceObject = "aa"
Forms!a!ufo1.LinkChildFields = "a00"
Forms!a!ufo1.LinkMasterFields = "a00"


Felder a00 sind Autowerte.

[Es macht Spaß mit Euch zu "reden"]

Thomas

Thomas2705
03.02.2008, 12:25
Arne, in Beitrag 19 habe ich das geheinisvolle Ereignis geschrieben.
Ich nahm auch an das es an den Einstellungen der Form liegen könnte aber
wie gesagt, wenn Form "aa" in ufo 1 noch nicht geladen wurde (s.19) läßt sich der DS ergänzen.

Arne Dieckmann
03.02.2008, 12:30
Ich vermute, dass es daran liegt (oder an dem filternden Aufruf des HF?):
Forms!a!ufo1.LinkChildFields = "a00"
Forms!a!ufo1.LinkMasterFields = "a00"
Immerhin ermittelst du in dem Code aus Beitrag #14 schon den maximalen Autowert. Vielleicht solltest du die Verknüpfungseigenschaft entsprechend neu setzen. Experimentiere mit dem Zeitpunkt (vor/nach dem Requery des HF/UFos). Sorry, alles sehr ungenau, aber ich habe gerade keine Lust, das nachzubilden.

ebs17
03.02.2008, 12:39
Wo kommt jetzt "Ufo 1" her. Ist das wieder ein feiner Unterschied zu "ufo1"?

Ansonsten:
Ufo 1 ist kein Form. und
Forms!a!ufo1.SourceObject = "aa" im gleichen Beitrag wirkt sehr "logisch".

Ich bin gespannt, wer sich das Spiel weiter antut.

Thomas2705
03.02.2008, 12:40
So, jetzt habe ich alles zusammengeschmissen was ich da habe und was soll ich sagen, es funktioniert unverändert schlecht.

Case "Betriebe"

strsql = "insert into a([a02]) VALUES ('Einzelunternehmen')"
CurrentDb.Execute strsql
Forms!a.ufo1.Form.Requery

lngID = DMax("a00", "a")
DoCmd.OpenForm "a"

If Len(Forms!a!ufo1.SourceObject) > 0 Then
Forms!a!ufo1.LinkChildFields = vbNullString
Forms!a!ufo1.LinkMasterFields = vbNullString
End If

Forms!a!ufo1.SourceObject = "aa"
Forms!a!ufo1.LinkChildFields = "a00"
Forms!a!ufo2.LinkMasterFields = "a00"

Set rs = Forms!a.RecordsetClone
rs.FindFirst "a00 = " & lngID
Forms!a.Bookmark = rs.Bookmark
rs.Close
Set rs = Nothing

DoCmd.Close acForm, "stmsgbox"

End Select

Exit_bf3_Click:
Exit Sub
Err_bf3_Click:
msgbox Err.Description
Resume Exit_bf3_Click

Thomas2705
03.02.2008, 12:45
Ebs, kein Spiel sondern grausamste Qual!

Es gibt nur ein einziges ufo1 ist. Es ist ein Unterformualr, -Bericht. Als herkunftsobjekt dient form "aa".

Ich habe gerade versucht form "a" und form "aa" direkt im Eigenschaftsfenster miteinander zu verknüpfen und bekam die Fehlermeldung das beides nicht in sich selbst anzuordnen geht. Vielleicht ist das der Grund des Übels.

ebs17
03.02.2008, 12:53
Ich habe gerade versucht form "a" und form "aa" direkt im Eigenschaftsfenster miteinander zu verknüpfen und bekam die Fehlermeldung das beides nicht in sich selbst anzuordnen geht.

Dann beende das Thema "Verknüpfen" und beschäftige Dich mit "Synchronisieren (www.donkarl.com?FAQ4.3)".

Dazu gibt es auch ein recht langes Thema von Storch, das vor Kurzem gelaufen ist:
UFo's und Registerkarten (http://www.ms-office-forum.net/forum/showthread.php?t=225167)
und dazu im Zusammenhang:
richtige wirkliche Endlosschleife? geht das? (http://www.ms-office-forum.net/forum/showthread.php?t=225617)

Arne Dieckmann
03.02.2008, 14:00
Wenn "a" zuvor so geöffnet wurde (s. Beitrag #19):
DoCmd.OpenForm "a", acNormal, "", "a00=" & Me.a00
, dann wird das Requery den neuen Datensatz voraussichtlich nicht finden, da der neue Primärschlüssel ungleich dem zuvor eingestellten Kriterium ist.

Versuche, die Recordsource aufzufrischen (evtl. auch völlig ohne Kriterium), vermutlich kann man noch mehr ausdünnen:
Case "Betriebe"
strsql = "insert into a([a02]) VALUES ('Einzelunternehmen')"
CurrentDb.Execute strsql
lngID = DMax("a00", "a")
Forms!a.Recordsource="SELECT * FROM a WHERE a00=" lngID
Forms!a.ufo1.Form.Requery
Set rs = Forms!a.RecordsetClone
rs.FindFirst "a00 = " & lngID
Forms!a.Bookmark = rs.Bookmark
rs.Close
Set rs = Nothing
DoCmd.Close acForm, "stmsgbox"
End Select

Thomas2705
04.02.2008, 14:40
Hallo Arne,

da soll mal einer drauf kommen und es funktioniert mit dem genanten Vorschlag ganz ausgezeichnet.

Hallo Eberhard,

ich habe mir den Link zu Herrn Karl angeschaut und ich finde ihn für mich nicht richtig verwertbar (s.Beitrag 19). Dummerweise funktioniert das herunterlageden der BeispielDB nicht. Kannst Du einen Link auf dem ich mir eine DB anschauen kann?

Thomas

ebs17
04.02.2008, 20:16
Feine Leistung von Arne. Respekt.

Wenn ich mir den Code aber anschaue ...
(1) Neuen Datensatz anlegen in Tabelle
(2) Datenherkunft des Unterformulars auf diesen Datensatz stellen
(3) Datensatz-Zeiger im Hauptformular auf diesen Datensatz stellen
was als Vorgang simpel ist, so muss ich mal die Frage an den Autor des Themas stellen, warum die "richtige" Antwort erst in Beitrag #26 kommt. Mit einer verständlichen Darstellung der Realsituation in neun zusammenhängenden Sätzen hätte eine vergleichbare Antwort (von vielen hier aktiven Forumsteilnehmern) auch in Beitrag #2 kommen können.

Herr Karl ist Herr Karl Donaubauer. Wenn Deine Umschreibung ein Späßchen sein soll, so ist es absolut fehl am Platze, zumal man im österreichischen Sprachraum mehr Wert auf Form und Titel legt als hierzulande. Eine gebende Hand spukt man nicht an. Bei knapp 300 eigenen Beiträgen solltest Du Unterkannte die vierfache Anzahl an Fremdbeiträgen gelesen haben, genügend Stoff für eine reale Einwertung von Personen und Quellen.

Den Hinweis auf Beitrag #19 kann ich jetzt nicht nachvollziehen.