AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Manipulation eines Records in einer FDQuery
Thema durchsuchen
Ansicht
Themen-Optionen

Manipulation eines Records in einer FDQuery

Ein Thema von Ykcim · begonnen am 15. Jun 2023 · letzter Beitrag vom 19. Jun 2023
Antwort Antwort
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.089 Beiträge
 
Delphi 12 Athens
 
#1

Query

  Alt 15. Jun 2023, 11:41
Ich habe mal JOB_NAME in JOB_NAME1 umbenannt:
Delphi-Quellcode:
 MsQuery.SQL.Add('SELECT TOP 1 '+
                                'CASE WHEN ( '+
                                  'concat(rj.JOB_ID, ' + QuotedStr(' ') + ', JOB_NAME) is NULL) then '+
                                  'LAG(Concat(rj.JOB_ID, ' + QuotedStr(' ') + ', rj.JOB_NAME)) OVER (ORDER BY re.TIME_LOCAL DESC) ELSE '+
                                  'concat(rj.JOB_ID, ' + QuotedStr(' ') + ',rj.JOB_NAME) end AS JOB_NAME1, '+
                                'CONVERT( varchar( 10 ), re.Time_Local, 104 ) AS Datum, '+
Dann bekomme ich die gleiche Fehlermeldung beim Post.

Ich hatte ja auch schon getestet, ob die Fehlermeldung ausbleibt, wenn ich ein echtes Feld verwende (OPERATION_NAME). Aber das klappt auch nicht.
Das liegt daran, dass weder JOB_NAME noch OPERATION_NAME in der Query explizit in der Feldliste auftauchen. Eine FieldByName auf eines dieser Felder sollte demnach bereits fehlschlagen.

Felder, die du ändern willst, müssen in der Query angegeben sein.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
804 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Manipulation eines Records in einer FDQuery

  Alt 15. Jun 2023, 11:50
Genau das verstehe ich nicht.

Wenn ich einen Haltepunkt auf MSQuery.Post setze und dann im Debugger die Werte
Delphi-Quellcode:
   MsQuery.FieldByName('Operation_Name').AsString
   MsQuery.FieldByName('Job_Name').AsString
prüfe, dann finde ich sie und sie haben die aktualisierten Werte. Wenn ich einen Haltepunkt bei MSQuery.First setze, finde ich Werte
Delphi-Quellcode:
   MsQuery.FieldByName('Operation_Name').AsString
   MsQuery.FieldByName('Job_Name').AsString
ebenfalls, nur dass sie dann noch die ursprünglichen Werte haben...
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.345 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Manipulation eines Records in einer FDQuery

  Alt 15. Jun 2023, 11:53
group by und dann ein Edit?
Was soll denn in dem Fall geändert werden? Alle Treffer, die in das group by für das Feld fallen?

Ich denke, du wirst ein separates Update-Statement benötigen.

Zu den ganzen True/False vergleichen, spare ich mir an dieser Stelle den Kommentar
Peter
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.089 Beiträge
 
Delphi 12 Athens
 
#4

Query

  Alt 15. Jun 2023, 12:25
group by und dann ein Edit?
Was soll denn in dem Fall geändert werden? Alle Treffer, die in das group by für das Feld fallen?

Ich denke, du wirst ein separates Update-Statement benötigen.
Das GROUP BY hatte ich noch gar nicht entdeckt. In dem Fall geht das mit dem Post natürlich gar nicht, da der einzelne Datensatz ja nicht identifiziert werden kann. In der Regel braucht FireDAC einen Primary Key Wert für ein Post. Den gibt es bei gruppierten Queries aber nicht.

Mit den passenden Einstellungen kann man auch ohne den Primary Key Datensätze ändern, aber es muss eben immer eine 1:1 Beziehung zischen dem aktuellen Record in der Query und dem Datensatz in der zu ändernden Tabelle geben.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
804 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Manipulation eines Records in einer FDQuery

  Alt 15. Jun 2023, 13:28
ich glaube, jetzt muss ich eine ganz blöde Frage stellen...

Was mache, wenn ich gar nicht die Daten auf der Datenbank ändern möchte, sondern nur die Ergebnis-Daten der Abfrage in der Query selbst?
Die Query nutze ist als Zwischenspeicher und immer, wenn ein Client die Daten abruft, bekommt er sie aus der Query, via Query.SaveToStream. Dabei werden die Daten aber nicht neu von der Datenbank abgefragt. Das passiert unabhängig davon nach einem Zeitintervall.

Also ich möchte das Ergebnis (Query hat in diesem Fall nur einen Datensatz) ändern, ohne das irgendetwas zur Datenbank gespielt wird...
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.089 Beiträge
 
Delphi 12 Athens
 
#6

AW: Manipulation eines Records in einer FDQuery

  Alt 15. Jun 2023, 13:52
Dann solltest du die Daten in einem TFDMemTable bearbeiten, den du aus der Query füllst.

Alternativ kannst du auch bei der Query CachedUpdates auf True stellen und einfach kein ApplyUpdates aufrufen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
804 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Manipulation eines Records in einer FDQuery

  Alt 15. Jun 2023, 14:26
Zitat:
Alternativ kannst du auch bei der Query CachedUpdates auf True stellen und einfach kein ApplyUpdates aufrufen.
Das hat das Problem leider nicht gelöst,

aber basierend auf Deinem Post https://www.delphipraxis.net/1489948-post9.html in der Vergangenheit, habe ich jetzt so einen Erfolg zu verzeichnen:

Delphi-Quellcode:
         CDMQuery.First;
         MsQuery.First;
         MsQuery.Edit;
         MsQuery.FieldByName('Operator').AsString := CDMQuery.FieldByName('userID').AsString;
         MsQuery.Locate('DEVICE_ID', Machine_ID, []);
Ist das noch halbwegs sauber oder gefummelt?
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.345 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Manipulation eines Records in einer FDQuery

  Alt 15. Jun 2023, 15:05
Das ist gefummelt und dürfte auch nicht funktionieren.

Wenn die Query durch das Locate in den Browse-Modus versetzt wird, wird implizit vorher ein Post oder Cancel gemacht.
Das bedeutet, du wirst wieder eine Exception (bei Post) bekommen oder deine Daten werden nicht verändert (Cancel).
Peter

Geändert von Jasocul (16. Jun 2023 um 06:11 Uhr) Grund: klarer formuliert
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.440 Beiträge
 
Delphi 7 Professional
 
#9

AW: Manipulation eines Records in einer FDQuery

  Alt 15. Jun 2023, 15:07
Wozu sind die beiden da?
Delphi-Quellcode:
CDMQuery.First;
MsQuery.First;
Vorher stehst Du in beiden Querys auf dem benötigten Datensatz.

Dann änderst Du (vermutlich) in beiden Querys den Datensatzzeiger per First, um dann auf jedenfall den ersten Datensatz in MsQuery per Edit zu ändern.

Das erscheint mir nicht zwingend sinnvoll. Bei zwei Querys mit jeweils nur einem Datensatz mag das unschädlich sein, ist dann aber, da nur ein Datensatz vorhanden ist, unsinnig, da der eine Datensatz ja auch zwingend sowohl der erste, als auch der letzte Datensatz ist. In allen anderen Fällen läuft das auf eine Art Zufallsgenerator hinaus. Abgesehen davon steht der Datensatzzeiger nach 'nem Open sowieso auf dem ersten Datensatz. Ein Konstrukt in der Form
Delphi-Quellcode:
CDMQuery.Open;
CDMQuery.First;
bringt schlicht und einfach keinen Vorteil, sondern ist im Zweifel nur sinnfrei.

Per Edit einen Datensatz zu ändern und vor dem Speichern der Änderung den Datensatz per Locate zu ändern, erscheint mir nicht sinnvoll. Je nach Einstellung dürfte das Locate ein Post implizieren oder ein Cancel. Beim Post steht dann die Änderung in einem anderen Datensatz, als in dem per Locate gesuchten und ggfls. angezeigten. Bei einem impliziten Cancel wird keine Änderung durchgeführt. Damit könnte man sich den Änderung auch sparen, da sie beim Locate sowieso verworfen wird.

Lade Dir die benötigten Daten per SQL. Übertrage das Ergebnis in eine MemTable (s. o.) und arbeite dann ausschließlich mit dieser weiter.

Bei deiner bisherigen Anforderungsbeschreibung erscheint mir alles andere als "Gefrickel", sprich: Nicht zielführend und nicht sicher und zuverlässig implementierbar.
Delphi-Quellcode:
                                'CASE WHEN ( '+
                                  'concat(rj.JOB_ID, ' + QuotedStr(' ') + ', JOB_NAME) is NULL) then '+
Was ich ncht verstehe: concat(rj.JOB_ID, ' + QuotedStr(' ') + ', JOB_NAME)
Kann ein concat(Null, ' ', Null) Null sein oder ist es immer zwingend ein ' ' und damit nicht Null?


Ein paar Stunden später:

Was mir noch auffiel:

Per TOP 1 wird ein Datensatz gesucht, die Ergbenismenge enthält also 0 oder 1 Datensatz. Danach wird per First auf den ersten von einem Datensatz gewechselt und dieser eine Datensatz wird dann erfolgreich(?) in diesem einen Datensatz per Locate gesucht.
Das Ergebnis von Locate wird jedoch nicht überprüft, bei false hieße es z. B., dass der eine Datensatz in der Menge von einem Datensatz nicht gefunden wird, aber der dann zufällig beim Datansatzzeiger stehende Datensatz, also der erste und einzige Datensatz, wird zur weiteren Verarbeitung genutzt.

Wenn nun diese Konstrukt so funktioniert und vorhandene Probleme behebt, ist das absoluter Zufall.

Bitte überprüfe dein Vorgehen noch einmal, ggfls. liefere uns eine (möglichst) konkrete Beschreibung der Aufgabenstellung, damit wir zielgerichtete Hilfestellung geben können.

Geändert von Delphi.Narium (15. Jun 2023 um 21:40 Uhr) Grund: Schreibfehler und Text ergänzt.
  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 12:19 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