C++ Datensätze durchsuchen und sortieren

Forumaner

Level-1
Beiträge
109
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich bin gerade dabei eine kleines Programm in C++ zu schreiben, das unseren eigenen SPS-Lagerbestand auflistet.
Die Datenbank an sich funktioniert einwandfrei, aber ich habe Probleme mit der Suchfunktion und der alphabetischen Auflistung.

Software: Borland C++ Builder

Als Datenbank kommt Paradox7 zum Einsatz.
Die Datenzugriffelemente sind TTable und TDataSource.
Das Eingabefeld für die Suche ist ein TEdit-Element und nennt sich Edit1.
Bei der Suche sollen alle Elemente angezeigt werden, die den Suchstring enthalten.

Die Filter von TTable wollen bei mir nicht funktionieren.

Ich habe bereits folgendes für die Suchfunktion probiert:
Code:
void __fastcall TForm1::Table1FilterRecord(TDataSet *DataSet, bool &Accept)
{
if(Edit1->Text==""){
Table1->Filtered=false;
Table1->Refresh();
}
else
{
Accept=Edit1->Text==Table1->FieldByName("MLFB")->AsString;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
 Table1->Filtered=true;
}
Das funktioniert, nur mit der Einschränkung, dass alle Datensätze angezeigt werden, die GENAU dem Text entsprechen, der eingegeben wurde.
Es sollen, wie bereits erwähnt, alle Datensätze angezeigt werden, die den Suchstring enthalten. Meine Funktion erfüllt die Vorgabe nicht!
Wie kann ich diese Suche nach meiner Vorgabe programmieren?

Die Tabelle möchte ich auch gerne nach der MLFB sortieren, weiß aber nicht, wie ich das mit meinen Elementen machen soll.
Die Tutorials, die ich im INet gefunden habe, beziehen sich alle auf Delphi.
Wie kann man denn ein TTable mit C++ sortieren?

Gruß und vielen Dank im Voraus,
Forumaner
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Question_mark,

ich habe nun nicht mehr auf Table1, sondern auf Query1 verwiesen und ich konnte mit einer SQL-Anweisung die Datensätze sortieren, danke für den Tip!
Nur leider kann ich nun keine Änderungen mehr in den DBEdit-Eingabefeldern machen und das DBGridControl lässt auch keinen Neueintrag bzw. keine Änderung zu. Die Datensätze kann ich aber noch immer mit dem DBGridControl durchscrollen!
Warum schafft jede Lösung immer neue Probleme?

Außerdem ist es mir noch nicht gelungen das Textfeld Edit1 mit meiner Suchfunktion zu verknüpfen.

Anbei das Projekt, erstellt mit dem Borland C++ Builder 1 und der abgespeckten Datenbank...

Verzweifelte Grüße,
Forumaner
 

Anhänge

Mal ein paar Hinweise

Hallo,

Forumaner schrieb:
Außerdem ist es mir noch nicht gelungen das Textfeld Edit1 mit meiner Suchfunktion zu verknüpfen.

Zuerst mal hast Du beim Edit1 den falschen Event "OnChange" verwendet. Dadurch wird bei jedem in das Editfeld eingegeben Zeichen schon ein Event ausgelöst und das ist nicht in Deinem Sinne...
Verwende hier lieber "OnExit", dann wird der Event nur einmal beim Verlassen des Feldes ausgelöst.

Beim TQuery1 hast Du den SQL-Text fest verdrahtet. Damit kannst Du das Query nur einmal in Deiner Anwendung sinnvoll nutzen. Weise der Eigenschaft "Query1.SQL" den Text dynamisch zur Laufzeit zu. Dann kannst Du das Query mehrfach nutzen. Etwa so :
Query1.Close;
Query1.SQL.Add('Select * ');
Query1.SQL.Add('FROM sps25 ';
Query1.SQL.Add('ORDER BY 1,3');
(Alternativ geht auch : Query1.SQL := 'SELECT * FROM sps25 ORDER BY 1,3');)
Query1.Execute oder Query1.Open (hängt von der Art der SQL Abfrage ab, die Taste F1 hilft Dir weiter.

Benutze den eingegebenen Text in Edit1 als Suchkriterium in Deinem SQL-Statement. Benutze in Deinem Statement den "LIKE" Operator, mehr dazu findet sich in einigen Tutorials im Internet, das will ich jetzt hier nicht alles abschreiben.

Gruß

Question_mark

PS : Upps, habe versehentlich die Delphi Syntax benutzt. Aber das sollte kein Problem sein, die Funktionen und Parameter sind bei Borland C++ Builder die gleichen.
 
Noch was

Hallo,

Deine Schreibweise der MLFB (z.B. 6ES5-308-UB11) ist etwas ungewöhnlich. Verwende lieber die Siemens Schreibweise 6ES5308-3UB11, sonst bringst Du die Anwender Deines Programms zur Verzweifelung.

Gruß

Question_mark
 
Auf die richtige Schiene bringen

Hallo,

HeizDuese schrieb:
die wird's doch in Borlands-C++ auch geben.

Natürlich gibt es das auch im Borland C++ Builder, der ist ja schließlich mit Delphi programmiert worden :) . Daher gibt es im Borland C++ Builder immer ein Äquivalent zu Delphi.
Der Forumaner verwendet jedoch noch Paradox mit der Borland BDE, die von Borland in der nächsten Version nicht mehr unterstützt wird. Insofern war die Wahl von Paradox und BDE als Datenbank nicht sehr glücklich. Darauf wollte ich aber eigentlich gar nicht weiter eingehen. Damit der Forumaner aber seinen Quellcode später auf eine andere Datenbank (Firebird, Interbase, MS SQL Server etc.) ohne wesentliche Programmänderungen portieren kann, habe ich dann mal den Weg über TQuery und SQL aufgezeigt. Zumal bekannt ist, dass Paradox und BDE eben nicht fehlerfrei zusammenarbeiten ..., aus eigener, leidvoller Erfahrung.
Support und Updates zur BDE sind von Borland schon vor vielen Jahren eingestellt worden, alle bekannten Fehler leben noch weiter, wie vor ein paar Jahren schon.
Sinnvoller wäre der Einsatz einer der o.a. Datenbanken, aber eigentlich habe ich bei Durchsicht des Quellcodes vom Forumaner bemerkt, dass der TE noch nicht besonders viele Zeilen eigenen Quellcode generiert hat und sich da etwas auf Neuland bewegt. Also erstmal wollte ich den Weg aufzeigen, dem TE einige Erfolgserlebnisse und Verständnis für Datenbanken zu geben und die Vorgehensweise aufzuzeigen. Eben auf Grund der Tatsache, dass der TE alles ganz schön im Borland C++ Designer zusammengeklickt hat, dadurch eine ganze Menge Quellcode automatisch erzeugt hat, aber da sind vielleicht max. 10 Zeilen Quellcode, die er selber beigesteuert hat :confused:

Gruß

Question_mark
 
Hallo!

Zuerst mal hast Du beim Edit1 den falschen Event "OnChange" verwendet. Dadurch wird bei jedem in das Editfeld eingegeben Zeichen schon ein Event ausgelöst und das ist nicht in Deinem Sinne...
Verwende hier lieber "OnExit", dann wird der Event nur einmal beim Verlassen des Feldes ausgelöst.
Eigentlich nicht. Ich wollte den Datensatz immer durchsuchen lassen, wenn eine Eingabe im Edit1 getätigt wurde.
Einen Buttonklick oder einen Mausklick nach der Eingabe möchte ich vermeiden, darum habe ich "OnChange" gewählt.


Beim TQuery1 hast Du den SQL-Text fest verdrahtet. Damit kannst Du das Query nur einmal in Deiner Anwendung sinnvoll nutzen. Weise der Eigenschaft "Query1.SQL" den Text dynamisch zur Laufzeit zu. Dann kannst Du das Query mehrfach nutzen. Etwa so :
Query1.Close;
Query1.SQL.Add('Select * ');
Query1.SQL.Add('FROM sps25 ';
Query1.SQL.Add('ORDER BY 1,3');
(Alternativ geht auch : Query1.SQL := 'SELECT * FROM sps25 ORDER BY 1,3')
Query1.Execute oder Query1.Open (hängt von der Art der SQL Abfrage ab, die Taste F1 hilft Dir weiter.
[...]
Benutze den eingegebenen Text in Edit1 als Suchkriterium in Deinem SQL-Statement. Benutze in Deinem Statement den "LIKE" Operator
Query1.Close etc. hatte ich auch schon ausprobiert, aber der Compiler meckert rum.
Ich bin mir sicher, dass ich diese Anweisungen nur an die falsche Stelle geschrieben habe, aber ich weiß nicht, wo ich diese Querys reinschreiben soll.


Deine Schreibweise der MLFB (z.B. 6ES5-308-UB11) ist etwas ungewöhnlich. Verwende lieber die Siemens Schreibweise 6ES5308-3UB11, sonst bringst Du die Anwender Deines Programms zur Verzweifelung.
Ich möchte das Minuszeichen generell aus der Suche rausnehmen, d.h. das Minuszeichen soll komplett übersehen werden. Ist doch bestimmt möglich soetwas zu realisieren?!

Der Forumaner verwendet jedoch noch Paradox mit der Borland BDE, die von Borland in der nächsten Version nicht mehr unterstützt wird. Insofern war die Wahl von Paradox und BDE als Datenbank nicht sehr glücklich.
Ich verwende Paradox, weil mir diese Datenbank am einfachsten erschien.
Lieber wäre mir eine SQL-Datenbank, aber ich habe keinen Plan, wie ich eine Paradox-Tabelle in eine SQL-Tabelle umwandeln kann.

[...], aber eigentlich habe ich bei Durchsicht des Quellcodes vom Forumaner bemerkt, dass der TE noch nicht besonders viele Zeilen eigenen Quellcode generiert hat und sich da etwas auf Neuland bewegt. Also erstmal wollte ich den Weg aufzeigen, dem TE einige Erfolgserlebnisse und Verständnis für Datenbanken zu geben und die Vorgehensweise aufzuzeigen. Eben auf Grund der Tatsache, dass der TE alles ganz schön im Borland C++ Designer zusammengeklickt hat, dadurch eine ganze Menge Quellcode automatisch erzeugt hat, aber da sind vielleicht max. 10 Zeilen Quellcode, die er selber beigesteuert hat
RICHTIG ERKANNT!
Ich habe vor einigen Tagen in meinen alten Sachen rumgekramt und fand das Buch "C++ für Kids" (bitte nicht lachen)!
Da wurde ich natürlich neugierig und installierte den auf CD mitgelieferten Borland C++ Builder 1 (Vollversion).
Mit Verwunderung stellte ich fest, dass der Builder 1 auch eine komplette Datenbankoberfläche bereit stellt. Im Buch wird keine einziges Wort über Datenbanken verloren.
Aber trotzdem finde ich einige Tipps im Kids-Buch, die ich gebrauchen kann.

Und warum ich das Ganze in C++ machen will... Nun ja, ich drücke neben der Arbeit die Schulbank und dort werde ich auch bald programmieren müssen.
Die Programmier-Sprache ist C, darum wollte ich gleich in C einsteigen. Da kam mir das Buch "C++ für Kids" sehr gelegen.
Der Builder ist richtig gut, weil man alle Elemente schön mit der Maus zusammenklicken kann.
Der Programm-Ablauf ist mir klar, ich weiß auch, wie das Programm arbeiten sollte, aber ich weiß wirklich nicht, wo ich welche Anweisungen definieren und reinschreiben muss.

Ein Grundlagenbuch wäre nicht schlecht, aber ich denke, so eine einfache;) Sache (Datensätze anzeigen, durchsuchen, editieren) könnte man auch ohne ein teures Buch -aber mit externer Hilfe- programmieren?!

Gruß,
Forumaner
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Gib die CD zum Recycling ...

Hallo,

Forumaner schrieb:
installierte den auf CD mitgelieferten Borland C++ Builder 1 (Vollversion).

Dürfte nach meiner Erinnerung ein 16-Bit Compiler aus der zweiten Hälfte der letzten Dekade des letzten Centenarium im letzten Millenium sein :ROFLMAO:

Mal zwei kurze Fragen :

1) Möchtest das Programm zur Ersatzteilverwaltung nur als Projekt zum Erlernen von C++ programmieren ?
2) Oder möchtest Du es im täglichen Betrieb auf der Arbeit produktiv einsetzen ?

War jetzt eher eine Scherzfrage, die Antwort ist mir eigentlich egal. Und gib die CD zum Recycling ....

Du kannst Dir hier kostenlos eine aktuelle Version eines C++ Builders als Turbo C++ herunterladen.

http://www.delphipraxis.net/turbo_delphi_download.php

Den Registrierschlüssel erhältst Du kostenlos von Borland (b.z.w. heute CodeGear).

Suche im angegeben Link nach "turboccp_de.iso.zip". Die einzige Einschränkung der PE (Personal Edition) gegenüber der kostenpflichtigen Vollversion : Man kann keine Fremdkomponenten von anderen Anbietern in die Komponentenpalette einbinden. Aber die Dynamische Einbindung von Fremdkomponenten per Quellcode ist trotzdem möglich.
Damit hast Du erstmal kostenlos, aber legal eine moderne Entwicklungsumgebung und C++ Compiler. Bei Bedarf kannst Du später auf die kostenpflichtige Professional Version hochrüsten.
Und damit Du auch eine vollwertige (aber kostenlose) SQL-Datenbank bekommst, sieh mal hier :

http://www.microsoft.com/downloads/details.aspx?FamilyID=4c6ba9fd-319a-4887-bc75-3b02b5e48a40&DisplayLang=de

Oder google mal nach "Firebird", auch eine kostenlose, aber vollwertige DB, die auch von Turbo C++ unterstützt wird.

Egal ob Du Dein Programm nur zu Lernzwecken oder zum produktiven Einsatz schreibst, schmeiss den alten Sch..s über Bord.

Gruß

Question_mark

PS : Und bitte die Lizenzbedingungen für den kommerziellen Einsatz und die Systemvoraussetzungen unbedingt beachten !
 
Zuletzt bearbeitet:
Hallo.

Dürfte nach meiner Erinnerung ein 16-Bit Compiler aus der zweiten Hälfte der letzten Dekade des letzten Centenarium im letzten Millenium sein :ROFLMAO:
Oh ja, dort sind noch Komponenten für Win3.1 und Win95 enthalten!

1) Möchtest das Programm zur Ersatzteilverwaltung nur als Projekt zum Erlernen von C++ programmieren ?
2) Oder möchtest Du es im täglichen Betrieb auf der Arbeit produktiv einsetzen ?
Wir haben auf der Arbeit einen eigenen Bestand an Reserveteilen.
Diesen Bestand nehmen wir mittels einer Excel-Tabelle auf, aber es macht mehr her, wenn ein Programm mit Datenbank zum Einsatz kommt. ;)
Natürlich möchte ich in erster Linie C++ erlernen! Und ja, das Programm hat anschließend eine wirkliche Verwendung bei uns im Betrieb!

Du kannst Dir hier kostenlos eine aktuelle Version eines C++ Builders als Turbo C++ herunterladen.
http://www.delphipraxis.net/turbo_delphi_download.php
Den Registrierschlüssel erhältst Du kostenlos von Borland (b.z.w. heute CodeGear).
Vielen Dank für den Link. Turbo C++ habe ich mir heruntergeladen und lizensiert. Hat alles bestens geklappt, nur jetzt muss ich mich in eine sehr gewöhnungsbedürftige Oberfläche einarbeiten.
Außerdem muss ich irgendwie die alte *.mak-Datei in ein aktuelles Borland-Projekt umwandeln, damit ich es mit dem Turbo C++ einlesen kann.

Und damit Du auch eine vollwertige (aber kostenlose) SQL-Datenbank bekommst, sieh mal hier :
http://www.microsoft.com/downloads/...fd-319a-4887-bc75-3b02b5e48a40&DisplayLang=de
Oder google mal nach "Firebird", auch eine kostenlose, aber vollwertige DB, die auch von Turbo C++ unterstützt wird.
Hört sich sehr gut an! Ich kann aber nach neuester Erkenntnis keinen SQL-Server oder ähnliches auf unserem Rechner im Büro installieren, Programme ausführen ist kein Problem. Die BDE ist auch installiert, also gäbe es keine Probleme mit der Paradox-Tabelle. Mal sehen, ob der Turbo C++ auch noch die Paradox-Tabelle unterstützt, wenn ja, dann bleibt es erst einmal bei Paradox.

PS : Und bitte die Lizenzbedingungen für den kommerziellen Einsatz und die Systemvoraussetzungen unbedingt beachten !
Von der Delphipraxis-Seite:
Darf ich mit den Turbos kommerziell entwickeln?
Ja, die kommerzielle Entwicklung ist mit den Turbos gestattet.
Ich werde mir nun Turbo C++ genauer ansehen und versuchen mich dort einzuarbeiten.

@Question_mark:
Könntest du mir mehr unter die Arme greifen und mir eine kleine Umsetzung meines Vorhabens anhand meines Programms zeigen?

Gruß,
Forumaner
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Kleines Programm ...

Hallo,

Forumaner schrieb:
Mal sehen, ob der Turbo C++ auch noch die Paradox-Tabelle unterstützt,
Ja, sollte er ... in der Komponentenpalette ist mit Sicherheit ein Eintrag "BDE"

Forumaner schrieb:
wenn ja, dann bleibt es erst einmal bei Paradox.
Deine Entscheidung, und auch Deine Probleme in der Zukunft :ROFLMAO:

Forumaner schrieb:
Könntest du mir mehr unter die Arme greifen und mir eine kleine Umsetzung meines Vorhabens anhand meines Programms zeigen?

Ich habe Dir schon eine Menge Tips und Hinweise gegeben, aber das Programm darfst Du selber schreiben, weil

Forumaner schrieb:
dabei eine kleines Programm in C++ zu schreiben

ist ja eine Kleinigkeit, macht der Proggi so zwischen Frühstück und Mittagessen. :ROFLMAO:

Gruß

Question_mark
 
Hallo,

Forumaner schrieb:
aber es macht mehr her, wenn ein Programm mit Datenbank zum Einsatz kommt.

Daraus mein Umkehrschluss : Du glaubst also, Paradox ist eine Datenbank ??? *ROFL*
Dat iss dä letzte Driss ...
Hast Du noch Win 3.1 als OS installiert :ROFLMAO:


Gruß

Question_mark

PS : Nicht böse sein, aber den konnte ich mir nicht verkneifen ....
 
Tach.

Zitat von Forumaner
wenn ja, dann bleibt es erst einmal bei Paradox.
Deine Entscheidung, und auch Deine Probleme in der Zukunft :ROFLMAO:
Ich hatte doch geschrieben, dass ich auf unserem Büro-Rechner keinen SQL-Server oder sonst irgendwas installieren darf! Programme ausführen geht!
Der PC im Büro läuft im Grunde nur wegen dem elektronischen Schichtenbuch, sonst haben wir nicht viel mit dem PC zu tun!
Soll nicht heißen, dass wir alle keine Ahnung haben, aber wir brauchen für unsere tägliche Arbeit keinen PC (außer bei SPS-Programmierung, aber das wird an einem speziellen PC erledigt und kommt nicht alle Tage vor).

Zitat von Forumaner
Könntest du mir mehr unter die Arme greifen und mir eine kleine Umsetzung meines Vorhabens anhand meines Programms zeigen?
Ich habe Dir schon eine Menge Tips und Hinweise gegeben, aber das Programm darfst Du selber schreiben, weil


Zitat von Forumaner
dabei eine kleines Programm in C++ zu schreiben
ist ja eine Kleinigkeit, macht der Proggi so zwischen Frühstück und Mittagessen. :ROFLMAO:
Ja, für dich vielleicht, für mich als Anfänger aber nicht.
Beim ewigen Probieren vergeht gaaaaaaanz schnell die Zeit!
Und nervig ist es außerdem, weil man keinen richtigen Erfolg hat!
Wenn ich wüsste, wo ich den Code eingeben muss, damit das Programm nach meinen Wünschen funktioniert, würde ich nicht um Hilfe betteln!

Zitat von Forumaner
aber es macht mehr her, wenn ein Programm mit Datenbank zum Einsatz kommt.
Daraus mein Umkehrschluss : Du glaubst also, Paradox ist eine Datenbank ??? *ROFL*
Dat iss dä letzte Driss ...
Hast Du noch Win 3.1 als OS installiert :ROFLMAO:
Na juht, dann kommt eben eine CSV-Datei zum Einsatz! ;)
Und Win 3.1 war VOR meiner Zeit, ich bin bei Win95b mit USB-Unterstützung *hust* eingestiegen!

Gruß,
Forumaner
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ich arbeite schon lange mit Delphi, früher auch mit BDE und Paradox, ohne daß ich jemals große Probleme mit Paradox hatte. Inzwischen bin ich zwar auf eine SQL-DB umgestiegen, aber die TTable-Bausteine sind immer noch drin (weils halt läuft ;)). Für schnelles Sortieren kann man auch für die Felder, nach denen sortiert werden soll jeweils einen eigenen Index anlegen und diesen bei TTable als Indexname angeben, dann ist die Tabelle nach dem Index sortiert. Suche mal in der Delphi-Hilfe nach "Datensatzmenge durch Angabe eines Bereichs begrenzen" (kann im Text variieren, ich habe Delphi7). Auch ein Filtern der Datenmenge ist kein Problem. Allerdings muß ich auch sagen, mit SQL-Statements geht das eleganter und variabler.
 
Wer macht's mir?

Hallo,

ich "ralle" es immer noch nicht! :ROFLMAO:
Zeitlich beschränkt und beruflich eingespannt habe ich momentan keine Möglichkeit mich in eine Hochsprache tiefer einzuarbeiten. :cry:

Kann mir jemand das Programm nach meinen Vorstellungen programmieren?
Den Grundstein habe ich ja schon gelegt.
Wer das macht bekommt ein fettes Dankeschön, oder eben 10 Euro...

Gruß,
Forumaner
 
So nicht, Forumaner ..

Hallo,

Forumaner schrieb:
Den Grundstein habe ich ja schon gelegt.
Fünf Mouseclicks und drei Zeilen Quellcode ...

Forumaner schrieb:
Wer das macht bekommt ein fettes Dankeschön, oder eben 10 Euro...

Den Aufwand für die Erstellung schätze ich auf ca. 40 Std. zu je 70,00 Euro, ohne evtl. Spesen und Nebenkosten. Gibt Dir Dein Bäcker die Brötchen umsonst, nur weil er backen kann und Du nicht *ROFL*
Dann lerne halt Brötchen backen, ich kann nur mein weises Haupt schütteln :ROFLMAO:
Ich denke mal, ich habe Dir wirklich eine ganze Menge konstruktiver Hinweise gegeben, aber das da oben ist wirklich der Gipfel an Dreistigkeit...
Du wirst also nochmal über Dein eigenes Engagement bei der Lösung nachdenken müssen. So geht das nicht ...

Gruß

Question_mark
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich denke mal, ich habe Dir wirklich eine ganze Menge konstruktiver Hinweise gegeben, aber das da oben ist wirklich der Gipfel an Dreistigkeit...
Du wirst also nochmal über Dein eigenes Engagement bei der Lösung nachdenken müssen. So geht das nicht ...

Wieso bin ich dreist? Ich habe eine Frage gestellt, ob das jemand machen kann/möchte.
Hier bekommen sogar Neulinge gleich fertig programmierte SPS-Lösungen, obwohl die noch nicht einmal STEP7 schreiben können (das ist aber auch nicht immer richtig)!
Darum verstehe ich dich nicht, dass du dich von meiner Frage angepisst fühlst!
Naja, Hunde, die bellen, beißen nicht! :ROFLMAO:

Übrigens, danke für die Tipps, aber auch wenn du mir ein Brötchenrezept geben würdest, bekomme ich sicherlich nicht ohne Vorkenntnisse ein perfektes Brötchen...
 
Hallo, ich bin ein Neuling und kann nicht so gut Englisch. Ich habe mir Turbo c++ heruntergeladen und wollte fragen wie man es registriert. Ich würde mich über Antwort freuen.
 
Und außerdem, wie das mit dem installieren funktioniert.
Man muss da irgendeine Datei erstellen... aber wie???

danke vielmals um Antwort...

akktta
 
Zurück
Oben