Neuigkeiten:

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

Mobiles Hauptmenü

Kombifeld nach Formularfilter filtern

Begonnen von koch, April 11, 2020, 21:27:36

⏪ vorheriges - nächstes ⏩

koch

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

DF6GL

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


Ist 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
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

koch

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

koch

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

DF6GL

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
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

koch

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

DF6GL

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.


Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

koch

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

DF6GL

#8
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
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

koch

Hallo Franz,
vielen Dank für Deine prompte Antwort. Werde mich nach der Restaurierung meine Baustelle wieder melden.
LG Hans

koch

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

DF6GL

#11
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 Function


und 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?
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

koch

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

DF6GL

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...  ;)
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

koch

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