German SQL - Anfängerfragen

peternmb

Well-Known Member
Licensed User
Longtime User
Hallo,

vielleicht kann mir jemand einigte einfache Dinge zu SQL erklären wo ich nicht durchblicke.
Ich habe um ein Ergebnis zu erzielen einen Beispielcode etwas abgewandelt vermute jedoch das das extrem umständlich ist.
Benötige ich die Funktion "ExecuteMemoryTable" überhaupt oder geht das einfacher?
B4X:
...
Dim Table As List
Table = ExecuteMemoryTable(SQL1,"SELECT * FROM table1 WHERE name = "Mayer" ORDER BY UPPER(name)", Null, 0)
'
Dim Cols() As String   
Cols = Table.Get(0) '1.zutreffender Datensatz
'
lbl01.Text=Cols(0)   
lbl02.Text=Cols(1)      
...



'Executes the query and returns the result as a list of arrays.
'Each item in the list is a strings array.
'StringArgs - Values to replace question marks in the query. Pass Null if not needed.
'Limit - Limits the results. Pass 0 for all results.
Sub ExecuteMemoryTable(SQL As SQL, Query As String, StringArgs() As String, Limit As Int) As List
    Dim cu As Cursor
    If StringArgs <> Null Then
        cu = SQL.ExecQuery2(Query, StringArgs)
    Else
        cu = SQL.ExecQuery(Query)
    End If
    Log("ExecuteMemoryTable: " & Query)
    Dim Table As List
    Table.Initialize
    If Limit > 0 Then Limit = Min(Limit, cu.RowCount) Else Limit = cu.RowCount
    For row = 0 To Limit - 1
        cu.Position = row
        Dim values(cu.ColumnCount) As String
        For col = 0 To cu.ColumnCount - 1
            values(col) = cu.GetString2(col)
        Next
        Table.Add(values)
    Next
    cu.Close
    Return Table
End Sub

Wie kann ich es erreichen, dass z.B. der bei der Suche im Beispiel der gefundene Datensatz angezeigt wird, ich aber auf alle Datensätze (nicht nur die mit dem Namen "Mayer") zugreifen kann?
 

DonManfred

Expert
Licensed User
Longtime User
z.B.
B4X:
Dim Table AsList
Table = ExecuteMemoryTable(SQL1,"SELECT * FROM table1 WHERE id>0  ORDER BY UPPER(name)", Null, 0)
Prinzipiell rate ich Dir aber SQL zu lernen um zu verstehen was du da machst.
 

peternmb

Well-Known Member
Licensed User
Longtime User
Prinzipiell rate ich Dir aber SQL zu lernen um zu verstehen was du da machst.
ja, habe ich schon länger vor aber die Zeit ist einfach zu wenig...
Ich versuche nur ein Miniprojekt umzusetzen (Datenviewer), und hatte gehofft da ich schon seit 20 Jahren mit relationalen Datenbanken arbeite, das ohne größere Einarbeitung hinzubekommen - in SQL ist aber leider fast alles anders als ich es gewohnt bin...
In meiner gewohnten Datenbankumgebung finde ich mit z.B. seek den gesuchten Datensatz in einer indizierten DB und kann dann nach Belieben vor und zurück skippen.

Was ist id>0 in deinem Beispielcode?
 

DonManfred

Expert
Licensed User
Longtime User
das die ID größßer 0 ist... Also quasi der Filter nicht auf den Namen läuft.
Mein Beispiel würde dann also ALLE Datensätze liefern nicht nur die mit name="Mayer"
Du kannst auch einfach die WHERE-Bedingung komplett weglassen, dann kommen auch alle Datensätzer sofern Du sie nicht mit LIMIT limitierst.
 

peternmb

Well-Known Member
Licensed User
Longtime User
Du kannst auch einfach die WHERE-Bedingung komplett weglassen, dann kommen auch alle Datensätzer sofern Du sie nicht mit LIMIT limitierst.
Ich habe anscheinend ein Problem zu erklären was ich möchte (vermutlich funktioniert das mit SQL überhaupt nicht), ich versuche es aber trotzdem einfach nochmal:

Ich möchte wenn ich nach dem Namen "Mayer" suche Zugriff auf alle Datensätze haben. Direkt angezeigt/eingelesen werden soll dabei der 1. vorkommende Mayer. Ich möchte allerdings in der Datenbank satzweise vor- und zurückgehen können.

Ich stelle mir das so vor, dass in der nach dem Namen sortierten DB "Mayer" z.B. der Datensatz 500 ist, und ich dann beim rückwärtsgehen den Satz 499 oder vorwärts den Satz 501 anzeigen lassen kann.
 

DonManfred

Expert
Licensed User
Longtime User
wenn du auf mayer filterst und es gibt nur einen datensatz dann kannst du nicht woanders hin blättern.
Wenn du 10 mayer hast dann machst du doch was falsch weil deine liste dann eingentlich 10 darwbaätze habe sollte.

Ansonsten halt ausgehend vom aktuellen datensatz (z.b. id 100) eine abfrage machen welches die nächst kleinerere id mit deinem suchbegriffen ist und dann gezielt diese datensatz laden.
Nach vorne genau andersrum. Den nächst höheren datensatz ermitteln und den dann anzeigen.

Sollte sich aber erledigt haben wenn Du SQL beherrschst. Das gehört nämlich alles zu den Grundlagen.
 

Eumel

Active Member
Licensed User
Longtime User
@peternb

Wenn Du dir dieses Tutorial mal anschaust, und dann entsprechend abänderst.
Z.B. statt die StudentID zu filtern und zu listen, übernimmst Du die Nachnamen.
Dann nur noch ein Vor- und Zurück-Button, und Du solltest dein gewünschtes Ergebnis erhalten.


------------------
Gruß Eumel
 
Top