Question

J'utilise la boîte à outils JTOPEN / JT400 pour appeler des programmes sur une IBM I-Series R5V4 (aka AS / 400) de Java (en fait: JRuby, mais j'ai vu le même problème dans Pure Java). Cela fonctionne très bien pour certains programmes, tandis que pour d'autres programmes, les octets de sortie contiennent tous les zéros, ce qui est tout simplement faux et parfois même invalide (par exemple en cas de zoneddecimal). Il n'y a pas de messages attachés au programme, dans le jobliste ou sur le sysopr.msgq. Est-ce que quelqu'un sait pourquoi cela se produit?

Pour montrer du code (je suis sûr que toute personne qui a travaillé avec la bibliothèque peut comprendre ce rendu Ruby du 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

Comme je l'ai dit, cela fonctionne très bien pour certains programmes, tandis que pour d'autres, params[2].output_data sera un tableau d'octets de [0, 0, 0], qui n'est pas les résultats prévus. Encore pire, params[3].output_data sera [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], qui sont des valeurs d'octets invalides pour un zoneddecimal.new (9, 2). Quelqu'un peut m'aider?

Était-ce utile?

La solution

Il vous révèle que vous devoir Réglez toujours un valide input_data Sur les paramètres de sortie, même lorsque les valeurs ne sont utilisées nulle part. Si vous ne le faites pas, ils ne seront pas initialisés et ils contiendront des ordures (mais souvent les emplacements de la mémoire contiendront des zéros, comme dans mon cas). Si le programme ne définit pas explicitement les valeurs de sortie, ce qui s'est avéré être le cas pour mon choix de paramètres d'entrée, alors le dicton poubelle en égal aux ordures titulaire.

Bien sûr, la programmation défensive suggère que le programmeur initialise de telles valeurs ou s'assure qu'ils sont définis dans chaque chemin qui peut être emprunté à travers le code, ce qui aurait empêché ce problème de se produire en premier lieu. Cependant, il semble que le contrat soit toujours de définir des valeurs sur les paramètres de sortie, donc j'utilisais à tort l'API.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top