AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Mehrere Werte mit Locate suchen
Thema durchsuchen
Ansicht
Themen-Optionen

Mehrere Werte mit Locate suchen

Ein Thema von needatip · begonnen am 25. Feb 2007 · letzter Beitrag vom 28. Feb 2007
Antwort Antwort
Seite 1 von 2  1 2      
needatip

Registriert seit: 11. Jan 2004
246 Beiträge
 
Delphi 10.4 Sydney
 
#1

Mehrere Werte mit Locate suchen

  Alt 25. Feb 2007, 21:07
Datenbank: SQL Server • Version: 2000 • Zugriff über: ADO
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?

if PosQuery.Locate('POSNR;APOS', VarArrayOf([PosNummer.MyPos, PosNummer.MyApos]), []) then ... Bitte um Hilfe.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Mehrere Werte mit Locate suchen

  Alt 25. Feb 2007, 21:11
Stimmt der Wert, den PosNummer.MyApos zurückliefert hundertptozentig mit dem Wert in der Tabelle überein?
Markus Kinzler
  Mit Zitat antworten Zitat
needatip

Registriert seit: 11. Jan 2004
246 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Mehrere Werte mit Locate suchen

  Alt 26. Feb 2007, 07:55
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;
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Mehrere Werte mit Locate suchen

  Alt 26. Feb 2007, 08:01
Was wird den zurückgeliefert?
Markus Kinzler
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Mehrere Werte mit Locate suchen

  Alt 26. Feb 2007, 08:16
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
  Mit Zitat antworten Zitat
needatip

Registriert seit: 11. Jan 2004
246 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Mehrere Werte mit Locate suchen

  Alt 26. Feb 2007, 10:42
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
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Mehrere Werte mit Locate suchen

  Alt 26. Feb 2007, 10:47
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.
Markus Kinzler
  Mit Zitat antworten Zitat
needatip

Registriert seit: 11. Jan 2004
246 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Mehrere Werte mit Locate suchen

  Alt 26. Feb 2007, 11:09
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Mehrere Werte mit Locate suchen

  Alt 26. Feb 2007, 11:18
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;
Markus Kinzler
  Mit Zitat antworten Zitat
needatip

Registriert seit: 11. Jan 2004
246 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: Mehrere Werte mit Locate suchen

  Alt 26. Feb 2007, 12:53
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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz