易表在线答疑技术与交流用户社区 → [求助]求教一个比较复杂的记录导出dbf文件问题!


  共有36890人关注过本帖树形打印复制链接

主题:[求助]求教一个比较复杂的记录导出dbf文件问题!

帅哥哟,离线,有人找我吗?
tzszw
  41楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:蒙面侠 帖子:2409 积分:400 威望:0 精华:0 注册:2006/8/14 19:31:00
  发帖心情 Post By:2007/7/23 23:23:00 [只看该作者]

[这个贴子最后由tzszw在 2007/07/24 09:25pm 第 6 次编辑]

下面引用由tzszw2007/07/15 00:30am 发表的内容:
主是这个文件,CZY老师请看

请CZY老师再看看这个帖子!能否再优化一下公式,再提高生成导出数据的速度!(目前仅每生成一次就要花3-4分钟时间,类似“死机”。)

因为导出数据生成后再加上从系统与抄表机的交换、转换(先导出为TXT的,再用VFP做的转换程序转成DBF的,然后再执行BAT或VBS的将其发送到抄表机中)还要再花约2分钟,这样的话按目前的速度,完全导出一次数据正常都要花分钟。

新文件如下:egd文件下载

这个文件我已经修改过了,在MGHA表的“数据发送处理”窗口中,将CZY老师的按选定条件(在“选择”列打钩)生成发送数据的公式单独放在“czy老师的生成sendsfk表发送数据公式”的命令按钮中。
同时对"jbldfl"表进行了修改,增加了“导出条件1”和“导出条件2”两列,目的是想通过表格自动生成的“导出条件1”和“导出条件2”两列内容,减少中间操作环节。如:假定选择了“操作号”为2的,原来在JB表中同样选择2路1道1-4000号以内记录生成sendsfk记录的操作条件是:“路号=2”且“道号=2”且“最小片号>=1”且“最大片号<=4000”,现在只要在JB表中选“新户号>=02010001且新户号<=02014000”即可,其他的以此类推,我想肯定会比以前的算法简便多了。
这个条件我想是要在筛选出一些符合生成的条件(jbldfl表中对应于mgha表打钩的多条记录)后执行一个循环命令,将JB表中新户号符合02010001-02014000、02020001-02024000、02090001-02094000、02100001-02104000、02140001-02144000、03030001-03034000、04200001-04202000、08060001-08064000的记录一一CopyFor到sendsfk即可,只是我不会也不懂使用易表的循环命令。特此请教!
谢谢!附图示说明:

 回到顶部
帅哥哟,离线,有人找我吗?
tzszw
  42楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:蒙面侠 帖子:2409 积分:400 威望:0 精华:0 注册:2006/8/14 19:31:00
  发帖心情 Post By:2007/7/23 23:52:00 [只看该作者]

自己顶上去好让CZY版主看到!

 回到顶部
帅哥哟,离线,有人找我吗?
tzszw
  43楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:蒙面侠 帖子:2409 积分:400 威望:0 精华:0 注册:2006/8/14 19:31:00
  发帖心情 Post By:2007/7/24 0:32:00 [只看该作者]

呵呵,我顶了,但好象CZY老师没看到呀!

 回到顶部
帅哥哟,离线,有人找我吗?
Czy
  44楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:13147 积分:-89 威望:0 精华:0 注册:2006/8/11 11:14:00
  发帖心情 Post By:2007/7/24 1:16:00 [只看该作者]

to 41楼

写个循环公式不是问题,关键是你的要求逻辑关系复杂,别人一时很难看懂。
或者你自己写你个公式,我可以按你的要求帮你写循环公式。


 回到顶部
帅哥哟,离线,有人找我吗?
lxl
  45楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:蜘蛛侠 帖子:1191 积分:-50 威望:0 精华:0 注册:2007/5/25 12:56:00
  发帖心情 Post By:2007/7/24 14:54:00 [只看该作者]

我说一种循环公式的写法,你看看能不能用的上:
求1+2+3+4+……+98+99+100
用LOOP写  理解起来容易,但是易表的LOOP函数不是太好用,特别是写在刷新公式里面,基本上运行不起来。
另外一种写法:
建两个变量 %N%  %Sum%
setvariable("%N%",0) and setvariable("%Sum%",0)
and setvariable("%N%",[%N%]+1) and setvariable("%Sum%",[%Sum%]+[%N%])
and setvariable("%N%",[%N%]+1) and setvariable("%Sum%",[%Sum%]+[%N%])
and setvariable("%N%",[%N%]+1) and setvariable("%Sum%",[%Sum%]+[%N%])
and setvariable("%N%",[%N%]+1) and setvariable("%Sum%",[%Sum%]+[%N%])
………………  
and setvariable("%N%",[%N%]+1) and setvariable("%Sum%",[%Sum%]+[%N%])
从第2行开始,每行都一样 一共100行  

如果真这样写,也不叫循环了,因为如果别人要求从1加到10000的话,写命令都写死人了。 正好有rept函数可以帮着完成写重复命令的任务。
第2到10行可以写成
rept("and setvariable("%N%",[%N%]+1) and setvariable("%Sum%",[%Sum%]+[%N%])",100)  
不过这个写法是错的,易表公式有个要求:把"放进别的引号间,每个"都要写成""
因此要写成
rept("and setvariable(""%N%"",[%N%]+1) and setvariable(""%Sum%"",[%Sum%]+[%N%])",100)  


所以整个公式是:
setvariable("%N%",0) and setvariable("%Sum%",0)+rept("and setvariable(""%N%"",[%N%]+1) and setvariable(""%Sum%"",[%Sum%]+[%N%])",100)
电脑写出的公式只是一个比较长的字符串,系统并不会把他当成公式
用eval()来执行这段公式(字符串)
eval(setvariable("%N%",0) and setvariable("%Sum%",0)+rept("and setvariable(""%N%"",[%N%]+1) and setvariable(""%Sum%"",[%Sum%]+[%N%])",100)
)  
1加到100的值就保存在Sum变量里面了


注意,还有这样一种情况
不需要给 %N%  %Sum%赋初值,想直接运行
rept("and setvariable(""%N%"",[%N%]+1) and setvariable(""%Sum%"",[%Sum%]+[%N%])",100)  写出来的公式,但是前面多了一个 and 无法直接运行
可以,用mid(   ,5)来得到第一个and 之后的内容,再eval()运行
eval(mid(rept("and setvariable(""%N%"",[%N%]+1) and setvariable(""%Sum%"",[%Sum%]+[%N%])",100),5))


-=-=-=- 以下内容由 lxl2007年07月24日 02:58pm 时添加 -=-=-=-
基本上就是这个格式:
eval(mid(rept(" and 语句1 and 语句2 and 语句3",循环次数),5))

第一个and前面也要有空格,我上面的公式可能没写,记得加上.


 回到顶部
帅哥哟,离线,有人找我吗?
lxl
  46楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:蜘蛛侠 帖子:1191 积分:-50 威望:0 精华:0 注册:2007/5/25 12:56:00
  发帖心情 Post By:2007/7/24 15:02:00 [只看该作者]

这个才对了
eval("setvariable("%N%",0) and setvariable("%Sum%",0)"+rept("and setvariable(""%N%"",[%N%]+1) and setvariable(""%Sum%"",[%Sum%]+[%N%])",100)
)  

呵呵光写字没运行,运行一下才发现中间有个错误.:)


 回到顶部
帅哥哟,离线,有人找我吗?
smileboy
  47楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:8672 积分:1734 威望:0 精华:0 注册:2006/8/11 10:52:00
  发帖心情 Post By:2007/7/24 15:29:00 [只看该作者]

下面引用由lxl2007/07/24 03:02pm 发表的内容:
这个才对了
eval("setvariable("%N%",0) and setvariable("%Sum%",0)"+rept("and setvariable(""%N%"",+1) and setvariable(""%Sum%"&q ...

呵呵,楼主应该能看出来:)

 回到顶部
帅哥哟,离线,有人找我吗?
tzszw
  48楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:蒙面侠 帖子:2409 积分:400 威望:0 精华:0 注册:2006/8/14 19:31:00
  发帖心情 Post By:2007/7/24 15:52:00 [只看该作者]

非常感谢LXL和smileboy 老师,等晚上有空认真学习一下你们在45到47楼的精典讲解,再对CZY老师原来给出的公式进行消化理解,争取进行精简改进,以进一步提高运行效率和速度。       这个速度太慢实在令人难以忍受!
说实在的,我对eval和evalfor以及Substitute这三个函数学得不好,特怕遇见后两个,几位版主帮忙写的涉及后两个的公式有时并没理解,就糊里糊涂地用,所以不会变通和修改。

 回到顶部
帅哥哟,离线,有人找我吗?
smileboy
  49楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:8672 积分:1734 威望:0 精华:0 注册:2006/8/11 10:52:00
  发帖心情 Post By:2007/7/24 15:54:00 [只看该作者]

下面引用由tzszw2007/07/24 03:52pm 发表的内容:
非常感谢LXL和smileboy 老师,等晚上有空认真学习一下你们在45到47楼的精典讲解,再对CZY老师原来给出的公式进行消化理解,争取进行精简改进,以进一步提高运行效率和速度。       这个速度太慢实在令人难以忍受 ...

http://bbs.egrid2000.com/cgi-bin/topic.cgi?forum=2&topic=30&show=0

 回到顶部
帅哥哟,离线,有人找我吗?
tzszw
  50楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:蒙面侠 帖子:2409 积分:400 威望:0 精华:0 注册:2006/8/14 19:31:00
  发帖心情 Post By:2007/7/24 21:23:00 [只看该作者]

[这个贴子最后由tzszw在 2007/07/24 10:48pm 第 2 次编辑]

下面引用由tzszw2007/07/23 11:23pm 发表的内容:
请CZY老师再看看这个帖子!能否再优化一下公式,再提高生成导出数据的速度!(目前仅每生成一次就要花3-4分钟时间,类似“死机”。)
因为导出数据生成后再加上从系统与抄表机的交换、转换(先导出为TXT的,再 ...

呵呵,这个地方做了一张图示的,但忘记上传了,现补上,我想如果当初就上传的话,CZY老师一定会看到很明白的,在此致歉!

呵呵,研究了半天,对CZY老师给的公式就是弄不懂,改了几次,都没得到正确结果,我这个学生可能是太笨了,还是请CZY老师有空对我41楼的内容修改一下吧!先再次谢谢CZY老师!


 回到顶部