2016-07-19 15 views
0

SQL NEWBIE auf der Suche nach einer Lösung. Wir haben eine Datenbank von Clients und eines der Felder heißt CLOSED. Wenn es einen Wert enthält, wurde es geschlossen und ansonsten leer. CLOSED-Fälle werden während einer Suche nicht angezeigt, es sei denn, ich führe eine separate Abfrage aus, um sie anzuzeigen. Wenn ich also die Suche starte und nichts auftaucht, wähle ich eine andere Taste in meiner DELPHI-App, um GESCHLOSSENe Fälle anzuzeigen. Ich möchte eine Ein-Knopf-Option, um nach einem Fall suchen zu können, und wenn nichts automatisch gefunden wird, fahre fort oder wiederhole die Suche, um die GESCHLOSSENEN Fälle anzuzeigen. Nicht sicher, was die SQL-Abfrage dafür ist. Aber ich glaube, ich bin an der richtigen Stelle, um eine Antwort zu bekommen ...... Vielen Dank im Voraus Leute ....Suche nach einem OPEN-Client-Fall und automatische Anzeige von CLOSED-Fällen, wenn OPEN CASE nicht gefunden wurde

+0

Eigentlich sollten Sie Ihre Frage bearbeiten und 'SQL'-Tag zu Ihrer Frage hinzufügen, da das Erzielen der gewünschten Ergebnisse nur eine korrekte SQL-Abfrage erfordert. Und Sie können sowohl "Delphi" - als auch "Null" -Tags entfernen, da nur Ihr drittes Szenario (das automatisch die zweite Abfrage ausführt, wenn zuerst keine Ergebnisse zurückgegeben werden) von Delphi-Code abhängig wäre. Und um eine Antwort dafür zu erhalten, sollten Sie auch Informationen darüber hinzufügen, welche Datenbankkomponenten Sie verwenden. – SilverWarior

+0

Was ist Ihre '[sql]' oder '[delphi]' Frage? –

+0

Mach dir keine Sorgen über die Tags auf deinem q für jetzt. Die zwei wichtigsten Dinge, um effektive Hilfe zu erhalten, sind, Ihr q zu bearbeiten, um: a) zu sagen, welches Datenbank-Backend Sie verwenden (zB MS Sql Server) und b) den Code aus Ihrer Delphi App hinzuzufügen, den Sie gerade haben, einschließlich der SQL-Anweisung (en), die es ausführt. Ohne diese würde ich nicht überrascht sein, wenn die Leser dafür stimmen würden, Ihr q als zu weit zu schließen, was schade wäre, weil das, was Sie möchten, ziemlich einfach klingt, aber um dorthin zu gelangen, müssen wir wissen, wo Sie anfangen. – MartynA

Antwort

1

Eine Möglichkeit zu tun, was Sie wollen, ist eine SQL-Anweisung in Ihrer Delphi-App zu erstellen und senden Sie es an den Server. Wenn ich Ihre Anforderung richtig verstehe, ist nur eine SQL-Anweisung erforderlich, obwohl zwei Fälle zu berücksichtigen sind. a) alle Kunden sind nahe und b) manche nicht. Wenn Sie jedoch SQL in einer Delphi-App erstellen, müssen Sie sich des Risikos des Risikos von Sql Injection bewusst sein - siehe https://en.wikipedia.org/wiki/SQL_injection.

Ein besserer Weg wäre, einen Stored Procedure auf Ihrem Server zu definieren, um die Datenzeilen abzurufen, die Sie wollen. Zum Beispiel in MS SQL Server, könnten Sie eine Stored Procedure wie diese

create procedure GetClients as 
    if (select count(*) from Clients where Closed is Null) > 0 
    select * from Clients where Closed is Null 
    else 
    select * from Clients 

Grundsätzlich erstellen, die if ... Bedingung verlangt, ist es irgendwelche Zeilen, in denen Closed-ID Null. Wenn es solche gibt, gibt die erste select ... Anweisung sie zurück; Wenn nicht, werden alle Zeilen zurückgegeben.

Sie können es ausführen aus einer Delphi-App wie diese

type 
    TForm1 = class(TForm) 
    ADOStoredProc1: TADOStoredProc; 
    DataSource1: TDataSource; 
    DBGrid1: TDBGrid; 
    DBNavigator1: TDBNavigator; 
    procedure FormCreate(Sender: TObject); 
    public 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    AdoStoredProc1.ProcedureName := 'GetClients;1'; 
    AdoStoredProc1.Open; 
end; 

(Btw, dafür arbeiten Sie im Objektinspektor eine geeignete Connection für AdoStoredProc1 haben müssen einzurichten.

Hinweis dass diese Probe App nicht jede SQL in dem Delphi-app nicht konstruieren, so besteht keine Gefahr von Sql Injection.

Sie nicht gesagt, welche Daten geben Sie Ihre Closed Spalte ist. Für die Prüfung, Ich habe angenommen, dass es eine Integer-Spalte ist, aber jeder andere Typ sollte funktionieren.

Die obige App ist bewusst minimalistisch, im Grunde zu veranschaulichen, dass Sie solche Dinge in serverseitigem Code tun können. In der Praxis könnten Sie die Stored Proc so parametrisieren, dass Sie die Ergebnisse basierend auf anderen Spaltenwerten einschränken können.

+0

Ich würde 'Select count (*) ...' nicht in MSSQL verwenden. Es muss alle übereinstimmenden Datensätze zählen, was übertrieben ist, nur um herauszufinden, ob etwas existiert. Ich benutze lieber 'select top (1) 1 ...' statt dessen, da es die Suche beendet, sobald der erste Datensatz gefunden wurde. Wenn die Ergebnismenge leer ist, wurden keine Datensätze gefunden, andernfalls ist mindestens eine vorhanden. Viel weniger Aufwand. –

+0

Sie haben meine Frage richtig verstanden. Danke vielmals. SQL-Injektion jedoch, wenn ich es richtig verstehe, wird kein Problem für mich sein. Dies ist eine firmeninterne Anwendung und hat keinen Zugang zur Außenwelt, daher sollte dies kein Problem sein. Wie in meinem ursprünglichen Beitrag erwähnt, bin ich ein SQL Newbie, also muss ich etwas über SQL und gespeicherte Prozeduren lesen. –

+0

Ich möchte hier etwas Code posten, aber ich weiß nicht, ob ich das nur durch Kopieren und Einfügen tun kann, oder brauche ich irgendeine Art von Formatierungs-Tags. –