Oracle® Application Development Framework Developer's Guide For Forms/4GL Developers 10g (10.1.3.1.0) Part Number B25947-01 |
|
|
View PDF |
From the point of view of a client accessing your application module's data model, the API's to work with a read-only view object and an entity-based view object are identical. The key functional difference is that entity-based view objects allow the data in a view object to be fully updatable. The application module that contains the entity-based view objects defines the unit of work and manages the transaction. This section presents four simple test client programs that work with the SRService
application module to illustrate:
Iterating master/detail/detail hierarchy
Finding a row and updating a foreign key value
Creating a new service request
Retrieving the row Key identifying a row
Example 7-1 performs the following basic steps:
Finds the StaffList
view object instance
Executes the query
Iterate over the resulting StaffList
rows
Print the staff member's full name by getting the value of the calculated FullName
attribute
Get related row set of ServiceRequests
using a view link accessor attribute
Iterate over the ServiceRequests
rows
Print out some service request attribute values
If the status is not Closed
, then get the related row set of ServiceHistories
using a view link accessor attribute
Iterate over the ServiceHistories
rows
Print out some service request history attributes
Note: Other than having one additional level of nesting, this example uses the same API's that you saw in theTestClient2 program that was iterating over master/detail read-only view objects in Section 5.10.4.2, "How to Access a Detail Collection Using the View Link Accessor". |
Example 7-1 Iterating Master/Detail/Detail Hierarchy
package devguide.client; import oracle.jbo.ApplicationModule; import oracle.jbo.Row; import oracle.jbo.RowSet; import oracle.jbo.ViewObject; import oracle.jbo.client.Configuration; public class TestClient { public static void main(String[] args) { String amDef = "devguide.model.SRService"; String config = "SRServiceLocal"; ApplicationModule am = Configuration.createRootApplicationModule(amDef,config); // 1. Find the StaffList view object instance. ViewObject staffList = am.findViewObject("StaffList"); // 2. Execute the query staffList.executeQuery(); // 3. Iterate over the resulting rows while (staffList.hasNext()) { Row staffMember = staffList.next(); // 4. Print the staff member's full name System.out.println("Staff Member: "+staffMember.getAttribute("FullName")); // 5. Get related rowset of ServiceRequests using view link accessor RowSet reqs = (RowSet)staffMember.getAttribute("ServiceRequests"); // 6. Iterate over the ServiceRequests rows while (reqs.hasNext()) { Row svcreq = reqs.next(); // 7. Print out some service request attribute values System.out.println(" ["+svcreq.getAttribute("Status")+"] "+ svcreq.getAttribute("SvrId")+": "+ svcreq.getAttribute("ProblemDescription")); if(!svcreq.getAttribute("Status").equals("Closed")) { // 8. Get related rowset of ServiceHistories RowSet hists = (RowSet)svcreq.getAttribute("ServiceHistories"); // 9. Iterate over the ServiceHistories rows while (hists.hasNext()) { Row hist = hists.next(); // 10. Print out some service request history attributes System.out.println(" "+hist.getAttribute("LineNo")+": "+ hist.getAttribute("Notes")); } } } } Configuration.releaseRootApplicationModule(am,true); } }
Running the program produces the following output:
Staff Member: David Austin [Open] 104: Spin cycle not draining 1: Researching issue Staff Member: Bruce Ernst [Closed] 101: Agitator does not work [Pending] 102: Washing Machine does not turn on 1: Called customer to make sure washer was plugged in... 2: We should modify the setup instructions to include... [Open] 108: Freezer full of frost 1: Researching issue Staff Member: Alexander Hunold [Closed] 100: I have noticed that every time I do a... [Closed] 105: Air in dryer not hot :
Example 7-2 performs the following basic steps:
Finds the ServiceRequests
view object instance
Constructs a Key
object to look up the row for service request number 101
Uses findByKey()
to find the row
Prints some service request attribute values
Tries to assign the illegal value Reopened
to the Status
attribute
Since view object rows cooperate with entity objects, the validation rule on the Status
attribute throws an exception, preventing this illegal change.
Sets the Status
to a legal value of Open
Prints the value of the Status
attribute to show it was updated successfully
Prints the current value of the assigned technician's email
Reassigns the service request to technician number 303
(Alexander Hunold) by setting the AssignedTo
attribute
Shows the value of the reference information (TechnicianEmail
) reflecting a new technician
Cancels the transaction by issuing a rollback
Example 7-2 Finding and Updating a Foreign Key Value
package devguide.client; import oracle.jbo.ApplicationModule; import oracle.jbo.JboException; import oracle.jbo.Key; import oracle.jbo.Row; import oracle.jbo.ViewObject; import oracle.jbo.client.Configuration; public class TestFindAndUpdate { public static void main(String[] args) { String amDef = "devguide.model.SRService"; String config = "SRServiceLocal"; ApplicationModule am = Configuration.createRootApplicationModule(amDef,config); // 1. Find the ServiceRequests view object instance ViewObject vo = am.findViewObject("ServiceRequests"); // 2. Construct a new Key to find ServiceRequest# 101 Key svcReqKey = new Key(new Object[]{101}); // 3. Find the row matching this key Row[] reqsFound = vo.findByKey(svcReqKey,1); if (reqsFound != null && reqsFound.length > 0) { Row svcReq = reqsFound[0]; // 4. Print some service request information String curStatus = (String)svcReq.getAttribute("Status"); System.out.println("Current status is: "+curStatus); try { // 5. Try setting the status to an illegal value svcReq.setAttribute("Status","Reopened"); } catch (JboException ex) { System.out.println("ERROR: "+ex.getMessage()); } // 6. Set the status to a legal value svcReq.setAttribute("Status","Open"); // 7. Show the value of the status was updated successfully System.out.println("Current status is: "+svcReq.getAttribute("Status")); // 8. Show the current value of the assigned technician System.out.println("Assigned: "+svcReq.getAttribute("TechnicianEmail")); // 9. Reassign the service request to technician # 303 svcReq.setAttribute("AssignedTo",303); // Alexander Hunold (technician) // 10. Show the value of the reference info reflects new technician System.out.println("Assigned: "+svcReq.getAttribute("TechnicianEmail")); // 11. Rollback the transaction am.getTransaction().rollback(); System.out.println("Transaction cancelled"); } Configuration.releaseRootApplicationModule(am,true); } }
Running this example produces the following output:
Current status is: Closed ERROR: The status must be Open, Pending, or Closed Current status is: Open Assigned: bernst Assigned: ahunold Transaction cancelled
Example 7-3 performs the following basic steps:
Find the ServiceRequests
view object instance
Creates a new row and inserts it into the row set
Shows the effect of entity object related defaulting for Status
attribute
Sets values of some required attributes in the new row
Commits the transaction
Retrieves and displays the trigger-assigned service request ID
Example 7-3 Creating a New Service Request
package devguide.client; import java.sql.Timestamp; import oracle.jbo.ApplicationModule; import oracle.jbo.Row; import oracle.jbo.ViewObject; import oracle.jbo.client.Configuration; import oracle.jbo.domain.DBSequence; import oracle.jbo.domain.Date; public class TestCreatingServiceRequest { public static void main(String[] args) throws Throwable { String amDef = "devguide.model.SRService"; String config = "SRServiceLocal"; ApplicationModule am = Configuration.createRootApplicationModule(amDef, config); // 1. Find the ServiceRequests view object instance. ViewObject svcReqs = am.findViewObject("ServiceRequests"); // 2. Create a new row and insert it into the row set Row newSvcReq = svcReqs.createRow(); svcReqs.insertRow(newSvcReq); // 3. Show effect of entity object defaulting for Status attribute System.out.println("Status defaults to: "+newSvcReq.getAttribute("Status")); // 4. Set values for some of the required attributes newSvcReq.setAttribute("CreatedBy",308); // Nancy Greenberg (user) Date now = new Date(new Timestamp(System.currentTimeMillis())); newSvcReq.setAttribute("RequestDate",now); newSvcReq.setAttribute("ProdId",119); // Ice Maker newSvcReq.setAttribute("ProblemDescription","Cubes melt immediately"); // 5. Commit the transaction am.getTransaction().commit(); // 6. Retrieve and display the trigger-assigned service request id DBSequence id = (DBSequence)newSvcReq.getAttribute("SvrId"); System.out.println("Thanks, reference number is "+id.getSequenceNumber()); Configuration.releaseRootApplicationModule(am, true); } }
Running this example produces the following results:
Status defaults to: Open Thanks, reference number is 200
Example 7-4 performs the following basic steps:
Finds the ServiceRequests
view object
Constructs a key to find service request number 101
Finds the ServiceRequests
row with this key
Displays the key of the ServiceRequests
row
Accesses the row set of ServiceHistories
using the view link accessor attribute
Iterates overs the ServiceHistories
row
Displays the key of each ServiceHistories
row
Example 7-4 Retrieving the Row Key Identifying a Row
package devguide.client; import oracle.jbo.ApplicationModule; import oracle.jbo.Key; import oracle.jbo.Row; import oracle.jbo.RowSet; import oracle.jbo.ViewObject; import oracle.jbo.client.Configuration; public class TestFindAndShowKeys { public static void main(String[] args) { String amDef = "devguide.model.SRService"; String config = "SRServiceLocal"; ApplicationModule am = Configuration.createRootApplicationModule(amDef, config); // 1. Find the ServiceRequests view object ViewObject vo = am.findViewObject("ServiceRequests"); // 2. Construct a key to find service request number 101 Key svcReqKey = new Key(new Object[] { 101 }); // 3. Find the ServiceRequests row with this key Row[] reqsFound = vo.findByKey(svcReqKey, 1); if (reqsFound != null && reqsFound.length > 0) { Row svcReq = reqsFound[0]; // 4. Display the key of the ServiceRequests row showKeyFor(svcReq); // 5. Access row set of ServiceHistories using view link accessor RowSet histories = (RowSet)svcReq.getAttribute("ServiceHistories"); // 6. Iterate over the ServiceHistories row while (histories.hasNext()) { Row historyRow = histories.next(); // 7. Display the key of the current ServiceHistories row showKeyFor(historyRow); } } Configuration.releaseRootApplicationModule(am, true); } private static void showKeyFor(Row r) { // get the key for the row passed in Key k = r.getKey(); // format the key as "(val1,val2)" String keyAttrs=formatKeyAttributeNamesAndValues(k); // get the serialized string format of the key, too String keyStringFmt = r.getKey().toStringFormat(false); System.out.println("Key "+keyAttrs+" has string format "+keyStringFmt); } // Build up "(val1,val2)" string for key attributes private static String formatKeyAttributeNamesAndValues(Key k) { StringBuffer sb = new StringBuffer("("); int attrsInKey = k.getAttributeCount(); for (int i = 0; i < attrsInKey;i++) { if (i > 0 ) sb.append(","); sb.append(k.getAttributeValues()[i]); } sb.append(")"); return sb.toString(); } }
Running the example produces the following results. Notice that the serialized string format of a key is a hexadecimal number that includes information in a single string that represents all the attributes in a key.
Key (101) has string format 000100000003313031 Key (101,1) has string format 000200000003C2020200000002C102 Key (101,2) has string format 000200000003C2020200000002C103