练习 2.2:为搜索函数添加代码

既然您已经创建了 Web 页面,就必须添加执行以下操作的 EGL 代码:从 Web 页面检索搜索项、根据这些项搜索数据库并在页面上显示搜索结果。

将 SQL 搜索函数添加至库

  1. 打开 CustomerLib.egl 库,该库在 EGLSource 文件夹的 data 包中。
  2. 在库中最后一个 end 语句前面,插入以下代码:

    function NameAndStateSearch_And(func int,
        lname char(30) in, state char(2) in, 
        Customers Customer[])
        get Customers;
        if (sqlcode != 0) func = 0; end
      end

    此函数类似于库中获取数据库中的每个记录的函数。唯一的差别是此函数接收下列四个参数:

    此函数将立即检索数据库中的每条记录。在接下来的几个步骤中,将编辑此函数生成的 SQL 语句以便只返回符合搜索项 lnamestate 的记录。

  3. 直接单击刚刚添加的代码中的 get Customers 行中的词 Customers

    必须将光标放在 get Customers 这一行上的词 Customers 上,否则将不能编辑 SQL 语句。

  4. 右键单击 get Customers 行中的词 Customers,并从弹出菜单中单击 SQL 语句 > 添加。这就会将 SQL 语句添加至代码的 get Customers 这一行。
  5. from EGL.CUSTOMER 这一行后面添加一个空白行,方法是将光标放在该行的末尾,然后按 Enter 键。
  6. from EGL.CUSTOMER 下面新的空白行中,插入以下代码:

    where LAST_NAME like :lname and STATE = :state

    该代码看起来应类似如下所示:

    CustomerLib.egl 库的外观

    EGL 提供了创建和生成 SQL 语句的不同方法。在 EGL 教程的前面部分,您通过使用 usingKeys 子句指定特定的客户标识号来检索特定的数据库记录。此子句创建一个 SQL where 语句,该语句类似于刚才添加至 CustomerLib.egl 的 where 语句。还可以使用 defaultSelectCondition 来执行相同的任务。

  7. 保存文件。
  8. 通过按 Ctrl+G 或通过右键单击然后从弹出菜单中单击生成来为文件生成 Java 文件。
  9. 关闭该文件。

将搜索函数绑定至搜索页面

  1. 打开 customersearch.jsp 页面。
  2. 右键单击编辑器中的页面,然后从弹出菜单中单击编辑页代码。将打开页代码文件。
  3. 除去页代码文件中的所有代码并替换为以下代码:
    package pagehandlers;
    import data.*;
    
    PageHandler customersearch { handleHardIOErrors = no, throwNrfEofExceptions = yes }
        {view="customersearch.jsp", onPageLoadFunction="onPageLoad"}
    
    searchTerms Customer;       //Search input
    searchResults Customer[];   //Search results
    pagemsgRec msgRec;           //pagemsgRec variable of type MsgRec
    func int;                 //func - a flag to pass the state of the results
    
    	Function onPageLoad()
        if (func == 0)    //Either no rows, or 1st time into page
          pagemsgRec.msg="No customer(s) found or no search criteria entered.";        
        End
       end
    
    function searchFunction()
        func = 1;        //Initialize func before calling database
        searchTerms.Last_Name = searchTerms.Last_Name+"%";    //Add wildcard (%)
                                                            //to search field
            CustomerLib.NameAndStateSearch_And(func, searchTerms.Last_Name, 
                searchTerms.State, searchResults);	//Call search function
            pagemsgRec.msg = "Customer(s) found.  Search again?"; //Assign msg text
            pagemsgRec.nbr = sysLib.size(searchResults);          //Get row count
       end
        End
    
    Record msgRec            //Custom EGL record type definition
                             //used to combine numeric and string data
        10 nbr int;        //Integer - numeric field 	
        10 msg char(222);    //Character data
      end

    以下是一些有关刚才添加的代码的技术说明:

  4. 保存该文件并关闭它。
  5. 返回到 customersearch.jsp 页面。
  6. 在“页数据”视图中,展开 customersearch > pagemsgRec

    此记录包含两个字段:nbr - int,一个表示搜索返回的结果数的数字;msg - char(222),一个表示反馈消息的字符串。必须按顺序将这两个字段绑定至“提交”按钮上方的输出组件,其中,nbr - int 放在左边的输出组件上,msg - char(222)放在右边的输出组件上。

  7. nbr - int 从“页数据”视图直接拖到“提交”按钮上方左边的输出组件上。
  8. msg - char(222) 拖到右边的输出组件上。
  9. searchFunction() 从“页数据”视图的 Actions 文件夹拖到页面上的“提交”按钮上。

    该页面看起来应如下所示:

    搜索页的外观

  10. 保存该页面。
  11. 测试该页面。

    当测试该页面时,在 LAST_NAME 字段中输入一个字母,在 STATE 字段中输入一个州名。注意此搜索页面是区分大小写的。例如,如果在 LAST_NAME 字段中输入 F 并在 STATE 字段中输入 NV,则页面会显示多个结果,如下图所示:

    搜索结果页

要使用此搜索结果页面并不容易,因为用户既必须知道客户所在的州,又必须知道客户姓氏的首字母。如果用户能够在 AND 搜索与 OR 搜索之间进行选择就会更好一些。在下一个练习中,将把此选项添加至页面。在后面的练习中,将把 State 输入字段更改为列示在数据库中使用的所有有效州的组合框。

现在,您可以开始进行练习 2.3:使用 OR 搜索条件了。

反馈
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.