Domanda

Sto usando il toolkit Jtopen / JT400 per chiamare programmi su un IBM I-Series R5V4 (AKA AS / 400) da Java (in realtà: Jruby, ma ho visto lo stesso problema in Pure Java).Funziona bene per alcuni programmi, mentre per altri programmi, i byte di uscita contengono tutti gli zeri, che è semplicemente sbagliato e talvolta non valido (ad esempio in caso di zoneddecimale).Non ci sono messaggi collegati alla Programma, nel Joblist o sul Sysopr.MSGQ.Qualcuno sa perché questo accade?

Per mostrare un codice (sono sicuro che chiunque abbia lavorato con la biblioteca può capire questo rendering rubino della 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
.

Come ho detto, questo funziona bene per alcuni programmi, mentre per gli altri, params[2].output_data sarà un array di byte di [0, 0, 0], che non è il risultato previsto.Ancora peggio, params[3].output_data sarà [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]Qualcuno può aiutarmi fuori?

È stato utile?

Soluzione

Si scopre che deve Impostare sempre un input_data valido sui parametri di uscita, anche quando i valori non vengono utilizzati da nessuna parte.Se non lo fai, non saranno inizializzati e conterranno rifiuti (ma spesso le posizioni di memoria contengono zero, come nel mio caso).Se il programma successivamente non imposta esplicitamente i valori di output, che è accaduto come il caso della mia scelta dei parametri di input, quindi il Dictum spazzatura in uguaglia la spazzatura contiene.

Naturalmente, la programmazione difensiva suggerisce che il programmatore inizializza tali valori o assicura che vengano impostati in ogni percorso che può essere prelevato attraverso il codice, che avrebbe impedito che questo problema si verifichi in primo luogo.Tuttavia, sembra che il contratto sia di impostare sempre i valori sui parametri di output, quindi dovevo usare erroneamente l'API.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top