以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  二维码打印的速度如何提高  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=183524)

--  作者:happyft
--  发布时间:2022/11/8 14:14:00
--  二维码打印的速度如何提高

图片点击可在新窗口打开查看此主题相关图片如下:二维码.png
图片点击可在新窗口打开查看

drs = DataTables("销售出库单_明细").Select("出库单号 = \'" & pr("出库单号") & "\'")
If drs.count > 0 Then
    For i As Integer = 0 To drs.Count - 1
        If drs(i)("箱数") > 0 Then
            For i3 As Integer = 1 To drs(i)("箱数")
                Dim ra As New prt.RenderArea
                ra.Width = CInt(Vars("tagW")) \'标签宽
                ra.Height = CInt(Vars("tagH")) \'标签高
                
                ra.SplitHorzBehavior = prt.SplitBehaviorEnum.Never \'禁止水平分割
                ra.SplitVertBehavior = prt.SplitBehaviorEnum.Never \'禁止垂直分割
                Doc.Body.ChildRen.Add(ra) \'将容器加入到报表中
                
                Dim rt As New prt.RenderTable
                
                \'指定总列数及各列宽,未指定的平分剩余宽度
                CW = dr("Bodycw") \'""
                Cls = CW.split("|")
                rt.Cols.Count = Cls.Length + 1 \'设置总列数
                For i2 As Integer = 0 To Cls.Length - 1
                    rt.Cols(i2).Width = Cls(i2)
                Next
                
                \'设置表格总体样式-------------------------------------------0
                rt.Style.TextAlignHorz = prt.AlignHorzEnum.left \'文本水平居中
                rt.Style.TextAlignVert = prt.AlignVertEnum.Center \'文本垂直居中
                rt.CellStyle.Spacing.All = 1 \'单元格内容缩进1毫米
                rt.Style.GridLines.All = New prt.Linedef(0.2, Color.Black) \'设置网格线
                rt.Style.Font = New Font("宋体", fs) \'设置总体字体
                rt.SplitHorzBehavior = prt.SplitBehaviorEnum.Never \'表格宽度超出页宽时,可以水平换页
                rt.SplitVertBehavior = prt.SplitBehaviorEnum.Never \'表格宽度超出页宽时,可以水平换页
                
                rt.Rows(rt.Rows.Count).Height = rh
                rt.Cells(rt.Rows.Count - 1, 0).Text = "客户名称"
                rt.Cells(rt.Rows.Count - 1, 1).Text = "xxxxxx" 
                rt.Cells(rt.Rows.Count - 1, 2).Text = "厂商名称"
                rt.Cells(rt.Rows.Count - 1, 3).Text = "xxxxx"
                
                rt.Rows(rt.Rows.Count).Height = rh
                rt.Cells(rt.Rows.Count - 1, 0).Text = "物料名称"
                rt.Cells(rt.Rows.Count - 1, 1).Text = drs(i)("品名") 
                rt.Cells(rt.Rows.Count - 1, 2).Text = "采购订单号"
                rt.Cells(rt.Rows.Count - 1, 3).Text = drs(i)("来源单号")
                
                rt.Rows(rt.Rows.Count).Height = 14
                rt.Cells(rt.Rows.Count - 1, 0).Text = "xxxx料号"
                rt.Cells(rt.Rows.Count - 1, 1).Text = drs(i)("产品编码")
                \'B----第2单元格显示条形码--(如果是向上合并行的填充内容必须在第一行)
                Dim ra1 As New prt.RenderArea
                ra1 = rt.Cells(rt.Rows.Count - 1, 1).Area \'引用单元格的容器
                Dim rg2 As prt.RenderGraphics
                Dim Bar2 As New BarCodeBuilder
                Bar2.Symbology = Barpro.Symbology.Code128
                ra1.Stacking = prt.StackingRulesEnum.InlineLeftToRight \'设置容器中对象的排列方式
                bar2.Code = drs(i)("产品编码")
                bar2.BarHeight = 8 \'条码高度
                bar2.BarWidth = 0.14 \'窄条宽度(决定条码的宽度)
                Bar2.QuietZoneWidth = 1 \'静区宽度(两边空白)
                Bar2.BarRatio = 2 \'宽窄比例
                Bar2.CodeAlignment = Barpro.Alignment.BelowCenter \'文本位置
                rg2 = New prt.RenderGraphics
                bar2.DrawOnCanvas(rg2.Graphics, 0, 0, 1)
                ra1.Children.Add(rg2)
                \'B----第2单元格显示条形码--(如果是向上合并行的填充内容必须在第一行)
                
                rt.Cells(rt.Rows.Count - 1, 2).SpanCols = 2
                
                \'B----右侧单元格合并显示二维码--(如果是向上合并行的填充内容必须在第一行)
                Dim ra2 As New prt.RenderArea
                ra2 = rt.Cells(rt.Rows.Count - 1, 2).Area \'引用单元格的容器
                Dim rg As prt.RenderGraphics
                Dim Bar As New BarCodeBuilder
                Bar.Symbology = Barpro.Symbology.QRCode
                ra2.Stacking = prt.StackingRulesEnum.InlineLeftToRight \'设置容器中对象的排列方式
                Bar.Code = drs(i)("产品编码") & "&" & CStr(pr("出库日期")).Replace("-", "/") & "&" & drs(i)("单箱数量") & "&GYSLS03244&PM-" & CStr(pr("出库日期")).Replace("-", "") & Format(i3 , "000")
                Bar.CodeAlignment = Barpro.Alignment.BelowLeft
                Bar.QRCodeModuleSize = 0.8
                Bar.QuietZoneWidth = 1 \'静区宽度(两边空白)
                rg = New prt.RenderGraphics
                bar.DrawOnCanvas(rg.Graphics, 0, 0, 1)
                rg.Style.Spacing.left = 5
                rg.Style.Spacing.top = 2
                ra2.Children.Add(rg)
                \'B----左侧单元格合并显示二维码--(如果是向上合并行的填充内容必须在第一行)
                
                rt.Rows(rt.Rows.Count).Height = 11
                rt.Cells(rt.Rows.Count - 1, 0).Text = "生产日期"
                \'B----显示条形码--(如果是向上合并行的填充内容必须在第一行)
                ra1 = New prt.RenderArea
                ra1 = rt.Cells(rt.Rows.Count - 1, 1).Area \'引用单元格的容器
                rg2 = New prt.RenderGraphics
                Bar2 = New BarCodeBuilder
                Bar2.Symbology = Barpro.Symbology.Code128
                ra1.Stacking = prt.StackingRulesEnum.InlineLeftToRight \'设置容器中对象的排列方式
                bar2.Code = pr("出库日期")
                bar2.BarHeight = 5 \'条码高度
                bar2.BarWidth = 0.21 \'窄条宽度(决定条码的宽度)
                Bar2.QuietZoneWidth = 1 \'静区宽度(两边空白)
                Bar2.BarRatio = 2 \'宽窄比例
                Bar2.CodeAlignment = Barpro.Alignment.BelowCenter \'文本位置
                rg2 = New prt.RenderGraphics
                bar2.DrawOnCanvas(rg2.Graphics, 0, 0, 1)
                ra1.Children.Add(rg2)
                \'B----显示条形码--(如果是向上合并行的填充内容必须在第一行)
                rt.Cells(rt.Rows.Count - 1, 2).SpanCols = 2
                
                rt.Rows(rt.Rows.Count).Height = 11
                rt.Cells(rt.Rows.Count - 1, 0).Text = "MPN号"
                \'B----显示条形码第2单元格--(如果是向上合并行的填充内容必须在第一行)
                ra1 = New prt.RenderArea
                ra1 = rt.Cells(rt.Rows.Count - 1, 1).Area \'引用单元格的容器
                rg2 = New prt.RenderGraphics
                Bar2 = New BarCodeBuilder
                Bar2.Symbology = Barpro.Symbology.Code128
                ra1.Stacking = prt.StackingRulesEnum.InlineLeftToRight \'设置容器中对象的排列方式
                bar2.Code = "JD20220223" \'固定字符
                bar2.BarHeight = 5 \'条码高度
                bar2.BarWidth = 0.23 \'窄条宽度(决定条码的宽度)
                Bar2.QuietZoneWidth = 1 \'静区宽度(两边空白)
                Bar2.BarRatio = 1.5 \'宽窄比例
                Bar2.CodeAlignment = Barpro.Alignment.BelowCenter \'文本位置
                rg2 = New prt.RenderGraphics
                bar2.DrawOnCanvas(rg2.Graphics, 0, 0, 1)
                ra1.Children.Add(rg2)
                \'B----显示条形码第2单元格--(如果是向上合并行的填充内容必须在第一行)
                rt.Cells(rt.Rows.Count - 1, 2).SpanCols = 2
                rt.Cells(rt.Rows.Count - 3, 2).SpanRows = 3 \'向上合并行数
                
                rt.Rows(rt.Rows.Count).Height = 11
                rt.Cells(rt.Rows.Count - 1, 0).Text = "数量"
                \' rt.Cells(rt.Rows.Count - 1, 1).Text = drs(i)("单箱数量")
                \'B----显示条形码第2单元格--(如果是向上合并行的填充内容必须在第一行)
                ra1 = New prt.RenderArea
                ra1 = rt.Cells(rt.Rows.Count - 1, 1).Area \'引用单元格的容器
                rg2 = New prt.RenderGraphics
                Bar2 = New BarCodeBuilder
                Bar2.Symbology = Barpro.Symbology.Code128
                ra1.Stacking = prt.StackingRulesEnum.InlineLeftToRight \'设置容器中对象的排列方式
                bar2.Code = drs(i)("单箱数量") & drs(i)("计量单位").ToUpper() \'单位转大写
                bar2.BarHeight = 5 \'条码高度
                bar2.BarWidth = 0.30 \'窄条宽度(决定条码的宽度)
                Bar2.QuietZoneWidth = 1 \'静区宽度(两边空白)
                Bar2.BarRatio = 1.5 \'宽窄比例
                Bar2.CodeAlignment = Barpro.Alignment.BelowCenter \'文本位置
                rg2 = New prt.RenderGraphics
                bar2.DrawOnCanvas(rg2.Graphics, 0, 0, 1)
                ra1.Children.Add(rg2)
                \'B----显示条形码第2单元格--(如果是向上合并行的填充内容必须在第一行)
                rt.Cells(rt.Rows.Count - 1, 2).SpanCols = 2
                
                ra.ChildRen.Add(rt) \'将容器加入到报表中
            Next
        End If
        
    Next
    
    \'---选择打印方式
    If prt_method = "Preview" Then
        Doc.Preview() \'预览报表
    ElseIf prt_method = "Print" Then
        Doc.Print()
    End If
End If
上面的代码生成四个条码,一个二维码,每次打印数据其实只有几行,只是每行中的箱数可能比较多,都在50到100箱之间
所以每箱遍历生成这几个条码或者二维码,每箱一张,如果50张左右差不多要近50秒才显示出来,想问一下有没有更快的办法?

谢谢!

--  作者:有点蓝
--  发布时间:2022/11/8 14:52:00
--  
可以考虑逐行打印,一行一个报表,而不是全部在一个报表里生成完毕再打印

drs = DataTables("销售出库单_明细").Select("出库单号 = \'" & pr("出库单号") & "\'")
If drs.count > 0 Then
    For i As Integer = 0 To drs.Count - 1
Dim doc As New PrintDoc \'定义一个报表
……生成报表的代码
    \'---选择打印方式
    If prt_method = "Preview" Then
        Doc.Preview() \'预览报表
    ElseIf prt_method = "Print" Then
        Doc.Print()
    End If
   Next 
End If

--  作者:HappyFt
--  发布时间:2022/11/8 17:08:00
--  
明细表中的多行是同一张主表单里面的,不能分开,我是想问一下是否一楼的代码方式运行效率太低了,有没有更高效的方法
--  作者:有点蓝
--  发布时间:2022/11/8 17:12:00
--  
没有什么可以优化的了