Access (.accdb) Datenbank auslesen etc.

  • Abend Leute,


    so: Dass Problem steht immer noch trotz PC austausch und hilfe von Kollegen. Das Problem hat ebenfalls ein anderer Azubi in meiner nähe.


    Das Script von ihm läuft genauso wie meins nur auf einem einzigen Notebook. Verrückt ist, dass das Notebook keinen Hardware und Software unterschied zu unseren Maschinen hat.


    Ich glaub ich werde heut noch testen, ob es auf meinem HomePC läuft und wenn nicht dann werd ich wohl aufgeben müssen.


    Ich danke euch allen für eure lange ausführliche und nette Hilfe =)

  • Hmm,


    muss doch zu fassen sein das Problem..


    Ich gehe ja davon aus, dass die Felder auch auslesbare Daten sind, wie z.B. Text usw.:



    Hast mal probiert Office neu zu installen?

  • hallo MadCatz ...


    hast du denn mal eine exe daraus erstellt und die dann getestet?


    meine exe mit datenbank hat ja bei dir auch funktioniert ...


    Was hast du denn Überhaupt für ein Betriebssystem? Ich habe Win7 Professional X64.


    im englischen Forum gibts noch den Hinweis, dass man folgenden code am anfang des scriptes einfügen soll!

    #region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseX64=n
    #endregion ;**** Directives created by AutoIt3Wrapper_GUI ****


    und hier noch ein weiteres Thema dazu [ gelöst ] Verbindung zu Access 2010 DB nicht möglich


    2007 Office System Driver: Data Connectivity Components
    http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=23734


    gruß gmmg

  • Hey gmmg,


    wenn ich von meinem Notebook aus die exe erstelle funktioniert das TestScript ebenfalls nicht, wenn ich die Exe allerdings auf dem Testnotebook erstelle funktioniert diese anscheinend auf jedem Rechner.


    Wir verwenden auf allen PCs hier Win7 Enterprrise 64bit.


    Das mit dem Tipp aus dem englischen Forum hatte ich auch gefunden, allerdings nicht geteste, da ich Autoit als x64 installiert habe, aber ich werde es testen :)


    Ich weiß nämlich selber nicht mehr weiter woran das liegen kann, dass es nur auf einem einzigen PCs läuft.


    Wenn ich den Treiber installiere weiß ich nicht was das für Auswirkungen hat, geschweige den ob ich das darf, sind ja alles Firmennotebooks



    Aber ich werde mal alles ausprobieren


    =)

  • Morgen Leute =) ,


    so, erstmal die Datenbankabfrage funktioniert soweit, allerdings habe ich in meiner Datenbank folgendes, sodass die momentane Datenbankabfrage nicht mehr komplett ihre Funktion erfüllt. Dies liegt daran, dass in der Spalte "Box" einige Werte doppelt vorkommen, sowie es in der späteren Datenbank sein wird.


    Meine Test-Datenbank findet ihr im Anhang.

    (Vereinfachtes-Schema)


    ID | Stick | Box
    1 35 12
    2 2 34
    3 3 56
    4 4 34
    5 52 56
    6 60 2


    So nun einmal genauer:


    Ich habe eine GUI erstellt, in der ein User, neben der Box auch die Sticknummer erfassen muss, wenn beide Nummer in der Datenbank zufinden sind, so zeigt eine MsgBox an, nach Button druck an. dass es erfolgreich war.


    Allerdings soll dies nicht so funktionieren, da sonst der User sämtliche Zahlen in verschiedenster Kombi angeben kann und dann als erfolgreich abschließen kann.


    Ich weiß, dass ich dementsprechen überprüfen muss, ob beide Nummer, z.B 52 (Stick) und 56 (Box) die Selbe ID besitzen.



    Das bekomme ich leider nicht hin =(


    Hier mal mein Quellcode mit der bisherigen Abfrage (ohne ID Abfrage)



    $Spalte1 = "Box"
    $Spalte2 = "Stick"
    $Spalte = "ID"


    ....


    Case $Ausleihen
    $iStick = Int(GUICtrlRead($Sticknummer))
    $iBox = Int(GUICtrlRead($StickBox))


    If $iStick = "" And $iBox = "" Then
    MsgBox(0+48,"","Bitte die Sticknummer und StickBox angeben.")
    ElseIf $iBox = "" Then
    MsgBox(0+48,"","Bitte die StickBox angegeben.")
    ElseIf $iStick = "" Then
    MsgBox(0+48,"","Bitte die Sticknummer angeben.")
    EndIf
    If $iStick <> "" And $iBox <> "" Then
    $query1 = "SELECT * FROM "&$tabellenname&" WHERE Stick = '" &$iStick&"'"
    $strData1 = int(_ReadOneFld($query1, $datenbankpfad, $Spalte2,"Sticknummer"))
    $query2 = "SELECT * FROM "&$tabellenname&" WHERE Box = '" &$iBox&"'"
    $strData2 = int(_ReadOneFld($query2, $datenbankpfad, $Spalte1,"Box"))
    If $iStick = $strData1 And $iBox = $strData2 Then
    ConsoleWrite($query1&@CRLF&$strData1)
    MsgBox(0,"",$query1&@CRLF& "Ergebnis: " &$strData1)
    ConsoleWrite($query2&@CRLF&$strData2)
    MsgBox(0,"",$query2&@CRLF& "Ergebnis: " &$strData2)
    ElseIf $iStick <> $strData1 Then
    MsgBox(0,"","Diese Sticknummer exestiert nicht.")
    ElseIf $iBox <> $strData2 Then
    MsgBox(0,"","Diese StickBox exestiert nicht.")
    EndIf
    EndIf


    ....


    Func _ReadOneFld($_sql,$_datenbankpfad,$_field,$MissingWord)
    Dim $_output
    $adoCon = ObjCreate("ADODB.Connection")
    $adoCon.Open("Provider=Microsoft.ACE.OLEDB.12.0; Data Source="&$datenbankpfad&";")
    $adoRs = ObjCreate("ADODB.Recordset")
    $adoRs.CursorType = 1
    $adoRs.LockType = 3
    $adoRs.Open($_sql,$adoCon)
    With $adoRs
    If .RecordCount Then
    While Not .EOF
    $_output = $_output&.Fields($_field).Value&@CRLF
    .MoveNext
    WEnd
    ;~ Else
    ;~ MsgBox(0+64,"Fehler","Diese "&$MissingWord&" exestiert nicht. Bitte Eingabe überprüfen.")
    EndIf
    EndWith
    $adoCon.Close
    Return $_output
    EndFunc



    Ich dachte ich könnte die ID abfragen, wenn ich bei



    $query1 = "SELECT * FROM "&$tabellenname&" WHERE Stick = '" &$iStick&"'"
    $strData1 = int(_ReadOneFld($query1, $datenbankpfad, $Spalte2,"Sticknummer"))


    in


    $query1 = "SELECT * FROM "&$tabellenname&" WHERE Stick = '" &$iStick&"'"
    $strData1 = int(_ReadOneFld($query1, $datenbankpfad, $Spalte,"Sticknummer"))


    ändere.



    so einfach ist das aber leider nicht :/

  • kannst du nicht einfach ein (Select ID FROM "&$tabellenname&" WHERE Stick = '" &$iStick&"'" AND Box = '" &$iBox&"'" ) machen?



    $datenbankpfad = "d:\Test.accdb"
    $tabellenname = "Tabellentest"
    $Spalte0 = "ID"
    $Spalte1 = "Stick"
    $Spalte2 = "Box"


    $query = "SELECT * FROM " & $tabellenname & " WHERE Box = '12' AND Stick = '3'"
    $strData1 = _ReadOneFld($query, $datenbankpfad,$Spalte0)


    ConsoleWrite($query& @CRLF &$strData1)
    MsgBox(0,"",$query & @CRLF & "Ergebnis: " & $strData1)


    Func _ReadOneFld($_sql, $_datenbankpfad, $_field)
    Dim $_output
    $adoCon = ObjCreate("ADODB.Connection")
    $adoCon.Open("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & $datenbankpfad & ";")
    $adoRs = ObjCreate("ADODB.Recordset")
    $adoRs.CursorType = 1
    $adoRs.LockType = 3
    $adoRs.Open($_sql, $adoCon)


    With $adoRs
    If .RecordCount Then
    While Not .EOF
    $_output = $_output & .Fields($_field).Value
    .MoveNext
    WEnd
    EndIf
    EndWith
    $adoCon.Close
    Return $_output
    EndFunc


    so in etwa ...


    gruß gmmg

  • hallo,


    hast du dir mein script richtig angesehen?
    in deinem _ReadOneFld sind 4 parameter angegeben, sollten aber nur 3 sein!
    auf welche spalte bezieht sich deine variable $Spalte2? das ist mit sicherheit nicht die ID!



    $Spalte0 = "ID"
    $Spalte1 = "Stick"
    $Spalte2 = "Box"


    $query = "SELECT * FROM " & $tabellenname & " WHERE Box = '12' AND Stick = '3'"
    $strData1 = _ReadOneFld($query, $datenbankpfad,$Spalte0)


    poste bitte nochmal dein komplettes script!


    gruß gmmg

  • Der Vierte Parameter bezog sich auf eine Fehlermeldung, die ich in deine Funktion eingefügt hatte, habe ich jetzt allerdings wieder entfernt.


    Ich dachte ich muss das hier schreiben:

    $query1 = "SELECT ID FROM "&$tabellenname&" WHERE Stick = '"&$iStick&"'"
    $strData1 = Int(_ReadOneFld($query1, $datenbankpfad, $Spalte1))



    Wichtigster Teil des Tools:
    Funktion:



    Func _ReadOneFld($_access,$_datenbankpfad,$_field)
    Dim $_output
    $adoCon = ObjCreate("ADODB.Connection")
    $adoCon.Open("Provider=Microsoft.ACE.OLEDB.12.0; Data Source="&$_datenbankpfad&";")
    $adoRs = ObjCreate("ADODB.Recordset")
    $adoRs.CursorType = 1
    $adoRs.LockType = 3
    $adoRs.Open($_access,$adoCon)
    With $adoRs
    If .RecordCount Then
    While Not .EOF
    $_output = $_output&.Fields($_field).Value&@CRLF
    .MoveNext
    WEnd
    EndIf
    EndWith
    $adoCon.Close
    Return $_output
    EndFunc


    Programm:


    ;~ --Voreinstellungen--------------------------------------------------------------------------------------------------------------------------------------------------------
    GUICtrlSetState ($Rueckgabe,$GUI_Disable)
    GUICtrlSetState ($Ausleihen,$GUI_Disable)
    GUICtrlSetState ($Techniker,$GUI_FOCUS)
    $Pfad_Techniker = @ScriptDir&"\Daten\Techniker.ini"
    $datenbankpfad = @ScriptDir&"\Test.accdb"
    $Ausgeliehen_Stick = @ScriptDir&"\Daten\Ausgeliehene_Sticks.ini"
    $Rueckgabe_Stick = @ScriptDir&"\Daten\Rueckgabe_Sticks.ini"
    $tabellenname = "Stickübersicht"
    $Spalte1 = "Box"
    $Spalte2 = "Stick"
    $Spalte = "ID"
    ComboBox_fill($Pfad_Techniker,"Techniker",$Techniker,"neuen Techniker")


    ;~ --Lend Box and Sticks---------------------------------------------------------------------------------------------------------------------------------
    Case $Ausleihen2
    $iStick = int(GUICtrlRead($Sticknummer2))
    $iBox = int(GUICtrlRead($StickBox2))
    If $iStick = "" And $iBox = "" Then
    MsgBox(0+48,"","Bitte die Sticknummer und StickBox angeben.")
    ElseIf $iBox = "" Then
    MsgBox(0+48,"","Bitte die StickBox angegeben.")
    ;~ ElseIf $iStick = "" Then
    ;~ MsgBox(0+48,"","Bitte die Sticknummer angeben.")
    EndIf
    If $iBox <> "" Then
    $query1 = "SELECT Stick FROM "&$tabellenname&" WHERE Stick = '"&$iStick&"'"
    $strData1 = Int(_ReadOneFld($query1, $datenbankpfad, $Spalte2))
    $query2 = "SELECT Box FROM "&$tabellenname&" WHERE Box = '" &$iBox&"'"
    $strData2 = int(_ReadOneFld($query2, $datenbankpfad, $Spalte1))
    If $iBox = $strData2 Then
    ConsoleWrite($query1&@CRLF&$strData1)
    MsgBox(0,"",$query1&@CRLF& "Ergebnis: " &$strData1)
    ConsoleWrite($query2&@CRLF&$strData2)
    MsgBox(0,"",$query2&@CRLF& "Ergebnis: " &$strData2)
    IniWrite($Ausgeliehen_Stick,$iBox,"0","-")
    $Array1 = IniReadSection($Ausgeliehen_Stick, $iBox)
    $LastIndex1 = $Array1[0][0]
    IniWrite($Ausgeliehen_Stick,$iBox,$LastIndex1,$iStick)
    IniDelete($Ausgeliehen_Stick,$iBox,"0")
    ElseIf $iStick <> $strData1 Then
    MsgBox(0,"","Diese Sticknummer exestiert nicht.")
    ElseIf $iBox <> $strData2 Then
    MsgBox(0,"","Diese StickBox exestiert nicht.")
    EndIf
    EndIf