易表在线答疑技术与交流应用技巧 → 关于程序和数据分离方案之易行天下版


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

主题:关于程序和数据分离方案之易行天下版

帅哥哟,离线,有人找我吗?
易行天下
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:150 积分:0 威望:0 精华:0 注册:2006/12/13 9:01:00
关于程序和数据分离方案之易行天下版  发帖心情 Post By:2007/1/18 10:29:00 [只看该作者]

首先感谢昨天大家对关于程序和数据分离的预想草案的关注,综合大家的回复易行天下于昨晚重新设计测试,现将通过测试的可行草案罗列如下,在此也感谢各位热心的斑竹尤其是czy斑竹对易行天下每次提问的热忱回答!
此次测试的平台是电脑报1407版本,(下周我就可以拿到从国内寄来日本的2006电脑报版本的光盘了,加上论坛的改进主程序就完美无缺了,高兴啊~~)
假设有3个主表,以下是方案的步骤:
1. 在易表制作的系统文件夹中放置一个创建D:\backup的Creat.bat命令,此举在于让系统自动创建数据导出备份的专用文件夹,不让用户手动创建;相关说明见备注1;
2. 在文件验证公式中使用Sendkeys使关闭的叉叉失效,此举在于不出现询问用户是否保存文件的对话框和不给用户存盘的机会(需要变量支持),相关说明见备注2;
3. 在文件预处理公式中使用If和Exist对D:\backup中backup.dll文件是否存在进行判断,如果不存在则立即执行Openlink(”\Creat.bat”)创建D:\backup文件夹,并用Msgbox提示用户系统已经在D:\backup创建了备份文件夹,请勿删除或修改,用户点击确认后,立即执行:Backupfile(”D:\backup\backup.dll”),这是重要的步骤,相关说明见备注3;
4. 制作专用的用户菜单,其中设置一个假保存按钮,按钮的公式为ExportDBFile("D:\backup.xls”,6,"表1") and ExportDBFile("D:\backup.xls”,6,"表2") and ExportDBFile("D:\backup.xls”,6,"表3"),这里有蹊跷,因为导出数据的时候主表的视图决定了生成的excel文件的数据内容,因此有必要的话在导出前执行openview命令,显示所有列,完成后再改回当前视图!否则数据将丢失!!相关说明见备注4;
5. 制作专用的退出按钮,按钮公式为Resect和Setvariable以及exit,此举在于让易表不出现对话框不保存文件就立即关闭;
6. 在文件预处理公式中再增加以下内容,ImportDBFile("D:\backup.xls”,6,"表1") and ImportDBFile("D:\backup.xls”,6,"表2") and ImportDBFile("D:\backup.xls”,6,"表3"),这需要几秒钟时间,最好是在打开的菜单方案里的设置一个状态栏显示“正在加载数据…”,不要让用户发觉易表在干什么;数据加载完毕后有必要的话执行一次全部刷新!相关说明见备注5;

以下是备注:
1. 建立Creat.bat命令其实就是用windows记事本输入md命令,如Md  D:\backup,保存后修改后缀名为bat
2. 先创建一个变量,表验证公式中的命令是sendkeys(~)和msgbox(“”,0),原理是如果这个变量的值为**的时候则关闭,否则显示提示并立即确定,用户看不见这个提示出现和关闭的过程;就达到了不能使用叉叉关闭和出现提示对话框的目的(如果出现了是否保存的对话框用户就可以乘机保存了)。需要注意的是如果用户在windows打开了很多任务并且来回切换,sendkeys可能会“找错”对象,因此最好在msgbox中写入“请使用按钮退出”的提示,一旦sendkeys失效,用户也能看到正确的提示而不是一个空的对话框知道如何关闭系统。
3. 此处预处理公式的目的是判断专用的文件夹是否存在,存在则什么都不做,如不存在则打开bat命令创建文件夹,backupfile不是目的,而是一个判断文件夹是否存在的手段,我也找了很久,易表好像只能判断文件是否存在不能判断文件夹是否存在,而且IF只能对backupfile是否成功作出判断,不能对exportdbfile是否成功作出判断,因此不得以,让备份文件担任判断的key了!还需要指出的是,openlink和backupfile不能连续执行,否则只能创建文件夹不能创建备份,因此我在他们中间加了msgbox,而且是返回true值,用户点击确认后立即备份,这样就达到了用户首次打开系统时自动生成备份文件夹和生成系统判断这个文件夹是否存在的key文件的目的,而且如果用户删除了这个文件夹或移动了文件夹,系统都会自动创建,需要注意的是如果移动或删除了文件夹,加载数据将会失败,因此正好可以在msgbox中提醒用户不要操作这个文件夹!同时,首次备份的文件也是系统交给用户时生成的“处女”备份,可以在创建这个备份时以生僻的字母作后缀名,用户无法打开,达到灾难备份时调用恢复的效果(有点拗口,但是请仔细阅读,我是反复测试的)
4. 在这里我需要说明的是,a.导出成excel数据时不能任意指定后缀名,而且如果表中有类似身份证号码之类的数据导出后excel会采用科学计数法保存,那么在加载数据的时候身份证号码就“走形”了;前辈有用eval对身份证号码列进行处理后导出数据的精典范例,这样可以使导出的excel文件身份证号码正确,感谢这样好的方法,不过在加载数据时,合并数据的时候列就错位了!因此导出数据时不能对身份证列进行如上处理,否则加载将失败!这个是excel的弊端,所以我建议可以生成access格式,不过我没有测试;b.导出数据在不保存当前文件的情况下可以顺利执行!所以无需真正地保存当前易表的系统文件后再导出数据!c.另外一个需要注意的问题就是导出前一定要显示所有列,否则导出时仅仅导出了显示的列中的数据!那样的话部分数据将会丢失!!导入的时候则没有关系了,什么视图都可以;
5. 专用的退出按钮也要结合预设的变量,即向变量写入文件验证符合的内容后,清除所有修改标记,执行退出,那样的话就不保存当前文件退出了。
6. 文件验证公式中增加的内容是合并预先生成的excel数据文件,需要提醒的是如果系统中有统计表,那么统计表就无需导出,只需要将必要的数据导出即可,加载数据后立即刷新所有表,那么上次用户“存盘”的数据都可以显示并且在统计表中进行统计。这样做可以减少导出和加载的数据量缩短预处理公式的执行时间。而且为了追求完美,最好在加载前对文件夹的excel文件是否存在进行判断,存在就加载,否则提示用户找不到数据文件,可能是被删除或修改了。另外还有的就是,易表默认空表有一行空行,因此加载完成后应该删除第一行;

最后是易行天下对以上做法利弊的自我评价,也请斑竹们斧正:
优点1. 从整个过程我们都可以看到,易表的文件仅仅是一个“数据编辑分析器”,从来执行过没有真正意义上的存盘,这样的话文件始终都是一个“处女文件”,不会因为反复保存而增大;
优点2. 易表存盘的速度不是很快,数据量大的时候尤为明显,但是导出数据的速度和合并数据的速度还是比较理想的,因此可以让用户存盘的速度得到提高我在测试中300行80列的数据导出用时1秒,比存盘快;打开的速度也应该得到提高!!(我的文件以前经过1年的编辑打开都要5秒);而且很多专用软件打开时需要初始化然后加载数据然后更新等等,也消耗了用户不少时间,但是用户感觉这是专业的表现,既然如此我们也可以做到,通过状态条显示以上过程对于易表来说是易如反掌的事情;
优点3. 达到了程序和数据分离的最终目的了,以后大家上传文件里面都没有数据,岂不快哉?而且如果用户有修改程序的要求也不必担心数据泄露。
优点 4. 不必担心易表系统文件意外被锁或丢失、损坏造成数据丢失!这是一个比较具有实际意义的优点,一旦发生意外,用户使用备份的系统文件同样可以读取数据继续工作;这也是程序和数据分离的根本动机和出发点;

缺点 1. 这个方法对数据量超级大的用户不适用,看过一个论坛的文件,加载需要15分钟,这是不行的;
缺点 2. 系统的设计者需要多方位全盘考虑整个过程,为防止意外发生需要反复测试,确认安全后才能交付使用,否则会带来数据丢失的危险!因此设计上需要万分小心!
缺点 3. 不是缺点的缺点:真正的数据都在指定的文件夹里,一旦文件夹丢失,数据就没有了。

附加一个测试的方法建议:我前段时间上传了一个“公式超长巨无霸”,作用在于用基准数据对数据库的数据进行验证,大家可以制作具有用某一个基准表的来窗口验证数据是否正确,最好再作一个统计表,分别在导出前和加载后对数据库进行统计测试看结果是否相同。


-=-=-=- 以下内容由 易行天下2007年01月19日 07:57am 时添加 -=-=-=-
由于很多系统都在网络环境下使用,因此易行天下经过再次测试,现更新以上发表的部分内容:
更新1:在导出数据时地址的路径不是d:data,而是docdir+"\data"这样数据就导入到了系统所在的服务器文件夹中的data文件夹中!导入数据时也是一样。
更新2:导入时,imoprtdbfile是将文件合并至当前表,因此需要辅助执行opengrid(表1)后再importdbfile,并且是依次执行;为了不让用户看到,最好隐藏表的界面,弹出窗口,在窗口中告诉用户正在加载数据;执行完毕后再


 回到顶部
帅哥哟,离线,有人找我吗?
易行天下
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:150 积分:0 威望:0 精华:0 注册:2006/12/13 9:01:00
  发帖心情 Post By:2007/1/18 11:22:00 [只看该作者]

以上是单机环境的方案,网络环境能否导出数据到服务器我没有条件测试,请斑竹看看?

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


加好友 发短信
等级:蜘蛛侠 帖子:1024 积分:10 威望:0 精华:0 注册:2006/8/12 0:15:00
  发帖心情 Post By:2007/1/19 11:46:00 [只看该作者]

网络环境同样可以自己测试,指定一个本地IP,如192.168.0.5,将公式中的相对路径改为这个IP下的相对路径,自己就能测试了

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


加好友 发短信
等级:论坛游民 帖子:14 积分:0 威望:0 精华:0 注册:2006/8/12 15:03:00
  发帖心情 Post By:2007/1/20 23:39:00 [只看该作者]

如果是网络版系统,多用户操作,可能楼主的方法有问题。

假设如下:
如果A用户在A表里增加了一条新纪录并修改了一条老纪录,这时没有保存;
同时B用户也打开了A表没有做任何操作,
接着,A用户保存退出,结果应该是A表增加一条新纪录并修改了条老纪录;
这时,B用户也保存退出,那将出现戏剧性的结果,数据又被B用户恢复了,A表没有增加数据也没有修改数据。

不知道楼主明白我的意思没有,由于A、B用户无法同步更新数据,而数据导出又不能判断哪次操作是更新了数据,只是最简单的覆盖数据操作,那样是不行的。


 回到顶部
帅哥哟,离线,有人找我吗?
易行天下
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:150 积分:0 威望:0 精华:0 注册:2006/12/13 9:01:00
  发帖心情 Post By:2007/1/22 11:42:00 [只看该作者]

在这里说明一下,敝人使用易表感觉一直不错,除了运行速度和网络功能都满意,在这里我就不说网络功能的缺陷了,出于对数据安全的考虑所以我制作的系统虽然放在服务器中供大家使用但是没有让多个用户同时登陆,所以以上程序数据分离的方案建立在杜绝多用户访问的基础之上。关于杜绝多用户同时访问系统即防止文件被重复打开的方法,我会发帖和大家分享的!在此谢谢您的回复,希望以后多多进行易表使用经验的交流!

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


加好友 发短信
等级:新手上路 帖子:255 积分:0 威望:0 精华:0 注册:2006/8/14 18:21:00
  发帖心情 Post By:2007/3/29 11:09:00 [只看该作者]

非常好!

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


加好友 发短信
等级:论坛游民 帖子:17 积分:0 威望:0 精华:0 注册:2007/3/19 12:16:00
  发帖心情 Post By:2007/4/3 19:38:00 [只看该作者]

内容有些深了,看起来吃力。

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


加好友 发短信
等级:论坛游民 帖子:42 积分:0 威望:0 精华:0 注册:2007/1/2 13:55:00
  发帖心情 Post By:2007/7/6 17:03:00 [只看该作者]

关于杜绝多用户同时访问系统即防止文件被重复打开的方法:可以用文件预处理公式和文件验证公式配合Exist函数和ExportTextFile函数来实现,以下是举例公式:
1、文件验证公式:
If(usertype = 1,If(Exist(docdir+"X.txt") ,DelFile(docdir+"X.txt"),If(Exist(docdir+"X.txt.bak") ,DelFile(docdir+"X.txt.bak"), True)),If(Exist(docdir+"Y.txt") ,DelFile(docdir+"Y.txt"),If(Exist(docdir+"Y.txt.bak") ,DelFile(docdir+"Y.txt.bak"), True)))
2、文件预处理公式:
If(usertype = 1,OpenMenu("admin") And OpenGrid("account") And If(Exist(docdir+"Y.txt") or Exist(docdir+"Y.txt.bak"),MsgBox("系统正在被其他用户使用,请不要进行保存操作!",0,4) And ExportTextFile(docdir+"X.txt" ,"," , Char(13),"account","流水号", "=" ,"000000001"),ExportTextFile(docdir+"X.txt" ,"," , Char(13),"account","流水号", "=" ,"000000001")),OpenMenu("ibmis") And OpenGrid("account") And If(Exist(docdir+"Y.txt") or Exist(docdir+"Y.txt.bak"),MsgBox("系统正在被其他用户使用,您不能打开,请与其他用户联系!",0,4) And ExportTextFile(docdir+"Y.txt" ,"," , Char(13),"account","流水号", "=" ,"000000001") and reset() and Exit(),If(Exist(docdir+"X.txt") or Exist(docdir+"X.txt.bak"),MsgBox("系统正在被管理员使用,请联系系统管理员!",0,4) And ExportTextFile(docdir+"Y.txt" ,"," , Char(13),"account","流水号", "=" ,"000000001") and reset() and Exit(),ExportTextFile(docdir+"Y.txt" ,"," , Char(13),"account","流水号", "=" ,"000000001")))) And CloseRGrid("subsidiary")

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


加好友 发短信
等级:论坛游民 帖子:100 积分:112 威望:0 精华:0 注册:2007/3/21 22:25:00
  发帖心情 Post By:2007/7/8 23:34:00 [只看该作者]

很有研究的地方.

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


加好友 发短信
等级:新手上路 帖子:207 积分:0 威望:0 精华:0 注册:2007/7/10 16:20:00
  发帖心情 Post By:2007/7/10 20:47:00 [只看该作者]

下面引用由candy2007/01/20 11:39pm 发表的内容:
如果是网络版系统,多用户操作,可能楼主的方法有问题。

假设如下:
如果A用户在A表里增加了一条新纪录并修改了一条老纪录,这时没有保存;
同时B用户也打开了A表没有做任何操作,
接着,A用户保存退出,结果应该是A表增加一条新纪录并修改了条老纪录;
这时,B用户也保存退出,那将出现戏剧性的结果,数据又被B用户恢复了,A表没有增加数据也没有修改数据。

不知道楼主明白我的意思没有,由于A、B用户无法同步更新数据,而数据导出又不能判断哪次操作是更新了数据,只是最简单的覆盖数据操作,那样是不行的。
...

我现在遇到与这位朋友同样的问题,不知道楼主有没有好的办法。


 回到顶部
总数 17 1 2 下一页