使用xBase逻辑表达式来过滤当前使用的数据库。 baserunner有两种方法来表达查询语句:
直接通过_fil, _tempfil,与 _deffilter变量传递给baserunner
根据用户输入表单HTML来产生查询语句
直接传递表达式可以使你很好的控制数据库的操作,它是baserunner的重要特色之一。用于传递表达式的三个变量所引起的对数据库的操作是不一样的:
_deffilter 通常只是在应用程序的配置文件中使用。如果在配置文件中使用这个变量,过滤将一直起作用。如果用户查询数据库,baserunner将会在用户所给的条件中加上该变量所规定的条件,然后再进行查询。它的缺点是你的数据库总是处于过滤状态。
_tempfil 变量用于临时的过滤。该变量的效果与使用_fil变量是一样的,不同的是,当调用完成之后,查询语句、记录指针以用目模板都将恢复到调用前的状态。这在根据一个数据库的值来查询第二个数据库时特别有用。
_fil 是很有用的。它可能通过命令行、表单或表单的一部分来传递。如果它作为表单的一部分的话,则可以处理多个_fil 变量。
通过命令行(或者不使用查询操作的表单)传递_fil变量给baserunner,可以使数据库的查询语句被设置了_fil变量的值(如果有 _deffilter的话,需要加上_deffilter的值)。在这种情况下,只能处理一个_fil 变量。此时,_file变量屏蔽了查询语句,因此,必须保证_fil变量的值是可以被baserunner可以接受的,baserunner不再对_fil的值进行格式化处理。
注意: 当你通过命令行使用时,需要将表达式按照URL格式进行编码。 URL格式的定界符一般说来是<%...%>(也可以修改,参见相关章节)。例如,你通过命令行使用_fil变量,可能会是这样的格式:_fil=<%experssion%>。
当你使用配置文件或表单是,不需要使用 URL编码格式。
如果通过命令行或表单传递一个值为0的_fil变量,将会清除当前的查询(过滤)条件。
当通过带有查询操作的表单来查询数据库时,baserunner通过分析用户的输入来形成一个有效的查询语句。查询操作有:query, refine, 与 revert。要查询表单中,你还可以为查询语句直接增加不进行分析的表达式,为此你只需要在表单中定义一个具有_fil名字的字段就行,查询表单还可以处理多个_fil变量。
如果通过_fil或_deffilter变量给查询引挚传递数字或日期型的值,这些具体的值在表达式中必须以字符形式出现。 数值表达式需要这样的格式: (num_field=val("123")). 日期表达的格式为(date_field = ctod("01/15/1998"))。 baserunner查询引挚期望一个查询中的所有元素都具有相同的格式。使用各种不同的格式可能会引起不可预测的结果。用户输入的日期值与数值全部由查询引挚转换为字符型值。
一个查询表单可以进行以下操作:
查询(query) 操作将会产生一个新的查询语句,并作用于数据库。
精化(refine) 操作将会给查询语句增加更多的信息,增加了信息后的新查询语句作用于数据库。
恢复(revert)操作将会立即回到前一条查询语句并作用于数据库。它不调用查询引挚。它只是用前一条查询语句来替换当前的查询语句。:
<form action="/cgi-bin/baserun.exe?_ses={session}&_act=revert&_tar=target.htm" method="GET">
<input type="submit" value="Use Previous Query">
提交一个没有字段的查询操作将清除当前的查询语句(也可以通过传递值为0的_fil来完成),如:
| <form
action="/cgi-bin/baserun.exe?_ses={session}&_act=query&_tar=target.htm"
method="GET"> <input type="submit" value="Clear Query"> |
查询表单由具有字段名名称的输入域组成,根据这些字段名所指定的字段与用户输入的值来形成查询表达式。换句话说,名为filed_name的输入字段的值将构成一个根据数据库字段_field_name的查询语句。一个查询表单可以使用数据库中的多个字段名。baserunner还可以处理以_fil命令的输入域,与_fil变量一样,它的值将直接加入到查询语句之中,因此它必须是一个有效的xBase表达式。baserunner在表单中还将直接处理以下四种变量:
_matchall 是一个逻辑值,如果它有值,查询条件的各部分将以and的方式组成一个查询条件,缺省时,查询条件的各部分是以or的方式组成一个查询条件的。你可以将根据你需要的缺省操作在配置文件中定义这个变量,如果需要改变其缺省值的话,可以在表单中定义一个隐藏变量_mathcall。当然你还可以让用户自己来决定,这可以使用的一个复选来实现:
| Match All:<input type="checkbox" name="_matchall" value="1"> |
_case 是一个决定查询是区分大小写的逻辑变量。缺省情况下,对字符或备注字段不区分大小写。该变量的操作方法与_matchall是相同的。
_exact是一个逻辑变量值,当使用它时与同时使用_matchall和_case达到相同的效果,即精确比较。
_sortorder 表达式值,不能是逻辑值。该表达式决定在查询返回给用户之前如何进行排序。也可以通过使用sort操作来达到这个变量的效果。下面就是一个例子
| <select name="_sortorder"
size="1"> <option> </option> <option value="(chr_field1+chr_field2)">Chr_field</option> <option value="(ascend(chr_field3))">Chr_field3 (ascending)</option> <option value="(descend(chr_field3))">Chr_field3 (descending)</option> <option value="(ascend(num_field))">Num_field (ascending)</option> </select> |
排骗子操作可能会对系统造成较大影响。
当在NT下的IIS中使用时,可能要使用 _use_iis_sort变量才能进行正确的排序(请参见相关章节)
输入的变量通过使用文本框或菜单形式,对逻辑变量一般使用复选框或单选按钮。每个输入域对应于数据库中的一个或多个字段。
下面是一个使用逻辑字段的例子:
<input type="checkbox" name="log_field" value="T"> <input type="radio" value="T" name="log_field"> Yes
<input type="radio" value="F" name="log_field"> No<select name="log_field" size="1">
<option> </option>
<option value="T">True</option>
<option value="F">False</option>
</select>
| <input type="text" size="20" name="field_name"> |
<td><select
name="field_name" multiple size="3"> <select name="_fil" multiple
size="3"> <select name="_fil"
size="1">
|
| <input type="text" size="40" name="field_name_1 field_name_2"> |
用户不需要输入xBase样式的表达式,baserunner的查询分析引挚会将用户的输入转换为xBase表达式。
逻辑字段:若为真时应输入T,t,Y,y,其他值都代表假。
日期字段:按_dateformat变量指定的格式输入,可以输入多个值,并且还可以使用关系操作运算符。
数值字段:输入数值,可以输入多个值,并且还可以使用关系操作运算符。
字符与备注字段:按文本输入。可输入单词或短语,短语(包含空格在内的任何字符)必须在一对引号之内输入,如: "some phrase"。除了逻辑字段,都可以输入多个值。
baserunner还可以处理下表所列的关系运算符, 可以在输入框中输入这些运行符:
| > | 大于 | >= | 大于等于 |
| < | 小于 | <= | 小于等于 |
| = | 等于 | and | 逻辑与 |
| # | 不等于 | or | 逻辑或 |
| not | 不等于(与#相同) |
输入的例子: >=100 and <=250 , >=01/15/1960 and <=01/06/1966 ,= H ,>B and <D ,baserunner将自动处理不必要的空格,但and or not等前后必须有空格才行。
下面是一个使用refine操作的例子:
| <select name="field_name"
size="1"> <option> </option> <!--unique1--> <option "{alltrim(field_name)}"></option> <!--endunique--> </select>
<select name="_fil"
size="1">
|