문제

I am developing a LiveCycle form that has a table on it that can have a variable amount of rows. I want to only validate it if there is data in one of the columns but not all of them. So I would skip the validation if the row is blank or all the columns in that row are filled in.

Any ideas how to do this. How would I loop through the rows of a table.

Thanks in advance, Paul

도움이 되었습니까?

해결책

I would tweat your answer a little bit by replacing resolveNodes that is quite slow.

  • In order to get row count you can use instanceManager TrainerForm._TrainerTable.count

  • To get a specific item from row list use <RowName>.all.item(index). Be carefull while using this construct because it requires a least one row. Row is a shourtcat for Row[0].

Here is your code with with my upgrades:

var rowCount = TrainerForm.TrainerTable._TrainerData.count;
for (var i=0;i<rowCount;i++)
{
    if (TrainerForm.TrainerTable.TrainerData.all.item(i).TrainerName.rawValue == null && 
        TrainerForm.TrainerTable.TrainerData.all.item(i).TrainerPrepHrs.rawValue == null && 
        TrainerForm.TrainerTable.TrainerData.all.item(i).TrainerArea.selectedIndex == -1 && 
        TrainerForm.TrainerTable.TrainerData.all.item(i).TrainerActivity.rawValue == null ) 
        ;//check the case where all rows are blank which is valid
    else
    {
        if (TrainerForm.TrainerTable.TrainerData.all.item(i).TrainerName.rawValue == null)
        {
           TrainerTableValid = false;          
           TrainerForm.TrainerTable.TrainerData.all.item(i).TrainerName.ui.#textEdit.border.fill.color").value = "255,0,0";
        }
        if (TrainerForm.TrainerTable.TrainerData.all.item(i).TrainerPrepHrs.rawValue == null)
        {
            TrainerTableValid = false;          
            TrainerForm.TrainerTable.TrainerData.all.item(i).TrainerPrepHrs.ui.#numericEdit.border.fill.color").value = "255,0,0";
        }
        if (TrainerForm.TrainerTable.TrainerData.all.item(i).TrainerArea.selectedIndex == -1)
        {
            TrainerTableValid = false;          
            TrainerForm.TrainerTable.TrainerData.all.item(i).TrainerArea.ui.#choiceList.border.fill.color").value = "255,0,0";
        }
        if (TrainerForm.TrainerTable.TrainerData.all.item(i).TrainerActivity.rawValue == null)
        {
            TrainerTableValid = false;          
            TrainerForm.TrainerTable.TrainerData.all.item(i).TrainerActivity.ui.#textEdit.border.fill.color").value = "255,0,0";
        }
    }
}  

다른 팁

You can put your script in validate event of your cells or whole row. The result of validation script is determined by the last line result (true or false); To make validations failure visible you can set form level validation (File->Form Properties->Form Validation->Color Failed Fields).

Another approach (that I personally prefer) is setting field as required using code fieldName.manadatory = "error" when some conditions are met. In order to make field optional just put fieldName.manadatory = "disabled".

Here is what I ended up doing. First I made all fields optional. Then I execute this code from a click event of a button.

    var fields = xfa.resolveNodes("TrainerForm.TrainerTable.TrainerData[*]");
for (var i=0;i<fields.length;i++)
{
    if (TrainerForm.TrainerTable.resolveNode("TrainerData[" + i + "]").TrainerName.rawValue == null && 
        TrainerForm.TrainerTable.resolveNode("TrainerData[" + i + "]").TrainerPrepHrs.rawValue == null && 
        TrainerForm.TrainerTable.resolveNode("TrainerData[" + i + "]").TrainerArea.selectedIndex == -1 && 
        TrainerForm.TrainerTable.resolveNode("TrainerData[" + i + "]").TrainerActivity.rawValue == null ) 
        ;//check the case where all rows are blank which is valid
    else
    {
        if (TrainerForm.TrainerTable.resolveNode("TrainerData[" + i + "]").TrainerName.rawValue == null)
        {
            TrainerTableValid = false;          
            xfa.resolveNode("TrainerForm.TrainerTable.TrainerData[" + i + "].TrainerName.ui.#textEdit.border.fill.color").value = "255,0,0";
        }
        if (TrainerForm.TrainerTable.resolveNode("TrainerData[" + i + "]").TrainerPrepHrs.rawValue == null)
        {
            TrainerTableValid = false;          
            xfa.resolveNode("TrainerForm.TrainerTable.TrainerData[" + i + "].TrainerPrepHrs.ui.#numericEdit.border.fill.color").value = "255,0,0";
        }
        if (TrainerForm.TrainerTable.resolveNode("TrainerData[" + i + "]").TrainerArea.selectedIndex == -1)
        {
            TrainerTableValid = false;          
            xfa.resolveNode("TrainerForm.TrainerTable.TrainerData[" + i + "].TrainerArea.ui.#choiceList.border.fill.color").value = "255,0,0";
        }
        if (TrainerForm.TrainerTable.resolveNode("TrainerData[" + i + "]").TrainerActivity.rawValue == null)
        {
            TrainerTableValid = false;          
            xfa.resolveNode("TrainerForm.TrainerTable.TrainerData[" + i + "].TrainerActivity.ui.#textEdit.border.fill.color").value = "255,0,0";
        }
    }
}   
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top