استدعاء برنامج ط سلسلة من جافا غلة الإخراج غير صالح
-
14-11-2019 - |
سؤال
أنا باستخدام مجموعة أدوات جتوبين / جت 400 لاستدعاء البرامج على عب أنا سلسلة ر5 في 4 (ويعرف أيضا باسم أس / 400) من جافا (في الواقع:جروبي ، ولكن رأيت نفس المشكلة في جافا نقية).هذا يعمل على ما يرام لبعض البرامج ، في حين أن برامج أخرى ، بايت الإخراج تحتوي على جميع الأصفار ، وهو مجرد خطأ وأحيانا حتى غير صالحة (على سبيل المثال في حالة زونديسيمال).لا توجد رسائل مرفقة بالبرنامجاستدعاء ، في قائمة الوظائف أو على سيسوبر.إم إس جي كيو.لا أحد يعرف لماذا يحدث هذا?
لإظهار بعض التعليمات البرمجية (أنا متأكد من أن أي شخص الذي عمل مع المكتبة يمكن أن نفهم هذا روبي تقديم جافا):
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], وهي قيم بايت غير صالحة لمنطقة عشرية.جديد (9 ، 2).يمكن لأي شخص مساعدتي?
المحلول
اتضح لك يجب دائما تعيين صالح input_data
على معلمات الإخراج ، حتى عندما لا يتم استخدام القيم في أي مكان.إذا لم تقم بذلك ، فلن يتم تهيئتها وستحتوي على القمامة (ولكن غالبا ما تحتوي مواقع الذاكرة على أصفار ، كما في حالتي).إذا لم يقم البرنامج لاحقا بتعيين قيم الإخراج بشكل صريح ، وهو ما حدث بالنسبة لاختياري لمعلمات الإدخال ، فإن القول المأثور القمامة في يساوي القمامة خارج يحمل.
بالطبع ، تشير البرمجة الدفاعية إلى أن المبرمج يقوم بتهيئة هذه القيم أو يتأكد من تعيينها في كل مسار يمكن اتباعه من خلال الكود ، مما كان سيمنع حدوث هذه المشكلة في المقام الأول.ومع ذلك ، يبدو أن العقد هو تعيين القيم دائما على معلمات الإخراج ، لذلك كنت أستخدم واجهة برمجة التطبيقات بشكل خاطئ.