Hallo Zusammen,
ich habe ein gefiltertes Formular, Filter laut Eigenschaft AutorId = 2, siehe "docmd.open form" in dem ein Kombi-Feld namens Autor ist. Nun möchte ich das Feld "Autor" (Kombi) so filtern, dass nur noch der Autor mit AutorID = 2 angezeigt wird. Habs mit me.filter x-fach bei openform bei aktualisierung etc. probiert oder bei Datensatzherkunft mit "where" oder eine "wenn"Abfrage mit "..." erstellt.
Ursprung der Aktion:
Private Sub txtPasswort_AfterUpdate()
If StrComp(Nz(Me!txtPasswort, "U n G ü L T i G "), Nz(DLookup("Passwort", "tblAutor", "AutorID =" & Me!cboAutor), "NoPW"), 0) = 0 Then
DoCmd.OpenForm "frmgericht", , , "AutorID=" & Me.cboAutor.Value
DoCmd.OpenTable "tblanmeldeprotokoll"
DoCmd.GoToRecord , , acNewRec
Me.Autor2 = Me.cboAutor
Me.Anmeldedatum = Me.Anmeldedatum
DoCmd.Close acTable, "tblanmeldeprotokoll", acSaveYes
DoCmd.Close acForm, "frmAnmeldung"
Else
DoCmd.OpenForm "frmHauptmenu" 'oder andere Reaktion, z. B. Aufforderung zur neuen PW-Eingabe
End If
End Sub
Alles nur Katastrophe.
Vielen Dank schon mal
LG Hans
Hallo,
ZitatAlles nur Katastrophe.
in der Tat... ;D
Zitat...das Feld "Autor" (Kombi) so filtern, dass nur noch der Autor mit AutorID = 2 angezeigt wird....
Datensatzherkunft des Kombis:
Select AutorID, Autor_Name from tblAutoren Where AutorID = 2 order by Autor_NameIst mir aber unklar: Willst Du im Kombifeld "cboAutor" den Autor mit AutorID =2 anzeigen, obwohl Du schon einen ausgewählt hast
oder sollen lediglich die Gerichte, die der Autor mit AutorID = 2 gekocht hat ( es geht doch hier ums Kochen, oder?) nach erfolgreicher Passwort-Eingabe angezeigt und bearbeitet werden können?
Und Prozedur (was willst Du mit der Tabellenansicht anfangen?):
Private Sub txtPasswort_AfterUpdate()
If StrComp(Nz(Me!txtPasswort, "U n G ü L T i G "), Nz(DLookup("Passwort", "tblAutor", "AutorID =" & Me!cboAutor), "NoPW"), 0) = 0 Then
If Me!cboAutor = 2 Then
DoCmd.OpenForm "frmgericht", , , "AutorID=" & Me!cboAutor ' Die Zuweisungen und Springerei auf irgendwelche DS erfolgt im Formular!
Else
Docmd.Openform "frmHauptmenue"
End If
Else
DoCmd.Close
Application.Quit
End If
End Sub
Hallo Franz,
zunächst vielen Dank für Deine schnelle Antwort. Ich hatte gestern, von einer höheren "Instanz" ;), computerverbot, deshalb melde ich mich heute erst wieder. Ich habe mich da etwas missverständlich ausgedrückt. Es geht tatsächlich um ein Kochbuch.
If StrComp(Nz(Me!txtPasswort, "U n G ü L T i G "), Nz(DLookup("Passwort", "tblAutor", "AutorID =" & Me!cboAutor), "NoPW"), 0) = 0 Then
Hier läuft der Anmeldeprozess; dieser ergibt z.B. das Autor XY "also nicht zwingend "AutorID =2" am Werk ist. Dann soll das Formular "frmgericht" nach AutorID gefiltert geöffnet werden und nur die Datensätze von Autor XY editiert werden können und nur Autor XY DS anfügen kann. Was er ja macht mit:
DoCmd.OpenForm "frmgericht", , , "AutorID=" & Me.cboAutor.Value
Dafür brauche ich den gefilterten Autor im Kombifeld Autor in der TblGericht, dass er kein neues Rezept für einen anderen Autor eingeben kann.
Und Prozedur (was willst Du mit der Tabellenansicht anfangen?): Da will ich in der tblAnmeldeprotokoll den Autor XY automatisch eintragen, da ich wissen will wer in der DB wann editiert oder ändert.
Vielen Dank schon mal.
LG Hans
Hallo Franz,
wenn die Syntax in diesem Ausdruck stimmen würde, dann denk ich wäre das Problem gelöst.
Datensatzherkunft der Kombi im frmGericht
SELECT [tblAutor].[AutorID], [tblAutor].[Autor] FROM tblAutor where "AutorID ="& Me!cboAutor oder by autor
bislang zeigt er mit nur eine leere Kombi. :'( :'( :'(
Danke Hans
Hallo,
schreib so:
ZitatSELECT [tblAutor].[AutorID], [tblAutor].[Autor] FROM tblAutor where "AutorID =[cboAutor] order by autor
auch wenn ich mit dem Konzept nicht ganz konform gehe.
Opentable brauchst Du nicht, d. h. es wäre falsch. Genauso wenig ein Kombifeld (Nachschlagefeld) in der Tabelle.
Datenmanipulationen dürfen (sollen) nur über/mit Formulare/n geschehen, niemals in Tabellen(ansichten).
ZitatDa will ich in der tblAnmeldeprotokoll den Autor XY automatisch eintragen, da ich wissen will wer in der DB wann editiert oder ändert.
Das macht man doch nicht händisch... :o
Benutze das Form-Ereignis (von "frmGericht") "Nach Aktualisierung", um den Autor und die anderen nötigen Daten in die Protokoll-Tabelle zu schreiben. Der Autor-Name wurde in einer globalen Variablen ("pblAutorName") beim Login gespeichert
Es wird dabei ein DS nach jeder Änderung an den Daten im frmGericht angelegt.
Minimalistisch:
Sub Form_Afterupdate()
Currentdb.Execute " Insert into tblAnmeldeprotokoll set AutorName = '" & pblAutorName & "' , ProtDatum = Now()", dbFailOnError
End Sub
Hallo Franz,
im anschließendem Code habe ich meine erste Variable erstellt und wahrscheinlich wieder alles falsch gemacht:
Private Sub Form_AfterUpdate()
Public pblautor
pblautor = Me.cboAutor
End Sub
Diesen Code habe im "frmAnmeldung" eingefügt und gehofft, dass er pblautor eben mit der Auswahl füllt. Aber Pustekuchen.
In Deinem Code:
CurrentDb.Execute " Insert into tblAnmeldeprotokoll set Autor2 = '" & pblautor & "' , Anmeldedatum = Now()", dbFailOnError
meldet der Debugger "pblautor" ist leer.
Desweiteren ist die Kombi nach Aktualisierung der Selectanweisung, wie von Dir beschrieben, wieder leer. Geht da evtl. was über den gesetzten Filter der "frmGericht"?
Sorry aber ich weiß nur, dass ich nichts weiß. :'( :'( :'(
LG Hans
Hallo,
die Public-Variable muss in einem Standard-Modul (nicht Formular-Modul) deklariert werden:
Option Compare Database
Option Explizit
Public pblAutorName As String
Die Variable muss im Login-Formular auf den Namen des Users gesetzt werden:
Private Sub txtPasswort_AfterUpdate()
.
.
pblAutorName = Me!cboAutor.Column(1) ' Angenommen, der Name steht in der zweiten(!) Spalte des Kombis.
.
.
End Sub
Somit kann pblAutorName an jeder Code-Stelle in der DB verwendet werden.
Wenn ein DS nur beim Einloggen in das Protokoll geschrieben werden soll, dann reicht im frmAnmeldung:
.
.
CurrentDb.Execute " Insert into tblAnmeldeprotokoll set Autor2 = '" & Me!cboAutor.Column(1) & "' , Anmeldedatum = Now()", dbFailOnError
sofern auch hier der Einlog-Name in der zweiten Spalte des Kombis steht und das Tabellenfeld "Autor2" den Datentyp TEXT hat.
Hallo Franz,
nachdem ich gestern, warum auch immer, einen kleinen Supergau verursacht und die DB zurückgesetzt habe, werde ich mich nach dem Wiederherstellen des aktuellen Zustands wieder melden, wenn ich Deine Vorschläge abgearbeitet habe. Geht das mit der Public Variablen auch mit Zahl? Weil dann könnte man die Variable pblname auch für die Filterung meines Kombifeldes in frmGericht benutzen oder funktioniert die "Insert into" Anweisung nur mit "as string"?
Vielen Dank für Deine Hilfe.
LG Hans
Hallo,
selbstverständlich kann eine Variable, ob public oder local jeden verfügbaren Datentyp annehmen, so auch "Long".
Dies ist sogar das beste und geeignetste für Schlüsselfelder und deren Einsatz in Filter-Vorgängen, sofern auch in den Tabellen der gleiche Datentyp verwendet wird.
Zitat..könnte man die Variable pblname auch für ...
Dann sollte die Variable mit der Benamsung an deren inhaltliche Bedeutung angepasst werden ---> pblAutorID
Der (Pseudo-)Datentyp "Variant" hat eine Sonderstellung, derweil dieser alle anderen Datentypen (als "Unterdatentyp") "aufnehmen" und auch auf "NULL" (nz()-Funktion, IsNull()-Funktion) geprüft werden kann. Weiterhin sind alle Tabellenfelder und Steuerelemente bei ihrer Eigenschaft "Value" vom Datentyp Variant und anfänglich "NULL" , sofern sie aktuell "leer" sind und noch kein tatsächlicher Wert zugewiesen ist.
Vorsicht ist bei TEXT zu walten:
Me!MeinTextfeld = ""
ist
nicht das selbe wie
Me!MeinTextfeld =NULL
Hallo Franz,
vielen Dank für Deine prompte Antwort. Werde mich nach der Restaurierung meine Baustelle wieder melden.
LG Hans
Hallo Franz,
die Kombi krieg ich einfach nicht ordnungsgemäß gefiltert. Sie zeigt mit immer eine leere Kombi. Momentan habe ich bei Datensatzherkunft folgende Anweisung:
SELECT [tblAutor].[AutorID], [tblAutor].[Autor] FROM tblAutor where "autorID =" [pblautorID] oder by Autor;
Hab schon alles möglich probiert mit " und ohne mit [] und ohne, nichts hat geholfen. :'( :'(
die VBA Anweisung bezüglich pblautorID:
Private Sub txtPasswort_AfterUpdate()
If StrComp(Nz(Me!txtPasswort, "U n G ü L T i G "), Nz(DLookup("Passwort", "tblAutor", "AutorID =" & Me!cboAutor), "NoPW"), 0) = 0 Then
pblautorID = Me!cboAutor
DoCmd.OpenForm "frmgericht", , , "AutorID=" & Me.cboAutor.Value
...
Die Erstellung der Public Variablen in Modul Autor:
Option Compare Database
Option Explicit
Public pblautorID As Long
Durch das rumprobieren mit der Kombi, habe ich ein übles Chaos in meinen Tabellen angerichtet, was erst wieder repariert werden musste.
Vielen Dank für Deine Hilfe und Deine Geduld mit mir.
LG Hans
Hallo,
in einem Select-Statement kann nicht direkt Bezug auf eine globale VBA-Variable genommen werden.
Es ist dazu eine (auch globale) Funktion erforderlich, die den Wert der Public-Variablen zurückgibt:
In einem Standardmodul:
Public Function getPblAutorID()
getPblAutorID= pblAutorID
End Functionund im SQL-Statement:
ZitatSELECT [tblAutor].[AutorID], [tblAutor].[Autor] FROM tblAutor where autorID = getPblAutorID() order by Autor;
wobei ich denke, dass das alles etwas verknotet ist...
Wozu willst Du überhaupt das Kombi nach einem Autor filtern, wenn es zur Auswahl eines Autors gedacht ist?
Hallo Franz,
vielen Dank. Werde mich gleich an die Arbeit machen.
Wozu willst Du überhaupt das Kombi nach einem Autor filtern, wenn es zur Auswahl eines Autors gedacht ist?
Weil in diesem "edit-Modus" nur die Gerichte bearbeitet, sowie neue Rezepte erstellt werden dürfen, die genau der Autor der sich angemeldet hat, die Erlaubnis dazu hat. An anderer Stelle suche ich, mittels einer Abfrage nach verschiedenen Filterfunktionen, aus allen Rezepten mit allen Autoren die für den User interresanten Rezepte, die er zwar filtern ansehen und drucken kann aber eben NICHT bearbeiten.
Nochmal vielen Dank.
LG Hans
Hallo,
ZitatWeil in diesem "edit-Modus" nur die Gerichte bearbeitet, sowie neue Rezepte erstellt werden dürfen, die genau der Autor der sich angemeldet hat, die Erlaubnis dazu hat.
Das hat aber nichts mit dem Filtern des Kombis zu tun...
Vermutlich schießt Du so durch die Brust ins Auge... ;)
Hallo Franz,
das Kombi funktioniert, nach weglassen der "" bei AutorID, jetzt. ;D ;D ;D
Auch wenn ich ins Auge durch die Brust schieße. ;)
An das Ausfüllen des Anmeldeprotokolls mache ich mich Morgen.
Vielen Dank
LG Hans
Hallo,
ja, sorry, sowas passiert schon mal beim Kopieren und Luftcode.... 8)
Hallo Franz,
nix Sorry, ich darf auch mitdenken und mitarbeiten, wo Du eh schon so viele Lösungen zu "meiner" DB beigetragen hast.
Das "Insert Into" bei der tblAnmeldeprotokoll konnte ich leider noch nicht lösen. Die Funktion dbfailonerror() meldet Fehlercode 128 was, meiner Recherche nach anzeigt, dass die Daten, die angefügt werden sollen vom Datentyp her nicht kompatibel sind.
Meine Tabelle beinhaltet drei Felder: AnmeldeID; Automatisch, Autor2; Zahl (Kombi) verknüpft mit Autor, Anmeldedatum; Datum mit Uhrzeit. Mit diesem Code wollte ich lt. Deiner Empfehlung
das nun aktualisieren:
'Private Sub Form_AfterUpdate()
'CurrentDb.Execute "Insert into tblAnmeldeprotokoll set Autor2 = '& pblautorID' & , Anmeldedatum = Now()", dbFailOnError
'End Sub
Ich hab auch versucht die Funktion getpblautorid() einzusetzen aber wahrscheinlich hakt es wieder an der Syntax. Glaube bitte nicht, das ich wegen jedem Sch... ,ich Dich hier konsultiere, aber aus einem VBA-Konstrukt, bestehend aus 1 Seite Quellcode, kann ich leider nichts herauslesen, dass für mich verständlich ist.
Übrigens glaube ich, dass ich nach der Lösung dieser Aktion das Kochbuch fertig habe. Was die Praxis noch beweisen muss.
Vielen Dank.
LG Hans
Hallo,
naja, wenn die Meldung schon einen Datentyp-Konflikt meldet, dann sollte das ernst genommen werden .. ;)
Was beinhaltet denn das Tabellenfeld "Autor2" und welchen Datentyp hat es?
Wenn es einem Long-Wert (Fremdschlüsselwert) aufnehmen soll, dann müssen die Hochkommata entfernt werden, denn die kennzeichnen ja einen Text (Literal)
CurrentDb.Execute "Insert into tblAnmeldeprotokoll set Autor2 = " & pblautorID & ", Anmeldedatum = Now()", dbFailOnError
Wenn da aber der Name des Autor drinstehen soll (---> Datentyp TEXT) , dann bleiben die Hochkommata bestehen, allerdings sollte die pbl-Variable dann auch einen TEXT (Autorname) beinhalten. Auf diesen Fall weist aber die Fehlermeldung nicht hin...
Irgendwie geht aber die Benamsung, bzw. die Beschreibung etwas durcheinander..
Wenn "Autor2" das Fremdschlüsselfeld für den ID-Wert des Autors ist, dann sollte es auch so benannt werden:
"AutorID_F" (Autorid_Fremdschlüssel)
oder
"AmP_AutorID" (AnmeldeProtokoll_AutorID)
oder
ähnlich, um es genau zuordnen zu können.
Hallo Franz,
vielen Dank für die schnelle Antwort. Werde mich am WE darum kümmern.
LG Hans
Hallo Franz,
ich am WE rumprobiert an der Benamsung de Fremdschlüssels etc. und leider zu keiner Lösung gekommen. Dann habe ich recheriert und folgendes gefunden:
' Private Sub Form_AfterUpdate()
' SELECT Autor2, Autor
' FROM tblAnmeldeprotokoll INNER JOIN tblAutor
' ON tblAnmeldeprotokoll.Autor2 = tblAutor.Autor2
' CurrentDb.Execute "Insert into tblAnmeldeprotokoll set Autor2 = &tblAutorID" , Anmeldedatum = Now()", dbFailOnError
' End Sub
Leider funktioniert da gar nichts(alles rot), liegt aber wohl daran, dass ich keine Ahnung habe wie man sowas einbindet.
Vielen Dank für Deine Bemühungen
LG Hans
Insert into ... set ...
Wo soll das funktionieren?
Zeilen einfügen mit INSERT (https://www.sql-und-xml.de/sql-tutorial/insert-zum-einfuegen-von-zeilen.html)
Zeilen bearbeiten mit UPDATE (https://www.sql-und-xml.de/sql-tutorial/update-aktualisieren-der-zeilen.html)
Es wäre schon zielführender, sich an die zutreffende Syntax für die gewählte Abfrage zu halten, zzgl. der Vermeidung von Datentyp- und anderen Fehlern.
Hallo Eberhard,
vielen Dank für die Links. Mache mich sofort an die Arbeit.
LG Hans
Hallo Eberhard,
da ich ein absoluter Anfänger in Sachen VBA bin und nachdem ich Deine Links studierte, habe ich nun folgendes ausprobiert:
Private Sub Form_AfterUpdate()
CurrentDb.Execute "Insert into tblAnmeldeprotokoll set Autor2 = &tblAutorID& , Anmeldedatum = Now()from tblAnmeldeprotokoll inner join tblAutor on Autor2 = AutorID", dbFailOnError
End Sub
allerdings meldet der Debugger Laufzeitfehler 3134 bei Insert into, was auf einen Syntaxfehler hinweist, den ich aber nicht finden kann. Ich hoffe, dass wenigstens der Lösungsansatz einigermaßen richtig ist.
Vielen Dank für Eure Hilfe
Lg Hans
Hallo,
insgesamt ist hier zwischenzeitlich Einiges durcheinander gekommen. Das Insert-Statement stimmt hinten und vorne nicht.
Wenn in "tblAnmeldeprotokoll" eine Historie gespeichert werden soll:
Private Sub Form_AfterUpdate()
CurrentDb.Execute "Insert into tblAnmeldeprotokoll ( Autor2, Anmeldedatum) Values(" & pblAutorID & " , Now() )", dbFailOnError
End Sub
wenn "Autor2" in "tblAnmeldeprotokoll" vom Datentyp Long ist und den Primärschlüsselwert des Autors aus Tabelle "tblAutor", der in der globalen Variablen "pblAutorID" gespeichert ist, aufnehmen soll.
Now() beinhaltet zudem das Datum und die Uhrzeit. Sofern nur das Datum benötigt wird, ist Date() einzusetzen.
Ein Join mit "tblAutor" ist nicht erforderlich.
Hallo Franz,
vielen Dank für Deine Antwort. Habe es eben mit copy and paste ausprobiert, aber leider ohne Erfolg. Der Debugger zeigt mir die richtige ID in "pblautorID", aber auch die 128 bei dbFailOnError. Wenn ich die Anführungszeichen bei "pblAutorID" wegnehme zeigt noch nicht einmal mehr die aktuelle ID. Die tblAutor hat den richtigen Bezug zu tblAnmeldeprotokoll (von AutorID zu Name2) und das Feld Autor2 ist vom Typ "Zahl" mit nachschlagen in TblAutor. Es tut mir leid, Dich schon wieder damit zu belästigen.
Vielen Dank für Deine Mühe.
LG Hans
Hallo,
lad die DB mal hier hoch, datenreduziert/anonymisiert, komprimiert/repariert und gezippt.
ZitatDie tblAutor hat den richtigen Bezug zu tblAnmeldeprotokoll (von AutorID zu Name2)
Was ist jetzt "Name2"?
Zitatund das Feld Autor2 ist vom Typ "Zahl" mit nachschlagen in TblAutor.
Wirf endlich mal das Nachschlagefeld (Kombifeld) aus der
Tabelle heraus und benenne das Fremdschlüsselfeld in Tabelle "tblAnmeldeprotokol" in "AutorID_f" (Datentyp Long) um !
Hallo Franz,
habe die tblAnmeldeprotokoll nach Deinen Anweisungen umgestellt und schon funktionierts ;D. Habe im Nachgang ein Query erstellt, das mir das Ganze in "Text" anzeigt. Funktioniert. ;D
Vielen, vielen Dank für Deine Bemühungen und Deine Geduld mit mir. Kann ich Dir was Gutes tun? Flasche Wein oder ähnliches?
Vielen Dank auch an Eberhard.
LG Hans
Hallo,
die Ratschläge, die Du hier bekommst, sind doch gar nicht bezahlbar... ;)