VB6 - Löschabfrage

Hallo,

ich habe eine Access97 Datenbank mit einer Reihe Tabellen und Abfragen.

Unter anderem auch eine Löschabfrage, d.h. eim Ausführen dieser Abfrage offnet Access noch Inputboxen, in die ich Parameter eingeben muss und Access löscht mir dann die entsprechenden Datensätze aus der Tabelle.

Wie kann ich diese Abfrage mit VB6 ausführen?

Gruß, Rainer

ich habe eine Access97 Datenbank mit einer Reihe Tabellen und
Abfragen.
Unter anderem auch eine Löschabfrage, d.h. eim Ausführen
dieser Abfrage offnet Access noch Inputboxen, in die ich
Parameter eingeben muss und Access löscht mir dann die
entsprechenden Datensätze aus der Tabelle.
Wie kann ich diese Abfrage mit VB6 ausführen?

Hallo Rainer,

am besten du würdest da diesen Jürgen fragen, der die zweite der unten aufgeführten Antworten gab, so wie er sich beschreibt auf der Webseite scheint er genau in den Punkten fit zu sein.

Auf jeden Fall sagt er eindeutig, daß Access diese Inputboxen bringt, dies ab er mit VB nicht geht, man muß die Parameter gleich in die SQL-Anfrage mit einbauen.
Dies scheint der erste Code zu tun.

Gruß
Reinhard

'************** http://www.thescripts.com/forum/thread542019.html *********
Sub tt()
Dim CNN As New ADODB.Connection
Dim sQueryName As String
Dim rs As New ADODB.Recordset
Dim Com As New ADODB.Command
sQueryName = „STOCK_VIEW_G_TOTAL“
With Com
Set .ActiveConnection = CNN
.CommandText = sQueryName
.CommandType = adCmdStoredProc
.Parameters.Append .CreateParameter(„ENTER_ITEM_NAME“, adVarChar, adParamInput, Len(CmbSType.Text), CmbSType.Text)
.Parameters.Append .CreateParameter(„FINANCE_YEAR“, adVarChar, adParamInput, Len(CStr(FNYear)), FNYear)
End With
Set rs = Com.excute
End Sub

'*************** http://en.allexperts.com/q/Visual-Basic-1048/run-Acc… ********
'a normal query of Access you CAN run from VB.
'But you cannot access any macro or form. And if you use parameters in your query, Access will ask for them with a small input dialog, VB will not do that.
'But you CAN bind values of your VB application to the parameters in the query, although I do not really remember how this works in detail.
'The easier way is to build the SELECT statement dynamically at runtime. Switch the Access query to SQL view to have the basis for your dynamically built queries. Dependent of the values of your search fields (the company name for example) replace the parameter in your query.
Dim lsSQL As String
‚build the select string here
lsSQL = „SELECT customer_name FROM customers WHERE customer_name LIKE '“ & var_holding_search_pattern & "‘"
'create a new recordset
Set ladoRecordset = New ADODB.Recordset
'open the recordset with the Select statement
ladoRecordset.Open lsSQL, ladoConnection
'step through the recordset to handle the results or
'bind the recordset as the datasource to a datacontrol
'or to a set of controls on your form…
'Hoping this helps,
'Juergen
’ ****************************************************************************************
'Die Links gefunden mit:
http://www.google.de/search?hl=de&q=vb+access+query+…
http://www.google.de/search?hl=de&q=vb+access+query&…

’ jeweils gleich der erste Treffer.

Hallo Reinhard,

am besten du würdest da diesen Jürgen fragen, der die zweite
der unten aufgeführten Antworten gab, so wie er sich
beschreibt auf der Webseite scheint er genau in den Punkten
fit zu sein.

das würde ich tun, wenn da nich stehen würde ‚geht nicht‘.

Auf jeden Fall sagt er eindeutig, daß Access diese Inputboxen
bringt, dies ab er mit VB nicht geht, man muß die Parameter
gleich in die SQL-Anfrage mit einbauen.
Dies scheint der erste Code zu tun.

Schade, alles neu machen. :frowning: Das ist natürlich mehr als eine Abfrage, um die es geht. Das habe ich alles mal vor ein paar Jahren gemacht und weiß kaum noch, was ich da exakt gemacht hatte. Ich hätte schon gern das Fertige benutzt, wenn das aber nicht geht, habe ich eben eine Woche Arbeit.

'Die Links gefunden mit:

http://www.google.de/search?hl=de&q=vb+access+query+…
http://www.google.de/search?hl=de&q=vb+access+query&…

Das siht ja richtig gut aus! :smile: Dann werde ich mal alles neu machen …

Danke!

Gruß, Rainer

Hallo Rainer,

am besten du würdest da diesen Jürgen fragen, der die zweite
der unten aufgeführten Antworten gab, so wie er sich
beschreibt auf der Webseite scheint er genau in den Punkten
fit zu sein.

das würde ich tun, wenn da nich stehen würde ‚geht nicht‘.

Schade:frowning:

Auf jeden Fall sagt er eindeutig, daß Access diese Inputboxen
bringt, dies ab er mit VB nicht geht, man muß die Parameter
gleich in die SQL-Anfrage mit einbauen.
Dies scheint der erste Code zu tun.

Schade, alles neu machen. :frowning: Das ist natürlich mehr als eine
Abfrage, um die es geht. Das habe ich alles mal vor ein paar
Jahren gemacht und weiß kaum noch, was ich da exakt gemacht
hatte. Ich hätte schon gern das Fertige benutzt, wenn das aber
nicht geht, habe ich eben eine Woche Arbeit.

Ist ja prinzipiell erstmal egal um wieviele Datenbanken und wieviele Abfragen es geht.

Wenn du weißt wie du mit Access-Vba einer Abfrage einen Parameter mitgeben kannst um den in einer Datenbank löschen zu lassen, ist der Rest ja nur noch Schleifenbildung und Aufruf samt Parameterübergabe des Vba-Makros durch dein VB.

Und da kommt das hiesige Access-Brett ins Spiel, in deren FAQ gibt es zumindest 2 nette Linkliste, wo man evtl. Code um Abfragen aufzurufen finden kann.
Und ins Accessbrett kann man ja auch eine Anfrage stellen…

Abgesehen davon, daß WE war und die Woche erst beginnt und Anno u.ä. deine Anfrage hier noch gar nicht lasen.

Gruß
Reinhard

'Die Links gefunden mit:

http://www.google.de/search?hl=de&q=vb+access+query+…
http://www.google.de/search?hl=de&q=vb+access+query&…

Das siht ja richtig gut aus! :smile: Dann werde ich mal alles neu
machen …

Danke!

Gruß, Rainer

Hallo Reinhard,

Ist ja prinzipiell erstmal egal um wieviele Datenbanken und
wieviele Abfragen es geht.

Wenn du weißt wie du mit Access-Vba einer Abfrage einen
Parameter mitgeben kannst um den in einer Datenbank löschen zu
lassen, ist der Rest ja nur noch Schleifenbildung und Aufruf
samt Parameterübergabe des Vba-Makros durch dein VB.

Es geht grundsätzlich um Abfragen, die als ‚Stored Procedur‘ verstanden werden und etwas ausführen. Das muss nicht immer löschen sein.
Was tatsächlich bereits passiert, ist Daten aus ein paar Tabellen zu archivieren. Die Tabellen, mit denen täglich gearbeitet wird sollen nicht zu viele Daten enthalten, sonst werden die Programme langsam. Insgesamt fallen in der Datenbank monatlich rund 10 000 Datensäte an.

Und da kommt das hiesige Access-Brett ins Spiel, in deren FAQ
gibt es zumindest 2 nette Linkliste, wo man evtl. Code um
Abfragen aufzurufen finden kann.
Und ins Accessbrett kann man ja auch eine Anfrage stellen…

Da passt aber nicht immer alles zu VB. Ich habe nämlich aktuell kein Access, das ist der Auslöser für die Aktivität. :smile: Plattencrash und ich finde nur Access2000 oder 2003, mein Access97 ist verschwunden. Keine Ahnung, wer das hat. :frowning: Nun sind dank Datensicherung alle Daten da, aber ich kann Access97 nicht neu installieren.

Abgesehen davon, daß WE war und die Woche erst beginnt und
Anno u.ä. deine Anfrage hier noch gar nicht lasen.

Ja! :smile: Ich komme ja mit dem Data-Manager an die Abfragen und die SQL-Strings, die da stehen, Alex wird mir sicher sagen können, wie ich die mit VB6 verwenden kann. Dann wird das eventuell nur eine halbe Stunde kopieren … :smile:

Gruß, Rainer

Hallo,

Auf jeden Fall sagt er eindeutig, daß Access diese Inputboxen
bringt, dies ab er mit VB nicht geht, man muß die Parameter
gleich in die SQL-Anfrage mit einbauen.
Dies scheint der erste Code zu tun.

Richtig ist das Inputboxen nicht in einer DB hinterlegt werden koennen und dann automatisch aufgerufen werden.

http://www.thescripts.com/forum/thread542019.html *********
Sub tt()
Dim CNN As New ADODB.Connection
Dim sQueryName As String
Dim rs As New ADODB.Recordset
Dim Com As New ADODB.Command
sQueryName = „STOCK_VIEW_G_TOTAL“
With Com
Set .ActiveConnection = CNN
.CommandText = sQueryName
.CommandType = adCmdStoredProc
.Parameters.Append .CreateParameter(„ENTER_ITEM_NAME“,
adVarChar, adParamInput, Len(CmbSType.Text), CmbSType.Text)
.Parameters.Append .CreateParameter(„FINANCE_YEAR“,
adVarChar, adParamInput, Len(CStr(FNYear)), FNYear)
End With
Set rs = Com.excute
End Sub

'***************

Rein Theoretisch sollten Stored Proceduren auf eine Access DB funktionieren! Ich hatte mal das selbe Problem und habe es soweit geschafft das die Stored Procedure incl. Parameter gespeichert wurde in der DB. Solange die DB geöffnet war, konnte man auf die Stored Procedure zugreifen! Wurde aber die DB geschlossen und erneut geöffnet, so war die Stored Procedure weg :confused:
Nach langem suchen, bekam ich die Bestaetigung das SP in einer Access DB nicht funktionieren!
Das einzigste was geht, sind das man View’s anlegt!
So pauschal ohne zu probieren, würde ich sagen das man einen View umbauen kann, so das es dann die gewuenschten Daten löscht!

Aber was spricht dagegen eine Inputbox im Vorfeld aufploppen zu lassen! Die Eingaben speichern und dann das Statement zusammenzubasteln und auszuführen?

MfG Alex

Hi Alex,

Aber was spricht dagegen eine Inputbox im Vorfeld aufploppen
zu lassen!

Muss nicht sein, die Daten kann auch das Programm erzeugen, darum geht es mir nicht.

Die Eingaben speichern und dann das Statement
zusammenzubasteln und auszuführen?

Nichts, ich weiß nur nicht wie.

Wie kann ich z.B. eine Löschabfrage erzeugen? Minibeispil: Eine Datenbank enthält eine ‚Tabelle‘ mit nur einem Feld, in dem Zahlen von 1 bis 1000 stehen. Wie kann ich alle Zahlen von 20 bis 50 mit einer Abfrage, ohne Schleife löschen? Wenn ich weiß, wie das geht, kann ich auch die anderen Abfragen ausführen, bei denen der Vorgang dann etwas schwerer zu beschreiben ist, der SQL-String ist eine halbe Seite lang. :smile:

Gruß, Rainer

Moin, Rainer,

Wie kann ich alle Zahlen von
20 bis 50 mit einer Abfrage, ohne Schleife löschen?

SqlString = "Delete from meineTabelle where meinFeld \> 19 and meinFeld 

Gruß Ralf

Hallo Rainer,

Muss nicht sein, die Daten kann auch das Programm erzeugen,
darum geht es mir nicht.

Gut :smile:

Die Eingaben speichern und dann das Statement
zusammenzubasteln und auszuführen?

Nichts, ich weiß nur nicht wie.

Na wie man eine Eingabe speichert das weisst du doch ?

Dim strX as String
strX=Inputbox (.....)

Wenn wir diese Eigabe nun in ein SQL Statement basteln , weisst du auch

Dim strSQL as String
strSQL = "Select \*FROM DeineTabelle WHERE DeinFeld Like '" & strX & "';"


    
    
    
    
    > Wie kann ich z.B. eine Löschabfrage erzeugen? Minibeispil:  
    > Eine Datenbank enthält eine 'Tabelle' mit nur einem Feld, in  
    > dem Zahlen von 1 bis 1000 stehen. Wie kann ich alle Zahlen von  
    > 20 bis 50 mit einer Abfrage, ohne Schleife löschen? Wenn ich  
    > weiß, wie das geht, kann ich auch die anderen Abfragen  
    > ausführen, bei denen der Vorgang dann etwas schwerer zu  
    > beschreiben ist, der SQL-String ist eine halbe Seite lang. :smile:
    
    
    
        
        'so aus dem Stehgreif heraus
        
        Dim strSQL as String
        strSQL = "DELETE FROM DeineTabelle WHERE DeinFeld BETWEEN '20' and 50';"
        'oder Alternativ
        
        strSQL = "DELETE FROM DeineTabelle WHERE DeinFeld \>19 and DeinFeld 
        
        
        
        > Gruß, Rainer
        
        MfG Alex

Hi Ralf,

SqlString = "Delete from meineTabelle where meinFeld > 19
and meinFeld

Danke! Wies geklappt hat, siehst Du morgen am Stern. :smile:

Gruß, Rainer

Hi Alex,

danke! Das werde ich morgen mal ausprobieren. Irgendwie hat heute nichts funktioniert, mal sehen ob das morgen besser läuft.

Kommentar folgt. :smile:

Gruß, Rainer

Hi Rainer,

das Prinzip ist immer das gleiche: Mit der Where-Klausel wird die Menge bestimmt, auf der die gewünschte Operation auszuführen ist. Beim Update ist das nicht anders.

Wer für Änderungs- oder Löschoperationen Schleifen strickt, der hat SQL nicht verstanden :smile:

Gruß Ralf

Hi Ralf,

das Prinzip ist immer das gleiche: Mit der Where-Klausel wird
die Menge bestimmt, auf der die gewünschte Operation
auszuführen ist. Beim Update ist das nicht anders.

Dann gehe ich mal heute zeitig schlafen, eventuell fällt mir dann ja morgen ein, wie ‚Append‘ heißt.

Wer für Änderungs- oder Löschoperationen Schleifen strickt,
der hat SQL nicht verstanden :smile:

Richtig. Ich stehe mit ADO auch immer noch etwas auf Kriegsfuß, ich kann es mir einfach nicht merken.

Gruß, Rainer

Moin, Rainer,

Dann gehe ich mal heute zeitig schlafen, eventuell fällt mir
dann ja morgen ein, wie ‚Append‘ heißt.

Anfügen :smile:)) Dabei fragt man, welche Sätze bereits in der Datenbank vorhanden sind, ungefähr

insert into t1 ()
 select 
 from t2 
 where t2.key not in (select key from t1)

Ich stehe mit ADO auch immer noch etwas auf Kriegsfuß

ADO kann da nichts für, das ist SQL oder halt der Umgang mit relationalen Datenabnken.

Gruß Ralf

Hi Ralf,

ganz bin ich immer noch nicht am Ziel.

Wenn ich den SQL-String ab ‚Select …‘ verwende, funktioniert alles, die Tabelle wird angezeigt. (Im Code geht das einfach, ich ändere einfach die Schleife in ‚For i = 1 to …‘) :smile:

Wenn ich davor noch schreibe ‚Insert …‘ bekomme ich eine Fehlermeldung bei OpenRecordset.

Daß der SQL-String so richtig ist, bin ich mir sicher. Die letzte Zeile im Code ist wohl falsch, aber das ich da hin schreiben muss, weiß ich nicht. Stör Dich nicht an den Feldbezeichnungen, ich war zu faul, da extra Dummies einzutragen.

Option Explicit

Dim Db As Database, Rs As Recordset

Private Sub Command1\_Click()
 Dim SQLStr As String
 Dim dt1 As String
 Dim dt2 As String
 Dim dt As Date
 Dim s(7) As String
 Dim i As Integer

 dt = Date
 dt = DateAdd("d", -(Day(dt) - 1), dt)
 dt = DateAdd("m", -1, dt)
 dt = DateAdd("d", -1, dt)
 s(6) = "#" + CStr(Month(dt)) + "/" + CStr(Day(dt)) + "/" + CStr(Year(dt)) + "#" 'Bis Datum 
 dt = DateAdd("d", 1, dt)
 dt = DateAdd("m", -2, dt)
 s(4) = "#" + CStr(Month(dt)) + "/" + CStr(Day(dt)) + "/" + CStr(Year(dt)) + "#" 'Ab Datum

 s(0) = "INSERT INTO [Archiv Zettelnummern] ( Zettelnummer, Datum, Schicht ) "
 s(1) = "SELECT Zettelnummern.Zettelnummer, Zettelnummern.Datum, Zettelnummern.Schicht "
 s(2) = "FROM Zettelnummern "
 s(3) = "WHERE (((Zettelnummern.Datum)\>="
 s(5) = "And (Zettelnummern.Datum)

Gruß, Rainer

Moin,

Wenn ich davor noch schreibe ‚Insert …‘ bekomme ich eine
Fehlermeldung bei OpenRecordset.

Aktionen wie Insert, Delete, Update erfordern ein DoCmd.Runsql SqlString.

OpenRecordSet stellt Dir eine Datenmenge zur Verfügung, auf die wie bei einer sequentiellen Datei zugegriffen werden kann: ein Satz nach dem anderen; Aktionsbefehle operieren mit Mengen.

Gruß Ralf

Hi Ralf,

Aktionen wie Insert, Delete, Update
erfordern ein DoCmd.Runsql SqlString.

OpenRecordSet stellt Dir eine Datenmenge zur Verfügung, auf
die wie bei einer sequentiellen Datei zugegriffen werden kann:
ein Satz nach dem anderen; Aktionsbefehle operieren mit
Mengen.

und meine frage ist, wie mein Code aussehen muss, daß mir VB das INSERT ausführt.

DoCmd.Runsql SqlString

Das allein reicht nicht, das versteht mein VB nicht. Offensichtlich muss ich DoCmd erst dimensionieren, aber wie? Fehlt dann noch etwas?

Gruß, Rainer

DoCmd.Runsql SqlString
Das allein reicht nicht, das versteht mein VB nicht.

Wer ist jetzt VB - der Compiler?

Offensichtlich muss ich DoCmd erst dimensionieren, aber wie?

So langsam bringst Du mich ins Schleudern :wink:

Da wird nichts dimensioniert, das ist ein Befehl. Schreib es mal hin, setz den Cursor auf Runsql und hau auf die F1, dann siehst Du, ob VB die Anweisung kennt. Wenn nicht, bist Du im falschen Film.

Anweisungen, für die ein String zusammengestoppelt wird, laufen gern vor die Wand, weil der String fehlerhaft ist. Ich stopfe mir die Zeichenkette dann mit debug.print in den Direktbereich, kopiere das Ergebnis und füttere damit den Abfragegenerator, dann sehe ich, wo es hakt.

Gruß Ralf

Hallo Ralf,

Wer ist jetzt VB - der Compiler?

Die Entwicklungsumgebung.

Offensichtlich muss ich DoCmd erst dimensionieren, aber wie?

So langsam bringst Du mich ins Schleudern :wink:

Da wird nichts dimensioniert, das ist ein Befehl. Schreib es
mal hin, setz den Cursor auf Runsql und hau
auf die F1, dann siehst Du, ob VB die Anweisung kennt. Wenn
nicht, bist Du im falschen Film.

Ich bin im falschen Film. Mit F1 findet die Onlinehilfe weder DoCmd noch RunSql. Nach etwas Suche habe ich DoCmd dann in der Onlinehilfe gefunden, da steht:
‚Führt einen Visual FoxPro-Befehl …‘ Das wird mein Problem dabei sein, ich habe eine Access97-Datenbank, mein Code verwendet im Moment DAO. FoxPro habe ich noch nicht aus der Nähe gesehen.

Der String ist schon richtig, aber was ich damit mache noch nicht. :smile:

Gruß, Rainer

Hi Ralf,

da weiß ich jetzt nicht mehr weiter. Sieht ja aus, als hättest
Du nicht VB, sondern FoxPro.

Nö, das ist ein normales VB6, nur die Enterprise-edition. :smile:

Ob DAO oder ADO ist übrigens kein
Kriterium, von außen sieht das alles fast gleich aus
(http://www.activevb.de/tutorials/tut_ado_db/adodb.html).

Ich habe gerade mal bei AVB gefragt, die Auflösung schreibe ich dann oben als Antwort an mich.

ps: Wo schleppst Du mich denn hin - auf Sohle 14 war ich noch
nie.

*gg* Ich hab’s schon bis 50 geschafft. *fg*

Danke für die Unterstützung!

Gruß, Rainer