Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
468to472
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
468to472
468to472
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

1. ADODB und Recordset; 2. Userform und Textbox

1. ADODB und Recordset; 2. Userform und Textbox
14.08.2004 12:29:12
Martin
Hallo,
folgende Ausgangssituation:
Es gibt eine (extern eingekaufte) Access-Anwendung, mit der bestimmte Kunden- und Referenzdaten bearbeitet werden. Die eigentlichen Daten sind in einer MDB-Datei abgelegt. Die MDB liegt auf einem Server in unserer Firma, dass mehrere Leute von unterschiedlichen Standorten damit arbeiten können (ja ich weiß, ne SQL-Server-Variante wäre besser, aber unser Chef will da kein Geld für ausgeben). Leider stellt die Access-Anwendung nicht alle spezifischen Funktionen bereit, die ich für Controlling-Zwecke benötige. Eine Anpassung ist nicht möglich. Deshalb habe ich ein Excel-Frontend entwickelt, das mir spezifische Abfragen und Auswertungen ermöglicht. Soweit so klar?
Nun meine 1. Frage:
Die Access-Daten der MDB-Datei werden von mir per ODBC und nem SQL-Query "abgeholt" und in einen Recordset geschrieben. Aus dem Recordset werden die Daten dann in mein Tabellenblatt "Daten" geschrieben. Ich verwende dabei folgende Lösung, wobei ich die aus diesem Board hier habe (ob es schnellere und elegantere gibt, weiß ich nicht, die hier funktioniert über "ActiveX Data Objects 2.x"):

Sub ADO_Recordset_komplett_uebernehmen(vblQuery)
' Ein Recordset wird mit sämtlichen Feldern
' in eine Tabelle übernommen
Application.ScreenUpdating = False
Dim con As ADODB.Connection
Dim datei As String
Dim fld As Field
Dim rs As ADODB.Recordset
Dim spalte As Long
Dim accTab As String
Dim ws As Worksheet
Dim zeile As Long
' (0) SQL-String
accTab = "SELECT * FROM tblKunde WHERE (tblkunde.KdNr Like '%" & vblQuery & "%')"
' (1) Verbindung zur Datenbank herstellen
datei = "k:\SGB2Anw\SGB2_dat.mdb"
Set con = New ADODB.Connection
con.Open ConnectionString:= _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & datei
' (2) Recordset erstellen
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseServer
rs.Open Source:=accTab, _
ActiveConnection:=con, _
CursorType:=adOpenKeyset, _
LockType:=adLockReadOnly, _
Options:=adCmdTableDirect
' (3) Recordset auflisten
' (3a) Tabellenblatt vorbereiten
Set ws = ThisWorkbook.Worksheets("Daten")
ws.UsedRange.ClearContents
' (3b) Spaltenüberschriften schreiben
'spalte = 1
'For Each fld In rs.Fields
'ws.Cells(1, spalte) = fld.Name
'spalte = spalte + 1
'Next fld
' (3c) Sätze des Recordsets auflisten
ws.Range("A2").CopyFromRecordset _
Data:=rs, _
MaxRows:=ws.Rows.Count - 1, _
MaxColumns:=ws.Columns.Count
' (3d) Tabellenblatt formatieren
'ws.UsedRange.Columns.AutoFit
' (4) Recordset und Verbindung schließen
rs.Close
con.Close
Set rs = Nothing
Set con = Nothing
Application.ScreenUpdating = True
End Sub

Die konkrete Frage lautet nun: in Office XP dauert die Abfrage nicht sehr lange, aber das Einlesen des Recordsets in die Tabelle. Während des Einlesens erscheint immer wieder in der Statuszeile Dinge wie "Zeile...". Kann man das irgendwie beschleunigen oder verhindern, dass die Statuszeile geändert wird? Gibt es eine schnellere Variante zur Abfrage der Daten mittels SQL-Query?
Nun die 2. Frage:
In einer TextBox in einer UserForm gebe ich als Suchkriterium z.B. die Kundennummer ein (in der UserForm wird es unterschiedliche Suchkriterien geben). Daraus wird ein Query-String erzeugt (z.B. SELECT * from tblKunde WHERE KNR="%050%") und an die unter 1. genannte Abfrage geschickt. Das Ergebnis wird im Tabellenblatt Daten dargestellt. Mit folgendem Code habe ich das mal versucht umzusetzen:


Private Sub txtKNR_Change()
ADO_Recordset_komplett_uebernehmen (txtKNR)
End Sub


Das klappt auch. Aber leider wird dabei eben bei jeder Eingabe in diesem Feld die Query durchgeführt. Ich möchte aber, dass die Query erst dann ausgeführt wird, wenn innerhalb von 1 Sekunde keine weitere Eingabe im Feld erfolgt, sodass man die Chance hat, den zu suchenden Kunden(teil)string vollständig einzugeben, bevor gesucht wird.
Konkret stellt sich die Frage: Wie schaffe ich, dass erst dann die Query ausgelöst wird, wenn die letzte Änderung/Eingabe in dem Feld 1 Sekunde her ist?
Ich hoffe Ihr könnt mir helfen, ich stehe nämlich auf dem Schlauch.
Danke und Gruß
Martin

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: 1. ADODB und Recordset; 2. Userform und Textbox
Ulf
zu1: zeitweilig alle Excel- Events ausschalten.
zu2: das Change-Ereignis wird bei jeder Änderung ausgelöst, verwende ein anderes Ereignis, z.B. exit.
Ulf
AW: 1. ADODB und Recordset; 2. Userform und Textbox
14.08.2004 13:54:15
Martin
Danke.
Zu 1.: Wie schalte ich alle Events aus?
Zu 2.: Ich will aber das Feld nicht extra verlassen müssen. Auch will ich keine Schaltfläche "Suchen" oder so verwenden. Es soll just-in-time gesucht werden, sobald die letzte Eingabe länger als 1 Sekunde zurückliegt.
Martin
AW: 1. ADODB und Recordset; 2. Userform und Textbox
14.08.2004 14:05:34
Thomas
Hallo Martin
1; Application.EnableEvents = False
2; Schau Dir mal das TimerControl auf meiner Webseite an, damit ist es ganz einfach.


      
Option Explicit
Dim Blocked As Boolean
Private Sub TextBox1_Change()
    Blocked = 
False
    TimerControl1.Deactivate
    TimerControl1.Start
End Sub
Private Sub TimerControl1_OnTime()
    
If Not Blocked Then
        MsgBox 
"TEST"
        Blocked = 
True
    
End If
End Sub 


Gruß
Thomas
Risi Thomas Softwareentwicklung
Anzeige
AW: 1. ADODB und Recordset; 2. Userform und Textbox
14.08.2004 15:17:42
Martin
Hallo Thomas,
super, danke für Deine Hilfe und Deinen Tipp.
Grüße
Martin
AW: 1. ADODB und Recordset; 2. Userform und Textbox
Ulf
"Es soll just-in-time gesucht werden, sobald die letzte Eingabe länger als 1 Sekunde zurückliegt."
Könntest du auch so ausdrücken: Sofort, halt nur später!
Ulf
AW: 1. ADODB und Recordset; 2. Userform und Textbox
14.08.2004 15:16:08
Martin
"Könntest du auch so ausdrücken: Sofort, halt nur später!"
Da vergleichst Du Äpfel mit Birnen.
Just-In-Time heißt übersetzt soviel wie "gerade rechtzeitig", also dann wenn man es braucht. Die Suche auslösen ist dann gerade rechtzeitig, wenn seit der letzten Eingabe 1 Sekunde vergangen ist.
Anders ausgedrückt: genau dann, wenn ein Kriterium erfüllt ist, soll gesucht werden. Die Suche soll ohne weiter Schritte des Nutzers ausgelöst werden, wenn das Kriterium Zeitverlauf erfüllt ist.
Anzeige
AW: 1. ADODB und Recordset; 2. Userform und Textbox
Ulf
Na ja, Hauptsache, du hast jetzt eine Lösung.
Ulf
AW: 1. ADODB und Recordset; 2. Userform und Textbox
14.08.2004 15:36:32
Martin
Stimmt, da hast Du Recht. ;-)
Deshalb nochmal ein dickes Dankeschön für Deine Hilfe!
Martin

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige