应用场景:
如何在smartform打印程序中使用nast表,来记录打印状态,我们将打印状态定为:未打印、已打印、已不正确地打印。
Nast信息状态表
分析:在nast表中有VSTAT(消息处理状态)字段,0代表未处理;1代表处理成功;2代表已不正确的处理;所以我们可以将要打印的记录记录到表nast中,用这个字段来代表打印状态,然后去调用smartform的function,如果返回值不等于,这代表用户打印了但是是不成功的处理,所以将这张单据的nast中的vstat设置成2。需要使用nast表的四个主键kappl、Objky、kschl、spras。
Objky记录打印的单据号;kschl记录信息类型,我们可以设定自定义规则比如我们的程序编号;spras记录信息的语言;kappl记录信息的筛选条件,因为这张表可能会被用于记录其他信息,所以为了便于区分我们特定smartform的信息记录设为’V7’.
第一步:nast表赋值
SELECT SINGLE spld FROM usr01 INTO nast-ldest WHERE bname = sy-uname. IF sy-subrc <> 0. MESSAGE e018. “打印输出设备出错,请先用事务码SU3维护. ENDIF. nast-spras = ‘1′. nast-kappl = ‘V7′. nast-kschl = ‘Y020′. nast-dimme = ‘X’. “立即打印
nast-objky = fp_wa_header-tknum.”假设要打印的是装运单
第二步:调用smartform,并返回调用成功与否的值
调用smartform的时候传入nast表参数
l_wa_out_option-tddest = fp_nast-ldest. “打印设备 l_wa_out_option-tdcopies = fp_nast-anzal. “副本数 l_wa_out_option-tdimmed = fp_nast-dimme. “立即打印 l_wa_out_option-tddelete = fp_nast-delet. “打印后删除 l_wa_out_option-tdcovtitle = fp_nast-tdcovtitle.“Text for coverpage l_wa_out_option-tdautority = fp_nast-tdautority.“打印:权限 l_wa_out_option-tdcover = fp_nast-tdocover. “打印:封面 l_wa_out_option-tddivision = fp_nast-tddivision.“打印参数,封面的类 l_wa_out_option-tddataset = fp_nast-dsnam.“假脱机请求:名 l_wa_out_option-tdsuffix1 = fp_nast-dsuf1.“假脱机请求:suffx1 l_wa_out_option-tdsuffix2 = fp_nast-dsuf2.“假脱机请求:suffx2 l_wa_out_option-tdcovtitle = fp_nast-tdcovtitle.“打印参数,封面文本 l_wa_out_option-tdarmod = fp_nast-tdarmod.“打印: 存档模式 l_wa_out_option-tddest = fp_nast-ldest.“假脱机: 输出设备 l_wa_out_option-tdarmod = fp_nast-tdarmod.“打印: 存档模式 l_wa_out_option-tdschedule = fp_nast-tdschedule.“发送时间请求
第三步:更新nast表
可以调用RV_MESSAGE_UPDATE_SINGLE来更新nast表。
既然我们已经将打印的单据保存到了nast表,那么我们就可以很容易的实现用户需要区分单据是否已打印的需求了。
假设用户通过选择屏幕选择的装运单数据在内表fp_i_output中。
通过上述我们实现了记录单据是否打印的目的,但也存在一个问题,因为公司存在多种单据的打印,如果都需要记录打印状态,都使用nast表,那么随着时间的推移nast表记录的数据量将会是非常庞大的。当数据量达到一定数量级时,打印程序每次都去查询nast表,程序的性能就会受到影响。