AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Live-Cursor für Update - Satz aus static Cursor ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

Live-Cursor für Update - Satz aus static Cursor ermitteln

Ein Thema von SneakL8 · begonnen am 14. Apr 2017 · letzter Beitrag vom 16. Apr 2017
Antwort Antwort
SneakL8

Registriert seit: 11. Feb 2016
24 Beiträge
 
#1

Live-Cursor für Update - Satz aus static Cursor ermitteln

  Alt 14. Apr 2017, 17:25
Datenbank: Advantage Database Server • Version: 10.1 • Zugriff über: TAdsQuery
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
  Mit Zitat antworten Zitat
RSF

Registriert seit: 13. Mär 2008
155 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

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

  Alt 15. Apr 2017, 10:49
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
Ronald

Geändert von RSF (15. Apr 2017 um 13:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
755 Beiträge
 
#3

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

  Alt 15. Apr 2017, 12:12
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.
  Mit Zitat antworten Zitat
SneakL8

Registriert seit: 11. Feb 2016
24 Beiträge
 
#4

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

  Alt 15. Apr 2017, 17:04
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

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

  Alt 15. Apr 2017, 18:12
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 SELECT Kunden_Nr as ID, ... => UPDATE ... WHERE Kunden_Nr = :ID .
$2B or not $2B

Geändert von himitsu (15. Apr 2017 um 18:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
679 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 16. Apr 2017, 18:41
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.
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
RSF

Registriert seit: 13. Mär 2008
155 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

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

  Alt 16. Apr 2017, 18:52
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);
Ronald

Geändert von RSF (16. Apr 2017 um 18:55 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz