Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Live-Cursor für Update - Satz aus static Cursor ermitteln (https://www.delphipraxis.net/192390-live-cursor-fuer-update-satz-aus-static-cursor-ermitteln.html)

SneakL8 14. Apr 2017 17:25

Datenbank: Advantage Database Server • Version: 10.1 • Zugriff über: TAdsQuery

Live-Cursor für Update - Satz aus static Cursor ermitteln
 
Hallo zusammen,

der Titel ist etwas komisch gewählt, aber vielleicht wird's mit miner Beschreibung klarer:

Ich habe ein Query mit statischem Cursor. Einen Satz daraus möchte ich bearbeiten. Um die Sache nicht spezifisch für eine Tabelle zu machen, hätte ich das Ganze etwas allgemeiner.

Bei einem Live-Cursor könnte ich ja auf Bookmark zugreifen. Bei einem statischen Cursor bezieht sich Bookmark auf die temporäre Ergebnismenge und kann nicht benutzt werden. Jetzt gibt es ja noch das Feld rowid.

Damit kann ich eine Abfrage bauen: "SELECT * FROM Edit_Table WHERE rowid = 'xxxx'". Allerdings kann diese Abfrage nicht als Live-curosr geliefert werden (scheint wohl als komplexe Abfrage zu gelten). Nehme ich ein anderes Feld (z.B. KundenNr) dann geht es.

Die Verwendung eines konkreten Schlüsselfeldes (z.B. 'SELECT * FROM Edit_Table WHERE KundenNr = ' + ListTable.FieldByName('KundenNr').ASString) würde ich gerne vermeiden. Hat jemand einen Tipp für mich wie das generisch klappen könnte?
Wenn's sein muss, nehme ich für den Update auch eine TAdsTable, aber da geht ja nur Bookmark und nicht rowid, oder?

Viele Grüße
Sneak-L8

RSF 15. Apr 2017 10:49

AW: Live-Cursor für Update - Satz aus static Cursor ermitteln
 
Ohne einer selbst erstellten eindeutigen Spalte "ID" wird es so nicht gehen.
Ich löse es damit:

Field Name : ID_Kunde
Data Type : character
Size : 32
Index : Primary
Default Value : NewIdString("N")

NewIdString("N") <-- ADS erzeugt so eine GUID

Olli73 15. Apr 2017 12:12

AW: Live-Cursor für Update - Satz aus static Cursor ermitteln
 
Zitat:

Zitat von RSF (Beitrag 1367723)
Ohne einer selbst erstellten eindeutigen Spalte "ID" wird es so nicht gehen.

Eine Id oder GUID ist sowieso immer besser als eine Kundennummer etc. als PK.

Er könnte den PK (der hoffentlich definiert ist) aber auch dynamisch aus der DB auslesen (keine Ahnung wie er beim ADS da dran kommt).

Oder ganz dreckig: alle Felder einbeziehen.

SneakL8 15. Apr 2017 17:04

AW: Live-Cursor für Update - Satz aus static Cursor ermitteln
 
Hallo zusammen,

danke für Eure Antworten. Da ich die (alte) Datenbank jetzt nicht gleich komplett auf eine eindeutige ID umstellen will, habe ich Eure Idee aufgegriffen und überlegt, den individuellen PK einer Tabelle im SELECT ein zweites mal als "Kunden_Nr as ID" antzugeben. Mache mir also intern die Vorgabe, dass der PK immer als Feld "ID" in der Tabelle enthalten sein muss.
Leider musste ich feststellen, dass das wohl nicht klappt (bei "WHERE ID = 'xyz'" wird Feld ID nicht gefunden, auch wenn ich im SELECT Kunden_Nr as ID drinstehen hab).

Daher werd ich doch eine möglichst generische Lösung finden müssen, einen PK zurückzugeben und für die Bearbeitung eine passende WHERE-Klausel zu finden.

Viele Grüße
Sneak-L8

himitsu 15. Apr 2017 18:12

AW: Live-Cursor für Update - Satz aus static Cursor ermitteln
 
Zitat:

Zitat von SneakL8 (Beitrag 1367778)
Leider musste ich feststellen, dass das wohl nicht klappt (bei "WHERE ID = 'xyz'" wird Feld ID nicht gefunden, auch wenn ich im SELECT Kunden_Nr as ID drinstehen hab).

Natürlich nicht.
Da könntest du nur einen View zwischenschalten oder das Feld überall einfügen und per Trigger mit dem PK synchron halten.

ABER, viele Query-Komponenten sollten sowas verstehen. Oftmals werden die Insert/Update/Delete-Scripts automatisch aus dem Select generiert
und da wird dann fast immer auch ein per AS umbenanntes Feld richtig behandelt, also
Delphi-Quellcode:
SELECT Kunden_Nr as ID, ...
=>
Delphi-Quellcode:
UPDATE ... WHERE Kunden_Nr = :ID
.

joachimd 16. Apr 2017 18:41

AW: Live-Cursor für Update - Satz aus static Cursor ermitteln
 
Wenn Du statt der TAdsQuery eine TAdsTable nehmen kannst, schaffst Du das auch mit der TAdsQuery alleine ... ADS SQL Result Sets sind bei live Cursor nämlich genau dasselbe wie ein Tabellen Cursor. Wenn Du joins machst oder Funktionen aufrufst o.ä. dann wird es unterschiedlich zur TAdsTable - das kannst Du dort nämlich nicht machen.
Nun zurück zum Problem: Du musst bei Joins der Rowid mitgeben, welche Tabelle zum Updaten ist:
Code:
SELECT a.Rowid as rowid, a.*, b.* from tabelleA a left outer join tabelleB b on a.wert=b.wert
Beim Update schickst Du dann die richtige rowid mit
Code:
qu.sql.text := 'Update a set feld1=:wert, feld2=:wert2 where rowid=:rowid';
qu.Parambyname('wert').AsString := 'hallo';
qu.Parambyname('wert2').AsInteger := 42;
qu.Parambyname('rowid').AsString := SourceQuery.Fieldbyname('rowid').AsString;
qu.ExecSQL;
Einen Automatismus (INSERT/UPDATE/DELETE Commands) gibt es bei den ADS Komponenten nicht.

RSF 16. Apr 2017 18:52

AW: Live-Cursor für Update - Satz aus static Cursor ermitteln
 
Warum so umständlich?
Wo liegt den das Problem der Tabelle eine eindeutige „ID“ hinzuzufügen?
Das sind gerade mal 2 Zeilen SQL die schnell zum Ziel führen.

Code:
Alter Table Kunden Add Column ID1 char(32) Default 'NewIdString("N")';

Update Kunden Set ID1=NewIdString(N);


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf