| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 382 人关注过本帖
标题:有关宏执行的语句问题。
只看楼主 加入收藏
johncohen
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-11-29
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
有关宏执行的语句问题。
比如:
local lctext
lctext="select count(*) as gs,sum(zd1) as zd1,sum(zd2) as zd2(接下来还有很多很多字段) from 表名"
&lctext
这样的语句中,如果字段不太多的话,这样执行没有问题。
但是字段太多后,命令行会提示表达式太复杂,就是一行的代码位数太长,超限了。
然后就构建
sele count(*) as gs,;
     sum(zd1) as zd1,;
     sum(zd2) as zd2,;
     很多很多字段,;
     from 表名
这样的语句在命令行里也是可以执行的,程序也是可以的,但是。如果用lctext来存储这么多行之后
lctext="select count(*) as gs,;"
lctext=lctext+chr(10)(这里用或者用CHR(13))+"sum(zd1) as zd1,;"
lctext=letext+chr(10)+"sum(zd2) as zd2,;"
&lctext
这时候运行程序就会提示“命令中含有不能识别的短语或关键字”
是不是说&lctext 在宏执行中的字符串是不能有换行呢,还是什么原因。
如果这里行不通,那么通过其他方法能否实现。

主要是实现:
要汇总的基础表,字段太多,直接一条select 语句肯定超限。又不想把一张表分多次汇总再用inner join 去拼接。
求大神赐教!
2015-11-29 17:47
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:20 
程序代码:
* 测试表
CREATE CURSOR T (BH C(4),B1 N(4),B2 N(4),B3 N(4),B4 N(4))
INSERT INTO T VALUES ([0001],1200,1000,800,600)
INSERT INTO T VALUES ([0002],1100,900,700,500)
INSERT INTO T VALUES ([0003],1900,1700,1500,1300)

SELECT *,000000 小计 FROM T INTO CURSOR TEMP READWRITE
LCSTR=[]
* 生成字段名列表
FOR I=2 TO FCOUNT()-1
    LCSTR=LCSTR+FIELD(I)+IIF(I<FCOUNT()-1,[+],[])
ENDFOR
* 行小计
REPLACE ALL 小计 WITH &LCSTR
* 列合计
INSERT INTO TEMP ((FIELD(1))) VALUES (PADC("合计",FSIZE(FIELD(1)),"-"))
FOR I=2 TO FCOUNT()
    IF TYPE(FIELD(I))="N"
       SUM EVALUATE(FIELD(I)) TO HJ
       *--- 数值型字段求和,并将结果添加到最后一条记录
       REPLACE RECORD RECCOUNT() (FIELD(I)) WITH HJ IN TEMP
    ENDIF
ENDFOR
SELECT TEMP
BROWSE

坚守VFP最后的阵地
2015-11-29 18:16
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
要活学活用,不要死搬教条。

坚守VFP最后的阵地
2015-11-29 18:17
johncohen
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-11-29
收藏
得分:0 
回复 3楼 sdta
多谢sdta
图片附件: 游客没有浏览图片的权限,请 登录注册

我本来是打算想对此excel表的需求进行汇总数据。编写了如下的代码。
思路,对table1很多很多字段进行汇总,有本期,同期,还有同比。excel中会有不同的表,不同的字段,会很多。
table2就是上述这张excel表。即自定义汇总需求表。
是否筛选等1就是参与汇总。
程序代码:
func table_hz
********************************************
lpara table1,table2
SELECT &table1
SELECT &table2
DELETE ALL
PACK
APPEND FROM hz2015.csv type csv
SELECT * from &table2 where tname=table1 and bz="1" into dbf (table2+"ls1")
SELECT (table2+"ls1")
LOCAL lctext,lntext
lctext="select "
SCAN
LOCAL lcp11,lcp12,lcp13,lcp14
      lcp11=ALLTRIM(tname)
      lcp12=ALLTRIM(hzzb)
      lcp13=ALLTRIM(hzcon)
      lcp14=ALLTRIM(bz)
      lctext=lctext+lcp13+",;"+chr(10)
ENDSCAN
lntext=LEN(lctext)
lctext=LEFT(lctext,lntext-3)+" from (table1) into DBF (table1+'ls1')"
&lctext      *运行到此处就出问题了。
USE in (table1+"ls1")
USE in (table2+"ls1")
ENDFUNC
2015-11-29 18:36
johncohen
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-11-29
收藏
得分:0 
其中一个问题解决了
&lctext
换成
ExecScript(lcText)
执行成功了。
还剩下一个问题,就是基础表字段太多,sele语句长度超限,只好分两张表,然后拼接了。
2015-11-29 19:06
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
未必需要拼接

坚守VFP最后的阵地
2015-11-29 19:50
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
看看VFP9 TEXT ENDTEXT 命令的用法

坚守VFP最后的阵地
2015-11-29 19:51
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:0 
1. VFP 最多支持255个字段,而EXCEL 2007及以上版本(*.XLSX)支持10384个字段,所以VFP的表并不能容纳和处理Excel的所有列。
2. 不要一味去追求一个Select语句“包打天下”,思路要开阔。对于本例说,先使用 Total 命令将数据预处理一下可能更简单。另外,对字段命名有规律一些,在使用命令的 Fields 选项时,可以使用ALL LIKE 或 EXCEPT参数。
3. 有时候使用一小段代码可能更容易处理,比如:sdta版主的回复。

总之,要活学活用,既不要轻易放过任何一个问题,也不要一味钻牛角尖。

泉城飞狐
2015-11-30 08:52
快速回复:有关宏执行的语句问题。
数据加载中...
 
   



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

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