SELECT nach Array erweitern [Erledigt]

Alles zum SQL-Dialekt

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

SELECT nach Array erweitern [Erledigt]

Beitrag von Jan »

Moin,

woanders hatt ich ja berichtet, das ich so Tabellen-Sätze als DataObjects in ein Array einlese:

Code: Alles auswählen

FUNCTION leseSaetzeInArray(cAlias, cFeld, cWert)

oStmt      := USqlStatement():new()
oStmt:createVirtualTableFromWorkArea(cAlias)
oStmt:fromChar("SELECT * FROM " + cAlias + " WHERE " + cFeld + "=::wert")
oStmt:wert := cWert
oStmt:build():query(USQL_RESULT_OBJECTS, @aData)

RETURN aData
Allerdings fehlt mir da etwas: Ich habe es mir zur Angewohnheit gemacht, beim Einlesen von Sätzen in ein DataObject zwei Zusatzinfos dazuzuschreiben: RecNo() und Alias(). Das hilft mir dann später den richtigen Satz in der richtigen Tabelle zu identifizieren, wenn ich z. B. Daten wieder zurück schreiben möchte.

Gibt es irgend eine Möglichkeit, das hier beim SELECT auch zu machen?

Jan
Zuletzt geändert von Jan am Sa, 21. Mai 2022 10:43, insgesamt 1-mal geändert.
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: SELECT nach Array erweitern

Beitrag von georg »

Guten Morgen, Jan -


meine Antwort kommt direkt aus dem SQL-Standard, ob sich das dann 1:1 umsetzen lässt, musst Du ausprobieren ...

Knackpunkt ist das "SELECT *" - Du kannst alternativ auch alle Saplten benennen, die Du verwenden willst, also etwa in der Art

Code: Alles auswählen

SELECT kundennumer, kundenname, kundenplz, alias() AS kundealias, recno() AS kunderecno FROM ...
Für das Hinzufügen weiterer Spalten ist es zwingend erforderlich, auf den * zu verzichten.

Und Du solltest - sofern Du nicht wirklich alle Felder auch für die Verarbeitung benötigst - nur die Felder angeben, die Du auch verarbeitest. Das verbessert bei grossen Ergebnismengen die Antwortzeit.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: SELECT nach Array erweitern

Beitrag von Jan »

Hallo Georg,

Danke für das Beispiel. Mir war nicht (mehr) bewußt das ich auf dem Weg auch Felder hinzufügen kann.

Allerdings ist das ein Problem für mich. Denn ich lese tatsächlich alle Felder ein. Und ich kenn ja die Feldnamen vorher nicht, weil das universell ist.

Ich könnte allerdings ein (cAlias()->(DbStruct()) machen, und daraus dynamisch die Feldliste auslesen und in einen String bauen, den ich dann um den RecNo() und den Alias() ergänze. Und in den SELECT einbaue. Etwas aufwändiger, aber wenn ich damit mein Ziel erreiche ...

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: SELECT nach Array erweitern

Beitrag von Jan »

Code: Alles auswählen

FUNCTION leseSaetzeInArray(cAlias, cFeld, cWert)

LOCAL aStructure := {}
LOCAL i          := 0
LOCAL cFelder    := ""
LOCAL oStmt      := NIL

// Die Felder zusammen stellen. Muß sein, weil ein "*" nicht geht, wenn man Alias() und RecNo() hinzufügen will
aStructure := (cAlias)->(DbStruct())
FOR i := 1 TO Len(aStructure)
    cFelder += aStructure[i][1] + ","
NEXT
cFelder += cAlias + "' AS _alias, RecNo() AS _recno"

oStmt      := USqlStatement():new()                                                                // Das USQL-Objekt erstellen
oStmt:createVirtualTableFromWorkArea(cAlias)                                                       // Die virtuelle Tablle mit der dbf erstellen
oStmt:fromChar("SELECT " + cFelder + " FROM " + cAlias + " WHERE " + cFeld + "=::wert")            // Anweisung zuordnen
oStmt:wert := cWert
oStmt:build():query(USQL_RESULT_OBJECTS, @aData)

RETURN aData
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: SELECT nach Array erweitern [Erledigt]

Beitrag von nightcrawler »

Der * geht auch mit zusätzlichen Feldern ...

Code: Alles auswählen

SELECT a.*, test() as test, test2() as test2, 'abc' as Zusatztext FROM meinetabelle a
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: SELECT nach Array erweitern [Erledigt]

Beitrag von Jan »

Nachtrag: Ich habe da ja den Alias() und RecNo() mit eingebaut. Das funktioniert aber nicht, wenn der Select nicht auf der entsprechenden Tabelle steht. In dem Code oben habe ich das beim Alias umgangen, indem ich da die Variable einbaue. Beim RecNo() geht das aber so nicht.

Alaska hat aber das hier genau so geregelt wie auch bei allen Db...-Funktionen. Ich kann das also ganz einfach korrekt umleiten, und dann die Variable auf dem Alias alterntiv auch weg lassen:

Code: Alles auswählen

cFelder += "Alias() AS _alias, RecNo() AS _recno"
...
(cAlias)->(oStmt:build():query(USQL_RESULT_OBJECTS, @aData))
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Antworten