Apr 042018
 

Un problema affrontato è stato quello di generare report in maniera del tutto dinamica.

Utilizzando strumenti come BIRT o JasperReport è possibile creare dei report statici che permettono la visualizzazione di risultati su fogli di stile ad-hoc (definiti dal prodotto) che inglobano una query SQL e permettono la visualizzazione di un risultato che non cambierà mai per quanto riguarda gli attributi da visualizzare.

Cosa fare se ci devossere servire un report dove gli attributi da visualizzare cambiano nel tempo in funzione delle scelte dell’utente?

Supponiamo che abbiamo realizzato un’interfaccia che ci permetta di impostare le Viste (VIEW SQL) sulle quali fare delle JOIN e visualizzare delle informazioni, ma i dati che compongono le informazioni vengono scenlte arbitrariamente. E’ possibile utilizzare JasperReport per ottenere il risultato atteso.

Librerie Maven da integrare:

<dependencies>
    <!-- PostgreSQL Connector -->
    <dependency>
        <groupid>org.postgresql</groupid>
        <artifactid>postgresql</artifactid>
        <scope>runtime</scope>
        <version>${postgresql.version}</version>
    </dependency>
 
    <dependency>
        <groupid>net.sourceforge.dynamicreports</groupid>
        <artifactid>dynamicreports-core</artifactid>
        <version>5.1.0</version>
    </dependency>
 
    <dependency>
        <groupid>net.sourceforge.dynamicreports</groupid>
        <artifactid>dynamicreports-adhoc</artifactid>
        <version>5.1.0</version>
    </dependency>
 
    <dependency>
        <groupid>net.sourceforge.dynamicreports</groupid>
        <artifactid>dynamicreports-googlecharts</artifactid>
        <version>5.1.0</version>
    </dependency>
 
    <!-- https://mvnrepository.com/artifact/com.healthmarketscience.jackcess/jackcess -->
    <dependency>
        <groupid>com.healthmarketscience.jackcess</groupid>
        <artifactid>jackcess</artifactid>
        <version>2.1.11</version>
    </dependency>
 
 
</dependencies>

Dopo aver impostato le dipendenze occorre scrivere il codice che ci permetterà di creare il nostro report (notare che alcune costanti sono da impostare per il vostro codice)

Connection connection = null;
try {
    connection = getConnection();
} catch (SQLException e) {
    e.printStackTrace();
}
String query = "SELECT name, surname, email from people";
// questo e' lo stile per i titoli dedelle colonne da visualizzare
StyleBuilder columnTitleStyle = stl.style()
        .setName("columnTitleStyle")
        .setBorder(stl.pen1Point())
        .setHorizontalTextAlignment(HorizontalTextAlignment.CENTER)
        .setBackgroundColor(Color.LIGHT_GRAY);
 
// questo e' lo stile per i risultati da visualizzare
StyleBuilder columnResultStyle = stl.style()
        .setName("columnResultStyle")
 
        .setHorizontalTextAlignment(HorizontalTextAlignment.CENTER)
        ;
 
JasperReportBuilder jasperReportBuilder = report()
 
        .columns(
                createColumnBuilder(query, connection)
        )
        .title(
                //title of the report
                Components.text("SimpleReportExample")
                        .setHorizontalTextAlignment(HorizontalTextAlignment.CENTER)
                        )
        .title(
                //image of the report
                Components.image(TOP_BANNER_CUSTOM_PNG)
                        .setHorizontalImageAlignment(HorizontalImageAlignment.CENTER)
        )
        .setColumnTitleStyle(columnTitleStyle)
        .setColumnStyle(columnResultStyle)
        .pageFooter(Components.pageXofY())
        .setDataSource(query, connection);
try {
    //jasperReportBuilder.toPdf(new FileOutputStream());
    byte[] report = JasperExportManager.exportReportToPdf(jasperReportBuilder.toJasperPrint());
    //to help debug my problem I write it to a file
    FileOutputStream fos = new FileOutputStream(PDF_FILE_NAME);
    fos.write(report);
    fos.flush();
    fos.close();
} catch (DRException e) {
    e.printStackTrace();
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (JRException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} finally {
    connection.close();
}

Il metodo createColumnBuilder(query, connection) ci permette di creare le colonne che rappresentano il nostro report:

 private static ColumnBuilder[] createColumnBuilder(String sql, Connection connection) throws SQLException {
        String selectSQL = sql + " LIMIT 1 ";
        PreparedStatement preparedStatement = connection.prepareStatement(selectSQL);
        ResultSet rs = preparedStatement.executeQuery( );
        ResultSetMetaData md = rs.getMetaData();
        ColumnBuilder[] columnBuilders = new ColumnBuilder[md.getColumnCount()];
 
        for (int i = 1; i < = md.getColumnCount(); i++) {
            String column = md.getColumnName(i);
            columnBuilders[i -1] = col.column( column, column, String.class);
        }
 
        return columnBuilders;
    }

Per semplicità è stato messo tutto a stringa, ma possiamo anche migliorare il codice riconoscendo il tipo di dato e assegnare al columnBuilders il corretto tipo.

 Posted by at 9:00 am
Mar 262018
 

Premessa

Quando si ha a che fare con procedure di backup o di ripristino del Data Base conviene sempre avere a portata di mano una procedura che sappiamo essere infallibile.

Il mio consiglio personale è quello di realizzare un wiki (eventualmente installando un modulo MediaWiki personale insieme ad un sistema di CI come descritto in precedente articolo) dove riportare tutte quelle procedure standard che vengono eseguite in caso di errore o manutenzione dei sistemi che abbiamo in gestione.

 

Procedura di backup del DataBase

Accedere in ssh al server dove è installato il Data Base Oracle ed eseguire il seguente comando
expdp "user_system/password_system" SCHEMAS=SCHEMA_NAME directory=DATA_PUMP_DIR DUMPFILE=BACKUP_DD_MM_YYYY.dmp logfile=export_backup_DD_MM_YYY.log  job_name=export_BACKUP_DD_MM_YYYY

Procedura di ripristino del DataBase

Come prima cosa occorre copiare il file BACKUP_DD_MM_YYYY.dmp creato nel punto precedente nella directory di dump di Oracle

C:\app\Oracle\admin\orasrv\dpdump

Accedere dal prompt dei comandi (cmd per Windows) ed eseguire il comando seguente per accedere al DB come admin:

sqlplus / AS SYSDBA

Una volta entrati nel DB eseguire in sequenza i seguenti comandi:

 drop user DATA_BASE cascade;
 drop TABLESPACE TABSPACEDB_XP INCLUDING CONTENTS AND DATAFILES;
 create tablespace TABSPACEDB_XP datafile 'E:\oracle\DBNAME\oradata\DBNAME\TABSPACEDB_XP.dbf' SIZE 512M AUTOEXTEND ON NEXT 10M MAXSIZE 10240M EXTENT MANAGEMENT LOCAL;
 create user "USER_DB" IDENTIFIED BY USER_DB default tablespace TABSPACEDB_XP account unlock;
 alter user USER_DB quota unlimited on TABSPACEDB_XP;
 grant resource on USER_DB ;
 grant connect to USER_DB ;
 grant create session to USER_DB ;
 grant read, write on directory data_pump_dir to USER_DB;

Accedere dal prompt dei comandi (cmd per Windows) ed eseguire il seguente comando

impdp system/system01 directory=data_pump_dir logfile=IMPORT_BACKUP_DD_MM_YYYY.log dumpfile=BACKUP_DD_MM_YYYY.DMP

Accedere nuovamente al DB come admin ed eseguire il seguente comando:

EXEC DBMS_UTILITY.compile_schema(schema => 'USER_DB');

A questo punto è possibile acceder al Data BAse con utenza USER_DB/USER_DB . Per cambiare password possiamo eseguire il seguente comando

ALTER USER user_name IDENTIFIED BY new_password;
 Posted by at 10:01 am