AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Update Datensatz im BetterAdoDataset
Thema durchsuchen
Ansicht
Themen-Optionen

Update Datensatz im BetterAdoDataset

Ein Thema von Chucky-GFX · begonnen am 21. Nov 2006 · letzter Beitrag vom 27. Nov 2006
Antwort Antwort
Seite 1 von 2  1 2      
Chucky-GFX

Registriert seit: 21. Nov 2006
7 Beiträge
 
#1

Update Datensatz im BetterAdoDataset

  Alt 21. Nov 2006, 16:16
Datenbank: AS400 • Zugriff über: ADO
Code:
KostenDBGridPro.DataSource.DataSet.Locate('WE_PARTNERNR', PartnerNr, []);
Temp := ServiceKostenEditForm.KostenEdit.Text;
KostenBetterADODataSet.Edit;
KostenBetterADODataSet.FieldByName('SK_KOSTEN').AsString := Temp;
 if (ServiceKostenEditForm.LohnnebenkostenCheckBox.Checked = true) then
     Temp := 'J'
 else
     Temp := 'N';
 KostenBetterADODataSet.FieldByName('SK_LOHNNEBENKOSTEN').AsString := Temp;

Hallo, ich habe folgendes Problem: Ich möchte gerne nach der Änderung eines Datensatzes nicht das ganze DBGrid neu lesen, sondern einfach nur einen Datensatz erneuern. Eben das mach ich mit dem oben beschriebenen code.

Wenn ich jetzt allerdings Update bekomme ich in unregelmäßigen abständen den Fehler:
"Die zum aktualisieren angegebene Zeile wurde nicht gefunden. Einige Werte wurden seit dem letzten lesen ggf. geändert."

Kann mir evtl. wer ne andere Variante zeigen, ohne das ich den kompletten Datensatz neu laden muss?

Gruß Chicky
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Update Datensatz im BetterAdoDataset

  Alt 21. Nov 2006, 18:14
Hat deine Tabelle einen Primärschlüssel?
Falls nicht, kommt es zu Schwierigkeiten beim Updaten oder Löschen von Datensätzen.
Falls deine Tabelle eine Primärschlüssel hat, sollte dieser in der Query enthalten sein;
das Feld kann ja unsichtbar geschaltet werden.
Andreas
  Mit Zitat antworten Zitat
Chucky-GFX

Registriert seit: 21. Nov 2006
7 Beiträge
 
#3

Re: Update Datensatz im BetterAdoDataset

  Alt 22. Nov 2006, 07:20
Klar hat die Tabelle einen Primärschlüssel.
Du meinst also ich soll in der DBGrid ein Update des Datensatzes machen...hmmm, das mache ich ja quasi indirekt mit dem was ich geschrieben habe...naja ich schau mal
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Update Datensatz im BetterAdoDataset

  Alt 22. Nov 2006, 07:58
Hallo,

der von Dir beschriebene Fehler passiert so:

ADO speichert die Zeile und erwartet vom Server eine Meldung wie "1 Zeile verändert". Aus irgend einem Grund kommt jedoch etwas wie "0 Zeilen verändert" zurück.

Das kann mehrere Ursachen haben:
A Auf der Tabelle ist ein Trigger, der blöderweise auch so eine Meldung liefert.
B Jemand anderes hat den Datensatz verändert.

(A) kannst Du einfach testen, indem Du das DB-Schema analysierst.
(B) kannst Du umgehen, indem Du die UPDATE-Anweisung in etwa so programmierst:
SQL-Code:
UPDATE Tabelle
   SET Feld1=1,
       Feld2=...
WHERE PrimaryKeyField = 123
Von Hause aus macht ADO nämlich so etwas:
SQL-Code:
UPDATE Tabelle
   SET Feld1=1,
       Feld2=...
WHERE PrimaryKeyField = 123
  AND Feld1= <AlterWertVonFeld1>
  AND Feld2= <AlterWertVonFeld2>
Die alten Werte des Datensatzes hat sich ADO beim Einlesen der Tabelle gemerkt. Von einer zwischenzeitlichen Änderung der Feldinhalte durch eine andere Anwendung bekommt ADO nix mit.

Gott-Sei-Dank verwendest Du das TBetterADODataset. Soweit ich weiss, geht das damit.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Chucky-GFX

Registriert seit: 21. Nov 2006
7 Beiträge
 
#5

Re: Update Datensatz im BetterAdoDataset

  Alt 22. Nov 2006, 08:39
Das von dir beschriebene hilft mir nich wirklich weiter.

Punkt B deiner Ursachen kann nicht der Fall sein, da ich alleine auf einem Testsystem arbeite.

Desweiteren benutze ich kein Update, sondern ein DELETE mit anschließendem INSERT, da es sein kann das in einer von zwei Tabellen noch kein Datensatz vorhanden ist und ich somit nicht mit einem UPDATE arbeiten kann. Im Fehlerfall geschieht hier ein Rollback.

Die von mir gesuchte Lösung soll einfach nur das eben in die Editiermaske eingegebene in die DBGrid übernehmen ohne alle Datensätze neu auszulesen sondern einfach nur den einen Datensatz.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Update Datensatz im BetterAdoDataset

  Alt 22. Nov 2006, 09:14
Ah, Du verwendest zwei unterschiedliche Datasets? Dann bist Du eben selbst der andere Anwender (B).

Verwende einfach ein einziges Dataset, konfiguriere das TBetterADODataset, das die Updates sauber laufen und dann müsstest Du dich um Nichts kümmern.

Sollte es sich bei deinem Dataset um eine VIEW handeln, die man nicht ohne Weiteres direkt verändern kann, dann musst Du die Synchronisatzion per Hand durchführen: Verändere die veränderten Felder auch in dem Dataset, das Du zur Anzeige verwendest. Bei diesem 'ReadOnly' Dataset musst Du nur dafür sorgen, das keine Änderungen an die DB geschickt werden. Ich kenne das TBetterADODataset nicht, aber das wird schon gehen.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Chucky-GFX

Registriert seit: 21. Nov 2006
7 Beiträge
 
#7

Re: Update Datensatz im BetterAdoDataset

  Alt 22. Nov 2006, 09:26
Nein ich benutze ein einziges BetterADODataset. Die SQL Abfrage jedoch benutzt einen JOIN um daten aus 2 Tabellen zu bekommen. Eine Tabelle ist immer gefüllt und die andere wird durch mein Programm mit informationen gefüllt. Deshalb ist ein UPDATE nicht möglich, da in einer Tabelle evtl noch kein Datensatz vorhanden ist.

Sollte ich nun die Daten geändert haben möchte ich nich per SELECT das ganze Dataset neu laden, sondern einfach nur den einen gerade geänderten Datensatz. So wie ich das oben beschrieben habe funktioniert es "eigentlich" jedoch krieg ich unbegründet diese abstürze. Ich brauch also kein neues SELECT oder sowas, sondern will einfach das die so eben eingegebenen daten im DBGrid angezeigt werden, weil es so ca. 20 - 30 sekunden dauert bis er sonst alle daten hat.

Code:
KostenBetterADODataSet.FieldByName('SK_LOHNNEBENKOSTEN').AsString := ServiceKostenEditForm.KostenEdit.Text;
So musst du dir es logisch vorstellen, wie setze ich es nun um ohne abstürze zu kriegen ?
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Update Datensatz im BetterAdoDataset

  Alt 22. Nov 2006, 10:23
LockType= ltLockOptimistic

und/oder im TBetterADODataset das UPDATE unterdrücken.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Chucky-GFX

Registriert seit: 21. Nov 2006
7 Beiträge
 
#9

Re: Update Datensatz im BetterAdoDataset

  Alt 22. Nov 2006, 10:41
Ich glaube wir reden aneinander vorbei, denn wenn ich das update unterdrücke...was hab ich denn dann davon ?
Damit mach ich es doch eigentlich falscher und nich richtiger

Bitte erläuter mir mal den zusammenhang! Danke
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Update Datensatz im BetterAdoDataset

  Alt 22. Nov 2006, 10:51
Nein, wir reden nicht aneinander vorbei.

Du hast ein Grid. Da stehen Daten drin. Dein UPDATE geht aber an dem Standardprozedere vorbei (MyDataset.Post). Also tritt Fall B ein.

Du willst nun nur die Zeilen im Grid verändern, die von deiner manuellen Veränderung betroffen sind.

Dann schreib die veränderten Werte einfach in das Grid rein. Woher soll ADO denn wissen, welche Records sich verändert haben?

Sei MyJoinedDataset das Dataset, das die Daten aus dem 'SELECT ... JOIN ... ' enthält. Normalerweise kannst Du die veränderten Daten ja so reinschreiben:
Delphi-Quellcode:
MyJoinedDataset.Edit;
MyJoinedDataset['Field'] := NewValue;
MyJoinedDataset.Post;
Beim 'Post' wird ADO aber entweder meckern oder doch irgendwelche Tabellen updaten. Das willst Du ja nicht, also musst Du ADO sagen , das es kein UPDATE durchführen soll.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 10:44 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