Paradox7 Datenbank Texte Auslesen



  • Hallo leute ich habe ein Problem habe über den Borland Builder 5 eine Paradox Datenbank erstellt.Diese Bekommt in einer Zeile und einer Spalte nur ein Text zugewiesen.Jetzt wollte ich über eine Anwendung geschrieben mit C++ Texte bzw. den Text in einer Zeile einer Datenbank auslesen und als Ansistring an einer bestimmten stelle ausgeben.Ich habe leider keinen blassen schimmer wie solche befehle aussehen können und was ich beachten soll.

    Habe ein Programm geschrieben welches an einem Rechner Physikalisch Störpits auswertet.Diese Störbits sollen bzw werden als Text in einem StringGrid angezeigt.

    Ich möchte das jetzt so machen das ich in einer einfachen Paradox 7 Datenbank Texte festlege.diese Texte werden quasi aus der Datenbank ausgelesen und angezeigt.

    Kann mir da einer Helfen wie ich die Texte auslesen kann??

    Würd mich freuen!!



  • Pack ein TDataSource und ein TQuery auf das Formular. Bei TDataSource::DataSet gibt Du das TQuery en.
    Bei TQuery::DatabaseName gibst Du den Pfad zur Paradox-Datei an (nur den Pfad, nicht die Datei selbst). Dann musst du unter SQL noch das Select-Statement reinschreiben (SELECT Feldname FROM Tabellename). Doppelklick auf das Query-Objekt und im sich öffnenden Feldeditor Rechsklick und 'Alle Felder hinzufügen...' auswählen. Das wars im großen und ganzen auch schon. Um auf die einzelnen Datensätze zuzugreifen, iterierst Du einfach durch alle Datensätze:

    AnsiString Feldtext;
    Query1->Open();
    if (Query1->FindFirst())
    {
       do
       {
          Feldtext = Query1Feldname->AsString;
          // irgendwas mit Feldtext machen
       } while (Query1->FindNext());
    }
    if (Query1->Active)
       Query1->Close();
    


  • Hi noch ne evtl dumme Frage was währe bei dem Beispiel den das Feld in der Datenbank?

    Danke sehr für die schnelle Antwort!!!



  • Hi ich bins nochmal habe die Konfiguration so wie du gesagt hast durchgeführt
    soll ich das Select-Statement so eingeben wie du beschrieben hast?(SELECT Feldname FROM Tabellename) habs ohne und mit Klammern versucht leider bekomme ich die Fehlermeldung(Datenbank Engine Fehler wird geöffnet und Tabelle nicht vorhanden ausgegeben) im richtigen Pfad habe ich die Paradox7 Datenbank angelegt.
    Weiß nicht weiter shit.



  • Achso noch was ich habe eine Tabelle erstellt.Name ist Text.DB darauf wollte ich zugreifen.Ich seh grad das dort SQL bei Query steht.hat das was damit zu tun?



  • Als Feldnamen musst Du natürlich den Namen des Datenbankfeldes aus deiner Tabelle angeben. Und bei Tabellenname natürlich den Namen der Tabelle. Entweder Text oder Text.db. Bin mir nicht mehr ganz sicher. Und ja, wie Joe geschrieben hat, musst du das Select-Statement in der Eigenschaft SQL des Query-Objektes einfügen. Sonst kannst Du aber auch nach dem Doppelklick keine Felder hinzufügen. Sonst kann das alles nicht funktionieren... Du musst auch zwingend im Feldeditor das Feld hinzufügen.

    Gruß KK

    PS Könnte ein Moderator den Thread ins BCB-Forum verschieben?



  • Danke Joe und natürlich Killer Kobold.Ich werde das mal morgen ausprobieren und gebe euch eine Rückmeldung zurück.Obs geklappt hat.



  • Hallo da bin ich wieder also es hat alles gut geklappt bekomme jetzt mein text angezeigt und den nächsten auch hab das beispiel leicht verändert.So jetzt hab ich nur das Problem das ich nicht die gewünschte Zeile ansprechen kann z.B. die 200ste von 400 Meldungen ich würde das schon hinbekommen mit for schleifen oder anderes.Aber es gibt doch bestimmt eine leichtere Variante?Kann ich das FindNext() ihrgendiwe abfragen bzw vergleiche damit durchführen?



  • Man kann einen Select natürlich mittels einer WHERE-Klausel einschränken.

    Woher weißt du, dass du die 200. und 400. Meldung brauchst?
    Man kann in Tabellen suchen, oder sich nur Datensätze anzeigen lassen, auf die bestimmte Kriterien zutreffen. Sieh die mal den SQL-Befehl WHERE an.



  • HI ich hab das als Beispiel angegeben meine Datenbank kann quasi mehrere Störtexte beinhalten max.255 momentan ist von meiner derzeitigen hardware abhängig.Ich gucke mir mal den Befehl Where an mal gucken obs klappt :-).Müsste mir dann etwas zusammenwürfeln vielleicht müsste man im Störtext als erstes eine Nummer vorgeben nur weiß ich jetzt noch nicht ob ich meine suche Filtern kann nur auf eine bestimmte erste nummer.

    Ich guck mal falls du eine Idee hast würds mich freuen.



  • Ja, das geht schon (mit LIKE), aber schneller und besser wäre es mit einem Integerwert zu arbeiten. Wenn Du also zB Fehlernummern verwenden könntest, solltet Du einfach noch ein Feld mehr in der Tabelle machen und die dort eintragen. Wenn Du dann nach eine bestimmten Fehlernummer suchst, kannst du das gezielt machen. Nehmen wir an, du unterscheidest zwsichen verschiedenen Fehlertypen und speicherst diese in einem Feld, das du Fehlertyp nennst. Dann würde die Where-Klausel so aussehen:

    WHERE Fehlertyp = 100
    

    Damit bekommst Du alle Datensätze zurückgeliefert, die diesen Fehlertyp haben.
    Um das flexibel zu gestalten verwendet man Parameter. Die Where-Klausel könnte dann so aussehen:

    WHERE Fehlertyp = :Para_Fehlertyp
    

    Dann musst Du allerdings vor dem Öffnen der Query noch den Parameter setzen:

    Query1->ParameterByName("Para_Fehlertyp")->AsInteger = 100;
    

    Wenn Du keinen Fehlertyp verwendest, sondern eine eindeutige ID für jeden Fehler, solltest Du das Feld in der Datenbank als Primärindex und als Typ 'Zähler' definieren.

    Gruß KK



  • Hallo ich bins wieder 🙂 also ich habs mal versucht mit deinen Beispielen leider stürzt mir dabei das Programm immerwieder ab deshalb habe ich gestern eine andere möglichkeit gewählt und zwar gebe ich einer for schleife ein wert vor z.B. 5 dann durchläuft die insich 5 schritte und ruft quasi den 5 Text auf.Wollte mich nur mal bedanken für die anderen Tipps ohne denen hätte ich wohl nicht mal nen Text auf den Bildschirm bekommen 🙂

    Jetzt kniffel ich an einem anderen Problem rum und zwar will ich herausfinden wo der letzte eintrag ist bzw. welche Zeile den letzten Text besitzt weil wenn ich quasi eine 10 als Wert eingeben würde aber 5 Zeilen sind nur geschrieben gibt er mir in dem Fall den 5 Text aus ich wills halt so hinbekommen das fals eine 10 eingegeben wird und kein text in der zeile vorhanden ist will ich das eben als Info weitergeben.

    Vielleicht hast ja eine Idee?

    Ansonsten Viellen Dank für die Hilfe!!



  • Hm, wenn Du doch komplett Zeilenorientiert arbeitest, verstehe ich nicht, warum Du überhaupt eine Datenbank verwendest? So weit ich das verstanden habe, ist doch sowieso nur ein Textfeld in der Tabelle. Außerdem gibt es keine 'Zeilen' in einer Datenbank, sondern nur Datensätze. Die Reihenfolge und die Position sind von der gewählten Sortierung abhängig.

    Welche Fehlermeldungen treten denn auf, wenn Du das versuchst die Anregungen von Killer-Kobold umzusetzen?

    Dein aktuelles Problem verstehe ich nicht so wirklich. Kannst Du das etwas genauer erklären.



  • Im Großen und ganzen gehts darum,dass ich ein Programm erstellt habe welches eingangssignale an einigen PC Schnittstellen einliest einfachstes Bsp an einer LPT1 Schnittstelle.So da dieses Programm für verschiedene Nutzer erstellt wurde wollte ich es einfach machen und eine ""Datenbank bzw Fehlertext Tabelle" erstellen wie es jetzt der Fall ist.Über das Programm kann der User diese Tabelle in einem DBGrid bearbeiten oder auch direkt öffnen und somit Fehlertexte einfügen.Die für einen bestimmten Eingang vorgesehen sind.

    Im großen und ganzen ist das alles spielerei da es heutzutage sicherlich tausende von ähnlichen programmen gibt 🙂

    Gedacht ist das eigentlich für eine einfache Ausgabe von Texten oder einfaches steuern von Signalen bzw auch abfragen von signalen über einen stinknormalen PC der mit einer für meinen jetzigen fall Siemens Simatic 8Bit Ausgangsbaugruppe kommunizieren soll.Man braucht nicht teure Touchpanels oder dergleichen wenn man keine vernetzung durchführt.

    Naja wie gesagt nur Spielerei.

    So die Fehlermeldung kenne ich jetzt nicht mehr aus dem Kopf jedenfalls ist mir der Borland Builder in die Fehlersuche gegangen.Und es wurde eine Meldung angezeigt wie Feldname unbekannt oder etwas der gleichen.

    Ich hab jetzt halt nur noch das Problem das ich bei höheren meldungs nummern als vorhandene meldungen immer den letzten text bekomme.das wollte ich verhindern quasi mit textfeld fehlt.
    Nur ob das möglich ist das letzte Textfeld einer Tabelle herauszufinden?



  • Dieser Thread wurde von Moderator/in Marc++us aus dem Forum Datenbanken in das Forum VCL (C++ Builder) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ok, was bekommst Du denn über die LPT-Schnittstelle geliefert? Eine Fehlernummer, nehme ich mal an? Diese Fehlernummer könntest Du als Primärindex in der Tabelle verwenden und dem User ermöglichen, dazu einen Text zu hinterlegen.
    Habe ich das jetzt so weit richtig verstanden?



  • Also da ich nur 4 Eingangssignale an der LPT1 auswerten will, habe ich die möglichkeit bis 15 Fehlernummern zu übertragen die untesten vier bits meiner ausgangskarte der Siemens CPU ich Programmiere in der Siemens Steuerung bei einer gewissen Meldung ein Ausgangsbyte z.B. Wert 2.Dieser Wert wird fest in eine oder mehrere Variable des C++ Programms gespeichert. Variable zb. int X

    dann verwende ich eine For Schleife die ein mal in sich durchlaufen wird in der schleife wird das FindNext() ausgeführt.So landet er quasi in der richtigen Zeile der Datenbank und gibt mir den dort hinterlegten Text aus.

    Ich habe auch eine Simulation erstellt wo der Anwender eine Fehlernummer in einem Edit Fenster eingibt und somit testen kann ob die richtige Fehlermeldung angezeigt wird.

    Wie ich schon sagte wird ein höherer Wert ausgegeben z.B. als verwendete Fehlertexte wird mir immer der letzte Text angezeigt und das wollte ich verhindern.Vielelicht mit FindNext() quasi gucken wo er stehenbleibt wenn er nichts anderes findet nur wie Frage ich FindNext() ab evtl.??

    Was meinst du genau mit: Diese Fehlernummer könntest Du als Primärindex in der Tabelle verwenden und dem User ermöglichen, dazu einen Text zu hinterlegen.

    hab das akustisch 🙂 nicht versatnden.

    Gruß und Danke



  • Nun ja, irgenwie muss die Fehlernummer doch mit der Fehlermeldung in Verbindung gebracht werden - und wie Du selbst schon gemerkt hast, ist eine Schleife dafür keine brauchbare Lösung.

    Nehmen wir an, Du erstellst eine Tabelle mit 2 Feldern: Fehlernummer (Integer, Primary Key) und Fehlerbezeichnung (char) und befüllst diese mit den Fehlernummern und Fehlerbezeichnungen. Wenn Du dann einen Fehler über den LPT erhälst, bekommst Du doch schon die Fehlernummer. Dann kannst Du die Fehlerbezeichnung recht einfach ermitteln. Schau Dir dazu noch mal Killer-Kobolds Posts an.

    Allerdings wage ich zu bezweifeln, dass 15 Fehler eine ausreichende Begründung für eine Datenbank sind. Insbesondere da Du auch die BDE mit Deinem Programm weiter geben mußt, da ohne die BDE die Paradox-Datenbank auf dem Zielsystem nicht verwendet werden kann. Und es gäbe dann vermutlich auch noch ein paar Probleme in Richtung Verzeichnis in der die Datenbank liegt und vielleicht auch noch bezüglich der Rechte... Grundsätzlich rate ich - außer zum Testen - schon seit längerem von der BDE ab. Einfach zu alt. Und ab Win XP gibt es dann auch noch falsche Fehlermeldungen... ZB wenn die freie Festplattenkapazität % 4 GB = 0 ergibt, behauptet der Paradox-Treiber, dass die Festplatte voll ist.

    In diesem Fall würde ich einfach eine TStringList nehmen. Da kann man ja auch mit Names und Values arbeiten, ähnlich wie in einer INI-Datei. Das sollte für Deine Zwecke die bessere Wahl sein.

    Ich will Dir Datenbanken nicht madig machen, aber bei den hier gestellten Anforderungen und den Nachteilen der BDE... Zum Üben ist die BDE noch ok, aber wenn Du die Datenbanken und Programme weiter geben möchtest, solltest Du Dich eher in Richtung Embedded-Datenbanken umsehen. Firebird gibt es zB auch in einer Embedded-Version.



  • Hi Danke für den rat!!Also ich habe vor neben der LPT1 auch eine Option für die USB Schnittstelle zu erstellen somit denke ich das ich mehr Fehlermeldungen ausgeben kann.Natürlich mit elektronik zwischengeschaltet.

    Du meinst die letzten beiträge von Killer-Kobold?Ich werds noch mal ausprobieren
    kannst du mir ein weiteres Beispiel zu Killer Kobolds Beispiel zeigen?

    Zur StringList hast du vollkommen recht ich glaubs für die LPT version werd ich auch so machen 🙂

    Danke



  • Wie ist denn der aktuelle Stand?
    Welche Felder befinden sich in der Tabelle und welch Zugriffskomponenten verwendest Du und Wie sind die eingestellt?

    Und zeig mal den Code, bei dem Du die Fehlermeldung bekommen hast.


Log in to reply