As of December 1, 2020, Focal Point is retired and repurposed as a reference repository. We value the wealth of knowledge that's been shared here over the years. You'll continue to have access to this treasure trove of knowledge, for search purposes only.
Join the TIBCO Community TIBCO Community is a collaborative space for users to share knowledge and support one another in making the best use of TIBCO products and services. There are several TIBCO WebFOCUS resources in the community.
From the Home page, select Predict: WebFOCUS to view articles, questions, and trending articles.
Select Products from the top navigation bar, scroll, and then select the TIBCO WebFOCUS product page to view product overview, articles, and discussions.
Request access to the private WebFOCUS User Group (login required) to network with fellow members.
Former myibi community members should have received an email on 8/3/22 to activate their user accounts to join the community. Check your Spam folder for the email. Please get in touch with us at community@tibco.com for further assistance. Reference the community FAQ to learn more about the community.
When I run a HTML report with structured ad hoc screen, I get the following message as the dynamic dropdown lists are being populated:
"A script on this page is causing Internet explorer to run slowly. If it continues to run, your computer may become unresponsive. Do you want to abort the script? "
Please, does anyone know how this problem can be resolved?
Thanks.This message has been edited. Last edited by: Kerry,
The list has a lot of entries. You can reply no to the message. A possible solution would be to a. use a procedure to load the dropdown box or b. create a separate file with the dropdown entries in it and load the box from there.
I am assuming that the backend data base from which you are extracting the discreet items is very large. Please correct me if I am wrong.
Check the "Customizing Dynamic Parameters" section in the wf761appsgt.pdf manual.
TABLE FILE GGSALES
PRINT DST.PRODUCT
BY PRODUCT
ON TABLE SET HOLDLIST PRINTONLY
ON TABLE PCHOLD FORMAT XML
END
Starting in 7.6.10, this is documented in the new HTML Composer manual.
Another thought. Even though your data changes freqently, maybe you could run a Report Caster job to create the 'distinct' file once or several times a day. Why don't you try this at least once to see if it helps the load time for your box.
OK - I have to put in a shameless plug for Summit 2010 in here...
Presentation Title: Supercharge Your Parameterized HTML Launch Pages with 7.6.9 Advanced Chaining Techniques!
Presentation Abstract: Need to build complex parameter-driven launch pages? Do response time issues prevent you from using controls with 100’s of values? See how to address these issues (and more) by taking advantage of the Advanced Chaining interface available in WebFOCUS 7.6.9. Create on-the-fly lists which leverage metadata information to populate list controls. Use guide-words to speed interaction in controls with many values. No JavaScript required!
-------------------------------------------
Ginny's got the right idea here. You can create a 'lookup' table that only has the distinct values you need. That will certainly reduce the time it takes to get the values. What I have found is that it is not the retrieval of the values that slows things down. It is the delivery of those values to the browser and populating the lists where things get hung up. Thus the error Internet Explorer is giving you. One thing I have done that is very useful is to structure the query that populates the list so it only returns 500 records at a time. Once you start getting to lists that are longer than that the browser gets unhappy.
Unfortunately, I don't have all my examples for the Summit presentation finished yet but I assume they will be available after the conference. If not, drop me a line and I'll send them to you.
Regards,
Dan
7.7.05M/7.7.03 HF6 on Windows Server 2003 SP2 output to whatever is required.
Posts: 393 | Location: St. Paul, MN | Registered: November 06, 2007
Wasn't there a similar presentation last year by David Glick?
Umun,
To move forward, I would suggest analysing the individual processes that are used to give the end result of your combo box.
Within the WF processing, an AJAX call is made to retrieve the data for use in populating your control. This is a distinct call to your reporting server to get the data, which is then returned to the browser in XML format. Javascript then flushes the existing combo box and repopultaes it with each pair of data items held within the returned XML file.
The first part of this process (the AJAX) can differ depending upon your attributes on the HTML control in question. If the "source" attribute is "typeMas" then the other two attributes "displayfield" and "datafield" are used to create a simple adhoc request of the form -
TABLE FILE tablename SUM FST.displayfield BY datafield ON TABLE PCHOLD FORMAT XML
END
You will see that most people follow that form when they create their own procedure for the XML feed ("source" attribute of "typeFex")
I would suggest that your first analysis is actioned around this process. Check that the data retrieval using a fex of the above form both returns the data that you expect and that it achieves the retrieval in an efficient manner. If the source data is on an RDBMS then ensure that the SQL is as efficient as it can be (e.g. uses indexing when possible and not a table space scan - check with your DBAs). If possible can you use views or even build subset tables (as per Ginny)?
Once you have that process as efficient as possible, then turn your attention to the amount of data being returned (e.g. network traffic) - limit it if you can by using a couple of combo boxes instead of one to reduce the ultimate selection (and therefore the amount of data that the Javascript has to handle).
i.e. If you have account codes that are 12 characters long, then identify whether they can be "ranged". Do some begin with "AA" and others "AB" etc.? If so then make your first combo the account prefix and restrict the second one (by using chaining) to account numbers beginning with the chosen prefix.
-* First proc -
DEFINE FILE account_codes
ACC_PREFIX/A2 = EDIT(ACCOUNT_CODE,'99$');
END
TABLE FILE account_codes
SUM FST.ACC_PREFIX
BY ACC_PREFIX
ON TABLE PCHOLD FORMAT XML
END
-* Second proc -
-DEFAULT &Acc_Prefix = 'AA'
DEFINE FILE account_codes
ACC_PREFIX/A2 = EDIT(ACCOUNT_CODE,'99$');
END
TABLE FILE account_codes
SUM FST.ACCOUNT_CODE
BY ACCOUNT_CODE
WHERE ACC_PREFIX EQ '&Acc_Prefix'
ON TABLE PCHOLD FORMAT XML
END
As you will find when creating reactive web pages, there are many things to consider and it requires a deal of lateral thinking to overcome some of the obstacles that you will encounter. There is no right or wrong way of achieving it, providing the process is as efficient as you can make it.
T
In FOCUS since 1986
WebFOCUS Server 8.2.01M, thru 8.2.07 on Windows Svr 2008 R2
WebFOCUS App Studio 8.2.06 standalone on Windows 10
Posts: 5694 | Location: United Kingdom | Registered: April 08, 2004
Originally posted by GinnyJakes: Check the "Customizing Dynamic Parameters" section in the wf761appsgt.pdf manual.
TABLE FILE GGSALES
PRINT DST.PRODUCT
BY PRODUCT
ON TABLE SET HOLDLIST PRINTONLY
ON TABLE PCHOLD FORMAT XML
END
Starting in 7.6.10, this is documented in the new HTML Composer manual.
Another thought. Even though your data changes freqently, maybe you could run a Report Caster job to create the 'distinct' file once or several times a day. Why don't you try this at least once to see if it helps the load time for your box.
I downloaded the file - wf761appsgt.pdf but couldn't find session 'Customizing Dynamic Parameters'. Please can you assist
If you downloaded the 7.6.10 version, then that section is in the HTML Composer manual. I dont' know if the section name is the same but the code is. Download that manual instead.
As an aside, I prefer DST. to FST. We have had issues using FST. related to SQL efficiency with Teradata.
Tony: The method I am using is exactly what you specified as in below:
TABLE FILE tablename SUM FST.displayfield BY datafield ON TABLE PCHOLD FORMAT XML END
It has various fields like country, date, dealers, retail_customers etc. The data in date, dealers and retail_customers seems to be very large. The data source is both CUBE and RDMS. It seems to me that the account prefix method may be cumbersome and may not work as there many records.
Some guys suggested using reportcaster to get the distinct values for the fields and storing same in Focus database and then using the hold file as source for my report. If I do this, how then do I get all records from original source when the report is run?
Another method is to use scripts and slider in displaying the first 10 records, then the next when a button is clicked. Please, do you know how this can be done?
Originally posted by GinnyJakes: Check the "Customizing Dynamic Parameters" section in the wf761appsgt.pdf manual.
TABLE FILE GGSALES
PRINT DST.PRODUCT
BY PRODUCT
ON TABLE SET HOLDLIST PRINTONLY
ON TABLE PCHOLD FORMAT XML
END
Starting in 7.6.10, this is documented in the new HTML Composer manual.
Another thought. Even though your data changes freqently, maybe you could run a Report Caster job to create the 'distinct' file once or several times a day. Why don't you try this at least once to see if it helps the load time for your box.
your method seems cool. But I replaced FST with DST in my HTML file and the error is still coming up. Please, can you provide more details?
I think you have too many entries. How many rows are in the XML file?
Please see Tony's post. He has some good suggestions.
I think I was one of the 'guys' who recommended loading the distinct values into a separate file for use by the dropdown box load program. This file and load program are independent of the program you are running to produce the actual report.
I don't believe the DST. prefix can be translated into SQL, so all detail records must be returned so WebFOCUS can perform the aggregation and sorting (which is why DST. only works with TABLE). For relational data sources, it should be faster to use TABLEF with SUM FST. or SUM MIN. (FST. is translated to MIN. anyway) and include any BY phrases. This approach should result in the relational DB performing all of the aggregation and sorting, and should be faster than having WebFOCUS perform these tasks. Using TABLE (instead of TABLEF) may cause the data to be summarized and sorted twice, first by the DB and then again by WebFOCUS. Tony's comments about finding ways to limit drop-down lists should be seriously considered.
WebFOCUS 7.7.05
Posts: 1213 | Location: Seattle, Washington - USA | Registered: October 22, 2007
I don't believe the DST. prefix can be translated into SQL, so all detail records must be returned so WebFOCUS can perform the aggregation and sorting (which is why DST. only works with TABLE).
That is absolutely not true. It translate to DISTINCT which is perfectly acceptable in SQL-speak.
Here is some working code:
TABLE FILE CWX_LEGAL0_VLITIGATION_MSTR
PRINT DST.BNSF_ATTY_NME
BY BNSF_ATTY_NME
WHERE BNSF_ATTY_NME NE '';
ON TABLE SET HOLDLIST PRINTONLY
-*ON TABLE PCHOLD FORMAT XML
END
With traces on, here is what it produces:
FOC2590 - AGGREGATION NOT DONE FOR THE FOLLOWING REASON:
FOC2594 - AGGREGATION IS NOT APPLICABLE TO THE VERB USED
SELECT DISTINCT T1."BNSF_ATTY_NME"(CHAR( 22)) FROM
CWX_LEGAL0.VLITIGATION_MSTR T1 WHERE (T1."BNSF_ATTY_NME" <> '
') ORDER BY T1."BNSF_ATTY_NME";
...RETRIEVAL KILLED
This happens to be against Teradata but I have also used it against DB2.
I stand corrected! However, I don't understand why DST. only works with TABLE. WebFOCUS must be performing some additional processing after the data is returned, otherwise DST. would work with TABLEF. That makes me wonder if TABLEF with SUM might perform better than TABLE with DST.
WebFOCUS 7.7.05
Posts: 1213 | Location: Seattle, Washington - USA | Registered: October 22, 2007
You really don't need to use TABLEF against relational tables as the setting AUTOTABLEF is on by default.
? SET AUTOTABLEF
If you ask for the data to be sorted by the relational engine, the AUTOTABLEF will keep it from being resorted by WebFOCUS upon receiving the answer set.
You can do a search on the IBI web site for full details of this setting. I couldn't find the relational reference but I do remember that what I said was true in regard to RDBMSs from my many years of supporting the EDA engine at IBI.
Hope this helps. I rarely use TABLEF except occasionally with flat files and FOCUS files if the need arises.
Ginny, thank you for the information. This is the first time I've heard about AUTOTABLEF. The documentation I found indicates the situations in which TABLEF is disabled and the internal matrix is created. Interestingly, DST. is not mentioned.
quote:
AUTOTABLEF can optimize all TABLE, EMR, and GRAPH requests except those that include the following syntax:
ACROSS FOR or BY sort field values value1 over value2... PCT. PCT.CNT. TOT. Within Multiple display commands (PRINT, LIST, SUM, COUNT) Multiple display paths (display fields from multiple paths)
WebFOCUS 7.7.05
Posts: 1213 | Location: Seattle, Washington - USA | Registered: October 22, 2007
I did some testing. AUTOTABLEF is set ON in our environment. I have an Oracle table with approx. 6400 rows and a code column that contains 17 distinct values. TABLE with PRINT DST., TABLE with SUM/BY, and TABLEF with SUM/BY all return 17 records to EDA from the generated SQL query. However, both TABLE queries create an internal matrix, while the TABLEF does not. (? STAT shows if an internal matrix has been created or not.) This seems contrary to the documentation for AUTOTABLEF, which essentially states that an internal matrix will not be created unless necessary. If the returned data is being loaded into the internal matrix before reporting, even if it is not being aggregated or sorted, then this could slow overall performance of the query.
WebFOCUS 7.7.05
Posts: 1213 | Location: Seattle, Washington - USA | Registered: October 22, 2007
Another reason to consider extracting the distinct values into a FOCUS database using Report Caster or the like, is that FOCUS tables can provide up to a ten times speed differential over some RDBMS - depends upon the design of the table(s) and index(es) of course! I have certainly achieved that sort of advantage against my current clients ERP system.
And don't forget that this is a three(?) part process - AJAX, data transmission and DHTML via Javascript. Each process can give you problems although it will be the last two that will be affected by dataset size. Reducing the amount of data you pass in each process will ultimately give you better response.
That has to be gauged against the number of mouse clicks that an end user has to make to achieve the final report, but for my money, I'd rather have an end user making a couple of extra clicks than waiting 5 minutes for all the chained combos being refreshed. Perhaps your end users would also be in this mind? Make them part of the design process then once you provide the finished interface they will feel that they have ownership (and they have little to complain about ).
T
In FOCUS since 1986
WebFOCUS Server 8.2.01M, thru 8.2.07 on Windows Svr 2008 R2
WebFOCUS App Studio 8.2.06 standalone on Windows 10
Posts: 5694 | Location: United Kingdom | Registered: April 08, 2004
Thank you guys for your suggestions. I am not an expert in this and have been finding it difficult to resolve the error issue. Here is a sample of what I am trying to achieve. The code is working but always showing this error "A script on this page is causing Internet explorer to run slowly" whenever it's loading the report variables in html dropdown list
**************************** TABLE FILE SAMPLE_FILE PRINT BCAT BPLAN SCD MCD FDATE SDATE OMNB CMNB ODNB CDNB VDATE CLOSE_DATE BY G_NM BY C_NM BY C_CODE WHERE LOC EQ '&LOC.(FIND LOC,LOC IN SAMPLE_FILE).LOC.'; WHERE NUCD EQ '&NUCD.(FIND NUCD,NUCD IN SAMPLE_FILE).NUCD.'; WHERE AC_DESC EQ '&AC_DESC.(FIND AC_DESC,AC_DESC IN SAMPLE_FILE).AC_DESC.'; WHERE B_NM EQ '&B_NM.(FIND B_NM,B_NM IN SAMPLE_FILE).B_NM.'; WHERE FPM_DESC EQ '&FPM_DESC.(FIND FPM_DESC,FPM_DESC IN SAMPLE_FILE).FPM_DESC.'; WHERE FDATE EQ '&FDATE.(FIND FDATE,FDATE IN SAMPLE_FILE).FDATE.'; WHERE SDATE EQ '&SDATE.(FIND SDATE,SDATE IN SAMPLE_FILE).SDATE.'; WHERE CLOSE_DATE EQ '&CLOSE_DATE.(FIND CLOSE_DATE,CLOSE_DATE IN SAMPLE_FILE).CLOSE_DATE.'; WHERE C_NM EQ '&C_NM.(FIND C_NM,C_NM IN SAMPLE_FILE).C_NM.'; WHERE G_NM EQ '&G_NM.(FIND G_NM,G_NM IN SAMPLE_FILE).G_NM.'; *******************
Below are the distinct count values for the variables (Total records for each variable is 1,626,842):
Wasn't there a similar presentation last year by David Glick?
Umun,
To move forward, I would suggest analysing the individual processes that are used to give the end result of your combo box.
Within the WF processing, an AJAX call is made to retrieve the data for use in populating your control. This is a distinct call to your reporting server to get the data, which is then returned to the browser in XML format. Javascript then flushes the existing combo box and repopultaes it with each pair of data items held within the returned XML file.
The first part of this process (the AJAX) can differ depending upon your attributes on the HTML control in question. If the "source" attribute is "typeMas" then the other two attributes "displayfield" and "datafield" are used to create a simple adhoc request of the form -
TABLE FILE tablename SUM FST.displayfield BY datafield ON TABLE PCHOLD FORMAT XML
END
You will see that most people follow that form when they create their own procedure for the XML feed ("source" attribute of "typeFex")
I would suggest that your first analysis is actioned around this process. Check that the data retrieval using a fex of the above form both returns the data that you expect and that it achieves the retrieval in an efficient manner. If the source data is on an RDBMS then ensure that the SQL is as efficient as it can be (e.g. uses indexing when possible and not a table space scan - check with your DBAs). If possible can you use views or even build subset tables (as per Ginny)?
Once you have that process as efficient as possible, then turn your attention to the amount of data being returned (e.g. network traffic) - limit it if you can by using a couple of combo boxes instead of one to reduce the ultimate selection (and therefore the amount of data that the Javascript has to handle).
i.e. If you have account codes that are 12 characters long, then identify whether they can be "ranged". Do some begin with "AA" and others "AB" etc.? If so then make your first combo the account prefix and restrict the second one (by using chaining) to account numbers beginning with the chosen prefix.
-* First proc -
DEFINE FILE account_codes
ACC_PREFIX/A2 = EDIT(ACCOUNT_CODE,'99$');
END
TABLE FILE account_codes
SUM FST.ACC_PREFIX
BY ACC_PREFIX
ON TABLE PCHOLD FORMAT XML
END
-* Second proc -
-DEFAULT &Acc_Prefix = 'AA'
DEFINE FILE account_codes
ACC_PREFIX/A2 = EDIT(ACCOUNT_CODE,'99$');
END
TABLE FILE account_codes
SUM FST.ACCOUNT_CODE
BY ACCOUNT_CODE
WHERE ACC_PREFIX EQ '&Acc_Prefix'
ON TABLE PCHOLD FORMAT XML
END
As you will find when creating reactive web pages, there are many things to consider and it requires a deal of lateral thinking to overcome some of the obstacles that you will encounter. There is no right or wrong way of achieving it, providing the process is as efficient as you can make it.
T
You suggestion looks good, thank you. is it possible to use numbers instead of 'AA', 'AB' etc. I wanted a solution where the first combo will be 1-20, 21-40 etc so that the first 20 records are shown in second combo, next 20 etc. Thank you