楼主想多了。&是一个很简单的东西,它的作用就是仅仅把后面跟随的字符型变量中的内容原样替换出来而已,且仅此而已。至于替换出来能不能用,是程序猿自己要事先做的功课。下面举几个栗子:
1、AB="1";?&AB+1 → 得到的结果为:2。
分析:根据&仅仅起到把字符型变量中的内容原样替换出来的原理,“?&AB+1”相当于“?1+1”,所以结果等于2。
2、AB(1)="1";?"AB&AB(1)" → 得到的结果为:AB1
分析:结果中的“AB”是“AB&AB(1)”中&前的那个“AB”,而后面的“1”就是AB(1)被替换出来的结果。所以,连在一起输出就是“AB1”。
3、接续栗子2:把 ?"AB&AB(1)" 改成 ?AB&AB(1),会得到一个出错信息:找不到变量‘AB1’。
分析:栗子2中已经说到“AB&AB(1)”经过计算后,会得到“AB1”的结果。那为何栗子2可以输出这个结果,而到了这里却出错了呢?请注意:栗子2输出命令中是把AB&AB(1)放在一对双引号里的,也就是说,那条命令中的 AB&AB(1) 其实是一个字符串常量;而这个栗子中的AB&AB(1)没有套上双引号,因此会被当作变量对待。由于事先没有定义过AB1这个变量,也没有用任何赋值语句给这个变量赋过值,VFP就没有在内存中建立这个变量。此时,突然之间要输出这个变量的值,当然就会出错。
4、接续栗子3:加一条命令 AB1=5,那么,?AB&AB(1) 就会得到结果:5。
根据栗子3的分析,这个栗子中的结果不会有什么难以理解的地方了吧?
5、再来个猛的,在日常编程中很可能会碰到。
比如,有一个订单表要作统计,假设其中有三个字段:客户名称 V(50),订单编号 V(20),下单日期 D。需要按两种方式统计订单数(在操作窗口中选择):(1)每个客户的总订单数,也就是不分下单时段的订单总数;(2)每个客户在指定下单时段内的总订单数,需要设置日期的。
IF 统计时间 THEN
&&“统计时间”变量根据操作窗口中的勾选设定
日期1="{^"+DTOC(起始日期)+"}"
日期2="{^"+DTOC(终止日期)+"}"
条件="下单日期 BETWEEN "+日期1+" AND "+日期2
ELSE
条件=".T."
ENDIF
SELECT 客户名称,COUNT(DISTINCT 订单编号) 订单数 ;
FROM 订单表;
WHERE
&条件;
GROUP BY 客户名称;
INTO CURSOR T7
分析:因为查询语句中的条件不是固定的,但整个查询的结构又一致,所以用IF...ELSE...ENDIF的分支语句配合宏替换来解决是比较方便的,不要分成两条或更多条的查询语句了。这样一来,代码看上去也比较简洁。这里的关键是那个红色的 条件=".T." 那句。为什么要加这一句呢?如果用户在操作窗口中勾选了不需要统计时间的选项,那么THEN后面的若干条语句便不会执行,也就是内存变量“条件”就没有建立。这时代码执行到查询语句,WHERE子句会因为找不到“条件”这个变量而出错。同样,也不能把“条件”变量的值设为空值("")。因为设为空值后,WHERE子句就只剩下一个关键字“WHERE”了,会造成语法错误。
啰啰嗦嗦地说了辣么多,不知道楼主弄懂了宏替换没有。总之,一句话,宏替换就是简单地把字符串变量中的内容原样拿出来而已,你不要想得太多。
[此贴子已经被作者于2015-11-25 08:42编辑过]