Entwickler-Ecke
Datenbanken - Fehlermeldung: Datenmenge ist im weder Editier- noch Einfüge
Whisper - Do 29.09.05 13:16
Titel: Fehlermeldung: Datenmenge ist im weder Editier- noch Einfüge
Ich möchte in die Datenbank programmtechnisch einen Datensatz einfügen.
Delphi-Quelltext
1: 2: 3: 4: 5:
| if not dm.MyTableDomain_Klasse.Locate('Domain_KlasseID',999,[]) then begin dm.MyTableDomain_Klasse.AppendRecord([999,'nicht festgelegt', 'not specified']); Domain_KlasseID:= 999; end |
Ich erhalte folgende Fehlermeldung:
Datenmenge ist im weder Editier- noch Einfügemodus. :cry:
Moderiert von
Gausi: Topic aus Sonstiges verschoben am Do 29.09.2005 um 13:25
Narses - Do 29.09.05 13:26
Moin und :welcome: im Forum!
Deine Frage gehört IMHO in die Datenbank-Sparte, oder? :wink:
Probier das mal so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| if not dm.MyTableDomain_Klasse.Locate('Domain_KlasseID',999,[]) then begin dm.MyTableDomain_Klasse.Edit; dm.MyTableDomain_Klasse.AppendRecord([999,'nicht festgelegt', 'not specified']); Domain_KlasseID:= 999; dm.MyTableDomain_Klasse.Post; end |
cu
Narses
jasocul - Do 29.09.05 13:46
@Narses:
Das "Edit" darf nicht davor stehen!
Der Fehler muss eine andere Ursache haben. Ist dein DataSet evtl. im ReadOnly-Modus (siehe auch RequestLive)?
Narses - Do 29.09.05 13:54
Moin!
OK, bin nicht der DB-Experte...
Ich klink mich wieder aus. :wink:
cu
Narses
Tranx - Mo 01.12.14 08:42
Ich hatte auch das Gleiche Problem. Ich hatte eine Suchfunktion geschrieben, in der der Locate-Befehl auftrat. Das anschließende Dataset.Edit führte zu einem Fehler.
Die Datentabelle (SQL-Tabelle) hatte Requestlive = True, war aktiv und hatte als State dsBrowse.
Ich hatte in der Funktion sowohl eine schnelle Suche (Locate) als auch eine langsame Suche (sequentiell) implementiert. Mit der langsamen Suche funktionierte auch das anschließende Edit.
Aufruf und Verarbeitung
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| : DM.Neuladen([DM.qryTabelle],False); if DM.GeheZuDatenSatz(DM.qryTabelle, 'AUFTRNR', lsAuftrNr, False) then begin try DM.qryTabelle.Edit; lsKuerzel := ExtractFileName(lsVerz); lsKuerzel := Copy(lsKuerzel, 6, 255); DM.qryTabelle.FieldByName('KUERZEL').AsString := lsKuerzel; DM.qryTabelle.Post; except Fehler('zur Zeit kann das Kürzel nicht in die Tabelle eingetragen werden!'); end; end; : |
Suchfunktion:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56:
| type Tdm = class(TDataModule) : function GeheZuDatensatz(poTabelle: TDataset; psFeld, psWert: string; pbSchnell : boolean = True): Boolean; : end;
implementation
function Tdm.GeheZuDatensatz(poTabelle: TDataset; psFeld, psWert: string; pbSchnell: boolean = True): Boolean;
function SucheLangsam(psFeld, psWert: string): Boolean; var lbGef: boolean; begin with poTabelle do begin try DisableControls; psWert := Trim(Uppercase(psWert)); lbGef := False; First; while not (EoF or lbGef) do begin lbGef := (UpperCase(Trim(FieldByName(psFeld).AsString)) = psWert); if not lbGef then Next else Break; end; finally EnableControls; end; end; Result := lbGef; end;
begin if not (poTabelle.Active) then poTabelle.Active := True; if pbSchnell then begin try Result := poTabelle.Locate(psFeld, psWert, [loCaseInsensitive]); except Result := SucheLangsam(psFeld, psWert); end; end else begin Result := SucheLangsam(psFeld, psWert); end; end; |
Wie gesagt, so funktioniert es. Ab er so ganz begreife ich es nicht? Setzt etwa der Locatebefehl irgendeinen Flag in der Datentabelle zurück, so dass der Datensatz nicht mehr editierbar ist? CanModify ist nach dem Suchbefehl auch bei schneller Suche auf True, das kann es nicht sein.
Tranx - Mo 01.12.14 12:45
Noch ein paar Anmerkungen: Wie sieht es mit irgendwelchen Ereignisroutinen (BeforePost, AfterOpen, BeforeOpen ....) aus? Vielleicht funken die dazwischen. Alternativ, wenn die Kombination TQuery und TDBGrid dazwischenfunkt, weiol Ereignisroutinen der Datensatzkomponente oder des TDBGrid benutzt werden, dann vielleicht die gleiche Tabelle mit einer völlig losgelösten TQuery-Komponente ansprechen.
Auch eine fehlende Indizierung eines Feldes kann schon Probleme verursachen. Das würde ich mal testen.
Sinspin - Mo 01.12.14 12:53
@
Tranx : Es geht aber nicht darum einen bereits vorhandenen Datensatz zu bearbeiten. Sondern ums einfügen -> Append.
Ist die Tabelle offen?
Was verwendest Du? Table oder Query? Was für DBKomponenten? Ich kenne AppendRecord nur ohne Parameter.
Ansonsten schließe ich mich
Tranx an. Da muss ein Ereignisshandler an der Tabelle oder einer anderen Komponente, die die Daten verarbeitet sein, die ein Post ausführt bevor das Insert vollständig angeschlossen ist.
Tranx - Di 02.12.14 12:53
Sicher, das Append ist etwas andereres als Edit, aber bei Fehlern verghalten sich beide fast gleich. Aber ich habe den gleichen Effekt bei Edit. Und ich bin schon fast am Verzweifelen, eine Ereignisroutine kann es nicht sein, irgendwelche Ereignisroutinen von abhängigen Windowobjekten können es auch nicht wsein. Es betrifft nur 2 von mehreren Datensätzen. So als ob die Datensätze einzeln gesperrt sind. Die SQL-Abfvrage ändert sich nicht. Selbst bei der langsamen Methode der Suche funktioniert der Eintrag in die Datenbank (ACCESS-Datenbanktabelle) nicht. Aber eben nur bei 2 von 20 Datensätzen der gleichen Tabelle.
Delete - Di 02.12.14 13:08
Whisper hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5:
| if not dm.MyTableDomain_Klasse.Locate('Domain_KlasseID',999,[]) then begin dm.MyTableDomain_Klasse.AppendRecord([999,'nicht festgelegt', 'not specified']); Domain_KlasseID:= 999; end |
Ich erhalte folgende Fehlermeldung: Datenmenge ist im weder Editier- noch Einfügemodus. :cry: |
Setz mal vor die Zeile mit dem Append die Sicherheitszeile:
Delphi-Quelltext
1:
| DM.qryTabelle.Active := True; |
Tranx - Di 02.12.14 13:42
Also, soweit ich das jetzt sehe, liegt mein Problem in der Tabelle in Access. Ich habe die Tabelle kopiert, umbenannt und dann die TQuery auf die neue Tabelle verweisen lassen. Jetzt funktioniert das Ganze. Muss mal sehen, welche sonstigen Auswirkungen das noch hat. Die Tabelle ist auf Access-Ebene nicht mit anderen Tabellen verknüpft. So dass ich die Originaltabelle wohl löschen kann. Was allerdings den Fehler erzeugte ...??
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!