online 1
gast (50)

/ Forum / Datenbanken

DatenbankenDatenbanken

Fragevon jimmy81 vom 11.10.2019, 19:56 Options

Tabellen, Berichte in Listenfeld/Kombifeld

Hallo

Kann mir jemand sagen wie ich meine Tabellen Abfragen usw. in einem Listenfeld oder Kombifeld integrieren kann.
Alle Tabellen sollen in Listen-/Kombifeld 1
Alle Berichte sollen in Listen-/Kombifeld 2
dazu sollen sie auch anklickbar sein sodass die Tabelle usw. sich öffnet.

Gibt es dazu ein VBA-Code oder soetwas ?
Wer kann mir helfen?

Gruß und Danke !!


Antwort schreiben

Antwort 1 von Marie vom 11.10.2019, 21:37 Options

hi, sollen die Tabellen und berichtsnamen automatisch eingelesen werden?

Antwort 2 von Marie vom 11.10.2019, 22:06 Options

Wenn Du bei jedem Öffnen neu einlesen willst, dann kannst Du zum Beispiel die Tabellennamen beim Öffnen des Formulars mit der Kombi immer neu einlesen in eine Hilfstabelle namens "tblTabellenNamen":


DoCmd.RunSQL "DELETE * FROM tblTabellenNamen"


Set rst = CurrentDb.OpenRecordset("tblTabellenNamen")
Set Cont = CurrentDb.Containers("Tables")


For I = 0 To Cont.Documents.Count - 1
Set Doc = Cont.Documents(I)
If Left(Doc.Name, 4) <> "MSys" Then ' keine Systemtabellen
rst.AddNew
rst!Name = Doc.Name
rst.UPDATE
End If
Next I


rst.Close


Die Hilfstabelle nimmst Du dann als Datensatzherkunft fuer das Kombi.

Antwort 3 von jimmy81 vom 12.10.2019, 17:56 Options

Danke für die schnelle Meldung

Ich kann da nicht ganz folgen.
Ich soll noch eine Hilfstabelle anfertigen?

Und wo soll ich den Code einfügen.

Bitte um genaue anweisung!

Danke und Gruß

Antwort 4 von Marie vom 13.10.2019, 04:04 Options

bitte erstmal genau lesen und meine Fragen bantworten. Sollen die tabellen und berichte jedesmal neu eingelesen werden?? hatte ich gefragt.

Wenn ja, dann hier der Code zum Einlesen der tabellen, entsprechend geht das auch mit den berichten, aber falls die nicht eingelesn werden sollen, dann hab ich mir die Mühe umsonst gemacht, weil Du nicht geantwortet hattest.

Du legst eine leere tabelle an namens tblTabellenNamen und dort ein Textfeld namens tblName. Dann kopierst Du den untenstehenden Code in dein Formular, auf dem das kombifeld hinsoll. mach das mal erst soweit und schau dann wie die tabellen eingelesen werden. Diese tabelle ist dann deine datenherkunft dür dein kombifeld.

Beim Öffnen des Formulares auf dem Das Kombifeld ist, sollst Du jedesmal die Tabellen und berichte neu einlesen.

Der Code zum Einlesen der tabellen:
Private Sub Form_Open(Cancel As Integer)

Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim cont As Container
Dim doc As Document
Dim i As Integer


DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE * FROM tblTabellenNamen"
DoCmd.SetWarnings True

Set db = CurrentDb()
Set rst = db.OpenRecordset("tblTabellenNamen")
Set cont = db.Containers("Tables")


For i = 0 To cont.Documents.Count - 1
Set doc = cont.Documents(i)
If Left(doc.Name, 4) <> "MSys" Then ' keine Systemtabellen
rst.AddNew
rst!tblName = doc.Name
rst.Update
End If
Next i


rst.Close
End Sub

Antwort 5 von jimmy81 vom 13.10.2019, 17:12 Options

Danke für den Code und die ausführbare Beschreibung

Soweit hat alles geklappt.
Seltsam ist das ich nicht nur die Tabellennamen sondern auch jede Menge andere Sachen geladen bekomme, mit verschiedenen Vorzeichen.
z.B: ~sq_cFormular1~sq_cKunden1

Außerdem läst sich das ausgewählte Objekt nicht starten/öffnen
Hab ich was vergessen?

Danke im Voraus.

Gruß

Antwort 6 von Marie vom 14.10.2019, 02:02 Options

also jimmy, zuerst öffneste jetzt mal das Formular mit dem code in der Entwurfsansicht und klickst dann auf den menüpunkt
extras,
datenbank-Dienstprogramme,
datenbank komprimieren.

Das solltest Du immer machen wenn Du Code geschrieben hast, Dann sind die temporären Tabellen mit dem ~sq wie vom Erdboden verschwunden.

gruß marie

der rest folgt danach weil wenn Du viel text hast beantwortest Du keine Fragen siehe oben.

Antwort 7 von Marie vom 14.10.2019, 02:08 Options

Nu frag ich Dich zum dritten mal ob die tabellen und berichte jedesmal neu eingelesen werden sollen, gib mir bitte ein einziges mal Antwort!!! Wenn Ja schick ich dir gleich noch den Code für die berichte, wenn nicht kannste die berichtsnamen ja per hand in eine neue tabelle eintragen und entsprechend wie die tabellen als Datensatzherkunft in das kombo eintragen.

Gleich gehts weiter

gruß marie

Antwort 8 von Marie vom 14.10.2019, 02:19 Options

also erstmal noch eine Korrektur, hab jetzt ausprobiert, diese temporären Dateien erscheinen jedes zweite mal neu, also änderst Du den Code folgendermaßen:

Nur in der zeile If Left(doc.name, 4) <> "MSys" ändern oder rauskopieren wie unten:

If Left(doc.name, 4) <> "MSys" And Left(doc.name, 1) <> "~" Then ' keine Systemtabellen und keine temporären

Antwort 9 von Marie vom 14.10.2019, 02:42 Options

So, dann machst Du auf dieses Formular dein Kombifeld1 mit den Tabellen:

Als datensatzherkunft musst Du jetzt noch den Tabellennamen ausfiltern von der Tabelle mit den namen drin:


SELECT DISTINCTROW tblTabellenNamen.tblName
FROM tblTabellenNamen
WHERE (((tblTabellenNamen.tblName)<>"tblTabellenNamen"));

und dann nach Aktualisierung die angeklickte Tabelle öffnen:

Private Sub Kombifeld1_AfterUpdate()

Dim strMeinetabelle As String

strMeinetabelle = Me![Kombifeld1]

DoCmd.OpenTable strMeinetabelle, acNormal, acEdit

End Sub

Antwort 10 von Marie vom 14.10.2019, 03:06 Options

Huch sorry, schon wieder einen Fehler entdeckt.

es wurden nicht nur die Tabellen eingelesen, sondern auch die Abfragen und eine Abfrage kannste natürlich nicht öffnen mit DoCmd.OpenTable.

nun war aber deine Ausgangsfrag so ungenau, dass ich nicht weiss, ob Du auch die Abfragen willst, Denn Du schriebst ja: "Kann mir jemand sagen wie ich meine Tabellen Abfragen usw."

Also falls es beides sein soll, sowohl tabellen, als auch Abfragen, dann ändere den Code so:

Private Sub Kombifeld1_AfterUpdate()

Dim strMeinetabelle As String

strMeinetabelle = Me![Kombifeld1]
Err = 0
On Error Resume Next
DoCmd.OpenTable strMeinetabelle, acNormal, acEdit
If Err > 0 Then
Err.Clear
DoCmd.OpenQuery strMeinetabelle, acNormal, acEdit
End If

End Sub


Andernfalls musst Du bitte jetzt mal genau sagen was Du haben willst, bevor ich noch länger hier umsonst rumprobiere und es ist doch nicht das was Du willst.

gruß marie

Antwort 11 von jimmy81 vom 16.10.2019, 16:51 Options

Hi Marie

Danke für die umfangreiche Arbeit die du dir machst.

Mein Ziel ist es alle Tabellen --> Kombifeld1
Abfragen -->Kombifeld2
Berichte --> Kombifeld3
Formulare --> Kombifeld4

Die Inhalte der Kombifelder sollen jedesmal neu eingelesen werden, damit falls ein neues Objekt erstellt wird, es auch in der Kombi sichtbar wird.

Außerdem sollten die Tabellen,Abfragen,Berichte und Formulare beim auswählen auch geöffnet werden.

Mfg

Antwort 12 von Marie vom 16.10.2019, 23:50 Options

Wenn Du es ausprobiert hättest, dann hättest Du aber doch gemerkt, dass das genau das ist, was Du wolltest. Nur die tabellen und Abfragen waren in einem kombifeld. Also dann auf ein neues:

Eigentlich hättest Du ja jetzt mal selbst probieren können und dann fragen wenn du hängenbleibst.
Also dann nimmst Du nicht das Containerobjekt, sondern Qdf und tdf, damit wir Tabellen und Abfragen unterscheiden können.

Du hast jetzt ne ganze Menge unterschiedliche Möglichkeiten, hier mal eine davon:

machst eine Tabelle mit einem Feld namens tblName und kopierst die dreimal und nennst die tabellen:

tempTabellenNamen
tempQuerynamen
tempReportNamen
tempFormsNamen

dann datensatzherkunft:
Kombifeld1:
SELECT DISTINCTROW tempTabellenNamen.tblName FROM tempTabellenNamen;
Kombifeld2:
SELECT DISTINCTROW tempQueryNamen.tblName FROM tempQueryNamen;
Kombifeld3:
SELECT DISTINCTROW tempReportNamen.tblName FROM tempReportNamen;
Kombifeld4:
SELECT DISTINCTROW tempFormsnamen.tblName FROM tempFormsnamen;

Dann kopierst Du den folgenden Code in dein Formular mit den 4 Kombifeldern (ne fehlerroutine kannste dir dann selbst noch dazuschreiben):

Option Compare Database
Option Explicit

Private Sub Form_Open(Cancel As Integer)

Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim cont As Container
Dim doc As Document
Dim qdf As QueryDef
Dim tdf As TableDef
Dim i As Integer
Dim zahl As Integer

'alle Tabellen leeren
DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE * FROM tempTabellenNamen"
DoCmd.RunSQL "DELETE * FROM tempQueryNamen"
DoCmd.RunSQL "DELETE * FROM tempReportNamen"
DoCmd.RunSQL "DELETE * FROM tempFormsNamen"
DoCmd.SetWarnings True


Set db = CurrentDb()

For zahl = 1 To 4
If zahl = 1 Then 'Tabellen einlesen
Set rst = db.OpenRecordset("tempTabellenNamen", dbOpenDynaset)
For Each tdf In db.TableDefs
If Left(tdf.name, 4) <> "MSys" And Left(tdf.name, 1) <> "~" And Left(tdf.name, 4) <> "temp" Then
rst.AddNew
rst!tblName = tdf.name
rst.Update
End If
Next tdf
ElseIf zahl = 2 Then 'Abfragen einlesen
Set rst = db.OpenRecordset("tempQueryNamen", dbOpenDynaset)
For Each qdf In db.QueryDefs
If Left(qdf.name, 1) <> "~" Then
rst.AddNew
rst!tblName = qdf.name
rst.Update
End If
Next qdf
ElseIf zahl = 3 Then
Set rst = db.OpenRecordset("tempReportNamen")
Set cont = db.Containers("Reports")
ElseIf zahl = 4 Then
Set rst = db.OpenRecordset("tempFormsNamen")
Set cont = db.Containers("Forms")
End If

If zahl > 2 Then
For i = 0 To cont.Documents.Count - 1
Set doc = cont.Documents(i)
If doc.name <> Me.name Then
rst.AddNew
rst!tblName = doc.name
rst.Update
End If
Next i
End If

rst.Close
Set rst = Nothing
Next zahl

db.Close
End Sub


Private Sub Kombifeld1_AfterUpdate()

Dim strAuswahl As String
strAuswahl = Me![Kombifeld1]
DoCmd.OpenTable strAuswahl, acNormal, acEdit
End Sub
Private Sub Kombifeld2_AfterUpdate()

Dim strAuswahl As String
strAuswahl = Me![Kombifeld2]
DoCmd.OpenQuery strAuswahl, acNormal, acEdit
End Sub
Private Sub Kombifeld3_AfterUpdate()

Dim strAuswahl As String
strAuswahl = Me![Kombifeld3]
DoCmd.OpenReport strAuswahl, acViewPreview
End Sub
Private Sub Kombifeld4_AfterUpdate()

Dim strAuswahl As String
strAuswahl = Me![Kombifeld4]
DoCmd.OpenForm strAuswahl
End Sub

Antwort 13 von jimmy81 vom 17.10.2019, 16:11 Options

Danke für die Mühe

ich wärd es mal bei gelegenheit ausprobieren,

mfg

Antwort 14 von jimmy81 vom 19.10.2019, 12:03 Options

Hat alles wunderbar geklappt
nochmals Danke

mfg

Antwort 15 von erik vom 19.10.2019, 15:52 Options

Hallo,

die geforderten Informationen befinden sich alle in der versteckten Systemtabelle MSysObjects. Mit den Abfragen aus dem u.g. Link liest du alle Daten aus, die du brauchst.

http://www.software-chuchi.ch/praxis/microsoft_access_vorhandene_da...

Bei Bedarf sollte der dortige Filter für die Abfragen noch erweitert werden, um die temporären Abfragen "~sq_" zu unterdrücken.

Wenn du diese Abfragen an Listenfelder bindest, dann brauchst du als einzigen VBA-Code nur ein Requery, wenn sich was ändert.

Gruß
erik

Ähnliche Themen

aktualisiertes Listenfeld in Excel
DiBor  15.04.2007 - 181 Hits - 1 Antwort

Kombifelder einfügen
Bollerkohl  28.12.2007 - 94 Hits - 1 Antwort

Autovervollständigen im Dropdown-Listenfeld
123letterman  04.04.2008 - 141 Hits - 1 Antwort

Hinweis

Diese Frage ist schon etwas älter, Sie können daher nicht mehr auf sie antworten. Sollte Ihre Frage noch nicht gelöst sein, stellen Sie einfach eine neue Frage im Forum..

Neue Einträge

Version: supportware 1.9.150 / 10.06.2022, Startzeit:Thu Jan 8 21:07:44 2026