Font

Datenbankanbindung an Access - Neuling!

[thread]14605[/thread]


hide all open all
  • close +23 replies
  • close close guest Tobi  2010-02-07 14:38 #132073 #132073
     
    Hallo zusammen,

    ich soll als Aufgabe in meiner Ausbildung ein Perl Makro zu schreiben welches sich mit einer Datenbank verbinden soll (Bin absoluter Neuling im Umgang mit PERL). Leider kriege ich es nicht wirklich hin deswegen stelle ich hier mal die Frage ;-)

    Das Perl Makro soll die Access 2007 Datenbank öffnen, den Import einer Datei ausführen und danach die Datenbank wieder schließen. Idealerweise soll noch eine Überprüfung stattfinden, die guckt ob ein gewissen Wert in der Tabelle überschritten wurde - sollte dies der Fall sein soll eine E-Mail an eine Adresse geschickt werden.

    Leider bin ich im Internet nicht fündig geworden, ich hoffe hier kann mir jemand helfen.

    Danke schonmal im vorraus!
    • close renee  2010-02-07 14:55 #132079 #132079
      User since
      2003-08-04
      13019 articles
      [Homepage]
      [default_avatar]  
      Hallo Tobi,

      als generellen Einstieg für die Anbindung von Datenbanken haben wir diesen Wiki:Artikel.

      Was meinst Du genau mit "Import einer Datei"? Wie sieht die Datei aus? Wie würde man den Import "manuell" machen? Muss man da direkt mit Access arbeiten, oder kann man beim Aufruf von Access einfach einen Dateinamen angeben?

      Zum Thema E-Mail haben wir z.B. diesen Wiki:Artikel.

      Weitere Fragen? Einfach fragen...
    • close +5 replies
    • close close GwenDragon  2010-02-07 15:01 #132087 #132087
      User since
      2005-01-17
      5575 articles
      [Homepage]

      user image  
      1) Soll deine Anwendung auf Windows laufen?
      2) Ist ODBC verwendbar?
      Das sollte erst geklärt werden.

      Ganz kurz und brutal:
      Code (perl):
      1
      2
      3
      4
      5
      6
      7
      
      my $dsn = "Datenbank"; 
      my $dbh = Win32::ODBC->new("DSN=$DSN"); # zu Datenbank verbinden
      my $sql = "SELECT * FROM Tabellenname"; # deine SQL-Abfrage
      if($db->Sql($sql_string)) { # Abfrage war erfolgreich
        # dein weiterer Programmcode
      } 
      $db->Close(); # Verbindung zu Datenbank schließen
      ;
      Siehe auch: CPAN:Win32-ODBC

      Bei Unverständis bitet weiter fragen.
      Packagebeilage:
      Perl-Beispiele können bei Anfängern und Perl-Evangelisten üble Irritationen verursachen und Damian Conway zur Rettung des »Guten Perl-Programmierstils« auf den Plan rufen!


      Ich gebe niemals Perl-Code an Psychopathen weiter. Die bekommen von mir BASIC.

      Germanistikfreaks und grammatikalisch Zwanghafte verweise ich an Hans weiter.
      • close +4 replies
      • close close renee  2010-02-07 15:04 #132089 #132089
        User since
        2003-08-04
        13019 articles
        [Homepage]
        [default_avatar]  
        Ich persönlich würde CPAN:DBI mit CPAN:DBD::ODBC verwenden. Dann lernt man gleich das "richtige" Modul kennen und bleibt portabler...
        • close +3 replies
        • close close GwenDragon  2010-02-07 15:36 #132101 #132101
          User since
          2005-01-17
          5575 articles
          [Homepage]

          user image  
          Portabler? DBD::ODBC setzt ODBC voraus, was unter Linux nicht immer gegeben ist, kostenpflichtig oder korrekt läuft.
          Es kommt ja auf das System an, auf dem gearbeitet wird. Deswegen meine Fragestellung.
          Packagebeilage:
          Perl-Beispiele können bei Anfängern und Perl-Evangelisten üble Irritationen verursachen und Damian Conway zur Rettung des »Guten Perl-Programmierstils« auf den Plan rufen!


          Ich gebe niemals Perl-Code an Psychopathen weiter. Die bekommen von mir BASIC.

          Germanistikfreaks und grammatikalisch Zwanghafte verweise ich an Hans weiter.
          • close +2 replies
          • close close renee  2010-02-07 15:39 #132104 #132104
            User since
            2003-08-04
            13019 articles
            [Homepage]
            [default_avatar]  
            Mit portabler meinte ich eher portabel zwischen DB-Systemen. Wenn man von Access auf MySQL umsteigt, dann ist es viel weniger Code, den man anpassen muss. Sorry für die Unklarheit...
            • close GwenDragon  2010-02-07 15:49 #132111 #132111
              User since
              2005-01-17
              5575 articles
              [Homepage]

              user image  
              hast schon recht, damit dass es sinnvoller ist, DBI zu verwenden wenn es Zieldatenbanken von verschiedenen Herstellern sind.

              Nur war das ja im Grunde genommen nicht die Fragestellung des Posters.
              Du hasr also schon Schritte weiter gedacht. ;)
              Packagebeilage:
              Perl-Beispiele können bei Anfängern und Perl-Evangelisten üble Irritationen verursachen und Damian Conway zur Rettung des »Guten Perl-Programmierstils« auf den Plan rufen!


              Ich gebe niemals Perl-Code an Psychopathen weiter. Die bekommen von mir BASIC.

              Germanistikfreaks und grammatikalisch Zwanghafte verweise ich an Hans weiter.
    • close +5 replies
    • close close Funnybone  2010-02-07 15:23 #132095 #132095
      User since
      2010-02-07
      8 articles
      [default_avatar]  
      Erstmal danke für die ganzen Antworten, ich habe mir direkt mal mail:sender angeguckt und DBI + ODBC überschlagen.

      @renee:
      Eine Textdatei soll mit einer Importspezifikation in eine Datenbank eingefügt werden. Die Textdatei "test.txt" hat zB eine Zeile mit dem Inhalt "0000000Hallo0000000wie00000gehts0000". In der Datenbank wird dann mit der Spezifikation festgelegt die sagt welchen Teil der Zeile ich importieren will also nur "Hallo" "wie" und "gehts" und in welches Feld das ganze gepackt werden soll. Mit einem VBA Makro importiert Access dann den Inhalt der Datei also das "Hallo" "wie" gehts" in eine Tabelle.
      Sieht mit dem VBA Makro so aus:

      Code:
      DoCmd.TransferText acImportDelim, "Name der Importspezifikation", "Name der Tabelle", ""


      @GwenDragon:
      Ja, ODBC ist möglich und es soll unter Windows laufen!

      Danke für die schnellen Antworten :-)
      • close +4 replies
      • close close renee  2010-02-07 15:30 #132098 #132098
        User since
        2003-08-04
        13019 articles
        [Homepage]
        [default_avatar]  
        Wenn der Import dann über ein VBA-Makro gemacht werden soll, dann musst Du Access richtig "fernsteuern". Da bietet sich das Modul CPAN:Win32::OLE an.

        Bei Perlmonks gab es mal einen Thread mit ähnlichem Ziel: http://www.perlmonks.org/?node_id=715473

        Noch ein Link zum Thema Win32::OLE und Access:
        http://www.justskins.com/forums/microsoft-access-a...
        • close +3 replies
        • close close Funnybone  2010-02-09 08:14 #132311 #132311
          User since
          2010-02-07
          8 articles
          [default_avatar]  
          Okay habe jetzt was geschrieben, was ansich funktioniert:
          Code:
          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          use strict;  
          use warnings;
          use Win32::OLE;

          my $access;

          my $datei = "D:\\TEST\test.accdb";
          $access = Win32::OLE->GetActiveObject('Access.Application');

          $access->OpenCurrentDatabase($datei);
          $access->{DoCmd}->RunMacro("Import");


          Das Problem ist, dass das nur funktioniert wenn die Datenbank bereits offen ist - wie schreibe ich denn das sich die Datenbank öffnet und schließt anstatt das sie geöffnet sein muss?
          • close +2 replies
          • close close renee  2010-02-09 09:28 #132317 #132317
            User since
            2003-08-04
            13019 articles
            [Homepage]
            [default_avatar]  
            Mach mal
            Code (perl):
            $access = Win32::OLE->new('Access.Application'); 
            statt
            Code (perl):
            $access = Win32::OLE->GetActiveObject('Access.Application'); 
            • close Funnybone  2010-02-09 09:33 #132318 #132318
              User since
              2010-02-07
              8 articles
              [default_avatar]  
              Ah, perfekt funktioniert!
    • close +11 replies
    • close close Funnybone  2010-02-09 10:29 #132327 #132327
      User since
      2010-02-07
      8 articles
      [default_avatar]  
      Könnte ich mit win:32 ole zB auch sagen, dass Access eine Abfrage drucken soll?
      • close +10 replies
      • close close renee  2010-02-09 10:41 #132328 #132328
        User since
        2003-08-04
        13019 articles
        [Homepage]
        [default_avatar]  
        Ja, mit Win32::OLE kann man auf alle Funktionalitäten der Anwendung zugreifen. Probier mal, Deine Aktionen mit dem Makrorekorder aufzunehmen. Und poste dann den VB-Code hier...
        • close +9 replies
        • close close Funnybone  2010-02-09 11:19 #132337 #132337
          User since
          2010-02-07
          8 articles
          [default_avatar]  
          Habe das jetzt einfach so gemacht:

          Quote

          $access->{ActivePrinter} = "FreePDF XP";

          $access->{DoCmd}->OpenQuery("Abfrage_1");
          $access->{DoCmd}->Printout;


          mit ActivePrinter wollte ich den Drucker festlegen den das Programm benutzt, leider nimmt er trotzdem nicht FreePDF sondern den normalen hier eingestellten Drucker :-(

          Bin iwie ganz begeistert von Perl, ist ja echt cool was man so alles damit machen kann!
          • close +8 replies
          • close close renee  2010-02-09 11:48 #132339 #132339
            User since
            2003-08-04
            13019 articles
            [Homepage]
            [default_avatar]  
            Bin mir jetzt nicht ganz sicher (kann es im Moment nicht testen), aber mach den Printout-Aufruf mal so:
            Code (perl):
            1
            2
            3
            4
            5
            
            $access->{DoCmd}->Printout(
                {
                    ActivePrinter => "FreePDF XP",
                },
            );
            • close +7 replies
            • close close Funnybone  2010-02-09 13:05 #132361 #132361
              User since
              2010-02-07
              8 articles
              [default_avatar]  
              Funktioniert leider nicht. Er gibt zwar keinen Fehler aus, gedruckt wird aber auch nichts.
              Ansich funktioniert das Ganze übrigens wenn ich FreePDF XP als Standarddrucker eingerichtet habe - aber ich möchte den PDF Drucker nur für die Access Datei benutzen nicht immer als Standard anhaben.
              • close +4 replies
              • close close renee  2010-02-09 13:13 #132362 #132362
                User since
                2003-08-04
                13019 articles
                [Homepage]
                [default_avatar]  
                Dann kann ich auch nur raten...

                Ist der Name, den Du angegeben hast auch der Name wie er in der Systemsteuerung eingetragen ist?
                • close +3 replies
                • close close guest Funnybone  2010-02-09 13:22 #132366 #132366
                   
                  Ja da heißt er auch so. Hat Perl vlt Probleme mit dem Leerzeichen?
                  • close +2 replies
                  • close close pktm  2010-02-09 13:48 #132372 #132372
                    User since
                    2003-08-07
                    2450 articles
                    [Homepage]

                    user image  
                    Mh, probiers mal aus. Kannst du den Drucker so umbenennen, dass er keine Leerzeichen mehr im Namen hat?
                    • close Funnybone  2010-02-09 13:55 #132374 #132374
                      User since
                      2010-02-07
                      8 articles
                      [default_avatar]  
                      Ja leider keine Veränderung
              • close +2 replies
              • close close GwenDragon  2010-02-09 14:07 #132376 #132376
                User since
                2005-01-17
                5575 articles
                [Homepage]

                user image  
                Was wird denn im Fehlerfall angezeigt, wenn du sowas als Code nimmst:
                Code (perl):
                1
                2
                3
                4
                5
                
                $access->{DoCmd}->Printout(
                    {
                        ActivePrinter => "FreePDF XP",
                    },
                ) or die Win32::OLE->LastError();
                Packagebeilage:
                Perl-Beispiele können bei Anfängern und Perl-Evangelisten üble Irritationen verursachen und Damian Conway zur Rettung des »Guten Perl-Programmierstils« auf den Plan rufen!


                Ich gebe niemals Perl-Code an Psychopathen weiter. Die bekommen von mir BASIC.

                Germanistikfreaks und grammatikalisch Zwanghafte verweise ich an Hans weiter.
                • close Funnybone  2010-02-09 14:32 #132396 #132396
                  User since
                  2010-02-07
                  8 articles
                  [default_avatar]  
                  Code:
                  Win32::OLE(0.1709) error 0x80020006: "Unbekannter Name" "ActivePrinter" in GetIDsOfNames for "Printout" at C:\Data\user\Desktop\druck.pl line 12.


                  Bezieht sich unbekannter Name auf den Drucker, oder auf "ActivePrinter"?
                  Wenns sich auf den Drucker bezieht ist es seltsam, denn der Name stimmt 1:1 überein..

View all threads created 2010-02-07.

[Powered by Battie]
Powered by Perl
Powered by Pound
Some Icons are from
Fugue Icons
Impressum