diff --git a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/statements.kt b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/statements.kt index 11f35191c..948cf717a 100644 --- a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/statements.kt +++ b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/statements.kt @@ -477,8 +477,10 @@ data class MoveLStmt( abstract class AbstractReadEqualStmt( @Transient open val searchArg: Expression? = null, // Factor1 @Transient open val name: String = "", // Factor 2 + @Transient open val hiIndicator: IndicatorKey? = null, // HI indicator + @Transient open val loIndicator: IndicatorKey? = null, // LO indicator + @Transient open val eqIndicator: IndicatorKey? = null, // EQ indicator @Transient override val position: Position? = null - ) : Statement(position) { override fun execute(interpreter: InterpreterCore) { val dbFile = interpreter.dbFile(name, this) @@ -491,6 +493,11 @@ abstract class AbstractReadEqualStmt( null -> read(dbFile) else -> read(dbFile, kList) } + + hiIndicator?.let { interpreter.getIndicators()[it] = result.indicatorHI.asValue() } + loIndicator?.let { interpreter.getIndicators()[it] = result.indicatorLO.asValue() } + eqIndicator?.let { interpreter.getIndicators()[it] = result.indicatorEQ.asValue() } + interpreter.fillDataFrom(dbFile, result.record) } @@ -500,11 +507,20 @@ abstract class AbstractReadEqualStmt( @Serializable abstract class AbstractReadStmt( @Transient open val name: String = "", // Factor 2 + @Transient open val hiIndicator: IndicatorKey? = null, // HI indicator + @Transient open val loIndicator: IndicatorKey? = null, // LO indicator + @Transient open val eqIndicator: IndicatorKey? = null, // EQ indicator @Transient override val position: Position? = null ) : Statement(position) { override fun execute(interpreter: InterpreterCore) { val dbFile = interpreter.dbFile(name, this) val result = readOp(dbFile) + + // TODO: check if HI indicator is actually ever used on READ statements + hiIndicator?.let { interpreter.getIndicators()[it] = result.indicatorHI.asValue() } + loIndicator?.let { interpreter.getIndicators()[it] = result.indicatorLO.asValue() } + eqIndicator?.let { interpreter.getIndicators()[it] = result.indicatorEQ.asValue() } + interpreter.fillDataFrom(dbFile, result.record) } @@ -554,8 +570,16 @@ abstract class AbstractSetStmt( data class ChainStmt( override val searchArg: Expression, // Factor1 override val name: String, // Factor 2 + override val hiIndicator: IndicatorKey?, // HI indicator + override val loIndicator: IndicatorKey?, // LO indicator override val position: Position? = null -) : AbstractReadEqualStmt(searchArg, name, position) { +) : AbstractReadEqualStmt( + searchArg = searchArg, + name = name, + hiIndicator = hiIndicator, + loIndicator = loIndicator, + position = position +) { override val loggableEntityName: String get() = "CHAIN" @@ -566,8 +590,16 @@ data class ChainStmt( data class ReadEqualStmt( override val searchArg: Expression?, override val name: String, + override val loIndicator: IndicatorKey?, // LO indicator + override val eqIndicator: IndicatorKey?, // EQ indicator override val position: Position? = null -) : AbstractReadEqualStmt(searchArg = searchArg, name = name, position = position) { +) : AbstractReadEqualStmt( + searchArg = searchArg, + name = name, + loIndicator = loIndicator, + eqIndicator = eqIndicator, + position = position +) { override val loggableEntityName: String get() = "READE" @@ -584,8 +616,16 @@ data class ReadEqualStmt( data class ReadPreviousEqualStmt( override val searchArg: Expression?, override val name: String, + override val loIndicator: IndicatorKey?, // LO indicator + override val eqIndicator: IndicatorKey?, // EQ indicator override val position: Position? = null -) : AbstractReadEqualStmt(searchArg = searchArg, name = name, position = position) { +) : AbstractReadEqualStmt( + searchArg = searchArg, + name = name, + loIndicator = loIndicator, + eqIndicator = eqIndicator, + position = position +) { override val loggableEntityName: String get() = "READPE" @@ -599,7 +639,17 @@ data class ReadPreviousEqualStmt( } @Serializable -data class ReadStmt(override val name: String, override val position: Position?) : AbstractReadStmt(name, position) { +data class ReadStmt( + override val name: String, + override val loIndicator: IndicatorKey?, // LO indicator + override val eqIndicator: IndicatorKey?, // EQ indicator + override val position: Position? +) : AbstractReadStmt( + name = name, + loIndicator = loIndicator, + eqIndicator = eqIndicator, + position = position +) { override val loggableEntityName: String get() = "READ" @@ -607,8 +657,18 @@ data class ReadStmt(override val name: String, override val position: Position?) } @Serializable -data class ReadPreviousStmt(override val name: String, override val position: Position?) : - AbstractReadStmt(name, position) { +data class ReadPreviousStmt( + override val name: String, + override val loIndicator: IndicatorKey?, // LO indicator + override val eqIndicator: IndicatorKey?, // EQ indicator + override val position: Position? +) : + AbstractReadStmt( + name = name, + loIndicator = loIndicator, + eqIndicator = eqIndicator, + position = position + ) { override val loggableEntityName: String get() = "READP" diff --git a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/misc.kt b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/misc.kt index 32fd03eab..678f4a11f 100644 --- a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/misc.kt +++ b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/misc.kt @@ -1335,21 +1335,29 @@ internal fun CsCHAINContext.toAst(conf: ToAstConfiguration): Statement { val position = toPosition(conf.considerPosition) val factor1 = this.factor1Context()?.content?.toAst(conf) ?: throw UnsupportedOperationException("CHAIN operation requires factor 1: ${this.text} - ${position.atLine()}") val factor2 = this.cspec_fixed_standard_parts().factor2.text ?: throw UnsupportedOperationException("CHAIN operation requires factor 2: ${this.text} - ${position.atLine()}") - return ChainStmt(factor1, factor2, position) + val hi = this.cspec_fixed_standard_parts().hi.toIndicatorKey() + val lo = this.cspec_fixed_standard_parts().lo.toIndicatorKey() + return ChainStmt(factor1, factor2, hi, lo, position) } internal fun CsREADContext.toAst(conf: ToAstConfiguration): Statement { val position = toPosition(conf.considerPosition) // TODO implement DS in result field val factor2 = this.cspec_fixed_standard_parts().factor2.text ?: throw UnsupportedOperationException("READ operation requires factor 2: ${this.text} - ${position.atLine()}") - return ReadStmt(factor2, position) + + val loIndicator = this.cspec_fixed_standard_parts().lo.toIndicatorKey() + val eqIndicator = this.cspec_fixed_standard_parts().eq.toIndicatorKey() + return ReadStmt(factor2, loIndicator, eqIndicator, position) } internal fun CsREADPContext.toAst(conf: ToAstConfiguration): Statement { val position = toPosition(conf.considerPosition) // TODO implement DS in result field val factor2 = this.cspec_fixed_standard_parts().factor2.text ?: throw UnsupportedOperationException("READP operation requires factor 2: ${this.text} - ${position.atLine()}") - return ReadPreviousStmt(factor2, position) + + val loIndicator = this.cspec_fixed_standard_parts().lo.toIndicatorKey() + val eqIndicator = this.cspec_fixed_standard_parts().eq.toIndicatorKey() + return ReadPreviousStmt(factor2, loIndicator, eqIndicator, position) } internal fun CsREADEContext.toAst(conf: ToAstConfiguration): Statement { @@ -1357,7 +1365,10 @@ internal fun CsREADEContext.toAst(conf: ToAstConfiguration): Statement { // TODO implement DS in result field val factor1 = this.factor1Context()?.content?.toAst(conf) val factor2 = this.cspec_fixed_standard_parts().factor2.text ?: throw UnsupportedOperationException("READE operation requires factor 2: ${this.text} - ${position.atLine()}") - return ReadEqualStmt(factor1, factor2, position) + + val lo = this.cspec_fixed_standard_parts().lo.toIndicatorKey() + val eq = this.cspec_fixed_standard_parts().eq.toIndicatorKey() + return ReadEqualStmt(factor1, factor2, lo, eq, position) } internal fun CsREADPEContext.toAst(conf: ToAstConfiguration): Statement { @@ -1365,7 +1376,10 @@ internal fun CsREADPEContext.toAst(conf: ToAstConfiguration): Statement { // TODO implement DS in result field val factor1 = this.factor1Context()?.content?.toAst(conf) val factor2 = this.cspec_fixed_standard_parts().factor2.text ?: throw UnsupportedOperationException("READPE operation requires factor 2: ${this.text} - ${position.atLine()}") - return ReadPreviousEqualStmt(factor1, factor2, position) + + val lo = this.cspec_fixed_standard_parts().lo.toIndicatorKey() + val eq = this.cspec_fixed_standard_parts().eq.toIndicatorKey() + return ReadPreviousEqualStmt(factor1, factor2, lo, eq, position) } internal fun CsSETLLContext.toAst(conf: ToAstConfiguration): Statement { @@ -2307,4 +2321,6 @@ private fun Map>.processWithSpecifications( return buffer } -private fun String.isStringLiteral(): Boolean = startsWith('\'') && endsWith('\'') \ No newline at end of file +private fun String.isStringLiteral(): Boolean = startsWith('\'') && endsWith('\'') + +private fun ResultIndicatorContext.toIndicatorKey() = text.trim().takeIf { it.isNotBlank() }?.toIndicatorKey() diff --git a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT10BaseCodopTest.kt b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT10BaseCodopTest.kt index 535a1246b..06d158ebf 100644 --- a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT10BaseCodopTest.kt +++ b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT10BaseCodopTest.kt @@ -1,5 +1,6 @@ package com.smeup.rpgparser.smeup +import com.smeup.rpgparser.smeup.dbmock.C5ADFF9LDbMock import org.junit.Test import kotlin.test.assertEquals @@ -413,6 +414,18 @@ open class MULANGT10BaseCodopTest : MULANGTTest() { assertEquals(expected, "smeup/MUDRNRAPU00271".outputOf(configuration = smeupConfig)) } + /** + * READ operations with EQ Indicator + * @see #LS24005102 + */ + @Test + fun executeMUDRNRAPU00272() { + val expected = listOf("ok", "ok", "ok", "ok") + C5ADFF9LDbMock().usePopulated { + assertEquals(expected, "smeup/MUDRNRAPU00272".outputOf(configuration = smeupConfig)) + } + } + /** * Comparing number and `*ZEROS` by using `IFxx`. * @see #LS24004528 diff --git a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/dbmock/C5ADFF9LDbMock.kt b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/dbmock/C5ADFF9LDbMock.kt new file mode 100644 index 000000000..c9296e329 --- /dev/null +++ b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/dbmock/C5ADFF9LDbMock.kt @@ -0,0 +1,25 @@ +/* + * Copyright 2019 Sme.UP S.p.A. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.smeup.rpgparser.smeup.dbmock + +import com.smeup.rpgparser.interpreter.FileMetadata +import java.io.File + +class C5ADFF9LDbMock : DbMock { + override val metadata = + FileMetadata.createInstance(File("src/test/resources/smeup/metadata/C5ADFF9L.json").inputStream()) +} diff --git a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/dbmock/DbMock.kt b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/dbmock/DbMock.kt index 0443accb6..f0b8dfece 100644 --- a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/dbmock/DbMock.kt +++ b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/dbmock/DbMock.kt @@ -61,7 +61,9 @@ interface DbMock : AutoCloseable { is NumberType -> buildString { append("\"${it.fieldName}\"") val defaultValue = if ((it.type as NumberType).decimal) { - " DECIMAL(${(it.type as NumberType).entireDigits}, ${(it.type as NumberType).decimalDigits}) DEFAULT 0.0" + val type = it.type as NumberType + val totalSize = type.entireDigits + type.decimalDigits + " DECIMAL($totalSize, ${type.decimalDigits}) DEFAULT 0.0" } else { " BIGINT DEFAULT 0" } diff --git a/rpgJavaInterpreter-core/src/test/resources/smeup/MUDRNRAPU00272.rpgle b/rpgJavaInterpreter-core/src/test/resources/smeup/MUDRNRAPU00272.rpgle new file mode 100644 index 000000000..6b1c67eda --- /dev/null +++ b/rpgJavaInterpreter-core/src/test/resources/smeup/MUDRNRAPU00272.rpgle @@ -0,0 +1,47 @@ + V* ============================================================== + V* 26/11/2024 APU002 Creation + V* ============================================================== + O * PROGRAM GOAL + O * Perform READ operations with EQ indicator + V* ============================================================== + O * JARIKO ANOMALY + O * Before the fix, indicators on READ operations were ignored + V* ============================================================== + FC5ADFF9L IF E K DISK RENAME(C5ADFFR:C5ADFF9) + C* READE with eof indicator + C TAG1 TAG + C KSCEN READE C5ADFF9L 50 + C N50 IF *ON + C 'ko' DSPLY + C GOTO TAG1 + C ENDIF + C 'ok' DSPLY + C* READPE bof indicator + C *LOVAL SETLL C5ADFF9L + C TAG2 TAG + C KSCEN READPE C5ADFF9L 50 + C N50 IF *ON + C 'ko' DSPLY + C GOTO TAG2 + C ENDIF + C 'ok' DSPLY + C* READ eof indicator + C *HIVAL SETLL C5ADFF9L + C TAG3 TAG + C KSCEN READ C5ADFF9L 50 + C N50 IF *ON + C 'ko' DSPLY + C GOTO TAG3 + C ENDIF + C 'ok' DSPLY + C* READP bof indicator + C *LOVAL SETLL C5ADFF9L + C TAG4 TAG + C KSCEN READP C5ADFF9L 50 + C N50 IF *ON + C 'ko' DSPLY + C GOTO TAG4 + C ENDIF + C 'ok' DSPLY + C* + C *LIKE DEFINE D5SCEN KSCEN \ No newline at end of file diff --git a/rpgJavaInterpreter-core/src/test/resources/smeup/metadata/C5ADFF9L.json b/rpgJavaInterpreter-core/src/test/resources/smeup/metadata/C5ADFF9L.json new file mode 100644 index 000000000..ac441daa0 --- /dev/null +++ b/rpgJavaInterpreter-core/src/test/resources/smeup/metadata/C5ADFF9L.json @@ -0,0 +1,153 @@ +{"name": "C5ADFF9L", + "tableName": "C5ADFF0F", + "recordFormat": "C5ADFFR", + "fields": [ + { "fieldName": "D5AZIE", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":2, "varying":false}} + , { "fieldName": "D5DEAZ", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":35, "varying":false}} + , { "fieldName": "D5SCEN", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":10, "varying":false}} + , { "fieldName": "D5DESC", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":35, "varying":false}} + , { "fieldName": "D5IDOJ", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":10, "varying":false}} + , { "fieldName": "D5LIVE", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":1, "varying":false}} + , { "fieldName": "D5STAT", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":2, "varying":false}} + , { "fieldName": "D5TPOG", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":12, "varying":false}} + , { "fieldName": "D5CDOG", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":15, "varying":false}} + , { "fieldName": "D5DEOG", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":35, "varying":false}} + , { "fieldName": "D5TPOR", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":12, "varying":false}} + , { "fieldName": "D5CDOR", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":15, "varying":false}} + , { "fieldName": "D5DEOR", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":35, "varying":false}} + , { "fieldName": "D5TPOC", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":12, "varying":false}} + , { "fieldName": "D5CDOC", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":15, "varying":false}} + , { "fieldName": "D5DEOC", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":35, "varying":false}} + , { "fieldName": "D5TPFO", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":12, "varying":false}} + , { "fieldName": "D5CDFO", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":15, "varying":false}} + , { "fieldName": "D5DEFO", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":35, "varying":false}} + , { "fieldName": "D5ORDF", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":1, "varying":false}} + , { "fieldName": "D5RICL", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":1, "varying":false}} + , { "fieldName": "D5ORDR", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":1, "varying":false}} + , { "fieldName": "D5DATA", + "type":{"type":"com.smeup.rpgparser.interpreter.NumberType","entireDigits":8, "decimalDigits":0, "rpgType":"P"}} + , { "fieldName": "D5SEGN", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":1, "varying":false}} + , { "fieldName": "D5VALU", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":4, "varying":false}} + , { "fieldName": "D5CAMB", + "type":{"type":"com.smeup.rpgparser.interpreter.NumberType","entireDigits":6, "decimalDigits":6, "rpgType":"P"}} + , { "fieldName": "D5IMPO", + "type":{"type":"com.smeup.rpgparser.interpreter.NumberType","entireDigits":15, "decimalDigits":6, "rpgType":"P"}} + , { "fieldName": "D5IMVA", + "type":{"type":"com.smeup.rpgparser.interpreter.NumberType","entireDigits":15, "decimalDigits":6, "rpgType":"P"}} + , { "fieldName": "D5CD01", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":30, "varying":false}} + , { "fieldName": "D5DEC1", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":50, "varying":false}} + , { "fieldName": "D5CD02", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":30, "varying":false}} + , { "fieldName": "D5DEC2", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":50, "varying":false}} + , { "fieldName": "D5CD03", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":30, "varying":false}} + , { "fieldName": "D5DEC3", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":50, "varying":false}} + , { "fieldName": "D5CD04", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":30, "varying":false}} + , { "fieldName": "D5DEC4", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":50, "varying":false}} + , { "fieldName": "D5CD05", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":30, "varying":false}} + , { "fieldName": "D5DEC5", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":50, "varying":false}} + , { "fieldName": "D5DT01", + "type":{"type":"com.smeup.rpgparser.interpreter.NumberType","entireDigits":8, "decimalDigits":0, "rpgType":"P"}} + , { "fieldName": "D5DT02", + "type":{"type":"com.smeup.rpgparser.interpreter.NumberType","entireDigits":8, "decimalDigits":0, "rpgType":"P"}} + , { "fieldName": "D5DT03", + "type":{"type":"com.smeup.rpgparser.interpreter.NumberType","entireDigits":8, "decimalDigits":0, "rpgType":"P"}} + , { "fieldName": "D5DT04", + "type":{"type":"com.smeup.rpgparser.interpreter.NumberType","entireDigits":8, "decimalDigits":0, "rpgType":"P"}} + , { "fieldName": "D5DT05", + "type":{"type":"com.smeup.rpgparser.interpreter.NumberType","entireDigits":8, "decimalDigits":0, "rpgType":"P"}} + , { "fieldName": "D5QT01", + "type":{"type":"com.smeup.rpgparser.interpreter.NumberType","entireDigits":15, "decimalDigits":6, "rpgType":"P"}} + , { "fieldName": "D5QT02", + "type":{"type":"com.smeup.rpgparser.interpreter.NumberType","entireDigits":15, "decimalDigits":6, "rpgType":"P"}} + , { "fieldName": "D5QT03", + "type":{"type":"com.smeup.rpgparser.interpreter.NumberType","entireDigits":15, "decimalDigits":6, "rpgType":"P"}} + , { "fieldName": "D5QT04", + "type":{"type":"com.smeup.rpgparser.interpreter.NumberType","entireDigits":15, "decimalDigits":6, "rpgType":"P"}} + , { "fieldName": "D5QT05", + "type":{"type":"com.smeup.rpgparser.interpreter.NumberType","entireDigits":15, "decimalDigits":6, "rpgType":"P"}} + , { "fieldName": "D5FL01", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":1, "varying":false}} + , { "fieldName": "D5FL02", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":1, "varying":false}} + , { "fieldName": "D5FL03", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":1, "varying":false}} + , { "fieldName": "D5FL04", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":1, "varying":false}} + , { "fieldName": "D5FL05", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":1, "varying":false}} + , { "fieldName": "D5FL06", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":1, "varying":false}} + , { "fieldName": "D5FL07", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":1, "varying":false}} + , { "fieldName": "D5FL08", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":1, "varying":false}} + , { "fieldName": "D5FL09", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":1, "varying":false}} + , { "fieldName": "D5FL10", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":1, "varying":false}} + , { "fieldName": "D5FL11", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":1, "varying":false}} + , { "fieldName": "D5FL12", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":1, "varying":false}} + , { "fieldName": "D5FL13", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":1, "varying":false}} + , { "fieldName": "D5FL14", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":1, "varying":false}} + , { "fieldName": "D5FL15", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":1, "varying":false}} + , { "fieldName": "D5FL16", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":1, "varying":false}} + , { "fieldName": "D5FL17", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":1, "varying":false}} + , { "fieldName": "D5FL18", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":1, "varying":false}} + , { "fieldName": "D5FL19", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":1, "varying":false}} + , { "fieldName": "D5FL20", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":1, "varying":false}} + , { "fieldName": "D5DTIN", + "type":{"type":"com.smeup.rpgparser.interpreter.NumberType","entireDigits":8, "decimalDigits":0, "rpgType":"P"}} + , { "fieldName": "D5ORIN", + "type":{"type":"com.smeup.rpgparser.interpreter.NumberType","entireDigits":6, "decimalDigits":0, "rpgType":"P"}} + , { "fieldName": "D5USIN", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":10, "varying":false}} + , { "fieldName": "D5DTAG", + "type":{"type":"com.smeup.rpgparser.interpreter.NumberType","entireDigits":8, "decimalDigits":0, "rpgType":"P"}} + , { "fieldName": "D5ORAG", + "type":{"type":"com.smeup.rpgparser.interpreter.NumberType","entireDigits":6, "decimalDigits":0, "rpgType":"P"}} + , { "fieldName": "D5USAG", + "type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":10, "varying":false}} + ], "accessFields": [ "D5SCEN", "D5DATA", "D5AZIE", "D5TPOG", "D5CDOG", "D5TPFO", "D5CDFO"]}