Databaseabfrage

Für allgemeine Fragen zur Programmierung mit PureBasic.
gh249@online.de
Beiträge: 11
Registriert: 14.05.2022 21:43

Databaseabfrage

Beitrag von gh249@online.de »

Vermutlich sehe ich den Wald vor lauter Bäumen nicht.
Ich hoffe, dass mir irgendwer helfen kann.
Wie kann man mit PB das Ergebnis dieser Abfrage übernehmen:

sql$ = "SELECT da.name, da.vz, bu.netto, bu.mwstsatz, bu.mwst, bu.brutto, bu.btext, bu.bkto "
sql$ = sql$ + "FROM tbldatei da, tblbuch bu "
sql$ = sql$ + "WHERE da.id = bu.idbuch "
sql$ = sql$ + "ORDER BY da.name ;"

GetDatabaseString geht nicht, da ich 2 Tabellen anspreche, oder gibt es doch eine Variante?

Gibt es alternativ eine andere Möglichkeit mit PB 2 verknüpfte Tabellen abzufragen außer 2 Abfragen hintereinander zu starten ?
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Databaseabfrage

Beitrag von mk-soft »

GetDatabaseString gibt nicht alles zusammen zurück, sondern pro Feld.

Geht also. Muss nur die Abfrage auf die Tabellen stimmen und die Tabellen müssen in einer Datenbank sein oder der Datenbank Treiber muss dieses unterstützen.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
gh249@online.de
Beiträge: 11
Registriert: 14.05.2022 21:43

Re: Databaseabfrage

Beitrag von gh249@online.de »

Wie spreche ich die einzelnen Felder in den 2 Tabellen an? In den GetDatabase...Befehlen habe ich keine Möglichkeit unterschiedliche Tabellen anzusprechen.
Es sind 2 miteinander über ID verknüpfte Tabellen (tbldatei, tblbuch). Die eine enthält die Namen und einige Sortierkriterien und die andere die Buchungsdaten. In einer Schleife will ich z.b. alle bereits gebuchten Dateien mit den Buchungsdaten abrufen und auflisten. Per SQL kann ich das erledigen aber wie bekomme ich die Daten in PB-Variable hinein. Nach der Abfrage habe ich keine Möglichkeit gefunden mit GetDatabase... die ermittelten Felder der beiden Tabellen anzusprechen.
Es gäbe zwar die Möglichkeit bei jeder Abfrage per SQL eine 3. Tabelle anzulegen und alles da hinein zu speichern und dann diese Tabelle anzusprechen und auszulesen aber das kann doch nicht sein, dass es keine andere direkte Möglichkeit gibt.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Databaseabfrage

Beitrag von mk-soft »

Ich kenne deine verwendete Datenbank nicht und die vorhandenen Tabellen. MySQL, SQL Server (MS), SQLite ?
Aber es ist die Select Anweisung die eine gemeinsame Abfrage auf die Tabellen definiert und als einzelne Felder zurückgibt.

Ohne eine Code und die Tabellen Information geht es hier nicht weiter ...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
gh249@online.de
Beiträge: 11
Registriert: 14.05.2022 21:43

Re: Databaseabfrage

Beitrag von gh249@online.de »

dbid = OpenDatabase(#PB_Any, DB$, "", "" ,dbt); Datenbank öffnen

sql$ = "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 ;"

es müsste auch damit gehen:

sql$ ="SELECT da.*, bu.* FROM tbldatei da, tblbuch bu WHERE da.id = bu.idbuch ;"

DatabaseQuery(dbid, sql$)
NextDatabaseRow(dbid)

Für eine Zeile wäre das kein Problem dann würde ich 2 Abfragen scheiben , erst tbldatei Name und id auslesen, dann mit Hilfe der id die gleich der idbuch in Tblbuch ist, die Daten aus tblbuch auslesen. Aber in einer Schleife geht es mit NextDatabaseRow(dbid) nicht, da ja inzwischen die 2.Tabelle ausgelesen wurde.

Die Abfrage oben funktioniert. Ich benutze SQLite. aber die Frage ist nicht wie ich SQL umschreibe, sondern wie geht es weiter, damit ich die Daten nach PB bekomme.
Bei nur einer angesprochenen Tabelle wäre die Schleife auch kein Problem.

Abfrage usw.....
NextDatabaseRow(dbid) ; nächster Eintrag
name$ = GetDatabaseString(dbid, 1)
vz$ = GetDatabaseString(dbid, 3)
usw....

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.
gh249@online.de
Beiträge: 11
Registriert: 14.05.2022 21:43

Re: Databaseabfrage

Beitrag von gh249@online.de »

Zusatz:

GetDatabaseString(dbid, 1) lässt sich meines Wissens nur in einer geöffneten Tabelle zur Spalte adressieren, ich suche den Weg ob und wenn ja, wie ich beim auslesen den Tabellennamen + die Spalte adressieren kann. Gibt es vielleicht noch einen anderen Befehl, den ich übersehen habe?
Zuletzt geändert von gh249@online.de am 06.06.2022 19:48, insgesamt 1-mal geändert.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Databaseabfrage

Beitrag von mk-soft »

Edit
Da ist dein Gedankenfehler


Sind beide Tabellen in der gleichen SQLite Datei ist Ergebnis der Abfrage die Summe/Teil aus beiden Tabellen. Sollte das Ergebnis nicht Stimmen, ist deine Abfrage falsch.

Sollte die Tabelle aus einer zweiten SQLite Datei sein, kann man diese temporäre vorher einbinden.
Muss ich mal suchen wie das ging ...
Zuletzt geändert von mk-soft am 06.06.2022 19:53, insgesamt 2-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
gh249@online.de
Beiträge: 11
Registriert: 14.05.2022 21:43

Re: Databaseabfrage

Beitrag von gh249@online.de »

Das Ergebnis stimmt ja, nur wie kann ich es nach der Abfrage in PB übernehmen?
gh249@online.de
Beiträge: 11
Registriert: 14.05.2022 21:43

Re: Databaseabfrage

Beitrag von gh249@online.de »

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?
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Databaseabfrage

Beitrag von mk-soft »

Code: Alles auswählen

If DatabaseQuery(0, sql)
  
  c = DatabaseColumns(0)
  While NextDatabaseRow(0)
    For i = 0 To c - 1
      Debug "Spalte " + i + ": " + GetDatabaseString(0, i)
    Next
    Debug "----"
  Wend
  
  FinishDatabaseQuery(0)
EndIf
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten