Invalid index when adding an additional value
Hello everyone,
I am building an interface dynamically for a questionnaire based on previous responses (so I can view the previous answers and then edit them if necessary when re-reviewing). The questions are stored in one database, the items being assessed in another, and the responses to my questions in a third. So, the issue is when I add a new question and answer, I receive the following error:
Interface Definition: Expression evaluation error at function a!forEach [line 140]: Error in a!forEach() expression during iteration 25: Expression evaluation error at function a!radioButtonField [line 145]: Invalid index (25) for list: valid range is 1..24
It reads as though it's able to loop through my first 24 questions and then throws up on the new entry, but I am not constraining the index to 24 values. I believe this is because it's not handling the missing values properly (previously assessed items have no response for the new question) so I manually inserted the values into a test database and received the same error. I've copied the relevant code below and I'm hoping it's something obvious that I've simply overlooked. Any help would be much appreciated!
a!localVariables(
/*constants*/
local!datetime:rule!Current_Date(),
local!user:rule!Current_LoggedInUser(),
local!nulls: index(
rule!qryrefernceQuestionByplatformId(
platformI_appianId: ri!platforms.appian_id
).data,
wherecontains(
"",
touniformstring(
index(
rule!qryrefernceQuestionByplatformId(
platformI_appianId: ri!platforms.appian_id
).data,
"questionOrder",
1
)
)
),
"questionid",
null
),
local!refereceResponse: todatasubset(
remove(
rule!qryrefernceQuestionByplatformId(
platformI_appianId: ri!platforms.appian_id
).data,
wherecontains(
"",
touniformstring(
index(
rule!qryrefernceQuestionByplatformId(
platformI_appianId: ri!platforms.appian_id
).data,
"questionOrder",
1
)
)
)
),
a!pagingInfo(1, - 1)
),
local!temp,
local!indexforQuestions: wherecontains(
tointeger(local!nulls),
tointeger(
index(
rule!QryGetQuestionsGeneral().data,
"questionid",
null
)
)
),
local!questions: if(
or(
isnull(local!indexforQuestions),
count(local!indexforQuestions) = 0
),
rule!QryGetQuestionsGeneral(),
todatasubset(
remove(
rule!QryGetQuestionsGeneral().data,
local!indexforQuestions
),
a!pagingInfo(1, - 1)
)
),
local!radioOptions: { "Yes", "No" },
local!nQuestions: count(local!questions.data),
/*datasubset*/
local!currentPlatformID: if(
rule!APN_isBlank(ri!currentPlatformID),
ri!platforms.appian_id,
ri!currentPlatformID
),
local!newreferenceResponse: /*if(*/
/*rule!APN_isBlank(*/
/*local!refereceResponse.data*/
/*),*/
a!forEach(
items: enumerate(local!nQuestions) + 1,
expression: 'type!{urn:com:appian:types}QUESTION'(
questionid: fv!index,
platformid: ri!platforms.appian_id,
temp: false
)
),
local!blankIntAns: if(
rule!APN_isBlank(local!refereceResponse),
{},
wherecontains(
"",
touniformstring(
index(local!refereceResponse.data, "answer", 1)
)
)
),
local!initalGridData: if(
length(local!blankIntAns) > 0,
remove(
local!refereceResponse.data,
tointeger(local!blankIntAns)
),
local!refereceResponse.data
),
{
a!cardLayout(
contents: a!gridField(
label: "",
labelPosition: "ABOVE",
data: /*local!refereceResponse.data, */
local!initalGridData,
columns: {
a!gridColumn(
label: "Questions",
value: rule!QryGetQuestionsGeneralByquestionId(fv!row.questionid).data.questiontext[1]
),
a!gridColumn(label: "Response", value: fv!row.answer)
},
pagesize: 25,
showWhen: and(
local!refereceResponse.totalCount <> 0,
not(ri!platformEdit = true)
),
validations: {}
),
height: "TALL",
showWhen: and(
local!refereceResponse.totalCount <> 0,
not(ri!platformEdit = true)
),
style: "STANDARD"
),
a!cardLayout(
contents: a!columnsLayout(
columns: {
a!columnLayout(
contents: {
a!forEach(
items: local!questions.data,
expression: {
if(
fv!item.format = "Y/N",
a!radioButtonField(
label: fv!item.questiontext,
labelPosition: "ABOVE",
choiceLabels: local!radioOptions,
choiceValues: local!radioOptions,
value: ri!newreferenceResponse[fv!index].answer,
saveInto: {
ri!newreferenceResponse[fv!index].answer,
if(
ri!newreferenceResponse[fv!index].answer = "No",
{
a!save(local!temp, fv!index),
a!forEach(
a!forEach(
local!questions.data,
if(
fv!item.refToParent = tostring(local!temp),
fv!item.questionOrder,
{}
)
),
a!save(
ri!newreferenceResponse[fv!item].answer,
Null
)
)
},
{}
),
/*a!save(local!temp,a!forEach(local!questions.data,if(fv!item.refToParent="2",fv!item.id,{}))),*/
a!save(
ri!newreferenceResponse[fv!index].questionid,
fv!item.questionid
),
a!save(
ri!newreferenceResponse[fv!index].temp,
""
),
a!save(
ri!newreferenceResponse[fv!index].isActive,
fv!item.isActive
),
a!save(
ri!newreferenceResponse[fv!index].questionOrder,
fv!item.questionOrder
),
a!save(
ri!newreferenceResponse.user,
local!user
),
a!save(
ri!newreferenceResponse[fv!index].datetime,
local!datetime
),
a!save(
ri!newreferenceResponse,
ri!newreferenceResponse
)
},
showWhen: if(
fv!item.levelIndicator = "2",
if(
ri!newreferenceResponse[tointeger(fv!item.refToParent)].answer = "Yes",
true,
false
),
true()
),
required: if(
fv!item.levelIndicator = "2",
if(
ri!newreferenceResponse[tointeger(fv!item.refToParent)].answer = "Yes",
true,
false
),
true()
),
choiceLayout: "STACKED",
validations: {}
),
a!textField(
label: fv!item.questiontext,
labelPosition: "ABOVE",
value: ri!newreferenceResponse[fv!item.questionOrder].answer,
saveInto: {
ri!newreferenceResponse[fv!item.questionOrder].answer,
a!save(
ri!newreferenceResponse[fv!index].questionid,
fv!item.questionid
),
a!save(
ri!newreferenceResponse[fv!index].temp,
""
),
a!save(
ri!newreferenceResponse[fv!index].isActive,
fv!item.isActive
),
a!save(
ri!newreferenceResponse[fv!index].questionOrder,
fv!item.questionOrder
),
a!save(
ri!newreferenceResponse.user,
local!user
),
a!save(
ri!newreferenceResponse[fv!index].datetime,
local!datetime
),
a!save(
ri!newreferenceResponse,
ri!newreferenceResponse
)
},
showWhen: if(
fv!item.levelIndicator = "2",
if(
ri!newreferenceResponse[tointeger(fv!item.refToParent)].answer = "Yes",
true,
false
),
true()
),
required: if(
fv!item.levelIndicator = "2",
if(
ri!newreferenceResponse[tointeger(fv!item.refToParent)].answer = "Yes",
true,
false
),
true()
)
)
)
}
)
}
)
},
showWhen: or(
local!refereceResponse.totalCount = 0,
ri!platformEdit = true
)
),
height: "TALL",
showWhen: or(
local!refereceResponse.totalCount = 0,
ri!platformEdit = true
),
style: "STANDARD"
)
}
)
