Frage

Ich verwende das jtopen/jt400-Toolkit, um Programme auf einem IBM i-Series r5v4 (auch bekannt als AS/400) aus Java aufzurufen (eigentlich:JRuby, aber ich habe das gleiche Problem in reinem Java gesehen).Bei einigen Programmen funktioniert das ganz gut, während bei anderen Programmen die Ausgabebytes ausschließlich Nullen enthalten, was einfach falsch und manchmal sogar ungültig ist (z. B. im Fall von ZonedDecimal).Dem ProgramCall, der JobList oder der SYSOPR.MSGQ sind keine Nachrichten angehängt.Weiß jemand, warum das passiert?

Um etwas Code zu zeigen (ich bin sicher, dass jeder, der mit der Bibliothek gearbeitet hat, dieses Ruby-Rendering von Java verstehen kann):

as400 = AS400.new(host, user, password)
call = ProgramCall.new(as400)
call.program = "/QSYS.LIB/LIBRARY_NAME.LIB/PROGRAM_NAME.PGM"

# Prepare converters
text1_converter = AS400Text.new(1)
text3_converter = AS400Text.new(3)
decimal92_converter = AS400ZonedDecimal.new(11, 2)

# Prepare parameters
call.parameter_list = []

# Input parameters
call.parameter_list << ProgramParameter.new(text1_converter.to_bytes('N'))
call.parameter_list << ProgramParameter.new(decimal92_converter.to_bytes(1500.25))

# Output parameters
call.parameter_list << ProgramParameter.new(text3_converter.byte_length)
call.parameter_list << ProgramParameter.new(decimal92_converter.byte_length)  

# Execute the call    
call.run

# Show the results
puts "Text3 output value: " + text3_converter.to_object(params[2].output_data).to_s
puts "Decimal92 output value: " + decimal92_converter.to_object(params[3].output_data).to_s

Wie gesagt, das funktioniert bei manchen Programmen ganz gut, bei anderen hingegen params[2].output_data wird ein Byte-Array von [0, 0, 0] sein, was nicht das beabsichtigte Ergebnis ist.Noch schlimmer, params[3].output_data wird [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] sein, was ungültige Bytewerte für eine ZonedDecimal.new(9, 2) sind.Kann mir jemand helfen?

War es hilfreich?

Lösung

Es stellt sich heraus, dass du es bist muss immer einen gültigen Wert festlegen input_data auf die Ausgabeparameter, auch wenn die Werte nirgendwo verwendet werden.Wenn Sie dies nicht tun, werden sie nicht initialisiert und enthalten Müll (häufig enthalten die Speicherorte jedoch Nullen, wie in meinem Fall).Wenn das Programm die Ausgabewerte anschließend nicht explizit festlegt, was zufällig bei meiner Wahl der Eingabeparameter der Fall war, dann das Diktum Müll rein ist gleich Müll raus hält.

Defensive Programmierung setzt natürlich voraus, dass der Programmierer solche Werte initialisiert oder sicherstellt, dass sie in jedem Pfad festgelegt werden, der durch den Code genommen werden kann, was das Auftreten dieses Problems von vornherein verhindert hätte.Es sieht jedoch so aus, als ob der Vertrag darin besteht, immer Werte für die Ausgabeparameter festzulegen, sodass ich die API fälschlicherweise verwendet habe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top