Bekomme das Ergebnis 2x mehr als das es in der DB steht(MySQL)
Hallo Leute,
ich habe grad was das Thema MySQL betrifft angefangen und bin totaler Anfänger in diesem Gebiet.
Wenn ich eine Anfrage durchführe, funktioniert alle Perfect, doch wenn ich mehrere Anfragen hintereinander ausführe, dann bekomm ich das ergebnis aber 2x!
Hier mal ein Code der funkt(Habe 2 Einträge in der DB, habe vorher natürlich die Notwendigen Sachen erledigt!):
Dann kommt 2x yes, was auch stimmt!
Versuch Nr. 2:
dann kommt 4x yes anstatt 2x! Das ist aber falsch, da ich nur 2 Einträge habe und ich muss mehrere Anfragen hintereinander machen.
Das muss wie ein Baumsystem verlaufen(heißt Tree o. so xD) Laufen
--Func1
[---Func2
[---Func3
und dann wider alles von vorne =)
Ich hoffe ihr könnt mir weiterhelfen =)
mfg
PL-q
[Edit Biber] Code-Tags ergänzt zur Lesbarkeit. [/Code]
ich habe grad was das Thema MySQL betrifft angefangen und bin totaler Anfänger in diesem Gebiet.
Wenn ich eine Anfrage durchführe, funktioniert alle Perfect, doch wenn ich mehrere Anfragen hintereinander ausführe, dann bekomm ich das ergebnis aber 2x!
Hier mal ein Code der funkt(Habe 2 Einträge in der DB, habe vorher natürlich die Notwendigen Sachen erledigt!):
Sub test1()
Server_id = 4
Dim sSQL As String
sSQL = "SELECT Server_ID FROM channels"
Set oRs = oConn.Execute(sSQL)
While Not oRs.EOF
DoEvents
ServerID = oRs.Fields(0).Value
If ServerID = Server_id Then
MsgBox "yes"
Else
MsgBox "no"
End If
oRs.MoveNext
Wend
If Not oRs Is Nothing Then oRs.CloseRecordset
Set oRs = Nothing
End Sub
Versuch Nr. 2:
Sub test1()
Server_id = 4
Dim sSQL As String
sSQL = "SELECT Server_ID FROM channels"
Set oRs = oConn.Execute(sSQL)
While Not oRs.EOF
DoEvents
ServerID = oRs.Fields(0).Value
channelnumb
oRs.MoveNext
Wend
If Not oRs Is Nothing Then oRs.CloseRecordset
Set oRs = Nothing
End Sub
Sub channelname()
Dim tSQL As String
tSQL = "SELECT Channel_Name FROM channels WHERE Server_ID LIKE " & ServerID
Set oRt = oConn.Execute(tSQL)
While Not oRt.EOF
channel_name = oRt.Fields(0).Value
If ServerID = Server_id Then
MsgBox "yes"
Else
MsgBox "no"
End If
oRt.MoveNext
Wend
If Not oRt Is Nothing Then oRt.CloseRecordset
Set oRt = Nothing
End Sub
Das muss wie ein Baumsystem verlaufen(heißt Tree o. so xD) Laufen
--Func1
[---Func2
[---Func3
und dann wider alles von vorne =)
Ich hoffe ihr könnt mir weiterhelfen =)
mfg
PL-q
[Edit Biber] Code-Tags ergänzt zur Lesbarkeit. [/Code]
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 96157
Url: https://administrator.de/contentid/96157
Ausgedruckt am: 22.11.2024 um 09:11 Uhr
7 Kommentare
Neuester Kommentar
Bei dem Code ist nicht fehlende MySQL Kenntnis das Problem, sondern Programmierkenntnis insgesamt.
Server_ID und Serverid ist in der sub channelname nicht definiert, daher macht Zeile 22 keinen Sinn und deswegen klappt wohl auch das Yes/No nicht.
Eine Variable, die in einer Sub definiert ist, ist nur in dieser Sub definiert, nicht in weiteren Subs.
Daher übergibt man Parameter an weitere Sub Routinen auch explizit.
In VBA wäre das so:
Zeile 9: channelname ServerID, Server_ID
Zeile 16: sub channelname(ServerID, Server_ID)
Server_ID und Serverid ist in der sub channelname nicht definiert, daher macht Zeile 22 keinen Sinn und deswegen klappt wohl auch das Yes/No nicht.
Eine Variable, die in einer Sub definiert ist, ist nur in dieser Sub definiert, nicht in weiteren Subs.
Daher übergibt man Parameter an weitere Sub Routinen auch explizit.
In VBA wäre das so:
Zeile 9: channelname ServerID, Server_ID
Zeile 16: sub channelname(ServerID, Server_ID)
Moin PL-q,
Deshalb muss wohl ein nervenstarker Moderator ran.
Da Du offensichtlich AndreasHoster's Kommentare nicht gelesen und/oder verstanden hast, fangen wir noch mal ein bisschen eher an.
Du hast versucht, einen Einstieg in strukturiertes Programmeren zu finden und eine Aufgabe in Teilaufgaben/Einzelkomponenten zu zerlegen.
Dieser Teil des Plan ist gut und richtig.
Danach hast Du als erstes mal angetestet, ob Du die einzelnen Lego-Klötzchen ( Haupt/Unterprogramm, ResultSet bilden und satzweise durchwackeln, Debug-Meldungen auf den Schirm bringen) irgendwie miteinander kombinieren kannst.
Das heißt auf neudeutsch proof-of-concept, ist nicht nur in der Software-Entwicklung üblich, sondern -ausgenommen Politik und Castingshows- in allen Lebensbereichen. Jedenfalls bei Individuen, die eine Körpergröße von 120cm und /oder ein Alter von 120 Monaten erreicht haben.
Auch soweit ist alles in Ordnung.
Jetzt allerdings kannst Du dieses Antesten erstmal wieder beiseite legen - hat doch geklappt.
Lösch den Quatsch und kümmere Dich erstmal um den Algorithmus, also um die Schritte, die der Codeschnipsel sinnvollerweise tun soll.
Anders ausgedrückt - Du willst einen Dübel in die Wand bringen und hast Dir dazu eine Bohrmaschine, einen Bohrer und einen Dübel bereitgelegt. Die Wahrscheinlichkeit, dass Du Dein Ziel erreichst, indem Du nacheinander diese drei Dinge an die Wand wirfst ist eher gering.
Mein Tipp: schreibe Dir erstmal auf Papier in Stichpunkten/in Pseudocode auf, was das Programm oben tut. Und lies es einmal bis dreimal durch.
Und schreib in Pseudocode auf, was das Programm eigentlich tun sollte.
Dann sollte keine weitere Hilfe erforderlich sein.
Wenn doch - poste dann noch mal.
Aber bitte auch den Pseudocode.
Grüße
Biber
Könnt ihr mir wirklich nicht weiterhelfen? oder habt ihr keine lust -.-
Wahrscheinlich.Deshalb muss wohl ein nervenstarker Moderator ran.
Da Du offensichtlich AndreasHoster's Kommentare nicht gelesen und/oder verstanden hast, fangen wir noch mal ein bisschen eher an.
Du hast versucht, einen Einstieg in strukturiertes Programmeren zu finden und eine Aufgabe in Teilaufgaben/Einzelkomponenten zu zerlegen.
Dieser Teil des Plan ist gut und richtig.
Danach hast Du als erstes mal angetestet, ob Du die einzelnen Lego-Klötzchen ( Haupt/Unterprogramm, ResultSet bilden und satzweise durchwackeln, Debug-Meldungen auf den Schirm bringen) irgendwie miteinander kombinieren kannst.
Das heißt auf neudeutsch proof-of-concept, ist nicht nur in der Software-Entwicklung üblich, sondern -ausgenommen Politik und Castingshows- in allen Lebensbereichen. Jedenfalls bei Individuen, die eine Körpergröße von 120cm und /oder ein Alter von 120 Monaten erreicht haben.
Auch soweit ist alles in Ordnung.
Jetzt allerdings kannst Du dieses Antesten erstmal wieder beiseite legen - hat doch geklappt.
Lösch den Quatsch und kümmere Dich erstmal um den Algorithmus, also um die Schritte, die der Codeschnipsel sinnvollerweise tun soll.
Anders ausgedrückt - Du willst einen Dübel in die Wand bringen und hast Dir dazu eine Bohrmaschine, einen Bohrer und einen Dübel bereitgelegt. Die Wahrscheinlichkeit, dass Du Dein Ziel erreichst, indem Du nacheinander diese drei Dinge an die Wand wirfst ist eher gering.
Mein Tipp: schreibe Dir erstmal auf Papier in Stichpunkten/in Pseudocode auf, was das Programm oben tut. Und lies es einmal bis dreimal durch.
Und schreib in Pseudocode auf, was das Programm eigentlich tun sollte.
Dann sollte keine weitere Hilfe erforderlich sein.
Wenn doch - poste dann noch mal.
Aber bitte auch den Pseudocode.
Grüße
Biber
Eher keine Zeit. Und im Urlaub auch keinen Internetanschluß.
Du hast da ein grundsätzliches Problem:
Du suchst im ersten Teil alle Datensätze, die einem bestimmten Kriterium entsprechen, gehst dann für jeden Datensatz in eine Subroutine, die erneut alle Datensätze, die diesem Kriterium entspricht, raussucht.
Damit ergibt sich zwwangsläufig, daß es, wenn es mehrere Datensätze gibt die dem Kriterium entsprechen, Deine Messagebox zu oft aufgerufen wird. Bsp: 3 Datensätze => Sub wird 3 Mal aufgerufen => Sub sucht 3 Datensätze raus => 3x3=9 Messageboxen.
Das lässt sich nur beheben, wenn jeder Datensatz eindeutig zu identifizieren ist, also einen Primärschlüssel hat. Dann kannst Du in der 2. Sub nach dem Primärschlüssel suchen und bekommst nur ein Ergebnis.
Alternativ, ist es sinnvoll, zwei selects auf dieselbe Tabelle zu machen?
Warum nicht ein Select * from channels und der zweiten Subroutine das Recordset als Parameter mitgeben?
Du hast da ein grundsätzliches Problem:
Du suchst im ersten Teil alle Datensätze, die einem bestimmten Kriterium entsprechen, gehst dann für jeden Datensatz in eine Subroutine, die erneut alle Datensätze, die diesem Kriterium entspricht, raussucht.
Damit ergibt sich zwwangsläufig, daß es, wenn es mehrere Datensätze gibt die dem Kriterium entsprechen, Deine Messagebox zu oft aufgerufen wird. Bsp: 3 Datensätze => Sub wird 3 Mal aufgerufen => Sub sucht 3 Datensätze raus => 3x3=9 Messageboxen.
Das lässt sich nur beheben, wenn jeder Datensatz eindeutig zu identifizieren ist, also einen Primärschlüssel hat. Dann kannst Du in der 2. Sub nach dem Primärschlüssel suchen und bekommst nur ein Ergebnis.
Alternativ, ist es sinnvoll, zwei selects auf dieselbe Tabelle zu machen?
Warum nicht ein Select * from channels und der zweiten Subroutine das Recordset als Parameter mitgeben?