Autor Beitrag
papafishbone
Hält's aus hier
Beiträge: 8

Windows XP
Delphi 3 Prof
BeitragVerfasst: Mi 12.05.04 19:21 
Hallo ich bin es noch einmal.
Bin Neuling und habe dameine Probleme mit der Abfrage
Ich arbeite mit dBase 5.0 und habe das Feld Indexiert :lol:

procedure TForm1.Suchen1Click(Sender: TObject);
var Ringnummer: String;
begin
Ringnúmmer := ' ' ;
If InputQuery('Suche nach der Ringnummer', 'Ringnummer:'Ringnummer)
then
begin
Table1.SetKey;
Table1.FieldByName('Ringnr').ASString:= Ringnummer;
if not Table1.GoToKey then
MessageDlg('Ringnummer nicht vorhanden !', mtInformation,
[mbOK], 0);
end
end;

Nun meine Frage : Das gesuchte Feld in der Datenbank ist ein Zeichenfeld , was ich wie folgt in der EditMask : 99\999\99999 vorgegeben habe . Nun möchte ich aber nur die letzten 5 Zeichen in der InputQuery eingeben und nicht alle Zahlen incl. "\". Wer kann mir dabei helfen eine Lösung fürdieses Problem zu finden . Wäre wirklich sehr dankbar , da mir bereits der Kopf qualmt als NeulingSuche in der Delphi-PRAXiS SUCHE IN: DELPHI-FORUM, DELPHI-LIBRARY :?: .

_________________
Alter schützt nicht vor Torheit, doch man möchte mit seinen Kindern mithalten. Wer rastet der rostet. Danke für jegliche geleistete Hilfe im voraus
atarigold
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 84

WIN XP, Linux 2.4
D7, Delphi 2006 Prof
BeitragVerfasst: Fr 14.05.04 17:42 
Das kann so nicht funktionieren. Wenn du mit dem Index arbeitest, muß der der Funktion
Table1.FieldByName('Ringnr').ASString der komplette Inhalt übergeben werden. Wildcards sind nicht vorgesehen.

Bei der table-Komponente kannst du zwar Wildcards (*) bei der Funktion filter angeben, also z. B.

table1.filter:='Ringnr=+quotedstr('99*');
table1.filtered;

sucht alle Einträge die mit der Zeichenfolge 99 beginnen.
Die Wildcard kann (soweit mir bekannt) aber nicht zu Beginn eines Zeichenstrings gesetzt werden.

Für ein Schlüsselfeld ein Char oder Varchar zu verwenden ist i. A. ziemlich ungünstig, aber du wirst vermutlich deine Gründe haben.Wenn du für die Suche aber sowieso immer die ersten 5 Buchstaben weglässt, bringt der Index auch wenig, da alphanumerisch von links nach rechts sortiert wird.

Aber es gibt natürlich eine Möglichkeit die ersten Zeichen für eine Suche wegzulassen, indem du statt ttable die Komponente tquery verwendest. Der entsprechende SQL-String würde dann lauten:

SELECT * FROM <dein_tabellenname> WHERE ringnr LIKE '_______XXXXX' (Anmerkung: _ = 1 beliebiges Zeichen)

oder

SELECT * FROM <dein_tabellenname> WHERE ringnr LIKE '%XXXXX' (Anmerkung: % = beliebig viele Zeichen)


XXXXX = die ausgewählte Ringnummer einsetzen
papafishbone Threadstarter
Hält's aus hier
Beiträge: 8

Windows XP
Delphi 3 Prof
BeitragVerfasst: Fr 14.05.04 17:59 
Hallo Atarigold,
Schönen Dank für Deine Antwort :lol:
Habe mich als Laie wohl verkehrt ausgedrückt. Die EditMaske "99\999\99999" sagt folgendes aus "Zuchtjahr\Ringnummer\Züchternummer" (04\001\00153)
Über die InputQuery möchte ich z.B. lle Vögel abrufen , die ich von dem Züchter mit der Nummer (z.B. 00153 ) erworben habe . :D
Vielleicht findest Du dafür eine Lösung für mich , habe wirklich bald keinen Durchblick mehr , soviele Bücher schon gelesen

_________________
Alter schützt nicht vor Torheit, doch man möchte mit seinen Kindern mithalten. Wer rastet der rostet. Danke für jegliche geleistete Hilfe im voraus
atarigold
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 84

WIN XP, Linux 2.4
D7, Delphi 2006 Prof
BeitragVerfasst: Fr 14.05.04 23:54 
Ein paar Nachfragen:
Mit EditMaske meinst du sicherlich die Delphi-Funktion tfield.editmask ?
Datenbankverbindung über die BDE ?
Wie werden "Zuchtjahr\Ringnummer\Züchternummer" in der Datenbank gespeichert ? Steht das alles in eine Spalte (Attribut) und welcher Typ ist dafür angegeben (Alphanumerisch z. B. char oder Integer) ?
Dann ist evtl. in der SQL-Anweisung eine Typumwandlung (CAST) nötig.

Gruß atarigold
papafishbone Threadstarter
Hält's aus hier
Beiträge: 8

Windows XP
Delphi 3 Prof
BeitragVerfasst: Sa 15.05.04 10:33 
Hallo atarigold,
die Editmask habe ich über den Inspektor für das betreffende Feld "DBFeld" eingegeben . Das Feld wird so "04\001\00153" in der dBase Datenbank gespeichert und ist als Zeichenfeld eingerichtet. :?:

_________________
Alter schützt nicht vor Torheit, doch man möchte mit seinen Kindern mithalten. Wer rastet der rostet. Danke für jegliche geleistete Hilfe im voraus
atarigold
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 84

WIN XP, Linux 2.4
D7, Delphi 2006 Prof
BeitragVerfasst: Sa 15.05.04 13:31 
Hallo papafishbone,

dann ist meine erste Antwort eigentlich schon zutreffend. Ich versuchs mal etwas ausführlicher.
Du hast also 3 Werte (Zuchtjahr\Ringnummer\Züchternummer) in ein Attribut Typ char gepackt. Das
ist datenbanktechnisch alles andere als optimal. Aber zumindest besteht der String immer aus 12 Zeichen (oder ?).

Mit ttable fällt mir zwar spontan keine Möglichkeit ein, dein Problem zu lösen.
Aber, wenn du das Attribut so beibehalten willst und nach Teilstrings suchen möchtest, gibts eine einfache MÖglichkeit indem du ttable durch tquery ersetzt.

In der Komponente tquery fügt du unter Eingeschaften - SQL ein:
SELECT * from <tablename> // <tablename> durch den Namen deiner Tabelle <nummer> durch den Namen der Spalte
//deiner Kombi-Nr ersetzen.
// Diese SQL-Anweisung zeigt alle Datensätze der Tabelle an


Deinen Code für InputQuery schreibst du dann etwas um, z. B. für die Ringnummer (3stellig):


If InputQuery('Suche nach der Ringnummer', 'Ringnummer:',Ringnummer)
then
begin
Tquery1.close; //Query schließen alternativ tquery.active:=false;
tquery1.sql.clear; //SQL String löschen
Ringnummer:='__\'+Ringnummer+'\_____'; //2 beliebige Zeichen am Anfang, 5 beliebige Zeichen am Ende des Strings
tquery1.sql.add ('Select * from <tablename> where <nummer> Like '+quotedstr(ringnummer); //SQL String neu schreiben
tquery1.open;
....


Wenn du nach der Züchternummer sollte Ringnummer (ich verwende hier mal den gleichen Namen) wie folgt zusammengesetzt werden:
Ringnummer:='__\___\+Ringnummer;

Wenn du wieder alle Datensätze angezeigt haben möchtest fügst du die SQL-Anweisung von oben wieder ein.

Hoffe es hilft ein wenig mehr weiter.
papafishbone Threadstarter
Hält's aus hier
Beiträge: 8

Windows XP
Delphi 3 Prof
BeitragVerfasst: Sa 15.05.04 18:05 
Hallo atarigold,
schönen Dank für diese ausführliche Erläuterung meines Problems
Werde es so versuchen wie Du es mir geschrieben hast . Werde mich eventuell am Dienstag noch einmal melden ob positiv oder negativ. :wink:
Nochmals Danke an Dich , wäre sonst wohl verzweifelt , muß leider auf die Bahn und bin erst Dienstag zurück. :!:

_________________
Alter schützt nicht vor Torheit, doch man möchte mit seinen Kindern mithalten. Wer rastet der rostet. Danke für jegliche geleistete Hilfe im voraus