Autor Beitrag
Whisper
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16

WIN XP
Delphi
BeitragVerfasst: Do 29.09.05 13:16 
Ich möchte in die Datenbank programmtechnisch einen Datensatz einfügen.


ausblenden 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 // if



Ich erhalte folgende Fehlermeldung:
Datenmenge ist im weder Editier- noch Einfügemodus. :cry:


Moderiert von user profile iconGausi: Topic aus Sonstiges verschoben am Do 29.09.2005 um 13:25
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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:
ausblenden 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 // if

cu
Narses
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 29.09.05 13:54 
Moin!

OK, bin nicht der DB-Experte...

Ich klink mich wieder aus. :wink:

cu
Narses
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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
ausblenden 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, 6255);
          DM.qryTabelle.FieldByName('KUERZEL').AsString := lsKuerzel;
          DM.qryTabelle.Post;
        except
          Fehler('zur Zeit kann das Kürzel nicht in die Tabelle eingetragen werden!'); // meine Ausgabefunktion, kann durch andere ersetzt werden
        end;
      end;
:


Suchfunktion:
ausblenden volle Höhe 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:
// in Interface, Objekt DM (Datamodule)
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
// Falls die Tabelle in einem TDBGrid benutzrt wird, wird hier der Datensatz-Zeiger eingefroren, ansonsten würde der Datensatzzeiger im TDBGrid wandern
            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
// Hier wird der Datensatz-Zeiger wieder freigegeben
           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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Mo 01.12.14 12:53 
@user profile iconTranx : 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 user profile iconTranx 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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



BeitragVerfasst: Di 02.12.14 13:08 
user profile iconWhisper hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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 // if


Ich erhalte folgende Fehlermeldung: Datenmenge ist im weder Editier- noch Einfügemodus. :cry:


Setz mal vor die Zeile mit dem Append die Sicherheitszeile:

ausblenden Delphi-Quelltext
1:
DM.qryTabelle.Active := True;					
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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.