Я использую инструментарий jtopen / jt400 для вызова программ на IBM i-series r5v4 (он же AS / 400) из Java (на самом деле: JRuby, но я видел ту же проблему в чистой Java). Это отлично работает для некоторых программ, в то время как для других программ выходные байты содержат все нули, что просто неверно, а иногда даже неверно (например, в случае ZonedDecimal). Нет сообщений, прикрепленных к ProgramCall, в JobList или в SYSOPR.MSGQ. Кто-нибудь знает, почему это происходит?
Чтобы показать некоторый код (я уверен, что любой, кто работал с библиотекой, может понять этот Ruby-рендеринг Java):
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
Как я уже сказал, для некоторых программ это прекрасно работает, в то время как для других params[2].output_data
будет байтовым массивом [0, 0, 0], что не является ожидаемым результатом. Хуже того, params[3].output_data
будет [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], что является недопустимым байтовым значением для ZonedDecimal.new (9, 2). Кто-нибудь может мне помочь?