AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Firebird: Charfeld mit Inhalten nummerisch sortieren

Firebird: Charfeld mit Inhalten nummerisch sortieren

Ein Thema von mschaefer · begonnen am 8. Jan 2005 · letzter Beitrag vom 9. Jan 2005
Antwort Antwort
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.032 Beiträge
 
Delphi 12 Athens
 
#1

Firebird: Charfeld mit Inhalten nummerisch sortieren

  Alt 8. Jan 2005, 20:30
Moin, moin,

ja mein Wochenendproblem lauert noch: Habe ein Char-Feld in einer Firebird-Tabelle.
Das Feld enthält je nach Datensatz ein Wort oder eine Zahl oder eben nichts (Null).
Jetzt würde ich meine Tabellle gerne so sortieren, dass alle Datensätzen mit Zahlen
nummerisch aufsteigend sortiert sind, dann die Datensätze mit den Wörtern kommen
und anschließend die ohne Eintrag. Bin mir aber über den Weg nicht im Klaren, da
ein einfaches Cast hier wohl kläglich versagt....

Grüße // Martin


PS: bekommt man sowas noch mit einer Stored Procedure hin,
oder muß man hier gleich an die UDF´s gehen ?
Martin Schaefer
  Mit Zitat antworten Zitat
Benutzerbild von CenBells
CenBells

Registriert seit: 30. Mär 2003
Ort: Kiel urspr. Lübeck
176 Beiträge
 
Delphi 7 Professional
 
#2

Re: Firebird: Charfeld mit Inhalten nummerisch sortieren

  Alt 8. Jan 2005, 22:46
hi,
ich bin mir, sagen wir zu 80 %, sicher, daß Du dafür UDFs bemühen musst.

Dabei fällt mir aber ein, was passiert denn, wenn Du mit den Order By optionen ASCENDING und DESCENDING spielst?
Eigentlich müsste doch eine der Reihenfolgen das liefern, was du willst, oder nicht?


Gruß
Ken
Ein Objekt ist eine zur Ausführungszeit vorhandene für seine Instanzvariablen Speicherplatz allokierende Instanz, die sich gemäß dem Protokoll ihrer Klasse verhält.
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.032 Beiträge
 
Delphi 12 Athens
 
#3

Re: Firebird: Charfeld mit Inhalten nummerisch sortieren

  Alt 8. Jan 2005, 22:59
Hi CenBells,

ja ich habe es noch nicht, aber ascending descending ist nicht das eigentliche Problem.
Wenn man ein Charfeld hat, dann sortiert er nach Zeichen vom ersten Zeichen an, dann das
nächst e, bis zum letzten.
Somit werden Zahlen nicht in ihrer Wertmäßigen Reihenfolge dargestellt
( 2000 würde vor 5 sortiert, da zwei kleiner fünf und dann schaut er erst auf die Nullen).

Hoffe ja irgendwie, dass doch eine SP da reicht, aber das wird wohl noch knifflig...

Viele Grüße // Martin
Martin Schaefer
  Mit Zitat antworten Zitat
Benutzerbild von CenBells
CenBells

Registriert seit: 30. Mär 2003
Ort: Kiel urspr. Lübeck
176 Beiträge
 
Delphi 7 Professional
 
#4

Re: Firebird: Charfeld mit Inhalten nummerisch sortieren

  Alt 8. Jan 2005, 23:25
Hi,

ja, das mit der sortierung von 2000 vor 5 ist natülich ein problem.
Also zu einer SP fällt mir folgendes ein,

selectiere zuerst alle Datensätze, die keine Buchstaben haben.
Dann alle, die nur zahlen enthalten und zum schluss die mit der Null.

Leider habe ich auch keine ahnung, ob man einfach ein
SQL-Code:
where ((not 'ain Feld)
  and (not 'bin Feld)....
machen kann. Und davon abgesehen ist das höllisch unperfomant.
Also wohl doch lieber eine UDF..

Viel Erfolg.

Gruß
Ken
Ein Objekt ist eine zur Ausführungszeit vorhandene für seine Instanzvariablen Speicherplatz allokierende Instanz, die sich gemäß dem Protokoll ihrer Klasse verhält.
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.032 Beiträge
 
Delphi 12 Athens
 
#5

Re: Firebird: Charfeld mit Inhalten nummerisch sortieren

  Alt 9. Jan 2005, 11:43
Moin,

also aktuell mal meinen Frühstücksplanungsstand. Derzeit plane ich eine Mini-UDF die
die als Resultat einen INTEGER-Wert herausrückt. Die erste Ziffer dieser Zahl ergibt sich:

1 für Zahl
2 für Wort
3 für Nichts

Die folgenden Ziffern werden berechnet:

Für Zahlenwerte wird gerechnet über die Ziffern von hinten nach vorne.
Beispiel: String "234"
Ergebnis = 4*10^0 + 3*10^1+2*10^2

Für Buchstaben werden einfach die Ascii-Werte genommen ebenfalls von hinten nach vorne
Beispiel: String "abc"
Ergebnis := 99 * 10^0 + 98*10^1+97*10^2


Nennen wir die UDF mal HARDCAST dann könnte die Abfrage in etwa foldend aussehen

SELECT MyField FROM MyTable ORDER BY HARDCAST(MyField)

wobei die Abfrage ein Numerisches Feld als Ergebnis liefert.


Soweit zum aktuellen Stand...

Grüße // Martin
Martin Schaefer
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Firebird: Charfeld mit Inhalten nummerisch sortieren

  Alt 9. Jan 2005, 12:03
Also wenn ich jetzt ne Funktion hätte, die mir true oder false liefert, ob ein Wert in eine Zahl umgewandelt werden kann, dann hätt ich ne Lösung für dich. Ich suche aber nach dieser passenden Funktion. Das Umwandeln selbst ist kein Problem, sofern es sich üm eine Zahlenfolge handelt.
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.032 Beiträge
 
Delphi 12 Athens
 
#7

Re: Firebird: Charfeld mit Inhalten nummerisch sortieren

  Alt 9. Jan 2005, 13:43
Moin Tom,

Danke schonmal. Sonntags geht das alles etwas langsamer. Aber hier kommen erstmal die
Rohprozeduren für die IsNumber UDF. Die Codiere ich nachher. Hier kommen erstmal die
Internen Routinen dafür.Eigentlich denke ich, dass eine numerische Sortierung auf Char
Felder auch für andere noch von Interesse sein kann.


Delphi-Quellcode:
      { Test on Integer value               }
      Function TBasis_String.IsInteger
            ( Param : String )
                                    : Boolean;
      var
         ErrCode   : integer;
         dummy      : Extended;
      begin
         Result := False;
         val(CommaToPoint(Param),dummy,ErrCode);
         If ( ErrCode = 0 )
         and ( dummy = round(dummy) ) then Result := True;
      End;

Delphi-Quellcode:
      { Test on Float value                }
      Function IsFloat
            ( Param : String )
                                    : Boolean;
      var
         ErrCode   : integer;
         dummy      : Extended;
      begin
         Result := False;
         Param := Trim(Param);
         val(Param,dummy,ErrCode);
         If ErrCode = 0 then Result := True;
      End;

@JTom: Ok, die IsFloat-Funktion dürfte dass sein, was Du meinst...

Grüße // Martin
Martin Schaefer
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Firebird: Charfeld mit Inhalten nummerisch sortieren

  Alt 9. Jan 2005, 13:57
Folgender SQL Befehl liefert dir ein Char-Feld, aber sortiert nach der enthaltenen Zahl:
SQL-Code:
select Cast(Feld as int) as Zahl
order by 1
Das Problem ist, das funktioniert nur, solange die Umwandlung von Char nach int auch funktionniert. Steht ein alphanumerisches Zeichen drin, kommt ein Fehler. Wenn ich jetzt aber über einen where-Teil angeben könnt, es sollen nur die Zeilen berücksichtigt werden, wo auch ein int in der Spalte steht, würd die Query klappen... Also sowas in der Art:

SQL-Code:
select Cast(Feld as int) as Zahl
where IstInteger(Feld)=true
order by 1
Damit würdest du alle Datensätze berücksichtigen, welche einen Integer im Feld stehen haben...

Über Union kannst du dir ähnlich die alphanumerischen Felder holen und die mit Inhalt NULL.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 04:08 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