August 03, 2021, 17:24:17

Neuigkeiten:

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


Mit VBA eine Tabelle im Backend erstellen über Frontend

Begonnen von TerraAOC, Juni 08, 2021, 07:47:38

⏪ vorheriges - nächstes ⏩

TerraAOC

Wieso ein . ? Ich habe die CSV verknüpft, die Datei heißt nicht .csv die heißt komplett anders. Es geht mir hier um den Namen der Accessverknüpfung.

PhilS

Zitat von: TerraAOC am Juni 14, 2021, 13:56:45Konnte das Objekt "TesttabelleCSV" nicht finden.....

Dabei ist die Tabelle als CSV verknüpft und soll jetzt als Tabelle im Backend erstellt werden.
Der Programmcode verknüpft eine bestehende Access-Tabelle aus dem Backend in dein Frontend.

Wenn ich dem Thread folgen konnte, war das auch deine Ausgangssituation vor dem Verknüpfen der Tabelle.
Access DevTools - Find and Replace
Komfortables Suchen und Ersetzen in den Entwurfseigenschaften von Access-Objekten. In Abfragen, Formularen, Berichten und VBA-Code - Überall und rasend schnell!

Beaker s.a.

--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

TerraAOC

ZitatDer Programmcode verknüpft eine bestehende Access-Tabelle aus dem Backend in dein Frontend.
Wie kann ich denn dann die angehängte CSV zu einer lokalen Tabelle machen und die dann ins Backend verschieben?

Oder soll ich einfach wie vorher meine Tabelle im Frontend erstellen lassen (ohne anhängen der CSV) und die dann mit dem Code ins Backend schieben?

TerraAOC

Guten Tag ich nochmal,
in der Theorie würde das so funktionieren wie ich es jetzt mache, wenn ich aber
            DoCmd.TransferText acImportDelim, "CSV Import", "TesttabelleLokal", "Q:\Export\Testtabelle.txt", True, ""ausführe, wird mir die erstellte Tabelle erst angezeigt wenn ich das Frontend neu öffne. Dadurch kann der Rest von meinem Code die Tabelle TesttabelleLokal nicht finden.
Gibt es eine möglichkeit die Tabellenanzeige zu "refreshen"? Ansonsten muss ich den Code irgendwie Access neustarten lassen, was auch extrem Zeit kostet.

PhilS

Zitat von: TerraAOC am Juni 15, 2021, 11:05:37in der Theorie würde das so funktionieren wie ich es jetzt mache, wenn ich aber
            DoCmd.TransferText acImportDelim, "CSV Import", "TesttabelleLokal", "Q:\Export\Testtabelle.txt", True, ""ausführe, wird mir die erstellte Tabelle erst angezeigt wenn ich das Frontend neu öffne. Dadurch kann der Rest von meinem Code die Tabelle TesttabelleLokal nicht finden.
Das ist eher ungewöhnlich. I.d.R. sollte der Programmcode unabhängig von der Anzeige der Tabellen sein.
Die Anzeige in der Navigation Pane kannst du so aktualisieren:
Application.RefreshDatabaseWindow
Wenn du irgendwo eine bestehende Dao.Database-Variable hast, die von der neuen Tabelle nichts mitbekommen hat, dann probier mal:
deineDbVariable.TableDefs.Refresh
Access DevTools - Find and Replace
Komfortables Suchen und Ersetzen in den Entwurfseigenschaften von Access-Objekten. In Abfragen, Formularen, Berichten und VBA-Code - Überall und rasend schnell!

TerraAOC

Ich verstehe das nicht, meine Tabelle ist vorhanden, aber Access sagt die Tabelle ist nicht vorhanden.


Hier nochmal der komplette Code, nach einem Klick in der MSGBox auf Ja, soll das passieren, Access sagt aber jedesmal das es die Tabelle nicht gibt, obwohl es die gibt
        Case vbYes
            DoCmd.DeleteObject acTable, "ImporttabelleLokal"
            DoCmd.TransferText acImportDelim, "Import1", "ImporttabelleLokal", "U:\Importe\ImportCSV.txt", True, ""
           
           
            Application.RefreshDatabaseWindow
           
            db.TableDefs.Refresh
           
            Tabellenname = "Meine_Tabelle"       'Name der Tabelle
            Name_Quelltabelle = "externe_Tabelle" 'Name der Originaltabelle

            'MS Access DB
            Verbindungsinformation = ";DATABASE=C:\Users\ImportTest_be.accdb"
            'Datenbankobjekt ermitteln
            Set db = CurrentDb

            'Neues Tabellenobjekt anlegen
            Set neue_Tabelle = db.CreateTableDef
            neue_Tabelle.SourceTableName = "ImporttabelleLokal" 'Name der Quelltabelle
            neue_Tabelle.Name = "Importtabelle" 'Tabellenname festlegen
            neue_Tabelle.Connect = Verbindungsinformationen 'Verbindungsinformation festlegen
           
            'Tabelle anlegen
            db.TableDefs.Append neue_Tabelle
            db.TableDefs.Refresh

            'Speicher freigeben
            Set db = Nothing

PhilS

Zitat von: TerraAOC am Juni 21, 2021, 08:17:25[...]Access sagt aber jedesmal das es die Tabelle nicht gibt, obwohl es die gibt
        Case vbYes
            DoCmd.DeleteObject acTable, "ImporttabelleLokal"
In deinem Screenshot steht: DoCmd.DeleteObject acForm, "ImporttabelleLokal"
?

Außerdem ist ein grundsätzlicher Logikfehler in deinem Lösungsansatz.
Du importierst erst die CSV-Datei in dein Frontend (DoCmd.TransferText), dann versuchst du eine gleichnamige Tabelle ("ImporttabelleLokal") aus dem Backend in das Frontend zu verknüpfen (db.CreateTableDef).

Rein technisch könnte das zwar so funktionieren, aber ich bin mir recht sicher, dass das nicht deine Absicht ist.
Access DevTools - Find and Replace
Komfortables Suchen und Ersetzen in den Entwurfseigenschaften von Access-Objekten. In Abfragen, Formularen, Berichten und VBA-Code - Überall und rasend schnell!

TerraAOC

Egal ob da acForm oder acTable steht, das ändert nichts am Fehlerbild.

ZitatDu importierst erst die CSV-Datei in dein Frontend (DoCmd.TransferText), dann versuchst du eine gleichnamige Tabelle ("ImporttabelleLokal") aus dem Backend in das Frontend zu verknüpfen (db.CreateTableDef).

Ich möchte es anders rum machen, ich hole mir die CSV Datei in mein Frontend und erstelle mir mit DoCmd.TransferText die Tabelle ImporttabelleLokal im Frontend, danach soll mit dem restlichen Code die ImporttabelleLokal im Backend erstellt werden unter einem anderen Namen und dann soll die Tabelle vom Back ins Frontend verknüpft werden und die Lokal soll im Frontend gelöscht werden.

PhilS

Zitat von: TerraAOC am Juni 21, 2021, 10:24:41Egal ob da acForm oder acTable steht, das ändert nichts am Fehlerbild.
Bei acForm wäre der Fehler logisch und zu erwarten.
Für den Fehler bei acTable habe ich keine Erklärung. - Ich würde da nochmal ganz genau prüfen, ob die Tabelle auch in dem Moment wo es zum Fehler kommt wirklich existiert und nicht bereits vorher z.B. durch anderen Code gelöscht wurde.

Zitat von: TerraAOC am Juni 21, 2021, 10:24:41Ich möchte es anders rum machen, ich hole mir die CSV Datei in mein Frontend und erstelle mir mit DoCmd.TransferText die Tabelle ImporttabelleLokal im Frontend, danach soll mit dem restlichen Code die ImporttabelleLokal im Backend erstellt werden unter einem anderen Namen und dann soll die Tabelle vom Back ins Frontend verknüpft werden und die Lokal soll im Frontend gelöscht werden.

Wir drehen uns hier im Kreis.
Schon zu Beginn dieses Threads haben dir mehrere Leute erklärt, dass dieser Ansatz eher ungewöhnlich und schwierig zu realisieren ist. - Warum du diesen (unnötig?) komplizierten Ansatz unbedingt weiter verfolgen willst, hast du bisher nicht erklärt.
Vorgeschlagene Lösungsansätze, wie du es trotz der komplizierten Anforderungen umsetzen kannst (Z.B.: IN '...\Backend.accdb' ) hast du inzwischen scheinbar wieder über Bord geworfen.

Ich weiß langsam nicht mehr, wie ich dir hier weiterhelfen soll.
Access DevTools - Find and Replace
Komfortables Suchen und Ersetzen in den Entwurfseigenschaften von Access-Objekten. In Abfragen, Formularen, Berichten und VBA-Code - Überall und rasend schnell!

TerraAOC

Du kannst mir weiterhelfen indem du mir eine Anfängerfreundliche Hilfe gibst.
Ich habe außerdem alles von den anderen Seiten dieses Threads ausprobiert.
Ich habe es mit DBEngine versucht, da wurde mir aber nicht weitergeholfen wie ich diese Verbindung dann nutze.
Ich habe versucht die CSV anzuhängen, das hat geklappt, danach weiß ich nicht weiter.
Und SQL ist mir zu kompliziert, keine Ahnung wo ich bei dem SQL aus #6
SELECT Nachname, Geburtsdatum INTO Test IN 'X:\PfadBackend\Backend.accdb'
FROM VerlinkteCSV
ansetzen soll.
Und da ich nach sehr langem Googlen und Ergebnisse durchklicken dann den Code aus #24 gefunden habe dachte ich "jetzt habe ich es endlich und es funktioniert" aber dann wird die erstellte Tabelle im Frontend nicht vom Code gefunden.

Das Problem scheint sich aber auch in Luft aufgelöst zu haben, denn jetzt bekomme ich drei Zeilen weiter einen Fehler

Laufzeitfehler 91
"Objekt oder With Blockvariable nicht festgelegt"

Der Debugger markiert mir da die Zeile mit db.TableDefs.Refresh
Hier nochmal der Code:
Case vbYes
            DoCmd.DeleteObject acTable, "ImporttabelleLokal"
            DoCmd.TransferText acImportDelim, "Import", "ImporttabelleLokal", "U:\Importe\ImportCSV.txt", True, ""
           
           
            Application.RefreshDatabaseWindow
           
            db.TableDefs.Refresh
           
            Tabellenname = "Meine_Tabelle"       'Name der Tabelle
            Name_Quelltabelle = "externe_Tabelle" 'Name der Originaltabelle
           
            'MS Access DB
            Verbindungsinformation = ";DATABASE=C:\Users\Importtest_be.accdb"
            'Datenbankobjekt ermitteln
            Set db = CurrentDb
           
            'Neues Tabellenobjekt anlegen
            Set neue_Tabelle = db.CreateTableDef
            neue_Tabelle.SourceTableName = "ImporttabelleLokal" 'Name der Quelltabelle
            neue_Tabelle.Name = "Importtabelle" 'Tabellenname festlegen
            neue_Tabelle.Connect = ";DATABASE=C:\Users\Importtest_be.accdb" 'Verbindungsinformation festlegen
           
            'Tabelle anlegen
            db.TableDefs.Append neue_Tabelle
            db.TableDefs.Refresh
           
            'Speicher freigeben
            Set db = Nothing
           
        Case vbNo
            Exit Sub

Bitte helft mir es so umzusetzen, ich finde es so viel praktischer und übersichtlicher als mit kompliziertem SQL oder angehängter CSV.
Ihr könnt mir auch sagen wie ich die Verbindung mit DBEngine nutze, falls das leichter ist.

Danke schon mal.

PhilS

Zitat von: TerraAOC am Juni 22, 2021, 10:32:21Du kannst mir weiterhelfen indem du mir eine Anfängerfreundliche Hilfe gibst.
Das versuchen alle hier Antwortenden hier seit geraumer Zeit.
Die anfängerfreundliche Empfehlung war und ist: Mach es anders, das ist viel einfacher.
Du bestehst auf deinem komplizierteren Lösungsansatz. Die Antworten dazu sind komplizierter. Das liegt aber nicht daran, dass man dir hier nicht anfängerfreundlich helfen will, sondern daran dass du dir einen komplizierten Lösungsweg ausgesucht hast.

Bitte beantworte eine Frage: Ändert sich das Format der CSV-Dateien von Datei zu Datei?


Zitat von: TerraAOC am Juni 22, 2021, 10:32:21Und SQL ist mir zu kompliziert, keine Ahnung wo ich bei dem SQL aus #6
SELECT Nachname, Geburtsdatum INTO Test IN 'X:\PfadBackend\Backend.accdb'
FROM VerlinkteCSV
ansetzen soll.
In #20 hattest du geschrieben, dass das im Prinzip (etwas anderes SQL) bei dir funktioniert.

Zitat von: TerraAOC am Juni 22, 2021, 10:32:21Das Problem scheint sich aber auch in Luft aufgelöst zu haben, denn jetzt bekomme ich drei Zeilen weiter einen Fehler

Laufzeitfehler 91
"Objekt oder With Blockvariable nicht festgelegt"
Das ursprüngliche Problem hat sich vermutlich in Luft aufgelöst, als du acForm zu acTable geändert hast.

Die aktuelle "Objekt oder With Blockvariable nicht festgelegt" Fehlermeldung kommt deshalb, weil du deine db-Variable verwendest, bevor du sie 7 Zeilen später erstmalig zuweist.

Zitat von: TerraAOC am Juni 22, 2021, 10:32:21Bitte helft mir es so umzusetzen, ich finde es so viel praktischer und übersichtlicher als mit kompliziertem SQL oder angehängter CSV.
Es . funktioniert . so . aber . nicht!

Der Code, den du jetzt aktuell verwendest, importiert die CSV-Datei ins Frontend und versucht dann eine Tabelle aus dem Backend in's Frontend zu verknüpfen.
Der essenzielle Zwischenschritt, deine Tabelle mit den CSV-Daten in's Backend zu bekommen, fehlt. - Dazu wäre z.B. der o.a. Code mit dem SELECT ... INTO ... IN '...\Backend.accdb' geeignet.

Zitat von: TerraAOC am Juni 22, 2021, 10:32:21Ihr könnt mir auch sagen wie ich die Verbindung mit DBEngine nutze, falls das leichter ist.
Mit DbEngine.OpenDatabase kannst du direkt das Backend öffnen, analog zu CurrentDb für das Frontend. Das kehrt aber nur die Richtung um, in der deine Tabelle kopiert werden müsste und ist daher m.M. keine große Erleichterung.
Access DevTools - Find and Replace
Komfortables Suchen und Ersetzen in den Entwurfseigenschaften von Access-Objekten. In Abfragen, Formularen, Berichten und VBA-Code - Überall und rasend schnell!

MzKlMu

Hallo,
in #6 steckt die komplette einfache, Anfängertaugliche Lösung.
Die dortige Abfrage (SELECT Feldnamen INTO....) ist nur auf die vorliegenden Feld/Tabellennamen anzupassen.
Gruß
Klaus

TerraAOC

Hallo ich wieder nach langer Zeit, kam heute erst wieder dazu, habe das SQL genauso wie in #6 bzw in #42 eingefügt und angepasst. Trotzdem bekomme ich immer noch einen Laufzeitfehler "Objektvariable oder With-Blockvariable nicht festgelegt.

Access markiert mir mein SQL.

db.Execute "SELECT Artikelnummer, Lagerfach INTO Testtabelle IN 'C:\Users\Importtest_be.accdb' FROM ImporttabelleLokal"
db ist deklariert.


Hier nochmal der komplette Abschnitt:
        Case vbYes
    Dim Tabellenname As String
    Dim Verbindungsinformation As String
    Dim Name_Quelltabelle As String
    Dim neue_Tabelle As TableDef
    Dim db As Database
            DoCmd.DeleteObject acTable, "ImporttabelleLokal"
            DoCmd.TransferText acImportDelim, "Import", "ImporttabelleLokal", "Q:\Export\Importtabelle.txt", True, ""
           
           
       
           db.Execute "SELECT Artikelnummer, Lagerfach INTO Testtabelle IN 'C:\Users\Importtest_be.accdb' FROM ImporttabelleLokal"
           
           
           
           
            Application.RefreshDatabaseWindow
           
            db.TableDefs.Refresh
           
            Tabellenname = "ImporttabelleLokal"       'Name der Tabelle
            Name_Quelltabelle = "Testtabelle" 'Name der Originaltabelle
           
            'MS Access DB
            Verbindungsinformation = ";DATABASE=C:\Users\Importtest_be.accdb"
            'Datenbankobjekt ermitteln
            Set db = CurrentDb
           
            'Neues Tabellenobjekt anlegen
            Set neue_Tabelle = db.CreateTableDef
            neue_Tabelle.SourceTableName = "ImporttabelleLokal" 'Name der Quelltabelle
            neue_Tabelle.Name = "Testtabelle" 'Tabellenname festlegen
            neue_Tabelle.Connect = ";DATABASE=C:\Users\Importtest_be.accdb" 'Verbindungsinformation festlegen
           
            'Tabelle anlegen
            db.TableDefs.Append neue_Tabelle
            db.TableDefs.Refresh
           
            'Speicher freigeben
            Set db = Nothing
           

PhilS

Zitat von: TerraAOC am Juli 09, 2021, 08:14:17Trotzdem bekomme ich immer noch einen Laufzeitfehler "Objektvariable oder With-Blockvariable nicht festgelegt.
Bitte ließ meinen vorigen Post. Darin hatte ich diese Frage bereits beantwortet.

Außerdem beantworte bitte die Frage darin.
Access DevTools - Find and Replace
Komfortables Suchen und Ersetzen in den Entwurfseigenschaften von Access-Objekten. In Abfragen, Formularen, Berichten und VBA-Code - Überall und rasend schnell!