Announcement

Collapse
No announcement yet.

Doppelten Datensatz bei eingabe erkennen

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

  • Doppelten Datensatz bei eingabe erkennen

    Hallo,

    habe folgendes problem: Ich möchte ein Adressbuch programmieren das bei eingabe eines Namens erkennt ob er bereits in der Datenbank gespeichert ist oder nicht. Mach das ganze mit einer Paradox DB (Lokal).

    Danke,
    Wilhelm Heinz

  • #2
    Hallo,

    wenn für diese Tabellenspalte (oder zusammengesetzte Spalten) ein <b>Primärschlüssel</b> angelegt wird, weigert sich die BDE automatisch, den doppelten Datensatz zu speichern. Über einen Try..Except-Block kann man diese BDE-Exception gezielt auswerten und den Anwender mit einer entsprechenden Hinweismeldung informieren.

    Wenn diese Prüfung bereits bei der Eingabe und vor dem Posten erfolgern soll, muss die Anwendung in einem zweiten Thread eine SELECT-Abfrage über TQuery oder einen Locate-Aufruf über eine zweite TTable auslösen

    Comment


    • #3
      Hallo,
      wie Andreas schon sagte, hier ein Beispiel mit TQuery:
      <pre>
      if qShort.Active then qShort.close;
      qShort.sql.clear;
      tmpStr :=
      'SELECT tn_id '+
      'FROM anwesenheit.db '+
      'WHERE tn_id = "'+ IntToStr(akt_TN_ID)+'"';
      qShort.sql.add(tmpStr);
      qShort.active := true;
      if qShort.RecordCount > 0 then ....
      </pre>
      Diese TQuery mit dem Namen qShort verwende ich für alle solche ähnlichen Abfragen. Da ich mit den Feldern nicht arbeiten muss, kann ich es auch universal verwenden.

      mfg Klaus-Pete

      Comment


      • #4
        Hallo Klaus-Peter,

        bei deiner Variante kannst du aber nicht 100pro davon ausgehen das Recordcount ein korrektes Ergebnis zurückliefert. eigentlich müßtest du nach qShort.active := true; noch qShort.Last; aufrufen, damit Recordcount einen korrekten Wert zurückliefert.
        Ich verwende für solche ähnlich gearteten Abfragen nach Möglichkeit auch immer nur eine Instanz der Komponente TQuery. Die Select-Anweisung sieht dann für dein Bsp. so aus:<pre> 'SELECT count(tn_id) as Anzahl '+
        'FROM anwesenheit.db '+
        'WHERE tn_id = "'+ IntToStr(akt_TN_ID)+'"'; </pre>
        Der Vorteil dabei ist, das in <b>jedem</b> Fall <b>ein</b> Datensatz zurückgeliefert wird. Wenn ich jetzt noch für 'Anzahl' ein persistentes Feld anlege, dann kann ich statt qShort.RecordCount > 0 besser qShortAnzahl.AsInteger > 0 verwenden und bin auf der sicheren Seite.

        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


        • #5
          Hallo,

          mit der Variable "akt_TN_ID" hab ich noch ein problem. Beim starten sagt Delphi Variable nicht Definiert. Was muß ich mit der Variable machen? Ist es eine Spalte in der Tabelle oder nur Hilfsvariable?

          Danke,
          Wilhelm Heinz

          Comment


          • #6
            Hallo Wilhelm,

            die Variable akt_TN_ID beinhaltet die ID des Datensatzes den du gerade Einfügen willst und die nicht schon vergeben sein soll. Wenn du keine solche ID hast, sondern bspw. mit Name und Vorname als Kriterium arbeitest, dann müßte das Gganze so aussehen:<pre>
            'SELECT count(*) as Anzahl '+
            'FROM anwesenheit.db '+
            'WHERE Name = ' + QuotedStr(EinzufügenderName) + ' and ' +
            ' Vorname = ' + QotedStr(EinzufügenderVorname);</pre>
            EinzufügenderName und EinzufügenderVorname ist jetzt der Name in dem Datensatz der eingefügt werden soll.

            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


            • #7
              Danke jetzt Funktioniert es

              Comment


              • #8
                Danke Falk,

                ich lass mir das mal durch den Kopf gehen.

                mfg Klaus-Pete

                Comment

                Working...
                X