Announcement

Collapse
No announcement yet.

ADO DB Problem SQL vergleichen mit VBA

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • ADO DB Problem SQL vergleichen mit VBA

    Hallo bin nicht fit in ADO muss aber hier was sauber realisieren.

    1. keine ADO ebooks / pdfs- wo bekomme ich was gescheitetes "empf"
    2. Ich muss eine SQL DB mit Excel Tabellen vergleichen mittels VBA.
    Denke das die in vba gehen müsste bspw. in der SQL DB satzweise auslesen und diese dann mit vba in ("workbooks") vergleichen.
    Aufgabe: Schaue in DB, nach bestimmte Select xxx, vergleiche diesen in der Excel TB x ende Zeilen.
    Wenn gefunden und gleich "nix machen".
    Wenn "leer" insert, Wenn ungleich "nicht gefunden" schauen welche Spalte anderes -> "dann Select nach SQL feld create by".
    Wenn = xyz, dann update SQL ansonsten beibehalten (kein update).
    Dies soll "n" mal durchgeführt werden in SQL und VBA .

    Ich habe hier ein Code gemacht problem komme nicht wirklich klar und verstehe nicht ganz das objektmodel.

    Vielleicht kann mir jemand auf die Sprünge helfen nach dem ich oben recht deutlich erklärt habe was ich hier lösen möchte. Vielen dank im Vorfeld

    PHP Code:

    Sub DUMMY
    ()

        
    Dim conn As ADODB.Connection
        Dim strConnectionString 
    As String     
        Dim Prop 
    As Property
        Dim SQL 
    As String                      

        Dim oSheet 
    As Worksheet
        Dim i 
    As Long
        Dim strKEY 
    As String
        
        Dim oRS 
    As ADODB.Recordset
        Dim objWS 
    As Worksheet
        Dim intColumn 
    As Integer
           
         
        
    For 1 To x
            
            strKEY 
    oSheet.Cells(i2)
            
            
    oRS.Find (xx)
            For 
    0 To 7
                UCase 
    (x)
                            
            
    Next
        Next
        

    End Sub


    Public Function fktGetMaxRows(ByRef objWS As WorksheetByVal intColumn As Integer) As Long
        Dim strFormula 
    As String
        Dim strValue 
    As String
        
        strValue 
    objWS.Cells(11).Value
        objWS
    .Cells(11).Value 1
        strFormula 
    objWS.Cells(1255).Formula
        objWS
    .Cells(1255).Formula "=MAX(MATCH(9.99999999999999E+307,A:A),MATCH(REPT(""z"",255),A:A))"
        
    fktGetMaxRows objWS.Cells(1255).Value
        objWS
    .Cells(1255).Formula strFormula
        objWS
    .Cells(11).Value strValue 

  • #2
    Hallo,

    ein Datenvergleich zwischen einem Excel-Arbeitsblatt und den in einer SQL-Datenbank gespeicherten Daten kann über verschiedene Wege umgesetzt werden. Wenn die Datenbank auf dem Microsoft SQL Server läuft und die Excel-Tabelle einen "rechteckigen" Aufbau hat, kann der SQL Server direkt die XLS-Daten lesen, so dass nur SQL (aber kein VBA) im Spiel ist. In diesem Fall würde man die Daten aus der XLS-Datei zuerst in eine temporäre Tabelle des SQL Servers kopieren, um danach nur innerhalb der Datenbank mit SQL zu arbeiten.

    Wenn die Struktur des Arbeitsblattes der XLS-Tabelle nicht rechteckig ist (d.h. die Anzahl der Spalten je Zeile ist unterschiedlich), könnte eine .NET-Anwendung als Brückenkopf dazwischen geschaltet werden. Diese Anwendung greift über ADO.NET auf den SQL Server zu und über COM Interop (optional VSTO) auf die XLS-Datei. Die komplette Steuerungslogik befindet sich dann in der .NET-Anwendung.

    Selbstverständlich kann man auch den "alten" Weg über ein VBA-Makro gehen, dass über ADO (nicht ADO.NET!) auf die SQL-Datenbank zugreift. Allerdings steht dann der Komfort einer Entwicklungsumgebung wie VS2005 nicht zur Verfügung ;-)

    keine ADO ebooks / pdfs- wo bekomme ich was gescheitetes "empf"
    Für ADO kann ich das Buch Programming ADO von David Sceppa empfehlen. Auf der CDROM ist zusätzlich das komplette Buch auch im CHM-Hilfeformat.

    Comment


    • #3
      AW

      Hey vielen Dank für die AW,

      Ich habe ein konvertierungsskript geschrieben das eben in VBA ist somit muss oder möchte ich eben dies weiter in dem VBA lassen.

      Mir gehts einfach darum ein UPDATE auf der DB durchzuführen.

      Eine Schleife auf die Exceltabellen die Zeilen weise liest und in der inneren schleife das recordset in der DB durchläuft mit so die beiden Einträge vergleicht. -> gefunden = nix tun next, gefunden nicht gleich weiter DB felder mit weitern Zeilen felder des Excels vergleichen und prüfen. Noch keines Protokoll das diese updates dok. und eine kleine interaktion mit dem user wenn = dann muss dieser selbst bestättigen ob db satz bleibt oder überschrieben wird durch den excel eintrag.
      Eigentlich sehr einfach mache mich aber total verrückt da es nicht so will wie ich. Benutze VBA und connection mit ADO.

      Set oRS = New ADODB.Recordset
      oRS.Open SqL, conn

      for i = 1 to lngrow
      searchString = Worksheets("Tabelle2").Cells(i, 2)

      Do While Not oRS.EOF
      loop

      next i

      Comment


      • #4
        Hallo,

        angenommen, die Anzahl der zu vergleichenden Datensätze erlaubt es, alle Datensätze der SELECT-Abfrage der Datenbank in eine Recordset-Instanz einzulesen. In diesem Fall könnte innerhalb der Schleife mit dem Cells-Zugriff auf die Exceltabelle der aktuelle Excel-Wert über die Recordset-Methode Find mit der Ergebnismenge der SELECT-Abfrage verglichen werden. Die SELECT-Abfrage wird somit nur einmal vor Eintritt in die Schleife ausgeführt, danach prüft der Find-Aufruf nach, ob der Excel-Eintrag auch in der Datenbank vorhanden ist. Die Methode Find prüft eine Spalte über die Operatoren =, <, >, <=, >=, <>, oder LIKE (wobei auch die Jokerzeichen *, % oder _ unterstützt werden). Wenn die Find-Methode keinen Treffer findet, liefert das Recordset in den Eigenschaften EOF und BOF den Wert True zurück.

        Set oRS = New ADODB.Recordset
        oRS.Open SqL, conn

        for i = 1 to lngrow
        searchString = Worksheets("Tabelle2").Cells(i, 2)
        oRS.Find("Suchspalte=" + searchString
        if oRS.EOF ...
        next i

        Das Aktualisierung der Datenbank erfolgt dann über eine andere Connection, wobei eine <b>Command</b>-Objektinstanz von ADO eine parametrierte UPDATE-Anweisung ausführt. Somit kommt sich das Recordset in der Schleife nicht mit dem UPDATE in die Quere.

        Comment


        • #5
          habe das verstanden was du geschrieben hast, vielen danke.

          jetzt ist aber das problem "oRS.Find ("nvarchar2" + searchString)"

          1. In der DB heisst das Feld nvarchar2, im Exelsheet ist es B1 oder eben Cells 2,1. Die Schleife bricht ab vor dem If. Kann mir vorstellen das es mit dem Find nicht richtig klappt da dieser auf ein falsches Feld schaut.

          2. Mal eine Frage bzgl. vergleich der Listen. Ich vergleiche die db mit der excel zeile, der User sollte die nicht doppelten individuell bestättigen ob die DB updatet soll oder eben nicht und parallel dazu in ein Excelsheet "xxx" dies protokollieren.


          Dim rCount As Integer
          Dim searchString As String
          Dim oRS As ADODB.Recordset ' recordset
          Set oRS = New ADODB.Recordset

          oRS.Open SqL, conn

          For rCount = 1 To lngLastRow

          searchString = Worksheets("Tabelle2").Cells(rCount, 2)
          oRS.Find ("nvarchar2" + searchString)

          If oRS.EOF Then
          Debug.Print oRS!nvarchar2
          End If

          Next rCount

          oRS.Close
          Set oRS = Nothing

          Comment


          • #6
            Hallo,

            ich habe gerade einen Link gefunden, der zum Thema passt: http://www.codeproject.com/useritems...BA_Library.asp. Dem Artikel VBA Library To Simplify ADO/Excel Object Model Development ist eine Beispiel-XLS beigefügt.

            Comment

            Working...
            X