| Autor | Beitrag | 
| Whisper 
          Beiträge: 16
 
 WIN XP
 Delphi
 
 | 
Verfasst: Do 29.09.05 12: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,[]) thenbegin
 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: 10183
 Erhaltene Danke: 1256
 
 W10ent
 TP3 .. D7pro .. D10.2CE
 
 | 
Verfasst: Do 29.09.05 12: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: 6395
 Erhaltene Danke: 149
 
 Windows 7 + Windows 10
 Sydney Prof + CE
 
 | 
Verfasst: Do 29.09.05 12: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: 10183
 Erhaltene Danke: 1256
 
 W10ent
 TP3 .. D7pro .. D10.2CE
 
 | 
Verfasst: Do 29.09.05 12: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 07: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:
 
 | typeTdm = 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 11: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: 1335
 Erhaltene Danke: 118
 
 Win 10
 RIO, CE, Lazarus
 
 | 
Verfasst: Mo 01.12.14 11: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 11: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 12:08 
 | 
|  | 
| Tranx 
          Beiträge: 648
 Erhaltene Danke: 85
 
 WIN 2000, WIN XP
 D5 Prof
 
 | 
Verfasst: Di 02.12.14 12: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.
 | 
|  |