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