SQL-Count Ergebnis als Variable speichern
Hallo könnt ihr mir vielleicht helfen
dieses vbs script zieht Daten aus unserer MySQL DB in xls:
In diesem Code ist die Gesamtanzahl fest vergeben, kann man die Gesamtaanzahl als Ergebnis dieses Sql Statements übernehmen?
Das ist nämlich die Anzahl die ich in meinem "alten" Code als festen Wert drin habe
Jemand eine Idee??
dieses vbs script zieht Daten aus unserer MySQL DB in xls:
Option Explicit
'---- CursorTypeEnum Values ----
Const adOpenForwardOnly = 0
' Const adOpenKeyset = 1
' Const adOpenDynamic = 2
' Const adOpenStatic = 3
'---- LockTypeEnum Values ----
Const adLockReadOnly = 1
' Const adLockPessimistic = 2
' Const adLockOptimistic = 3
' Const adLockBatchOptimistic = 4
'---- CursorLocationEnum Values ----
' Const adUseServer = 2
Const adUseClient = 3
'---- ConnectModeEnum Values ----
' Const adModeUnknown = 0
Const adModeRead = 1
' Const adModeWrite = 2
' Const adModeReadWrite = 3
' Const adModeShareDenyRead = 4
' Const adModeShareDenyWrite = 8
' Const adModeShareExclusive = &Hc
' Const adModeShareDenyNone = &H10
' Const adModeRecursive = &H400000
Dim objExcel, objWb, SkriptPfad
Dim objSheet
Dim Conn, RS
Dim rowCount, i, headerSet
Dim x 'Zähler für Statusbar
Dim Gesamtanzahl
Dim Ergebnis
x = 0 'Anfangswert für Zähler
Gesamtanzahl =1443
rowCount = 1
SkriptPfad = WScript.ScriptFullName 'Pfadermittlung
SkriptPfad = Left(SkriptPfad, Len(SkriptPfad) - Len(WScript.ScriptName)) 'Pfadermittlung
Set objExcel = CreateObject("Excel.Application")
Set objWb = objExcel.Workbooks.Open(SkriptPfad & "../test.xls")'öffnet die angegebene xls
objExcel.Visible = True
objExcel.Sheets("Datenbasis").Select 'wählt die angegebene Mappe der zuvor geöffneten xls
objExcel.Range("Datenbasis!$1:$65536").ClearContents 'löscht alle Inhalte von angegebener Mappe
'Angabe des Tabellenblattes
Set objSheet = objExcel.ActiveWorkbook.WorkSheets("Datenbasis") 'Import in angegebenes Tabellenblatt
Set Conn = CreateObject("ADODB.Connection")
Conn.Provider = "MSDASQL"
Conn.Mode = adModeRead
Conn.CursorLocation = adUseClient
Conn.Open "DRIVER={MySQL ODBC 5.1 Driver};" & _
"DATABASE=db;" & _
"SERVER=server;", _
"user", "pw"
Set RS = CreateObject("ADODB.Recordset")
RS.CursorLocation = adUseClient
'verwendete SQL-Anweisung
RS.Source = "Select * From Kundentab;"
Set RS.ActiveConnection = Conn
RS.CursorType = adOpenForwardOnly
RS.LockType = adLockReadOnly
RS.Open
Do While Not RS.EOF
objExcel.StatusBar = Ergebnis & " % "&"der Datensätze aus DB importiert" 'Text für Statusbar
'Die Spalenüberschriften einfügen Bezug aus dem SQL-Statement
If( headerSet = 0 ) Then
For i = 0 to RS.Fields.Count - 1
objSheet.Cells(rowCount, i+1).Value = RS.Fields.Item(i).Name
Next
headerSet = 1
End If
'Die dazugehörigen Werte einfügen
For i = 0 to RS.Fields.Count -1
objSheet.Cells(rowCount+1, i+1).Value = RS.Fields.Item(i).Value
Next
rowCount = rowCount + 1
RS.MoveNext
x = x + 1
'Ergebnis = Round((x/Gesamtanzahl) * 100, 0)
Ergebnis = Int((x/Gesamtanzahl) * 100)
Loop
objExcel.Statusbar = False 'Statusbar bereinigen
objExcel.Sheets("Pivot1").Select 'wählt die angegebene Mappe der zuvor geöffneten xls
RS.Close
Set RS = Nothing
Conn.Close
Set Conn = Nothing
MsgBox "Datenimport aus DB abgeschlossen! Die Datenbasis zeigt den Stand vom " & Date & " bis " & Time & "!" & vbCrLf & "Aktualisieren Sie die Pivottabellen über die Schaltfläche!" & vbCrLf & "Es wurden " & x & " Datensätze aus DB importiert",64, "Info"
In diesem Code ist die Gesamtanzahl fest vergeben, kann man die Gesamtaanzahl als Ergebnis dieses Sql Statements übernehmen?
SELECT COUNT(*) AS Anzahl FROM Kunden where kndnr.= 1020;
Das ist nämlich die Anzahl die ich in meinem "alten" Code als festen Wert drin habe
Jemand eine Idee??
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 110694
Url: https://administrator.de/contentid/110694
Ausgedruckt am: 15.11.2024 um 05:11 Uhr
13 Kommentare
Neuester Kommentar
Moin Moin
Genau so wie du es die ganze Zeit machst:
Recordset füllen. Daten aus RS lesen.
So in etwa:
Gruß L.
Genau so wie du es die ganze Zeit machst:
Recordset füllen. Daten aus RS lesen.
So in etwa:
...
RS.Source = "SELECT COUNT(*) AS Anzahl FROM Kunden where kndnr.= 1020;"
Set RS.ActiveConnection = Conn
RS.CursorType = adOpenForwardOnly
RS.LockType = adLockReadOnly
RS.Open
Gesamtanzahl = RS.Fields("Anzahl").Value
...
Gruß L.
Moin KikiMiki,
Solltest Du niemals tun - Recycling von Variablen kommt auf der DONOT-Liste der Programmierung dierkt nach dem Copy-und-Pasten von Code-Blöcken und dem Löschen von Kommentaren vor Sourcecode-Übergabe an den Kunden.
Ist wie im richtigen Leben - wenn Du aus Spaß irgendwelche Objekte, Nachkommen, Einladungen zu Partys oder Gerüchte in die Welt setzt, dann bist Du der Erzeuger und bist dafür verantwortlich, bis es wieder aus der Welt ist.
Selbst in "richtigen" Datenbanken ist die Gesamtzahl auf dem Client "offener" Cursor und vergessener Connections durchaus eine begrenzte Ressouce.
Wenn auf einer DB2 oder einer Oracle-DB 500 Clients lang vergessene Cursor "nicht gesclossen" haben und immer noch die Connection halten, dann bekommt der 501ste Client bei irgendeiner Abfrage, die IMMER funktioniert bisher einen "Unavailable Ressource"-Error.
Anyhow, wenn Du es für eleganter hältst mit nur EINEM Recordset-Object auskommen zu wollen, dann nimm nur eines und hole Dir die Gesamtanzahl aus dem
RS.RecordCount -Property des (jetzigen) zweiten Recordset-Objects und lass die komplette erste Abfrage wech.
Grüße
Biber
Eine Frage: Kann ich bei beiden Abfragen die Variable RS. nehmen???
Warum soltest Du so etwas tun? Ist das umweltschonender, performanter oder macht den Code wartbarer?Solltest Du niemals tun - Recycling von Variablen kommt auf der DONOT-Liste der Programmierung dierkt nach dem Copy-und-Pasten von Code-Blöcken und dem Löschen von Kommentaren vor Sourcecode-Übergabe an den Kunden.
Muss ich auch nach der Count Abfrage das Conn schließen
Warum soltest Du so etwas NICHT tun? Ist das umweltschonender, performanter oder macht den Code wartbarer, wenn Du es weglässt?Ist wie im richtigen Leben - wenn Du aus Spaß irgendwelche Objekte, Nachkommen, Einladungen zu Partys oder Gerüchte in die Welt setzt, dann bist Du der Erzeuger und bist dafür verantwortlich, bis es wieder aus der Welt ist.
Selbst in "richtigen" Datenbanken ist die Gesamtzahl auf dem Client "offener" Cursor und vergessener Connections durchaus eine begrenzte Ressouce.
Wenn auf einer DB2 oder einer Oracle-DB 500 Clients lang vergessene Cursor "nicht gesclossen" haben und immer noch die Connection halten, dann bekommt der 501ste Client bei irgendeiner Abfrage, die IMMER funktioniert bisher einen "Unavailable Ressource"-Error.
Anyhow, wenn Du es für eleganter hältst mit nur EINEM Recordset-Object auskommen zu wollen, dann nimm nur eines und hole Dir die Gesamtanzahl aus dem
RS.RecordCount -Property des (jetzigen) zweiten Recordset-Objects und lass die komplette erste Abfrage wech.
Grüße
Biber
Moin KikiMiki,
[OT] Und warum nicht "während des Imports"? Rheinländer? [/OT]
--> wenn Du Excel NICHT öffnen willst, dann solltest Du den Schnipsel oben komplett als VBScript (nicht als VBA) laufen lassen.
Außer den ad-Konstanten, die Du halt in VBS selbst definieren musst kaum Unterschiede.
Aber dennoch können wir doch erstmal das VBA-Fragment zum Fliegen bringen.
Hast Du mal versucht, mit EINEM RecordSet und dem RecordCount-Property zum Ziel zu kommen?
Grüße
Biber
zunächst einmal vielen Dank für deine lange Antwort
Dafür nich'.Doch erhlich gesagt bin ich nicht der DB Fachmann.
Meine Antworten haben auch nichts DB-spezifisches an sich - ging ganz allgemein um Codequalität.Es wäre halt net die Count Abfrage zu nutzen um den User über den Fortschritts des Imports zu informieren
Ich habe Deine Frage verstanden - hast Du auch meine Antwort auf Relevanz für Dein Problem gescannt?Am liebsten wäre mir das Excel während dem Import gar nicht sichtbar ist.
Okay. Warum sagst Du dann oben "objExcel.Visible = True "?[OT] Und warum nicht "während des Imports"? Rheinländer? [/OT]
Der Import über einen Fortschrittsbalken angezeigt wird.
Dafür allerdings brauchst Du zwar kein Excel-Sheet, aber ein Fenster wäre hilfreich.--> wenn Du Excel NICHT öffnen willst, dann solltest Du den Schnipsel oben komplett als VBScript (nicht als VBA) laufen lassen.
Außer den ad-Konstanten, die Du halt in VBS selbst definieren musst kaum Unterschiede.
Aber dennoch können wir doch erstmal das VBA-Fragment zum Fliegen bringen.
Hast Du mal versucht, mit EINEM RecordSet und dem RecordCount-Property zum Ziel zu kommen?
Grüße
Biber