Hallo Romber,
ich denke, das eine kleine Stored Procedure dein Problem am besten lösen sollte.
Du kannst deine Abfrage mit den "statistischen" Ausgabeparameter sauber kombinieren.
kleines Beispiel:
Erstelle dir auf dem
SQL-Server eine SP ...
SQL-Code:
CREATE PROCEDURE proc_RechnungsSuche
@Suchbegriff VARCHAR(50) = NULL,
@stat_Bezahlt INT = 0 OUTPUT,
@stat_Offen INT = 0 OUTPUT,
@stat_Storniert INT = 0 OUTPUT
AS
BEGIN
IF @Suchbegriff IS NOT NULL
BEGIN
-- Suchbegriff normieren
SET @Suchbegriff = LOWER(@Suchbegriff)
-- Datensätze suchen und zählen
SET NOCOUNT ON
SELECT @stat_Bezahlt=
SUM( CASE WHEN LOWER(Status) = 'b' -- Counter >> bezahlt
THEN 1
ELSE 0
END
)
,@stat_Offen=
SUM( CASE WHEN LOWER(Status) = 'o' -- Counter >> offen
THEN 1
ELSE 0
END
)
,@stat_Storniert=
SUM( CASE WHEN LOWER(Status) = 's' -- Counter >> storniert
THEN 1
ELSE 0
END
)
FROM VERWALTUNG
WHERE (LOWER(Name) = @Suchbegriff) -- LIKE %@Suchbegriff% geht auch
OR (LOWER(produkt) = @Suchbegriff) -- ist aber weniger performant
OR (LOWER(preis) = @Suchbegriff)
OR (LOWER(status) = @Suchbegriff)
-- Ausgabeparameter >> NULL ersetzen
IF @stat_Bezahlt IS NULL SET @stat_Bezahlt=0
IF @stat_Offen IS NULL SET @stat_Offen=0
IF @stat_Storniert IS NULL SET @stat_Storniert=0
-- Datensätze suchen und ausgeben
SET NOCOUNT OFF
SELECT Name
,Produkt
,Preis
,Status
FROM VERWALTUNG
WHERE (LOWER(Name) = @Suchbegriff) -- LIKE %@Suchbegriff% geht auch
OR (LOWER(produkt) = @Suchbegriff) -- ist aber weniger performant
OR (LOWER(preis) = @Suchbegriff)
OR (LOWER(status) = @Suchbegriff)
-- Fertig.
-- Die SP liefert die gewünschten Suchergebnisse und
-- die statistischen Werte in Form von Ausgabeparametern
END
ELSE BEGIN
-- Fehlermeldung falls kein Parameter übergeben wurde
RAISERROR('Diese Procedure erfordert einen Suchbegriff !',16,1,'Parameter fehlerhaft')
END
END
Aufruf aus Delphi:
Nimm dir eine TADoStoredProc und verbinde diese mit deiner AdoConnection und mit einer Datasource (für das Grid)
Delphi-Quellcode:
Procedure TForm1.Auftragssuche(Suchbegriff:
String);
begin
{ SQL INFO
CREATE PROCEDURE proc_RechnungsSuche
@Suchbegriff VARCHAR(50) = NULL,
@stat_Bezahlt INT = 0 OUTPUT,
@stat_Offen INT = 0 OUTPUT,
@stat_Storniert INT = 0 OUTPUT
AS
}
if Suchbegriff = '
'
then exit;
// SP schließen
AdoSP.Close;
// SP Zuweisen
AdoSP.ProcedureName:='
proc_RechnungsSuche';
// Parameter holen
AdoSP.Parameters.Refresh;
// Eingabeparameter setzen
// Ausgabeparameter müssen nicht initialisiert werden da auf dem SQL-Server Standardwert "0" gesetzt wurde
AdoSP.Parameters[1]:=Suchbegriff;
// SP Öffnen
AdoSP.Open;
// Jetzt die Ausgabeparameter holen und in der Statusbar anzeigen
Statusbar.Panels[0].text:= '
Sum: bezahlt : ' + inttostr(AdoSP.Parameters[2]);
Statusbar.Panels[1].text:= '
Sum: offen : ' + inttostr(AdoSP.Parameters[3]);
Statusbar.Panels[2].text:= '
Sum: storniert : ' + inttostr(AdoSP.Parameters[4]);
// Fertig
end;
Schöne Grüße,
Jens