SQL Abfrage Problem

Anfängerfragen zum Programmieren mit PureBasic.
TheSaint
Beiträge: 143
Registriert: 21.12.2008 18:59

SQL Abfrage Problem

Beitrag von TheSaint »

Hallo Zusammen,

mit diesem Code:

Code: Alles auswählen

            DBOpenOrClose(0) ;Hier wird eine Procedure aufgerufen (Wert 0 = Datenbank öffnen; Wert 1 = Datenbank schliessen)
            If IsDatabase(db)
                    SQL = "SELECT BUCHUNG.BNR, BUCHUNG.TEXT, BUCHUNG.BELEGNR "
                    SQL = SQL + "FROM BUCHUNG RIGHT JOIN LIEFERAN ON BUCHUNG.KHABEN = LIEFERAN.LIEFKNR "
                    SQL = SQL + "WHERE (((BUCHUNG.BELEGNR)<7000) And ((BUCHUNG.KSOLL)<40900));"
                    If DatabaseQuery(db, SQL)
                        While NextDatabaseRow(db)
                            For Counter = 0 To DatabaseColumns(db) - 1
                                Select Counter
                                    Case 0
                                        SQLBNR.s = GetDatabaseString(db, Counter)
                                    Case 1
                                        SQLBelegNr.s = StringField(GetDatabaseString(db, Counter), Counter, "_")
                                EndSelect
                            Next
                            SQL1 ="UPDATE BUCHUNG "
                            SQL1 = SQL1 + "SET BUCHUNG.BELEGNR =" + SQLBelegNr + " "
                            SQL1 = SQL1 + "WHERE ((BUCHUNG.BNR)=" + SQLBNR + ");"
                            If DatabaseQuery(db, SQL1)
                                
                            Else
                                MessageRequester("Fehler", "Kann die folgende Abfrage nicht ausführen: "+DatabaseError())
                            EndIf
                        Wend
                    EndIf
            EndIf
            FinishDatabaseQuery(db)
            DBOpenOrClose(1) ;Hier wird eine Procedure aufgerufen (Wert 0 = Datenbank öffnen; Wert 1 = Datenbank schliessen)
habe ich leider folgendes Problem, und zwar:

Der Code läuft soweit einwandfrei, bis auf, das die While Schleife nur einmal ausgeführt wird, obwohl ich in der der ersten "SQL" Abfrage mehrere Zeilen als Ergebnis habe.
Nachdem die zweite "SQL1" Abfrage ausgeführt wurde, sind alle Inhalte aus der "SQL" Abfrage weg.

Könnte mir hier jemand helfen, ich weis nicht, warum das so ist.
Verstehe ich nicht.

Schon mal vielen Dank für Eure Hilfe.
Gruß, TheSaint
___________________________
[ XP Prof SP 3 | Vista | PB 4.30 ]
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: SQL Abfrage Problem

Beitrag von Kiffi »

geschachtelte SQL-Abfragen mag PB leider nicht. Bleibt Dir nichts
anderes übrig, als die Ergebnisse der äußeren Schleife in beispielsweise
einer LinkedList zwischenzuspeichern und danach die innere Schleife über
die LinkedList laufen zu lassen.

Grüße ... Kiffi
a²+b²=mc²
TheSaint
Beiträge: 143
Registriert: 21.12.2008 18:59

Re: SQL Abfrage Problem

Beitrag von TheSaint »

Hallo Kiffi,
Kiffi hat geschrieben:geschachtelte SQL-Abfragen mag PB leider nicht. Bleibt Dir nichts
anderes übrig, als die Ergebnisse der äußeren Schleife in beispielsweise
einer LinkedList zwischenzuspeichern und danach die innere Schleife über
die LinkedList laufen zu lassen.
Hm, man macht es mir aber nicht leicht, damit ich PB nutzen kann.

Tja, dann muss ich mir nochmal die Sache mit den LinkedList ansehen.

Kennst Du eine Möglichkeit, da dies nicht meine einzigen SQL Abfragen sind, diese Ausführung zu vereinfachen?

Habe schon das öffnen und beenden der DB in einer Procedure gepackt. Kann man da noch mehr machen? Arbeitest Du öfter mit SQL Abfragen?
Wie machst Du das denn?

Nochmals vielen Dank für Deine Hilfe
Gruß, TheSaint
___________________________
[ XP Prof SP 3 | Vista | PB 4.30 ]
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: SQL Abfrage Problem

Beitrag von Kiffi »

TheSaint hat geschrieben:Hm, man macht es mir aber nicht leicht, damit ich PB nutzen kann.
nicht nur Dir! ;-)

Also, so wie ich die beiden Queries interpretiere, kann man das über eine
Abfrage erledigen, indem Du die Update-Anweisung mit der Select-
Anweisung 'verjoinst' (der gemeinsame Key scheint ja 'BUCHUNG.BNR' zu
sein).

Grüße ... Kiffi

// Edit:

P.S.: Ein Update einer Tabelle wird natürlich auch durch ein
entsprechendes DatabaseUpdate() ausgeführt :-)
a²+b²=mc²
TheSaint
Beiträge: 143
Registriert: 21.12.2008 18:59

Beitrag von TheSaint »

Hallo Kiffi,

kannst Du Dich noch an diese Frage erinnern?

http://www.purebasic.fr/german/viewtopic.php?t=18997
Kiffi hat geschrieben:
TheSaint hat geschrieben:Hm, mit dieser Callfunction wollte ich eine Zusatzfunktion aus einer DLL aufrufen, die dafür gedacht ist, einen Text, mit dem SQL Befehl ausgewählten Record zu trimmen.
das bist Du von Access her so gewohnt, gell? ;-)

Nunja, in PB (oder sagen wir mal: in fast allen Programmen ausser Access)
funktioniert das leider nicht. Da musst Du Dir in der Tat was anderes
einfallen lassen.
Das hier war es was mir dazu eingefallen ist.
Ich musste die Callfunction umgehen.
Kiffi hat geschrieben:indem Du die Update-Anweisung mit der Select-
Anweisung 'verjoinst' (der gemeinsame Key scheint ja 'BUCHUNG.BNR' zu
sein).
Ich denke, dass das nicht funkionieren wird, da ich ja aus der Spalte
Buchung.Text einen Teil extrahieren muss (mit StringField, oder mit einer Funktion)

Tja, mit der LinkedList komme ich auch nicht so weiter. Da muss ich ja erst eine Structur erstellen und und und.
Oder verstehe ich das was falsch?
Alles sehr umständlich, oder?

Nochmals vielen Dank für Deine Hilfe.
Gruß, TheSaint
___________________________
[ XP Prof SP 3 | Vista | PB 4.30 ]
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

TheSaint hat geschrieben:Alles sehr umständlich, oder?
umständlich, aber lösbar :-)

Code: Alles auswählen

Structure sBuchung
  SQLBNR.s
  SQLBelegNr.s
EndStructure

NewList Buchung.sBuchung()
    
DBOpenOrClose(0) ;Hier wird eine Procedure aufgerufen (Wert 0 = Datenbank öffnen; Wert 1 = Datenbank schliessen)

If IsDatabase(DB)

  SQL = "SELECT BUCHUNG.BNR, BUCHUNG.TEXT, BUCHUNG.BELEGNR "
  SQL = SQL + "FROM BUCHUNG RIGHT JOIN LIEFERAN ON BUCHUNG.KHABEN = LIEFERAN.LIEFKNR "
  SQL = SQL + "WHERE (((BUCHUNG.BELEGNR)<7000) And ((BUCHUNG.KSOLL)<40900));"
  
  If DatabaseQuery(DB, SQL)
    
    ClearList(Buchung())
    
    While NextDatabaseRow(DB)
      
      AddElement(Buchung())
      Buchung()\SQLBNR     = GetDatabaseString(DB, 0)
      Buchung()\SQLBelegNr = StringField(GetDatabaseString(DB, 1), 1, "_")
      
    Wend
    
    FinishDatabaseQuery(DB)
    
    ForEach Buchung()
      
      SQL1 = "UPDATE BUCHUNG "
      SQL1 = SQL1 + " SET BUCHUNG.BELEGNR = " + Buchung()\SQLBelegNr
      SQL1 = SQL1 + " WHERE BUCHUNG.BNR   = " + Buchung()\SQLBNR 
      
      If DatabaseUpdate(DB, SQL1) = 0
        MessageRequester("Fehler", "Kann die folgende Abfrage nicht ausführen: "+DatabaseError())
      EndIf
      
    Next
    
  EndIf

EndIf

DBOpenOrClose(1) ;Hier wird eine Procedure aufgerufen (Wert 0 = Datenbank öffnen; Wert 1 = Datenbank schliessen)
Grüße ... Kiffi
a²+b²=mc²
TheSaint
Beiträge: 143
Registriert: 21.12.2008 18:59

Beitrag von TheSaint »

Hallo Kiffi,
Kiffi hat geschrieben:umständlich, aber lösbar :-)
wow, also ich weis nicht, wie Du das machst, aber Du bist Turbosschnell. :D

Für Dich kann es anscheinend nicht umständlich genug sein, was. :wink:

Hm, wenn ich die LinkedList und Structure anpasse, könnte ich diese ja auch für alle weiteren SQL Abfragen nutzen.

Echt spitze.

Vielen Dank.
Gruß, TheSaint
___________________________
[ XP Prof SP 3 | Vista | PB 4.30 ]
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

TheSaint hat geschrieben:wow, also ich weis nicht, wie Du das machst, aber Du bist Turbosschnell. :D
ich hatte das schon vorbereitet und als ich es posten wollte, kam Deine
Frage dazu grade recht. :-)

Das Durchlaufen der DatabaseColumns() mittels For-Next-Schleife habe ich
übrigens rausgeworfen (vielleicht hast Du es gesehen). Du kannst Du Daten
auch abrufen, wenn Du Column direkt übergibst.

Grüße ... Kiffi
a²+b²=mc²
TheSaint
Beiträge: 143
Registriert: 21.12.2008 18:59

Beitrag von TheSaint »

Hallo Kiffi,
Kiffi hat geschrieben:Das Durchlaufen der DatabaseColumns() mittels For-Next-Schleife habe ich
übrigens rausgeworfen (vielleicht hast Du es gesehen). Du kannst Du Daten
auch abrufen, wenn Du Column direkt übergibst.
Ja, vielen Dank ist mir beim Durcharbeiten aufgefallen.

Nochmals vielen Dank für Deine Hilfe.
Gruß, TheSaint
___________________________
[ XP Prof SP 3 | Vista | PB 4.30 ]
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Re: SQL Abfrage Problem

Beitrag von marco2007 »

Kiffi hat geschrieben:geschachtelte SQL-Abfragen mag PB leider nicht.
Das Problem hab ich mal so gelöst:

Code: Alles auswählen

UseODBCDatabase()
OpenDatabase(0, "Myback", "", "")
OpenDatabase(1, "Myback", "", "")

  If DatabaseQuery(0, "select * from Angebot")
    While NextDatabaseRow(0)<>0
      Debug GetDatabaseString(0, 2)
      If DatabaseQuery(1, "select * from user")
        While NextDatabaseRow(1)<>0
          Debug GetDatabaseString(1, 2)
        Wend
      EndIf  
    Wend
  EndIf
CloseDatabase(1)
CloseDatabase(0)  
...ich hatte noch keine Probleme damit.

lg
Marco
Windows 11 - PB 6.03 x64
_________________________________
Antworten