Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi nullen ersetzen in sql abfrage (https://www.delphipraxis.net/37771-nullen-ersetzen-sql-abfrage.html)

stonimahoni 10. Jan 2005 10:59


nullen ersetzen in sql abfrage
 
hi leute

ich hab mal wieder ein kleines prob und bin heut nicht so auf der höhe daher folgende frage :

ich habe mir einen union select gebastelt und da ist ja voraussetzung, dass in jedem select die gleiche anzahl der felder vorkommt. daher musste ich mir auch "platzhalter" anlegen.
die platzhalter geben mir eine "0" aus. die eigentlichen felder sind jedoch datumsfelder.
jetzt das problem : wenn ich den select durchführe und die daten in mein db grid einfliessen und anzeigen lassen möchte kommt ein fehler und zwar , dass er ein datum erwartet aber einen widestring findet . ich denk mal das hängt mit den nullen zusammen.
wie kann ich das umgehen oder abändern, dass statt den nullen einfach leere felder an den stellen dann jeweils angezeigt werden ?!

thx 4 help

mfg

stoni

rochus 10. Jan 2005 11:07

Re: nullen ersetzen in sql abfrage
 
probier mal die methoden "OnGetText". Weiß nicht genau, ob dir das hilft, könnte aber sein.

mfg
rochus

DiscMix 10. Jan 2005 11:10

Re: nullen ersetzen in sql abfrage
 
kannst du mal bitte deine abfrage posten, evtl. gibts dann mehr tips.

Hasse 10. Jan 2005 11:10

Re: nullen ersetzen in sql abfrage
 
Moin,

wie wärs mit einem anderen Platzhalter z.B '' as Spalte. Ich nutze das teilweise in Access.

jensw_2000 10. Jan 2005 11:23

Re: nullen ersetzen in sql abfrage
 
Die SQL Abfrage und das verwendete Datenbanksystem (MSSQL, Access, MySQL...) wären echt hilfreich.
Da einige SQL Befehle nur auf bestimmten SQL Servern laufen und auf anderen nicht.


Ich denke mal das deine Anfrage etwa so aussieht..

SQL-Code:
SELECT ID,Name,Vorname, Email, Eintrittsdatum FROM Personal
UNION ALL
SELECT ID,Name,Vorname, Email, '0' as Eintrittsdatum FROM Adressen
Du solltest die virtuelle Spalte entweder als NULL as 'Eintrittsdatum' bzw.
als "richtigen Datumswert" as "Eintrittsdatum" erstellen.

Dein Grid sollte die Variante mit dem NULL akteptieren.

:hi:

stonimahoni 10. Jan 2005 12:03

Re: nullen ersetzen in sql abfrage
 
ok also hier mal der quellcode von der selectabfrage :
so habe ich es jetzt :

Delphi-Quellcode:
with ADODSMahnwesen do begin
        Active:= False;
        sqlstrmahn:= 'SELECT auftrag.Repnr, auftrag.Annahmedatum, auftrag.Kunden_nummer, auftrag.Ean, '
                   + 'auftrag.Artikelbezeichnung, auftrag.Ausgangsdatum, auftrag.Beschaedigung1, 0 AS auftrag.Rep_zurueck_datum, '
                   + 'auftrag.Kudienst_mahn1, auftrag.KZ_Status, 0 AS auftrag.Kudienst_mahn2, 0 AS auftrag.Kundeninfo1 '
                   + 'FROM stamm INNER JOIN auftrag ON stamm.Ark = auftrag.Ark '
                   + 'WHERE (((auftrag.Ausgangsdatum)<(Date()-10)) AND ((auftrag.Kudienst_mahn1) Is Null) '
                   + 'AND ((auftrag.KZ_Status)="Ware in Reparatur" Or (auftrag.KZ_Status)="Ware für Kostenvoranschlag an Kundendienst")) '
                   + 'UNION SELECT auftrag.Repnr, auftrag.Annahmedatum, auftrag.Kunden_nummer, auftrag.Ean, '
                   + 'auftrag.Artikelbezeichnung, auftrag.Ausgangsdatum, auftrag.Beschaedigung1, 0 AS auftrag.Rep_zurueck_datum, '
                   + 'auftrag.Kudienst_mahn1, auftrag.KZ_Status, auftrag.Kudienst_mahn2, 0 AS auftrag.Kundeninfo1 '
                   + 'FROM stamm INNER JOIN auftrag ON stamm.Ark = auftrag.Ark '
                   + 'WHERE (((auftrag.Kudienst_mahn1)<(Date()-10)) AND ((auftrag.KZ_Status)="Ware in Reparatur" '
                   + 'Or (auftrag.KZ_Status)="Ware für Kostenvoranschlag an Kundendienst") AND ((auftrag.Kudienst_mahn2) Is Null)) '
                   + 'UNION SELECT auftrag.Repnr, auftrag.Annahmedatum, auftrag.Kunden_nummer, auftrag.Ean, '
                   + 'auftrag.Artikelbezeichnung, 0 AS auftrag.Ausgangsdatum, auftrag.Beschaedigung1, auftrag.Rep_zurueck_datum, '
                   + '0 AS auftrag.Kudienst_mahn1, auftrag.KZ_Status, 0 AS auftrag.Kudienst_mahn2, auftrag.Kundeninfo1 '
                   + 'FROM stamm INNER JOIN auftrag ON stamm.Ark = auftrag.Ark '
                   + 'WHERE (((auftrag.Rep_zurueck_datum)<(Date()-10)) AND ((auftrag.KZ_Status)="Ware an Lager") AND ((auftrag.Kundeninfo1) Is Null));';
        CommandText := sqlstrmahn;
        Active:= True;
ich hoffe ihr könnt damit was anfangen

@ jensw_2000 : ist eine access db


so hatte ich es vorher :
Delphi-Quellcode:
       sqlstrmahn:= 'SELECT auftrag.Repnr, auftrag.Annahmedatum, auftrag.Kunden_nummer, auftrag.Ean, '
                   + 'auftrag.Artikelbezeichnung, auftrag.Ausgangsdatum, auftrag.Beschaedigung1, 0 AS Ausdr1, '
                   + 'auftrag.Kudienst_mahn1, auftrag.KZ_Status, 0 AS Ausdr2, 0 AS Ausdr3 '
                   + 'FROM stamm INNER JOIN auftrag ON stamm.Ark = auftrag.Ark '
                   + 'WHERE (((auftrag.Ausgangsdatum)<(Date()-10)) AND ((auftrag.Kudienst_mahn1) Is Null) '
                   + 'AND ((auftrag.KZ_Status)="Ware in Reparatur" Or (auftrag.KZ_Status)="Ware für Kostenvoranschlag an Kundendienst")) '
                   + 'UNION SELECT auftrag.Repnr, auftrag.Annahmedatum, auftrag.Kunden_nummer, auftrag.Ean, '
                   + 'auftrag.Artikelbezeichnung, auftrag.Ausgangsdatum, auftrag.Beschaedigung1, 0 AS Ausdr1, '
                   + 'auftrag.Kudienst_mahn1, auftrag.KZ_Status, auftrag.Kudienst_mahn2, 0 AS Ausdr2 '
                   + 'FROM stamm INNER JOIN auftrag ON stamm.Ark = auftrag.Ark '
                   + 'WHERE (((auftrag.Kudienst_mahn1)<(Date()-10)) AND ((auftrag.KZ_Status)="Ware in Reparatur" '
                   + 'Or (auftrag.KZ_Status)="Ware für Kostenvoranschlag an Kundendienst") AND ((auftrag.Kudienst_mahn2) Is Null)) '
                   + 'UNION SELECT auftrag.Repnr, auftrag.Annahmedatum, auftrag.Kunden_nummer, auftrag.Ean, '
                   + 'auftrag.Artikelbezeichnung, 0 AS Ausdr1, auftrag.Beschaedigung1, auftrag.Rep_zurueck_datum, '
                   + '0 AS Ausdr2, auftrag.KZ_Status, 0 AS Ausdr3, auftrag.Kundeninfo1 '
                   + 'FROM stamm INNER JOIN auftrag ON stamm.Ark = auftrag.Ark '
                   + 'WHERE (((auftrag.Rep_zurueck_datum)<(Date()-10)) AND ((auftrag.KZ_Status)="Ware an Lager") AND ((auftrag.Kundeninfo1) Is Null));';

Hasse 10. Jan 2005 12:11

Re: nullen ersetzen in sql abfrage
 
Dann sollte NULL as Ausdruck gehen

stonimahoni 10. Jan 2005 12:15

Re: nullen ersetzen in sql abfrage
 
leider nein :(

fehler zitat :
die selcet anweisung schliesst ein reserviertes wort oder einen argumentnamen ein, das/der falsch, mit falscher zeichensetzung oder überhaupt nicht eingegeben wurde.

jensw_2000 10. Jan 2005 12:25

Re: nullen ersetzen in sql abfrage
 
Code:
 0 AS auftrag.Ausgangsdatum
Das geht so nicht.
Ausgangsdatum ist in diesen fall eine "virtuelle" Spalte

Da musst du den Tabellenverweis weglassen.

Wenn Access ...
Code:
NULL AS Ausgangsdatum
... nicht akzeptiert dann versuche es mal bitte mit


Code:
 '' AS Ausgangsdatum

:hi:

jensw_2000 10. Jan 2005 12:27

Re: nullen ersetzen in sql abfrage
 
aus, Schluß ... :wall:


SQL-Code:
NULL AS 'Ausgangsdatum'

oder

'' AS 'Ausgangsdatum'
so muß das ...

Hansa 10. Jan 2005 12:34

Re: nullen ersetzen in sql abfrage
 
Du verwendest ziemlich ungleiche Sachen, z.B. "0 AS Autrag..." oder "IS NULL". Warum das alles ? Dann noch was, was man nie machen sollte, z.B.: "auftrag.KZ_Status="Ware in Reparatur", also direkte String-Vergleiche in der DB. Noch nie gesehen so was. :shock: Bei einem Union muß alles die gleiche Struktur haben. Da jetzt einem Datum eine 0 vorzugaukeln o.ä., ich weiß nicht, ob das was wird.

Versuche besser eine einheitliche Linie da rein zu kriegen und die Statements so kurz wie möglich zu machen. Spalte notfalls alles in ein paar Stored Procedures auf und behandele dann erst die Rückgabewerte. Denn selbst, wenn das irgendwann auf diese Weise geht, dann weißt Du in kurzer Zeit nicht mehr warum überhaupt und es geht wieder von Vorne los.

stonimahoni 10. Jan 2005 13:00

Re: nullen ersetzen in sql abfrage
 
also ich habs ez soweit abgeändert : NULL AS Rep_zurueck_datum usw. aber :
fehlermeldung :
unterschiedliche typen für feld 'rep_zurueck_datum';
erwartet : datetime - gefunden : varbytes


:gruebel:

Hasse 10. Jan 2005 13:11

Re: nullen ersetzen in sql abfrage
 
Ich hab mir jetzt mal eine ADOQuery erstellt, die ich über ADOConnection1 an die Access 2000 -Datenbank gekoppelt habe. Dann eine Datasource-Komponente und ein DBGrid. Der Query habe folgenden SQL-String hinterlegt:

Select Artnr, '' as Ausgangsdatum from tzl;

activ auf true und es funzt. Mein DBGrid hat zwei Spalten ART und Ausgangsdatum, letztere ist leer.

jensw_2000 10. Jan 2005 13:20

Re: nullen ersetzen in sql abfrage
 
Die Meldung kommst bestimmt wenn du deinen Tabelle / Query im delphi öffnest oder ?

Dann nach mal einen Doppelklick auf der Tabelle / Query und ändere in den Eigenschaften der Felder mal den FieldType auf VARIANT.

Ich mache es immer so, das diese statischen Zuordnungen für die Spalten garnicht erst setze. Das hält einem eine Menge Ärger vom Hals wenn man mal die Struktur in der DB ändern muß ...

@Hansa
Man lernt echt immer wieder dazu. Dachte bis eben das es unter Access keine Stored Procedures gibt. Stimmt aber .. :stupid:


@stonimahoni
Ich muss jetzt erstmal eine Weile weg. Bin heute Abend wieder da falls noch Fragen sind.
Aber es finden sich bestimmt noch ein paar Leutchen, die Dir in der Zwischenzeit helfen können ...


:hi:

shmia 10. Jan 2005 13:44

Re: nullen ersetzen in sql abfrage
 
hier meine Hinweise an Dich:

1.) String Literale innerhalb von SQL werden nur in einfache Anführungszeichen (nicht in doppelte) gesetzt

2.) wenn von vornerein klar ist, dass es keine doppelten Datensätze gibt, dann sollte man unbedingt UNION ALL anstelle von UNION verwenden, da UNION ALL deutlich schneller arbeitet und weniger RAM benötigt.

3.) bei einer UNION [ALL] werden die Datentypen schon in der 1. SELECT Anweisung festgelegt.
Falls möglich stellt man die SELECT Abfrage an den Anfang, bei der alle Datumsfelder mit Werten gefüllt sind.

stonimahoni 10. Jan 2005 14:07

Re: nullen ersetzen in sql abfrage
 
hi shmia

danke für deine tipps aber das mit dem select bei dem alle ds gefüllt sind an erste stelle geht nicht wie du meinem code entnehmen kannst

es sind 3 unterschiedliche bedingungen ( abfragen ) die ich zu einer zusammengefastt habe (-n möchte ) weil sie an einem stück abgearbeitet weden muss ( also alle 3 abfragen müssen bei aufruf abgearbeitet werden )
und jede abfrage hat ihr gefüllten felder an anderer stelle und auch andere gefüllte felder


@ jensw_2000:
>Die Meldung kommst bestimmt wenn du deinen Tabelle / Query im delphi öffnest oder ?

>Dann nach mal einen Doppelklick auf der Tabelle / Query und ändere in den Eigenschaften der Felder >mal den FieldType auf VARIANT.

die meldung bekomm ich wen nich mein prog compilieren will

wo änder ich die eigenschaft in variant ??? finde nirgends was

jensw_2000 10. Jan 2005 21:52

Re: nullen ersetzen in sql abfrage
 
Zitat:

die meldung bekomm ich wen nich mein prog compilieren will
Also kommt die Fehlermeldung beim Starten des Projektes, sobald die Query auf active:=true gesetzt wird.

Mach mal einen Doppelklick auf deinem Query Objekt.
Dann öffnet sich ein kleines Fenster. Wenn das leer ist, irre ich mich und der Fehler liegt woanders.
Wenn du dort eine Liste mit Spaltennamen aus deiner Abfrage findest, dann schau dir mal das Feld 'rep_zurueck_datum' an. Wenn du es anklicklst, siehst du oben im Objektinspektor, das es als TDateTimeField deklariert ist.

Ich persönlich würde alle Einträge in der Feldliste löschen, weil das echt nur behindert wenn man mal Änderungen an der DB vornehmen muß.

Wenn du die Feldliste behalten möchtest, dann lösche einfach nur das Feld 'rep_zurueck_datum', klicke mit der rechten MT in die Feldliste und wähle ->neues Feld.
Bei Name schreibst du dann wieder rep_zurueck_datum rein und beim Typ wähst du VARIANT.

Das Selbe für alle weiteren Spalten die "virtuell" hinzugefügte NULLS enthalten ...

:hi:

stonimahoni 11. Jan 2005 07:08

Re: nullen ersetzen in sql abfrage
 
ok der alte fehler ist jetzt dann weg ABER :
jetzt schreibt er mir was von wegen :
rep_zurueck_datum feldgrösse erwartet 16 - gefunden 8

wie bring ich dem das nun bei ? im objektinspektor ist das feld mit einer grösse von 16 hinterlegt / angelegt

in der db ist es halt ein datumsfeld, was wahrscheinlich auch "nur" die 8 stellen hat.
*grummel*
wisst ihr da nun auch noch rat ??

danköö


mfg

stoni

jensw_2000 11. Jan 2005 07:37

Re: nullen ersetzen in sql abfrage
 
Lösche die Felder doch einfach. Am Besten gleich alle ... Was nützen die, ausser das man das Displayformat zur Designzeit einstellen kann ?
Willst du jedesmal mit Problemen kämpfen, wenn du was an deiner DB änderst ?

stonimahoni 11. Jan 2005 07:41

Re: nullen ersetzen in sql abfrage
 
nein hast recht
alle felder gelöscht - werd nun mal testen


danke soweit :)

stonimahoni 11. Jan 2005 08:21

Re: nullen ersetzen in sql abfrage
 
ok soweit so gut....


ich hab ja 3 selects zu einen zusammengefasst
und die selects geben mir jeweils andere sachen aus ( wegen unterschiedlichen bedingungen )
kann ich die ergebnisse vielleicht farbig markieren bzw anzeigen lassen je nach select ?

weiss da einer was?

thx

mfg

stoni



ok habs hinbekommen dank sharky :) big thx

bis dann

mfg
stoni

jensw_2000 11. Jan 2005 13:30

Re: nullen ersetzen in sql abfrage
 
Dann baue dir doch noch pro Select eine weitere virtuelle Spalte dazu
z.B.

SQL-Code:
SELECT Spalte1, Spalte2, 14588515 as 'Farbcode' FROM Table1
UNION ALL
SELECT Spalte1, Spalte2, 9816060 as 'Farbcode' FROM Table2
Habe erst heute abend wieder Delphi zur Hand, aber wenn du mal in den Ereignissen deines Grids nachschaust, solltest du einen "onCutsomDrawDatarow" Handler (oder so was in der Art) finden, der dir den aktuell zu zeichnenden Datensatz und die Canvas der Grid-Zeile zur Verfüging stellt.
(Genauer kann ich das erst heute Abend ausdrücken)

Wenn du diesen Eventhandler gefunden hast, dann kannst du die Farbe der Zeile etwa so anpassen...

Canvas.brush.color:=Record.fieldbyname('Farbcode') .asinteger;

Naja, das war erstmal die Theorie.
Versuche es mal zu finden. Wenn du nicht weiter gekommen bist, setze ich mich heute Abend mal dran und schaue genau nach ...

:hi:

stonimahoni 11. Jan 2005 13:40

Re: nullen ersetzen in sql abfrage
 
danke für deine antwort jensw_2000

habe paar sachen getestet und bin bei folgendem problem :

http://www.delphipraxis.net/internal...=299837#299837



danke an alle für die ganzen antworten bisher :dp:

mfg

stoni


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