Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Spalte anhängen in DBGRID (https://www.delphipraxis.net/91401-spalte-anhaengen-dbgrid.html)

fly_singapore 4. Mai 2007 11:17

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:

SELECT *, IIF(spalte = Bedingung, "Tue dieses", "Tue jenes") as NeueSpalte FROM tbl
Leider funktioniert dieser String nicht in Delphi, so dass ich mir was anderes einfallen lassen muss.

Vielleicht gibt es unter Euch einen MS-SQL Spezialisten

mkinzler 4. Mai 2007 11:20

Re: Spalte anhängen in DBGRID
 
Schau dir mal die CASE-Funktion des MSSQL-Servers an.

daddy 4. Mai 2007 11:21

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.

fly_singapore 4. Mai 2007 11:33

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.

mkinzler 4. Mai 2007 11:52

Re: Spalte anhängen in DBGRID
 
Zeig mal deine Abfrage und beachte die richtige Schreibweise meines Namens

marabu 4. Mai 2007 12:05

Re: Spalte anhängen in DBGRID
 
Hallo,

um relationale Operatoren verwenden zu können musst du die komplexe Syntax von CASE verwenden:

SQL-Code:
SELECT test = CASE
    WHEN test = 0 THEN 'Null'
    ELSE test
  END
FROM ...
Freundliche Grüße

fly_singapore 4. Mai 2007 12:10

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:

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;
Da fällt mir gerade ein. Kann diese Funktion IIF() nicht eine ADO-spezielle Funktion sein?



@marabu

Vielleicht teste ich das mal.. Es könnte auch sein, dass es einfach an blöden Syntaxfehlern liegt ..

fly_singapore 4. Mai 2007 12:18

Re: Spalte anhängen in DBGRID
 
@marabu


SQL-Code:


SELECT test = CASE
    WHEN test = 0 THEN 'Null'
    ELSE test
  END
FROM ...
So, wie ich das verstanden habe wird in der Spalte Test die 0 durch den Text 'Null' ersetzt. Richtig?

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 ...

daddy 4. Mai 2007 12:18

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:
 with TableA do
  FieldByName('MeinFeld').AsInteger := FieldByName('FeldA').AsInteger + FieldByName('FeldB').AsInteger
Hiermit würdest Du also im neuen Feld "MeinFeld" die Summe der Felder A und B erhalten.

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

marabu 4. Mai 2007 12:28

Re: Spalte anhängen in DBGRID
 
Vielleicht wird es so deutlicher:

SQL-Code:
SELECT neuesfeld = CASE
    WHEN feld8 = 0 THEN 'Nix'
    ELSE feld8 
  END
FROM ...
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.

Freundliche Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:20 Uhr.
Seite 1 von 2  1 2      

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