290112011 发表于 2015-5-29 10:51:52

ABAP无法读取FTP上的excel文件

当初写ABAP时,还特地研究了一番ABAP与FTP的连接问题,并为大家做技术分享。但最近写的一个SA文件时,我写了一点:程序从FTP上读取XLS文件,完成数据处理后,将反馈的LOG文件放回FTP。

初一看,几乎没有什么问题。后来当出了问题后,我电话问了好几位ABAP老手,开头的感觉都是说可以做到……但我真正问到怎么做时,要么就反应过来不行,要么就搞错了。

如果是从本机上读取XLS文件,没有问题,调用一个专用的Function( ALSM_EXCEL_TO_INTERNAL_TABLE )就OK了,如果是CSV、TXT格式就更简单了,调用Function(WS_UPLOAD)就搞定,主要是后期数据不需要再转化。以往的程序中,ABAP程序与FTP连接,都需要AP的中转,具体过程为:先连接FTP(Function: FTP_CONNECT),然后发送FTP的命令(FTP_COMMAND)将文件传回AP,最后再关闭FTP连接(FTP_DISCONNECT);然后再用open dataset的方式将AP上的文件打开,一行一行读取数据到内表中进行处理。向FTP上存放数据也是这样的过程,只不过open dataset是用transfer的方式向文件中写入数据,FTP_COMMAND时则上传文件。不过这种方式有一点需要注意,open dataset后我们自然想到close dataset, 但还别忘了delete dataset,否则程序每执行一次,就往AP上放一个文件,文件名相同也就罢了,如果是动态变化的,AP上面的垃圾就很多了。

问题主要是出在open dataset上面。它是一行一行读取文件的,无论是以文本方式打开,或者是其它形式打开。当CSV格式或TXT格式时,没问题;但当为XLS格式时,里面含有很多不可见的东东,打开就几乎全是乱码了。那些Function,都是处理本机与ABAP程序间文件传输的。

对这种小问题掉以轻心,结果却犯了个大错误。还好最后与顾问商量,将文件的格式改为CSV了。

那么,我们可否将日志文件生成XLS文件,再上传到FTP上去呢?答案是可以。其中最重要的是找着TAB符号,ECC6.0之后,可以调用专用的class实现,其中有TAB分隔符的静态变量(上网找了找:cl_abap_char_utilities=>horizontal_tab )。用这个数据将内表中的字段分开写入一个XLS文件就搞定。如果是ECC4.6的话,我是用本地SQL实现的(ORACLE:select chr(9) into :tab from dual)。如果是CSV或者是TXT,就不用这么麻烦找TAB值了。
那么我们就会问,为什么你可以生成XLS文件,却不可以读取XLS文件呢?事实证明,你生成的XLS文件,是可以被读取的。这就是说,如果你将生成的一个XLS文件给用户,然后用户再向里面填写数据,这种文件是可以被open dataset方式成功打开的。但问题是,用户不可能那么听话,每次都用你给的XLS文件来修改。一旦他点右键新建一个XLS文件,那么程序肯定出错或者不成功。其中原因很简单,就是因为程序生成的XLS文件,没有冗余的不可见的东东。

转做助理顾问这点倒是蛮爽的,需要实现什么,写个需求就好了,具体代码交给abaper就好,需求一改,我们动手是少,可abaper就需要改很多代码了。但怎么说我也曾是abaper,这点我还是非常为他们考虑的。


http://blog.erp100.com/home.php?mod=space&uid=52759&do=blog&id=6765165
页: [1]
查看完整版本: ABAP无法读取FTP上的excel文件