Foxtable(狐表)用户栏目专家坐堂 → [求助]+[分享]开发者删除了数据列和表达式列,怎么写代码和操作才不会影响正常使用和自动升级?


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

主题:[求助]+[分享]开发者删除了数据列和表达式列,怎么写代码和操作才不会影响正常使用和自动升级?

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


加好友 发短信
等级:四尾狐 帖子:977 积分:6835 威望:0 精华:0 注册:2012/4/2 21:49:00
[求助]+[分享]开发者删除了数据列和表达式列,怎么写代码和操作才不会影响正常使用和自动升级?  发帖心情 Post By:2017/6/29 15:21:00 [只看该作者]

      对于一个在用的项目,如果开发者删除了不用的数据列和表达式列,就会导致在用项目启动时出现错误并无法打开,也无法自动升级,必须等开发者发布项目后重新下载、安装项目。
      请问:有没有办法避免这种情况、自动完成升级?

解决办法:
1、删除列操作必须在没有客户登录的时间段进行;
2、删除列后必须马上发布项目;
3、参照6楼和7楼提供的相关代码。
[此贴子已经被作者于2017/7/1 9:42:52编辑过]

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


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/6/29 15:41:00 [只看该作者]

1、表达式列?那个是存放在项目里面的,不存放在数据库,你删除怎么会影响?

 

2、打开后出错提示什么?

 

3、默认的升级,是先连接数据库、加载表之后,才能升级的。建议你改成自己做的升级吧,默认的升级真不好用。


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


加好友 发短信
等级:四尾狐 帖子:977 积分:6835 威望:0 精华:0 注册:2012/4/2 21:49:00
  发帖心情 Post By:2017/6/30 12:44:00 [只看该作者]


图片点击可在新窗口打开查看此主题相关图片如下:2.bmp
图片点击可在新窗口打开查看
过程:

1、开发者先后删除了没用的税金合计(表达式列)、本年税金(数据列)、历年税金(数据列)。

2、客户端启动时出现上述错误信息,没法运行项目。

3、开发者发布项目,客户端启动时上述错误信息依旧,不执行自动升级(自编升级代码)。

4、客户端重新下载、安装项目,运行正常。

[此贴子已经被作者于2017/6/30 12:51:28编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110334 积分:561518 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2017/6/30 14:29:00 [只看该作者]

如果是外部表,确实有这个问题。

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2017/6/30 15:15:00 [只看该作者]

1、你删除的是数据列,而不是表达式列,肯定有问题的啊。

 

2、你删除数据列,数据库就没有对应的列,而你的客户端还有税金合计列,那自然会报错。

 

3、如果修改了表结构,客户端都是会报错的。

 

4、如果想打开项目加载表之前升级,这个升级需要自行编写代码实现。

 

5、如果想绕过去也行,beforeOpenProject事件写代码检测是否要升级,如果要升级,就不加载表打开,如

 

http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=100315&skin=0

 


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


加好友 发短信
等级:四尾狐 帖子:977 积分:6835 威望:0 精华:0 注册:2012/4/2 21:49:00
  发帖心情 Post By:2017/6/30 21:54:00 [只看该作者]

谢谢甜版提供的链接。解决方法如下(红字为相关路径的公共变量):
1、因在beforeOpenProject事件中PublishDate为空值,所以,客户端须引入PublishDate.txt,存放PublishDate值作为备用。
2、项目发布按钮相关代码:因PublishDate只有在项目发布后才能获取真值,所以,包含PublishDate.txt的update1.zip和update2.zip不能通过Syscmd.Project.PublishProject生成(不要选中“发布后自动生成升级包到以下文件夹”选项),即发布项目按钮必须自己编码(调试通过):
Syscmd.Project.PublishProject()'发布项目
Dim s As String = dpath & "Publish\project\PublishDate.txt" '以下生成包含发布日期的文件
FileSys.WriteAllText(s,PublishDate,False, Encoding.Default)
s = dpath & "update.txt" '以下生成包含发布日期和开发版本日期的文件
FileSys.WriteAllText(s,PublishDate & "|" & applicationvertion,False, Encoding.Default)
Dim zip As New zipFile
Dim zFile As String = dpath & "update1.zip" '以下生成项目文件升级包
If FileSys.FileExists(zfile) Then
    FileSys.deletefile(zfile,2,2)
End If
zip.Create(zFile) '创建空文件
zip.AddFolder(dpath & "Publish\project")
zip.Close()
zFile = dpath & "update2.zip" '以下生成系统文件升级包
If FileSys.FileExists(zfile) Then
    FileSys.deletefile(zfile,2,2)
End If
zip.Create(zFile)
zip.AddFolder(dpath & "Publish")
zip.Close()
3、BeforeOpenProject相关代码(调试通过)
IP1 = "1.1.1.1" '内网
IP2 = "2.2.2.2" '外网
IPa = IP1 '初始采用值
ftpAccount = "123" '设置ftp登录用户名
ftppassword = "456" '设置ftp登录密码
'根据内网和外网登录时服务器地址的不同,选择正确IP
If Network.Ping(IP1) = False Then
    IPa = IP2
End If

'设置远程文件管理器的FTP1参数
ftp1 = new FTPClient
ftp1.Host = IPa
ftp1.Account = ftpaccount
ftp1.password = ftppassword
'ftp1.UTF8 = True

'判断是否需要自动更新
If e.file.EndsWith("foxdb") = false Then '非开发状态
    RemoteUpdate = True
    Dim s1 As Date = ftp1.GetFiletime(upath & "update.txt") '服务器上升级文件的日期时间
    Dim s2 As Date = FileSys.ReadAllText(rPath & "\publishdate.txt") '客户端文件的发布日期
    If s1 > s2 Then '如果较现在版本的日期时间新则下载并升级
        zdgx = True '自动更新(变量取首字母)标识
    End If
End If
4、BeforeLoadInnerTable事件代码
If zdgx=True Then
    e.cancel = True
Else
    e.Filter = "[_Identify] Is Null"
End If
5、BeforeLoadOuterTable事件代码
If zdgx = True Then
    e.cancel = True
else

    e.SelectString = "Select * Fro m {" & e.DataTableName & "} Where [_Identify] Is Null"

End If

[此贴子已经被作者于2018/7/19 13:24:20编辑过]

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


加好友 发短信
等级:四尾狐 帖子:977 积分:6835 威望:0 精华:0 注册:2012/4/2 21:49:00
  发帖心情 Post By:2017/6/30 21:54:00 [只看该作者]

6、AfterOpenProject升级代码(调试通过)
If zdgx = True then
    Dim s2 As String = rpath & "\update.txt" '准备保存在客户端的升级文件日期和版本信息
    ftp1.download(upath & "update.txt",s2,False) '静默下载并另存
    Dim s3 As String = filesys.ReadAllText(s2,Encoding.Default)
    Dim s4() As String = s3.Split("|")
    Dim newdate As Date = s4(1)
    Dim oldDate As Date = filesys.ReadAllText(apath & "\bin\version.txt",Encoding.Default) '在用的版本日期
    Dim zip As New zipFile
    Dim s As String
    If olddate = newdate Then '属于小版本升级
        s2 = rpath & "\update1.zip" '升级文件
        ftp1.download(upath & "update1.zip",s2,False)
        zip.Open(s2) '打开升级文件
        zip.Extractall(rpath) '全部解压到客户端运行文件夹
        zip.Close() '关闭升级文件
        FileSys.deleteFile(s2,2,2) '删除升级文件
        s = rpath & "\update.bat" ’建立升级批命令文件
        If filesys.FileExists(s) Then
            filesys.DeleteFile(s)
        End If
        filesys.WriteAllText(s,"@echo off" & vbcrlf,True,Encoding.Default)
        filesys.WriteAllText(s,"taskkill /f /im 即时通讯系统.exe" & vbcrlf,True,Encoding.Default)
        filesys.WriteAllText(s,"echo Wscript.Sleep Wscript.Arguments(0) * 1000>Delay.vbs" & vbcrlf,True,Encoding.Default)
        filesys.WriteAllText(s,"Delay.vbs 3" & vbcrlf,True,Encoding.Default)
        filesys.WriteAllText(s,"del Delay.vbs" & vbcrlf,True,Encoding.Default)
        filesys.WriteAllText(s,"start /d " & path0 & pname & "\程序文件 /max " & ename & vbcrlf,True,Encoding.Default) 'path0为盘符根目录,pname为项目名称,ename为项目可执行文件
        filesys.WriteAllText(s,"del " & s & vbcrlf,True,Encoding.Default)
        Dim Proc As New Process '定义一个新的Process
        Proc.File = s '指定要打开的文件
        Proc.Verb = "Open" '指定动作
        Proc.Start()
        proc.WaitForExit
    Else
        If filesys.DirectoryExists(npath) = False Then ’npath为解压时用到的临时存放升级文件的文件夹
            filesys.CreateDirectory(npath)
        End If
        s2 = npath & "\update2.zip" '重大版本升级文件
        ftp1.download(upath & "update2.zip",s2,False) '静默下载并另存
        zip.Open(s2)
        zip.ExtractAll(npath)
        zip.Close()
        FileSys.deleteFile(s2,2,2)
        s = rpath & "\update.bat" ’建立升级批命令文件
        If filesys.FileExists(s) Then
            filesys.DeleteFile(s)
        End If
        filesys.WriteAllText(s,"@echo off" & vbcrlf,True,Encoding.Default)
        filesys.WriteAllText(s,"taskkill /f /im 即时通讯系统.exe" & vbcrlf,True,Encoding.Default)
        filesys.WriteAllText(s,"echo Wscript.Sleep Wscript.Arguments(0) * 1000>Delay.vbs" & vbcrlf,True,Encoding.Default)
        filesys.WriteAllText(s,"Delay.vbs 3" & vbcrlf,True,Encoding.Default)
        filesys.WriteAllText(s,"xcopy " & npath & "*.* " & path0 & pname & "\程序文件\ /y /q /s" & vbcrlf,True,Encoding.Default)
        filesys.WriteAllText(s,"Delay.vbs 3" & vbcrlf,True,Encoding.Default)
        filesys.WriteAllText(s,"rd /q /s " & npath & vbcrlf,True,Encoding.Default)
        filesys.WriteAllText(s,"del Delay.vbs" & vbcrlf,True,Encoding.Default)
        filesys.WriteAllText(s,"start /d " & path0 & pname & "\程序文件 /max " & ename & vbcrlf,True,Encoding.Default)
        filesys.WriteAllText(s,"del " & s & vbcrlf,True,Encoding.Default)
        Dim Proc As New Process '定义一个新的Process
        Proc.File = s '指定要打开的文件
        Proc.Verb = "Open" '指定动作
        Proc.Start()
        proc.WaitForExit
    End If
Else
    Forms("用户登录").Open()
End If

[此贴子已经被作者于2017/7/1 9:16:22编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110334 积分:561518 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2017/6/30 22:26:00 [只看该作者]

一句就行

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


加好友 发短信
等级:三尾狐 帖子:655 积分:6100 威望:0 精华:0 注册:2013/10/22 12:15:00
  发帖心情 Post By:2017/7/1 10:06:00 [只看该作者]


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


加好友 发短信
等级:七尾狐 帖子:1553 积分:11003 威望:0 精华:0 注册:2016/9/12 11:18:00
  发帖心情 Post By:2017/9/20 17:54:00 [只看该作者]

mark

 回到顶部