![]() |
Datenbank: MS-SQL • Version: 2000 • Zugriff über: ODBC
Spalte anhängen in DBGRID
Hallo Allerseits,
leider habe ich folgendes Problem: Einem DBGrid soll eine weitere Spalte drangehangen werden. Diese soll jedoch nicht direkt aus der Query bzw. aus Datasource gefüllt werden, sondern quasi einen bestimmten Wert abbilden, der sich aus Bedingungen aus anderen Spalten ergibt. Ich arbeite hier mit einen MS-SQL-Server. In ACCESS habe dich das mit einen SQL-Statement lösen können:
SQL-Code:
Leider funktioniert dieser String nicht in Delphi, so dass ich mir was anderes einfallen lassen muss. SELECT *, IIF(spalte = Bedingung, "Tue dieses", "Tue jenes") as NeueSpalte FROM tbl Vielleicht gibt es unter Euch einen MS-SQL Spezialisten |
Re: Spalte anhängen in DBGRID
Schau dir mal die CASE-Funktion des MSSQL-Servers an.
|
Re: Spalte anhängen in DBGRID
Du kannst Deiner Datenquelle mit dem Feld-Editor (per Doppelklick auf die Datenquelle aufrufbar) ein berechnetes Feld zufügen, das Du dann auch im DBGrid darstellen kannst.
|
Re: Spalte anhängen in DBGRID
@mkienzler
CASE habe ich auch schon Probiert, funktioniert aber auch nicht .. Immer wenn ich einen Vergleich mit = einsetze, fängt er mit einen Syntaxfehler 'in der Nähe von '0' an.. :cry: @daddy Eine zusätzliche Spalte konnte ich mittels Doppelclick auf das DBGrid und durch "Hinzufügen" anlegen. In der Liste erschien dann eine Spalte nahmens TColumn. Wenn ich auf diese Spalte zugriff hätte, dann wäre das kein grosses Problem. Jetzt bin ich aber in der Objekt-orientierten Programmierung nicht so fit. |
Re: Spalte anhängen in DBGRID
Zeig mal deine Abfrage und beachte die richtige Schreibweise meines Namens
|
Re: Spalte anhängen in DBGRID
Hallo,
um relationale Operatoren verwenden zu können musst du die komplexe Syntax von CASE verwenden:
SQL-Code:
Freundliche Grüße
SELECT test = CASE
WHEN test = 0 THEN 'Null' ELSE test END FROM ... |
Re: Spalte anhängen in DBGRID
@mkinzler
(soll auch nie mehr wieder vorkommen, Ehrenwort !!! :) ) Hier mein originaler Code, allerdings unter Verwendung der IIF-Funktion.
Delphi-Quellcode:
Da fällt mir gerade ein. Kann diese Funktion IIF() nicht eine ADO-spezielle Funktion sein?cSQL_tblMIG := 'SELECT * '; cSQL_tblMIG := cSQL_tblMIG + ', iif (bereich_alt = ' + QuotedStr(CGruppe) ; cSQL_tblMIG := cSQL_tblMIG + ' AND region_alt = ' + QuotedStr(cRegion) ; cSQL_tblMIG := cSQL_tblMIG + ', ' ; cSQL_tblMIG := cSQL_tblMIG + QuotedStr('AB') + ', ' + QuotedStr('AN') + ') AS ABAN '; cSQL_tblMIG := cSQL_tblMIG + ' FROM tbl_mig ' ; cSQL_tblMIG := cSQL_tblMIG + 'WHERE (WiW = ' + QuotedStr(cAnmeldenamen) + ') '; cSQL_tblMIG := cSQL_tblMIG + 'OR (WiW_2 = ' + QuotedStr(cAnmeldenamen) + ') '; cSQL_tblMIG := cSQL_tblMIG + 'OR (WiW_Vertreter = ' + QuotedStr(cAnmeldenamen) + ') '; cSQL_tblMIG := cSQL_tblMIG + 'ORDER BY GPNR '; datenbankform.query_migration.close; datenbankform.query_migration.SQL.Clear; datenbankform.query_migration.SQL.Add(cSQL_tblMIG); datenbankform.query_migration.Active := true; @marabu Vielleicht teste ich das mal.. Es könnte auch sein, dass es einfach an blöden Syntaxfehlern liegt .. |
Re: Spalte anhängen in DBGRID
@marabu
SQL-Code:
So, wie ich das verstanden habe wird in der Spalte Test die 0 durch den Text 'Null' ersetzt. Richtig?SELECT test = CASE WHEN test = 0 THEN 'Null' ELSE test END FROM ... ich möchte das Ergebnis aber in einer neuen Spalte haben.. etwa so
SQL-Code:
SQL-Code: markieren SELECT test = CASE WHEN test = 0 THEN 'Null' AS Neuespalte ELSE test END FROM ... |
Re: Spalte anhängen in DBGRID
Du gibst der neuen Spalte einen Namen und legst den Typ fest. Außerdem markierst Du sie als "Berechnet" oder "InternalCalc". Dann musst Du im Ereignis "OnCalcFields" Deiner Datenquelle festlegen, wie die Spalte berechnet wird. Also z.B.:
Delphi-Quellcode:
Hiermit würdest Du also im neuen Feld "MeinFeld" die Summe der Felder A und B erhalten.
with TableA do
FieldByName('MeinFeld').AsInteger := FieldByName('FeldA').AsInteger + FieldByName('FeldB').AsInteger Bei InternalCal-Feldern kannst Du noch im OnCalcFields die Abfrage "if TableA.State = dsInternalCalc then" vorwegstellen. Weitere Infos findest Du sicherlich in der Delphi-Hilfe. Gruß Daddy |
Re: Spalte anhängen in DBGRID
Vielleicht wird es so deutlicher:
SQL-Code:
Mit calculated fields findet die Arbeit auf der Client-Seite statt. Bei einem vollwertigen SQL Server würde ich immer eine SQL-Lösung vorziehen. Beim Definieren von berechneten Feldern müssen auch alle anderen benötigten Felder persistent gemacht werden - das vermindert die Wartbarkeit des Codes.
SELECT neuesfeld = CASE
WHEN feld8 = 0 THEN 'Nix' ELSE feld8 END FROM ... Freundliche Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:57 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