Project 5 is about printing a formatted report from DDILEDGE
Project 5 is about printing a formatted report from DDI.LEDGER_VIEW using Head of Forms, Form Breaks, and an End of Form. SPOOL your output to c:\\cs422a\\project5spool.txt DECLARE a record variable, a variable to keep track of a change in RoomNum, and two accumulators Add procedures to the DECLARE block to print a Head of Form, subtotals, and a grand total In the BEGIN block add a select statement to read all the ledger records in DDI.LEDGER_VIEW ordered by RoomNum and RegDate Add a LOOP Use DBMS__OUTPUT.PUT statements to print all the values for each record on a single line. End with a DBMS_OUTPUT.NEW_LINE After the LOOP be sure to print the final subtotal and the grand tota Compile and run the procedure I created my code; but something funny is happening in the output.
My code:
SQL> DECLARE
2 Room_rec DDI.LEDGER_VIEW%ROWTYPE;
3 Last_room DDI.LEDGER_VIEW.ROOMNUM%TYPE := 0;
4 Sub_Total number := 0;
5 Grand_Total number := 0;
6
7 PROCEDURE HEAD_OF_FORM
8 IS
9 BEGIN
10 DBMS_OUTPUT.NEW_LINE;
11 DBMS_OUTPUT.PUT_LINE(\' Room Rates from DDI.LEDGER_VIEW by Room Number \');
12 DBMS_OUTPUT.PUT_LINE(\'RmNum ID RegDate Last First Adults Children Size Beds Rate\');
13 DBMS_OUTPUT.PUT_LINE(\'---- --- --------- ------------ ------------ -- -- -------- -- ----\');
14 END;
15
16 PROCEDURE FORM_BREAK(v_subtot IN OUT NUMBER)
17 IS
18 BEGIN
19 DBMS_OUTPUT.PUT_LINE(\' --------\');
20 DBMS_OUTPUT.PUT_LINE(\'Subtotal \' ||
21 LPAD(TO_CHAR(Sub_Total, \'$99,999\'),8));
22 DBMS_OUTPUT.NEW_LINE;
23 v_subtot := 0;
24 END;
25
26 PROCEDURE END_OF_FORM (v_gtot IN NUMBER)
27 IS
28 BEGIN
29 DBMS_OUTPUT.PUT_LINE(\' --------\');
30 DBMS_OUTPUT.PUT_LINE(\'Grand Total \' ||
31 LPAD(TO_CHAR(v_gtot, \'$99,999\'),8));
32 END;
33
34 BEGIN
35 FOR Room_rec IN
36 (SELECT *
37 FROM DDI.LEDGER_VIEW
38 ORDER BY ROOMNUM, REGDATE)
39 LOOP
40 IF (Last_room = 0) THEN
41 HEAD_OF_FORM;
42 DBMS_OUTPUT.PUT(LPAD(TO_CHAR(Room_rec.ROOMNUM,\'999\'), 3));
43 Last_room := Room_rec.ROOMNUM;
44 Sub_Total := Sub_Total + Room_rec.ROOMRATE;
45 Grand_Total := Grand_Total + Room_rec.ROOMRATE;
46 ELSIF (Room_rec.Roomnum <> Last_room) THEN
47 FORM_BREAK(Sub_Total);
48 HEAD_OF_FORM;
49 DBMS_OUTPUT.PUT(LPAD(TO_CHAR(Room_rec.ROOMNUM,\'999\'), 3));
50 Last_room := Room_rec.ROOMNUM;
51 Sub_Total := Sub_Total + Room_rec.ROOMRATE;
52 Grand_Total := Grand_Total + Room_rec.ROOMRATE;
53 ELSE
54 DBMS_OUTPUT.PUT(\' \');
55 Sub_Total := Sub_Total + Room_rec.ROOMRATE;
56 Grand_Total := Grand_Total + Room_rec.ROOMRATE;
57 END IF;
58 DBMS_OUTPUT.PUT(\' \');
59 DBMS_OUTPUT.PUT(LPAD(TO_CHAR(Room_rec.ROOMNUM, \'999\'), 3));
60 DBMS_OUTPUT.PUT(\' \');
61 DBMS_OUTPUT.PUT(LPAD(TO_CHAR(Room_rec.REGID, \'999\'), 3));
62 DBMS_OUTPUT.PUT(\' \');
63 DBMS_OUTPUT.PUT(TO_CHAR(Room_rec.REGDATE, \'MM/DD/YY\'));
64 DBMS_OUTPUT.PUT(\' \');
65 DBMS_OUTPUT.PUT(RPAD(Room_rec.LASTNAME,12));
66 DBMS_OUTPUT.PUT(\' \');
67 DBMS_OUTPUT.PUT(RPAD(Room_rec.FIRSTNAME,12));
68 DBMS_OUTPUT.PUT(\' \');
69 DBMS_OUTPUT.PUT(LPAD(TO_CHAR(Room_rec.ADULTCNT, \'99\'), 3));
70 DBMS_OUTPUT.PUT(\' \');
71 DBMS_OUTPUT.PUT(LPAD(TO_CHAR(Room_rec.CHILDCNT, \'99\'), 3));
72 DBMS_OUTPUT.PUT(\' \');
73 DBMS_OUTPUT.PUT(RPAD(Room_rec.ROOMSIZE,8));
74 DBMS_OUTPUT.PUT(\' \');
75 DBMS_OUTPUT.PUT(LPAD(TO_CHAR(Room_rec.ROOMBEDCNT, \'99\'), 3));
76 DBMS_OUTPUT.PUT(\' \');
77 DBMS_OUTPUT.PUT(LPAD(TO_CHAR(Room_rec.ROOMRATE, \'$9,999\'),6));
78 DBMS_OUTPUT.NEW_LINE;
79 END LOOP;
80 FORM_BREAK(Sub_Total);
81 END_OF_FORM(Grand_Total);
82 EXCEPTION
83 WHEN NO_DATA_FOUND THEN
84 DBMS_OUTPUT.PUT_LINE(\'No data found.\');
85
86 END;
87 /
My columns are not lining up, every room number is displaying as 10, and not all my information is being displayed. Here is a snap shot of what I am getting:
Room Rates from DDI.LEDGER_VIEW by Room Number
RmNum ID RegDate Last First Adults Children Size Beds Ra
---- --- --------- ------------ ------------ -- -- -------- -- --
10 10 06/01/15 Marino Chip 2 0 King 1 $6
10 1 06/02/15 Parks Eric 2 1 King 1 $6
10 3 06/05/15 Downs Marsha 2 0 King 1 $6
10 3 06/06/15 Sailors Mike 1 0 King 1 $6
10 4 06/07/15 Romez Richardo 1 0 King 1 $6
------
Subtotal $30
-----
Grand Total $2,6
Solution
I dont see any issue with your PL/SQL code. However, please take care of the below points in order to resolve your issue:
Ponit 1, Please consider formatting your output using the below commands before executing the PL/SQL code:
set lines 200 pages 300
If formatting of a column is required, please do that , e.g., col Last for a10. By doing this, your output will be displayed in a better and more readable manner.
Point 2. For spooling, you need to do the fllowing:
SQL > spool project5spool.txt
SQL > DECLARE ...................
SQL > spool off;
By doing this, you will get a text file with name project5spool.txt in your O.S pwd(present working directory).


