pl-q
Goto Top

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!):
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
Dann kommt 2x yes, was auch stimmt!

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
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]

Content-ID: 96157

Url: https://administrator.de/contentid/96157

Ausgedruckt am: 22.11.2024 um 09:11 Uhr

AndreasHoster
AndreasHoster 05.09.2008 um 09:57:28 Uhr
Goto Top
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)
PL-q
PL-q 05.09.2008 um 13:46:47 Uhr
Goto Top
Das Yes/No funktioniert und habe ServerID u. Server_ID in einem Modul schon außerhalb einer Funktion deklariert, also ist sie für alle Funktionen erreichbar. Es ist nur so, das ich anstatt 2x yes, 4x yes bekommen, obwohl in der DB nur 2 Einträge sind! Da es nur Zahlen sind, die ich vergleiche habe ich auch diese als Integer deklariert....

Da liegt es nicht, denn die Werte die ich abfrage, sind in den 2 Einträgen gleich, dann kommt 4x yes. Wenn ich aber den einen Wert verändere, sodass ich 2 verschiedene habe, dann kommt nur 1x no und 1x yes, was stimmt!

Ich glaube eher, dass was mit der Schleife nicht stimmt!

mfg
PL-q
AndreasHoster
AndreasHoster 05.09.2008 um 14:04:41 Uhr
Goto Top
Na ja, wenn Du 2 Mal die gleiche ServerID in der Tabelle hast, dann findet die Abfrage in Zeile 18 natürlich auch 2 Einträge und Du wirst 2 Mal gefragt bei jedem Channelname Aufruf. Und da Channelname 2 Mal aufgerufen wird macht das 2x2=4 Abfragen.
PL-q
PL-q 05.09.2008 um 15:38:33 Uhr
Goto Top
Habt ihr viellt. eine Idee wie ich das Problem beheben kann? Ist für mich nähmlich sehr wichtig!
PL-q
PL-q 06.09.2008 um 09:20:19 Uhr
Goto Top
Könnt ihr mir wirklich nicht weiterhelfen? oder habt ihr keine lust -.-
Biber
Biber 06.09.2008 um 19:08:04 Uhr
Goto Top
Moin PL-q,

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
AndreasHoster
AndreasHoster 12.09.2008 um 11:29:38 Uhr
Goto Top
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?