German SQL - Nur die ersten Datensätze auslesen.

Lothar Kriegerow

Active Member
Hallo,

Ich habe eine SQL-Datenbank mit einigen Tabellen.
Ich benötige aus der Tabelle nur die letzten DS.
Aus Mangel an SQL-Kenntnissen in B4A mache ich das im Moment sehr unperformant so: (Auszugsweise)

B4X:
    Dim Anz As Int = txtAnzahl.text
    lv1.Clear
    lv1.SingleLineLayout.Label.TextSize = 14
    lv1.SingleLineLayout.ItemHeight = 16dip
    
    modSQL.SQL="SELECT * FROM Mess  ORDER Id  DESC"
    modSQL.C=modSQL.SQL1.ExecQuery(modSQL.SQL)
    lv1.AddSingleLine ("      Datum        Zeit       SYS    DIA   GEW      PULS   WT")
    For i=0 To modSQL.C.RowCount-1
        modSQL.C.Position=i
        If i= Anz Then Exit

Einfacher wäre "SELECT TOP(x) FROM Mess ORDER BY Id DESC"

Leider funktioniert TOP nicht. Gibt es ein Pedant zu TOP? Ich habe nirgends was Brauchbares gefunden.

Gruß Lothar
 

GMan

Well-Known Member
Licensed User
Longtime User
Wenn ich mich recht erinnere geht das ungefähr so (in mySQL)

B4X:
SELECT *
  FROM sales
 ORDER BY sale_date DESC
 LIMIT 10

in SQL sollte es so aussehen:

B4X:
SELECT TOP 10 *
  FROM sales
 ORDER BY sale_date DESC

Die Beispiele zeigen die jeweilige Syntax, um die aktuellsten zehn Verkäufe aus der SALES-Tabelle abzufragen. Die Basis ist dabei immer dieselbe: die Auflistung aller Verkäufe beginnend mit dem neusten. Der jeweilige Top-N-Zusatz bricht die Ausführung nur ab, sobald zehn Zeilen geladen wurden.
 

Lothar Kriegerow

Active Member
Hallo GMan,

vielen Dank - LIMIT funktioniert. Ich bin zwar fit in MS-SQL, aber gerade zu B4A kann man sich die Finger wund googeln. Das hat mir wirklich sehr geholfen und macht mein Programm performanter.

Vielleicht hast Du ja zu meinem 2. Problem noch eine Idee?

Wenn ich eine Tabelle definiere, habe ich zwar die Möglichkeit String, Integer, Blob. Will ich aber ein Datum speichern, kann ich das in String - dann kann ich nicht selektieren oder sortieren, oder ich muss das Datum in eine Zahl (Timestamp) umrechnen um mit BETWEEN einen Beeich zu selektieren, oder nach Datum zu sortieren.

Hast Du vielleicht eine Idee, wie ich das noch besser machen kann? Zur Zeit lasse ich per Autoinkrement einen Index erstellen. So kann ich wenigstens nach Zeit sortieren.


Gruß Lothar
 

Heinz

Active Member
Licensed User
Longtime User
Am PC sortiere ich nach Datum, indem ich das dBase Datenbankformat anwende.
Man muß nur die Tage, Monate und Jahre umdrehen, ähnlich US-Schreibweise.
Aus TTMMYYYY (09.04.2023) wird dann 20230409 (YYYYMMTT). Das kann man
dann wunderbar sortieren. Sogar Rechnen kann man damit. Ich würde das auch
so als Zahlenfeld in die DB reinschreiben. Richtig anzeigen kann man ja dann wieder
durch eine kurze Rück-Umwandlung. Mit der Lib DateUtils kannst du dir bestimmt
die Jahre, Monate und Tage rausziehen und wie oben als Zahl wieder zusammensetzen.

Diese Vorgehensweise müßte ja auch für B4A funktionieren.
 

JOTHA

Well-Known Member
Licensed User
Longtime User
Diese Vorgehensweise müßte ja auch für B4A funktionieren.
Ja, so ähnlich mache ich das auch. Funktioniert in B4X überall gut. ;)
 

Lothar Kriegerow

Active Member
Hallo Heinz,

manchmal habe ich echt ein Brett vor dem Kopf. Natürlich - ich habe das auch schon in eMbedded so machen müssen. Danke dass Du mir auf die Sprünge geholfen hast.
Ich habe schon alles umgeschrieben.

dBase - wer kennt denn das noch. :oops: Die letzten werden bald aussterben.

Gruß Lothar
 

mw71

Active Member
Licensed User
Longtime User
Ich bin zwar fit in MS-SQL, aber gerade zu B4A kann man sich die Finger wund googeln.
B4A (und "auf Wunsch" auch B4J...) nutzt SQLite, was ja sehr nahe am "normalen" SQL ist, da findet man genug im Internet.
Man muss nur bei spezielleren Befehlen aufpassen ob die schon funktionieren (also nachschauen in welcher SQLite Version diese eingefügt wurden,
welche SQLite Version in der entsprechenden SDK verwendet wird.....)
 

Lothar Kriegerow

Active Member
Hallo mw71,

von der Sache her funktionieren die SQL-Befehle fast alle, nur eben LIMIT war mir ungeläufig. Aber gerade darüber habe ich im Netz nichts gefunden, schon weil ich ja nicht nach LIMIT gesucht habe und die SQL-Beschreibung auf d1eser Seite eher spärlich ist.

Gruß Lothar
 

mw71

Active Member
Licensed User
Longtime User
LIMIT kenn ich, hab ich aber nicht direkt auf dem Schirm, da ich das eigentlich nicht nutzte.
Aber dafür gibt es Suchmaschinen, z.B.
SQLite Anzahl Datensätze begrenzen (geht auch wenn man nur nach SQL sucht)

oder man sucht nach der Fragestellung:
sqlite nur ersten Datensatz ausgeben, da gibt es weitere Lösungsvorschläge

Doku: SQLite, etwas gewöhnungsbedürftig
Versionsübersicht: API <-> SQLite Version, wichtig bei speziellen Befehlen, hab jetzt nur nicht mehr auf dem Schirm welcher Befehl das bei mir war.


Was sicher nicht so schnell zu finden ist, ist die DBUtils Class (keine Ahnung ob es die mittlerweile als Bibliothek gibt).
Von dieser könnte man die ExecuteMAP Funktion nutzen. Da muss halt nur dem Query die Sortierung richtig mitgeben.
Oder man schreibt sich diese Funktion um.
 

klaus

Expert
Licensed User
Longtime User
Was sicher nicht so schnell zu finden ist, ist die DBUtils Class (keine Ahnung ob es die mittlerweile als Bibliothek gibt).
DBUtils ist jetzt eine b4xlib Bibliothek., und funktioniert auf den drei Plattformen.

Für das Datum Sortieren könnte man auch das Datum oder Zeit als Tick speichern und diese sortieren.
Beispiel HIER.

SQLite hat auch Datumfunktionen die funktionieren aber nur mit diesem Format "yyyy-MM-dd", siehe HIER.
 
Last edited:

Lothar Kriegerow

Active Member
Hallo Klaus,

danke für die Informationen. Heinz Lösung ist perfekt und einfach. Auch BETWEEN bringt das richtige Ergebnis.

Gruß Lothar
 

MrKim

Well-Known Member
Licensed User
Longtime User
Storing the date as "yyyy-MM-dd" is useful if you need to look at it in other areas. I, too am predominately MS-SQL but I have found for pure B4x apps it is just easier to store the ticks. Don't forget when you DISPLAY the date it is going to come to you as "yyyy-MM-dd". If that is not your display format you will have to set your local format to "yyyy-MM-dd", convert it to ticks,then set the format to your display format, then convert it back - or parse the date string and reassemble it. Also, any date comparisons, dateadds, etc. will all have to be done in ticks. BETWEEN should work just fine with ticks, just remember only store the date ticks, not the time.
 
Top