![]() |
Datenbank: egal • Version: 1 • Zugriff über: FireDac
TDataset im editmodus durchsuchen
Hallo,
ich wollte mal sehen ob es eine Möglichkeit gibt, das folgende einfach zu tun : Sagen wir ich habe ein Dataset mit einem Integerfeld (in Wahrheit sind es 3 Felder, tut aber nichts zur Sache, will nur vermeiden, dass Vorschläge wie "Nimm eine Generic list" kommen). Ich will vermeiden, dass eine Zahl doppelt reinkommt, arbeite mit CachedUpdates, kann also nicht durch SQL in der DB nachfragen. Kann man irgendwie beim "BeforePost" prüfen, ob der Wert schonmal eingegeben wurde ? Das Problem ist ja, dass ich im Editmode bin und nicht einfach den Cursor verschieben kann. Dazu müsste ich ein Post machen, dann bookmark nehmen, durchsuchen und dann wieder hinspringen und in den EditMode gehen. Geht das einfacher ? In einer Präsentation vor 1 oder 2 Jahren zu einem Preview einer neuen Delphi Version habe ich mal gesehen, dass man dataset in forin-Schleifen durchsuchen lassen kann (in der Zukunft damals) und kein TDataset.Next mehr ausrufen muss und das ging dann auch in einer Kopie automatisch, so dass die Cursorposition nicht geändert wird. Kam dazu mal was raus ? Oder geht das über Cloned Cursor (mit denen habe ich nie gearbeitet) Danke schonmal MRN |
AW: TDataset im editmodus durchsuchen
Hmmm, Locate kennst bestimmt ...
![]() Nain. Offiziell kommst nur durch Scrollen an andere Felder/Datensäte und dabei geht das Edit verloren, aber du kannst ja mal in den Protected-Property ala "Buffers" nachsehen (Typen TRecBuf, TValueBuffer, TRecordBuffer, ...), aber darfst dann auch die Werte selbst dort rauskopieren. (die vorhandenen TField-Instanzen greifen ja nur auf die aktuelle Zeile zu) Nja, man könnte zwar auf die internen Daten/Records zugreifen, aber dafür kenn ich jetzt es keine direkten API/Funktionen und praktisch kann/tut jeder Komponentenentwickler bei seinem Dataset die Daten anders speichern. Und das TDataSet selber hat noch garkeinen Speicher. Speichern, dann suchen und bei Fehler wieder zurück geht auch nicht so gut, weil dann beim Cancel wieder die neuen (falschen) Daten im Record stehen. Bzw. im BeforePost das Alte merken (Field.OldValue, wird quasi autormatisch im BeforEdit kopiert), dann speichern, suchen, bei Fehler das Neue/aktuelle merken, das Alte wieder rein und speichern, Edit wieder öffnen und die neue Kopie zurück ....... wenn du das jetzt verstanden hast, dann darfst es gern so machen. :stupid: |
AW: TDataset im editmodus durchsuchen
Warum läßt Du das nicht die DB machen?Die sollte das eigentlich können.
Gruß K-H |
AW: TDataset im editmodus durchsuchen
Hallo,
Unique Index drauf und mit einer 2. Query separat suchen |
AW: TDataset im editmodus durchsuchen
Moin...:P
Zitat:
|
AW: TDataset im editmodus durchsuchen
Zitat:
Zitat:
|
AW: TDataset im editmodus durchsuchen
Zitat:
also... +1 8-) |
AW: TDataset im editmodus durchsuchen
(Ganz weit im Hinterkopf)
Gab es nicht sowas wie (virtuelle) Dataset Kopien? Dort könnte man das vielleicht prüfen. |
AW: TDataset im editmodus durchsuchen
ClientDataset hat eine Clone-Methode, die für sowas gut ist.
Unique-Index auf das Feld (die Felder) + du bekommst beim Posten einen Fehler, wenn der Wert schon da ist. Du bekommst die Werte, die in der Query stehen ja von irgendwoher - hol sie dir 2x ab + du kannst in der 2ten Instanz beliebig suchen. Du bekommst die Werte, die in der Query stehen ja von irgendwoher - schau dort nach, ob es den Wert schon gibt. Bevor(!) du editierst, hol dir die daten, die dich interessieren in eine andere Struktur + validiere dort. Lass die Datenbank den Fehler entdecken. Benutze was anderes, das beim Post nicht gleich in die DB schreibt - zB wie die ClientDatasets. |
AW: TDataset im editmodus durchsuchen
Zitat:
Zitat:
|
AW: TDataset im editmodus durchsuchen
Zitat:
Zitat:
Das mit dem Index im TDataSet kann ich auchmal probieren, hört sich interessant an. |
AW: TDataset im editmodus durchsuchen
Zitat:
|
AW: TDataset im editmodus durchsuchen
Hier die Lösung, welche ich im Endeffekt programmiert habe :
Code:
Ich hoffe, es hilft jemandem, der mal ein ähnliches Problem hat :)
procedure TForm1.qryDataBeforePost(DataSet: TDataSet);
var ADataSet: TFDMemTable; bCanPost : Boolean; StartDate1, StartDate2, EndDate1, EndDate2 : TDate; begin StartDate1 := qryDatagueltigab.AsDateTime; EndDate1 := qryDatagueltigbis.AsDateTime; bCanPost := True; ADataSet := TFDMemTable.Create(Self); try ADataSet.CloneCursor(qryData); ADataSet.First; while Not ADataSet.Eof do begin StartDate2 := ADataSet.FieldByName('gueltigab').AsDateTime; EndDate2 := ADataSet.FieldByName('gueltigbis').AsDateTime; if ((DateInRange(StartDate1, StartDate2, EndDate2)) Or (DateInRange(EndDate1, StartDate2, EndDate2))) then begin bCanPost := False; Break; end; ADataSet.Next; end; finally ADataSet.Free; end; if Not bCanPost then begin MessageDlg('Fehler im Gültigkeitszeitraum', mtWarning, [mbOk], 0); Abort; end; end; |
AW: TDataset im editmodus durchsuchen
Alternativ ohne CachedUpdates und mit einer Transaktion um alles.
Da kannst dann mit dem zweiten Query in der selben Transaktion in der DB suchen, weil die ja schon alles kennt. |
AW: TDataset im editmodus durchsuchen
Zitat:
Es funktioniert ja jetzt, vielen Dank an alle :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz