Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Einen gecasteten String mit Zeichen auffüllen in einer SQL Anweisung (https://www.delphipraxis.net/173672-einen-gecasteten-string-mit-zeichen-auffuellen-einer-sql-anweisung.html)

RWarnecke 10. Mär 2013 08:00

Datenbank: Absolute Database • Version: 6.2.0 • Zugriff über: ComponentAce

Einen gecasteten String mit Zeichen auffüllen in einer SQL Anweisung
 
Hallo zusammen,

in einem Programm von einem Kunden benutze ich DB-Komponenten. Genauer gesagt habe ich das Problem bei einer TAdvDBLookupCombobox. Hier wird für die Listsource eine Query ausgeführt und der Inhalt als Auswahl in der TAdvDBLookupCombobox angezeigt. Das funktioniert auch soweit sehr gut. Jetzt zum eigentlichen Problem, ich habe in der Query ein Integer-Feld welches ich mit dem Befehl cast zu einem String mache.
Code:
  cast(facility.AiCode as String)
Bisher wurden immer nur 4-stellige Zahlen in der Spalte eingetragen. Nun sollen in der gleichen Spalte auch 1 - 3 stellige Zahlen stehen können und diese sollen dann entsprechend vorne mit Nullen aufgefüllt werden, wenn die Query für die Listsource in der TAdvDBLookupCombobox ausgeführt wird. Ein Beispiel, wenn in der DB-Tabelle eine 5 steht, dann soll bei dem obenstehenden CAST-Befehl 0005 herauskommen.

Gibt es hier einen SQL-Befehl, der mir so eine Ausgabe ermöglicht oder muss ich die Komponente TAdvDBLookupCombobox durch eine normale Combobox ersetzen und die Formatierung der Zahl im Quelltext vornehmen ?

mkinzler 10. Mär 2013 08:04

AW: Einen gecasteten String mit Zeichen auffüllen in einer SQL Anweisung
 
Warum wird auf String gecastet?

RWarnecke 10. Mär 2013 08:07

AW: Einen gecasteten String mit Zeichen auffüllen in einer SQL Anweisung
 
Wenn ich die TAdvDBLookupCombobox richtig verstanden habe, kann ich in der Auswahl nur Strings anzeigen lassen. Also muss ich doch ein Integer zu einem String casten.

Edit:
Hier mal die komplette SQL-Anweisung, vielleicht hilft es ja zum besseren Verständnis für mein Problem.
Code:
select facility.*,
       province.AaLong as AaProvinceLong,
       province.AaShort as AaProvinceShort,
       province.AaCenter as AaProvinceCenter,
       district.AaName as AaDistrictName,
       country.AaLong as AaCountryLong,
       country.AaShort as AaCountryShort,
       facility_type.AaShort as AaFacilityTypeShort,
       facility_type.AaLong as AaFacilityTypeLong,
       (AaProvinceShort + AaFacilityTypeShort + cast(facility.AiCode as String)) as AaCode
   from (facility
         LEFT JOIN province
         ON facility.AiProvince = province.SiProvince
         LEFT JOIN district
         ON facility.AiDistrict = district.SiDistrict
         LEFT JOIN country
         ON facility.AiCountry = country.SiCountry
         LEFT JOIN facility_type
         ON facility.AiFacilitytype = facility_type.SiFacilitytype
         )
   order by AaCode ASC;
Es geht dabei um den AiCode. Dieser soll immer vierstellig angezeigt werden.

Furtbichler 10. Mär 2013 08:37

AW: Einen gecasteten String mit Zeichen auffüllen in einer SQL Anweisung
 
Also ich würde das über die Eigenschaft 'DisplayFormat' des persistenten Integer-Feldes des TDataset steuern.

Grundsätzlich sollten Daten aus dem SQL-Server so unverändert wie möglich eingelesen werden. Die Interpretation, d.h. die Darstellung erfolgt im Client.

Und nebenbei: Mir wäre es neu, wenn ein DB-Steuerelement einen expliziten Datentyp verlangt (Checkbox/Radiobutton mal ausgenommen), denn dem Steuerelement sollte es genügen, die Anzeige über die DisplayText-Eigenschaft des Feldes abzuwickeln. Und dann ist es egal, um was für einen Datentyp es sich handelt.

mkinzler 10. Mär 2013 08:43

AW: Einen gecasteten String mit Zeichen auffüllen in einer SQL Anweisung
 
Zitat:

Wenn ich die TAdvDBLookupCombobox richtig verstanden habe, kann ich in der Auswahl nur Strings anzeigen lassen. Also muss ich doch ein Integer zu einem String casten.
Dann würde ich eine andere Komponente nehmen. Alle die ich kenne, können andere Felder als String anzeige,

Aber du willst ja nicht das eine Feld sondern ein verkettetes Feld ausgeben. Ich würde diese getrennt Abfragen und im Programm zur Anzeige Verketten, über einen Format-Befehl kannst du so auch mit Nullen auffüllen

Furtbichler 10. Mär 2013 08:45

AW: Einen gecasteten String mit Zeichen auffüllen in einer SQL Anweisung
 
Zitat:

Zitat von mkinzler (Beitrag 1206704)
Zitat:

Wenn ich die TAdvDBLookupCombobox richtig verstanden habe, kann ich in der Auswahl nur Strings anzeigen lassen. Also muss ich doch ein Integer zu einem String casten.
Dann würde ich eine andere Komponente nehmen. Alle die ich kenne, können andere Felder als String anzeige,

Und ich würde mal sagen, das da was falsch verstanden wurde. So eine Komponente, von TMS, und dann nur Strings? Im Leben nicht.

p80286 10. Mär 2013 10:42

AW: Einen gecasteten String mit Zeichen auffüllen in einer SQL Anweisung
 
Ich kenne Absolutedatabase nicht aber vielleicht gibt es da so etwas wie
Code:
to_char(wert,'00009')
da sollte dann 5 zu 00005 werden

Gruß
K-H

RWarnecke 10. Mär 2013 12:09

AW: Einen gecasteten String mit Zeichen auffüllen in einer SQL Anweisung
 
Hallo zusammen,

danke erstmal für die vielen Antworten. Ich habe jetzt eine für mich akzeptable Lösung gefunden. Vielleicht ein bisschen umständlich, aber sie funktioniert.
Code:
select facility.*,
       province.AaLong as AaProvinceLong,
       province.AaShort as AaProvinceShort,
       province.AaCenter as AaProvinceCenter,
       district.AaName as AaDistrictName,
       country.AaLong as AaCountryLong,
       country.AaShort as AaCountryShort,
       facility_type.AaShort as AaFacilityTypeShort,
       facility_type.AaLong as AaFacilityTypeLong,
       (AaProvinceShort + AaFacilityTypeShort + substring("000" + cast(facility.AiCode as string), Length("000" + cast(facility.AiCode as string)) - 3, Length("000" + cast(facility.AiCode as string)))) as AaCode  
   from (facility                                                                                                                                                                              
         LEFT JOIN province
         ON facility.AiProvince = province.SiProvince
         LEFT JOIN district
         ON facility.AiDistrict = district.SiDistrict
         LEFT JOIN country
         ON facility.AiCountry = country.SiCountry
         LEFT JOIN facility_type
         ON facility.AiFacilitytype = facility_type.SiFacilitytype
         )                        
   order by AaCode ASC;
Ich bin aber für weitere Vorschläge offen, wie man es komplett über SQL lösen kann.

HeZa 10. Mär 2013 13:26

AW: Einen gecasteten String mit Zeichen auffüllen in einer SQL Anweisung
 
Zitat:

Zitat von RWarnecke (Beitrag 1206700)
Es geht dabei um den AiCode. Dieser soll immer vierstellig angezeigt werden.

Schau dir mal LPAD an:
http://www.techonthenet.com/oracle/functions/lpad.php

In anderen SQL-Sprachen heißt es auch schon mal PADL:
http://devzone.advantagedatabase.com...xpeng/padl.htm

Und wenn das funktioniert, kannst du mal probieren den CAST wegzulassen (sollte automatisch konvertiert werden).

OK, gerade erst gesehen das du Absolute Database verwendest. Da wirst du wohl bei deiner Lösung bleiben müssen

Zitat:

Zitat von RWarnecke (Beitrag 1206718)
Ich bin aber für weitere Vorschläge offen, wie man es komplett über SQL lösen kann.

Deine Lösung ist Komplett in SQL :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:59 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