以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  生成报告报错,报告生成成功,最后报错。  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=179702)

--  作者:foxtablefanse
--  发布时间:2022/9/4 21:07:00
--  生成报告报错,报告生成成功,最后报错。
Dim fld As String  \'选择的保存目录路径
Dim dlg As New FolderBrowserDialog  \'打开目录对话框
dlg.SelectedPath = GetConfigValue("savefolder",ProjectPath & "Reports\\") \'读取以前选择目录记录,
If dlg.ShowDialog = DialogResult.Ok Then
    fld =dlg.SelectedPath
    SaveConfigValue("savefolder", dlg.SelectedPath) \'保存此次选择
End If

\'生成报告
Dim tb As Table=Tables("检测报告_Table1")
 \'生成单位报告
    If tb.Current IsNot Nothing Then
        Dim cr As Row=tb.Current
        Dim tm As String  = ProjectPath & "Attachments\\起重机检验报告模板.doc" \'指定模板文件
        Dim fl As String = fld & "\\" & cr("InwordNo") & "检测报告.doc" \'指定目标文件,含牌照号或自编号
        
        If FileSys.FileExists(fl) Then
            Dim Result As DialogResult
            Result = Messagebox.Show("文件已经存在!是否替换","提示",MessageBoxButtons.YesNo,MessageBoxIcon.Question)
            If Result = DialogResult.Yes Then
                FileSys.DeleteFile(fl,2,2) \'则彻底删除之
            Else
                Return 0
            End If
        End If
        Dim wrt As New WordReport(tb,tm,fl) \'定义一个WordReport
        wrt.BuildOne(cr)
        wrt.Quit ‘这个应该写在哪里?
        wrt.Show() \'显示报表
    End If



有关调用实时(JIT)调试而不是此对话框的详细信息,
请参见此消息的结尾。

************** 异常文本 **************
System.Reflection.TargetInvocationException: 调用的目标发生了异常。 ---> System.NullReferenceException: 未将对象引用设置到对象的实例。
   在 Foxtable.WordReport.Show()
   在 FunctionTopsc.foxtops_Menu(Object sender, Object fftt)
   --- 内部异常堆栈跟踪的结尾 ---
   在 System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   在 System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   在 System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
   在 Foxtops.FunctionsExecute.ghlMsu5k3mAkZCYQ0dM(Object , Object , Object )
   在 Foxtops.FunctionsExecute.Execute(String methonname, Object[] ob)
   在 Foxtops.Wind.NOftbNR1BI3ddKgT0Ly(Object , Object )
   在 Foxtops.Wind.Jn43kCxX3W(Object  , EventArgs  )
   在 System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
   在 System.Windows.Forms.ToolStripButton.OnClick(EventArgs e)
   在 System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
   在 System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
   在 System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met)
   在 System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met)
   在 System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
   在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   在 System.Windows.Forms.Control.WndProc(Message& m)
   在 System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   在 System.Windows.Forms.ToolStrip.WndProc(Message& m)
   在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

[此贴子已经被作者于2022/9/4 21:09:43编辑过]

--  作者:有点蓝
--  发布时间:2022/9/4 21:26:00
--  
如果会要显示报告,去掉【wrt.Quit】。如果不需要显示,去掉【wrt.Show】。只能留一个
--  作者:foxtablefanse
--  发布时间:2022/9/4 22:00:00
--  
生成单个的,这样处理可以了,现在是要批量生成,生成一个后报错,后面就无法生成了


图片点击可在新窗口打开查看此主题相关图片如下:360截图18141222106141138.png
图片点击可在新窗口打开查看

\'生成报告
Dim tb As Table=Tables("检测报告_Table1")
If tb.ShowCheckBox Then  \'批量生成
    Dim rs As List(of Row) =tb.GetCheckedRows
    If rs.Count > 0 Then \'如果存在符合条件的行
        Dim tm As String  = ProjectPath & "Attachments\\起重机检验报告模板.doc" \'指定模板文件
        Dim fl As String
        For Each r As Row In rs \'逐行生成报表
            fl  = fld & "\\" & r("InwordNo") & "检测报告.doc" \'指定目标文件
            Dim wrt As New WordReport(tb,tm,fl) \'定义一个WordReport
            If FileSys.FileExists(fl) Then \'如果指定的文件存在
                FileSys.DeleteFile(fl,2,2) \'则彻底删除之
            End If
            wrt.BuildOne(r)
            wrt.Quit
        Next
    End If
Else  \'生成单位报告
end if

--  作者:有点蓝
--  发布时间:2022/9/4 22:19:00
--  
已经有某个编号的文件存在。考虑先清空报告目录里的文件,再生成
--  作者:foxtablefanse
--  发布时间:2022/9/5 7:51:00
--  
这个和帮助里的有区别,帮助里的按行批量生成最终是一个文件,我的要求是每行生成一个文件,文件名以 r("inwordNo") & "固定字符.doc"  方式命名的。
[此贴子已经被作者于2022/9/5 7:51:48编辑过]

--  作者:有点蓝
--  发布时间:2022/9/5 9:00:00
--  
一样的东西,不管使用什么方式命名。肯定有某个名称的文件已经存在,并且处于打开状态。请先清空报告目录再重新生成
--  作者:foxtablefanse
--  发布时间:2022/9/5 10:19:00
--  
问题是我想把批量生成的文档放在同一个目录,不想一个文档一个目录!没有搞懂文档生成过程机理,所以不知道怎么调整代码
[此贴子已经被作者于2022/9/5 10:23:00编辑过]

--  作者:有点蓝
--  发布时间:2022/9/5 10:38:00
--  
上面的代码已经是同一个目录了

fl  = fld & "\\" & r("InwordNo") & "检测报告.doc" \'指定目标文件

--  作者:foxtablefanse
--  发布时间:2022/9/5 18:33:00
--  
没理解我的问题呵,初衷是生成在一个目录里,而不是清空目录再生成下一个。
--  作者:有点蓝
--  发布时间:2022/9/5 20:09:00
--  
我的意思是3楼的错误提示的原因是:可能之前执行过代码,已经生成了同名文件的报表,且这个报表处于打开状态。

所以我的建议是:要么清空之前生成的文件,再重新生成;要么加一个判断,如果有同名的文件就提示用户关闭打开的文件删除掉再操作