Search code examples
pythoncontent-management-systemsaprfcsap-basispyrfc

Pyrfc: RFCTable type TBL1024


To upload a PDF binary file to SAP I can use an RFC function module. This FM requires two specific parameters:

  • IC_ARC_OBJECT = the document class to define the mime type in SAP (OAC2)
  • IN_CONTENT_LENGHT = IMPORTING data type, is the size of the file
  • IT_CONTENT = IMPORTING table of structure TBL1024, table with the bytes of the file, cut into pieces of size 1024
  • ET_MESSAGES = just a BAPIRET2 table to check on errors (RETURN table)

The function module is successfully executed in the Python program but when I break on the function module to check on the content of IT_CONTENT I can see that the lines of the table are not filled in correctly:

Extraction of the python program call of the FM:

arc_object = "ZZ_PDF" 
content = Arc.get_arc_content(filename)
size = Arc.get_size(filename)
messages = []
result = connection.call("ZZ_UPLOAD_FILE", 
IC_ARC_OBJECT = arc_object,
IN_CONTENT_LENGTH = str(size),
IT_CONTENT = content,
ET_MESSAGES = messages)
messages = result['ET_MESSAGES']
for mes in messages:
     print mes['MESSAGE']

Extraction of the python function Arc.get_arc_content(filename):

def get_arc_content(filename="file.pdf"):
    maxLineLength = 1024
    structure = []
    if filename == '':
        filename = 'file.pdf'
    with open(filename, 'rb') as file1:
        f = file1.read()
        n = 1024
        fl = [f[i:i + n] for i in range(0, len(f), n)]

    content = []
    for line in fl:
        lineapp = {
            u"LINE": line
        }
        print len(line)
        content.append(lineapp)

    return content

The result in SAP is the following for the parameters:

  • IN_CONTENT_LENGHT = 000000007945 (7.8 kb)
  • IT_CONTENT = 8 x 1 lines: (4lines)
    LINE1
    255044462D312E3300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    LINE2
    B89B067867673EAB00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    LINE3
    5BF4CB23B9A7513700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    LINE4
    61DB44B3B0AAB12500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    ...
    LINE8
    202020202020202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    

The expecting result for IT_CONTENT, checked with FM ARCHIVE_OBJECT_GET, should be something like:

LINE1
255044462D312E330D0A25E2E3CFD30D0A25525354585044463320506172616D65746572733A204452535458680D0A322030206F626A0D0A3C3C0D0A2F46696C7465722033203020520D0A2F4C656E67
LINE2
FA1D555450C8EF41AC263F14BC03C49BDD773CF22BC43FD21B3565DA2DFCCB83D8FFAC7BCBBBEBE6DED0AD68DEA29B349398511824DDDCFFAF41EA7FDADDF67EE61EF3FC303293F7E96351A911F8DE10
LINE3
FB4A559526CD6AED428976E80F8DD0B02517C4178D1EFB73C65792D09CFE5C717883BE38E61ED0AB3ADC0983C103E4338A1B210DA086DA73375E679C0A410F510FDC542BB686A1A4D601DD411A506504
...

So the problem is that only the first bytes are transferred, the rest are trailing zero's.

Is this related to the fact that I'm doing something wrong, or isn't it possible to cut the binary files properly into chunks of 1024 and transfer them into a table towards SAP. How to use the byte type of SAP in python?

Many thanks for your suggestions/support.


Solution

  • The pyrfc-1.9.4-py2.7-win-amd64.egg solved the issue.

    Seems to be a Windows + PyRFC 1.9.3 version issue, the 1.9.4 distribution works perfect,

    Many thanks to Srdjan Boskovic for the support