Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Probleme mit .edit und .post auf eine mySQL Tabelle (https://www.delphipraxis.net/41294-probleme-mit-edit-und-post-auf-eine-mysql-tabelle.html)

mapolat 1. Mär 2005 08:20

Datenbank: mySQL • Version: 4.1.08 • Zugriff über: ZEOS 6.5.1 oder ADO

Probleme mit .edit und .post auf eine mySQL Tabelle
 
Habe Probleme mit TTabel.Post. Beim ausführen des "Post" Befehls auf eine mySQL Tabelle (mit und ohne ZEOS 6.5.1 Komponente) wird die Felhlermeldung : "Tabelle weder im Einfüge- noch Editier- Modus!". Komme einfach nicht mehr weiter und brauche dringend Hilfe. (evtl krz. Beschreibung welche Befehle man zum editieren auf jeden Fall benutzen müsste (.edit, .commit, .update, .updateRecords?????)

Ich habe zwar gefunden wo genau dieses Problem verursacht wird, weiss aber immer noch nicht warum und wie ich es beheben könnte.

Das formular hat 3 tabellen die miteinander in der Tabellen-Eigenschaften über Master-Detail verknüpft sind. Tabelle1 ist Master Tabelle vom Tabelle2. Tabelle3 ist wiederum die Detail-Tabelle vom Tabelle2.

Nun zum besseren Fehlerbeschreibung : Tabelle1, Tabelle2, Tabelle3 sind alle active, also Status = Open. Wird es im Tabelle 3 eine Änderung vorgenommen so wird im "After.Post" eigenschaft diese änderung an Tabelle2 übergeben wo dann der Fahler passiert.

Delphi-Quellcode:
procedure TFrm_01.BTN_1Click(Sender: TObject);
begin
  Tabelle_3.Edit;
  Tabelle_3.FieldByName('Zahl_1').Value := 3;
  Tabelle_3.FieldByName('Zahl_2').Value := 5;
  Tabelle_3.FieldByName('Zahl_3').Value := 11;
  if MessageBox(0, 'Möchten Sie die Änderungen wirklich übernehmen?', 'WARNUNG', MB_YESNO) = IDYES then
    Tabelle_3.Post
  else Tabelle_3.Cancel;
end;
 
procedure TFrm_01.Tabelle_3AfterPost(DataSet: TDataSet);
var Summe_1, Summe_2, Summe_3 : integer;
begin
  Summe_1 := 0;
  Summe_2 := 0;
  Summe_3 := 0;
 
  with Tabelle_3 do
  begin
    first;
    while not EOF do
    begin
      Summe_1 := Summe_1 + FieldByName('Zahl_1').AsInteger;
      Summe_2 := Summe_2 + FieldByName('Zahl_2').AsInteger;
      Summe_3 := Summe_3 + FieldByName('Zahl_3').AsInteger;
      next;
    end;
  end;

  Tabelle_2.Edit;
// Tabelle 2 ist hier in Tabelle_2.State = dsEdit - soweit noch alles OK.
 
  Tabelle_2.FieldByName('DetailSumme_1').asVariant := Summe_1;
// alles noch im grünen Bereich. 1.Wertzuweisung wird noch übernommen

// Hier (nach dem 1. Wertzuweisung) aber passiert der Fehler..
// Hier springt die Tabelle 2 unerwünscht und für mich unerklärlich auf Tabelle_2.State = dsBrowse

  Tabelle_2.FieldByName('DetailSumme_2').asVariant := Summe_2;
  Tabelle_2.FieldByName('DetailSumme_3').asVariant := Summe_3;
// diese beiden Wertzuweisungen werden nicht mehr übernommen da Tabelle_3 im dsBrowse Status ist.

  Tabelle_2.Post;
// während der post ausführung kommt dann die Fehlermeldung "Tabelle_2 weder in EDIT- noch in INSERT- Modus !"
end;

Sharky 1. Mär 2005 09:02

Re: Probleme mit .edit und .post auf eine mySQL Tabelle
 
Hai mapolat,

ersteinmal : "Herzlich Willkommen in der Delphi-PRAXIS".

Hast Du auch daran gedacht .ReadOnly := False bei deiner TZTable zu setzen?

mapolat 1. Mär 2005 10:29

Re: Probleme mit .edit und .post auf eine mySQL Tabelle
 
Hi Sharky

Herzlichsten Dank für die Begrüßung und für den raschen TIP.

Zitat:

"Hast Du auch daran gedacht .ReadOnly := False bei deiner TZTable zu setzen? "
Ja alle 3 Tabellen sind ReadOnly := FALSE; Ausserdem würde sonst die 1 Wertzuweisung nicht fehlerfrei laufen können, oder?

Aber trotztdem habe ich es vorhin nochmal gecheckt was dies auch bestätigte. Also wird es nicht daran liegen können. vielleicht hast du einen anderen TIP?

kiar 1. Mär 2005 10:41

Re: Probleme mit .edit und .post auf eine mySQL Tabelle
 
hallo ,

versuche es mal so:
Delphi-Quellcode:

with Tabelle_2 do
begin
   if state <> dsEdit then
   edit;
      FieldByName('Detailsumme1').AsVariant := Summe1;
      FieldByName('Detailsumme2').AsVariant := Summe2;
      FieldByName('Detailsumme3').AsVariant := Summe3;
   post;
end;
oder die hardcore variante :mrgreen:
Delphi-Quellcode:
if Table2.State = dsEdit then
begin
   Table2['Detailsumme1']:= Table3.FieldByName('Summe1').AsVariant;
   Table2['Detailsumme2']:= Table3.FieldByName('Summe2').AsVariant;
   Table2['Detailsumme3']:= Table3.FieldByName('Summe3').AsVariant;
end;

mapolat 1. Mär 2005 12:08

Re: Probleme mit .edit und .post auf eine mySQL Tabelle
 
Hi Kiar,

Dies habe ich auch versucht. Auch bei dem Versuch gab es nach der 1. Wertzuweisung Fehler. Komischerweise wird der 1. Wert angenommen dann springt die TabellenStatus auf dsBrowse.
Villeicht ein paar Details mehr :

Zunächst hier die mySQLDB Tabellen-Struktur:
  • Tabelle_1
    REC_NR primärindex, autoinkrement, integer;
    NAME varchar(50)

    Tabelle_2
    REC_NR primärindex, autoinkrement, integer;
    TABELLE_1_REC_NR integer;
    SUMME_1 decimal
    SUMME_2 decimal
    SUMME_3 decimal

    Tabelle_3
    REC_NR primärindex, autoinkrement, integer;
    TABELLE_2_REC_NR integer;
    ZAHL_1 decimal
    ZAHL_2 decimal
    ZAHL_3 decimal
Dann hier die Tabellen-Eigenschaften:

Delphi-Quellcode:
object Tabelle_1: TZTable
  Connection = mySQLDB
  CachedUpdates = False
  Active = True
  ReadOnly = False
  TableName = 'Tabelle_1'
  ShowRecordTypes = [usUnmodified, usModified, usInserted]
  UpdateMode = umUpdateChanged
  WhereMode = wmWhereKeyOnly
  Options = [doCalcDefaults]
  Left = 336
  Top = 65532
  object Tabelle_1REC_NR: TIntegerField
    FieldName = 'REC_NR'
  end
  object Tabelle_1NAME: TStringField
    DisplayLabel = 'Name'
    FieldName = 'NAME'
    Size = 50
  end
end

object Tabelle_2: TZTable
  Connection = mySQLDB
  CachedUpdates = False
  Active = True
  ReadOnly = False
  TableName = 'Tabelle_2'
  ShowRecordTypes = [usUnmodified, usModified, usInserted]
  MasterFields = 'REC_NR'
  MasterSource = D_Tabelle_1
  IndexFieldNames = 'TABELLE_1_REC_NR'
  UpdateMode = umUpdateChanged
  WhereMode = wmWhereKeyOnly
  Options = [doCalcDefaults]
  Left = 284
  Top = 65532
  object Tabelle_2REC_NR: TIntegerField
    FieldName = 'REC_NR'
  end
  object Tabelle_2TABELLE_1_REC_NR: TIntegerField
    FieldName = 'TABELLE_1_REC_NR'
    LookupDataSet = Tabelle_1
    LookupKeyFields = 'REC_NR'
    LookupResultField = 'NAME'
    KeyFields = 'TABELLE_1_REC_NR'
  end
  object Tabelle_2SUMME_1: TFloatField
    DisplayLabel = 'Summe_1'
    FieldName = 'SUMME_1'
    DisplayFormat = '#0.00'
  end
  object Tabelle_2SUMME_2: TFloatField
    DisplayLabel = 'Summe_2'
    FieldName = 'SUMME_2'
    DisplayFormat = '#0.00'
  end
  object Tabelle_2SUMME_3: TFloatField
    DisplayLabel = 'Summe_3'
    FieldName = 'SUMME_3'
    DisplayFormat = '#0.00'
  end
end

object Tabelle_3: TZTable
  Connection = mySQLDB
  CachedUpdates = False
  AfterPost = Tabelle_3AfterPost
  Active = True
  ReadOnly = False
  TableName = 'Tabelle_3'
  ShowRecordTypes = [usUnmodified, usModified, usInserted]
  MasterFields = 'REC_NR'
  MasterSource = D_Tabelle_2
  IndexFieldNames = 'TABELLE2_REC_NR'
  UpdateMode = umUpdateChanged
  WhereMode = wmWhereKeyOnly
  Options = [doCalcDefaults]
  Left = 456
  Top = 65532
  object Tabelle_3ZAHL_1: TFloatField
    DefaultExpression = '0.00'
    FieldName = 'ZAHL_1'
    DisplayFormat = '#0.00'
  end
  object Tabelle_3ZAHL_2: TFloatField
    DefaultExpression = '0.00'
    FieldName = 'ZAHL_2'
    DisplayFormat = '#0.00'
  end
  object Tabelle_3ZAHL_3: TFloatField
    DefaultExpression = '0.00'
    FieldName = 'ZAHL_3'
    DisplayFormat = '#0.00'
  end
end
Einziger Index ist jeweils REC_NR und wird beim TabellenVerknüpfung (Master.Eigenschaft) benutzt aber sonst im Programm nicht verwendet.

mapolat 2. Mär 2005 07:21

Re: Probleme mit .edit und .post auf eine mySQL Tabelle
 
Hi,

Jetzt habe ich herraus gefunden was den Fehler verursacht, kenne aber nach
wie vor weder den Grund noch eine Lösung.

Es liegt also in der Master-Detail Eigenschaft zwische Tabelle_1 und Tabelle_2.
Entferne ich diese Eigenschaften (also die Master-Detail verknüpfung aus der TabellenEigenschaften)
Dann klappt es mit edit und post auf Tabelle_2.

Selstam ist allerdings dass es mit dem Tabelle_2 und Tabelle_3 klappt. Wie schon gesagt ist ja Tabelle_1
Master vom Tabelle_2. Dieser ist wiederum Master von Tabelle_3.

Bei bestehenden Master-Detail Eigenschaft kann ich Tabelle_3 und Tabelle_2 in beliebigen kombinationen editieren und posten.

Warum, wieso, weshalb ???
was ist die Lösung ????

Sharky 2. Mär 2005 07:46

Re: Probleme mit .edit und .post auf eine mySQL Tabelle
 
Hai mapolat,

eine Lösung für diesen Fall kann ich Dir leider nicht sagen da ich nicht mit TTable arbeite.
Ich baue mir meine "Master-Detail" Anzeigen immer mit eigenen Querys auf. Ich finde da ist man wesentlich flexibler damit.

Stevie 2. Mär 2005 08:24

Re: Probleme mit .edit und .post auf eine mySQL Tabelle
 
Hallo mapolat,

ich hab jetzt mal deinen Fall nachgebaut und muss feststellen, dass bei mir kein Fehler auftritt.
Was für mich allerdings noch unerklärlich ist, und sicherlich eine Fehlerquelle darstellt, ist
das Speichern eines Satzes in einer Detail-Tabelle, ohne einen Bezug zu der Master-Tabelle zu haben.

Häng doch mal bitte dein Projekt und wenn möglich ein SQL-Script für deine Datenbank an...


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:53 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