Announcement

Collapse
No announcement yet.

Datenmenge weder im Editier- noch im Einfuegemodus

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Datenmenge weder im Editier- noch im Einfuegemodus

    Hallo,
    bin Anfänger in der Delphi-Datenbankprogrammierung. Wer kann mir helfen ?

    Habe ein Paradox-Tabelle, auf die mittels TTable zugegriffen wird. Im zugehörigen Formular ist in Bezug auf das Anzeigen alles OK. Aber wenn ich im DBNavigator auf "+" klicke, bekomme ich obige Fehlermeldung. Lt. der Hilfe versetzt doch der DBNavigator die Datenmenge in den entsprechenden Modus ?!
    Gruß,
    Chr.Mohr

  • #2
    Hi Christian,

    der DBNavigator setzt die TTable bei Klick auf "+" explizit in den Insertmodus. Das Problem liegt wahrscheinlich darin, daß in Deiner DataSource AutoEdit auf False gesetzt ist und beim Wechsel des Focus von einem Eingabefeld zum DBNavigator (also noch bevor der DBNavigator das Insert auslösen kann) dieses Eingabeld versucht die TTable zu beschreiben - und die ist nicht im Editmodus.

    Am Besten Du setzt die Enabled Eigenschaft aller Eingabefelder auf False und erst wenn sich State von TTable in [dsInsert, dsEdit] befindet gibst Du die Eingabefelder über Enabled := True wieder frei.

    Das Ändern des State kannst Du in DataSource.OnStateChange abfragen.

    procedure TForm1.DataSource1StateChange(Sender: TObject);<br>
    begin<br>
    DBEdit1.Enabled := Table1.State in [dsEdit, dsInsert];<br>
    end;<br>

    Gruß Fal
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hallo,
      doch, DataSource ist auf AutoEdit eingestellt...
      ich habe mir aber aufgrund deines Tips mal etwas Code in das OnStateChange-Ereignis geschrieben, nur um den Status anzusehen. Habe einen Haltepunkt reingesetzt und siehe da, das Ereignis wird 2x ausgelöst, nach dem 1.Mal ist der Status dsInsert, gleich darauf wieder dsBrowse; danach kommt die Fehlermeldung !

      Also, warum geht der Status wieder in dsBrowse ??

      Comment


      • #4
        Steht irgendwas im Ereignis AfterInsert oder AfterScroll der TTable (z.B. ein Post?

        Comment


        • #5
          Hallo,
          nein, nicht direkt. Ich habe mich mit dem Debugger durchgewühlt und es stellt sich heraus, daß es daran liegt, dass ich berechnete und Lookup-Felder in der TTable-Komponente angelegt hatte. Nehme ich die raus, funktioniert es.

          Nun stellt sich für mich die Frage, wenn ich keine Lookup-Felder da drin haben darf, wie ersetze ich die am duemmsten ???

          Gruß,
          Chr.Moh

          Comment


          • #6
            Hallo,

            was machen die berechnenden Felder? Wenn dort die Position des aktuellen Datensatzzeigers der aktiven Datenmenge geändert wird, macht die VCL implizit einen Post, d.h. der Datensatz ist dann <b>nicht</b> mehr im Eingabemodus. In diesem Fall muss man eine separate Session bzw. eine separate Datenmenge für das Zusammensuchen der Infos für die berechneten Felder verwenden

            Comment


            • #7
              Es geht eigentlich nur um ein Lookup-Feld; ich glaube nicht, daß das den Datenzeiger veraendert ?!

              Wenn ich mich mit dem Debugger durchgekämpfe, dann komme ich irgendwann zu TDataSet.EndInsertAppend;

              DoOnNewRecord;

              Dort gibt es dann die Zeile:

              if not (State in dsEditModes) then DatabaseError(SNotEditing, Self);

              der "State" ist dann aber dsInsert !

              Liegt das ganze vielleicht daran, daß ich bei der Erstellung der Paradox-Tabellen referentielle Integritäten verwendet habe ? Komme von Access-Datenbanken, dort war das zumindest kein Problem.

              Gruß,

              Chr.Moh

              Comment


              • #8
                Hallo,

                kann dieser Effekt in einem kurzen Beispielprojekt (das die DBDEMOS-Datenbank verwendet) reproduziert werden? Wenn ja, wie sieht dieses Beispiel aus

                Comment


                • #9
                  Hallo,

                  ich glaube, ich habe den Fehler gefunden:

                  Die Tabelle, die das Lookup-Feld enthaelt, war die Detail-Tabelle zur Tabelle, aus der die Lookup-Daten kamen.

                  Wobei mir noch nicht klar ist, warum das nicht gehen soll...

                  Comment


                  • #10
                    Hallo,

                    das Lookup-Feld muss den Wert in der Tabelle nachschlagen, d.h. der Datensatzzeiger wird dazu in der Nachschlage-Tabelle notgedrungen gewechselt. Wenn die Nachschlage-Tabelle mit der Editier-Tabelle identisch ist, führt das "Nachschlagen" (Datensatzwechsel) zu einem impliziten Post.

                    Ich würde daher versuchen, über eine <b>zweite</b> TSession-/TDatabase-/TTable-Verbindung die Nachschlage-Tabelle über eine separate BDE-Session laufen zu lassen. In diesem Fall sollte das Nachschlagen keinen Einfluss auf die editierte Tabelle haben

                    Comment


                    • #11
                      Hallo

                      die Nachschlage-Tabelle ist nicht identisch mit der Editier-Tabelle.

                      Hinzugefügt wird in der Tabelle "Artikel", nachgeschlagen in der Tabelle "Lieferanten". Lieferanten ist die Master-Tabelle für Artikel...

                      Klar kann ich das über eine zweite Session versuchen, aber das kommt mir schon ziemlich umständlich/unübersichtlich vor..

                      Comment


                      • #12
                        Hallo,

                        wenn in <i>Lieferanten</i> nachgeschlagen wird, und <i>Lieferanten</i> aber die Master-Tabelle für die editierte <i>Artikel</i>-Tabelle ist, so führt jede Änderung der Datensatzposition in <i>Lieferanten</i> automatisch zu einer Änderung der in <i>Artikel</i> sichtbaren Datensätze (Master-/Detail-Beziehung).

                        Wenn eine Auftrennung über eine zweite Session nicht in Frage kommt, muss für die Zeitdauer des Nachschlagens nur die Master/Detail-Verknüfpung zwischen <i>Lieferanten</i> und <i>Artikel</i> gelöst werden

                        Comment

                        Working...
                        X