以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]ylm老师请教您一下...  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=1398)

--  作者:菜鸟foxtable
--  发布时间:2008/12/15 22:57:00
--  [求助]ylm老师请教您一下...
您的作品报价系统中的窗口5查询按钮里有一段这样的代码
能否抽空给俺们这些菜鸟讲解一下标记了红色的符号的使用意义及此行条件代码的意思吗?




Dim F As String =e.Form.Controls("列名").Value
Dim z As String =e.Form.Controls("关键字").Value
Dim s As Single
Dim d As Date
Dim Filter As String
  If z="" OrElse f= "" Then
     MessageBox.Show("列名或关键字不能为空.", "提示", MessageBoxButtons.ok, MessageBoxIcon.Information)
  ElseIf Tables("产品明细").Cols( f ).IsNumeric Then   \'如果筛选列中数值型
    Single.TryParse(z,s)  \'将变量转换成数值型
       Filter =  F & "= " & s
    Else
       Filter =  F & " Like \'*" & z & "*\'" 
     End If
If Filter > "" Then
    Tables("产品明细").Filter = Filter
End If
[此贴子已经被作者于2008-12-15 22:59:07编辑过]

--  作者:kylin
--  发布时间:2008/12/16 8:42:00
--  
暂且说明一下
 Filter =  F & "= " & s ,形成了关于数值列等于多少的条件表达式(两个& 是一般的字符连接符号)
 Filter =  F & " Like \'*" & z & "*\'"  形成关于字符列包含的条件表达式(第1个& 是一般的字符连接符号,Like \'*" & z & "*\' 约当于 Like \'*你好*\')
总的是对该表的数值列取等于表达式,对该表的字符列取包含表达式,全部连接起来。

--  作者:菜鸟foxtable
--  发布时间:2008/12/16 10:26:00
--  
图片点击可在新窗口打开查看能否专门出个专题,讲解下什么时候用&&什么时候用""
还有那个**
哎?好象就在这才见过**.....
--  作者:狐狸爸爸
--  发布时间:2008/12/16 10:29:00
--  

动态合成表达式

不少初次接触编程的用户,对于何时使用双引号,何时使用单引号,感到非常困惑。

其实很简单,代码中的字符串都是用双引号括起来的。

例如:

Dim s As String
s =
"abcd"

而单引号主要用于表达式,表达式可以用于计算、筛选。
表达式本身是一个字符串,所以必须用双引号括起来;表达式内部的字符串,用单引号括起来。

例如:

CurrentTable.Filter = "[产品] = \'PD01\'"

上面的代码意思是在当前表中筛选出产品为PD01的行,筛选表达式本身是一个字符串,所以用双引号括起来,表达式中的PD01也是一个字符串,是表达式的一个内部字符串,所以用单引号括起来。
表达式中的日期继续用符号#括起来,数值则不需要任何符号括起来,这些和代码中的格式是一样的,唯一不同的是字符串用单引号括起来。

例如:

CurrentTable.Filter = "[产品] = \'PD01\' And [日期] = #3/17/1999# And [折扣] = 0"

通过表达式列的Expression属性,可以动态设置其计算公式

例如:

DataTables("表A").DataCols("ID").Expression = "\'CA\' + [_Identify]"

实际编程的时候,经常要根据用户的输入,动态合成表达式。

例如:

例如要计算某个产品的销售数量,要计算的产品名称由用户输入,假定输入的结果保存在全局变量Vars("产品")中:

Dim Sum As Integer
Sum = 
DataTables("订单").Compute("Sum(数量)", "[产品] = \'" & Vars("产品") & "\'")

Compute的第二个参数为计算条件表达式,该表达式分为三部分:

"[产品] = \'" & Vars("产品") & "\'"

假定全局变量Vars("产品")的值为PD01,组合三部分的内容后,这个表达式就等效于:

"[产品] = \'PD01\'"

假定表A和表B都有品名、型号两列,我们在表A中选择了一行,希望从表B中找出相同品名、规格的行:

Dim dr1 As DataRow = Tables("A").Current.DataRow
Dim
dr2 As DataRow
dr2 =
DataTables("表B").Find("[品名]  = \'" & dr1("品名") & "\'And [规格] = \'" & dr1("规格") & "\'")

上面代码的最后一行,初看非常难以理解。
为便于理解,我们首先来看看看正常的查找表达式:

"[品名] = \'要找品名\' And [规格] = \'要找的规格\'"

其中红色的部分要被dr1中的实际的品名和规格代替,所以最终的表达式成了:

"[品名]  = \'" & dr1("品名") & "\'And [规格] = \'" & dr1("规格") & "\'"

上面都是用字符型的值作为例子,表达式中字符型的值要用单引号括起来。
如果是日期型,要用符号#括起来。
例如我们要筛选出指定月份的订单,但是因为表达式没有求得日期月份的函数,我们只能这样设置代码:

Dim StartDate As Date \'起始日期变量
Dim
EndDate As Date \'结束日期变量
Dim
Month As Integer = 6 \'指定月份
Dim
Year As Integer = 1999 \'指定年份
StartDate = New
Date(Year,Month,1) \'获得该月第一天
EndDate = New
Date(Year,Month,Date.DaysInMonth(Year,Month)) \'获得该月最后一天
Tables(
"订单").Filter = "[日期] >= #" & StartDate & "# And [日期] <= #" & EndDate & "#"

如果是数值,则不需要括起来,直接使用即可。
例如假定编号列是整数型,要筛选的编号保存在全局变量Vars("编号")中:

Tables("表A").Filter = "[编号] = " & Vars("编号")

一定要记住表达式中的字符用单引号括起来,日期用符号#括起来,数值则不需要任何符号。
在编号为整数的情况下,有人写出了这样的代码:

Tables("表A").Filter = "[编号] = \'" & dr("编号") & "\'"

然后问我为什么不能执行?我想原因你应该已经知道了。

DataTable和Table都有很多属性和方法用到了表达式,我们必须掌握单引号和双引号的区别,并学会动态合成表达式,才能设计出强大而又灵活的管理系统。


--  作者:菜鸟foxtable
--  发布时间:2008/12/16 11:30:00
--  
学习了..图片点击可在新窗口打开查看

专业报表里文本打印算是搞明白了一点点..

rb.Text = tables("基本资料")(0)("单位名称") & "费用清单" 

哈.变量+文本...