Databaseabfrage

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Databaseabfrage

Beitrag von mk-soft »

1. Wie sieht den der Code aus?
2. Sind die Tabellen in einer SQLite Datei
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
SirMatti74
Beiträge: 37
Registriert: 08.11.2009 09:12

Re: Databaseabfrage

Beitrag von SirMatti74 »

gh249@online.de hat geschrieben: 06.06.2022 19:21 Mein Problem liegt darin, dass ich hier 2 miteinander verknüpfte Tabellen habe und nicht weiß, wie PB die einzelnen Felder von 2 Tabellen nach 1 gemeinsamen Abfrage übernehmen kann.
Die Anzahl der verknüpften Tabellen ist völlig irrelevant. Wie MK-Soft bereits schrieb, bekommst Du - sofern die Abfrage ohne Fehler durchläuft - ein Ergebnis zurück, was Du Dir als Tabelle vorstellen kann. Alles, was Du aus den beteiligten Tabellen per SQL abgefragt oder irgendwie berechnen lassen hast, ist in dieser Ergebnistabelle enthalten. In Deinem Fall würde das in etwa so aussehen:

Code: Alles auswählen

+-----------------+---------+-------+-----------+-------------+---------+-----------+-----------+---------+         
| Spaltenindex -> |    0    |   1   |     2     |      3      |    4    |     5     |     6     |    7    |
+-----------------+---------+-------+-----------+-------------+---------+-----------+-----------+---------+         
|                 | da.name | da.vz |  bu.netto | bu.mwstsatz | bu.mwst | bu.brutto |  bu.btext | bu.bkto |
+-----------------+---------+-------+-----------+-------------+---------+-----------+-----------+---------+         
|                 |   xxx   |  xxx  |    xxx    |     xxx     |   xxx   |    xxx    |    xxx    |   xxx   |
|                 |   xxx   |  xxx  |    xxx    |     xxx     |   xxx   |    xxx    |    xxx    |   xxx   |
|                 |   xxx   |  xxx  |    xxx    |     xxx     |   xxx   |    xxx    |    xxx    |   xxx   |
|                 |   xxx   |  xxx  |    xxx    |     xxx     |   xxx   |    xxx    |    xxx    |   xxx   |
|                 |   xxx   |  xxx  |    xxx    |     xxx     |   xxx   |    xxx    |    xxx    |   xxx   |
|                 |   xxx   |  xxx  |    xxx    |     xxx     |   xxx   |    xxx    |    xxx    |   xxx   |
+-----------------+---------+-------+-----------+-------------+---------+-----------+-----------+---------+         
gh249@online.de hat geschrieben: 06.06.2022 19:52 Wenn ich die Abfrage in SQLiteStudio eingebe, bekomme ich genau was ich brauche. Wie bereits geschrieben mein Problem ist , wie kann ich mit PB die Daten übernehmen?
Nach einem erfolgreichem DatabaseQuery() kannst Du die Ergebnistabelle mit NextDatabaseRow() Zeile für Zeile durchlaufen und die Werte aus den einzelnen Spalten (siehe Spaltenindex) mit GetDatabaseString(), GetDatabaseQuad(), GetDatabaseLong(), GetDatabaseDouble(), GetDatabaseFloat() oder GetDatabaseBlob() auslesen. In welcher Reihenfolge du die einzelnen Spalten abfragst, ist an sich egal - die Get-Funktion sollte laut Doku eben nur einmal pro Zeile & Spalte aufgerufen werden. Die Daten können wie bereits beschrieben in 6 verschiedenen Datentypen ankommen. Es ist somit nicht ganz unwichtig zu wissen, welche Spalte welchen Datentyp liefert. Hier hilft im Zweifelsfall DatabaseColumnType() weiter.

Mal angenommen:

Code: Alles auswählen

tbldatei.name      = irgendein Name? -> String
tbldatei.vz        = vielleicht eine Stückzahl? -> Quad
tblbuch.netto      = ein Nettopreis? -> Double
tblbuch.mwstsatz   = Mwst-Satz in Prozent? -> Float
tblbuch.mwst       = der Mwst-Betrag? -> Double
tblbuch.brutto	   = ein Bruttobetrag? -> Double
tblbuch.btext      = ein Buchungstext? -> String
tblbuch.bkto       = ein Buchungskonto? -> Long
Das sollte dann in Deinem Fall in etwa so aussehen:

Code: Alles auswählen

dbid = OpenDatabase(#PB_Any, DB$, "", "" ,dbt)

If IsDatabase(dbid)

  sql.s = "SELECT da.name, da.vz, bu.netto, bu.mwstsatz, bu.mwst, bu.brutto, bu.btext, bu.bkto  FROM tbldatei da, tblbuch bu WHERE da.id = bu.idbuch;"
  
  If DatabaseQuery(dbid, sql)

    While NextDatabaseRow(dbid)
      name.s       = GetDatabaseString(dbid,0)
      vz.q         = GetDatabaseQuad(dbid,1)
      netto.d      = GetDatabaseDouble(dbid,2)
      mwstsatz.f   = GetDatabaseFloat(dbid,3)
      mwst.d       = GetDatabaseDouble(dbid,4)
      brutto.d     = GetDatabaseDouble(dbid,5)
      bkto.l       = GetDatabaseLong(dbid,7)
      btext.s      = GetDatabaseString(dbid,6)
    Wend
      
    FinishDatabaseQuery(dbid)
      
  Else
    MessageRequester("Fehler", "SQL-Abfrage fehlgeschlagen! "+DatabaseError())
  EndIf

Else
  MessageRequester("Fehler", "DB-Verbindung unterbrochen! "+DatabaseError())
EndIf

CloseDatabase(dbid)
In der Praxis wird die Ablage der per Get-Funktion ermittelten Werte in Variablen oftmals nicht zweckmäßig sein, da bei jedem Durchlauf die Werte vom vorherigen Durchlauf überschrieben werden. Du wirst vermutlich die Werte eher in Arrays oder Linked Lists ablegen oder eben direkt weiterverarbeiten z.B. durch Übergabe an ein Gadget, Requester, Ausgabe auf Console...
Antworten