@MagBen: Die Vergleichstabelle ist ohne zusätzliche Einschränkungen Falsch:
Code: Alles auswählen
In [17]: a, b, c
Out[17]: (10000, 10000, 10000)
In [18]: a is b
Out[18]: True
In [19]: a is c
Out[19]: False
In [20]: a == c
Out[20]: True
@Stefan Schnell: Das Python sieht nicht wirklich nach Python aus. Dazu werden zu viele Konventionen verletzt und auch die Sprache gar nicht richtig ausgenutzt.
Es werden zu viele Zwischenergebnisse unnötigerweise an Namen gebunden. Ganz allgemein ist der ganze Code auf Modulebene der in jedes Beispiel kopiert wird schlechter Programmierstil. Da würde man sinnvolle Funktionen und Klassen erwarten. Die Funktionen dann auch auf Modulebene und nicht auf dem SAP-Objekt.
Fehlerbehandlung wird in Python mit Ausnahmen gemacht und nicht mit speziellen Rückgabewerten. Überhaupt ist die Integration in Python fast nicht vorhanden.
So ein `RFC_CONNECTION_PARAMETER`-Array scheint ja eine Art Wörterbuch zu sein, da würde ich also von einer API in Python erwarten das ich eine `open_connection()` bekommen bei der ich Schlüsselwort-Argumente übergeben kann, die dann für den Funktionsaufruf von der DLL für mich in ein so ein Array umgewandelt werden und ich mich da nicht selber drum kümmern muss. Und das die Funktion eine Ausnahme auslöst wenn die Verbindung nicht klappt. Und in dieser Ausnahme sollten dann die Informationen aus der `RFC_ERROR_INFO`-Struktur stecken. Eben wie man Python so benutzt. Wenn Python nur als Syntax für die C-API benutzt wird und die Schnittstelle zu ABAP wie ein Fremdkörper aussieht, kann man eigentlich gleich C nehmen. Python nimmt man ja weil's schöner werden soll.
Mal die ersten drei Artikel angeschaut würde ich Python-Code erwarten der eher so aussieht:
Code: Alles auswählen
import sap_rfc
def main():
with sap_rfc.open_connection(
ASHOST='ABAP', SYSNR='00', CLIENT='001', USER='BCUSER', PASSWD='minisap'
) as connection:
# Variante 1:
with connection.get_function('RFC_PING') as ping_function:
if ping_function() == sap_rfc.OK:
print('Ping successful.')
else:
print('Ping not successful.')
# Variante 2:
if connection.ping().return_code == sap_rfc.OK:
print('Ping successful.')
else:
print('Ping not successful.')
with connection.get_function('RFC_SYSTEM_INFO') as get_system_info:
info = get_system_info()
print(info.RFCHOST)
print(info.RFCSYSID)
print(info.RFCDBHOST)
print(info.RFCDBSYS)
with connection.get_function(
'RFC_ABAP_INSTALL_AND_RUN'
) as install_and_run:
program_table = install_and_run.get_table('PROGRAM')
program_table.set_column(
'LINE',
[
'Report zTest Line-Size 256.',
"Write: 'Hello World from'.",
"Write: sy-sysid.",
]
)
install_and_run()
result = ''.join(
install_and_run.get_table('WRITES').iter_column('WRITES')
)
print result
Funktioniert `RfcGetVersion()` überhaupt wie im Artikel gezeigt? Ich sehe nicht wie da auf magische Weise die Versionsinformationen in die `c_ulong`-Objekte kommen sollen wenn man beim Aufruf keine Zeiger übergibt sondern die Werte selbst!?
Wie kommt man auf die Idee eine Liste mit einer leeren literalen Liste zu erstellen um dann in den Folgezeilen einzelne literale Elemente mit `append()` hinzuzufügen? Das ist Python und nicht Java.
