Clearing a View Object
Hi, I'm currently using an OracleStatement to do a custom query from the database and then copying that data over to a View Object. Sometimes when I do a set on the ViewRowImpl, I get the "Too many objects match the primary key oracle.jbo.Key[62 ]." I think this is because the View Object has somehow cached a previous version of that row in the JVM.
I am trying to clear the View Object with the following code but it doesn't always work. Sometimes, when I populate the View object with a new row that I know isn't in the VO it will clear everything but this doesn't happen consistently. Any ideas?
OAViewObject docVO = (OAViewObject)getDocumentVO1();
// OAViewObject docVO = new DocumentVOImpl();
// docVO.setPassivationEnabled(false);
// docVO.setMaxFetchSize(0);
// docVO.clearCache();
// delete everything
RowSetIterator delRSI = docVO.createRowSetIterator("delete");
delRSI.setRangeStart(0);
while(delRSI.hasNext())
DocumentVORowImpl row = (DocumentVORowImpl)delRSI.next();
row.refresh(Row.REFRESH_WITH_DB_FORGET_CHANGES);
delRSI.closeRowSetIterator();
// for some reason if we include the isPrepared check it doesn't clear
// the VO - disable it for now
// if(!docVO.isPreparedForExecution())
docVO.setWhereClause("1=0");
docVO.executeQuery();
// }
Hi Dave,
I am trying to do the same thing. Were you ever successful in refreshing your view object?
Thanks,
Joyce
Similar Messages
-
Clearing the View Object row changes
Hi
I have a table ,when I click on the table row the popup editPage for that row will appear. I made some changes and closing the page with out actually saving the data to the database. When closed the popup and I click the row next time I am getting the values I changed in the form. I want that form values should match exactly with the database values for that row. Means my uncommitted changes should not reflect in the form.How can I do this?
Thanks
SuneeshIn the bean you can use
// get the binding container
BindingContainer bindings = BindingContext.getCurrent().getCurrentBindingsEntry();
// get an Action or MethodAction
OperationBinding method = bindings.getOperationBinding("rollback");
method.execute();
List errors = method.getErrors();
if (errors != null)
// do something with the errors
}Make sure you have the rollback method defined in the pagedef of the page. Do do this you can drop the rollback method from the data control onto your page (e.g. as command button). Switch to source mode and look for the button code bound to the rollback. Select the code and remove it. It's essential that you do the remove in source view, otherwise the binding for the rollback method is removed from the pagedefg as well.
Timo -
Filter view object by selected values from list of values
Hello,
I've the following problem with my ADF Application. I have three view objects in my application module. Two of them are connected via a view link. For example take users, who are connected to their departments. The remaining view object consists of factories. Now I want to show the user/department dependency in a tree table and the available factories in a list of values. This list of values should be used to filter the shown users.
I've already tried to use bind variables in the users view object. But I don't know how to fill them with the value of the list of values.
Can someboy give me a tip how to solve this problem.
Best regards,
EnnoHi Enno,
Try this:
- Have a AM method with one parameter(which takes user from the list of values) and inside AM method write code to set the bind parameter value and execute the query
Sample Code
public void filterByUser(String user){
//Get your UserViewObject instance to userVO
userVO.setNamedWhereClauseParam("<Bind_Variable_Name>", user);
userVO.executeQuery();
}- Expose the method as client interface
- Drop the method (Data Control) as a button on to the page and pass the listofvalues value as a value to the method binding param
Something like this: ${bindings.<User>.inputValue}
- Finally refresh the master and detail tables based on the ListOfValues selection by setting partialTriggers property to the listofvalues component id
Hope it is clear
Sireesha
Edited by: Sireesha Pinninti on Oct 15, 2009 4:54 AM -
Hi All,
We are working on building a web application using on ADF.
The landing page of our application is a dashboard screen that is read-only with 100 to 500 records displayed in a table.
User can move to other pages and create requests.
1) When user is on dashboard and moves to other pages of the application, is there a way to release the memory used by view objects and underlying entity objects used by the views used to display the dashboard? Another point here is, our application requirement is to refresh the data from database when user moves between screens. Even if user switches back to dashboard screen after moving to other screen the data needs to be queried anyway. So for better memory management of the application we would like to release the memory for GC when user leaves our dashboard screens.
Another question I have is:
2) When a application module passivation occurs, will there be a snapshot taken for all view rows and entity caches or will it be only for pending DB state - entities added/modified/deleted? - We have lot of cases in our application where we display read-only dashboards and I am trying to understand if we can turnoff the passivation on view objects used to display read-only data if passivation deals with only pending DB state.
Please suggest.Hi,
1) When user is on dashboard and moves to other pages of the application, is there a way to release the memory used by view objects and underlying entity objects used by the views used to display the dashboard? Another point here is, our application requirement is to refresh the data from database when user moves between screens. Even if user switches back to dashboard screen after moving to other screen the data needs to be queried anyway. So for better memory management of the application we would like to release the memory for GC when user leaves our dashboard screens.
Note that premature optimization can be contra-productive and often is the root of all evil. In other words, as long as you don't experience performance problems, I would let the framework do its job - so be careful wanting too much without a reason. Anyway, to clear the entity cache (and this is the only memory you need to bother for) you can call <ApplicationModuleInstance>.getTransaction().clearEntityCache(String entityName);
clearEntityCache
public void clearEntityCache(java.lang.String entityName)
Clears the cache of the specified Entity Object. A value of null clears the caches of all Entities. If a View Object uses the Entity Object, the View Object's cache will be cleared as well.
Parameters:
entityName - the name of the entity whose cache is to be cleared. If null, caches for all entities are cleared.
Another question I have is:
2) When a application module passivation occurs, will there be a snapshot taken for all view rows and entity caches or will it be only for pending DB state - entities added/modified/deleted? - We have lot of cases in our application where we display read-only dashboards and I am trying to understand if we can turnoff the passivation on view objects used to display read-only data if passivation deals with only pending DB state.
Passivation is for pending changes only and not for all queried data. You define passivation on the AM level and you can switch it off there. In this case I suggest you use an Application Module that speacifically holds the dashboard queries.
Since performance is your concern I recommend you reading:
Advanced View Object Techniques - 11g Release 1 (11.1.1.7.0)
Tuning Application Module Pools and Connection Pools - 11g Release 1 (11.1.1.7.0)
Frank -
ADF BC: range paging on dynamic view object
hi!
i have a dynamically generated sql query and i want to get the results one page at a time. for this to work i create at runtime a view object and try to use range paging:
String sql = "SELECT ...";
ViewObject vo = appModule.createViewObjectFromQueryStmt("tmpVO"+System.currentTimeMillis(), sql);
vo.setRangeSize(pageSize);
vo.setAccessMode(RowSet.RANGE_PAGING);
vo.scrollToRangePage(pageNo);
vo.getEstimatedRowCount();
Row[] rows = vo.getAllRowsInRange();
vo.remove();
but when i run this it was pretty slow. so i traced the database session and saw that the executed query was the sql string, not the range paging select (SELECT * FROM (SELECT /*+ FIRST_ROWS */ IQ.*, ROWNUM AS Z_R_N FROM (...).
i use range paging on other view objects that are not dynamically generated and it works fine. please tell me what can i do to get only the specified page from the data base.
thank you
Edited:
here is the select i run:
SELECT UnitEO.UNIT_TYPE, UnitEO.UNIT_NR,
UnitTypeEO.USER_UNIT_TYPE,
UnitEO.UNIT_NR UNIT_NUMBER,
UnitEO.NUMBER_PLATE_ID,
AreaEO.AREA_NAME,
UnitEO.SERIAL_NR
FROM NW_UNIT UnitEO,
NW_UNIT_DETAILS NwUnitDetailsEO,
NW_UNIT_TYPE UnitTypeEO,
NW_AREA AreaEO,
NW_COMMUNICATION_COMPUTER ComputerEO
WHERE
UnitEO.deleted IS NULL
AND UnitEO.UNIT_NR = NwUnitDetailsEO.UNIT_NR (+)
AND UnitEO.UNIT_TYPE = NwUnitDetailsEO.UNIT_TYPE (+)
AND UnitEO.UNIT_TYPE = UnitTypeEO.UNIT_TYPE
AND UnitEO.AREA_ID = AreaEO.AREA_ID (+)
AND UnitEO.COMPUTER_ID = ComputerEO.COMPUTER_ID (+)
here is the jbo.debugoutput that was generated; it includes the creation of the app module, the execution of SearchEntityPkVO (a predefined vo, not paged), then the execution of the code above:
08/07/22 13:56:52 [436] Connected to Oracle JBO Server - Version: 10.1.3.36.73
08/07/22 13:56:52 [437] mPCollUsePMgr is false
08/07/22 13:56:52 [438] ViewObjectImpl.mDefaultMaxRowsPerNode is 70
08/07/22 13:56:52 [439] ViewObjectImpl.mDefaultMaxActiveNodes is 30
08/07/22 13:56:52 [440] Created root application module: 'enermet.aim.search.model.SearchAppModule'
08/07/22 13:56:52 [441] Locale is: 'en_US'
08/07/22 13:56:52 [442] ApplicationPoolImpl.resourceStateChanged wasn't release related. No notify invoked.
08/07/22 13:56:52 [443] Oracle SQLBuilder: Registered driver: oracle.jdbc.driver.OracleDriver
08/07/22 13:56:52 [444] Creating a new pool resource
08/07/22 13:56:52 [445] Trying connection/2: url='jdbc:oracle:thin:@AIMTEST:1521:AIM' ...
08/07/22 13:56:53 [446] Successfully logged in
08/07/22 13:56:53 [447] JDBCDriverVersion: 10.1.0.5.0
08/07/22 13:56:53 [448] DatabaseProductName: Oracle
08/07/22 13:56:53 [449] DatabaseProductVersion: Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Production With the Partitioning, OLAP and Data Mining options
08/07/22 13:56:53 [450] <AM MomVer="0">
<cd/>
<CONN/>
</AM>
08/07/22 14:00:21 [985] SearchEntityPkVO>#q old SQLStmtBufLen: 234, actual=163, storing=223
08/07/22 14:00:21 [986] select sep.pk_name, sep.position
from MD_SEARCH_ENTITY_PK sep
inner join MD_SEARCH_ENTITIES se
on se.entity_id = sep.entity_id
where se.name = :VarEntityName
08/07/22 14:00:21 [987] ViewObject: SearchEntityPkVO Estimated Row Count Query Statement:
08/07/22 14:00:21 [988] "SELECT count(1) FROM (select sep.pk_name, sep.position
from MD_SEARCH_ENTITY_PK sep
inner join MD_SEARCH_ENTITIES se
on se.entity_id = sep.entity_id
where se.name = :VarEntityName) "
08/07/22 14:00:21 [989] Bind params for ViewObject.getQueryHitCount: SearchEntityPkVO
08/07/22 14:00:21 [990] Binding param "VarEntityName": Unit
08/07/22 14:00:21 [991] ViewObject: SearchEntityPkVO Estimated Row Count: 2
08/07/22 14:00:21 [992] Clear QueryCollection in cache for VO tmpVO1216724421562
08/07/22 14:00:21 [993] ViewObject: tmpVO1216724421562 close prepared statements...
08/07/22 14:00:21 [994] tmpVO1216724421562>#q computed SQLStmtBufLen: 641, actual=601, storing=631
08/07/22 14:00:21 [995] SELECT UnitEO.UNIT_TYPE, UnitEO.UNIT_NR,
UnitTypeEO.USER_UNIT_TYPE,
UnitEO.UNIT_NR UNIT_NUMBER,
UnitEO.NUMBER_PLATE_ID,
AreaEO.AREA_NAME,
UnitEO.SERIAL_NR
FROM NW_UNIT UnitEO,
NW_UNIT_DETAILS NwUnitDetailsEO,
NW_UNIT_TYPE UnitTypeEO,
NW_AREA AreaEO,
NW_COMMUNICATION_COMPUTER ComputerEO
WHERE
UnitEO.deleted IS NULL
AND UnitEO.UNIT_NR = NwUnitDetailsEO.UNIT_NR (+)
AND UnitEO.UNIT_TYPE = NwUnitDetailsEO.UNIT_TYPE (+)
AND UnitEO.UNIT_TYPE = UnitTypeEO.UNIT_TYPE
AND UnitEO.AREA_ID = AreaEO.AREA_ID (+)
AND UnitEO.COMPUTER_ID = ComputerEO.COMPUTER_ID (+)
08/07/22 14:00:21 [996] *** createViewAttributeDefImpls: oracle.jdbc.driver.T4CPreparedStatement@4e6
08/07/22 14:00:21 [997] Bind params for ViewObject: tmpVO1216724421562
08/07/22 14:00:21 [998] Clear QueryCollection in cache for VO tmpVO1216724421562
08/07/22 14:00:21 [999] ViewObject: tmpVO1216724421562 close prepared statements...
08/07/22 14:00:21 [1000] Column count: 7
08/07/22 14:00:21 [1001] tmpVO1216724421562>#q computed SQLStmtBufLen: 641, actual=601, storing=661
08/07/22 14:00:21 [1002] SELECT UnitEO.UNIT_TYPE, UnitEO.UNIT_NR,
UnitTypeEO.USER_UNIT_TYPE,
UnitEO.UNIT_NR UNIT_NUMBER,
UnitEO.NUMBER_PLATE_ID,
AreaEO.AREA_NAME,
UnitEO.SERIAL_NR
FROM NW_UNIT UnitEO,
NW_UNIT_DETAILS NwUnitDetailsEO,
NW_UNIT_TYPE UnitTypeEO,
NW_AREA AreaEO,
NW_COMMUNICATION_COMPUTER ComputerEO
WHERE
UnitEO.deleted IS NULL
AND UnitEO.UNIT_NR = NwUnitDetailsEO.UNIT_NR (+)
AND UnitEO.UNIT_TYPE = NwUnitDetailsEO.UNIT_TYPE (+)
AND UnitEO.UNIT_TYPE = UnitTypeEO.UNIT_TYPE
AND UnitEO.AREA_ID = AreaEO.AREA_ID (+)
AND UnitEO.COMPUTER_ID = ComputerEO.COMPUTER_ID (+)
08/07/22 14:00:21 [1003] ViewObject: tmpVO1216724421562 Estimated Row Count Query Statement:
08/07/22 14:00:21 [1004] "SELECT count(1) FROM (SELECT UnitEO.UNIT_TYPE, UnitEO.UNIT_NR,
UnitTypeEO.USER_UNIT_TYPE,
UnitEO.UNIT_NR UNIT_NUMBER,
UnitEO.NUMBER_PLATE_ID,
AreaEO.AREA_NAME,
UnitEO.SERIAL_NR
FROM NW_UNIT UnitEO,
NW_UNIT_DETAILS NwUnitDetailsEO,
NW_UNIT_TYPE UnitTypeEO,
NW_AREA AreaEO,
NW_COMMUNICATION_COMPUTER ComputerEO
WHERE
UnitEO.deleted IS NULL
AND UnitEO.UNIT_NR = NwUnitDetailsEO.UNIT_NR (+)
AND UnitEO.UNIT_TYPE = NwUnitDetailsEO.UNIT_TYPE (+)
AND UnitEO.UNIT_TYPE = UnitTypeEO.UNIT_TYPE
AND UnitEO.AREA_ID = AreaEO.AREA_ID (+)
AND UnitEO.COMPUTER_ID = ComputerEO.COMPUTER_ID (+)
08/07/22 14:00:21 [1005] Bind params for ViewObject.getQueryHitCount: tmpVO1216724421562
08/07/22 14:00:26 [1006] ViewObject: tmpVO1216724421562 Estimated Row Count: 32732
08/07/22 14:00:26 [1007] Column count: 7
08/07/22 14:00:26 [1008] ViewObject: tmpVO1216724421562 Created new QUERY statement
08/07/22 14:00:26 [1009] tmpVO1216724421562>#q old SQLStmtBufLen: 661, actual=601, storing=631
08/07/22 14:00:26 [1010] SELECT * FROM (SELECT /*+ FIRST_ROWS */ IQ.*, ROWNUM AS Z_R_N FROM (SELECT UnitEO.UNIT_TYPE, UnitEO.UNIT_NR,
UnitTypeEO.USER_UNIT_TYPE,
UnitEO.UNIT_NR UNIT_NUMBER,
UnitEO.NUMBER_PLATE_ID,
AreaEO.AREA_NAME,
UnitEO.SERIAL_NR
FROM NW_UNIT UnitEO,
NW_UNIT_DETAILS NwUnitDetailsEO,
NW_UNIT_TYPE UnitTypeEO,
NW_AREA AreaEO,
NW_COMMUNICATION_COMPUTER ComputerEO
WHERE
UnitEO.deleted IS NULL
AND UnitEO.UNIT_NR = NwUnitDetailsEO.UNIT_NR (+)
AND UnitEO.UNIT_TYPE = NwUnitDetailsEO.UNIT_TYPE (+)
AND UnitEO.UNIT_TYPE = UnitTypeEO.UNIT_TYPE
AND UnitEO.AREA_ID = AreaEO.AREA_ID (+)
AND UnitEO.COMPUTER_ID = ComputerEO.COMPUTER_ID (+)
) IQ WHERE ROWNUM < :0) WHERE Z_R_N > :1
08/07/22 14:00:26 [1011] Bind params for ViewObject: tmpVO1216724421562
08/07/22 14:00:26 [1012] setting rownum query between (0, 23)
08/07/22 14:00:26 [1013] ViewObject: tmpVO1216724421562 close prepared statements...
PS: I am using JDev 10.1.3.36.73You have a couple of choices. You could create one view object with a bind variable parameter(s) and in the application module you have 10 instances of that VO with appropriate values set for the bind variable in each instance.
Or if you are using the LOV feature of a VO then you can set an attribute to point to one VO and then using a view cirteria applied to that specific LOV you can then "filter" the data that would appear in that LOV.
Does that help?
Grant Ronald -
ADF BC View Objects: Disappearing where clauses
Playing around with the 11g Technical Preview I find out that sometimes the where clauses - added to View Objects by means of the new "Join Type" field in the VO-editor UI - disappear.
I'm not able to reproduce exactly and "on demand", but it seems to happen when the sources of more than one View Object are open simultaneously and/or the XML definition of a View Object is edited directly on the Source-tab.Today I succeeded in reproducing:
Two tables:
TAB_MASTER:
ID NUMBER NOT NULL
DESCRIPTION VARCHAR2 NOT NULL
TAB_DETAIL:
ID NUMBER NOT NULL
MASTER_ID NUMBER NOT NULL
DESCRIPTION VARCHAR2 NOT NULL
TAB_DETAIL.MASTER_ID is a foreign key referencing TAB_MASTER.ID.
Steps to reproduce:
1. Generate default ADF BC objects from database tables.
2. Open definition of TAB_DETAIL View Object.
3. Go to the Entity Objects tab
4. Add TAB_MASTER Entity Object to the Selected Entities Objects. Association and Join Type are filled in automatically.
5. Go to the Query tab and go to SQL tab in de Property Inspector. Where clause is filled.
6. Go to the Attributes tab and click Add from Entity...
7. Add TAB_MASTER.DESCRIPTION attribute.
8. Again, go to the Query tab and go to SQL tab in de Property Inspector. Where clause is still filled.
9. Go to the Attributes tab and select MASTER_ID attribute.
10. Click icon to add List Of Values
11. In List Of Values dialog add View Object TAB_MASTER and add the correct pairs of List Return Values for the ID and (MASTER) DESCRIPTION attributes.
12. After completing the List Of Values dialog go to the Query tab -> SQL tab again. The where clause added to join the Entity Objects (see step 5.) is cleared, resulting in a wrong SQL statement for the View Object. -
Modify view object at responsibility level
Hello,
One of our business requirements is to change the drop-down values for several list of values based on the responsibility the user is logged in with. For example when creating a new application, the LOV 'Country' needs to list certain countries under the responsibility A and other countries under the responsibility B.
In order to accomodate this requirement, I have created an extension to the VO oracle.apps.igs.utilities.server.countriesVO that can be found on the create application page. I have tried two different approaches:
Approach 1:
I have modified the SQL code and used the import utility jpximport to enable the substitution and everything works fine EXCEPT that the substitution is done at the site level, not the responsibility level. There are no options to enable the substitution at the responsibility level.
I tried changing the MDS repository. After initial substitution, the query
BEGIN jdr_utils.printDocument('/oracle/apps/igs/utilities/server/customizations/site/0/CountriesVO'); END;
returns the XML for personalization (substitution). I deleted that entry using
BEGIN jdr_utils.deleteDocument('/oracle/apps/igs/utilities/server/customizations/site/0/CountriesVO'); END;
and used the import utility to import the XML at the responsibility level. the query
BEGIN jdr_utils.printDocument('/oracle/apps/igs/utilities/server/customizations/responsibility/23331/CountriesVO'); END;
returns the correct XML but the extension doesnt appear on the screen.
Do you know what I am missing and if it is possible to enable substitutions at the responsibility level (not site level) at all?
Approach 2:
I am still implementing the View Object extension but I am modifying the SQL code to handle the responsibility:
Original SQL Code:
SELECT territory_short_name,territory_code
FROM fnd_territories_vl
Updated SQL Code:
SELECT territory_short_name,territory_code
FROM fnd_territories_vl
WHERE fnd_global.resp_name <> 'A' OR fnd_global.resp_name IS NULL
UNION ALL
SELECT description as territory_short_name,territory_code
FROM fnd_territories_vl
WHERE fnd_global.resp_name = 'B'
ORDER BY 1
I used the import utility jpximport to enable the substitution and everything works fine EXCEPT that the View Object gets cached and the SQL statement is only executed the first time the object is called. If I clear the cache and I log in using the responsibility A then the countries are correctly displayed. If I login using the responsibility B then the countries for responsibility A are displayed. Same occurs if I clear the cache, login using responsibility B first then switch to responsibility A. Countries for responsibility B are always displayed.
We need to find a way for the SQL to be re-executed every time this object is called. This object should not be cached. Is that possible at all?
Thank you for your help
BenoitSubstitution of VO & AM will can be done only at site level. However controller extension can be personalized/substituted at any level, which includes responsibility level also.
Thanks,
--Anil
http://oracleanil.blogspot.com/ -
RowSetInfo; bc4j; how to get the View Object
So I'm trying to get/update/insert/delete records in a database that contain an interMedia image in a blob.
I've figured out that I can't simply set the ImmediateAccess attribute. It doesn't like that...
So I'm trying to go after the view object, since the interMedia white paper uses a VO row setAttribute to accomplish the write.
RowSetInfo extends ResultSetInfo which has a method getViewObject(). Cool.
So I try it... and get an error that getViewObject() has protected access.
Anyone know what I am doing wrong? Or should I be even taking this approach?!?!?!
If I go exclusively with the VO layer... how do I preserve the navigationBar functionality? Or do I need to roll my own?
( NOTE: This hilights another example of the perception of 'friction' between rowsetinfos and the view objects/entity objects. An approach that makes "sense" to me as a naive novice didn't pan out. And oddly, most of the bc4j examples go against VOs when, if you are an application programmer, you may never see or use the VO methods ( although it looks like we should be)... we're working at the ResultSetInfo layer. )
Is the the observation of other folk who are building Java Applications/Applets? Or do you all work directly with VOs instead of going through the ResultSetInfo "layer"?Here is some sample code that I am currently working on and will post on OTN when complete. The code shows how to access a BC4J Domain based on an Oracle type. Working with interMedia is similar since interMedia utilizes Oracle Object types. Please note that I have not tested this yet against interMedia, but I'm hoping that you may find the general process useful.
// Copyright (c) 2000 Oracle Corporation
package ObjectSampleDAC;
import oracle.dacf.control.swing.*;
import javax.swing.*;
import oracle.dacf.dataset.*;
import oracle.dacf.dataset.connections.*;
import java.awt.*;
import oracle.jdeveloper.layout.*;
import java.awt.event.*;
import javax.infobus.*;
import oracle.jbo.domain.DomainInterface;
import ObjectSampleBC4J.common.TAddress;
import java.sql.SQLException;
* A Frame class.
* <P>
* @author Scott Tiger
public class Frame1 extends InfoFrame {
* Constructs a new instance.
public Frame1() {
super();
try {
jbInit();
sessionInfo1.publishSession();
// call my initialization method
bfInit();
catch (Exception e) {
e.printStackTrace();
* Initializes the state of this instance.
private void jbInit() throws Exception {
/* All of the following code in this method was added by the designer except where noted below
EmailrowSetInfo1.setName("Email");
jPanel3.setLayout(gridBagLayout1);
StatusrowSetInfo1.setName("Status");
AddressrowSetInfo1.setName("Address");
PasswordrowSetInfo1.setName("Password");
UsernamerowSetInfo1.setName("Username");
LastnamerowSetInfo1.setName("Lastname");
FirstnamerowSetInfo1.setName("Firstname");
IdrowSetInfo1.setName("Id");
rowSetInfo1.setAttributeInfo( new AttributeInfo[] {
IdrowSetInfo1,
FirstnamerowSetInfo1,
LastnamerowSetInfo1,
UsernamerowSetInfo1,
PasswordrowSetInfo1,
AddressrowSetInfo1,
StatusrowSetInfo1,
EmailrowSetInfo1} );
this.setDataItemName("infobus:/oracle/sessionInfo1");
this.setTitle("Customer Information");
this.getContentPane().setLayout(borderLayout1);
this.setSize(new Dimension(536, 473));
jPanel1.setLayout(borderLayout2);
sessionInfo1.setAppModuleInfo(new ModuleInfo("ObjectSampleBC4J", "ObjectSampleBC4JModule"));
sessionInfo1.setConnectionInfo(new LocalConnection("MyJdbcConn"));
sessionInfo1.setName("sessionInfo1");
rowSetInfo1.setQueryInfo(new QueryViewInfo(
"CustomerView",
rowSetInfo1.setSession(sessionInfo1);
rowSetInfo1.setName("rowSetInfo1");
/* The following listener was added using the event tab in the property inspector in design
mode. The rowsetPopulated method is called when the rowset is queried/requeried.
rowSetInfo1.addChangeListener(new oracle.dacf.dataset.ChangeAdapter() {
public void rowsetPopulated(RowSetChangeEvent e) {
rowSetInfo1_rowsetPopulated(e);
textFieldControl1.setText("textFieldControl1");
textFieldControl2.setDataItemName("infobus:/oracle/sessionInfo1/rowSetInfo1/Firstname");
textFieldControl2.setText("textFieldControl2");
textFieldControl3.setDataItemName("infobus:/oracle/sessionInfo1/rowSetInfo1/Lastname");
textFieldControl3.setText("textFieldControl3");
textFieldControl4.setDataItemName("infobus:/oracle/sessionInfo1/rowSetInfo1/Username");
textFieldControl4.setText("textFieldControl4");
textFieldControl5.setDataItemName("infobus:/oracle/sessionInfo1/rowSetInfo1/Password");
textFieldControl5.setText("textFieldControl5");
textFieldControl6.setDataItemName("infobus:/oracle/sessionInfo1/rowSetInfo1/Status");
textFieldControl6.setText("textFieldControl6");
textFieldControl7.setDataItemName("infobus:/oracle/sessionInfo1/rowSetInfo1/Email");
textFieldControl7.setText("textFieldControl7");
navigationBar1.setDataItemName("infobus:/oracle/sessionInfo1/rowSetInfo1");
jLabel1.setText("ID:");
jLabel2.setText("First Name:");
jLabel3.setText("Last Name:");
jLabel4.setText("User Name:");
jLabel5.setText("Password:");
jLabel6.setText("Status:");
jLabel7.setText("Email:");
jLabel8.setText("Address:");
jPanel4.setLayout( gridBagLayout2);
textFieldStreet.setColumns(20);
textFieldStreet.setText("textFieldStreet");
/* The following listener (as well as the listeners on textFieldCity, textFieldState, and
textFieldZipcode were added by the designer, but the focusGained and focusLost methods
were modified in each case to call a common textField_focusGained method
textFieldStreet.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusGained(FocusEvent e) {
textField_focusGained(e);
public void focusLost(FocusEvent e) {
textField_focusLost(e);
textFieldCity.setColumns(20);
textFieldCity.setText("textFieldCity");
textFieldCity.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusGained(FocusEvent e) {
textField_focusGained(e);
public void focusLost(FocusEvent e) {
textField_focusLost(e);
textFieldState.setColumns(20);
textFieldState.setText("textFieldState");
textFieldState.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusGained(FocusEvent e) {
textField_focusGained(e);
public void focusLost(FocusEvent e) {
textField_focusLost(e);
textFieldZipcode.setColumns(20);
textFieldZipcode.setText("textFieldZipcode");
textFieldZipcode.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusGained(FocusEvent e) {
textField_focusGained(e);
public void focusLost(FocusEvent e) {
textField_focusLost(e);
jLabel9.setText("Street:");
jLabel10.setText("City:");
jLabel11.setText("State:");
jLabel12.setText("Zip Code:");
textFieldControl1.setDataItemName("infobus:/oracle/sessionInfo1/rowSetInfo1/Id");
this.getContentPane().add(jPanel1, BorderLayout.CENTER);
jPanel1.add(jPanel2, BorderLayout.NORTH);
jPanel2.add(navigationBar1, null);
jPanel1.add(jPanel3, BorderLayout.CENTER);
jPanel3.add(textFieldControl1, new GridBagConstraints2(1, 0, 1, 1, 1.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(37, 11, 0, 0), 0, 0));
jPanel3.add(textFieldControl2, new GridBagConstraints2(1, 1, 1, 1, 1.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(7, 11, 0, 0), 0, 0));
jPanel3.add(textFieldControl3, new GridBagConstraints2(1, 2, 1, 1, 1.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(7, 11, 0, 0), 0, 0));
jPanel3.add(textFieldControl4, new GridBagConstraints2(1, 3, 1, 1, 1.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(6, 11, 0, 0), 0, 0));
jPanel3.add(textFieldControl5, new GridBagConstraints2(1, 4, 1, 1, 1.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(6, 11, 0, 0), 0, 0));
jPanel3.add(textFieldControl6, new GridBagConstraints2(1, 5, 1, 1, 1.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(7, 11, 0, 0), 0, 0));
jPanel3.add(textFieldControl7, new GridBagConstraints2(1, 6, 1, 1, 1.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(6, 11, 0, 0), 0, 0));
jPanel3.add(jLabel1, new GridBagConstraints2(0, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(37, 106, 0, 0), 0, 0));
jPanel3.add(jLabel2, new GridBagConstraints2(0, 1, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(8, 54, 0, 0), 0, 0));
jPanel3.add(jLabel3, new GridBagConstraints2(0, 2, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(8, 54, 0, 0), 0, 0));
jPanel3.add(jLabel4, new GridBagConstraints2(0, 3, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(10, 54, 0, 0), 0, 0));
jPanel3.add(jLabel5, new GridBagConstraints2(0, 4, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(8, 62, 0, 0), 0, 0));
jPanel3.add(jLabel6, new GridBagConstraints2(0, 5, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(9, 83, 0, 0), 0, 0));
jPanel3.add(jLabel7, new GridBagConstraints2(0, 6, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(9, 86, 0, 0), 0, 0));
jPanel3.add(jLabel8, new GridBagConstraints2(0, 7, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(7, 72, 94, 0), 0, 0));
jPanel3.add(jPanel4, new GridBagConstraints2(1, 7, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
jPanel4.add(textFieldZipcode, new GridBagConstraints2(1, 3, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 10, 0, 0), 0, 0));
jPanel4.add(textFieldState, new GridBagConstraints2(1, 2, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 10, 0, 0), 0, 0));
jPanel4.add(jLabel9, new GridBagConstraints2(0, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 0, 0, 0), 0, 0));
jPanel4.add(textFieldStreet, new GridBagConstraints2(1, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 10, 0, 0), 0, 0));
jPanel4.add(jLabel10, new GridBagConstraints2(0, 1, 1, 1, 0.0, 0.0,
GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 0, 0, 0), 0, 0));
jPanel4.add(jLabel11, new GridBagConstraints2(0, 2, 1, 1, 0.0, 0.0,
GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 0, 0, 0), 0, 0));
jPanel4.add(jLabel12, new GridBagConstraints2(0, 3, 1, 1, 0.0, 0.0,
GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 0, 0, 0), 0, 0));
jPanel4.add(textFieldCity, new GridBagConstraints2(1, 1, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 10, 0, 0), 0, 0));
/* The following vaiable declarations were made by the designer
BorderLayout borderLayout1 = new BorderLayout();
JPanel jPanel1 = new JPanel();
SessionInfo sessionInfo1 = new SessionInfo();
RowSetInfo rowSetInfo1 = new RowSetInfo();
AttributeInfo IdrowSetInfo1 = new AttributeInfo(java.sql.Types.NUMERIC);
AttributeInfo FirstnamerowSetInfo1 = new AttributeInfo(java.sql.Types.VARCHAR);
AttributeInfo LastnamerowSetInfo1 = new AttributeInfo(java.sql.Types.VARCHAR);
AttributeInfo UsernamerowSetInfo1 = new AttributeInfo(java.sql.Types.VARCHAR);
AttributeInfo PasswordrowSetInfo1 = new AttributeInfo(java.sql.Types.VARCHAR);
AttributeInfo AddressrowSetInfo1 = new AttributeInfo();
AttributeInfo StatusrowSetInfo1 = new AttributeInfo(java.sql.Types.VARCHAR);
AttributeInfo EmailrowSetInfo1 = new AttributeInfo(java.sql.Types.VARCHAR);
JPanel jPanel2 = new JPanel();
JPanel jPanel3 = new JPanel();
TextFieldControl textFieldControl1 = new TextFieldControl();
TextFieldControl textFieldControl2 = new TextFieldControl();
TextFieldControl textFieldControl3 = new TextFieldControl();
TextFieldControl textFieldControl4 = new TextFieldControl();
TextFieldControl textFieldControl5 = new TextFieldControl();
TextFieldControl textFieldControl6 = new TextFieldControl();
TextFieldControl textFieldControl7 = new TextFieldControl();
BorderLayout borderLayout2 = new BorderLayout();
NavigationBar navigationBar1 = new NavigationBar();
JLabel jLabel1 = new JLabel();
JLabel jLabel2 = new JLabel();
JLabel jLabel3 = new JLabel();
JLabel jLabel4 = new JLabel();
JLabel jLabel5 = new JLabel();
JLabel jLabel6 = new JLabel();
JLabel jLabel7 = new JLabel();
JLabel jLabel8 = new JLabel();
GridBagLayout gridBagLayout1 = new GridBagLayout();
JPanel jPanel4 = new JPanel();
JTextField textFieldStreet = new JTextField();
JTextField textFieldCity = new JTextField();
JTextField textFieldState = new JTextField();
JTextField textFieldZipcode = new JTextField();
JLabel jLabel9 = new JLabel();
JLabel jLabel10 = new JLabel();
JLabel jLabel11 = new JLabel();
JLabel jLabel12 = new JLabel();
GridBagLayout gridBagLayout2 = new GridBagLayout();
/* The following declarations were made manually
/* DomainAccess provides a means for getting and setting values of a column object as domain
DomainAccess da = null;
/* TAddress is the domain class
TAddress addr = null;
/* Declare variables for determining if JTextField values have been changed by user
String oldVal = null;
String newVal = null;
/* The following method is generated by the wizard when the frame was created
protected void processWindowEvent(WindowEvent e) {
super.processWindowEvent(e);
if (e.getID() == WindowEvent.WINDOW_CLOSED) {
System.exit(0);
public void bfInit () throws Exception {
/* To add code to be invoked when the user moves from one row to another, get the
DataItemChangeManager from the RowSetInfo (via RowsetAccess) and add a
DataItemChangeListener. The specific method we want to use here is rowsetCursorMoved
which is invoked when the user moves from one row to another; the other methods are
defined simply because the interface requires them.
RowsetAccess ra = rowSetInfo1.getRowsetAccess();
DataItemChangeManager dcm = (DataItemChangeManager)ra;
dcm.addDataItemChangeListener(new DataItemChangeListener() {
public void rowsetCursorMoved(RowsetCursorMovedEvent e) {
rowSetInfo1_rowsetCursorMoved(e);
public void dataItemAdded(DataItemAddedEvent e) {
public void dataItemDeleted(DataItemDeletedEvent e) {
public void dataItemRevoked(DataItemRevokedEvent e) {
public void dataItemValueChanged(DataItemValueChangedEvent e) {
/* This method was generated by the designer. See rowSetInfo1.addChangeListener(...) in jbInit
above.
void rowSetInfo1_rowsetPopulated(RowSetChangeEvent e) {
try {
/* When the rowset is populated, set the JTextField values based on the domain. See
updateFields() below.
updateFields();
catch (Exception ex) {
System.out.println("Error occurred while retrieving values");
ex.printStackTrace();
/* This method was added manually to track row navigation. See dcm.addDataItemChangeListener(...)
in jbInit above.
void rowSetInfo1_rowsetCursorMoved(RowsetCursorMovedEvent e) {
try {
/* When the user moves from one row to another, set the JTextField values based on the
domain. See updateFields() below.
updateFields();
catch (Exception ex) {
System.out.println("Error occured while assigning values");
ex.printStackTrace();
/* This method finds the values from each field of the column object by using the domain, then
sets the values of the JTextFields respectively. It is invoked when the rowset is initially
populated, and each time the user moves from one row to another.
public void updateFields () throws Exception {
/* Get DataItem for the Address column object and cast to DomainAccess for to prepare for
getting and setting column value as domain.
da = (DomainAccess)AddressrowSetInfo1.getImmediateAccess();
/* Get the value of the attribute as a Domain and cast to DomainInterface.
DomainInterface di = da.getValueAsDomain();
/* null out addr. Otherwise, if the address column is null for a particular record, when
the user navigates to the record with the null values, addr will retain the previous record's
values. This ensures a clean slate.
addr = null;
/* Using DomainInterface allows us to cast the domain object to the specific Domain class for
that type. So, cast the address attribute's value to TAddress, the class that
represents the T_ADDRESS type created in the database. This provides getters and setters
for each of the fields of the Object Type.
if ( di instanceof TAddress ) {
addr = (TAddress) di;
/* If the above statement resulted in some non-null object assigned to addr, it is because
one or more of the fields of the domain contained non-null values. Therefore, if addr is
not null, get the values from each field of the domain and assign them to their
respective JTextFields. Otherwise, set each JTextField to an empty string.
if (addr != null) {
textFieldStreet.setText(addr.getStreet());
textFieldCity.setText(addr.getCity());
textFieldState.setText(addr.getState());
textFieldZipcode.setText(addr.getZipcode());
else {
textFieldStreet.setText("");
textFieldCity.setText("");
textFieldState.setText("");
textFieldZipcode.setText("");
/* If addr is null, after making sure the JTextFields are cleared, create a new TAddress
object so that we have something to assign values to if the user edits the JTextFields.
try {
addr = new TAddress();
catch (SQLException ex) {
System.out.println("Error creating domain TAddress");
ex.printStackTrace();
/* The method below is invoked when the user navigates to textFieldStreet, textFieldCity,
textFieldState, or textFieldZipcode. It's used just to find the value of the field when
the user enters the field (the "before" value).
void textField_focusGained(FocusEvent e) {
Object obj = e.getSource();
if (obj instanceof JTextField) {
JTextField field = (JTextField)obj;
oldVal = field.getText();
/* The method below is invoked when the user navigates away from textFieldStreet, textFieldCity,
textFieldState, or textFieldZipcode. It checks to see if the user changes the value of the
field, and if so, updates the value of the address attribute.
void textField_focusLost(FocusEvent e) {
/* Find out the value of the JTextField now that the user is attempting to leave the field.
Object obj = e.getSource();
if (obj instanceof JTextField) {
JTextField field = (JTextField)obj;
newVal = field.getText();
/* Compare the new value of the field ("after" value) to the "before" value captured
in textField_focusGained above. If they are equal, we do nothing. If they are not equal,
then the user must have changes the value in the field, and we have some work to do.
if (!oldVal.equals(newVal)) {
/* Since this same method is called regardless of which JTextField has been left, we find
out which text field the user is leaving, and then set the value of the appropriate
element of the addr domain.
if (obj.equals(textFieldStreet)) {
addr.setStreet(newVal);
if (obj.equals(textFieldCity)) {
addr.setCity(newVal);
if (obj.equals(textFieldState)) {
addr.setState(newVal);
if (obj.equals(textFieldZipcode)) {
addr.setZipcode(newVal);
/* So, we've set the value of the appropriate element of the addr domain, but we have not
"posted" those changes to the BC4J (middle-tier), so if we were to commit at this point
our changes would not get saved to the database (because BC4J is not aware of these
changes). The next step is to notify BC4J of the changes.
try {
da.setValueAsDomain(addr);
catch (InvalidDataException ex) {
System.out.println("Invalid Data assigned to TAddress");
ex.printStackTrace();
/* Clear out the oldVal and newVal variable so we are ready to track more changes.
oldVal = null;
newVal = null;
}-- Brian -
Setting bind variable for a view object from the Managed Bean
Hi,
i am using JDeveloper 11g, i have to create LOV in the JSF. To show the LOV, it has to populate data using View object and its query parameter need to be sent from the Managed Bean.
For the View object i want to set the bind variable parameter from the managed bean value. bename is stored in a managed bean (session scope)
#{beantest.bename}
But it gives the following exception.
JBO-29000: Unexpected exception caught:
org.codehaus.groovy.control.MultipleCompilationErrorsException,msg=startup failed, Script1.groovy: 1: expecting '!',found '{'@ line1, column 2.
I have followed the link http://kr.forums.oracle.com/forums/thread.jspa?threadID=615474 like Frank wrote on 8.2.2008:
But steps are not clear.
How to input the VO bind parameter with Managed bean variable?
Any Help
Regards
Raj
Edited by: user9928180 on Dec 17, 2008 9:51 AMHi,
a bind variable in a VO needs to be exposed as an executeWithParams operation in the pageDef file. Just add a new action binding to the pageDef file (context menu) and select the executeWithParams operation on teh VO. Then in the argument field, reference the managed bean property for the value
Frank -
How to use view objects in entity impls?
Hi!
I would like to access a view object to implement business logic
in an entity impl class method. How can this be done? More
precisely I would of course like to do this in the context of
the "current" Application Module the Entity "lives" in. I think
this has to be possible because you can use a list validator for
an entity objects attribute, which gets it's data out of a view
object.
Any help would be very welcome!
Regards
StefanStephan,
Just to make things clear, View Objects access Entity Objects
and you should implement your busines logic in the entity
objects. This is the way BC4J was designed. It allows for
reuse of your components and build different views (View
Objects) ontop of Entity Objects.
View objects do query the database and populate the entity
objects. However, it is from the cached data in the entity
objects where DML occurs (insert, update, delete). You want to
put your validation at this level because you do not want to
make a trip to the database if it does not validate.
I recommend reading a whitepaper on J2EE development and
BC4J. The URL
http://otn.oracle.com/products/jdev/htdocs/j2ee_with_bc4j/j2ee_wi
th_bc4j.html.
Happy Reading!
Hi!
I would like to access a view object to implement business logic
in an entity impl class method. How can this be done? More
precisely I would of course like to do this in the context of
the "current" Application Module the Entity "lives" in. I think
this has to be possible because you can use a list validator for
an entity objects attribute, which gets it's data out of a view
object.
Any help would be very welcome!
Regards
Stefan -
Java access to view objects from uix page provider
I have a java method called from a uix page as follows:
<dataScope>
<provider>
<data name="frameworkTableData">
<method class="smart.FrameworkAspects"
method="getFrameworkStudyAspects"/>
</data>
</provider>
I want the java program to be able to access the bc4j view objects defined on the page. These are:
<bc4j:registryDef>
<bc4j:rootAppModuleDef name="SmAspectsBrowseAppModule"
definition="smart.Smartbc4jModule"
releaseMode="stateful" >
<bc4j:viewObjectDef name="SmFrameworksBrowse"
rangeSize="0" />
<bc4j:viewObjectDef name="SmAspectsBrowse"
rangeSize="10" />
<bc4j:viewObjectDef name="SmStudyMembersAspectsEdit" />
</bc4j:rootAppModuleDef>
</bc4j:registryDef>
I've read through several of the threads on using Configuration.createRootApplicationModule(amDef, config) and it is not clear what it is looking for in the arguments. It appears that "config" is the name of the app module. I don't know what the amDef relates to.
Anyway, I can't get it to work. All I'm trying to do is get at 3 view objects I have defined in my bc4j section and am having trouble getting this to work.
Any ideas on how to approch this would be much appreciated.
Thanks, Steve
Does anyoneCan you explain how you solved the problem? I have the same. Thanks.
-
Which is better creating view accessor based on view object or view instanc
When creating view accessors whether in the entity object or in the view object, we have two options:
1- create the view accessor based on a view object.
2- create the view accessor based on a view instance.
what are the differences between these two options?
what are the cases where I should only use option 1 or option 2?
which one is better?Hello Timo,
I will try to explain my question better.
when we create view accessor, after click on create new view accessor icon, the create view accessor window is opened, at the header of this window there is a statement says:
Select a view object or shared view instance and shuttle it to the selected list to create a view accessor.
and here is my concern, which one to use
1- select a view object from one of the available view object and shuttle it to the selected list.
2- select a view instance from the application module and shuttle it to selected area.
If you have FOD sample (and I am sure you have it :) ), I see that oracle team has used both of them in different places, for examples
1- in oracle.fodemo.storefront.entities.PersonEO all view accessors are created from view instance in SharedLookupService application module.
<ViewAccessor
Name="PersonTypesVA"
ViewObjectName="oracle.fodemo.storefront.lookups.LookupsBaseVO"
AMUsageName="SharedLookupService"
ViewInstanceName="PersonTypes"/>is it because they are used to create LOV?
2- in oracle.fodemo.storefront.entities.OrderEO the view accessor is created from a view object, not from instance inside application module.
<ViewAccessor
Name="OrdersVO"
ViewObjectName="oracle.fodemo.storefront.store.queries.OrdersVO"/>I couldn't find the usage of this accessor?
Hope it is clear now. -
How to create LOV not based on a View Object attribute?
Hi,
I am creating a handed-made search form and I want to create an af:inputListOfValues.
I have :
- a read-only-view-object to get the LOV values from BD.
- af:inputListOfValues tag (droped from Component Palette).
How can I create the listOfValuesModel in Bindings layer? (the inputListOfValues is not based on a View Object attribute).Sorry, I think I am not very clear in my posts.
My requirement is to create a LOV but I have no ViewObject. I just want an input (not based on a view object attribute), alone, but with a LOV (where lov's datas are get from a view object).
In a "normal" LOV I would have something like this :
in jsff :
<af:inputListOfValues id="departmentIdId"
popupTitle="Search and Select: #{bindings.DepartmentId.hints.label}"
value="#{bindings.DepartmentId.inputValue}"
label="#{bindings.DepartmentId.hints.label}"
model="#{bindings.DepartmentId.listOfValuesModel}"
required="#{bindings.DepartmentId.hints.mandatory}"
columns="#{bindings.DepartmentId.hints.displayWidth}"
shortDesc="#{bindings.DepartmentId.hints.tooltip}">
<f:validator binding="#{bindings.DepartmentId.validator}"/>
<af:convertNumber groupingUsed="false"
pattern="#{bindings.DepartmentId.format}"/>
</af:inputListOfValues>in pageDef :
<listOfValues StaticList="false" IterBinding="EmployeesView1Iterator"
Uses="LOV_DepartmentId" id="DepartmentId"/>in model layer : a view object (EmployeeView) with view accessor and LOV based attribute, and a read only view object (DepartmentRVO) to get datas for the LOV.
But in my case I have no ViewObject, so I don't know how to create the listOfValuesModel in fragment pageDef.
I have :
<af:inputListOfValues label="Label 1"
popupTitle="Search and Result Dialog"
id="ilov1" model="here I want to point to a listOfValuesModel but I don't know how to create it"/>in pageDef : the listOfValuesModel but I don't know how to create it.
in model layer : just a read only view object (like DepartmentRVO), to get the datas for the LOV.
Edited by: h0s on 29 févr. 2012 00:31 -
How to execute Custom java data source LOV view object from a common mthd?
Hi,
My application contains Custom java data source implemented LOVs. I want to have a util method which gets the view accessor name, find the view accessor and execute it. But i couldn't find any API to get the view accessors by passing the name.
Can anyone help me iin how best view accessors can be accessed in common but no by creating ViewRowImpl class (By every developer) and by accessing the RowSet getters?
Thanks in advance.I am sorrry, let me tell my requirement clearly.
My application is not data base driven. Data transaction happens using tuxedo server.
We have entity driven VOs as well as programmatic VOs. Both are custom java data source implemented. Entity driven VOs will participate in transactions whereas programmatic VOs are used as List view object to show List of values.
Custom java datasource implementation in BaseService Viewobject Impl class looks like
private boolean callService = false;
private List serviceCallInputParams = null;
public BaseServiceViewObjectImpl()
super();
* Overridden for custom java data source support.
protected void executeQueryForCollection(Object qc, Object[] params, int noUserParams)
List dataFromService = null;
if(callService)
callService = retrieveDataFromService(serviceCallInputParams);
setUserDataForCollection(qc, dataFromService != null? dataFromService.iterator(): null);
super.executeQueryForCollection(qc, params, noUserParams);
* Overridden for custom java data source support.
protected boolean hasNextForCollection(Object qc)
Iterator<BaseDatum> datumItr = (Iterator<BaseDatum>) getUserDataForCollection(qc);
if (datumItr != null && datumItr.hasNext())
return true;
callService = false;
serviceCallInputParams = null;
setFetchCompleteForCollection(qc, true);
return false;
}Individual screen developer, who want to load data to VO, will do something like the below code in their VO impl class
public void fetch()
BaseServiceViewObjectImpl vo = this;
vo.setCallService(true);
vo.setServiceCallInputParams(new ArrayList());
vo.executeQuery();
}As these custom java data source implemented LOV VOs comes across the screens, i want to have a util method at Base VOImpl class, that gets the view accessor name, finds the LOV VO instance, retrieves data for that. I want to do something like
* Wrapper method available at Base Service ViewObject impl class
public void fetchLOVData(String viewAccessorName, List serviewInputParams)
// find the LOV View object instance
BaseServiceViewObjectImpl lovViewObject = (BaseServiceViewObjectImpl) findViewAccessor(viewAccessorName);
// Get data for LOV view object from service
lovViewObject.setCallService(true);
lovViewObject.setServiceCallInputParams(serviewInputParams);
lovViewObject.executeQuery();
Question:
1. Is it achievable?
1. Is there any API available at View Object Impl class level, that gets the view accessor name and returns the exact LOV view object instance? If not, how can i achieve it? -
Question on View Object method to use to reset a data entry form?
I am using a transient View Object form for the purpose of collecting and persisting data entered by users in a set of web data forms that span multiple pages. In the Application Module, I create the first row (see below.) After the user submits the last form, I programmatically add the data to the database (later may change to an Entity Object, but right now I don't use one.) So, the data they entered remains in the VO (it only ever has one row.)
My question is which method do I use to clear out the current set of data values. I tried VO.clearcache() but it deletes the row, and VO.reset() did not clear the data? If the only way is to delete the row, then please advise the best way to re-create the row or re-set the iterator.
thanks!
-- sample code to insert initial row in App Module --
protected void prepareSession(oracle.jbo.Session session) {
super.prepareSession(session);
insertTransientViewObjRows();
private void insertTransientViewObjRows() {
ViewObject transientvo = getView1();
transientvo.clearCache();
transientvo.insertRow(transientvo.createRow());
---- in service method after user submits the form and row remains in VO, I have tried: --
vo1.reset(); // does not delete data from the row
vo1.clearCache(); // deletes the rowThanks. Yes this looks more like what I need. How do I call this method from the client-tier, or from within a service method in my Application Module?
vo1 = findViewObject("myViewObject");
row = (MyViewRowImpl)vo1.first();
row.initDefaults();
compiler error message received:
Error(279,21): method initDefaults() has protected access in class oracle.jbo.server.ViewRowImpl
"Customer applications should not access this class on the client-tier of an application. Instead, the Row interface should be used for client tier access"
Which Row interface method can I call?
Message was edited by:
javaX
Maybe you are looking for
-
Can I open Lightroom without upgrading my catalog?
Unfortunately I'm not sure how to do a screen capture, so I'll try to type what I'm seeing. When I click on the LIghtroom icon, I get a message box that says "Please upgrade the catalog file "Lightroom Catalog 3" for use with Lightroom 3. It continu
-
"You're all set to complete your order" emails
I'm not sure if this happens to others but it is getting old how many of these emails I get. While browsing, I place items in my cart on BB.com to see the price when that's the only way to see the price or to save them until I'm finished browsing. Af
-
How to Improve Perfomance of JavaApp with several tabs in JDeveloper
Hi, One of my screens in my java application has several tabs. The master detail relationship is defined in a MDPanel using bindNestedContainer/findNestedPanelBinding constructs. If there are several wiews being linked to the master record, performan
-
MTOM attachment configuration in SOA and OSB
Hi All, We have a requirement to send Email to two SMTP gateways through OSB 11g, but due to constraint that we can not apply OWSM policies on MTOM enabled OSB service in OSB 11g, we are working on approach of routing request from SOA 11g to OSB so t
-
Editing a datapump .dmp file question
I am running 10.2.0.4 rdbms on hpux platfrom and I am taking a data pump export with content=metadata_only. I want to then import this metadata into a new database install which will be running an 11.2.0.3 database. I want to be able to change the de