Abap 将bkpf传输到后台的制表符文件中
我想在后台将所有bkpf字段提取到一个以制表符分隔的文件中。 我们怎么做 提前谢谢 埃利亚斯 PS:p\u bckgr中的Perform exec_无法理解p\u bckgr=space提交中复选框的更改的程序代码Abap 将bkpf传输到后台的制表符文件中,abap,jobs,sap-erp,Abap,Jobs,Sap Erp,我想在后台将所有bkpf字段提取到一个以制表符分隔的文件中。 我们怎么做 提前谢谢 埃利亚斯 PS:p\u bckgr中的Perform exec_无法理解p\u bckgr=space提交中复选框的更改的程序代码 REPORT zfor_get_bkrf_bseg4. TABLES: bkpf. DATA: it_bkpf TYPE STANDARD TABLE OF bkpf, ls_bkpf TYPE bkpf, i_filename LIKE rlgrap-fi
REPORT zfor_get_bkrf_bseg4.
TABLES: bkpf.
DATA: it_bkpf TYPE STANDARD TABLE OF bkpf,
ls_bkpf TYPE bkpf,
i_filename LIKE rlgrap-filename.
FIELD-SYMBOLS: <fs_field>.
SELECTION-SCREEN BEGIN OF BLOCK selection WITH FRAME TITLE text-s01.
SELECT-OPTIONS: so_bukrs FOR bkpf-bukrs,
so_budat FOR bkpf-budat OBLIGATORY.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN ULINE.
PARAMETERS: p_bkgrd AS CHECKBOX USER-COMMAND check DEFAULT 'X'.
" File Path on Application Server or on Local PC according to p_bkgrd
PARAMETERS: p_paths TYPE btcxpgpar DEFAULT '/tmp' MODIF ID sg1.
SELECTION-SCREEN END OF BLOCK selection.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_paths.
DATA: c_fnh_mask TYPE dxfields-filemask VALUE '*',
search_dir TYPE dxfields-longpath .
CALL FUNCTION '/SAPDMC/LSM_F4_SERVER_FILE'
EXPORTING
directory = search_dir
filemask = c_fnh_mask
IMPORTING
serverfile = p_paths
EXCEPTIONS
canceled_by_user = 1
OTHERS = 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.
START-OF-SELECTION.
IF p_bkgrd = 'X'.
PERFORM exec_in_bckgr.
ELSE.
PERFORM get_data.
PERFORM download_tables_paths.
ENDIF.
END-OF-SELECTION.
WRITE: i_filename , ' is created' .
FORM get_data .
SELECT * INTO TABLE it_bkpf
FROM bkpf
WHERE bukrs IN so_bukrs AND
budat IN so_budat.
ENDFORM. " GET_DATA
FORM download_tables_paths .
DATA:lv_line(4096) TYPE c,
lv_field_type(10) TYPE c,
lv_field_text(10) TYPE c.
" Build FineName
CONCATENATE p_paths '/' 'BKPF' sy-datum sy-uzeit '.txt'
INTO i_filename.
REPLACE ALL OCCURRENCES OF '//' IN i_filename WITH '/'.
* Process further only if found some data
IF NOT it_bkpf[] IS INITIAL.
" Open file for Output
OPEN DATASET i_filename FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
LOOP AT it_bkpf INTO ls_bkpf.
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE ls_bkpf TO <fs_field>.
IF sy-subrc <> 0.
EXIT.
ENDIF.
IF lv_line IS INITIAL.
lv_line = <fs_field>.
ELSE.
DESCRIBE FIELD <fs_field> TYPE lv_field_type.
IF lv_field_type = 'P' OR lv_field_type = 'I'.
lv_field_text = <fs_field>.
CONDENSE lv_field_text NO-GAPS.
CONCATENATE lv_line '|' lv_field_text INTO lv_line.
ELSE.
CONCATENATE lv_line '|' <fs_field> INTO lv_line.
ENDIF.
ENDIF.
ENDDO.
TRANSFER lv_line TO i_filename.
CLEAR: lv_line.
ENDLOOP.
ENDIF.
CLOSE DATASET i_filename.
ENDIF.
ENDFORM.
FORM exec_in_bckgr .
DATA: jobname1 TYPE tbtcjob-jobname,
jobcount1 TYPE tbtcjob-jobcount.
jobname1 = 'ZFOR_GET_BKRF_BSEG2'.
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = jobname1
IMPORTING
jobcount = jobcount1
EXCEPTIONS
cant_create_job = 1
invalid_job_data = 2
jobname_missing = 3
OTHERS = 4.
IF sy-subrc NE 0.
MESSAGE s368(00) WITH 'Error Creating Job'
sy-subrc.
EXIT.
ENDIF.
SUBMIT zfor_get_bkrf_bseg2
WITH so_bukrs IN so_bukrs
WITH so_budat IN so_budat
WITH p_bckgr = space
WITH p_paths = p_paths
VIA JOB jobname1 NUMBER jobcount1
AND RETURN.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = jobcount1
jobname = jobname1
* sdlstrtdt = sdate
* sdlstrttm = stime
* strtimmed = 'X' " Start immediately
EXCEPTIONS
invalid_startdate = 1
jobname_missing = 2
job_close_failed = 3
job_nosteps = 4
job_notex = 5
lock_failed = 6
OTHERS = 7.
IF sy-subrc > 0.
MESSAGE s368(00) WITH 'Closing Job Failed'
sy-subrc.
EXIT.
ENDIF.
ENDFORM.
报告zfor_get_bkrf_bseg4。
表:bkpf。
数据:它是bkpf的bkpf类型标准表,
ls_bkpf型bkpf,
我喜欢rlgrap文件名。
字段符号:。
选择-屏幕以帧标题文本-s01开始块选择。
SELECT-OPTIONS:so_bukrs FOR bkpf bukrs,
因此,bkpf的budat是强制性的。
选择屏幕跳过1。
选择屏幕乌林。
参数:p_bkgrd AS CHECKBOX用户命令检查默认值“X”。
“根据p_bkgrd,应用程序服务器或本地PC上的文件路径
参数:p_路径类型btcxpgpar默认'/tmp'修改ID sg1。
选择-块选择的屏幕结束。
在p_路径的值请求的选择屏幕上。
数据:c_fnh_掩码类型dxfields文件掩码值'*',
搜索目录类型dxfields longpath。
调用函数'/SAPDMC/LSM_F4_服务器_文件'
出口
目录=搜索目录
filemask=c_fnh_mask
进口
serverfile=p\u路径
例外情况
由用户取消的用户=1
其他=2。
如果sy subrc为0。
消息ID sy msgid类型sy msgty编号sy msgno
使用sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4。
恩迪夫。
开始选择。
如果p_bkgrd='X'。
在bckgr中执行exec。
其他的
执行获取数据。
执行下载\u表\u路径。
恩迪夫。
选择结束。
写入:i_文件名“已创建”。
表单获取数据。
选择*进入表it\u bkpf
来自bkpf
布克在哪里
苏乌布达特的布达特。
ENDFORM.“获取数据”
表单下载\u表\u路径。
数据:低压线路(4096)c型,
低压电场类型(10)c型,
lv_字段_文本(10)c型。
“创建FineName
连接p_路径“/”BKPF“sy datum sy uzeit'.txt”
输入i_文件名。
将i_文件名中出现的所有“//”替换为“/”。
*仅当发现一些数据时才进一步处理
如果不是,则为首字母。
“打开文件以进行输出
以文本模式编码默认值打开输出的数据集i_文件名。
如果sy subrc NE为0。
消息ID sy msgid类型sy msgty编号sy msgno
使用sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4。
其他的
将其循环到ls_bkpf中。
做
将结构ls_bkpf的组件sy索引分配给。
如果sy subrc为0。
出口
恩迪夫。
如果lv_线是初始的。
lv_线=。
其他的
描述字段类型lv\U字段类型。
如果lv_字段类型='P'或lv_字段类型='I'。
lv_字段_文本=。
压缩lv_字段_文本无间隙。
将lv_行“|”lv_字段_文本连接到lv_行。
其他的
将lv_线“|”连接到lv_线。
恩迪夫。
恩迪夫。
恩多。
将lv_行传输到i_文件名。
清除:lv_线。
结束循环。
恩迪夫。
关闭数据集i\u文件名。
恩迪夫。
尾型。
bckgr中的表格exec_。
数据:jobname1类型tbtcjob jobname,
jobcount1类型tbtcjob jobcount。
jobname1='ZFOR_GET_BKRF_BSEG2'。
调用函数“JOB\u OPEN”
出口
jobname=jobname1
进口
jobcount=jobcount1
例外情况
无法创建作业=1
无效的\u作业\u数据=2
jobname_缺少=3
其他=4。
如果sy subrc NE为0。
带有“创建作业时出错”的消息s368(00)
sy subrc。
出口
恩迪夫。
提交zfor_get_bkrf_bseg2
在苏布克里有苏布克
苏布达特在苏布达特
p_bckgr=空间
具有p_路径=p_路径
通过JOB jobname1编号jobcount1
然后返回。
调用函数“JOB\u CLOSE”
出口
jobcount=jobcount1
jobname=jobname1
*sdlstrtdt=sdate
*sdlstrttm=时间
*strtimed='X'“立即启动
例外情况
无效的\u startdate=1
jobname_缺少=2
作业关闭失败=3
作业步骤=4
作业注释x=5
锁定失败=6
其他=7。
如果sy subrc>0。
带有“关闭作业失败”的消息s368(00)
sy subrc。
出口
恩迪夫。
尾型。
该计划太简单,我不明白为什么该网站要求我添加更多的评论。
好的,如果我在调用函数“JOB\u CLOSE”中启用strimmed='X',那么程序将持续创建作业,我必须通过SM50终止它。
如果我禁用STRTIMED,那么它会按照计划创建一个作业。我立即运行它,它会创建并运行一个作业,而不创建文件,而在前台程序工作正常
所以我的问题是:这段代码适合SAP ECC6吗
提前谢谢
Elias以下代码可能是一个解决方案。 从BSEG中选择10.000个包中的行,将其转换为csv格式并传输到打开的文件中
DO.
SELECT * FROM bseg UP TO 10000 ROWS
INTO TABLE @DATA(lt_bseg)
WHERE bukrs = '0001'.
IF sy-subrc <> 0.
EXIT.
ENDIF.
OPEN DATASET filename FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.
LOOP AT lt_bseg INTO DATA(ls_bseg).
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE ls_bseg TO FIELD-SYMBOL(<fs_field>).
IF sy-subrc <> 0.
EXIT.
ENDIF.
IF line IS INITIAL.
line = <fs_field>.
ELSE.
line = line && ';' && <fs_field>.
ENDIF.
TRANSFER line TO filename.
CLEAR: line.
ENDDO.
ENDLOOP.
ENDDO.
CLOSE DATASET filename.
DO。
从最多10000行的bseg中选择*
进入表@数据(lt_bseg)
其中bukrs='0001'。
如果sy subrc为0。
出口
恩迪夫。
以文本模式编码默认值打开输出的数据集文件名。
在lt_bseg处循环到数据(ls_bseg)。
做
将结构ls_bseg的组件sy索引分配给字段-SYMBOL()。
如果sy subrc为0。
出口
恩迪夫。
如果行是首字母。
行=。
其他的
行=行&&“;”&&&。
恩迪夫。
将行传输到文件名。
清楚了:电话线。
恩多。
结束循环。
恩多。
关闭数据集文件名。
最后有人告诉我我的代码出了什么问题。我用p_bckgr=space在中漏掉了一个D。
我认为如果它是错误的SAP将显示一个错误,但这是一个错误的想法。
那么cor