ADF 10.1.2/10.1.3: Preventing eagerly querying of detail viewobjects

Ever since we started developer ADF applications we had issues with database queries being performed when we didn't expect it. It turned out that this is the default behavior of the master-detail synchronization in ADF 10.1.2 and 10.1.3 (haven't tested 11 yet). I've come up with a solution of our own, which I want to share with you all. I also want to check if anybody here sees any drawbacks in this approach.
First some background info: Whenever the master view object is requeried or navigates to another row it requeries all detail view objects that have been queried previously. Detail view objects that are in their initial/clean state are not touched.
So, on the very first page of your application you might need DEPT and EMP, and they are automatically queried (since the ADF bindings are refreshed). However, when you navigate to the next page it might only use the DEPT ViewObject. If you navigate to another DEPT, the EMP query is also re-executed even if this next page doesn't have a binding for EMP.
Steve Muench described a possible workaround (number 74) at
http://radio.weblogs.com/0118231/stories/2004/09/23/notYetDocumentedAdfSampleApplications.html
Although his solution works, we didn't really like it. Here's a summary of his approach:
<ul>
<li> add a method <tt>enableDetailsForViewInstances()</tt> to the ADF BC Application Module. This accepts an array of view instance names representing the views used on the current page. It then enabled/disables the master-detail synchronization for each viewlink based so that only the viewlinks relevant to the current page are enabled.</li>
<li> add a custom <tt>JSFPageLifecycle</tt> class that overrides the <tt>prepareModel()</tt> method.
This methods assembles a list of all view instances used by the iterator bindings of the current page. It then calls the method on the ADF BC Application Module to enable/disable the viewlinks</li>
</ul>
The Application Module disables master-detail synchronization by calling <tt>removeMasterRowSetIterator()</tt> on the detail viewobject. This removes the master-RowSetIterator from the default RowSetIterator of the detail VO, effectively breaking the link. The old master-RowSetIterator is kept in a HashMap. Later, when both the master and detail VO are used on the same page the link is restored by calling <tt>setMasterRowSetIterator()</tt> on the detail with the master-RowSetIterator stored in the HashMap.
The main objection we had to this approach is that you are pushing the relevant viewobjects from the View layer to the Model layer. We would like the Model not to be too knowledgable about the View layer. Also, this means things break if you get a hold of a detail viewobject some other way, for instance by calling findViewObject on the AppModule or by having an old reference to the detail VO. If you get hold of such a VO instance without calling <tt>enableDetailsForViewInstances()</tt> it would not have a master-rowsetiterator and an exception is thrown about the bind parameter from the viewlink being null.
I tried to find a solution that is transparent to the View layer or other client. I wanted a solution where the eager master-detail navigation is disabled and the detail would only be requeried/refreshed when explicitely called for. This could either be your custom code calling the ViewObject or the JSF View layer having an ADF binding to the ViewObject. Basically I want to try to reset the detail ViewObject to its initial/clean state as the master VO won't requery the detail VO's that are in the initial stage. It only requeries the detail VOs that have a default RowSet and RowSetIterator.
After quite some digging around I came up with:
<ul>
<li>clear/close the <tt>RowSetIterator</tt> on the detail <tt>ViewObject</tt> when navigating to another row in the master <tt>ViewObject</tt>. To do this, we use a <tt>DetailClearingListener</tt> class that implements the <tt>RowSetListener</tt> interface.</li>
<li>The <tt>DetailClearingListener</tt> class implements the <tt>navigated(NavigationEvent event)</tt> method. This gets executed when the (master) ViewObject navigates to another row. In this <tt>navigate()</tt> method I iterate over <tt>ViewObject.getViewLinks()</tt> to find all the links where the navigating ViewObject is the source (=master). Then I look at the ViewObject from the destination (=detail) part of the link.
For each detail ViewObject I get the RowSetIterators by calling <tt>ViewObject.getRowSetIterators()</tt>. Then I close all these RowSetIterators by calling <tt>closeRowSetIterator()</tt> on them</li>
<li>The tricky part was to properly register this listener with the master ViewObject. As it turns out, you can call <tt>addListener()</tt> on the ViewObject, but in fact it is just relaying this to the default RowSetIterator of the ViewObject. It's the RowSetIterator that registers the listeners and calls them when required. This proved to be a problem, when a ViewObject is both the detail in a master-detail relationship and also the master in (another) master-detail relationship.
With the DetailClearingListeners in place, the first (highest) master-detail relationship will close the default RowSetIterator on it's detail VO when navigating the master. Unfortunately this also destroys the registered listeners on this default RowSetIterator that need to managed the lower master-detail relationship.
The only workable solution we could find is to override the <tt>getDefaultRowSet()</tt> method in the ViewObject and register the listener there. This means that whenever the default rowset (and rowsetiterator) is requested, we make sure we register the DetailClearingListener before returning the rowset. Since we can't test if the listener is already registered it does mean we frequently register the listener even when it is not necessary. Luckily enough the internal implemention does prevent duplicates and will ignore any new listeners that are already registered. This is why we are creating only a single instance of the DetailClearingListener and store it in a private member variable of the ViewObject. That way, we use the same DetailClearingListener instance each time and duplicates are prevented.</li>
<li>The big benefit of this approach is that only relies on changes to the ViewObject. This can easily be implemented by giving all your ViewObjects a common superclass that implements this solution. In most cases, you already have an application- or enterprise-wide ViewObjectImpl class that is the basis for all your ViewObjects. In that case, you can just implement the solution in that global class.</li>
</ul>
We've tested this solution in ADF 10.1.2 and 10.1.3 applications and found dramatic performance gains. We had one application were page requests took 10-15 seconds once you visited all pages in the application (thereby activating each ViewObject at least once). It was not uncommon for a navigation to another row in the master ViewObject to trigger 70-100 queries, since all the detail (and detail-detail, etc) ViewObject where eagerly requeried. With this new approach, page response times have dropped below 1 second.
So, at least in our situaton, this solution seems to work. I'm just wondering what the downside of closing the RowSetIterator is. There must be some drawbacks to this approach, but it seems I can't find any so far. Hopefully some of you can suggest what the danger/drawback is in closing a RowSetIterator.

Shay's question about experience is a good one. If you're not already proficient at UIX then I would choose JSF. If you've done very little J2EE/Java/JSP/HTML development work, you've got a couple of months of ramping up to be able to accomplish much tangible.
I've been working on a project for a couple of months using ADF BC on the backend and JSF/ADF Faces for the View. The enticement was built on the expectation that 10.1.3. would be going into production very soon, and it seems that this is true, from what little hints and clues I can pick up from these tight-mouthed Oracle guys. ;-)
The disadvantage of going that way is that the documentation sucks for doing anything but the most basic, declarative user interface development, especially if you want to use ADF Faces (there's some decent resource out in the world for JSF development, although even that is pretty thin). This is promised to be much improved with the production release.
For the business services development, unless you already know ADF Business Components I strongly recommend grabbing a copy of the Oracle JDeveloper 10g Handbook. It fills in many of the gaps that otherwise leave you at a loss for how to tie the backend pieces together.
Good luck!
Johnny Lee

Similar Messages

  • ADF BC : setNamedWhereClauseParam() on detail ViewObject

    hi
    Using JDeveloper 10.1.3.0.4, I have some trouble setting a named where clause parameter on a "detail" ViewObject.
    I have an ApplicationModule (DetailSubsetService) with two instances of the same ViewObject (EmpsInMonth) that has a bind variable (vHireMonth). The ViewObject instances are "AllEmpsInMonth" and "EmpsInMonthForDept".
    In the sample application below, I try to change the bind variable value using setNamedWhereClauseParam() on a ViewObject instance. The default for "vHireMonth" is "05".
    System.out.println("DetailSubsetStuff.main() : begin");
    String vAppModuleDef = "poc.detailsubset.services.DetailSubsetService";
    String vConfig = "DetailSubsetServiceLocal";
    ApplicationModule vAppModule =
         Configuration.createRootApplicationModule(vAppModuleDef, vConfig);
    ViewObject vAllEmpsInMonth = vAppModule.findViewObject("AllEmpsInMonth");
    vAllEmpsInMonth.setNamedWhereClauseParam("vHireMonth", "02");
    while (vAllEmpsInMonth.hasNext())
         EmpsInMonthRow vEmpsInMonthRow = (EmpsInMonthRow)vAllEmpsInMonth.next();
         System.out.println("vEmpsInMonthRow info = "
              + vEmpsInMonthRow.getEname()
              + ", " + vEmpsInMonthRow.getHiredate()
              + ", " + vEmpsInMonthRow.getDeptno());
    ViewObject vEmpsInMonthForDept =
         vAppModule.findViewObject("EmpsInMonthForDept");
    System.out.println("vEmpsInMonthForDept = " + vEmpsInMonthForDept);
    vEmpsInMonthForDept.setNamedWhereClauseParam("vHireMonth", "12");
    ViewObject vDeptView = vAppModule.findViewObject("DeptView");
    while (vDeptView.hasNext())
         DeptViewRow vDeptViewRow = (DeptViewRow)vDeptView.next();
         System.out.println("vDeptViewRow info = "
              + vDeptViewRow.getDeptno() + ", " + vDeptViewRow.getDname());
         RowIterator vEmpsInMonthRI = vDeptViewRow.getEmpsInMonth();
         while (vEmpsInMonthRI.hasNext())
              EmpsInMonthRow vEmpsInMonthRow =
                   (EmpsInMonthRow)vEmpsInMonthRI.next();
              EmpsInMonthRowImpl vEmpsInMonthRowImpl =
                   (EmpsInMonthRowImpl)vEmpsInMonthRow;
              System.out.println("-- vEmpsInMonthRowImpl.getViewObject() = " +
                   vEmpsInMonthRowImpl.getViewObject());
              System.out.println("-- vEmpsInMonthRow info = "
                   + vEmpsInMonthRow.getEname()
                   + ", " + vEmpsInMonthRow.getHiredate()
                   + ", " + vEmpsInMonthRow.getDeptno());
    Configuration.releaseRootApplicationModule(vAppModule, true);
    System.out.println("DetailSubsetStuff.main() : end");This results in output like:
    DetailSubsetStuff.main() : begin
    vEmpsInMonthRow info = ALLEN, 1981-02-20, 30
    vEmpsInMonthRow info = WARD, 1981-02-22, 30
    vEmpsInMonthForDept = poc.detailsubset.dataaccess.EmpsInMonthImpl@2b
    vDeptViewRow info = 10, ACCOUNTING
    vDeptViewRow info = 20, RESEARCH
    -- vEmpsInMonthRowImpl.getViewObject() = poc.detailsubset.dataaccess.EmpsInMonthImpl@2f
    -- vEmpsInMonthRow info = ADAMS, 1987-05-23, 20
    vDeptViewRow info = 30, SALES
    -- vEmpsInMonthRowImpl.getViewObject() = poc.detailsubset.dataaccess.EmpsInMonthImpl@2f
    -- vEmpsInMonthRow info = BLAKE, 1981-05-01, 30
    vDeptViewRow info = 40, OPERATIONS
    DetailSubsetStuff.main() : endThere seems to be no problem for the ViewObject instance "AllEmpsInMonth".
    For the ViewObject instance "EmpsInMonthForDept", I try to bind the value "12", but the default value "05" stays in effect.
    From the output it is clear that for the same ViewObject instances a different Java object instance gets used when accessed using the method getEmpsInMonth() on the master row. If I'm correct this is intended ADF BC framework behaviour.
    My question is ...
    How do I set a value for a named where clause parameter on such a detail ViewObject?
    If I run the DetailSubsetService in the Oracle Business Component Browser there is no problem changing the value for the bind variable in this detail ViewObject instance. I gues this is because the BC Browser shows master-detail relations based on iterators it gets from the source and destination of a ViewLink instance. I don't think I can use a similar approach because I really want to use the getEmpsInMonth() method on a master row because I want to pass the master row into a VelocityContext so I can approach it using the Velocity Template Language.
    thanks
    Jan Vervecken

    Thanks for your reply Blaise.
    Both of your suggestions check out to be valid, but I don't think any of them can be directly applied in the VelocityContext scenario I need.
    It appears that I also need a non-ADF BC interface like java.util.Iterator to use in this Velocity Template Language, so I introduced this BCIterator class that delegates to a RowIterator:
    package poc.detailsubset;
    import java.util.Iterator;
    import oracle.jbo.JboException;
    import oracle.jbo.RowIterator;
    public class BCIterator
         implements Iterator
         RowIterator fRowIterator = null;
         public BCIterator(RowIterator pRowIterator)
              if (pRowIterator == null)
                   throw new JboException("pRowIterator should not be null");
              fRowIterator = pRowIterator;
         public boolean hasNext()
              return fRowIterator.hasNext();
         public Object next()
              return fRowIterator.next();
         public void remove()
              fRowIterator.removeCurrentRow();
    }If something like this exists in the ADF BC API, let me know.
    Based on your suggestions I introduced this method in DeptViewRowImpl:
    public Iterator getEmpsInMonthIterator()
         ApplicationModule vAppModule = getApplicationModule();
         ViewObject vEmpsInMonthForDept =
              vAppModule.findViewObject("EmpsInMonthForDept");
         return new BCIterator(vEmpsInMonthForDept);
    }So I can now write my loops like so:
    ViewObject vEmpsInMonthForDept =
         vAppModule.findViewObject("EmpsInMonthForDept");
    vEmpsInMonthForDept.setNamedWhereClauseParam("vHireMonth", "12");
    ViewObject vDeptView = vAppModule.findViewObject("DeptView");
    while (vDeptView.hasNext())
         DeptViewRow vDeptViewRow = (DeptViewRow)vDeptView.next();
         for(Iterator vEmpsInMonthIterator = vDeptViewRow.getEmpsInMonthIterator();
              vEmpsInMonthIterator.hasNext(); )
              EmpsInMonthRow vEmpsInMonthRow =
                   (EmpsInMonthRow)vEmpsInMonthIterator.next();
    }This will probably work in my VelocityContext scenario. (I haven't been able to test this yet.)
    All suggestions for improvements are still welcome.
    Like how to avoid having to now the ViewObject instance name (EmpsInMonthForDept) in the master row implementation class (DeptViewRowImpl). Or how to use the detail ViewObject instances the framework provides without having to call setNamedWhereClauseParam() for each master row explicitly.
    regards
    Jan

  • ADF 10.1.3.4: 'losing' newly created row in master-detail-detail.

    Situation:
    I have a page in JSF/ADF with the following set up.
    Top-half of the page is a table.
    Underneath the table is on the left a selectonelistbox component and next to it on the right a tabbed section.
    The table -> selectonelistbox relation is master-detail.
    The selectonelistbox -> tabbed section is master-detail.
    So when you change the selection in de seletonelistbox the data in the tabbed section changes.
    One of the functions in a tabbed section is a createinsert.
    step1: select value '1' in the selectonelistbox.
    step1: a new row is create (with createinsert). there is no commit yet, the row is in the entity cache.
    step2: change the selection to '2' in the selectonelistbox.
    step3: create a new row (with createinsert).
    step4: commit the changes.
    We see that only the row of the current row is committed. The newly created row under value '1' has disappeared.
    There are no warnings/exception thrown.
    How can I commit all newly created rows?
    It must be possible to created several new rows, before committing if it is possible.
    Some specs:
    JDeveloper 10.1.3.4.0
    using the embedded OC4J server
    JDK
    Thanks,
    Goldhorn

    Which technology are you using?

  • ADF BC: modifying VO bind params before executing the query

    Hi gang
    I've a use case in ADF BC where I need to modify View Object bind parameters (eg. convert strings to uppercase) entered by users to change the result of the underlying VO query, and show the modified bind parameters to the user after the query.
    Normally I would do this in the VO query by modifying the query where clause with the appropriate SQL. However this method is not applicable in this specific use case as the user doesn't get to see the modified bind parameters as a result.
    I've thought about a few options including:
    1) Generating the bind parameter accessors for the ViewObjectImpl and overriding the bind parameter setters to convert all string values to uppercase. This wasn't suitable as it looks like ADF Faces RC doesn't make use of the accessors via the default ADF bindings.
    2) Overriding the applyViewCriteria() method in the ViewObjectImpl - which however isn't appropriate as it applies to search fields entered as view criteria, not bind parameters.
    3) Overriding the executeQueryForCollection() method in the ViewObjectImpl - I thought I was on a winner here as I could retrieve the bind parameters via a call to getNamedWhereClauseParams(), modify the bind params and then call setNamedWhereClauseParams() to set them back. Unfortunately to really set the params I then need to call executeQuery() inside executeQueryForCollection() which puts the VO in a loop. You can see my sample code below:
    @Override
    protected void executeQueryForCollection(Object queryCollection,
                                             Object[] bindParams,
                                             int noUserParams) {
      AttributeList bindParamList = getNamedWhereClauseParams();
      String[] bindParamNames = bindParamList.getAttributeNames();
      Object[] bindParamValues = bindParamList.getAttributeValues();
      boolean valueChange = false;
      if (bindParamNames != null && bindParamValues != null) {
        String bindParamName = null;
        Object bindParamValue = null;
        for (int i = 0, j = bindParamNames.length; i < j; i++) {
          bindParamName = bindParamNames;
    bindParamValue = bindParamValues[i];
    if (bindParamName != null && !bindParamName.equals("")) {
    if (bindParamValue instanceof String) {
    if (bindParamValue != null && !bindParamValue.equals("")) {
    bindParamList.setAttribute(bindParamName, (Object)((String)bindParamValue).toUpperCase());
    valueChange = true;
    } // else do nothing; null String
    } // else do nothing; only interested in converting Strings to upper case
    } // else do nothing; bind parameter name is null
    } // else do nothing; bind parameter name or value list is null
    if (valueChange) {
    setNamedWhereClauseParams(bindParamList);
    // executeQuery(); // we can't do this; causes an infinite loop
    super.executeQueryForCollection(queryCollection, bindParams, noUserParams);
    I can think of a number of solutions/hacks in ADF Faces RC to get around this issue, but ideally I'd like to keep the solution in the model layer. Does anybody have a better idea of how I could do this? Your help appreciated.
    Thanks & regards,
    CM.
    PS. JDev 11g Boxer 5188: ADF BC + ADF Faces RC

    Hi Chris,
    have you tried modifying the passed-in bindParams argument to work around the need to call executeQuery()?
    That's what I would've done:
    I would have set the named where clause params (like you do) and after that I would have tried to get a new parameters Object[] back by calling ViewRowSetImpl.getParametersAsStorageType() and pass that to the super call.
    Sascha

  • How to prevent duplicate entry in Details block

    Dear All
    I am using Forms 10g.
    I have a detail block.
    There is a column called Ip_Address.
    There i want to prevent duplicate entry .
    How can i do this ?

    hey i have a requirement that to restrict duplicate entry in both block(both multi record).the blocks are DEPT(MATER)
    EMP(DETAIL)
    the associated fieds in master block DEPT.DEPT_NO,in detail EMP.EMP_ID .
    I have done' Kevin D Clarke’s calculated item ' both in master and detail block
    its working fine for master block but in case of detail block its only respond to the current session(i.e. if the new value is inserted or save it will restrict another record to be inserted of that last record's value),it does not restrict duplicate value enter ,checking with other existing records(which are saved in earlier session,though after query it is shown on the form)
    can anyone guide me why its not working

  • In the Calendar app in Yosemite, how can I prevent the event's details window to disappear when transferring focus to another app?

    When you click on an event to get the full details in a separate window, like a phone number for the meeting, if you move to another app like Skype the details window hides and you cannot look at the comments.
    This is kind of annoying.

    It's not iDVD that opens when you insert a burned DVD,  It's DVD Player.  Set the Apple preferences to igonre when inserting a video DVD.  You will have to launch DVD Ripper manually and locate and open the VOB folder on the DVD disk.
    OT

  • Prevent User Query on CSA!

    Before version 4.5 of CSA, it was very easy to allow or disallow users access to the User Query boxes. Most users don't know what this information means, so why bother them? It seems that now this feature is set up separately on each policy or module?
    What is the easiest method of locking down everyone in a group so that they do not get these User Query boxes?

    I assume you mean User Interactive mode. So if I understand you want the users in a particular group to not be prompted by the events taht CSA generates.
    The agent control rule is now in the ALL Windows group (for Windows users) that everybody goes in. You can either adjust this rule, which will affect ALL users or you can create a new rule that will go in specific groups that allow User Interaction for the groups that you want it allowed. THen disable the agent control rule in the ALL Windows group.

  • Best practice tunning parameters for tunning ADF apps?

    Hi all,
    I am tuning our 11g ADF app for around 3 billions (can be up to 10 billions records) and the concurrent connections up to 100. The app is running on a 16 core Intel chip and 8GB of RAM. The Weblogic used Rockit JDK. Any one have this experience please share and help me! I am considering what is the top ten crucial parameters for this tuning. Up to now I just have tunned some parameters from OS layer to app layers:
    - indexing for queries
    - open cursors, processes and pga memory
    - share pool for app module and jdbc pooling.
    - heap size of JVM memory only max value 1024 because of 32 bit Windows (Perhaps I must upgrade to 64 bit OSs to use more memory)
    The app was tested with Jmeter with only 10 concurrent connection and the test case is logging in and query and logging out. It ran very slow. I found out that the weblogic server did not use CPUs equally (only 1-2 CPus were used)
    Thank you and best regards.
    Elton Son.

    Hi,
    maybe this of interest:
    http://download.oracle.com/docs/cd/E12839_01/web.1111/e13814/toc.htm
    http://download.oracle.com/docs/cd/E15523_01/core.1111/e10108/adf.htm#CIHHGADG
    http://www.oracle.com/technetwork/articles/systems-hardware-architecture/tuning-adf-t-series-168445.pdf
    http://andrejusb.blogspot.com/2009/08/oracle-adf-tuning-preventing-sql-query.html
    Frank

  • Error msg after scan "ADF does not contain any pages"

    HP office jet 6600 has worked well for months, but recently 3 out of 5 times that I tried to scan from the ADF, whether one page or many, the scanner runs through its cycle and then gives me the following error: “The scanner automatic document feeder (ADF) does not contain any pages. Insert the pages to be scanned into the ADF and try again.”
    Sometimes I just run it again and it works. I'm using HP scan that came with the 6600 download full driver package; running Windows 7 64-bit. I use the scanner significantly and it has operated perfectly for over a year and I haven't changed anything that I know of.Appreciate any help that somebody can give me… I have cleaned rulers and "flicked the little white thing", and some of the other things that were mentioned for similar problems.

    Hello  I would be happy to help you with the automatic document feeder (ADF)  issue you are having with the Officejet 6600. Even though it's a different issue this document has several steps you can try; Vertical Bands, Lines, or Streaks in Copies, Faxes, or Scans. I've copied the applicable steps here for you. Clean the scanner glass and scanner lid If the scanner glass or the white underside of the lid has fingerprints, smudges, lint, dust, or other debris, this can slow performance and affect copy and scan quality. To resolve this issue, clean the product.Before you begin, gather the following materials:Several clean, soft, lint-free clothsMild glass cleaner
     CAUTION:Use only glass cleaner to clean the scanner glass. Do not use cleaners that contain abrasives, acetone, benzene, or carbon tetrachloride. These substances can damage the product. Avoid isopropyl alcohol (rubbing alcohol) because it can leave streaks on the glass.Press the Power button () to turn off the product.Disconnect the power cord from the rear of the product.Lift the scanner lid.
    Figure : Lift the scanner lid
    Spray a clean, soft, lint-free cloth with mild glass cleaner.
     CAUTION:To protect the scanner, do not spray the glass cleaner directly on the glass.Clean the scanner glass, and the glass strip next to the scanner glass, with the lint-free cloth.
    Figure : Clean the scanner glass and the glass strip
    Clean the white underside of the scanner lid.
    Figure : The underside of the scanner lid
    Dry the scanner glass and the glass strip thoroughly with a clean, dry cloth or chamois to prevent spotting, and then dry the white underside of the scanner lid.
     NOTE:Do not use paper-based wipes or tissues that can leave fiber residue.Close the scanner lid.Reconnect the power cord to the rear of the product.If the product does not turn on by itself, press the Power button () to turn it on.Try to copy, fax, or scan again.If these steps resolved the issue, you do not need to continue troubleshooting.If the issue persists, continue to the next solution.
    Clean the automatic document feeder (ADF)
    Follow these steps to clean the automatic document feeder (ADF), and then make blank copies to check if the issue is resolved.Step one: Clean the ADF rollers and separator padFollow these steps to clean the automatic document feeder (ADF).Gather the following materials:A clean, lint-free cloth, or any cloth that will not come apart or leave fibersDistilled, filtered, or bottled water (tap water might damage the product)Remove any originals from the document feeder tray.
    Figure : Remove any originalsPress the Power button () to turn off the product.Disconnect the power cord from the rear of the product.Lift the cover of the ADF until it stops.
    Figure : Lift the ADF cover
    Locate the pick rollers and the separator pad.
    Figure : Locations of the pick rollers and the separator pad
    The ADF coverThe pick rollersThe separator padLightly dampen a clean lint-free cloth with distilled or bottled water, and then squeeze any excess liquid from the cloth.Use the damp cloth to wipe any residue off of the separator pad.
    Figure : The separator pad
    Use the damp cloth to wipe any residue off of the pick rollers.
    Figure :
    Dry the rollers and the separator pad with a clean, dry, lint-free cloth.Do not close the ADF cover. Continue to the next step to clean the glass strip in the automatic document feeder.
    Clean the glass strip in the automatic document feeder
    Follow these steps to clean the glass strip underneath the mechanism in the automatic document feeder (ADF).
     NOTE:The images in this step might not be of your product, but the steps are the same.If you have not done so already, disconnect the power cord from the rear of the product.Remove any originals from the document feeder tray.
    Figure : Remove any originals
    Open the ADF cover, and then lift the ADF mechanism.
    Figure : Lift the ADF mechanism
    Lightly dampen a clean, soft, lint-free cloth with a mild glass cleaner.Gently clean the glass strip inside the ADF, and then thoroughly dry it to prevent spotting.
    Figure : Clean the glass strip
    Lower the ADF mechanism back into place, and then close the ADF cover.Step three: Make a blank copy using the scannerFollow these steps to make a blank copy using the scanner.Lift the scanner lid.Figure : Lift the scanner lidRemove any originals from the scanner glass.Close the scanner lid.Load unused, plain white paper into the input tray.From the home screen on the product control panel, touch Copy ().Touch Start Black to start the copy.If the copy is clean, continue to the next step to make a copy using the ADF.If the copy has vertical bands, lines, or streaks, there might be dust inside the product, poor internal connections, or the product might be damaged.  Please let me know if these steps resolved your issue, or if there is anything else I can do to help.  I look forward to hearing from you!   Thanks, 

  • ADF Mobile _back without iterator refresh (11.1.2.3.0)

    Hi Forum Group,
    In ADF Mobile, does anyone know how to prevent the iterator from refreshing if using the back built-in? Let me try to explain the scenario. I have an amx page with that has two results from two separate rest web services. Both of these rest web services are called with a URLDataControl via pageFlowScope variables assigned within the pageDef. The second result depends upon the result of the first for it to be called. All of this is not a problem as I'm navigating with taskflows and methods and can, therefore, properly populate the parameters (pageFlowScope variables) and call the web services. If, however, I want to iterate with previous and next (moving the rows from the default 0 row index while properly re-querying the second dependency) and then further navigate to a detail page, using the back causes the iterators to refresh (which would be out-of-sync if I did not use a taskflow method to reset everything). I would like, however, the state to remain the same on the "header" page, rather than requerying everything and having to have the user move to the appropriate row that they were wanting again. All I simply need to do is tell the iterator (or URLDataControl) to not requery if _back is used.
    Any ideas?

    Hi Frank,
    Thank you for your response. Is there a way then to execute a piece of code right before the rendering of the page, so that this "current row" can be set? Like in web adf development, the binding to the backing bean can be added to any component and the set serves as an initializer (where code can be added to process things like this).

  • ADF Faces Query Panel: How to display master data in detail table?

    Before stating the question, here is the background:
    I've a Fusion ADF (model/viewController) app that includes 2 tables with a master-detail relationship. The master table stores error numbers and associated levels of logging severity; the detail table stores the actual message text. These need to be separate, related tables because the requirement is that message text for a given error number can vary by product release.
    Messages are added in a bounded task flow; data for the master table entered in 1 fragment, data for the detail table in a 2nd page fragment. In the app, the Entity Objects for these tables are related with a foreign key association and have a composition association. This was done because the error numbers are generated in an Oracle DB sequence, and from what i have read that is a way in a task flow to have ADF put the number generated for the master table into the related key of the child table.
    The question is this:
    I need to create an ADF query panel with a table that searches on the detail DB table. However, i also need to use a couple of fields from the master DB table in both the query and in the ADF table. In addition, I need to add the ability for the user to edit either the master or detail record for the row he/she selects in the ADF table. I know how to create a view that would display the info i need; however, i have not been able to figure out how to obtain the keys for the selected ADF table row and pass them to the task flows that would edit.
    The master table has a numeric primary key. The detail table primary key consists of a foreign key to the master key and also a release number.
    I'm new to ADF and have been struggling with how to do this: i've a workaround that is functional but too klunky to be a permanent solution. So, could someone point me to some information on how to accomplish this?
    Versions: JDeveloper 11.1.1.4, ADF Business Components 11.1.1.59.23
    Thanks for your help!

    Thanks. I tried this out, but ran into an issue in that the detail table has 2 keys - a foreign key to the master primary key, and a 2nd key that uniquely distinguishes the detail. So i tried various things centered around using the SetCurrentRowWithKey operation and trying to obtain the selected ADF table row using an EL OF #{data.<pageDef>.<Iterator>.currentRowKeyString}; however i could not get the detail record for the selected row to display.
    I did find another approach that worked - I am wondering, is there anything problematic with this approach?:
    1. Create a VO joining the Master and Detail tables, with the Detail table being updatable.
    2. Made sure the applicable attributes were defined as keys.
    3. Add a query panel w/table using this VO.
    4. Create an ADF form based on the VO, showing the updatable fields.
    5. Create a bounded task flow with the following set on the Behavior tab:
    a. Share data controls with calling task flow
    b. Always Begin Transaction
    I specifically am wondering whether "Share data controls with calling task flow" has any negative implications or gotchas to handle. The doc at http://download.oracle.com/docs/cd/E21764_01/web.1111/b31974/taskflows_parameters.htm#ADFFD1693 doesn't suggest so, but just wanted to double-check before I go down this path.

  • Question on the ADF Tree Table

    Hi, I am using Jdev 10.1.3.2 and ADF BC. I have created a ADF Tree Table to display multiple attributes, both the master and detail VO are based on the same EO. It seems all of attributes are displayed in one colume, and there is no column heading, is that possible to add column heading and display in multiple columns?
    Thanks!

    Hi,
    actually the node stamp doesn't accept more than one column element
    Frank

  • How to use programmatic VO objects in creating a Tree in ADF Page.

    Hi,
    I have two programmatic VOs namely Plan and Model. Even though functionally there is a Master/Detail (Plan --> Model) relationship between them, we are not creating any View Link as they are programmatic VOs. Requirement is to show this master/detail data as tree in the ADF page. Any pointer on how to achieve this?
    Thanks
    Edited by: user766455 on Jan 3, 2012 10:34 AM

    My question is not related Traversing Tree... my question is how to create Tree in the ADF page using programmatic VOs, which don't have master and details View Link.

  • ADF -how to create table binding when view object is no known until runtime

    I want to programmatically create a table binding to a view object where the view object name is not known until run-time. Then I will use a dynamic table to display it. Can anyone provide an example?

    I looked at example #9. It gets me closer to what I am looking for but not quite enough. In my case, I don't have (or want in this case) a pageDefinition with a pre-declared Iterator binding. I am converting an exsisting BC4J/Struts/JSP application. I would like to rewrite my reusable component tags to make use of ADF bindings and Faces. My tags are passed the ApplicationModule and ViewObject names as parameters, much like the old BC4J datatags. I do not want to go back and rewrite all of my pages from scratch using drag-and-drop declarative bindings with a pageDefinition for every page. I am hoping to have my rewritten tags handle everything programmatically based only on the ViewObject name passed at run-time.

  • How to get the logged in userId value in adf task flow OIM11g R2

    Hi,
    I have created an adf task flow. Now I want to run some query in that based on the logged in userId.
    Could you please help me in knowing how to get the logged in userID value in adf TaskFlow so that I can run a parameterized query.
    Thanks

    3 different ways to retrieve the username (not sure what you mean by user ID) :
    http://mahmoudoracle.blogspot.be/2012/06/adf-get-current-logged-user-name.html#.USI_c-h8zIo
    Also provide your JDev version.
    Basicly, you should use the groovy expression in a view criteria (it's the fastest and easiest way) and call that view criteria whenever you need it.
    That's if you are using ADF BC of course.

Maybe you are looking for

  • Need modifications in my alv

    *& Report  ZMM_STOCKDIFFERENCE REPORT  ZMM_STOCKDIFFERENCE. Tables: marc,         mard.      "Sales Document: Header Data data : it_marc LIKE marc OCCURS 0 WITH HEADER LINE,        it_mard like mard OCCURS 0 WITH HEADER LINE. type-pools: slis. data:t

  • Mac air overheating and won't re start ?

    Mac book air is overheating and won't re start. Have left it for 2 hours but still warm and still dead.  Is the battery going to blow?

  • The effect of cube and rollup function

    1. For under 500,000 in Oracle 9i, rollup is faster than cube. But above 1,000,000, cube is faster than rollup. Right? 2. Why do rollup(a) and cube(a) all have a parameter? 3. Under only one parameter, the compute process of cube and rollup is not th

  • Regex vs substring,toUpper, toLower, charAt.. etc

    what is your creteria for choosing to use a small function of substrings vs doing the same thing with regex? it seems like from readability and maintainability standpoints (and maybe understandability in some cases) regex should always be used in my

  • How to make a technical documentation of my WebDynpro development

    Hi forum:   I want to know if you has one template or one example to document my WebDynpro development, i need it for leave a technical documentation of my development. Please suggest me something....!! Thnks Josue