Announcement

Collapse
No announcement yet.

TAdoTable - Methode Post

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

  • TAdoTable - Methode Post

    Hallo !

    Kennt jemand die Ursache für folgende Fehlermeldung bei TAdoTable.post:

    "Operation muß eine aktualierbare Abfrage verwenden"

    TAdoTable.edit wird zuvor durchgeführt und bringt keinen Fehler.

    Gruss Katja

  • #2
    Hallo,

    normalerweise sollte man freiwillig auf TADOTable verzichten und statt dessen <b>TADODataSet</b> einsetzen. Hat die angesprochene Tabelle einen Primärschlüssel? Wenn ja, welcher Datentyp wird dort verwendet

    Comment


    • #3
      Hallo Andreas,

      vielen Dank für Deine Antwort.

      Mit TADODataSet habe ich es auch probiert, es erzeugt das gleiche Problem.
      Es handelt es sich um eine Access 2000-Datenbank, die als Primärschlüssel ein Autoinc-Feld enthält.

      Gruß Katj

      Comment


      • #4
        Hallo,

        das ist nicht das Standardverhalten - die Ursache für dieses Problem muss also im Programmcode liegen. Wie sieht die Konfiguration von TADOConnection und TADODataSet aus, mit der sich dieses Problem mit einer ACCESS2000-MDB jederzeit reproduzieren lässt?

        P.S. ACCESS ist etwas anspruchsvoll, was die Konfiguration von CursorType und CursorLocation angeht. Dies gilt erst Recht dann, wenn AutoInc-Primärschlüssel verwendet werden. Da ich zur Zeit auf der Entwickler-Konferenz bin und mein Notebook zur Zeit nicht in Reichweite liegt, kann ich mein Beispielprojekt nicht als Muster anfügen

        Comment


        • #5
          Hallo !

          Habe das gleiche Problem wie Katja. Jedoch habe ich eine Paradox-Tabelle als Datenhintergrund und gleich TADODataSet benutzt. Ein Schlüsselfeld habe ich nicht. Bei mir sieht es zur Zeit so aus:

          tabelle.edit;

          //tabelle.Fields.Fields[2].AsString := 'In Bearbeitung';

          tabelle.Fields.Fields[2].Value := 'In Bearbeitung';

          tabelle.Post;

          Bei Post bekomme ich dann den von Katja angesprochenen Fehler.
          Wenn ich mehrere Versuche gemacht habe, mit verschiedenen Einstellungen, wird irgendwann die Tabelle gesperrt und nur wieder freigegeben wenn ich den Rechner neu starte.

          Vielleicht kann ja wer helfen.

          Sasch

          Comment


          • #6
            Hallo,

            das folgende Beispiel demonstriert, wie man mit ADO auf Master-/Detail-Tabellen einer ACCESS2000-Datenbank zugreifen kann, die AutoWert-Primärschlüsselfelder verwenden.

            Im Fall einer ACCESS-Datenbank (die über die lokal installierte Microsoft JET Engine bearbeitet wird) muss man <b>clUseServer</b> für die Eigenschaft CursorLocation verwenden.

            Beide Tabellen verwenden einen AutoWert-Primärschlüssel. Die beiden Tabellen dürfen jedoch nicht den gleichen Spaltennamen für die Fremdschlüsselspalte (Master-/Detail-Beziehung) verwenden. Während die Master-Tabelle die Spalte "ID" verwendet, benennt die Detail-Tabelle die Primärschlüsselspalte mit "DetailID" und die Fremdschlüsselspalte mit "MasterID".
            <pre>
            object ADOConnection1: TADOConnection
            ConnectionString =
            'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\TEMP\Out\AccessA' +
            'utoWert\AccessAutoWert.mdb;Persist Security Info=False'
            CursorLocation = clUseServer
            LoginPrompt = False
            Mode = cmShareDenyNone
            Provider = 'Microsoft.Jet.OLEDB.4.0'
            Left = 8
            Top = 8
            end
            object ADODataSetMaster: TADODataSet
            Connection = ADOConnection1
            CursorLocation = clUseServer
            CommandText = 'TblMaster'
            CommandType = cmdTableDirect
            Parameters = <>
            Left = 48
            Top = 8
            object ADODataSetMasterID: TAutoIncField
            FieldName = 'ID'
            end
            object ADODataSetMasterEintrag: TWideStringField
            FieldName = 'Eintrag'
            end
            end
            object DataSourceMaster: TDataSource
            DataSet = ADODataSetMaster
            Left = 80
            Top = 8
            end
            object ADODataSetDetail: TADODataSet
            Connection = ADOConnection1
            CursorLocation = clUseServer
            OnNewRecord = ADODataSetDetailNewRecord
            CommandText = 'select * from TblDetail where MasterID = :ID'
            DataSource = DataSourceMaster
            MasterFields = 'ID'
            Parameters = <
            item
            Name = 'ID'
            Attributes = [paNullable]
            DataType = ftInteger
            NumericScale = 255
            Precision = 255
            Value = 1
            end>
            Left = 48
            Top = 184
            object ADODataSetDetailDetailID: TAutoIncField
            FieldName = 'DetailID'
            end
            object ADODataSetDetailMasterID: TIntegerField
            FieldName = 'MasterID'
            end
            object ADODataSetDetailDetailWert: TWideStringField
            FieldName = 'DetailWert'
            end
            end
            object DataSourceDetail: TDataSource
            DataSet = ADODataSetDetail
            Left = 80
            Top = 184
            end
            </pre>
            Immer dann, wenn ein neuer Detail-Datensatz angelegt wird, belegt das Programm den Wert des dazupassenden Master-Datensatzes vor:
            <pre>
            procedure TForm1.ADODataSetDetailNewRecord(DataSet: TDataSet);
            begin
            ADODataSetDetailMasterID.Value := ADODataSetMasterID.Value;
            end;
            </pre&gt

            Comment

            Working...
            X