以文本方式查看主题

-  易表在线答疑  (http://egrid2000.com/dvbbs/index.asp)
--  用户社区  (http://egrid2000.com/dvbbs/list.asp?boardid=2)
----  请教各位老师:这个按钮公式有什么问题?  (http://egrid2000.com/dvbbs/dispbbs.asp?boardid=2&id=19928)

--  作者:szscwy1
--  发布时间:2010/9/7 21:39:00
--  请教各位老师:这个按钮公式有什么问题?
设计思路:
我的数据库中数据有2万多条了,并且经常不断追加,增加新数据的方法是使用EXCEL数据表导入(因为是从网络数据中导出来的)的,有些记录是录入过的,因此,导入时先在一个临时表(表名“追加”)中先导入,再与现有数据库表(表名“已发证”)中的数据进行比较(比较公式设在“追加”表的“对比”字段中),如果已经导入过,就标记不追加并删除该重复记录,如果没有导入过,则把“追加”表中的新数据导入到“已发证”表中,并进行相关列的刷新计算,同时标记“追加批次、追加文件名”等内容便于查对。为此设计一导入功能按键,公式为:
Do(112) And if(msgbox("导入前请确认已对EXCEL文件进行了必要处理!",2)= True , if(msgbox("本功能只导入数据库中没有的记录,确定吗?",2)= True ,OpenGrid("追加") And delfor(GridName) And SetVariable("%文件名%",GetFileName("Excel文件|*.xls","从EXCEL文件中导入发证数据" ,0)) And ImportDBFile([%文件名%],6, Substitute(Split([%文件名%],"\\",[%\\号数%]),".xls","")) And DelFor(GridName,"林权申请号", "=","") And RecalcCol("追加","对比") And DelFor("追加","对比", "=" , -1) And Copyrows("已发证") And OpenGrid("已发证") And SetVariable("%文件名%",Substitute(Split([%文件名%],"\\",[%\\号数%]),".xls","")) And RecalcColfor("已发证","座落","追加批次", "=" ,"") And RecalcColfor("已发证",34,"追加批次", "=" ,"") And RecalcColfor("已发证",35,"追加批次", "=" ,"") And RecalcColfor("已发证",36,"追加批次", "=" ,"") And RecalcColfor("已发证",37,"追加批次", "=" ,"") And RecalcColfor("已发证",38,"追加批次", "=" ,""),""),"") And Setvariable("%批次%",maxfor("已发证","追加批次")+1) And ReplaceFor("已发证","追加文件名",[%文件名%],"追加批次", "=" ,"") And ReplaceFor("已发证","追加批次",[%批次%],"追加批次", "=" ,"") And MsgBox("本次追加"+Text([追加!Rows])+"条记录!",1,4)

问题:
   1、点击按钮功能时:有时程序直接退出;有时运行其他程序功能后,再点击运行这一按钮功能,又能正常运行,完成预期功能。请教:为什么有时会不运行而关闭程序退出?(注:系统为正式注册版)
   2、随着数据不断追加,发现运行速度越来越慢。请教:可以怎样优化公式提高运行速度?同时,怎样增加一个提示性的功能,提示进行到了哪一步?

请各位老师指教!学生谢谢了!


--  作者:hbfnmxb
--  发布时间:2010/9/7 22:03:00
--  
能不能把文件发上来.看一下
--  作者:szscwy1
--  发布时间:2010/9/7 22:20:00
--  
谢谢hbfnmxb 老师的回复,因数据保密问题,不方便上传文件!请谅解!期待指教。。。。。。。。
--  作者:Czy
--  发布时间:2010/9/7 22:32:00
--  
[这个贴子最后由Czy在 2010/09/07 10:42pm 第 1 次编辑]

红色字体加删除线的公式严重嵌套。
红色字体公式严格来讲也存在嵌套。
解决方法见帮助中“函数嵌套问题”章节的“2、使用表达式变量”


if(msgbox("导入前请确认已对EXCEL文件进行了必要处理!",2)= True ,
if(msgbox("本功能只导入数据库中没有的记录,确定吗?",2)= True ,
OpenGrid("追加") And
delfor(GridName) And
[s]SetVariable("%文件名%",GetFileName("Excel文件|*.xls","从EXCEL文件中导入发证数据" ,0))[/s]  And
ImportDBFile([%文件名%],6, Substitute(Split([%文件名%],"\\",[%\\号数%]),".xls",""))  And
DelFor(GridName,"林权申请号", "=","") And
RecalcCol("追加","对比") And
DelFor("追加","对比", "=" , -1) And
Copyrows("已发证") And
OpenGrid("已发证") And
SetVariable("%文件名%",Substitute(Split([%文件名%],"\\",[%\\号数%]),".xls",""))  And
RecalcColfor("已发证","座落","追加批次", "=" ,"") And
RecalcColfor("已发证",34,"追加批次", "=" ,"") And
RecalcColfor("已发证",35,"追加批次", "=" ,"") And
RecalcColfor("已发证",36,"追加批次", "=" ,"") And
RecalcColfor("已发证",37,"追加批次", "=" ,"") And
RecalcColfor("已发证",38,"追加批次", "=" ,""),""),"") And
Setvariable("%批次%",maxfor("已发证","追加批次")+1) And
ReplaceFor("已发证","追加文件名",[%文件名%],"追加批次", "=" ,"") And
ReplaceFor("已发证","追加批次",[%批次%],"追加批次", "=" ,"") And
MsgBox("本次追加"+Text([追加!Rows])+"条记录!",1,4)


--  作者:Czy
--  发布时间:2010/9/7 22:39:00
--  
论坛似乎有bug,文字怎么不能着色了,看下面的图片。


--  作者:Czy
--  发布时间:2010/9/7 22:40:00
--  
楼主也可以复制4楼的公式到回帖中,然后预览一下即可看到。
--  作者:szscwy1
--  发布时间:2010/9/7 22:56:00
--  
谢谢总版主!找到问题了,那就用变量来中转吧!非常感谢!!

比较两个表中的数据,表的字段结构一样,其中一个字段(“林权申请号”)的数据是唯一的,我用这个列数据与“已发证”数据表的同列数据作个数统计逐一比较(如在临时表中增加一个“对比”字段,对这个字段设计一个刷新公式:if(CountFor("已发证","林权申请号", "=" ,[林权申请号])>0,-1,0)),大于0则认为已经有记录,否则认为没有导入过。请问有什么方法比这个运算快!谢谢!


--  作者:Czy
--  发布时间:2010/9/7 23:02:00
--  
CountFor是易表中效率最低的函数,建议改用FinRow,如:

FindRow("已发证","林权申请号", "=" ,[林权申请号])>0

上面的公式加不加if判断一样的,所以这里略去了if


--  作者:szscwy1
--  发布时间:2010/9/7 23:38:00
--  
谢谢总版主!改用这个函数试试!大大的收获!!!!

上面那个导入数据功能的公式,我把您划删除线的那行命令提前到if函数前面,运行就没有关闭退出了!再次感谢指教。