Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Mehrere Werte mit Locate suchen (https://www.delphipraxis.net/87246-mehrere-werte-mit-locate-suchen.html)

needatip 25. Feb 2007 21:07

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:
if PosQuery.Locate('POSNR;APOS', VarArrayOf([PosNummer.MyPos, PosNummer.MyApos]), []) then ...
Bitte um Hilfe.

mkinzler 25. Feb 2007 21:11

Re: Mehrere Werte mit Locate suchen
 
Stimmt der Wert, den PosNummer.MyApos zurückliefert hundertptozentig mit dem Wert in der Tabelle überein?

needatip 26. Feb 2007 07:55

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:
type TMyPosNummer = record
    myPOS: Integer;
    myAPOS: Char;
  end;
... und folgende Funktion
Delphi-Quellcode:
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;
Nun rufe ich die Funktion aus meinem Programm wie folgt auf:
(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;

mkinzler 26. Feb 2007 08:01

Re: Mehrere Werte mit Locate suchen
 
Was wird den zurückgeliefert?

marabu 26. Feb 2007 08:16

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

needatip 26. Feb 2007 10:42

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:
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;
Muss ich nun im implementation Abschnitt schreiben
Delphi-Quellcode:
var PosNummer : TMyPosNummer;
oder reicht das auch in der aufrufenden 'procedure' ?
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:
    Result.myPOS := i;
    Result.myAPOS := c;
im oberen Abschnitt.

Es liegt also irgendwie an meiner Übergabe der Variablen bzw. der Rückgabe.
Bitte helft mir schnell vom Eis. Danke.

mkinzler 26. Feb 2007 10:47

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.

needatip 26. Feb 2007 11:09

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:
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;
Die Befehle
Delphi-Quellcode:
Result.myPOS := i;
Result.myAPOS := c;
hab ich nur vergessen gehabt wie in der vorherigen Antwort beschrieben.

mkinzler 26. Feb 2007 11:18

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;

needatip 26. Feb 2007 12:53

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:
procedure TForm1.Button1Click(Sender: TObject);
begin
  SplitPosNummer(Edit1.Text); //????????????
  ShowMessage('PosNummer= '+IntToStr(PosNummer.myPOS)+', APos= '+PosNummer.myAPOS);
end;
Übrigens hab ich nur Kleinbuchstaben und die eckigen Klammern hab ich wie folgt ergänzt.
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.
Seite 1 von 2  1 2      

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