baserunner

查询

 

使用xBase逻辑表达式来过滤当前使用的数据库。 baserunner有两种方法来表达查询语句:

直接使用表达式

直接传递表达式可以使你很好的控制数据库的操作,它是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>

备注字段、字符字段、日期字段以及数值字段都可以使用编辑框进行查询,但对日期字段需要按_dateformat变量指定的格式进行输入。
<input type="text" size="20" name="field_name">
这些字段还可以通过使用组合框给用户提供一个菜单选项来进行查询。菜单项的值还可以根据配置文件中的变量进行定义,当菜单项值中包含有<与>等HTML标记符号时特别有用。 如果菜单项的值中有空枨,必须引号将它引住。baserunner的查询引挚可以处理单个选择与多个选择。如果你不要求用户必须从这些菜单项中选择一个项目的话,就应该在菜单项中加入一个空白选项。使用组织框时你同样可以使用_fil变量。

<td><select name="field_name" multiple size="3">
   <option>Selection1</option>
   <option>Selection2</option>
   <option>"Selection 3"</option>
</select>


<select name="_fil" multiple size="3">
   <option value="(rating='G')">General Audiences</option>
   <option value="('PG'$rating)">Parental Guidance</option>
   <option value="(Rating='R')">Restricted</option>
   <option value="(rating='NR')">Not Rated</option>
</select>


<select name="_fil" size="1">
   <option> </option>
   <option value="_menu1">$ 0.00 - $25.00</option>
   <option value="_menu2">$25.01 - $35.00</option>
   <option value="_menu3">$35.01 - $45.00</option>
   <option value="_menu4">$45.01 - $55.00</option>
   <option value="_menu5">$55.01 - $65.00</option>
   <option value="_menu6">$65.01 - $75.00</option>
   <option value="_menu7">$75.01 - up</option>
</select>

In the configuration file:

_menu1=(price>=0.and.price<=25)
_menu2=(price>25.and.price<=35)
_menu3=(price>35.and.price<=45)
_menu4=(price>45.and.price<=55)
_menu5=(price>55.and.price<=65)
_menu6=(price>65.and.price<=75)
_menu7=(price>75)


一个输入项可以对应数据库中的多个字段,只需要中输入项的名称中将之个数据库字段用空格分开就行了,如:
<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 不等于(与#相同)    
对于文本字字段,缺省的运算符是$(包含),可能使用上面的操作符来改变缺省运算符。
 
对数值字段与日期字段,缺省的运算符是等于,可能使用上面的操作符来改变缺省运算符。
缺省情况下,多个输入值之间按or关系进行链接,在输入项之间输入and可以改变它。
 
缺省情况下,查询不区分大小写,可能定义一个名为_case的选择框让用户来进行选择。如果需要改变缺省值,可以在配置文件中定义_case变量。
缺省情况下,各个查询条件之间在用or进行链接,可以通过_matchall来改变它。
 
_exact是一个逻辑变量值,当使用它时与同时使用_matchall和_case达到相同的效果,即精确比较。

输入的例子: >=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>
In the configuration file:

_unique1=alltrim(field_name)


<select name="_fil" size="1">
<option> </option>
<!--unique1-->
<option value="field_name='{alltrim(field_name)}'">{alltrim(field_name)}</option>
<!--endunique-->
</select>

In the configuration file:

_unique1=alltrim(field_name)