Expand my Community achievements bar.

SOLVED

How do I set the value of a dynamic row text field

Avatar

Level 2

I have a repeated row form which contains a button and multiple text fields.  There is a text field (Input Data Field) further up with some information I want to place in the table and multiple buttons that I want to read the value of and set to the table.  I apologize there are multiple questions I have and I am using pseudocode to describe it.

Top form looks like

InputField

| ButtonX1 | ButtonY1 | DescriptionX1 (read only Text Field)

...

| ButtonXn | ButtonY1 | DescriptionXn

OutputRow looks like

| ButtonOutput | OutputField1 | OutputField2 | OutputField3 |

So I would like it to do

ButtonX1.click

{

OutputTable.OutputRow.addInstance(true)  //this works - everything else I have questions on

OutputTable.OutputRow.OutputField1.rawValue = DescriptionX1.rawValue

/*

Question 1

How do I address the location in each table to set a value

Question 2

How do I get the value of the description field in the same table and row as the button

I would like to say something to the effect of  OutputTable.OutputRow[??].OutputField1.rawValue = this.parent.DescriptionX

*/

OutputTable.OutputRow.OutputField2 = InputField.rawValue

/*

  Same question as above - how do I specify a dynamic row - is this the proper syntax for getting the value from the input field?

*/

OutputTable.OutputRow.OutputField3 = this.ButtonLabel

/*

Question 3

  How can I get the value of the button's label to set in the field

  There should be very many of these buttons and buttons will be added - I would prefer to set the value based on the button's label to make the value easier - not requiring changing the code

*/

Question 4 - unrelated to those above.

Is it possible to build the first table

| ButtonX | ButtonY | Description |

from an XML File.  I have seen examples of how to build if it is just data, but can the XML be pushed into a form with code to do the above actions?

1 Accepted Solution

Avatar

Correct answer by
Former Community Member

Glad you figured it out ...nothing wrong with doing it that way.

Normally XML contains data and not captions so by default these xml files are bouond to the rawValue property. You can turn on dynamic binding and other properties of the object will become bindable(they appear as links) in the UI. If you click on the link for caption a wizard comes up allowing you to  bind to the appropriate node in the XML.

Paul

View solution in original post

4 Replies

Avatar

Former Community Member

Each object in a form must have a unique name. I doing so it is not neccessarily the name but the path or SomExpression associated with that object that must be unique. In your case you have a Table.Row.object configuration. The Row is the part that is repeating so to give each object a unique name an instance number is placed on the repeating part. So objects in the 1st row woudl be Table.Row[0].object...objects in the second row woudl be Table.Row[1].object etc .....You can see this by adding a debug instruction on the Enter event of the description field. Put the code app.alert(this.somExpression) and when you enter the field you will see what the somExpression is. Do this for a few rows and you will see the pattern (don't forget to remove the debug code from the enter event). Now you know what you have to use to address the fields. If no instance is given it is assumed to be 0 ..that is why only the 1st row is being affected.

So now to answer your questions:

Question1: The square bracket notation is an issue for javascript (this is the notation for an array) so we have to use a different means of addressing the field to include the instance number. So to address the Description in the 3rd row we woudl use:

xfa.resolveNode("Table.Row[2].Description").rawValue = "This is my new description";

Note that the instance number is 2 for the 3rd row because the instance numbers are 0 based.

Question2. The resolveNode notation allows you to pass a string so you can also concatinate expressions to make the string. If you are writing code on a button in the same row you can get the instance that you are on by using the expression this.parent.index. The "this" portion refers to the current object (the button) and the parent.index gets you th eindex of the Buttons parent. If the button is embedded deeper in a hierarchy then you can continue to add parent indicators until you get back to the node that you want. So rewriting your expression from Q1 it woudl be:

xfa.resolveNode("Table.Row[" + this.parent.index + "].Description").rawValue = "This is my new description";

Question3: The buttons caption can be retrieved by using ButtonName.caption.value.text.value

Question4: When you say build from an XML file. What are you expecting to come from the XML file? The caption that goes on the button? Typically the XML file carries data (not to say that it cannot carry other things). Just need a bit of clarification on this one first.

Hope that helps

Paul

Avatar

Level 2

Great, thanks for the answers. I have most of this working now

Event code - OnClick - ButtonX1

OutputTable.OutputRow.instanceManager.addInstance(true)

OutputTable.resolveNode("OutputRow[1]").OutputField1 .rawValue = this.parent.DescriptionX1.rawValue
OutputTable.resolveNode("OutputRow[1]").OutputField2 .rawValue = this.resolveNode("caption.value.#text").value
OutputTable.resolveNode("OutputRow[1]").OutputField3 .rawValue = InputField.rawValue

So

InputField (value set to "TestValue")

| ButtonX1 (caption "TESTCAPTION") | ButtonX2 (caption "TESTCAPTION2") | "Description of item"

leads to

OutputTable Row 0 | Some value | Some Value | Some Value

OutputTable Row 1 | Description of item | TESTCAPTION | TestValue

Question 2 continued

The button is in one table and the result is in another table.  I need to resolve the last added instance of the output table.

How do I know what the last instance that was added is?  Is there anyway besides iterating through all of the values?  What would I search for if I need to iterate?

The above code would always sets the second row's data.

Question 4

Exactly - the xml would contain captions that would go on the buttons.  I would to keep it simple but have something like

<MenuItem>

    <Button1>Caption</Button1>

    <Button2>Caption2</Button2>

    <Description>Description Field</Description>

</MenuItem>

The items on the menu will change often and updating the pdf everytime is difficult.  I suppose I could hard code the buttons and xml the description at the worst case?  I would prefer to be able to fill the whole table as the captions may prefer to be different

Avatar

Level 2

I think I figured out question 2 continued

OutputTable.resolveNode("OutputRow[" + OutputTable.OutputRowRow.instanceManager.count-1 + "]").OutputField3 .rawValue = InputField.rawValue

Is there a problem with doing it that way?

Avatar

Correct answer by
Former Community Member

Glad you figured it out ...nothing wrong with doing it that way.

Normally XML contains data and not captions so by default these xml files are bouond to the rawValue property. You can turn on dynamic binding and other properties of the object will become bindable(they appear as links) in the UI. If you click on the link for caption a wizard comes up allowing you to  bind to the appropriate node in the XML.

Paul

The following has evaluated to null or missing: ==> liqladmin("SELECT id, value FROM metrics WHERE id = 'net_accepted_solutions' and user.id = '${acceptedAnswer.author.id}'").data.items [in template "analytics-container" at line 83, column 41] ---- Tip: It's the step after the last dot that caused this error, not those before it. ---- Tip: If the failing expression is known to be legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: #assign answerAuthorNetSolutions = li... [in template "analytics-container" at line 83, column 5] ----