Announcement

Collapse
No announcement yet.

RecNo unter Access

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

  • RecNo unter Access

    Hallo,

    ich möchte, ähnlich einem MS Access Formular, einen Datensatzzähler (Datensatz n von n) in meine DelphiForm einbauen, doch hier gibt es unangenehme Probleme. Erstens zeigt der Wert von RecNo stets -1 und für den 'von'-Wert, den ich mit Teble.RecordCount ermittle vergeht unendlich viel Zeit (Bestand ca. 6.500 Datensätze).

    Was kann ich mit meinem RecNo machen, daß ich auch tatsächlich die richtige Datensatznummer erhalte und wie kann man RecordCount schneller machen.

    Vielen Dank
    Uwe

  • #2
    Hallo,

    die Implementierung von <b>RecNo</b> in <b>TDataSet</b> hat immer den Wert -1. Die Eigenschaft wird normalerweise nicht auf TDataSet-Ebene verwendet, sondern in einer abgeleiteten Klasse wie TTable neu deklariert und implementiert. Somit muss man zur Beantwortung der Frage wissen, <br>
    a) welcher Zugriffsweg auf die ACCESS-Datenbank verwendet wird (BDE, ODBC, DAO oder ADO), <br>
    b) welche ACCESS-Datenbankversion (95; 97 oder 2000) verwendet wird, und <br>
    c) welche Delphi-Version verwendet wird.

    Die lange Zeitdauer für <b>RecordCount</b> deutet darauf hin, das diese Funktion die Anzahl der Datensätze lokal vor Ort mitzählen muss

    Comment


    • #3
      Hallo Andreas,

      wie der Zugriff auf die Datenbank erfolgt, weiß ich nicht. Ich habe in der BDE Verwaltung MSACCESS (den nativen Zugriff) gewählt. Die Datenbank ist Access 97 und die verwendete Delphi Version ist #4 (incl. Update 2 und 3).

      Ich habe statt RecordCount den SQL Befehl SELECT Count ausprobiert und seltsamerweise ist dieser um "Lichtjahre" schneller.

      Danke inzwischen
      Uw

      Comment


      • #4
        Zu der Tatsache, daß die Anweisung: 'SELECT Count ...' liegt daran, wer die Berechnung durchführt.

        Bei 'SELECT Count ...' wird die Berechnung durch die Datenbank selbst durchgeführt und nur das Ergebnis an die BDE bzw. an die Anwendung hochgereicht.

        Bei der Berechnung mittels RecordCount muß die Berechnung die BDE durchführen. D. h. sie besorgt sich alle Datensätze von der Datenbank und zählt sie durch.

        Zu der anderen Sache mit der RecNo kann ich leider nichts sagen. Mußt auf eine Antwort von Andreas warten. Ich vermute mal, da je nach verwendeten Treiber (ODBC, ...) die BDE keine RecNo bestimmen kann und deshalb immer -1 zurückliefert.

        Dein gewählter Weg ist DAO (Der MSACCESS-Eintrag in der BDE-Verwaltung ist der mitgelieferte Treiber für die DAO-Schnittstelle von Access

        Comment


        • #5
          Hallo,

          wenn Delphi über den <b>DAO</b>-Treiber (Jet-Engine) auf eine MS ACCESS-Datenbank zugreift, interpretiert Delphi die Datenbank als <b>RDBMS</b> (Relational Database Management System) und wendet dabei die im SQL-Standard definierten Regeln an. Und bei einem RDBMS gibt es <b>keine</b> Datensatznummer. Daher liefert auch die VCL bei allen Datenquellen für ein RDBMS beim Aufruf von <b>RecNo</b> den Wert -1 zurück (solange der Treiber keine eigene Erweiterung des SQL-Standards implementiert)

          Comment


          • #6
            Hallo,
            jaa, was kann man denn da dann machen ?

            Gruß
            Uw

            Comment


            • #7
              Hallo,

              in der <b>Client/Server-Datenbankwelt</b> (aus der ich komme) gibt es da einen Standardspruch: "Es muss niemand wissen, an welcher Stelle er im Datenbestand ist". Das Darstellen und "Browsen" im DBGrid ist in EXCEL oder ACCESS üblich - aber in "richtigen" Datenbanken nicht.

              Normalerweise wird die Datenabfrage nur so konfiguriert, das nicht alle, sondern nur die tatsächlich benötigten Daten von der Datenbank abgefordert werden. Und wenn der Client alle Daten seiner Teilmenge (eingeschränkte Abfrage/Filter etc.) auf einmal abholt, kann er die Anzahl und die Position in eigener Regie bestimmen (also intern über TDataSource-Ereignisse mitzählen)

              Comment


              • #8
                Hallo Andreas, <br>

                also dann mach ich es jetzt auch so, wie in der "richtigen" Datenbankwelt. Die ganze Sache sollte ohnehin nur aus kosmetischen Gründen eingebaut sein. Sollte halt ein wenig "Access-mäßig" aussehen.

                Zwei grundsätzliche Fragen:
                1. ist es eigentlich sinnvoller die Datenmenge als TTable zur
                Verfügung zu stellen oder als "Requested Live" SQL Abfrage?
                2. ist es geschickter, datensensitive Eingabefelder zu verwenden oder
                kann, bzw. sollte man (wie ich es schon häufig gesehen habe)
                einfache Textfelder verwenden, die man beispielsweise auch als
                Array ansprechen kann?

                Ansonsten bedanke ich mich für die wirklich prompte und professionelle Hilfe. <br>

                Gruß
                <br>
                Uw

                Comment


                • #9
                  Hallo Uwe,

                  um die Frage TTable oder TQuery werden Glaubenskriege geführt - ich drücke mich daher vor einer kurzen Antwort. Es gibt bei jeder Datenbank (Desktop und C/S) gute Gründe für TTable und für TQuery, entscheidend ist der Zweck und vor allem die verwendete Konfiguration. Solange man die Ergebnismenge klein halten kann, spricht nichts gegen TTable (auch bei einer SQL-Datenbank). Das letzte Wort hat jedoch im Einzelfall immer der <b>SQL-Monitor</b>

                  Comment

                  Working...
                  X