标题:Execscript sql 问题
只看楼主
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:396
帖 子:11713
专家分:43267
注 册:2006-5-13
得分:0 
楼主有可能是用.net。

活到老,学到老! http://www. E-mail:hu-jj@
2014-06-01 16:46
lgp740401_72
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2014-4-17
得分:0 
以下是引用liuxingang28在2014-6-1 16:44:40的发言:

用 ExecScript() 执行 SQL 语句?我还是第一次碰到。楼主是不是把 SQLEXEC()函数与 EXECSCRIPT()函数混淆了?
如果在 SQL Server 上运行没有问题,则采用如下语句肯定也是没有问题的:

cSql = "SELECT cast(thick AS char(10)) as 厚度 FROM tb_中板仓库_b WHERE (jlsjh_tb_生产跟踪表 IN (SELECT jlsjh FROM Tb_细木板跟踪表 WHERE (RTRIM(LTRIM(单据编号)) ='xmgzb'+CAST(YEAR(GETDATE()) AS varchar(4))+RIGHT('0'+CAST(MONTH(GETDATE()) AS varchar(2)),2))))"
IF SQLEXEC(gnHandle,cSql,'curRet') > 0
    BROWSE
ENDIF
我不是说过了:这没有问题,是select thick+venthick*2-1 AS char(10)) as 厚度,后提示出错了.SQLEXEC()函数与 EXECSCRIPT()函数当然不能混淆了,
lcsql="if tb_生产任务单.类别='中板'
          othisform.sql.sqlexec("SELECT cast(thick AS char(10)) as 厚度 FROM tb_中板仓库_b WHERE (jlsjh_tb_生产跟踪表 IN (SELECT jlsjh FROM Tb_细木板跟踪表 WHERE (RTRIM(LTRIM(单据编号)) ='xmgzb'+CAST(YEAR(GETDATE()) AS varchar(4))+RIGHT('0'+CAST(MONTH(GETDATE()) AS varchar(2)),2))))","v_厚度"
        else
         othisform.sql.sqlexec("select thick+venthick*2-1 AS char(10)) as 厚度 FROM tb_中板仓库_b WHERE (jlsjh_tb_生产跟踪表 IN (SELECT jlsjh FROM Tb_细木板跟踪表 WHERE (RTRIM(LTRIM(单据编号)) ='xmgzb'+CAST(YEAR(GETDATE()) AS varchar(4))+RIGHT('0'+CAST(MONTH(GETDATE()) AS varchar(2)),2))))","v_厚度"
endif
...."

在VFP中执行
...
othisform=thisform
try
   EXECSCRIPT(lcsql)
   catch
   ...
endtry
....
提示出错了,问题已经一句句查清楚了,就是thick+venthick*2-1 AS char(10)) as 厚度,这句有问题?我说清楚了吗?我用cast(thick AS char(10)) as 厚度替换,正确,没有问题.

[ 本帖最后由 lgp740401_72 于 2014-6-2 10:51 编辑 ]
2014-06-02 10:46
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:649
专家分:2156
注 册:2014-2-7
得分:0 
以下是引用lgp740401_72在2014-6-2 10:46:30的发言:

lcsql="if tb_生产任务单.类别='中板'
          othisform.sql.sqlexec("SELECT cast(thick AS char(10)) as 厚度 FROM tb_中板仓库_b WHERE (jlsjh_tb_生产跟踪表 IN (SELECT jlsjh FROM Tb_细木板跟踪表 WHERE (RTRIM(LTRIM(单据编号)) ='xmgzb'+CAST(YEAR(GETDATE()) AS varchar(4))+RIGHT('0'+CAST(MONTH(GETDATE()) AS varchar(2)),2))))","v_厚度"
        else
         othisform.sql.sqlexec("select thick+venthick*2-1 AS char(10)) as 厚度 FROM tb_中板仓库_b WHERE (jlsjh_tb_生产跟踪表 IN (SELECT jlsjh FROM Tb_细木板跟踪表 WHERE (RTRIM(LTRIM(单据编号)) ='xmgzb'+CAST(YEAR(GETDATE()) AS varchar(4))+RIGHT('0'+CAST(MONTH(GETDATE()) AS varchar(2)),2))))","v_厚度"
endif
...."
上边红色字体标注的部分未见作 Cast 转换。是否应改为:cast(thick+venthick*2-1 as char(10))?
楼主一开始并没有说清楚使用 ExecScript() 执行一个带分支结构的 sql 查询,从一开始的提问来看,确实也没有使用 ExecScript()的必要,这也是其他版主有疑问的地方。从 VFP 的帮助文件来看,ExecScript(eParameter) 中的 eParameter 为字符串,多个语句之间用 chr(13)连接,如:ExecScript('create cursor t1 (fld1 c(10))'+chr(13)+'insert into t1 (fld1) values ([china])'+chr(13)+'browse'),但在楼主上述语句中的 lcSql 字符串中并没有看到 chr(13) 分隔符。
就本例来说,到目前为止,我还没有看出使用 ExecScript()函数的必要性。如果要在服务器上执行带控制结构的多个 SQL 语句,一般应考虑使用存储过程。对于本例来说,也完全可以采用如下结构:
IF tb_生产任务单.类别='中板'
    cSql = 'Select ....'
ELSE
    cSql = 'Select .... '
ENDIF
IF SQLEXEC(nHandle,cSql) > 0
    BROWSE
ENDIF
就本例来说,不可能出现“select cast(thick as char(10)) as 厚度...”能运行,而“select cast(thick+venthick*2-1 as char(10) as 厚度...”不能运行的情况,当然,前提条件是 venthick 是数值型字段。

泉城飞狐
2014-06-02 16:57
lgp740401_72
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2014-4-17
得分:0 
哎,终于说清楚了,其实我第一次发时已经加了cast 看一楼,只是回复多了,我一直强调是改这这个计算字段后提示出错了,导致这样的错误。venthick 是数值型字段。但就是遇到了:select cast(thick+venthick*2-1 as char(10) as 厚度...”就报错,因加了try...endtry,运行到ELSE select cast(thick+venthick*2-1 as char(10) as 厚度...直接运行catch语句了.
版主的建议很好,我大约明白了:
1、我是初学者,对存储过程编辑还不太会。所以。。。
2、我这样编辑的用意:我把这段程序编辑在表grid的字段lostfocus属性中(让其一加载本表格,就会把这段程序当变量值加载了,当特定的字段值编辑lostfocus后就会运行这段),若这段程序有点改动,只需在任意一台客户端就可修改,纯属方便修改。若是存储过程还得回服务器修改。
这段程序让我搞了两三天,没法让它不出错,我现在只能在原表增加一个字段sumthick,让它的值=(thick+venthick*2-1),然后再用了:


[ 本帖最后由 lgp740401_72 于 2014-6-2 23:30 编辑 ]
2014-06-02 23:05



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-432291-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.427059 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved