二维码打印-非EXCEL控件和非SmartForm方式

项目遇到奇葩问题,优化工票打印增加二维码的功能时发现用户的电脑不支持EXCEL的二维码控件,但是二维码是车间MES APP 派工的必要条件而且现在的打印程序已经是EXCEL打印,excel模板有四个sheet页,通过SMARTFORM打印开发的工作量太大,给用户重装软件风险也是太大。因手里刚好有一个C语言编写的画二维码程序,被逼无奈用了一个奇葩思路,通过EXCEL的VBA调用EXE程序,生成一个图像,再通过VBA将图像插入EXCEL。

第一步,更改SMW0可以上传EXE类型文件。将可以绘制二维码的EXE文件类型上传至ERP服务器。

7a33bf3e75c24498aff4a74bd8c58fab.png

第二步,在代码中实现下载exe程序的逻辑,将exe文件放在固定文件夹。代码逻辑要控制判断文件路径是否存在,不存在则创建。exe程序同理,不存在则下载。


FORM DOWNLOAD_BARCODE.
  DATA: LV_OBJDATA LIKE WWWDATATAB,
        LV_OBJ_NAME LIKE WWWDATATAB-OBJID,
        LV_DESTINATION LIKE RLGRAP-FILENAME,
        LV_OBJID LIKE SY-REPID,
        LV_SUBRC LIKE SY-SUBRC.
  DATA:L_RET TYPE ABAP_BOOL,
       LV_ANSWER.
  DATA:LV_FILE TYPE STRING.
  DATA:L_PATH TYPE CHAR128,            " 下载后存放路径
       G_FILEN LIKE WWWDATATAB-OBJID.

  CLEAR L_PATH.
  CONCATENATE 'C:\ERP-DATA\'  'QRmake.exe' INTO L_PATH.

  MOVE L_PATH TO LV_FILE.
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_EXIST
    EXPORTING
      FILE                 = LV_FILE
    RECEIVING
      RESULT               = L_RET
    EXCEPTIONS
      CNTL_ERROR           = 1
      ERROR_NO_GUI         = 2
      WRONG_PARAMETER      = 3
      NOT_SUPPORTED_BY_GUI = 4
      OTHERS               = 5.

  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
               WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    EXIT.
  ENDIF.

  IF L_RET <> 'X'.
    G_FILEN = 'ZQRMAKE'.
*    IF
    MOVE G_FILEN TO LV_OBJ_NAME.

    SELECT RELID OBJID
      FROM WWWDATA
      INTO  CORRESPONDING FIELDS OF LV_OBJDATA
      UP TO 1 ROWS
      WHERE SRTF2 = 0 AND RELID = 'MI'
        AND OBJID = LV_OBJ_NAME.
    ENDSELECT.

    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
      EXPORTING
        KEY         = LV_OBJDATA
        DESTINATION = L_PATH
      IMPORTING
        RC          = LV_SUBRC.
    IF LV_SUBRC = 0.

    ENDIF.
  ENDIF.
ENDFORM 

第三步,ABAP打印工票程序中打印时调用VBA宏:

 


  CALL METHOD DOCUMENT->EXECUTE_MACRO
            EXPORTING
              MACRO_STRING = 'GP.MakeQRCode'
*                param1       = line_count
*                param_count  = 1
            IMPORTING
              ERROR        = ERRORS.

第四步,在execl模板中编写VBA代码,调用绘制二维码的程序,并将图片插入excel。


Private Point01 As Long, Point02 As Long, Point03 As Long
Private i As Integer

Sub MakeQRCode()
    If Dir("C:\ERP-DATA\QRmake.exe") = "" Then
        MsgBox "QRmake.exe文件丢失,请确认!", vbCritical, "外部程序调用"
        Exit Sub
    End If
    Sheets("GP").Select
    Range("I4:J7").Select
    i = MK_QR(ActiveCell.Value, "10", "5")
End Sub

Function MK_QR(Enc_Dat, ECL, SIZ)
    Dim F_Name As String
    F_Name = "[" & ActiveWorkbook.Name & "]" & ActiveSheet.Name & "!" & ActiveCell.Address
    Point01 = Shell("""" & "C:\ERP-DATA\QRmake.exe""" & " /S" & SIZ & " /L" & ECL + 1 & " /O""" & ThisWorkbook.Path & "\" & F_Name & ".bmp"" /T""" & Enc_Dat & """")
    Point02 = OpenProcess(&H100000, 1, Point01)
    Point03 = WaitForSingleObject(Point02, &HFFFFFFFF)
    Point03 = CloseHandle(Point02)
    Point01 = Empty
    Point02 = Empty
    Point03 = Empty
    ActiveCell.Offset(0, 0).Select
    With ActiveSheet.Pictures.Insert(ThisWorkbook.Path & "\" & F_Name & ".bmp")
        .Left = ActiveCell.Left
        .Top = ActiveCell.Top
    End With
     
    ActiveSheet.Shapes(1).Select    '选中第1个图形
    'ActiveSheet.Shapes("Picture 1").Select '或选中名称为Picture 1的图片
    With Selection
        rh = ActiveCell.MergeArea.Height '读取当前单元格(或合并单元格)的高度
        rw = ActiveCell.MergeArea.Width '读取当前单元格(或合并单元格)的宽度
        ph = .Height  '读取当前图形的高度
        pw = .Width  '读取当前图形的宽度
        'f = IIf(rh / ph < rw / pw, rh / ph, rw / pw) '计算不超出格子的允许最大的放大/缩小比例

        .Height = .Height * 0.7    '按该比例调整图形高度
        .Width = .Width * 0.7      '按该比例调整图形宽度
        
        .Top = ActiveCell.Top + (ActiveCell.MergeArea.Height - .Height) / 2 '设置图片顶位置
        .Left = ActiveCell.Left + (ActiveCell.MergeArea.Width - .Width) / 2 '设置图片左位置
    End With
    
     
    '将已经生成的二维码图像删除
    Kill (ThisWorkbook.Path & "\" & F_Name & ".bmp")
    ActiveCell.Offset(0, -1).Select
End Function

效果与EXCEL控件打印效果一致:

7f8b9b0a3b8e430799957718723755f6.png

 

  欢迎关注公众号:总钻风来巡山~~~~~

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
经验证,可于EXCEL的VBA中使用的二维码QRMAKER)控件 、VBA中调用QRmaker 由于VBA的窗体环境和VB中的差不多,所以在VBA窗体中调用QRmaker就不再描述,这里主要说明一下如何在表格中引用QRmaker。 第一步:单击Office按钮,在Excel选项中开启“开发工具”项,从而让“开发工具”选项卡显示出来。 第二步,插入→其他控件,选择QRmaker。 然后就是在合适的地方绘出QRmaker控件,这时会自动进入“设计模式”,单击“属性”可以展开控件的“属性”栏,可根据需要设置相关属性,和VB中的操作雷同。 接下来与VB中不一样的地方就是如何在VBA代码中引用QRmaker控件了,这点和VB中有点小区别。 添加“模块”,添加“过程”,输入代码。 Public Sub QRCodeTest() '定义QRString变量,存储要生成二维码的字符串 Dim QRString As String '给QRString赋值,根据实际情况赋值 QRString = Sheet1.Range("E14") & Sheet1.Range("F14") & ";" & Sheet1.Range("E15") & Sheet1.Range("F15") & ";" & Sheet1.Range("E16") & Sheet1.Range("F16") & "_" & Sheet1.Range("G16") & "_" & Sheet1.Range("F17") & "_" & Sheet1.Range("G17") Sheet1.Select '设置QRmaker的AutoRedraw属性为ArOn Sheet1.QRmaker1.AutoRedraw = ArOn '将字符串传递给QRmaker控件 Sheet1.QRmaker1.InputData = QRString '刷新QRmaker的内容,如果AutoRedraw属性为On,则无需此句 'Sheet1.QRmaker1.Refresh End Sub 然后就可以在Excel表格中生成二维码了,根据实际情况,在填写相关数据后,执行上面的语句就可以了,其他的工作该咋的就咋的吧。
1. 首先,在ALV的程序里面定义一个新的按钮,用于触发打印操作。 2. 在按钮的事件处理中,调用函数 module_name = 'SSF_FUNCTION_MODULE_NAME',获取Smartform的函数模块名。 3. 然后,通过函数 module_name = 'SSF_FUNCTION_MODULE_NAME' 获取的函数模块名,调用函数 module_name,传入需要打印的数据。 4. 最后,调用函数 'SSF_FUNCTION_MODULE_NAME',传入Smartform的函数模块名和需要打印的数据,即可完成打印操作。 以下是示例代码: 1. 定义按钮 DATA: ok_code TYPE sy-ucomm. CASE ok_code. WHEN 'PRINT'. lv_layout-info_fname = 'ZALV_SMARTFORM'. CALL METHOD cl_gui_alv_grid=>get_selected_rows RECEIVING value = lt_sel. LOOP AT lt_sel INTO ls_sel. READ TABLE gt_outtab INTO ls_outtab INDEX ls_sel-index. APPEND ls_outtab TO lt_print. ENDLOOP. CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME' EXPORTING formname = lv_layout-info_fname IMPORTING fm_name = lv_fm_name. CALL FUNCTION lv_fm_name EXPORTING control_parameters = gt_cparams output_options = gt_oparams user_settings = gt_usparams TABLES t_outtab = lt_print. CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME' EXPORTING formname = lv_layout-info_fname IMPORTING fm_name = lv_fm_name EXCEPTIONS no_form = 1 no_function_module = 2 others = 3. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ELSE. CALL FUNCTION lv_fm_name EXPORTING control_parameters = gt_cparams output_options = gt_oparams user_settings = gt_usparams TABLES t_outtab = lt_print. ENDIF. ENDCASE.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝袍先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值