local csq
&&要传送的变量 dDate1={^1996-10-01} dDate2={^1997-09-30} cCustomerID=\nQty=50
&&配置待传送的语句 csql=csql+\
ORDERS.SHIPNAME,ORDERS.SHIPADDRESS,ORDERS.SHIPCITY,ORDERS.SHIPREGION,\
csql=csql+\,ORDERS.CUSTOMERID,\
csql=csql+\
csql=csql+\'+EMPLOYEES.LASTNAME SALESPERSON,ORDERS.ORDERID,ORDERS.ORDERDATE,\
AS
csql=csql+\TE,ORDERS.SHIPPEDDATE,SHIPPERS.COMPANYNAME AS SHIPPERNAME,\csql=csql+\DETAILS].PRODUCTID,PRODUCTS.PRODUCTNAME,[ORDER DETAILS].UNITPRICE,\
csql=csql+\,[ORDER DETAILS].DISCOUNT,\
csql=csql+\DETAILS].UNITPRICE*[ORDER DETAILS].QUANTITY*(1-[ORDER DETAILS].DISCOUNT) AS EXTENDEDPRICE,\csql=csql+\csql=csql+\FROM ((((EMPLOYEES INNER JOIN ORDERS ON EMPLOYEES.EMPLOYEEID=ORDERS.EMPLOYEEID)\csql=csql+\INNER JOIN
CUSTOMERS
ON
ORDERS.CUSTOMERID=CUSTOMERS.CUSTOMERID)\
csql=csql+\
csql=csql+\INNER JOIN [ORDER DETAILS] ON ORDERS.ORDERID=[ORDER DETAILS].ORDERID)\csql=csql+\INNER
JOIN
PRODUCTS
ON
[ORDER
DETAILS].PRODUCTID=PRODUCTS.PRODUCTID\ccsql=csql+\TE BETWEEN '\AND '\
csql=csql+\csql=csql+\&&传送,得到的光标名称为默认的SqlResult SQLEXEC(hconn,csql)
这里的写法是由一些技巧的,就是努力做到模仿SQL Server的规范塑造字符串:
ccsql=csql+\TE BETWEEN '\AND '\
csql=csql+\csql=csql+\
如果将变量计算后代入,大家会发现如下的字符串:
\ORDERS.ORDERDATE BETWEEN '1996-10-01' AND '1997-09-30' AND ORDERS.CUSTOMERID LIKE '%C%' AND [ORDER DETAILS].QUANTITY>50\
看这就是前文我们没有涉及到变量传递的那句SQL语句,很简单吧——合并变量到SQL语句中,塑造纯正的SQL 语句!完全是Visual FoxPro在字符串计算方面的技巧,这里值得一提的是TransForm()函数,这是个很有用的函数,它能够将各种类型的值改造成为标准的字符串,特别像日期型这样做在多种写法的数据,他也能轻易规范!
把数据集设为可更新
Visual FoxPro的光标类型
光标的英文称呼是Cursor,在Visual FoxPro中习惯的提法是临时表(Temp Table),不过我想应该根据惯例叫它光标。因为Visual FoxPro的光标绝对强劲,如果称呼Temp Table恐造成误会,好像Visual FoxPro不支持光标一样。
Visual FoxPro的光标有三种:只读光标、可读写光标、可更新光标。
只读光标是那种不能被修改的光标,在Visual FoxPro中使用SQL-Select语句产生的光标就是典型的只读光标:
SELECT * FROM ORDERS INTO CURSOR MYCURSOR
对于结果集合MyCursor来说我们不能对它执行任何写操作,如:Replace、Delete、Update等。
可读写光标是那种可以进行读写操作,但光标上的数据变更不被反映到数据源的光标:
典型的可读写光标有三类,其一就是用SQLEXEC()得到的光标,我们可以对它进行各种操作(从了Zap、Pack这样的表压缩命令),但是任何数据的变动都不会反映到数据源。
第二类可读写光标是Visual FoxPro 7 的新特性,我们在SQL-Select语句上加入关键字readwrite就可以得到这种光标。这是一个非常棒的特性,有了它在Visual FoxPro中操作中间结果就更自由了:
SELECT * FROM ORDERS INTO CURSOR MYCURSOR READWRITE
第三类可读写光标是“没有设置发送更新”的本地视图和远程视图。
记得我在“远程视图”一章里反复强调:要想视图是可更新的就必须设定它的SendUpdate属性为.t.,如果没有设,试图就是可读写光标了,任何对视图数据的操作都不能反映到数据源里了。
可更新光标是那种可以进行读写操作,并且任何数据变动都会反映到数据源的光标:
典型的可更新光标就是可更新视图,对它的好处我就不多加议论了,因为详细的内容在“远程视图”一章里已经讨论过了。
把SQLEXEC()得到的结果集设定为可更新光标的五大步骤
在“远程视图”一章里我就反复强调,Visual FoxPro是怎么产生语句SQL描述,发送到SQL Server中去的。大家可以想象配置一条SQL-Update或是SQL-Insert或是SQL-Delete需要的要素,怎样把客户端变动转化为SQL语句需要的东西,就是我们要设定的东西:
A.CURSORSETPROP(\数据源表名,可更新光标名)
此步骤设定的是数据源里(SQL Server)待更新的表名,如果涉及多个表就这样写:CURSORSETPROP(\。
B.CURSORSETPROP(\关键字段,可更新光标名)
此步骤是设定关键字段的,这个关键字段是这可更新光标的字段,而不是数据源里字段。
C.CURSORSETPROP(\TABLEFIELDLIST\可更新字段列表,可更新光标名)
此步骤设定的是在可更新光标里哪些字段的变动要被反映到数据源,即哪些字段时可更新的。
D.CURSORSETPROP(\TENAMELIST\前后段字段对应关系列表,可更新光标名)
此步骤设定前后端字段的对应关系。
E.CURSORSETPROP(\TES\可更新光标名)
这个步骤就不应多说了,最关键的一步,不做的话前面的努力都白搭。
下面我用三个实例来说明问题:
例一:
cnn=SQLCONNECT(\
SQLEXEC(cnn,\SELECT mycursor
CURSORSETPROP(\
CURSORSETPROP(\
CURSORSETPROP(\CURSORSETPROP(\categories.categoryid,categoryname categories.categoryname,\
\CURSORSETPROP(\
数据源表是 NorthWind 数据库的Categories 表,可更新光表是mycursor
CURSORSETPROP(\,TABLES属性设定的是:被更新的数据源表Gategories
CURSORSETPROP(\,关键字用可更新光标的字段名:ID,而不是数据源表的字段名:categoryid
CURSORSETPROP(\,可更新字段列表都用可更新光标的字段名表示,而不是数据源表的字段名。
CURSORSETPROP(\categories.categoryid,categoryname categories.categoryname,description categories.description\,请注意这里的写法:每一组对应关系用逗号分开,前面写可更新光标的字段名,再放置一个空格,接着写数据源表的字段名(注意一定要加上数据源表名称)
例二
cnn=SQLCONNECT(\
SQLEXEC(cnn,\
a.productid,a.productname,a.unitprice,b.categoryid,b.categoryname,c.supplierid,\ \
\\SELECT mycursor
CURSORSETPROP(\CURSORSETPROP(%ursor\CURSORSETPROP(\
\,\
CURSORSETPROP(\\
\\suppliers.supplierid,suppliername suppliers.contactname\
CURSORSETPROP(\
suppliers.companyname,contactname