![]() |
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 |
Re: nullen ersetzen in sql abfrage
probier mal die methoden "OnGetText". Weiß nicht genau, ob dir das hilft, könnte aber sein.
mfg rochus |
Re: nullen ersetzen in sql abfrage
kannst du mal bitte deine abfrage posten, evtl. gibts dann mehr tips.
|
Re: nullen ersetzen in sql abfrage
Moin,
wie wärs mit einem anderen Platzhalter z.B '' as Spalte. Ich nutze das teilweise in Access. |
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:
Du solltest die virtuelle Spalte entweder als NULL as 'Eintrittsdatum' bzw.
SELECT ID,Name,Vorname, Email, Eintrittsdatum FROM Personal
UNION ALL SELECT ID,Name,Vorname, Email, '0' as Eintrittsdatum FROM Adressen als "richtigen Datumswert" as "Eintrittsdatum" erstellen. Dein Grid sollte die Variante mit dem NULL akteptieren. :hi: |
Re: nullen ersetzen in sql abfrage
ok also hier mal der quellcode von der selectabfrage :
so habe ich es jetzt :
Delphi-Quellcode:
ich hoffe ihr könnt damit was anfangen
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; @ 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));'; |
Re: nullen ersetzen in sql abfrage
Dann sollte NULL as Ausdruck gehen
|
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. |
Re: nullen ersetzen in sql abfrage
Code:
Das geht so nicht.
0 AS auftrag.Ausgangsdatum
Ausgangsdatum ist in diesen fall eine "virtuelle" Spalte Da musst du den Tabellenverweis weglassen. Wenn Access ...
Code:
... nicht akzeptiert dann versuche es mal bitte mit
NULL AS Ausgangsdatum
Code:
'' AS Ausgangsdatum
:hi: |
Re: nullen ersetzen in sql abfrage
aus, Schluß ... :wall:
SQL-Code:
so muß das ...
NULL AS 'Ausgangsdatum'
oder '' AS 'Ausgangsdatum' |
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. |
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: |
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. |
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: |
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. |
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 |
Re: nullen ersetzen in sql abfrage
Zitat:
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: |
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 |
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 ? |
Re: nullen ersetzen in sql abfrage
nein hast recht
alle felder gelöscht - werd nun mal testen danke soweit :) |
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 |
Re: nullen ersetzen in sql abfrage
Dann baue dir doch noch pro Select eine weitere virtuelle Spalte dazu
z.B.
SQL-Code:
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.
SELECT Spalte1, Spalte2, 14588515 as 'Farbcode' FROM Table1
UNION ALL SELECT Spalte1, Spalte2, 9816060 as 'Farbcode' FROM Table2 (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: |
Re: nullen ersetzen in sql abfrage
danke für deine antwort jensw_2000
habe paar sachen getestet und bin bei folgendem problem : ![]() 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