自动打印自定义采购入库单
JEFF
2012-12-31
所有输出类型的设置都可以通过NACE进入设置;
这里我们新定义了一个打印输出类型专为采购收货时用;
在收货处理子程序中复制出标准程序SAPM07DR改为ZSAPM07DR_GR,表格为我们自定义的SMARTFORMS即ZSD_GOODS_REC,FORM子程序用默认的ENTRY_WE01;
如果是用SCRIPT FORM开发的FORM,那要在表格中输入我们开发好的SCRIPT FORM,这里我们用的是SMART FORM,所以填入快捷表格栏位中;
输出类型设好后要分配输出确定过程;
下面我们看一下FORM是如何开发的(略);
表格属性默认设置,有自定义了一个Style:ZSD_GOODS_STY,只要定义了字体大小,段落情况; 表格接口需要定义显示用的内表,分别参考结构ZSDE_REC_MAIN和ZSDE_REC_TOP;
ZSDE_REC_MAIN结构如下;
ZSDE_REC_TOP结构如下;
全局定义设置如下;
字段符号定义如下:
如果需求公司LOGO,那在新页面的背景图片中可以设置,不过需要先用SE78上传需要图片,如果需要条形码还可以通过SE73设置相应的条码信息;
以下为FORM抬头部分设置,用了一个循环把抬头表中的内容取出;
;
主窗口中TABLE中设置如下,所显示内容是抬头中对应物料凭证的内容,按物料凭证项目号排序;
最终效果如下;
标准物料凭证打印的事务码是MB90,且此程序还可以用来高度我们自己开发的打印程序及FORM;
下面我们来看一下如果修改复制出来的标准ZSAPM07DR_GR;
REPORT ZSAPM07DR_GR.
TABLES:NAST,*NAST,TNAPR,MKPF,MSEG.”其中NAST是标准的存放打印信息的,对于物料收货存放的是入库凭证+年度+项目
DATA: LF_FM_NAME TYPE RS38L_FNAM.”这个是标准的打印FORM时的变量
DATA XSCREEN(1) TYPE C. DATA RETCO LIKE SY-SUBRC.
DATA: BEGIN OF NAST_KEY, MBLNR LIKE MKPF-MBLNR, MJAHR LIKE MKPF-MJAHR, ZEILE LIKE MSEG-ZEILE,
END
OF
NAST_KEY.
DATA IT_MAIN LIKE ZSDE_REC_MAIN OCCURS 0 WITH HEADER LINE. DATA IT_TOP LIKE ZSDE_REC_TOP OCCURS 0 WITH HEADER LINE.
*&---------------------------------------------------------------------*
*& Form entry_we01
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->ENT_RETCO text * -->ENT_SCREEN text
*----------------------------------------------------------------------*
FORM ENTRY_WE01 USING ENT_RETCO ENT_SCREEN.”这就是后台设置时对应的子程序,复制过来的子程序尽可能不要动到其抬对部分 XSCREEN = ENT_SCREEN. CLEAR ENT_RETCO.
PERFORM LESEN USING NAST-OBJKY. ENT_RETCO = RETCO.
ENDFORM. "entry_we01
*&---------------------------------------------------------------------*
*& Form lesen
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_NAST_OBJKY text
*----------------------------------------------------------------------*
FORM LESEN USING OBJKY.
* NAST_KEY-MBLNR = OBJKY+0(10). * NAST_KEY-MJAHR = OBJKY+10(4). * NAST_KEY-ZEILE = OBJKY+14(4). NAST_KEY = OBJKY.
IF NAST_KEY-ZEILE = 0001.”因为是选择的个别单据打印,所以如果一个凭证中有多个ITEM,就会打印多次相同的单据,这个地方判断一下可以只打印一份 CLEAR RETCO.
SELECT SINGLE * FROM MKPF INTO MKPF WHERE MBLNR = NAST_KEY-MBLNR AND MJAHR = NAST_KEY-MJAHR. SELECT SINGLE * FROM MSEG INTO MSEG WHERE MBLNR = MKPF-MBLNR AND ZEILE = NAST_KEY-ZEILE AND MJAHR = MKPF-MJAHR.
IF SY-SUBRC NE 0.”根据NAST中的凭证内容就可以找到我们需要显示的所有信息 RETCO = SY-SUBRC. EXIT. ENDIF.
* CHECK SY-SUBRC = 0.
SELECT A~LIFNR A~ZEILE C~NAME1 B~MBLNR B~BUDAT A~EBELN A~EBELP A~LGORT A~LIFNR D~LGOBE A~MATNR
E~MAKTX A~MEINS A~MENGE F~BSTRF F~MABST INTO CORRESPONDING FIELDS OF TABLE IT_MAIN FROM MSEG AS A
INNER JOIN MKPF AS B ON B~MBLNR = A~MBLNR AND B~MJAHR = A~MJAHR INNER JOIN LFA1 AS C ON A~LIFNR = C~LIFNR
INNER JOIN T001L AS D ON D~LGORT = A~LGORT AND D~WERKS = A~WERKS INNER JOIN MAKT AS E ON E~MATNR = A~MATNR
INNER JOIN MARC AS F ON F~MATNR = A~MATNR AND F~WERKS = A~WERKS"
物料+工厂
WHERE A~MJAHR = NAST_KEY-MJAHR
AND A~MBLNR = NAST_KEY-MBLNR.
IF SY-SUBRC = 0.”以上是捞取我们需要的所有信息 LOOP AT IT_MAIN.
CONCATENATE IT_MAIN-EBELN '/' IT_MAIN-EBELP INTO IT_MAIN-ORDNM. CONCATENATE IT_MAIN-LGORT '/' IT_MAIN-LGOBE INTO IT_MAIN-SL. MODIFY IT_MAIN. ENDLOOP.
MOVE-CORRESPONDING IT_MAIN TO IT_TOP. APPEND IT_TOP.
ELSE.
MESSAGE S888(ZSRM) WITH '根据条件找不到数据!' DISPLAY LIKE 'E'. STOP.
LEAVE TO LIST-PROCESSING. ENDIF.
*---------------打印参数设置----------------------------------*
OUTPUT_OPTIONS-TDCOPIES = '3'. "副本数根据USER要求每次需要打印3份 * output_options-tdnoprev = 'X'. "无打印预览 * OUTPUT_OPTIONS-TDNEWID = 'X'. "New Spool
OUTPUT_OPTIONS-TDIMMED = 'X'. "立即打印
OUTPUT_OPTIONS-TDDELETE = 'X'. "Delete Spool After Print * OUTPUT_OPTIONS-TDFINAL = 'X'.
* OUTPUT_OPTIONS-TDIEXIT = 'X'. "Exit after printing in print preview
* OUTPUT_OPTIONS-TDDEST = 'WI'.
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'”得到FORM名称 EXPORTING
FORMNAME = 'ZSD_GOODS_REC' * VARIANT = ' ' * DIRECT_CALL = ' ' IMPORTING
FM_NAME = LF_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. ENDIF.
CALL FUNCTION LF_FM_NAME”打印FORM * EXPORTING
* OUTPUT_OPTIONS = OUTPUT_OPTIONS * SPAGE1 = SPAGE * IMPORTING
* JOB_OUTPUT_OPTIONS = T_OUTPUT_OPTIONS TABLES
IT_TOP = IT_TOP IT_MAIN = IT_MAIN. IF SY-SUBRC = 0.
* IF T_OUTPUT_OPTIONS-TDPREVIEW NE 'X'.
* modify zqcc_mm_00_top from table it_tab_head. * endif. ENDIF. ENDIF.
ENDFORM. " lessen
第一次进入MIGO收货时系统会提示如下;
那是因为我们有用SU3在个人参数中设了NDR,这就提醒做收货的人要将打印打上;
如果在打印的过程中,系统并没有后台执行打印,且会弹出如下对话框,这里说明系统根据打印输出类型设置中指定的条件未找到打印机;
如出现以下错误,也可以通过ST22查看错误具体内容;
我们设的打印参数是用户参数;
即根据用户参数中设置的打印机打印,所以我们需要在SU3中设置打印机才行;
因为以上设置影响的范围是整个CLIENT,如果只是针对某个工厂那该如何设置呢? 首款输出类型中要设打印参数为工厂/仓位;
再进入OMJ3设对应工厂/仓位的打印机,及是否立即打印等;
SMARTFORMS调试的方法一般有两种,一是在SMARTFORMS中的程序行中加入BREAK-POINT或是BREAK username,再打印或预览时就会停在断点处,另一种方法是直接通过SMARTFORMS对应的FUNCTION NAME到SE37中设置断点的方法调试。
>>Done
自动打印自定义采购入库单
JEFF
2012-12-31
所有输出类型的设置都可以通过NACE进入设置;
这里我们新定义了一个打印输出类型专为采购收货时用;
在收货处理子程序中复制出标准程序SAPM07DR改为ZSAPM07DR_GR,表格为我们自定义的SMARTFORMS即ZSD_GOODS_REC,FORM子程序用默认的ENTRY_WE01;
如果是用SCRIPT FORM开发的FORM,那要在表格中输入我们开发好的SCRIPT FORM,这里我们用的是SMART FORM,所以填入快捷表格栏位中;
输出类型设好后要分配输出确定过程;
下面我们看一下FORM是如何开发的(略);
表格属性默认设置,有自定义了一个Style:ZSD_GOODS_STY,只要定义了字体大小,段落情况; 表格接口需要定义显示用的内表,分别参考结构ZSDE_REC_MAIN和ZSDE_REC_TOP;
ZSDE_REC_MAIN结构如下;
ZSDE_REC_TOP结构如下;
全局定义设置如下;
字段符号定义如下:
如果需求公司LOGO,那在新页面的背景图片中可以设置,不过需要先用SE78上传需要图片,如果需要条形码还可以通过SE73设置相应的条码信息;
以下为FORM抬头部分设置,用了一个循环把抬头表中的内容取出;
;
主窗口中TABLE中设置如下,所显示内容是抬头中对应物料凭证的内容,按物料凭证项目号排序;
最终效果如下;
标准物料凭证打印的事务码是MB90,且此程序还可以用来高度我们自己开发的打印程序及FORM;
下面我们来看一下如果修改复制出来的标准ZSAPM07DR_GR;
REPORT ZSAPM07DR_GR.
TABLES:NAST,*NAST,TNAPR,MKPF,MSEG.”其中NAST是标准的存放打印信息的,对于物料收货存放的是入库凭证+年度+项目
DATA: LF_FM_NAME TYPE RS38L_FNAM.”这个是标准的打印FORM时的变量
DATA XSCREEN(1) TYPE C. DATA RETCO LIKE SY-SUBRC.
DATA: BEGIN OF NAST_KEY, MBLNR LIKE MKPF-MBLNR, MJAHR LIKE MKPF-MJAHR, ZEILE LIKE MSEG-ZEILE,
END
OF
NAST_KEY.
DATA IT_MAIN LIKE ZSDE_REC_MAIN OCCURS 0 WITH HEADER LINE. DATA IT_TOP LIKE ZSDE_REC_TOP OCCURS 0 WITH HEADER LINE.
*&---------------------------------------------------------------------*
*& Form entry_we01
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->ENT_RETCO text * -->ENT_SCREEN text
*----------------------------------------------------------------------*
FORM ENTRY_WE01 USING ENT_RETCO ENT_SCREEN.”这就是后台设置时对应的子程序,复制过来的子程序尽可能不要动到其抬对部分 XSCREEN = ENT_SCREEN. CLEAR ENT_RETCO.
PERFORM LESEN USING NAST-OBJKY. ENT_RETCO = RETCO.
ENDFORM. "entry_we01
*&---------------------------------------------------------------------*
*& Form lesen
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_NAST_OBJKY text
*----------------------------------------------------------------------*
FORM LESEN USING OBJKY.
* NAST_KEY-MBLNR = OBJKY+0(10). * NAST_KEY-MJAHR = OBJKY+10(4). * NAST_KEY-ZEILE = OBJKY+14(4). NAST_KEY = OBJKY.
IF NAST_KEY-ZEILE = 0001.”因为是选择的个别单据打印,所以如果一个凭证中有多个ITEM,就会打印多次相同的单据,这个地方判断一下可以只打印一份 CLEAR RETCO.
SELECT SINGLE * FROM MKPF INTO MKPF WHERE MBLNR = NAST_KEY-MBLNR AND MJAHR = NAST_KEY-MJAHR. SELECT SINGLE * FROM MSEG INTO MSEG WHERE MBLNR = MKPF-MBLNR AND ZEILE = NAST_KEY-ZEILE AND MJAHR = MKPF-MJAHR.
IF SY-SUBRC NE 0.”根据NAST中的凭证内容就可以找到我们需要显示的所有信息 RETCO = SY-SUBRC. EXIT. ENDIF.
* CHECK SY-SUBRC = 0.
SELECT A~LIFNR A~ZEILE C~NAME1 B~MBLNR B~BUDAT A~EBELN A~EBELP A~LGORT A~LIFNR D~LGOBE A~MATNR
E~MAKTX A~MEINS A~MENGE F~BSTRF F~MABST INTO CORRESPONDING FIELDS OF TABLE IT_MAIN FROM MSEG AS A
INNER JOIN MKPF AS B ON B~MBLNR = A~MBLNR AND B~MJAHR = A~MJAHR INNER JOIN LFA1 AS C ON A~LIFNR = C~LIFNR
INNER JOIN T001L AS D ON D~LGORT = A~LGORT AND D~WERKS = A~WERKS INNER JOIN MAKT AS E ON E~MATNR = A~MATNR
INNER JOIN MARC AS F ON F~MATNR = A~MATNR AND F~WERKS = A~WERKS"
物料+工厂
WHERE A~MJAHR = NAST_KEY-MJAHR
AND A~MBLNR = NAST_KEY-MBLNR.
IF SY-SUBRC = 0.”以上是捞取我们需要的所有信息 LOOP AT IT_MAIN.
CONCATENATE IT_MAIN-EBELN '/' IT_MAIN-EBELP INTO IT_MAIN-ORDNM. CONCATENATE IT_MAIN-LGORT '/' IT_MAIN-LGOBE INTO IT_MAIN-SL. MODIFY IT_MAIN. ENDLOOP.
MOVE-CORRESPONDING IT_MAIN TO IT_TOP. APPEND IT_TOP.
ELSE.
MESSAGE S888(ZSRM) WITH '根据条件找不到数据!' DISPLAY LIKE 'E'. STOP.
LEAVE TO LIST-PROCESSING. ENDIF.
*---------------打印参数设置----------------------------------*
OUTPUT_OPTIONS-TDCOPIES = '3'. "副本数根据USER要求每次需要打印3份 * output_options-tdnoprev = 'X'. "无打印预览 * OUTPUT_OPTIONS-TDNEWID = 'X'. "New Spool
OUTPUT_OPTIONS-TDIMMED = 'X'. "立即打印
OUTPUT_OPTIONS-TDDELETE = 'X'. "Delete Spool After Print * OUTPUT_OPTIONS-TDFINAL = 'X'.
* OUTPUT_OPTIONS-TDIEXIT = 'X'. "Exit after printing in print preview
* OUTPUT_OPTIONS-TDDEST = 'WI'.
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'”得到FORM名称 EXPORTING
FORMNAME = 'ZSD_GOODS_REC' * VARIANT = ' ' * DIRECT_CALL = ' ' IMPORTING
FM_NAME = LF_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. ENDIF.
CALL FUNCTION LF_FM_NAME”打印FORM * EXPORTING
* OUTPUT_OPTIONS = OUTPUT_OPTIONS * SPAGE1 = SPAGE * IMPORTING
* JOB_OUTPUT_OPTIONS = T_OUTPUT_OPTIONS TABLES
IT_TOP = IT_TOP IT_MAIN = IT_MAIN. IF SY-SUBRC = 0.
* IF T_OUTPUT_OPTIONS-TDPREVIEW NE 'X'.
* modify zqcc_mm_00_top from table it_tab_head. * endif. ENDIF. ENDIF.
ENDFORM. " lessen
第一次进入MIGO收货时系统会提示如下;
那是因为我们有用SU3在个人参数中设了NDR,这就提醒做收货的人要将打印打上;
如果在打印的过程中,系统并没有后台执行打印,且会弹出如下对话框,这里说明系统根据打印输出类型设置中指定的条件未找到打印机;
如出现以下错误,也可以通过ST22查看错误具体内容;
我们设的打印参数是用户参数;
即根据用户参数中设置的打印机打印,所以我们需要在SU3中设置打印机才行;
因为以上设置影响的范围是整个CLIENT,如果只是针对某个工厂那该如何设置呢? 首款输出类型中要设打印参数为工厂/仓位;
再进入OMJ3设对应工厂/仓位的打印机,及是否立即打印等;
SMARTFORMS调试的方法一般有两种,一是在SMARTFORMS中的程序行中加入BREAK-POINT或是BREAK username,再打印或预览时就会停在断点处,另一种方法是直接通过SMARTFORMS对应的FUNCTION NAME到SE37中设置断点的方法调试。
>>Done