SAP abap 语句、命令 语法查询备用
语句:碰到一个写一个
COLLECT语句用法
用于报表数据的合并计算,如果非数据字段值相等,那么数值字段值相加
内表可以不用排序
LOOP AT gtd_test into gth_test.
COLLECT gth_test into gtd_sum.
clear:gth_test.
ENDLOOP.
可以在LOOP循环中先筛选数据后再使用COLLECT语句。
注意事项:collect语句合并所有(类型为I、P、F)的字段,其他类型的字段默认为关键字。
SAP内表去重
DELETE ADJACENT DUPLICATES FROM <内表:gtd_out> COMPARING <字段:ALL FIELDS>.
DELETE 内表语法
1. DELETE itab[ ].
用于loop当中,删除当前loop行,read table 会改变sy-tabix的值,但是不影响该语法执行结果
2.DELETE itab INDEX i.
删除内表中的指定行
3.DELETE TABLE itab FROM wa.
删除内表KEY值与工作区KEY值相同的行, 关键字TABLE不能丢,否则执行会报错
ABAP 如何判断调用smartforms时是进行打印还是预览
SAP abap 动态内表
明天写
SAP 打印自动导出PDF本地文件(自己做的例子)
smartforms导出PDF:
常用函数有;
convert_otf
convert_otfspooljob_2_pdf
convert_abapspooljob_2_pdf
CONVERT_OTF_2_PDF;
SX_OBJECT_CONVER_OTF_PDF;
HRHAP_DOC_CONVERT_SMF_TO_PDF
实例:
FORMexport_pdf.DATA:zsmart_name TYPErs38l_fnam.CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME' EXPORTINGformname= 'ZLE_SHIP_BMEPR' IMPORTINGfm_name=zsmart_nameEXCEPTIONSno_form= 1no_function_module= 2OTHERS= 3.DATA: w_ctrlop TYPE ssfctrlop, "Smart Forms: 控制结构 "W_CONTROL w_compop TYPE ssfcompop, "SAP Smart Forms: 智能写作器 (传输) 选项"W_OUTPUT. w_return TYPE ssfcrescl. "Smart Forms: 表格打印结束时返回值 DATA: len TYPEi,
w_filesizeTYPEi,
g_pdf_xstringTYPExstring,
l_linesTYPE TABLE OF tline WITH HEADER LINE.DATA doctab TYPE TABLE OF docs WITH HEADER LINE.DATA itab LIKE tline OCCURS 0 WITH HEADER LINE DATA: file_name TYPE string,
fullpathTYPE string,
pathTYPE string,
p_sefileLIKE rlgrap-filename VALUE 'D:\'. "'/usr/sap/tmp/'.
w_ctrlop-getotf ='X'."OTF 表的返回
w_ctrlop-no_dialog ='X'."关闭打印对话框
* W_CTRLOP-NO_OPEN ='X'."no dialog box
* W_CTRLOP-NO_CLOSE ='X'."no
*&W_COMPOP-TDNOPRINT ='X'.
w_compop-tdnoprev ='X'."没有打印预览
"W_COMPOP用来设置打印参数弹出对话框中的值,下面这几个参数不必要
* W_COMPOP-TDNEWID ='X'. "New Spool
w_compop-tdimmed ='X'.
w_compop-tddelete =''. "Delete Spool After Print
w_compop-tdfinal ='X'.
w_compop-tdiexit ='X'. "Exit after printing in print preview
w_compop-tddest ='LP02'. "设备名称
w_compop-xdf2outdev ='LP02'.
w_compop-tdarmod ='1'.
*&smartforms打印 ,将打印的值输入到W_RETURN-OTFDATA[]中
CALL FUNCTION zsmart_name
EXPORTING
control_parameters = w_ctrlop
output_options = w_compop
* totalpages = totalpages
* zbukrs = p_bukrs
* zcb = cb
gth_header = gth_alv_sel
IMPORTING
job_output_info = w_return
TABLES
gtd_item = gtd_item
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
user_canceled = 4
OTHERS = 5.
*"CONVERT_OTF函数取不到lines的返回值,所以注释掉,用CONVERT_OTF_2_PDF
* CALL FUNCTION'CONVERT_OTF'* EXPORTING
* format ='PDF'* IMPORTING
* bin_filesize = len
* bin_file = g_pdf_xstring
* TABLES
* otf = w_return-otfdata[]
* lines = itab
* EXCEPTIONS
* err_max_linewidth = 1
* err_format = 2
* err_conv_not_possible = 3
* err_bad_otf = 4
* OTHERS = 5.
CALL FUNCTION'CONVERT_OTF_2_PDF'"转换otf数据为二进制PDF文件
* EXPORTING
* use_otf_mc_cmd ='X'* archive_index = archive_index
IMPORTING
bin_filesize = len
TABLES
otf = w_return-otfdata[]
doctab_archive = doctab
lines = l_lines[]
EXCEPTIONS
err_conv_not_possible = 1
err_otf_mc_noendmarker = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
* CONCATENATE p_sefile sy-uname'-'sy-uzeit'.pdf'INTO file_name. "addrss
* OPEN DATASET file_name FOR OUTPUT IN BINARY MODE." MESSAGE L_MESSAGE_DB.
* IF sy-subrc EQ 0.
* TRANSFER g_pdf_xstring TO file_name.
* CLOSE DATASET file_name.
* ELSE.
* MESSAGE'OPEN ERROR!!'TYPE'E'.
* STOP.
* ENDIF.
CONCATENATE'D:\'sy-uname'-'sy-uzeit' FFF.pdf'INTO file_name.
"定义文件名
"这一段不屏蔽, 在打印的时候会有显示选择路径的对话框,屏蔽则直接保存在上面的文件名
"file_name 指定的路径
CALL METHOD cl_gui_frontend_services=>file_save_dialog "保存文件窗口(选择路径)
EXPORTING
default_extension ='PDF'file_filter ='*.PDF'default_file_name = file_name
CHANGING
filename = file_name
path = path
fullpath = fullpath
* user_action = ua
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
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'GUI_DOWNLOAD'"保存文件在本地
EXPORTING
bin_filesize = len
filename = file_name
filetype ='BIN'IMPORTING
filelength = w_filesize
TABLES
data_tab = l_lines[]
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21
OTHERS = 22.
IF sy-subrc <> 0.
MESSAGE'File not downloaded'TYPE'I'.
ENDIF.
ENDIF.
ENDFORM. "export_pdf
SAP smartforms 字段文本碰见 "-" 自动换行
长文本会在 '-' 这个符号处自动换行
原理:SAP 标准SMARTFORMS 的功能,遇到 '-' 自动判断后面字段是否能在本行完全显示,不够则换行
注意:如果一行文本有多个 ‘-’ ,则 判断 '-' 和下一个 '-' 之间的文本是否能在本行完全显示,不能则换行
例:
str1 = 'SOP4-214-03示例一车间贴标泡罩装盒岗位SOP、SOP2-047-24实例二车间装箱岗位SOP、SOP2-231-57实例三车间激光打印岗位SOP'.
输出后为:(三行,换行2次)
SOP4-214-03示例一车间贴标泡罩装盒岗位SOP、SOP2-047-
24实例二车间装箱岗位SOP、SOP2-231-
57实例三车间激光打印岗位SOP
字符串处理结果:
str1 = 'SOP4-214- 03示例一车间贴标泡罩装盒岗位SOP、SOP2-047- 24实例二车间装箱岗位SOP、SOP2-231- 57实例三车间激光打印岗位SOP'.
输出后为:(不会换行,这里仅为部分替换)
SOP4-214- 03示例一车间贴标泡罩装盒岗位SOP、SOP2-047- 24实例二车间装箱岗位SOP、SOP2-231- 57实例三车间激光打印岗位SOP
解决办法:
可以用
REPLACE '-' WITH '- ' INTO str1.
在 '-' 后加了一个空格,就可以解决了(如果有多个短横线,则需要全部替换,或者部分替换)
好像有能取消这个功能的方法,找了半天没找到,有大神做过的话,发个链接让我等学习学习,不胜感激!
ABAP字符串处理
字符串中包含单引号:单引号前面再加一个单引号
例:jest~stat = 'E0002'
jest~stat = 'E0003' OR jest~stat = 'E0004'
IF z_stat IS INITIAL.
z_stat = 'jest~stat = ''E0002'''.
ELSE.
z_stat = 'jest~stat = ''E0003'' OR jest~stat = ''E0004'''.
ENDIF.
1、连接字符串
CONCATENATE {dobj1 dobj2 ...}|{LINES OF itab}
INTO result
[IN {BYTE|CHARACTER} MODE]
[SEPARATED BY sep]
[RESPECTING BLANKS].
2、拆分字符串:
SPLIT dobj AT sep INTO
{ {result1 result2 ...} | {TABLE result_tab} }
[IN {BYTE|CHARACTER} MODE].
例:
DATA: str TYPE string VALUE '字符串一 字符串二 字符串三 字符串四',
str1 TYPE string,
str2 TYPE string,
str3 TYPE string.
SPLIT str AT space INTO str1 str2 str3.
WRITE: / str1, / str2, / str3.
字符串一
字符串二
字符串三 字符串四
注意:没有足够的目标字段,则用str的剩余部分填充最后目标字段。
可以用一个内表来接收拆分后的子串,可以自动增长,就不用担心目标字段不够用了。例子如下:
DATA: str TYPE string VALUE '字符串一 字符串二 字符串三 字符串四'.
DATA: it_str TYPE TABLE OF string,
wa_str LIKE LINE OF it_str.
SPLIT str AT space INTO TABLE it_str.
LOOP AT it_str INTO wa_str.
WRITE: / wa_str.
ENDLOOP.
字符串一
字符串二
字符串三
字符串四
segment()函数
segment( val = text index = idx [sep|space = sep] )
根据指定的字符串sep或者指定的字符sapce来将text拆分,并返回第idx(从1开始)个片断
3、截断字符串:
SHIFT {c} [BY {n} PLACES] [{mode}].:
字符串移动
字符串替换
替换指定的字符串(老式的,已过时的)
REPLACE sub_string WITH new INTO dobj
[IN {BYTE|CHARACTER} MODE]
[LENGTH len].
替换某个区间上的字符串
REPLACE SECTION [OFFSET off] [LENGTH len] OF dobj WITH new
[IN {BYTE|CHARACTER} MODE].
OFFSET or LENGTH必须要指定一个,如果指定了OFFSET,但未指定LENGTH时,替换的内容从OFFSET到dobj的最后;如果指定了LENGTH,但未指定OFFSET时,OFFSET将隐含为0。OFFSET与LENGTH需要大于或等于0,通过OFFSET与LENGTH定位到的子字符串段必须要位于dobj里。
replace
返回码:
0 ——替换成功,并且结果未被截断
2 ——替换成功,但结果右边被截断
4 ——未找到要替换的字符串
replace()函数regex
replace( val = text [off = off] [len = len] with = new )
replace( val = text {sub = substring}|{regex = regex} with = new [case = case] [occ = occ] )
使用new替换指定的子符串,返回String类型。
搜索字符串
SEARCH <c> FOR <str> <options>.
contains()函数regex
matches()函数regex
count()函数regex