Expand my Community achievements bar.

SOLVED

Searchable drop down menu?

Avatar

Level 2

I have several drop down lists in a PDF I am creating. These drop down lists contain diagnoses to be used by physicians. With there being a LOT of diagnoses, it would be extremely convenient if I had a "search" function of some kind that could be utilized as the wording of the descriptions for the codes/diagnoses can vary: (Ex. "Rib Pain" or "Pain in Rib")

As of now, the only option is to select the first letter of the name they believe the diagnosis to have. Using this example, they would select the drop down menu and press "R" and the list would jump down to the beginning of the R's. But, if the name is actually "Pain in Rib", they would have to search through all the other diagnosis codes to locate it.

I believe a search function would be the most appropriate for something like this. But, I am having some trouble locating any info on coding for something of this nature. If there are any suggestions that could make this, (or something that accomplishes the same task), possible, I am all ears.

Thanks!

I included a pdf with the fragment with the drop down menus as well as a list of the diagnoses I have in them.

I appreciate any help or ideas. I've never been let down by the people here in these forums.

1 Accepted Solution

Avatar

Correct answer by
Level 8

I was able to use the Net.HTTP and SOAP object to access the same DMTI service, but it worked only on the console window:

var jData;

var prm =

{cVerb:"GET",

aHeaders: [{name: "Authorization", value:"authentication-token"}],

cURL: "https://app2.dmtispatialxxx.com/servicesxxx/rest/suggest?limit=60&includePostalCode=true&address=20%...",

oHandler: {

   response: function (msg, uri, e) {

    console.println("\nThis is the response method:");

    console.println("msg=" + msg);

    //for (var p in msg) {

    //  console.println("p=" + p);

    //  console.println("msg[p]=" + msg[p]);

    //}

    var data = SOAP.stringFromStream(msg);

    jData = JSON.parse(data);

    console.println("Length of json data: " + jData.length);

    console.println("data=" + data);

    console.println("e=" + e);

   }

}

};

Net.HTTP.request(prm);

Response from the console window:

This is the response method:

msg=[object Stream]

Length of json data: 5

data=[{"matchCount":1,"suggestion":"20 CROWN STEEL DR MARKHAM ON L3R9X9","aliasSuggest":null},{"matchCount":1,"suggestion":"20 CROWN ST QUINTE WEST ON K8V1N6","aliasSuggest":null},{"matchCount":1,"suggestion":"20 CROWN ST ST. CATHARINES ON L2M3L3","aliasSuggest":null},{"matchCount":1,"suggestion":"20 CROWN ST THUNDER BAY ON P7B3J6","aliasSuggest":null},{"matchCount":1,"suggestion":"20 RUE CROWN DANVILLE QC J0A1A0","aliasSuggest":null}]

e=undefined

Unfortunately, the above method didn't work from a the click event of a button (in Adobe LiveCycle form). I got this error:

NotAllowedError: Security settings prevent access to this property or method.

Net.HTTP.request:19:XFA:form1[0]:subform[2]:Button4[0]:click

It looks like the only option now is to develop a wrapper component that can be invoked using the simple URL and to include the authentication token in the query parameters. Also, there is another problem... I have to get authentication code every time it is expired. Currently, there is Java code responsible for this part.

Question:

Why not develop a simple javascript program that can be invoked using HTML or jsp code, and return the result by clearing the output and just dump the result from the xhr response object? While I can develop the server component, but it seems a lot more easier to develop such component using only HTML and javascript. But, I am not  sure if it can be done, I just think it is possible.

View solution in original post

66 Replies

Avatar

Level 10

Hello Bibhu,

You would have got all the countries returned in your submit data because the data connection contained all the countries in my sample.  If you only wanted the values selected then there are a number of ways you can do this.  Possibly the easiest for a relatively static set of data like countries would be to put them in their own dataset.  You can do this manually in the XML Source tab or if your data is more dynamic then programmatically in the initialise event.  The example in the below link has the countries hard coded in the XML but there is code in the "Load Country List" button click event that loads the countries as well ... although this example just hard codes the countries this list could be held on the server.

https://acrobat.com/#d=xqToK-8CdJC01vfso*7DUQ

To explain the code.  The following line uses a predicate to select a subset of xml nodes from the countries list, in this case any country with a name that contains the characters in xfa.event.newText.

     list = xfa.resolveNodes('$record.country.[At(Lower(name),Lower("'+xfa.event.newText+'")) > 0]');

The following code loads up the listbox.  The country xml looks like <country id="AU" name="AUSTRALIA" /> so the resolveNodes method above will return a list of dataValue objects representing this xml, so they will name and id properties also of type dataValue, so you need to use the value property to return the current value.

   for (var i = 0; i < list.length; i++)
   {
       var country = list.item(i);
       Results.CountryList.addItem(country.name.value, country.index.toString());
   }

Regards

Bruce

Avatar

Level 9

Hello Bruce,

I am not facing any problem in your xml. But when I am using some other xml file, some times the list boxes shows no value and sometimes the list box shows values but it's written only "Empty " over there. Could you please help me in writing the code if I give you the XML ??

Thanks.

Bibhu.

Avatar

Level 10

Hi Bibhu,

Can you post your xml here? if so I can have a look.

Bruce

Avatar

Level 9

Hello Bruce,

Though my XML contains huge data I am giving it by trimming the XML.

<?xml version="1.0" encoding="UTF-8"?>
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:noNamespaceSchemaLocation="dbo_ElectronicForm_UK.xsd" generated="2010-12-13T13:02:57">
<dbo_ElectronicForm_UK>
<ItemNumber>DG1061-6</ItemNumber>
<Title>Handtooled Mini Horizontal </Title>
<Price>9.99</Price>
</dbo_ElectronicForm_UK>
<dbo_ElectronicForm_UK>
<ItemNumber>DG1062-3</ItemNumber>
<Title>Handtooled Mini Vertical </Title>
<Price>9.99</Price>
</dbo_ElectronicForm_UK>
<dbo_ElectronicForm_UK>
<ItemNumber>DG1063-0</ItemNumber>
<Title>Handtooled Mini Verso </Title>
<Price>0</Price>
</dbo_ElectronicForm_UK>
<dbo_ElectronicForm_UK>
<ItemNumber>DG1064-7</ItemNumber>
<Title>Back Pocket Mini Horizontal </Title>
<Price>9.99</Price>
</dbo_ElectronicForm_UK>
<dbo_ElectronicForm_UK>
<ItemNumber>DG1065-4</ItemNumber>
<Title>Back Pocket Mini Vertical </Title>
<Price>9.99</Price>
</dbo_ElectronicForm_UK>
<dbo_ElectronicForm_UK>
<ItemNumber>DG1066-1</ItemNumber>
<Title>Saddleworn Mini Horizontal </Title>
<Price>9.99</Price>
</dbo_ElectronicForm_UK>
<dbo_ElectronicForm_UK>
<ItemNumber>DG1067-8</ItemNumber>
<Title>Saddleworn Mini Vertical </Title>
<Price>0</Price>
</dbo_ElectronicForm_UK>
<dbo_ElectronicForm_UK>
<ItemNumber>DG1068-5</ItemNumber>
<Title>Saddleworn Mini Verso </Title>
<Price>0</Price>
</dbo_ElectronicForm_UK>
<dbo_ElectronicForm_UK>
<ItemNumber>DG1069-2</ItemNumber>
<Title>Foiled Mini Horizontal </Title>
<Price>9.99</Price>
</dbo_ElectronicForm_UK>
<dbo_ElectronicForm_UK>
<ItemNumber>DG1070-8</ItemNumber>
<Title>Foiled Mini Vertical </Title>
<Price>0</Price>
</dbo_ElectronicForm_UK>
</dataroot>

Though I have many requirements , Intial requirement is the same as contry name with Title here, means there would be a textfield named search Title and when some one types some character in the Title then it will create a dropdown as it used to do in case of country example.

Thanks.

Bibhu.

Avatar

Level 9

Hello Bruce,

Somehow after a lot of tweaking I have made this work. Will be back after sometime with mote doubts to bug you. Thanks

Bibhu.

Avatar

Level 10

Hi Bibhu,

Glad you got it sorted.  This is what I would have done;

list = xfa.resolveNodes('xfa.datasets.dataroot.dbo_ElectronicForm_UK.[At(Lower(Title),Lower("'+xfa.event.newText+'")) > 0]');
for (var i = 0; i < list.length; i++)
{
  var electronicFormUK = list.item(i);
  Results.CountryList.addItem(electronicFormUK.Title.value, electronicFormUK.index.toString());
}

Bruce

Avatar

Level 9

Hello Bruce,

One more thing I would like to ask. I am trying to use xml schema along with xslt transformation to restrict the xml only to those field values that are filled rather than all the embeded data. But when I open the xml that's sent I could only see the column values say "ItemTitle" with no value in it. Could you please guide me into the same ?

Thanks.

Bibhu.

Avatar

Level 10

Hi Bibhu,

If this is something you are trying to do on the server side then it is very unlikely I can help.  Have you tried the method I suggested above, in the sample form

https://acrobat.com/#d=xqToK-8CdJC01vfso*7DUQ ?

Bruce

Avatar

Level 9

Hello Bruce,

I have huge amount of data to be embeded. And all those data change from time to time. So I guess it's not a good idea to use hardcoded value. Is there any alternative ?

Thanks.

Bibhu.

Avatar

Level 10

Hello Bibhu,

I'm guessing your data is currently part of your data connection, maybe you can load this data in it's own dataset, similar to the "Load Country List" button click event code in my sample and then delete it from the data connection.  Alternatively you could load the alternative dataset using a webservice or maybe an OLEDB connection (though I have not done that).

There is also a preSubmit event which would allow you to script changes to the form data before it is submitted.

Bruce

Avatar

Level 8

Bruce,

Just to say thank you. I will use your sample in my forms for DDL.

Tarek.

Avatar

Level 9

Hello Bruce,

I am really glad that you find time to guide me in this. Is it possible to write the code that will delete the data connection befote submitting the form. I mean to say the user first import the xml file into the form and fill the form and clicks the submit button. When the user clicks the submit button which would send it as xml , can we write some script in the pre submit event of the form so that it would delete the data connection ? If yes, could you please give me the example? One more thing would the script work as expected in Adobe Reader 8/9. I am using LiveCycle Designer ES 8.2.

Thanks.

Bibhu.

Avatar

Level 10

Hi Bibhu,

You should be able to delete nodes in your data connection using the following code in the preSubmit event.

$record.nodes.remove($record.dataroot);

This will remove all xml nodes in the data connection from dataroot down ... so you will probably have to change the code to match your requirements but hopefully you get the idea.

Good luck.

Bruce

Avatar

Level 9

Hello Bruce,

I first put a button on my form to test it whether it's working or not. In the click event of the button in the JavaScript I have put the cose as you have said.But I get the following error.

testschema.JPG

When I used it in FormCalc I got the following error.

accessor $record.datarot is unknown. I am confused , how to do it ? More over like you said I have to put it in pre-submit event. So where should I put it ? In the parent subform or by creating a button and putting the script in the click event and then calling that event in the submit button ?? Please help ..I am going mad about this XML..

Thanks.

Bibhu.

Avatar

Level 10

Hello Bibhu

This code is JavaScript but as I don't know the structure of your data connection this is just an example, you will have to change the "$record.dataroot" to suit your data connection structure ... the error you are getting would suggest that "$record.dataroot" does not exist.  You may also have to change the "$record.nodes" part.  The remove method will remove the specified node and all its child nodes so the first "$record" should refer to the parent of the node you want to delete and "$record.dataroot" should relate to the node you want to delete.

Regards

Bruce

Avatar

Level 9

Hello Bruce,

I am attaching here the dataview panel as well as the hierarchy panel here. Please have a look and kindly suggest the code to write where and how ? The name of the XML file am ttaching is Information.xml. Does the name of the XMl file has to play any role here ?

dataconnection1.JPG

dataconnection2.JPG

Thanks a lot for having the patience to help me.

Bibhu.

Avatar

Level 10

Hello Bibhu,  I am not sure what data you wish to remove.  Somthing like

$record.nodes.remove($record.ItemInformation);

Should remove the ItemInformation node and all the nodes below it.

I don't think it matters were the code goes, whatever makes sense to you.  Maybe the preSubmit of the top form element or maybe the preSubmit of the button on your form.

Bruce

Avatar

Level 9

Hello Bruce,

I did the same as you have said. But I do not know why it's sending all the embeded XML data ?? Where am I wrong ?

Thanks.

Bibhu.

Avatar

Level 9

Hello Bruce,

One interesting observation I have made. I have kept this code : $record.nodes.remove($record.CustomerInformation); in the click event of a button and I have repeatedly clicked it. I saw it' s gradually removing the nodes. Is it possible to loop through all the nodes by a single click and exclude the choice that we have made in the dropdown , so that it would send the xml of the dropdown as well as it's associated field value which are present in the same node as of the dropdown in the xml .

Thanks a lot for guding me in this complex implementation.

Wishing you and your family a Very Happy New Year 2011 

Bibhu.

Avatar

Level 2

I'm getting an error message when I double click on one of the list items to populate the search field.  Can someone help me populate the search field with the selected list item when clicked?? Here is the message I'm getting.

Capture.PNG