January 19, 2009

Forms Function Numbers

Editing the fmrweb.res to assign hotkeys to Forms Functions is not that easy. The syntax is described inside the file and there are no problems with the parameters JFN, JMN, URKS and URFD. But what IDs are used for FFN ?


# JFN : JMN : URKS : FFN : URFD (whitespace ignored)
#
# JFN = Java function number
# JMN = Java modifiers number
# URKS = User-readable key sequence (double-quoted)
# FFN = Forms function number
# URFD = User-readable function description (double-quoted)

Here it the complete list:

FFN Description
-----+---------------
1 Next Field
2 Previous Field
3 Clear Field
4 Left Arrow
5 Right Arrow
6 Up Arrow
7 Down Arrow
8 Goto Beginning of Line
9 Goto End of Line
10 Goto Extreme Vertical Up
11 Goto Extreme Vertical Down
12 Scroll Up
13 Scroll Down
14 Scroll Left
15 Scroll Right
16 Delete Character Left
17 Delete Character Right
18 Delete Line
19 Move Cursor Left
20 Move Cursor Right
21 Scroll-Up
22 Invoke Editor for Field
23 Delete Character ??
/ 23 Insert Line ??
24 Search
25 Toggle Insert/Replace Mode
26 Select Item
27 Return
28 Invoke Menu
29 List of Values
30 Help
31 Redraw Screen
32 Exit
35 Show Keys
36 Accept
61 Next Primary Key
62 Clear Record
63 Delete Record
64 Duplicate Record
65 Insert Record
66 Next Set
67 Next Record
68 Previous Record
69 Clear Block
70 Block Menu
71 Next Block
72 Previous Block
73 Duplicate Field
74 Clear Form
75 Enter
76 Enter Query
77 Execute Query
78 Display Error
79 Print
80 Count Query
81 Update Record
82 User Defined Key 0
83 User Defined Key 1
84 User Defined Key 2
85 User Defined Key 3
86 User Defined Key 4
87 User Defined Key 5
88 User Defined Key 6
89 User Defined Key 7
90 User Defined Key 8
91 User Defined Key 9
92 Clear Eol
95 List Tab Pages
11022 Accelerator Key 1
11023 Accelerator Key 2
11024 Accelerator Key 3
11025 Accelerator Key 4
11026 Accelerator Key 5
11027 Accelerator Key 6
11028 Accelerator Key 7
11029 Accelerator Key 8
11030 Accelerator Key 9
11031 Accelerator Key 10


Have fun with the Forms Function Numbers !
I'll check as soon as possible, why the Nr. 23 is duplicated in the notes from Oracle...
Gerd

December 17, 2008

Tab-Canvases and F2

I just found an interesting undocumented feature:


While the cursor is inside a tab-canvas you can press F2


Then you see a little list-item in the upper-right corner of the tab-canvas. There you can move up, down and press Enter or Return.


This starts the WHEN-TAB-PAGE-CHANGED-trigger. Here you can do whatever you want. For example a navigation to a block and starting a query.

Have fun
Gerd

November 20, 2008

New Statement of Direction, October 2008

This is the new Statement of Direction from October 2008. (Link to my last SoD-Post)



What's different?

The graphical timeline is erased in the document. And nothing else has changed!

Here are some links to older Statement of Directions:
SoD 2008 / 07
SoD 2007 / 11
SoD 2005 / 09
SoD 2005 / 05
SoD 2005 / 03
SoD 2004 / 06

October 16, 2008

SQL Developer Data Modeling

Here are the first screenshots of the new data modeling tool, called Oracle SQL Developer Data Modeling (OSDM), which is part of the SQL Developer:


First of all I tested the capability of a table capture. Few clicks and he grabbed my datamodell and placed it in the relational-section of the OSDM.


Then you can "Engineer to Logical Model": After that you have an ER-Model:


Here is the link to the download-area on OTN: Oracle SQL Developer Data Modeling

I'll test more in the next days and write down the next experiences
Gerd

October 15, 2008

Views based on Year, Month and Day

While developing applications I need often list-of-values, which have a result-set of years, months or days.

You can hard-code those selects each time in each form, but much more elegant is to create views, which do the whole work.

Here are 3 views for years, months and days:


CREATE OR REPLACE FORCE VIEW YEARS_V
(YDATE) AS
SELECT add_months (trunc (sysdate, 'YYYY'), 12 * (50 - Level))
FROM Dual
CONNECT BY Level <= 100;

CREATE OR REPLACE FORCE VIEW MONTHS_V
(MDATE) AS
SELECT add_months (trunc (sysdate, 'MM'), 500 - Level)
FROM Dual
CONNECT BY Level <= 1000;

CREATE OR REPLACE FORCE VIEW DAYS_V
(DDATE) AS
SELECT trunc (sysdate) + 15000 - Level
FROM Dual
CONNECT BY Level <= 30000;


Those Views helps us to Select Data for the

- actual year +/- 50 years
- actual month +/- 500 months
- actual day +/- 15000 days

In a Record-Group you can use those views:

LOV of the next 10 years

SELECT YDATE
FROM Years_V
WHERE YDATE BETWEEN trunc (sysdate, 'YYYY')
AND add_months (trunc (sysdate, 'YYYY'), 10*12);


LOV of the last 30 and the next 10 days

SELECT DDATE
FROM Days_V
WHERE DDATE BETWEEN trunc (sysdate-30) AND trunc (sysdate+10);


Try it
Gerd

September 26, 2008

New Oracle Designer ? - part 2

I just found an interesting link to the first pictures of the new "Oracle Designer".

The data modeling functions are implemented in the SQL Developer.

Have fun reading Jared's post: Data modeling with SQL Developer

August 05, 2008

New Statement of Direction, July 2008

Oracle announced this Statement of Direction some days ago.

What's new ?

1) A link to the Oracle lifetime-support whitepaper. There is a redirect to this URL.

2) And 4 years more support (minimum). In the last statement of direction 2013 was the minimum support-date. Now it is 2017!

July 21, 2008

Finding all Items in the layout-editor at once

To find all items, which are displayed in the layout editor at once in the Object Navigator, press Ctrl+A, for select All.



After the Ctrl+A you have all Objects marked in the Tree:



have fun
Gerd

July 02, 2008

New Oracle Designer ?

I can't believe it...

Oracle SQL-Developer is announcing modeling-support in an upcoming release.

Here are the top features:


Database Data Modeling to support:

* Designing logical Entity Relation Diagrams
* Building physical schema designs
* Generating and executing DDL scripts
* Reverse and forward engineering of existing relational data structures
* Data domain administration
* Naming standardization
* Model formatting (font, colors)
* Importing data models from CA Erwin and Oracle Designer
* Compare and merge facilities
* Multiple database support
o Oracle Database
o DB2 (Mainframe & UDB)
o Microsoft SQL Server
* Logical and physical multi-dimensional modeling
* Object relational Data Types
* Spatial Modeling
* Multi-level logical and physical design environments
* Model validation rules
* Offline (file based) and Repository based modeling

what a wonderful news. The old designer is not the best choice today, since it got the codefreeze years ago.
Gerd

July 01, 2008

Talk2Gerd in a new Look



Those of you with sharp eyes can see the golden gate bridge to the left. I shot the picture Sept. 2005, Shorebird Park, Oakland.

June 26, 2008

Faster compilation in Forms Builder

You can speed up the time for a "Compile All", when you close all nodes in the Object Navigator, so that the form shows only the name of the form. Then you press Ctrl+Shift+K for Compile All.


Compile-Times of a normal pl/sql-library with 70 program units


closed nodes : 2 sec
open nodes : 18 sec

Compile-Times of a big pl/sql-library with 130 program units

closed nodes : 2 sec
open nodes : 34 sec

Compile-Times of a medium form with 14 blocks

closed nodes : 3 sec
open nodes : 12 sec

Compile-Times of a big form with 24 blocks and much sourcecode

closed nodes : 6 sec
open nodes : 37 sec



With this little trick you can compile really fast !
try it
Gerd

June 19, 2008

Compile or Compile All ?

What is the best way to compile a form? Before I answer this question here are some explanations:


Compile Incremental : Ctrl + K
Compile All : Shift + Ctrl + K
Compile Module (Generate): Ctrl + T
Run : Ctrl + R

In the older versions of Forms the Compile Module was known as Generate. I prefer this, because the Ctrl+T generates the FMX.

During my daily work I open forms and maintain them. If I use the Ctrl+T to generate the FMX, then Oracle Forms starts implicitly a Compile Incremental before the Generate.

And that's the problem. In 9 of 10 cases the generated FMX is OK, but sometimes the automatical Compile Incremental didn't work properly. It results in non-reproducable errors at runtime.

My solution for this problem is:

After opening a form I start immediately a Compile All. Each Incremental Compile and each Generate now works without runtime-problems.

Try it
Gerd

June 05, 2008

Forms Shutdown

In the article forms-startup I wrote last year how to hide the browser-window, while starting a forms-application. Another problem is: How can we close the browser-window after exiting the forms-application. Here is my favorite solution:

1) Create a new html-file e.g. close.html in your html-directory. This is the main routine, which closes the browser-window.


< BODY onLoad="window.close();" >

2) Set the formsweb.cfg parameter HTMLbeforeForm in the server-directory. This eliminates the security-question "Do you want to close the browser-window".

HTMLbeforeForm=< SCRIPT LANGUAGE="JavaScript" >window.opener = top;< /SCRIPT >

3) The form, which closes the main-application needs a POST-FORM-trigger. /forms/html is a virtual-directory, which points to the close.html.

web.show_document ('/forms/html/close.html', '_self');

Used directories:

< DevSuite-Home > : Your Developer-Suite Home Directory
html-directory : < DevSuite-Home >\tools\web\html
server-directory : < DevSuite-Home >\forms\server
virtual-html-directory : /forms/html defined in forms.conf

Many thanks to Duncan Mills, Frank Nimphius and Richard Squires, who posted this code in the OTN years ago.

Pro) This technique works on IE 6 and IE 7, tested with JInitiator and Sun-Plugin.
Contra) No Firefox-Support. Since Firefox 2.0 it isn't allowed to close a window via JavaScript.

Important: The limitations of this blog forced me to write blanks after each "<" and before each ">". Don't write them, when you use this technique !

have fun
Gerd

June 03, 2008

Sourcecode-Formatting in the OTN-Forum

Nearly each day I see unformatted code in the OTN-Forum. Why?

The problem is, that many poster don't know, how to format sourcecodes. Example:


/*
|| Selecting the sum from all sub-order's
*/
if :control.sub_order_id is not null then
select sum (value)
into :control.sum
from sum_orders
where order_id in (select order_id
from sub_orders
where sub_order_id = :control.sub_order_id
and sub_order_type = 'ONLINE');
else
:control.sum := 0;
end if;
/*
|| now we use the sum in the ...
*/

Who can read that? I love puzzling, but not in sourcecodes. How can we solve this problem?

Use [pre] before your sourcecode and [/pre] after the sourcecode. Then it is readable like your original code:

[pre]
...
if :control.sub_order_id is not null then
select sum (value)
into :control.sum
...
[/pre]

and here is the solution of the above example after using the preformat-tags:

/*
|| Selecting the sum from all sub-order's
*/
if :control.sub_order_id is not null then
select sum (value)
into :control.sum
from sum_orders
where order_id in (select order_id
from sub_orders
where sub_order_id = :control.sub_order_id
and sub_order_type = 'ONLINE');
else
:control.sum := 0;
end if;
/*
|| now we use the sum in the ...
*/

This is readable code at it's best!

Try it
Gerd

June 02, 2008

Open-Form and the Exit-Strategy (2)

Sometimes you use your source-codes since years and think - there is no easier, better and smarter way to do something, like the way in that piece of code.

So here. After writing and testing my last post everything runs well!

Today I refactored some parts of my exit-strategy code and created this much easier solution (normally this is not the goal of refactoring !):

all you need is a

KEY-EXIT in the startform:


COPY ('TRUE', 'GLOBAL.EXIT_IMMEDIATE');
EXIT_FORM (no_validate);

and a WHEN-FORM-NAVIGATE in all other forms

DEFAULT_VALUE ('FALSE', 'GLOBAL.EXIT_IMMEDIATE');
IF :GLOBAL.EXIT_IMMEDIATE = 'TRUE' THEN
EXIT_FORM (no_validate);
END IF;


Now we have a chain reaction, when exiting the startform. Each closing form will let the focus jump to another open form. Then the WHEN-FORM-NAVIGATE triggers and closes this form too. Because the global variable was set to AUTOCLOSE = TRUE.

After the last form the whole application is closed and that's the best way to close an entire application.

If some of those forms started other forms through call_form, then you have to use the WHEN-WINDOW-ACTIVATED, because the WHEN-FORM-NAVIGATE won't trigger while getting the focus.

Isn't that a really easy solution?
Have fun with it
Gerd