以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]+[分享]开发者删除了数据列和表达式列,怎么写代码和操作才不会影响正常使用和自动升级?  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=103041)

--  作者:shenyl0211
--  发布时间:2017/6/29 15:21:00
--  [求助]+[分享]开发者删除了数据列和表达式列,怎么写代码和操作才不会影响正常使用和自动升级?
      对于一个在用的项目,如果开发者删除了不用的数据列和表达式列,就会导致在用项目启动时出现错误并无法打开,也无法自动升级,必须等开发者发布项目后重新下载、安装项目。
      请问:有没有办法避免这种情况、自动完成升级?

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

--  作者:有点色
--  发布时间:2017/6/29 15:41:00
--  

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

 

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

 

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


--  作者:shenyl0211
--  发布时间:2017/6/30 12:44:00
--  


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

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

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

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

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

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

--  作者:有点蓝
--  发布时间:2017/6/30 14:29:00
--  
如果是外部表,确实有这个问题。
--  作者:有点甜
--  发布时间: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
--  发布时间: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
--  发布时间: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编辑过]

--  作者:有点蓝
--  发布时间:2017/6/30 22:26:00
--  
一句就行
--  作者:tongliaozyr
--  发布时间:2017/7/1 10:06:00
--  

--  作者:zhangjian222200
--  发布时间:2017/9/20 17:54:00
--  
mark