Pergunta

Eu estou usando o jtopen/jt400 kit de ferramentas para chamar programas em um IBM i série-a r5v4 (aka/400) a partir de Java (na verdade:JRuby, mas eu vi o mesmo problema no Java puro).Isso funciona muito bem para alguns programas, enquanto que para outros programas, a saída de bytes contêm todos os zeros, que é simplesmente errado e, às vezes, mesmo inválido (por exemplo, no caso de um ZonedDecimal).Não há Mensagens anexadas ao ProgramCall, no JobList ou no SYSOPR.MSGQ.Alguém sabe por que isso acontece?

Para mostrar algum código (eu tenho certeza que qualquer pessoa que tenha trabalhado com a biblioteca pode entender esse Ruby prestação de 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

Como eu disse, isso funciona muito bem para alguns programas, enquanto para outros, params[2].output_data vai ser uma matriz de bytes de [0, 0, 0], que é não os resultados pretendidos.Ainda pior, params[3].output_data vai ser [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], quais são inválidos os valores de byte para um ZonedDecimal.nova(9, 2).Alguém pode me ajudar?

Foi útil?

Solução

Acontece que você deve defina sempre um válido input_data sobre os parâmetros de saída, mesmo quando os valores não são usados em qualquer lugar.Se não, eles não serão inicializados e que irá conter o lixo (mas, muitas vezes, os locais de memória irá conter zeros, como no meu caso).Se o programa posteriormente não definir explicitamente os valores de saída, que passou a ser o caso para a minha escolha de parâmetros de entrada e, em seguida, o dito o lixo é igual a lixo fora detém.

É claro, programação defensivas sugere que o programador inicializa tais valores ou certifica-se de que estão definidas em cada caminho que pode ser tomado através do código, o que teria impedido que esse problema ocorra em primeiro lugar.No entanto, parece que o contrato é sempre definir valores de parâmetros de saída, então eu estava indevidamente usando a API.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top