搜索OPEN客户端案例并在未找到OPEN CASE的情况下自动显示CLOSED案例

时间:2016-07-19 15:34:18

标签: delphi null

SQL NEWBIE寻求解决方案。 我们有一个客户数据库,其中一个字段叫做CLOSED。如果它包含一个已关闭的值,否则为空。除非我运行单独的查询来显示它们,否则在搜索过程中不会显示CLOSED个案。因此,当我运行搜索并且没有显示任何内容时,我会在DELPHI应用程序上选择另一个按钮来显示CLOSED个案。我想要一个按钮选项,以便能够搜索案例,如果没有找到任何自动继续或重复搜索以显示CLOSED案例。不确定SQL查询是做什么的。但我相信我在正确的地方得到答案......先谢谢人们......

1 个答案:

答案 0 :(得分:1)

实现您想要的一种方法是在Delphi应用程序中创建一个SQL语句 将其发送到服务器。如果我正确理解您的要求,即使有两种情况需要考虑,也只需要一个SQL语句; a)所有客户都很亲密,b)有些客户不是。但是,当您在Delphi应用程序中构造SQL时,您需要 请注意Sql Injection的风险 - 请参阅https://en.wikipedia.org/wiki/SQL_injection

更好的方法是在服务器上定义Stored Procedure以进行检索 你想要的数据行。例如,在MS Sql Server中,您可以创建一个 Stored Procedure喜欢这个

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

基本上,if ...条件要求是有任何行,其中Closed id为Null。如果有,则第一个select ...语句返回它们;如果没有,则返回所有行。

您可以从像这样的Delphi应用程序执行它

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;

(顺便说一句,为此,您需要在Object Inspector中为AdoStoredProc1设置合适的ConnectionString。

请注意,此示例应用程序不会在Delphi应用程序中构建任何 SQL,因此不存在Sql Injection的风险。

您没有说出您的关闭列的数据类型。为了测试,我已经假设了 它是一个整数列,但任何其他类型都应该有效。

上面的应用程序是故意极简主义的,基本上是为了说明你可以在服务器端代码中做这样的事情。实际上,您可以参数化Stored Proc,以便根据其他列值限制结果。