Autor |
Beitrag |
Whisper
Beiträge: 16
WIN XP
Delphi
|
Verfasst: Do 29.09.05 13:16
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
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 29.09.05 13:26
Moin und im Forum!
Deine Frage gehört IMHO in die Datenbank-Sparte, oder?
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
Beiträge: 6388
Erhaltene Danke: 146
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 29.09.05 13:54
Moin!
OK, bin nicht der DB-Experte...
Ich klink mich wieder aus.
cu
Narses
|
|
Tranx
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: 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:
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.
_________________ Toleranz ist eine Grundvoraussetzung für das Leben.
|
|
Tranx
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: 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.
_________________ Toleranz ist eine Grundvoraussetzung für das Leben.
|
|
Sinspin
Beiträge: 1327
Erhaltene Danke: 117
Win 10
RIO, CE, Lazarus
|
Verfasst: 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.
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
Tranx
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: 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.
_________________ Toleranz ist eine Grundvoraussetzung für das Leben.
|
|
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 02.12.14 13:08
|
|
Tranx
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: 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 ...??
_________________ Toleranz ist eine Grundvoraussetzung für das Leben.
|
|