![]() |
Datenbank: SQL Server • Version: 2000 • Zugriff über: ADO
Mehrere Werte mit Locate suchen
Hallo zusammen,
in meiner Datenbanktabelle habe ich 2 Felder: PosNr - int; Apos - Char; Nun möchte ich zu einem bestimmten Datensatz springen, wobei das PosNummer Feld ein Integer-Wert und das APos Feld ein Char-Wert ist. Die beiden Werte liefert mir eine Funktion zurück, bei der PosNummer.MyPos als Integer und PosNummer.MyApos als Char definiert ist. Leider findet die Locate Funktion diese Werte nicht. Muss ich die zuerst irgendwie umwandeln?
Delphi-Quellcode:
Bitte um Hilfe.
if PosQuery.Locate('POSNR;APOS', VarArrayOf([PosNummer.MyPos, PosNummer.MyApos]), []) then ...
|
Re: Mehrere Werte mit Locate suchen
Stimmt der Wert, den PosNummer.MyApos zurückliefert hundertptozentig mit dem Wert in der Tabelle überein?
|
Re: Mehrere Werte mit Locate suchen
Ja, du hast recht irgendwie gibt mir die Funktion nicht das zurück was ich wollte.
Nur wo liegt der Fehler? In einer Unit namens uMyLib hab ich folgenden Typ deklariert.
Delphi-Quellcode:
... und folgende Funktion
type TMyPosNummer = record
myPOS: Integer; myAPOS: Char; end;
Delphi-Quellcode:
Nun rufe ich die Funktion aus meinem Programm wie folgt auf:
function SplitPosNummer(PosNr: string): TMyPosNummer;
var i: integer; c: Char; s: string; begin s := PosNr; if StrToIntDef(RightStr(s, 1), 99) = 99 then begin // Letztes Zeichen ist ein Buchstabe c := RightStr(s, 1)[1]; i := strtoint(LeftStr(s, length(s) - 1)); end else begin i := strtoint(s); c := #13; // Default Result.myPOS := i; Result.myAPOS := c; end; end; (unit uMyLib mit uses eingebunden)
Delphi-Quellcode:
procedure TfmPositionen.aEinfuegenExecute(Sender: TObject);
var NeuePosNummer: string; PosNummer : TMyPosNummer; begin if InputQuery('Bitte Positionsnummer eingeben', '', NeuePosNummer) then begin SplitPosNummer(NeuePosNummer); if DM1.PosQuery.Locate('POSNR;APOS', VarArrayOf([PosNummer.MyPos, PosNummer.MyApos]), []) then ... end; |
Re: Mehrere Werte mit Locate suchen
Was wird den zurückgeliefert?
|
Re: Mehrere Werte mit Locate suchen
Guten Morgen,
wenn das letzte Zeichen im übergebenen String kein Buchstabe ist, dann liefert die Funktion SplitPosNummer() was gerade so im Hauptspeicher steht... Grüße vom marabu |
Re: Mehrere Werte mit Locate suchen
Ja ! Ich hab auch die Funktion IsValidPos von Dir in abgewandelter Form eingebaut.
Hab sie nur der Übersichtlichkeit halber hier weggelassen!
Delphi-Quellcode:
function IsValidPos(s: string): Boolean;
var number, index: Integer; begin Val(s, number, index); Result := (index = 0) or (s = '') or ((index > 1) and (s[index] in ['a'..'z']) and (index = Length(s))); end;
Delphi-Quellcode:
Muss ich nun im implementation Abschnitt schreiben
procedure TfmPositionen.aEinfuegenExecute(Sender: TObject);
var NeuePosNummer: string; PosNummer : TMyPosNummer; // ist das falsch oder muss ich das im implementation Abschnitt angeben ???????????????? begin if InputQuery('Bitte Positionsnummer eingeben', '', NeuePosNummer) and IsValidPos(NeuePosNummer) then begin SplitPosNummer(NeuePosNummer); if DM1.PosQuery.Locate('POSNR;APOS', VarArrayOf([PosNummer.MyPos, PosNummer.MyApos]), []) then ... end;
Delphi-Quellcode:
oder reicht das auch in der aufrufenden 'procedure' ?
var PosNummer : TMyPosNummer;
Beim Fall a bekomm ich dann den Wert 0 für c und für a nichts. Beim Fall b bekomm ich irgendeinen Speicherwert. mir ist auch noch aufgefallen - es fehlt in der Funktion auch noch
Delphi-Quellcode:
im oberen Abschnitt.
Result.myPOS := i;
Result.myAPOS := c; Es liegt also irgendwie an meiner Übergabe der Variablen bzw. der Rückgabe. Bitte helft mir schnell vom Eis. Danke. |
Re: Mehrere Werte mit Locate suchen
Es wird ja nur ein Ergebnis zurückgegeben, wenn das letzte Zeichen kein Buchstabe ist. Die Zuweisung des Ergebnises (Result.) muß außerhalb des else-Zweiges erfolgen.
|
Re: Mehrere Werte mit Locate suchen
Nein, es soll ja in jedem Fall ein Ergebnis zurückgegeben werden.
d.h. falls das letzte Zeichen ein Buchstabe ist soll Result.myPos die Zahl enthalten und Result.myAPos den Buchstaben. Wenn kein Buchstabe vorhanden ist dann soll Result.myApos nichts enthalten.
Delphi-Quellcode:
Die Befehle
function SplitPosNummer(PosNr: string): TMyPosNummer;
var i: integer; c: Char; s: string; begin s := PosNr; if StrToIntDef(RightStr(s, 1), 99) = 99 then begin // Letztes Zeichen ist ein Buchstabe c := RightStr(s, 1)[1]; i := strtoint(LeftStr(s, length(s) - 1)); Result.myPOS := i; Result.myAPOS := c; end else begin i := strtoint(s); c := #13; // Default Result.myPOS := i; Result.myAPOS := c; end; end;
Delphi-Quellcode:
hab ich nur vergessen gehabt wie in der vorherigen Antwort beschrieben.
Result.myPOS := i;
Result.myAPOS := c; |
Re: Mehrere Werte mit Locate suchen
Versuch mal:
Delphi-Quellcode:
procedure SplitPosNummer(PosNr: string; var mypos: TMyPosNummer);
var i: integer; c: Char; s: string; begin s := PosNr; if (s[Length(s)] in 'a..z') or (s[Length(s)] in 'A..Z') then begin // Letztes Zeichen ist ein Buchstabe c := s[Length(s)]; i := strtoint(LeftStr(s, length(s) - 1)); end else begin i := strtoint(s); c := #13; // Default end; mypos.myPOS := i; mypos.myAPOS := c; end; |
Re: Mehrere Werte mit Locate suchen
OK, wie sieht denn dann der Aufruf aus meinem Programm aus?
Ich möchte diese Funktion/Prozedur auslagern, da ich diese von mehreren Stellen aufrufen möchte. Ich muss doch dann noch TMyPosNummer an SplitPosNummer übergeben
Delphi-Quellcode:
Übrigens hab ich nur Kleinbuchstaben und die eckigen Klammern hab ich wie folgt ergänzt.
procedure TForm1.Button1Click(Sender: TObject);
begin SplitPosNummer(Edit1.Text); //???????????? ShowMessage('PosNummer= '+IntToStr(PosNummer.myPOS)+', APos= '+PosNummer.myAPOS); end;
Delphi-Quellcode:
procedure SplitPosNummer(PosNr: string; var mypos: TMyPosNummer);
var i: integer; c: Char; s: string; begin s := PosNr; if (s[Length(s)] in ['a'..'z']) then begin // Letztes Zeichen ist ein Buchstabe c := s[Length(s)]; i := strtoint(LeftStr(s, length(s) - 1)); end else begin i := strtoint(s); c := #13; // Default end; mypos.myPOS := i; mypos.myAPOS := c; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz