none
Access 2010 Abfrage SQL im VBA Modus

    Frage

  • Hallo ich möchte in eine Datenbank (nennen wir Sie Programm) Daten aus der Datenbank Backoffice importieren.

    Es sollten Daten aus der Datei Backoffice Tabelle Master importiert werden bei dem der Wert "Personalnummer" in der Spalte "Perso" übereinstimmt.

    Die Backoffice Datenbank hat auch einen Kennwortschutz. und bassiert auf accdb Standart. Kann mir hier jemand helfen.

    Donnerstag, 23. Mai 2013 06:48

Alle Antworten

  • Hallo Martin

    Linke die Tabelle aus dem Backoffice in die Anwendung ein (über den Tabellen Verknüpfungsassistenten) und mache dann eine Abfrage, die die Datensätze enthält, die Du einfügen willst. Dannach machst Du eine Einfügeabfrage, welche auf der ersten Abfrage basiert. Das geht ebenfalls mit dem Assistenten.

    Gruss
    Henry

    Donnerstag, 23. Mai 2013 07:42
  • Hallo, das kann ich leider nicht aus mehreren Gründen:

    - In der Backoffice Tabelle sind die Daten von allen Usern, er soll sich aber nur die ziehen die mit seiner PERSO verknüpft ist.

    - SQL damit wie schnell umstellen könnten falls wir von Access mal weggehen

    - VBA prüft ob der Rechner Online ist (Laptop) und führt dann erst die Abfrage aus

    - Der VBA Code ist nicht zum einsehen

    Freitag, 24. Mai 2013 06:32
  • Irgendwie verstehe ich das nun nicht so ganz.

    Zum einen willst Du VBA benutzen, zum anderen nur SQL, damit Du von Access weggehen kannst. Geht irgendwie nicht auf.

    Mit verlinken kopierst Du ja keine Daten in die Anwendung hinein, sondern verknüpfst die Tabelle von Backoffice nur, damit Du anschliessend die gewünschten Datensätze einlesen kannst. Ohne eine Verknüpfung auf die Backoffice Datenbank wirst Du die Daten nicht einlesen können. Du kannst ja anschliessend diese Verknüpfung wieder löschen.

    Alternativ kannst Du die Verknüpfung direkt in der Anfüge-Abfrage selber machen, indem Du in FROM statt des Tabellennamens eben eine Verknüpfung angibst. Das ist aber wesentlich komplizierter. Wenn es sich dabei auch um eine Access Datenbank handelt, kannst Du:

    INSERT INTO (....)
    SELECT ....
      FROM TabellenName IN "PfadUndNameDerAccessDatenbank"
     WHERE PERSO = ...

    benutzen. Dann kannst Du das Einbinden umgehen. "...." musst Du durch die Feldliste ersetzen und "..." durch den Wert, der der lokale Benutzer hat. Falls es sich dabei um einen Text handelt, dann noch ' um den Text herum.

    Nur wird auch das nicht auf SQL portierbar sein, dort wirst Du einen Linked Server benutzen müssen.

    Gruss

    Henry

    Freitag, 24. Mai 2013 07:21
  • Hallo ich hätte folgenden Befehl in VBA geschrieben. Jedoch scheitert es am SQL befehl.

    Option Compare Database
    Option Explicit
    Public Const User = "SUCHMICH"                  'Benutzername
    Public Const PW = "ichbindaspasswort"           ' Passwort der DB
    Function GetNamePath()
             Dim MyDB As Database         
             Set MyDB = DBEngine.Workspaces(0).Databases(0)         
             GetNamePath = MyDB.Name
    End Function
    Public Sub aktuslisierediedaten()
    DoCmd.SetWarnings False                                                                         
    Dim new_db As String, new_table As String, table As String, MySql As String             'Variablendefinition
    Dim old_db As String, db As DAO.Database
    Dim qry
    '#########################################################################################         
    old_db = "\\Serverpfad\Backoffice.accdb" 'Backoffice
    new_db = GetNamePath()			' Aktuelle Datenbank
    new_table = "Tabelle"		'Tabelle Backoffice
    table = "Tabelle"			'Tabelle Lokal
    '#########################################################################################
    'Export
    MySql = "INSERT INTO Tabelle.* SELECT Tabelle.* FROM Tabelle.* IN '\\Server\Datenbank.accdb' 'dBASE IV;' WHERE Tabelle.Name Like 'Benutzername'"
    Debug.Print MySql
    Set db = CurrentDb()                                                                                'Vorbereiten Erstellabfrage
    Set qry = db.CreateQueryDef("", MySql)
    Dim db1 As DAO.Database                                                                             'Öffnen andere Datenbank mit PW
    Set db1 = OpenDatabase(new_db, False, False, ";PWD=" & PW)
    'qry.Execute                                                                                         'Ausführen SQL-Befehl
    db1.Close                                                                                           'Schliessen andere DB
    Set db1 = Nothing
    Set db = Nothing
    DoCmd.SetWarnings True 'Warnungen einschalten
    End Sub


    Freitag, 24. Mai 2013 13:42
  • Hallo Martin

    "Martin Scheugenpflug" schrieb im Newsbeitrag news:30088377-5530-4b77-b051-b8d61e5cdfce@communitybridge.codeplex.com...

    MySql = "INSERT INTO Tabelle.* SELECT Tabelle.* FROM Tabelle.* IN
    '\\Serverpfad\Datenbank.accdb'
    'dBASE IV;' WHERE Tabelle.Name Like 'Benutzername'"
    Debug.Print MySql

    Was soll das "dBASE IV;" da? Passt irgendwie nicht rein...

    Versuch's mal mit sowas:

    MySql = "INSERT INTO Tabelle(Feld1, Feld2, ...) SELECT Feld1, Feld2, ... FROM Tabelle IN '\\Serverpfad\Datenbank.accdb' WHERE Tabelle.[Name] = 'Benutzername'"

    das erste Tabelle musst Du durch den Namen der Zieltabelle ersetzen, das zweite Tabelle durch den Namen der Quelltabelle, falls diese nicht beide "Tabelle" heissen. Dann solltest Du die Feldnamen explizit angeben, weil es mit * nur genau dann funktioniert, wenn die Feldnamen absolut identisch sind (Reihenfolge, Datentypen). Und ein Like mit einem fixen String ohne * und ? drin macht keinen Sinn, verwende in diesem Fall ein =.

    Gruss

    Henry



    • Bearbeitet Henry Habermacher Dienstag, 28. Mai 2013 09:06 neutralisierung der pfade
    Montag, 27. Mai 2013 05:30
  • Hallo er liefert mir dann folgenden Befehl in der Zeile zürück, übertrgägt aber keine Werte selbst wenn ich alle Daten übertragen möchte

    INSERT INTO MSF_PROD_OUT(MONTH) SELECT MONTH FROM MSF_PROD_OUT IN '\\Server\Datenbank.accdb' 

    Er öffnet aber die Datenbank richtig oder:

    \\Server\Datenbank.accdb Falsch,Wahr,";PWD=Passwort"
    @Henry könntest du bei deinem letzten Kommentar die Serverpfade\Dateiname ändern war mein Fehler :)
    Montag, 27. Mai 2013 06:50
  • habe ich gemacht, solche Copy/Paste Geschichten sind immer unangenehm;-) Unangenehmer ist es, da nun bei allen, die die Community Bridge brauchen und nicht im Forum arbeiten, die Korrektur /nicht/ nachgeführt wird. Ich musste jetzt auch ins Forum einsteigen, sonst benutze ich einen Newsreader.

    Zum Statement selber:

    Month ist ein reservierter Begriff. Wenn Du diesen als Feldnamen brauchen willst, solltest Du diesen in eckige Klammern stecken "[MONTH]".

    Wenn Du wissen willst, ob die Query richtig funktioniert, mach mal erst nur das Select Statement. Dann siehst Du, ob das richtig funktioniert. Wie Du da das Passwort übergeben kannst, weiss ich nicht. Sicher gibt es auch da einen Trick, den kenne ich aber nicht.

    Nichts desto trotz: mit einem Link wird es wirklich einfacher und damit wird nichts in die DB kopiert. Den Link kannst Du ja anschliessend per VBA wieder löschen.

    Gruss

    Henry


    Dienstag, 28. Mai 2013 09:11
  • WIe stelle ich eine Verknüpfung über VBA her (die Quelldátenbank hat ein Kennwort) und wie lösche ich diese dann wieder.
    Montag, 3. Juni 2013 07:33
  • Am 03.06.2013 schrieb Martin Scheugenpflug:

    WIe stelle ich eine Verknüpfung über VBA her (die Quelldátenbank hat ein Kennwort) und wie lösche ich diese dann wieder.

    Hier findest Du Code zum verknüpfen von Tabellen:
    http://www.donkarl.com?FAQ3.1
    Um die Verknüpfung wieder zu löschen, kannst Du anstatt .Connect ein
    .Delete benutzen.

    Alternativ: http://www.spotlight-wissen.de/archiv/message/1673970.html

    Servus
    Winfried


    WSUS Package Publisher: http://wsuspackagepublisher.codeplex.com/
    GPO's: http://www.gruppenrichtlinien.de
    Community Forums NNTP Bridge: http://communitybridge.codeplex.com/

    Montag, 3. Juni 2013 15:39
  • Alternativ tut's auch ein

    CurrentDB.Execute "DROP TABLE GelinkteTabelle", dbFailOnError

    Henry

    Montag, 10. Juni 2013 06:27