Вы находитесь на странице: 1из 22

Doc ID </help/usaeng/Search/search.html>: Note:66887.

1Content Type: TEXT/PLAINSubject: Basing a Block on a Stored Procedure - Sample CodeCreation Date: 02-DEC-1998Type: BULLETINLast Revision Date: 30-OCT-2002Status: PUBLISHEDPURPOSE
======= This bulletin gives sample coding on using a stored procedure with Forms. SCOPE & APPLICATION =================== This bulletin is intended for the user who has a good knowledge on using database packages, procedures and functions. The user should also have a good knowledge on using the Forms Debugger. Tested with Forms version 5.0.x with Oracle 7.3.4, however the concepts in this document apply to Forms versions 6.0.X and and the 8.X versions of the database. These techniques will not work for forms versions prior to 5.0.X. BLOCK BASED ON A STORED PROCEDURE ================================= Introduction: -----------Why base a block on a stored procedure? --------------------------------------Basing a block on a stored procedure is an advanced operation to do the following: 1. Reduce network traffic through array processing as the sql statements are processed by the pl/sql engine on the server side. 2. Perform complex computations 3. Update and query multiple tables 4. Perform validation and DML on server-side. What is a REF Cursor? -------------------REF cursors hold cursors in the same way that VARCHAR2 variables hold strings. This is an added feature that comes with PL/SQL v2.2. A REF cursor allows a cursor to be opened on the server and passed to the client as a unit rather than one row at a time. One can use a Ref cursor as a target of assignments and can be passed as parameters to the Program Units. Ref cursors are opened with an OPEN FOR statement and in all other ways, they are the same as regular cursors. What is a table of records? -------------------------A table of records is a new feature added in PL/SQL v2.3. It is the equivalent of a database table in memory. If you structure the PL/SQL table of records with a primary key (an index) you can have array-like access to the rows. Table of records differ from arrays in that they are not bound by a fixed lower or higher limit. Nor do they require consecutive index numbers as arrays do.

Consult a PL/SQL reference manual (version 2.3 or higher) for further explanation. There are three steps involved in creating a table of records. The are: 1. Declare a record type that the table is going to contain. 2. Declare a new type for the table of record. 3. Finally, declare a variable using the new type. Why base a block on a PL/SQL Table versus a Ref Cursor? -----------------------------------------------------A table of records fetches all the rows from the table. A reference cursor fetches only those rows that matches your query criteria. If you are planning to filter the rows with a where clause or your query returns only few records out of many, you can choose the ref cursor rather than table of records. Note that the block properties for number of records set and buffered affect blocks based on stored procedures. CODE EXAMPLES ============== This note explains how to use Table of Records or Ref Cursors as the data query source and for DML operations using transactional triggers like On-insert, On-update and On-lock triggers. This note provides two examples of basing a block on a stored procedure. The first example will provide sample code for single block operations. The second example will follow with code for performing multi-block operations with a master-detail relationship. EXAMPLE A. Single Block Operations.

Use a table with a Primay key. Avoid using Rowid with any select statement. (Reason explained later). Follow through and complete each of the 5 steps below. Step1: Create a table named Bonus --------------------------------CREATE TABLE BONUS( EMPNO NUMBER PRIMARY KEY, ENAME VARCHAR2(50), JOB VARCHAR2(20), SAL NUMBER, COMM NUMBER); Step2: Create a package spec at the database level --------------------------------------------------PACKAGE bonus_pkg IS TYPE bonus_rec IS RECORD( empno bonus.empno%TYPE, ename bonus.ename%TYPE, job bonus.job%TYPE, sal bonus.sal%TYPE, comm bonus.comm%TYPE);

TYPE b_cursor IS REF CURSOR RETURN bonus_rec; -- Statement below needed if block is based on Table of Records TYPE bontab IS TABLE OF bonus_rec INDEX BY BINARY_INTEGER; -- Statement below needed if using Ref Cursor PROCEDURE bonus_refcur(bonus_data IN OUT b_cursor); -- Statement below needed if using Table of Records PROCEDURE bonus_query(bonus_data IN OUT bontab); --Statements below needed for both Ref Cursor and Table of Records PROCEDURE bonus_insert(r IN bonus_rec); PROCEDURE bonus_lock(s IN bonus.empno%TYPE); PROCEDURE bonus_update(t IN bonus_rec); PROCEDURE bonus_delete(t IN bonus_rec); -- If this last function is not included you cannot use the -- Query -> count hits from the default menu of the forms and -- will get error frm-41003 Function cannot be performed here. FUNCTION count_query_ RETURN number; END bonus_pkg; Step 3. Create the package body -------------------------------PACKAGE BODY bonus_pkg IS PROCEDURE bonus_query(bonus_data IN OUT bontab) IS ii NUMBER; CURSOR bonselect IS SELECT empno, ename, job, sal, comm FROM bonus; BEGIN OPEN bonselect; ii := 1; LOOP FETCH bonselect INTO bonus_data( ii ).empno, bonus_data( ii ).ename, bonus_data( ii ).job, bonus_data( ii ).sal, bonus_data( ii ).comm; EXIT WHEN bonselect%NOTFOUND; ii := ii + 1; END LOOP; END bonus_query; PROCEDURE bonus_refcur(bonus_data IN OUT b_cursor) IS BEGIN OPEN bonus_data FOR SELECT empno, ename, job, sal, comm FROM bonus; END bonus_refcur; PROCEDURE bonus_insert(r IN bonus_rec) IS BEGIN INSERT INTO bonus VALUES(r.empno, r.ename, r.job, r.sal, r.comm); END bonus_insert;

PROCEDURE bonus_lock(s IN bonus.empno%TYPE) IS v_rownum NUMBER; BEGIN SELECT empno INTO v_rownum FROM bonus WHERE empno=s FOR UPDATE OF ename; END bonus_lock; PROCEDURE bonus_update(t IN bonus_rec) IS BEGIN UPDATE bonus SET ename=t.ename, job=t.job, sal=t.sal, comm=t.comm WHERE empno=t.empno; END bonus_update; PROCEDURE bonus_delete(t IN bonus_rec) IS BEGIN DELETE FROM bonus WHERE empno=t.empno; END bonus_delete; FUNCTION count_query_ RETURN NUMBER IS r NUMBER; BEGIN SELECT COUNT(*) INTO r FROM bonus; RETURN r; END count_query_; END bonus_pkg;

Step 4. Create the Form Block -----------------------------Build a block using the Data Block Wizard with type of data block as "Table or View" based on the Bonus table. Now, open the block property sheet to base the block on the stored procedures as follows: In the block property sheet, * Set the Query Data Source Type as Procedure. * Set the Query Data Source Name with the appropriate stored procedure. In this example, for refcur you will enter "bonus_pkg.bonus_refcur" and for table of records you will enter "bonus_pkg.bonus_query". Note: One can use either Ref Cursor or Table of Records to perform this query operation. For this example, either use the procedure bonus_pkg.bonus_query or bonus_pkg.bonus_refcur. You do not need to set anything in the "Query Data Source Columns" property, as Forms has already done this because you began by creating the block with data block as a Table. * Set the Query Data Source Arguments with the appropriate argument name for that query. In this example, "bonus_data" is the argument name for both refcur and table of records. Set the Type to "Table" for table of records or "Refcursor" for referenced cursor. Set a Name. In this example, we can use "bonus_pkg.bontab" for table of records (packagename.table_name) or you can use either "bonus_pkg.b_cursor"

* *

or "bonus_data.b_cursor" for a ref cursor. * * Set Mode to "IN/OUT" as the data is flowing between the client and server and viceversa. Set Value (optional)

If you skip to set typename, you will hit an error. The possible compilation error will be PL/SQL error 103 in the QUERY-PROCEDURE TRIGGER. When you use the "table of records" as the source of query, Forms automatically creates a trigger like Query-Procedure to populate the values that are sent from the database through the stored procedure. * Set the DML target type as "Transactional triggers" under the Advanced Database section. This step is important. You must specify "transactional triggers" to avoid getting an error: FRM-40743: THIS OPERATION WITH NO BASE TABLE REQUIRES THE %S TRIGGER. at runtime. Leave all other properties under the Advanced Database section blank. Note: You must use transactional triggers to perform all DML processing as your block is based on stored procedures and not a table or view. If you do not provide these triggers (see code in Step 5) you will receive runtime error: Frm-40401 No Changes To Save when after performing DML operations like insert, delete or update.

One more general example of setting the Query Data Source Arguments in the block property palette could be, ARGUMENTNAME ------------bonus_data bonus_data TYPE ---REFCURSOR OR TABLE bonus_pkg.bontab IN OUT (leave blank) TYPENAME MODE ----------bonus_pkg.b_cursor IN OUT Or bonus_data.b_cursor VALUE ----(leave blank)

Step 5. Create Transactional Triggers -------------------------------------Transactional triggers must be created a the block level as follows: * On-insert trigger DECLARE r bonus_pkg.bonus_rec; BEGIN r.empno := :bonus.empno; r.ename :=:bonus.ename; r.job := :bonus.job; r.sal := :bonus.sal; r.comm := :bonus.comm; bonus_pkg.bonus_insert(r); END; * On_lock trigger bonus_pkg.bonus_lock(:bonus.empno);

* On-update trigger DECLARE t bonus_pkg.bonus_rec; BEGIN t.empno :=:bonus.empno; t.ename :=:bonus.ename; t.job := :bonus.job; t.sal := :bonus.sal; t.comm := :bonus.comm; bonus_pkg.bonus_update(t); END; * On-delete trigger DECLARE t bonus_pkg.bonus_rec; BEGIN t.empno :=:bonus.empno; t.ename :=:bonus.ename; t.job := :bonus.job; t.sal := :bonus.sal; t.comm := :bonus.comm; bonus_pkg.bonus_delete(t); END; * On-count trigger (optional) Note. Because you have based your block on a stored procedure, Form's default processing will not return the number of query hits. This trigger takes the place of the default processing and will return the number of query hits. DECLARE recs NUMBER; BEGIN recs := bonus_pkg.count_query_; SET_BLOCK_PROPERTY('bonus', query_hits,recs); END; You now have completed the process for basing a block on a stored procedure for single block operations. ============================================================================= EXAMPLE B. Multi-block opererations with master-detail relationship

Basing a block on a stored procedure (Multi block operation, having master detail relationship). Suppose you are passing a value from master block to the detail block to perform query operation, perform the following steps:

Step1: verification -------------------BEFORE ATTEMPTING TO DO THIS, VERIFY THE PRESENCE OF INTEGRITY CONSTRAINTS FOR THE TABLES INVOLVED IN THIS OPERATION. Verify if the tables have Primary key and Foreign Key relationship. Your Physical Database design is very important. Otherwise, you will be getting errors like ORA-6502 Pl/sql: Numeric value error or ORA-4098 Trigger 'X' is invalid and failed revalidation. ORA-4068 If any column name is not properly defined in the select statement of the stored procedure. see note:2007482.6 for an explanation on how to do this. Step2: Create a package spec at the database level --------------------------------------------------PACKAGE emp_pkg IS TYPE emprec is RECORD( empno emp.empno%type, ename emp.ename%type, job emp.job%type, mgr emp.mgr%type, hiredate emp.hiredate%type, sal emp.sal%type, comm emp.comm%type, deptno emp.deptno%type); TYPE empcur IS REF CURSOR RETURN emprec; TYPE emptab IS TABLE OF emprec INDEX BY BINARY_INTEGER; -- This procedure uses refcursor for query operation, it sends the data -- from the stored procedure to the client. PROCEDURE empquery_refcur(emp_data IN OUT empcur, v_dno IN NUMBER); -- This procedure uses table of records for query operation. -- One can use either ref cursor or table of records for query operation. PROCEDURE empquery(emp_data IN OUT emptab, v_dno IN NUMBER); -- This procedures inserts the data passed as a record from the emp block -- to the emp table. PROCEDURE emp_insert(r IN emprec); -- Empno is getting passed from emp block to the stored procedure, this -- procedure is to lock that specific row that has that empno. PROCEDURE emp_lock(s IN emp.empno%TYPE); PROCEDURE emp_update(t IN emprec); PROCEDURE emp_delete(t IN emprec); -- If this last function is not included you cannot use the -- Query -> count hits from the default menu of the forms and -- will get error frm-41003 Function cannot be performed here. FUNCTION count_query_ RETURN NUMBER;

END emp_pkg; Step 3. Create the package body -------------------------------PACKAGE BODY emp_pkg IS PROCEDURE empquery(emp_data IN OUT emptab, v_dno IN NUMBER) IS ii NUMBER; CURSOR empselect IS SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno FROM emp WHERE deptno = nvl(v_dno, deptno); BEGIN OPEN empselect; ii := 1; LOOP FETCH empselect INTO emp_data(ii).empno, emp_data(ii).ename, emp_data(ii).job, emp_data(ii).mgr, emp_data(ii).hiredate, emp_data(ii).sal, emp_data(ii).comm, emp_data(ii).deptno; EXIT WHEN empselect%NOTFOUND; ii := ii + 1; END LOOP; END empquery; PROCEDURE empquery_refcur(emp_data IN OUT empcur, v_dno IN NUMBER) AS BEGIN OPEN emp_data FOR SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno FROM emp WHERE deptno = nvl(v_dno, deptno); END empquery_refcur;

! PROCEDURE emp_insert(r IN emprec) IS BEGIN INSERT INTO emp(empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES (r.empno, r.ename, r.job, r.mgr, r.hiredate, r.sal,

r.comm, r.deptno); COMMIT; END emp_insert; PROCEDURE emp_lock(s IN emp.empno%TYPE) IS v_rownum NUMBER; BEGIN SELECT empno INTO v_rownum FROM emp WHERE empno = s FOR UPDATE OF ename; END emp_lock; PROCEDURE emp_update(t IN emprec) IS BEGIN UPDATE emp SET ename = t.ename, job = t.job, mgr = t.mgr, hiredate = t.hiredate, sal = t.sal, comm = t.comm, deptno = t.deptno WHERE empno = t.empno; END emp_update; PROCEDURE emp_delete(t IN emprec) IS BEGIN DELETE FROM emp WHERE empno = t.empno; END emp_delete; FUNCTION count_query_ RETURN NUMBER IS r NUMBER; BEGIN SELECT count(*) INTO r FROM emp; RETURN r; END count_query_; END emp_pkg; Step 4. Create the Form Block -----------------------------Build the block with datablock type as "table or view" for both the master (dept) and detail block (emp). Later the block property sheet will be adjusted for the detail block to be based on stored procedure. The blocks can be built manually also, but, using wizard is preferrable. Here, you have the choice of having tab canvas. Create the relationship between these blocks either explicitly or at the time of creating the block using wizard, refer the later part of this note for more information on this.

In the detail block propertysheet, (emp block) * set the Query Data Source Type as Procedure. * set the Query Data Source Name with the appropriate name of the stored procedure. In this case, One can use either the Ref Cursor or Table of Records to perform this query operation. So, in this example, either use the procedure emp_pkg.empquery or emp_pkg.empquery_refcur Because you began creating the block with data block as Table or view, you do not need to set anything in the Query Data Source Columns as the Forms does that job. * set the Query Data Source Arguments with the appropriate argument name for that query. In this case, emp_data is the argument name for both ref cursor and table of records * set the Type to table or refcursor, depending on the procedure you have chosen. This example uses the "Table". * set the Type Name to the appropriate type, this will be emp_pkg.emptab If you choose the ref cursor, it would have been emp_pkg.empcur or emp_data.refcur * set Mode to "IN/OUT" as the data is flowing between the client and server and viceversa. * set Value (optional) * repeat above steps for the other argument of the procedure, deptno. The appropriate values can be found in the table below Yet another general example could be, ARGUMENTNAME -----------emp_data emp_data TYPE ---REFCURSOR OR TABLE AND v_dno NUMBER dept.deptno%type IN :dept.deptno emp_pkg.emptab IN OUT TYPENAME -------emp_pkg.empcur MODE ---IN OUT VALUE ----(leave it blank)

If you skip to set typename, you will hit an error. The possible compilation error will be: PL/SQL error 103 in the QUERY-PROCEDURE TRIGGER. When you use the "table of records" as the source of query, Forms automatically creates a trigger like Query-Procedure to populate the values that are sent from the database through the stored procedure. * Set the DML target type as "Transactional triggers" under the Advanced Database section. You must specify "transactional triggers" to avoid getting error: FRM-40743: THIS OPERATION WITH NO BASE TABLE REQUIRES THE %S TRIGGER. at runtime. Leave all other properties under the Advanced Database section blank. Note: You must use transactional triggers to perform all DML processing as your block is based on stored procedures and not a table or view. If you do not provide these triggers (see code in Step 5) you will

receive runtime error: Frm-40401 No Changes To Save after performing DML operations like insert, delete or update. Step 5. Create Transactional Triggers -------------------------------------Then, from the forms at detail block level (emp), you have to create the following triggers: * On-insert trigger DECLARE r emp_pkg.emprec; BEGIN r.empno := :emp.empno; r.ename :=:emp.ename; r.job := :emp.job; r.mgr := :emp.mgr; r.hiredate := :emp.hiredate; r.sal := :emp.sal; r.comm := :emp.comm; r.deptno := :emp.deptno; emp_pkg.emp_insert(r); END; * On_lock trigger emp_pkg.emp_lock(:emp.empno); * On-update trigger DECLARE t emp_pkg.emprec; BEGIN t.empno := :emp.empno; t.ename := :emp.ename; t.job := :emp.job; t.mgr := :emp.mgr; t.hiredate := :emp.hiredate; t.sal := :emp.sal; t.comm := :emp.comm; t.deptno := :emp.deptno; emp_pkg.emp_update(t); END; * On-delete trigger DECLARE t emp_pkg.emprec; BEGIN t.empno := :emp.empno; t.ename := :emp.ename; t.job := :emp.job;

t.mgr := :emp.mgr; t.hiredate := :emp.hiredate; t.sal := :emp.sal; t.comm := :emp.comm; t.deptno := :emp.deptno; emp_pkg.emp_delete(t); END; * On-count trigger DECLARE recs NUMBER; BEGIN recs := emp_pkg.count_query_; set_block_property('emp', query_hits, recs); END; -- This On-Count trigger is needed. The forms default -- processing will not return the query hits as you have -- based the block on a stored procedure. Step 6. Change the delete record behavoiur ------------------------------------------Make sure the "delete record behaviour" property of the relation is set to isolated (non-isolated is the default in Developer 6). You now have completed the process for basing a block on a stored procedure for Master-Detail operations. =============================================================================== Questions: 1. What will happen if you change the "delete record behaviour" from isolated to non-isolated or cascading? If you change the "Delete record behaviour" from isolated to non-isolated, the On-Check-Delete-Master trigger will be created by forms in the master block. This will not understand the stored procedure you have used as a query data source for the detail block. As a result, you will get a Compilation error in the On-Check-Delete-Master trigger that will be like: Pls-201 procedure name must be declared. Similarly, if you change the "Delete record behaviour" from isolated to cascading, the forms generates the Pre-Delete trigger in the master block which will give a compilation error as well, as the master block will not understand the procedure for the query data source on which the detail block is based on. It will be costly to have integrity constraint at form level also as the pre-delete trigger repeats the same job as the constraints declared at database side. So, do not try to change the "Delete Record Behaviour". See also bug:761722

If you have the proper integrity constraints added to your tables, it will be automatically taken care of at the time of committing the record. For example, when you delete a master record while child records are there, at the time of saving this change, the form will provide an error message: Frm-40510: Oracle error: Unable to delete record. If you do not have a foreign key constriant at all, and attempt to set the "delete behaviour" to cascading, it will give you: Frm-30409 Delete record behaviour is invalid. 2. Why use Primary key and not rowid ? The On_Lock trigger replaces the default forms locking, as a side effect prevents Forms from obtaining the ROWID for the row. In consequence you must define a Primary Key for the block and use this PK to be passed as a parameter to the stored procedure. And also, your block must have a PK, otherwise, you will hit: Frm-30100 Block must have atleast one Primary Key item. 3. How to set the query criteria for detail block passing a value from the master block? If you have chosen the tab canvas as the canvas type and if you want to set the query criteria in the detail block the same as master block, you can create a Key-Exeqry trigger at block level for the master block and call execute_query from there; Also, you can create a When-Tab-Page-Changed trigger at form level to pass the query criteria from the master block to the detail and type the following: DECLARE page_name varchar2(10); tab_id tab_page; tab_id2 tab_page; BEGIN page_name := get_canvas_property('CANVAS8', TOPMOST_TAB_PAGE); IF page_name = 'PAGE11' THEN go_item('dept.deptno'); ELSE go_item('empno'); execute_query; END IF; END; You can set the "Copy value from item" of the item's property sheet in the detail block of the item that has relationship with the master. Here, in this example you can set the "copy value from item" property of the deptno in the emp block to "dept.deptno". See the note:1078147.6 for more explanation. 4. What to remember if you build the block manually? In case of Master-Detail blocks, if you are passing a column to the stored procedure that inturn returns data to the detail block and if the detail block also has the same column present, you have to set the Column Name

Property of that specific text item to null or blank. Otherwise, you will be getting: Frm-40350 Query Caused no records to be retrieved. In this case, if you build the block manually for the detail block, the Column Name Property of the deptno in the dept block must be blank as it is taken care of by the stored procedure that uses a table of records or a ref cursor. 5. Getting the error "Wrong no. of arguments to populate_block in query_procedure". What should I do? If you attempt to change the block properties manually to use refcursor from table of records, the Query data source name property and Query data source arguments should be set properly. If you feel you set it right and are still getting this compilation error, drop that procedure and let the forms builder generate a new one for you. 6. My query is performing extremely slow? If your query matches or retrieves only small amount of records or if you are using where clause to filter the query results, then use a refcursor rather than using a table of records. As a ref cursor returns only the records that match the query condition. But, a table of records tries to fetch all the records. So, performance will be slower with table of records. Tips ---Provide an exceptional handler for all the possible ora errors like ORA-4098 and ORA-4068. If you get: ORA-6502 Pl/sql: Numeric or Value error your table definition of column lengths do not go with the datatype or length of the text items in the forms. Use the debugger to see what values are getting passed from client to server and viceversa. Additional References for using the debugger: Bulletin 107982.466, Note 61692.1, <ml2_documents.showDocument? p_id=61692.1&p_database_id=NOT> and GSX Problem 1022763.6 <ml2_documents.showDocument?p_id=1022763.6&p_database_id=GSX> Additional reference on basing a block on stored Procedure: Note: 52778.

Displayed below are the messages of the selected thread. Thread Status: Closed From: ARCHANA K. DHINGRA <mailto:adhingra@energygraphics.com>03-Dec-99 21:02 Subject: Building a form to query from details as well as master

Building a form to query from details as well as master Hi, I am trying to build a form with one master and four detail blocks. Two detail blocks have one record each in the tables for the master but other two have multiple records. 1.Is it possible to query and update from the two single record detail blocks for the entire form including the master?(No delete or insert is to be done in these detail records for maintaining one-one relationship between master and detail/s) 2. Is it possible to do update,delete and insert (no query) in the multi record detail blocks when querying and populating from master and the two single-record details? I tried to simulate with emp dept tables by building an external relation in emp block where emp is the master and dept is the detail but at runtime the process just hangs. I would really appreciate your help on this problem. Thanks in advance for your help! Archana From: Oracle, Abhijith Unnikannan <mailto:abhijith.unnikannan@oracle.com>06-Dec-99 07:01 Subject: Re : Building a form to query from details as well as master Hello, It is possible to build a form which queries the detail block and populates the master block. I am sending a small test form based on the emp and dept tables which you can test and build upon it to meet your requirement. This will require a bit of coding in your case but I guess it can be done. Have a nice day, Abhijith From: Marco Mohrmann <mailto:mmohrmann@haecker-kuechen.de>08-Dec-99 07:21 Subject: Re : Re : Building a form to query from details as well as master Hi, please, can I have a copy of the test form too (email: mmohrmann@schueco.de)? Thanks Marco From: John Chang <mailto:johcha@jhmi.edu>09-Dec-99 16:35

Subject: Re : Building a form to query from details as well as master Hi, Please email me a copy of this test form. My email is johcha@jhmi.edu Thank you From: ARCHANA K. DHINGRA <mailto:adhingra@energygraphics.com>09-Dec-99 22:25 Subject: Re : Building a form to query from details as well as master Hi Abhijith, I've sent you some queries per se to your e-mail address. Could you reply further! Thanks, Archana K. Dhingra From: Oracle, Abhijith Unnikannan <mailto:abhijith.unnikannan@oracle.com>10-Dec-99 04:35 Subject: Re : Building a form to query from details as well as master Hi Archana, Replied just now! Abhijith John : Sent you the test file From: HEMANT RANGOLE <mailto:hrangole@hotmail.com>13-Dec-99 19:11 Subject: Re : Building a form to query from details as well as master CAN I GET A COPY OF THE FORM FOE QUERYING A MASTER DETAIL BLOCK? THANKS HEMANT RANGOLE HRANGOLE@HOTMAIL.COM From: Dana Alcivare <mailto:dalcivare@mindspring.com>20-Dec-99 17:37 Subject: Re : Building a form to query from details as well as master Hi, May I have a copy as well? Thank you, Dana Alcivare

From: Dinis Paes <mailto:dmp@gist.fe.up.pt>06-Jan-00 15:20 Subject: Re : Building a form to query from details as well as master Hello, Can I have a copy of that example? Thanks, Dinis Paes dmp@gist.fe.up.pt From: Ernesto Cruz <mailto:cruzeg@yahoo.com>09-Feb-00 21:18 Subject: Re : Building a form to query from details as well as master Hi, Can I have a copy o the test form? Thanks Ernesto From: colin phillips <mailto:colin_phillips@btinternet.com>20-Apr-00 13:31 Subject: Re : Building a form to query from details as well as master Would you please send me a copy of the test form. to: colin_phillips@talk21.com Thanks From: Krishnan Swaminathan <mailto:kswaminathan@kpmg.com.bh>25-Jun-00 14:41 Subject: Re : Building a form to query from details as well as master Please send me a copy of the test form too (email: n_hammo@yahoo.com) Thanks N. Hammouda

From: Eirik Ellingsen <mailto:eirik.ellingsen@no.ibm.com>10-Jul-00 10:35 Subject: Re : Building a form to query from details as well as master Could I get a copy as well?

Best Regards, Eirik Ellingsen From: Kris Brandt <mailto:kbrandt@fnal.gov>13-Jul-00 19:51 Subject: Re : Building a form to query from details as well as master Please send me a copy too at kbrandt@fnal.gov. Thanks.

From: john feng <mailto:jgf5@daimlerchrysler.com>11-Sep-00 15:23 Subject: Re : Building a form to query from details as well as master Please send me a copy too at jgf5@daimlerchrysler.com, thanks. John Feng From: Oracle, Abhijith Unnikannan <mailto:abhijith.unnikannan@oracle.com>12-Sep-00 04:14 Subject: Re : Building a form to query from details as well as master It is on the way ! Abhijith From: Mark Whalley <mailto:markw@gov.nb.ca>13-Sep-00 15:42 Subject: Re : Building a form to query from details as well as master Could I get a copy of this. Thanks. From: Oracle, Abhijith Unnikannan <mailto:abhijith.unnikannan@oracle.com>14-Sep-00 04:02 Subject: Re : Building a form to query from details as well as master Another one sent !! Abhijith Oracle

From: Svetlana Nikic <mailto:nikics@orvis.com>13-Nov-00 19:47 Subject: Re : Building a form to query from details as well as master I need help figuring this out as well. I sent you an e-mail, but wanted to post this reply as well. Thanks for your help.

Svetlana Nikic Svetlana Nikic The Orvis Company, Inc. From: Oracle, Abhijith Unnikannan <mailto:abhijith.unnikannan@oracle.com>14-Nov-00 04:48 Subject: Re : Building a form to query from details as well as master I have sent the sample Form. Abhijith From: Chitra Tondwalkar <mailto:citrat@hotmail.com>15-Nov-00 16:37 Subject: Re : Building a form to query from details as well as master Abhijit, Can I have a copy of the form please ? email citrat@hotmail.com Thanks Chitra From: Oracle, Abhijith Unnikannan <mailto:abhijith.unnikannan@oracle.com>16-Nov-00 04:40 Subject: Re : Building a form to query from details as well as master Sure ! Abhijith From: Ramesh Thangarajan <mailto:ramesh_thangarajan@groton.pfizer.com>20-Nov-00 20:43 Subject: Re : Building a form to query from details as well as master Hi, Can I also have the demo forms.My mail-id is ramesh_thangarajan@groton.pfizer.com. Thanks T.Ramesh

From: Oracle, Abhijith Unnikannan <mailto:abhijith.unnikannan@oracle.com>21-Nov-00 05:10 Subject: Re : Building a form to query from details as well as master Yes

From: chandrasekhar jagarlamudi <mailto:sekharj@iwd.state.ia.us>10-Jan-01 21:37 Subject: Re : Building a form to query from details as well as master Please email me a copy of this test form. My email is sekharj@iwd.state.ia.us Thank you From: Oracle, Abhijith Unnikannan <mailto:abhijith.unnikannan@oracle.com>11-Jan-01 05:14 Subject: Re : Building a form to query from details as well as master I have sent it. Meanwhile here is the note on how to create this Form : How to query a Master record from a Detail Block <showdoc?db=NOT&id=109583.1> Abhijith Unnikannan Oracle Developer Analyst http://technet.oracle.com From: Mitra Park <mailto:mitra@lufard.com>10-Dec-01 01:50 Subject: Re : Building a form to query from details as well as master Please send me a copy too at jcreator@msn.com, thanks very much !!!

From: Oracle, Abhijith Unnikannan <mailto:abhijith.unnikannan@oracle.com>10-Dec-01 10:20 Subject: Re : Building a form to query from details as well as master Sent it. From: Mukherjee Dona <mailto:dmukherjee@landam.com>14-Dec-01 15:51 Subject: Re : Building a form to query from details as well as master Hi Abhijit, I have done quering the master record from detail block in my own way. Can you send me the one which you talked about.I would like to see how it can be solved differently. My address is: Dmukherjee@landam.com Thanks a bunch, Dona From: Oracle, Abhijith Unnikannan <mailto:abhijith.unnikannan@oracle.com>14-Dec-01 18:03 Subject: Re : Building a form to query from details as well as master

Have a look at the link that I gave on 11-Jan-01 05:14 From: Issa Elkhoury <mailto:ielkhour@aol.com>19-Dec-01 06:52 Subject: Re : Building a form to query from details as well as master can i have a copy of test form From: Rukmani Parameswaran <mailto:rukmani12@yahoo.com>18-Jan-02 14:54 Subject: Re : Building a form to query from details as well as master Could you please send me a copy of the form to query both master and detail blocks in the same Screen. Me email id is rparameswaran@oig.usda.gov Thanks, Rukmani

From: Oracle, Abhijith Unnikannan <mailto:abhijith.unnikannan@oracle.com>19-Jan-02 07:04 Subject: Re : Building a form to query from details as well as master I have sent it. Meanwhile here is the note on how to create this Form : How to query a Master record from a Detail Block <showdoc?db=NOT&id=109583.1> From: Connie Adams <mailto:pcs-inc@cablespeed.com>29-May-02 01:35 Subject: Re : Building a form to query from details as well as master Would your test form also apply to the following example? If so, please send me a copy of the form. BUILDING(Bldg_id,Div_id,Bldg_name) DIVISION(Div_id,Div_name) EMPLOYEE(Emp_id,Emp_name,Job_id,Div_id) JOBS(Job_id,Job_title) Based on the Bldg_name, I would like to return the following detail record. Div_name,Emp_name,Job_Title --------------------------Thanks in advance, Connie

From: Oracle, Abhijith Unnikannan <mailto:abhijith.unnikannan@oracle.com>29-May-02 12:50 Subject: Re : Building a form to query from details as well as master Connie, This sample is based on the EMP?DEPT master detail relation ship. It should also work for other Master/Detail relations as well. Please look into the sample that I have sent as well as the note that I have provided above as a link, please follow the steps mentioned there to create a form for your application. Abhijith From: IFS Sverige . <mailto:info@ifsab.se>11-Jun-02 12:27 Subject: Re : Building a form to query from details as well as master Hello Pl send me also the copy of the test form . Thanks Rgds Babhruu bv_mittal@hotmail.com From: Mercedes Miguel <mailto:mercedes.miguel@itp.es>18-Jul-02 10:48 Subject: Re : Building a form to query from details as well as master May I get a copy too? (mercedes.miguel@itp.es) Thank You M. Miguel From: Samuel John <mailto:samuel.john@thinkspark.com>14-Nov-02 15:14 Subject: Re : Building a form to query from details as well as master Hi Abhijith, I have a form which has two levels of Master Detail relation. I want to query on a field in the third level . In our example we have a form which tracks the request for Equipments. So we have 1)Request Header 2) Request line On each Request line based on the quantity of equipment type requested we have 3) Equipment Usage. Now if we have to find out who is using a specific Equipment (This information will be in the 3) Equipment Usage), then we have to query the third level. If possible please send a test case Thanks Sam

Вам также может понравиться