Announcement

Collapse
No announcement yet.

recordcount bringt das falsche ergebnis, warum???

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

  • recordcount bringt das falsche ergebnis, warum???

    wenn ich mit query eine abfrage starte und vom ergebnis die anzahl der
    datensätze mit recordcount ermitteln will bekomme ich immer die selbe zahl
    (912) egal wieviel ergebnisdatensätze es tatsächlich sind, warum???

    mfg

    markus
    Herzliche Grüße

    Markus Lemcke
    barrierefreies Webdesign

  • #2
    Hallo Markus,

    welche Datenbank wird verwendet, welcher Zugriffsweg (BDE, ADO, IBX oder ODBC) wird verwendet, wie sieht die SELECT-Abfrage aus und wie ermittelst Du die "richtige" Anzahl der Datensätze

    Comment


    • #3
      bde version 3.0, Datenbank paradox, die ermittlung der datensätze ist wie folgt: <br>

      einundaus.Panelsuchergebnis.caption := 'gefundene Buchungssätze: ' + inttostr(query1.recordcount);<br>

      der SQL-Befehl sieht wie folgt aus:

      with einundaus do<br>
      begin<br>
      if query1.active = true then query1.close;<br>
      if (zeitbeginnBox1.text <> '') or (zeitendebox.text <> '') and <br>(verwendungszweckBox1.text = '') then<br>
      begin<br>
      query1.sql.clear;<br>
      query1.sql.add('select * from buchfuehrung where datum >= :d1 <br>and datum <= :d2');<br>
      query1.params[0].AsDate := strtodate(zeitbeginnBox1.text);<br>
      query1.params[1].AsDate := strtodate(zeitendebox.text);<br>
      query1.open;<br>
      end;<br>

      if (zeitbeginnBox1.text <> '') or (zeitendebox.text <> '') and <br>(verwendungszweckBox1.text <> '') then<br>
      begin<br>
      query1.sql.clear;<br>
      query1.sql.add('select * from buchfuehrung where datum >= :d1 <br>and datum <= :d2 and verwendungszweck like :ver');<br>
      query1.params[0].AsDate := strtodate(zeitbeginnBox1.text);<br>
      query1.params[1].AsDate := strtodate(zeitendebox.text);<br>
      query1.params[2].AsString := verwendungszweckBox1.text;<br>
      query1.open;<br>
      end;<br>

      if (zeitbeginnBox1.text = '') or (zeitendebox.text = '') then<br>
      begin<br>
      query1.sql.clear;<br>
      query1.sql.add('select * from buchfuehrung where <br> verwendungszweck like :ver');<br>
      query1.params[0].AsString := verwendungszweckBox1.text;<br>
      query1.open;<br>
      end;<br>

      end;<br>
      einundaus.Panelsuchergebnis.caption := 'gefundene Buchungssätze: ' + inttostr(query1.recordcount);<br>
      close;<br>
      end;<br>

      da hätte ich eh, noch eine frage: diese abfragerei habe ich nur deshalb gemacht, weil wenn in den Comboboxen(zeitbeginnBox1,
      zeitendebox) wo man das datum rein schreibt NICHTS drin steht gibt es eine fehlermeldung!!!!!
      haben Sie da eine bessere idee????

      mfg

      marku
      Herzliche Grüße

      Markus Lemcke
      barrierefreies Webdesign

      Comment


      • #4
        Hallo Markus,

        nun - das merkwürdige <b>RecordCount</b>-Verhalten hat einen handfesten Hintergrund. Auch dann, wenn die BDE hinter den Kulissen ohne Fehlermeldung werkelt, bedeutet das nicht, das die BDE auch wirklich das macht, was der Entwickler mit seinem Programm anrichten wollte. Dabei handelt es sich nicht um einen Fehler der BDE, sondern um <i>Missverständnisse</i>, da sich beide Partner (Entwickler und BDE) nicht auf eine eindeutige Sprachregelung geeinigt haben.

        Angenommen, in einer Paradox-Tabelle wird die Spalte <i>UpdateDatum</i> vom Datentyp <b>DATE</b> verwendet. Somit kann im SQL-Explorer (Datenbank-Explorer) die folgende SELECT-Anweisung von Hand abgesetzt werden:
        <pre>
        SELECT Compiler, UpdateDatum FROM PasMail
        WHERE UpdateDatum BETWEEN "01.12.1999" AND "10.12.1999"
        </pre>
        Es sollten nur die Datensätze angezeigt werden, die dem Datumsbereich entsprechen. Wenn das Ergebnis in Ordnung ist, wird das Ganze im Programm wiederholt. Daher erhalten die Parameter bereits im Objektinspektor einen Wert:
        <pre>
        object Query1: TQuery
        DatabaseName = 'PasMail32'
        SQL.Strings = (
        'SELECT Compiler, UpdateDatum FROM PasMail'
        'WHERE UpdateDatum BETWEEN :Start AND :Ende'
        '')
        Left = 16
        Top = 16
        ParamData = <
        item
        DataType = ftDate
        Name = 'Start'
        ParamType = ptUnknown
        Value = '01.12.1999'
        end
        item
        DataType = ftDate
        Name = 'Ende'
        ParamType = ptUnknown
        Value = '10.12.1999'
        end>
        object Query1Compiler: TStringField
        FieldName = 'Compiler'
        Origin = 'PASMAIL32."Pasmail.DB".Compiler'
        end
        object Query1UpdateDatum: TDateField
        FieldName = 'UpdateDatum'
        Origin = 'PASMAIL32."Pasmail.DB".UpdateDatum'
        end
        end
        </pre>
        Wird das Ganze aufgerufen, so sollte der <b>RecordCount</b>-Wert auch hier in Ordnung sein.
        <pre>
        procedure TForm1.Button1Click(Sender: TObject);
        begin
        Query1.Active := True;
        ShowMessage(Format('%d Treffer', [Query1.RecordCount]));
        Query1.Active := False;
        end;
        </pre>
        Also werden im letzten Schritt auch die beiden Parameterwerte vom Programm gesetzt, d.h. die im Objektinspektor getroffene Vorauswahl wird überschrieben:
        <pre>
        procedure TForm1.Button1Click(Sender: TObject);
        begin
        Query1.Params[0].AsDate := StrToDate(EditStart.Text);
        Query1.Params[1].AsDate := StrToDate(EditEnde.Text);
        Query1.Active := True;
        ShowMessage(Format('%d Treffer', [Query1.RecordCount]));
        Query1.Active := False;
        end;
        </pre>
        Auch das ist erfolgreich, es wird tatsächlich nur die Anzahl von Datensätzen angezeigt, die im festgelegten Datumsbereich vorhanden sind.

        Ich würde an Deiner Stelle diese Versuche in dieser Reihenfolge nachvollziehen, damit die Ursache gefunden wird.

        P.S: Ein "unbekannter" Wert wird in SQL mit dem Schlüsselwort <b>NULL</b> gekennzeichnet, daher muss eine Suche nach einem leeren Datumsfeld so aussehen: SELECT * FROM Tabelle WHERE UpdateDatum IS NULL. Ausserdem kann eine leere Zeichekette über <b>AsDate</b> auch nicht erfolgreich in ein Datum umgewandelt werden

        Comment

        Working...
        X