Translate

Donnerstag, 9. Mai 2019

Jasper Reports 6.6 - java.lang.NullPointerException - no data found


APEX 19.1 - TIBCO Jasper Reports Studio 6.6

HTTP Status 500 -


type Exception report
message
description The server encountered an internal error that prevented it from fulfilling this request.
exception
java.lang.NullPointerException
note The full stack trace of the root cause is available in the Apache Tomcat/8.0.27 logs.


Sehr hässlich ist diese Fehlermeldung für die Endbenutzer.

Hintergrund:
Ich starte in APEX einen Prozess, der die Ausgabe eines Jasper_Reports als pdf anschiebt.
Das SQL findet keine Daten... (weil die Umstände halt so sind...).

Durch einen kleinen Trick kann man das etwas benutzerfreundlicher gestalten:

Man kann in Jasper Reports Studio 6.6 einstellen, was bei "NULL" (data) passieren soll....

Report --> oben auf den Tabreiter (Namen des Reports) klicken --> dann rechts "Properties"

da habe ich jetzt bei "When no data type" ausgewählt: "All sections - no details"
standardmäßig steht das auf <NULL>

Dann kommt das Dokument nur mit Kopfzeile, Fusszeile - aber ohne weitere Daten...

- dann muss der Benutzer sich fragen, warum das PDF leer ist...

Hope that helps !

Samstag, 4. Mai 2019

Preview PDF in APEX Region

Cross-post - thanks to "Thinking Anew  - aber sorry, ich finde es interessant genug, es auch hier nochmals zu erwähnen.

Ich stolperte gestern über ein interessantes Feature zum Thema PDF:
Anzeige eines PDF-Dokumentes "inline" auf einer APEX Seite/Region:

Es basiert auf pdf.js von Mozilla und ist eine Kombination von SQL, Javascript und JQuery...

Schaut selbst hier https://fuzziebrain.com/content/id/1722/ (mit detaillierter Anleitung)

Dort ist auch eine Demo und ein Downloadlink der Demo hinterlegt:

Link: https://apex.oracle.com/pls/apex/f?p=34781
Username: demo
Password: demo
In der demo ist auch das "Blättern" in einem mehrseitigen PDF (NextPage, PrevPage) realisiert

Great Job Anew !!! Thanks a lot !

Ich habe es auf meine "eigene" Tabelle (MEINE_DATEIEN) angepasst...
das obige Beispiel basiert auf APEX_APPLICATION_TEMP_FILES

My environment: APEX 18.2, 19.1

Mittwoch, 28. November 2018

APEX 18.1 - Dynamic Action Beispiel - set value

Business case:

Ich erfasse "Mitglieder" meine Vereins mit Vorname, Nachname und muss auch immer noch den Namen als Kontoinhaber für die Bankverbindung erfassen... blöd.

Ich möchte nun den Vornamen, Nachnamen mit einer Dynamic Action in das Feld Kontoinhaber "kopieren"...

Here we go:

Kurz:  Eingabe P18_VORNAME, P18_NACHNAME... - wird in P18_KONTOINHABER gesetzt

Im APEX Designer by Dynamic Action auf "CHANGE" klicken --> "create Dynamic Action"

Identification: Name vergeben - im Beispiel: "Set_kontoinhaber"

When : EVENT "CHANGE"

Selection Type: Item(s)

Item(s) P18_VORNAME,P18_NACHNAME


Dann linker Hand im Dynamic Action Pane auf das rote SHOW klicken und es erscheint rechts:




Action: von SHOW ändern in "Set Value"
Settings:
Set Type: JavaScript expression
JavaScript expression (code):

$x("P18_VORNAME").value + ' ' +$x("P18_NACHNAME").value;

Suppress Change Event: No
Affected elements:
Selection Type : Item(s)
Item(s) : P18_KONTOINHABER

Execution Options
Fire when event Result is : True
Fire on initialization  : No
Stop execution: Yes

Viel Spaß und Erfolg damit !

Montag, 10. September 2018

EMAIL_TEMPLATE - how it works

an interesting feature of APEX 18.2 (and before...) is the EMAIL_TEMPLATE; it can be found under "Shared components" --> "other components"

The Email_template consists of 2 parts:

Part 1) The template details
divided into:
- header
- body
- footer
with HTML code content.

By means of a smart click (right hand side region) using "Sample Templates"
--> Get started by loading sample email Templates...
- you can load the HTML code data for the generation of an invoice... :

























The hashtags like  #CUSTOMER_NAME# are substitions we know from other places within APEX.

Once we have defined the Email_template and adjusted the HTML for formatting we like to use it.... How ?

Part 2) pl/sql procedure

On the template_details page (as above) we will find a TAB called: "Sample API Usage" which shows the pl/sql we have to use to map the fields from a page to the hashtag substitions:

begin
    apex_mail.send (
        p_to                 => email_address_of_user,
        p_template_static_id => 'EXAMPLE01',
        p_placeholders       => '{' ||
        '    "CUSTOMER_NAME":'           || apex_json.stringify( :P1_CUST_NAME ) ||
        '   ,"ITEMS_ORDERED":'           || apex_json.stringify( :P1_ITEMS_ORD ) ||
        '   ,"MY_APPLICATION_LINK":'     || apex_json.stringify( some_value ) ||
        '   ,"ORDER_DATE":'              || apex_json.stringify( some_value ) ||
        '   ,"ORDER_NUMBER":'            || apex_json.stringify( some_value ) ||
        '   ,"ORDER_TOTAL":'             || apex_json.stringify( some_value ) ||
        '   ,"ORDER_URL":'               || apex_json.stringify( some_value ) ||
        '   ,"SHIPPING_ADDRESS_LINE_1":' || apex_json.stringify( some_value ) ||
        '   ,"SHIPPING_ADDRESS_LINE_2":' || apex_json.stringify( some_value ) ||
        '   ,"SHIP_TO":'                 || apex_json.stringify( some_value ) ||
        '}' );
end;

You just have to apply your fields from the page to "some_value".... as above.

So on your page you have to create a region of type pl/sql and insert above code... Create a Button and run the process by means of clicking the button.

The output is an HTML formatted email.

I did it even in way: The customer enters his data and clicks on "CREATE" (order or s.th.) and the data is stored in the database AND in parallel an order confirmation - email is sent to the customer.

that's it!
 

APEX 4.2, 5.1, 18,2 - send email from an APEX application

again and again the question is asked: how to send an email from an APEX application ?

sorry - english, because this is an answer to a question in the APEX community forum.

I answered:

1: Pls kindly read the user guide...:
https://docs.oracle.com/database/apex-18.1/HTMDB/sending-email-from-an-application.htm#HTMDB13006

(The whole functionality is based on the APEX_MAIL API)

2. in short:

A) from within a page/form - add procedure of type "Send_email" and use substitutions/placeholders like  &P1_NAME. or  &P1_EMAIL. in the UI properties... - this is one email as per page/data





























B) loop thru records of a table and send emails to those records like: - this is: several emails in a row....

  1. FOR m IN (SELECT VORNAME, NACHNAME, EMAIL  
  2.             FROM TABLE  
  3. Where email is not null  
  4.           and status = 'Aktiv'  
  5. and ABTEILUNG like '%'||:P3_ABTEILUNG  
  6.           )  
  7. LOOP  
  8.   apex_mail.send( p_to => m.EMAIL,  
  9.                   p_from => 'info@my_email.de',  
  10.                   p_bcc => 'info2@my_2nd_email.com',  
  11.                   p_body => 'Hallo '||m.vorname||','||chr(10)||chr(10)||:P3_TEXT||chr(10)||  
  12.                 :P3_SIGNATURE                 
  13.                 ,  
  14.                   p_subj => :P3_SUBJECT  
  15.                 );  
  16. end loop;  

:P3_TEXT, :P3_SIGNATURE, :P3_SUBJECT and :P3_ABTEILUNG are names of fields in page 3 - in SQL and pl/sql these types of substitutions are used... in the Procedure re A) "Send_email" UI we use substitutions of type: &P3_NAME.


APEX 5.1/18.2 - Update several rows in a tabular form / GRID

APEX 5.1 - 18.2

this is to answer a thread from the APEX community forum, therefore in English - sorry:

Question: How to update several rows in a tabular form:

I answered:

In 18.2 recommend to use the interactive grid... (tabular form is legacy...)




the grid has an inbuilt row-selector - even select-/deselect-all....

Create a region of type "interactive grid" and enable it to edit. - then...
steps:
1) create a button and name it "update STATUS rows"
2) create a dynamic action and name it "update_status_rows_DA" of type (WHEN...) Event: click - type: Button -
3) add a true action - action: Execute Javascript code
4) settings/code:

  1. var record;  
  2. //Identify the particular interactive grid  
  3. var ig$     = apex.region("my_region_name").widget();  
  4.   
  5. //Fetch the model for the interactive grid  
  6. var grid    = ig$.interactiveGrid("getViews","grid");  
  7.   
  8. //Fetch the model for the interactive grid  
  9. var model   = ig$.interactiveGrid("getViews","grid").model;  
  10.   
  11. //Fetch selected records  
  12. var selectedRecords = apex.region("my_region_name").widget().interactiveGrid("getViews","grid").view$.grid("getSelectedRecords");  
  13.   
  14. //Loop through selected records and update value of the STATUS column  
  15. for (idx=0; idx < selectedRecords.length; idx++)   
  16. {  
  17. //Get the record  
  18. record = model.getRecord(selectedRecords[idx][0]);  
  19.   
  20. // set Value von column STATUS on "VALID"     
  21. model.setValue(record,"STATUS"'VALID');  
  22. // optional...  
  23. model.setValue(record,"ROW_AMENDED_BY"'&APP_USER.');  
  24. model.setValue(record,"ROW_AMENDED_DATE"'&P14_DATE.');  
  25.        }  

execution options:
Event: Update_rows_DA
Fire when event result is: TRUEFire on initialisation: NO

Samstag, 4. August 2018

APEX 18.1 und Jasper Reports (2) - Subreports und mehrere Parameter

Nach meinen ersten Schritten mit Jasper Reports habe ich inzwischen auch einen sehr umfassenden Report gebaut mit einem Hauptreport und 2 Subreports und der Übergabe von 4 Parametern (Kunde_id, Kunde_Name, weitere_ID, weitere_ID2).

Die Schritte hier wie folgt:

1. Hauptreport anlegen

2. Subreport 1 anlegen (mit den gleichen Parametern wie 1)

3. Subreport 2 anlegen (mit den gleichen Parametern wie 1)

Im "Summary Band" die Subreports einfügen....

Es gibt bestimmt noch andere Wege... - aber dieser funktioniert.

Ergebnis:


Der Aufruf in APEX erfolgt über einen "Drucken"-Button und einen pl/sql Prozess:



Wie man im Code sieht, ruft der Prozess (von Dietmar Aust, Opal Consulting)
das package: xlib_jasperreports auf und darin "set_report_url' ....
In "show_report" werden die Parameter für die Übergabe in der URL zusammengebaut.

Zur Ausgabe stehen in Jasper Reports neben PDF, DOCX, RTF noch weitere Formate zur Verfügung wie ODT, ODS, PPT, XLS, CSV usw..

Update 18.02.2019
Ich habe mittlerweile Listen (siehe oben) und Formulare als PDF am Laufen... Einzeldruck Formular (PDF) oder auch Mehrfachdruck Formular (pro Datensatz eine Seite).
Aktuell arbeite ich an einer Lösung für "PDF-Formular" als E-Mail attachment aus Jasper Report.

Bei Fragen gerne fragen --> bfw-design.de oder fischer-wasels.de