top of page

Rapporten plus

Deze pagina behandelt voornamelijk de volgende technieken:

  • script

  • query's in databronnen

​

Deze technieken worden hieronder ingezet om bij het draaien van de rapporten zo weinig mogelijk gegevens uit de database op te halen. Dataverkeer is de belangrijkste bron van vertraging.

​

Ook kunnen deze technieken worden ingezet om generieke rapporten te maken voor bijvoorbeeld inzicht in de kwaliteit van de gegevens in de database.

Rapporten plus: Tekst

Snelle dialoog

Rapporten plus: Tekst

Bij tabellen met veel inhoud kan het lang duren voordat het dialoogscherm opkomt. Dit is vaak het geval bij inspectiegegevens, maar ook bij deze dataset van 160.000 bomen.

​

In onderstaande oplossing worden eerst alleen de unieke waarden van de Nederlandse boomnamen opgehaald met de databron DIALOOG_NAAM:

select distinct

NEDERLANDSE_NAAM

from BOOM

​

De waarde die wordt meegegeven in de dialoog wordt normaal gesproken door Fast Reports standaard in het filter gezet van de op te halen databron. Nu moet dit op een andere manier worden geregeld, met in het achterhoofd zo weinig mogelijk dataverkeer.

​

Hier komt een dynamische databron van pas, de waarde wordt nu namelijk een onderdeel van de databron zelf.

Dynamische databron

Rapporten plus: Tekst

De databron wordt eerst vervangen met de volgende query:

select

WIJK,

NEDERLANDSE_NAAM,

WETENSCHAPPELIJKE_NAAM

from BOOM

​

Hiermee is afscheid genomen van 7 kolommen, de eerste bezuiniging op het dataverkeer.

Vervolgens wordt er afscheid genomen van de rijen die niet nodig voor het resultaat, de tweede bezuiniging.

In de video vinden er twee handelingen plaats:

1. Verwijzing maken inclusief een afhandelingssectie in het tabblad script:

Dit gebeurt via het object btnOk in het dialoogformulier. Onder de schicht staat bovenaan de de gebeurtenis "Click". Bij dubbelklikken wordt de verwijzing hierachter ingevuld en wordt  tevens in het tabblad script een afhandelingssectie gemaakt:

    private void btnOk_Click(object sender, EventArgs e)
    {      

    }


2. Vullen van de code binnen de Accolades:

TableDataSource tds_boom = Report.GetDataSource("OPENDATA_UTRECHT_BOOM") as TableDataSource;
tds_boom.SelectCommand=tds_boom.SelectCommand+" where LOWER(NEDERLANDSE_NAAM) like '%"+TextBox1.Text+"%'";


In de bovenste regel wordt een referentie aangemaakt van de databron "OPENDATA_UTRECHT_BOOM"

​

In de tweede regel wordt hiervan de eigenschap SelectCommand aangepast.

Een where-statement wordt toegevoegd met hierin de waarde (Text) van het invoerveld (TextBox1) uit het dialoogvenster.

​

In de video hieronder is te zien dat bij het opvragen van "berk" het rapport met de dynamische databron 25 keer sneller draait dan het originele rapport.

Eigenlijk was het voor dit rapport niet eens nodig om alle berken op te halen omdat het hier om een geaggregeerd overzicht gaat. Het rapport zal daarom nóg sneller draaien wanneer de samenvatting via de query in de databron wordt gedaan. Hier is alles opgehaald om het verschil in snelheid aan te tonen tussen het wel of niet gebruik maken van een dynamische databron.

Unieke waarden

Rapporten plus: Tekst

Hieronder wordt de techniek ingezet om met één rapport alle unieke waarden van alle kolommen van alle tabellen in de database te tonen.

In het vorige voorbeeld werd alleen aan de start de dynamische databron bijgewerkt. Hier gebeurt dat iedere keer als er in de bovenste detailband een rij is opgehaald. Daarom is het hier nodig dat de eigenschap ForceLoadData van de databron "UNIEKE_WAARDEN" op True wordt gezet.

​

Normaal zijn geneste detailbanden aan elkaar gekoppeld via een relatie. Hier is dat niet nodig omdat de databron dynamisch is.

​

UNIEKE_WAARDEN is de dynamische databron. Bij dynamische databronnen is het van belang om de structuur van de tabel (kolommen en datatypes) in de initiële vulling en in het script met elkaar overeen te laten komen. In dit geval wordt de initiële databron niet aangevuld, maar volledig vervangen.

​

Hieronder staan het script en de query's die in het rapport zijn gebruikt.

​

USER_TAB_COLUMNS:
select

TABLE_NAME,

COLUMN_NAME

from USER_TAB_COLUMNS
where COLUMN_NAME not like ( '%\_GUID%' ) ESCAPE '\'
and COLUMN_NAME not like ( '%\_ID%' ) ESCAPE '\'
and COLUMN_NAME not like ( '%FOTO%' )
and COLUMN_NAME not like ( '%AFB%' )
and COLUMN_NAME != 'ID' 
and TABLE_NAME not like ('MDRT%')
and DATA_TYPE in ('NUMBER','CHAR','VARCHAR2','FLOAT','DATE')

​

UNIEKE_WAARDEN:
select 'Tabel' as TABEL, 'Kolom' as KOLOM,'Waarde' as WAARDE,1 as AANTAL from DUAL

​

Script:
TableDataSource tds = Report.GetDataSource("UNIEKE_WAARDEN") as TableDataSource;
tds.SelectCommand="select'"+((String)Report.GetColumnValue("USER_TAB_COLUMNS.TABLE_NAME"))+"' as TABEL,'"+((String)Report.GetColumnValue("USER_TAB_COLUMNS.COLUMN_NAME"))+"' as KOLOM,REPLACE(SUBSTR(CAST("+((String)Report.GetColumnValue("USER_TAB_COLUMNS.COLUMN_NAME"))+" as varchar2(255)),1,200),chr(10),' ') as WAARDE, COUNT(*) as AANTAL from \""+ ((String)Report.GetColumnValue("USER_TAB_COLUMNS.TABLE_NAME"))+ "\" group by "+((String)Report.GetColumnValue("USER_TAB_COLUMNS.COLUMN_NAME"));

Geometrie

Rapporten plus: Tekst

Lengte uit geometrie (Oracle)

select
ABS(ROUND(SDO_GEOM.SDO_LENGTH(SDO_CS.MAKE_2D(a.GEOMETRIE),0.0005),3)) as LENGTE
from <TABELNAAM> a

Oppervlakte uit geometrie (Oracle)

select
ABS(ROUND(SDO_GEOM.SDO_AREA(SDO_CS.MAKE_2D(a.GEOMETRIE),0.0005),3)) as OPPERVLAKTE 
from <TABELNAAM> a

X en Y uit geometrie (Oracle)

select
a.GEOMETRIE.SDO_POINT.X as X,
a.GEOMETRIE.SDO_POINT.Y as Y
from <TABELNAAM> a

Geometrietype (Oracle)

select
NVL(a.GEOMETRIE.SDO_GTYPE,0) as SDO_TYPE,
DECODE(SUBSTR(NVL(a.GEOMETRIE.SDO_GTYPE,0),-1,1),0,''Null'',1,''Punt'',2,''Lijn/arc'',3,''Vlak'',4,''Collectie'',5,''Multipunt'',6,''Multilijn/arc'',7,''Multivlak'',8,''Solid'',9,''Multisolid'') as TYPE
from <TABELNAAM> a

Latitude en Longitude (Oracle)

select
SDO_CS.TRANSFORM(a.GEOMETRIE, m.DIMINFO, 4326).SDO_POINT.Y as LATITUDE,
SDO_CS.TRANSFORM(a.GEOMETRIE, m.DIMINFO, 4326).SDO_POINT.X as LONGITUDE
from <TABELNAAM> a, USER_SDO_GEOM_METADATA m
where  m.TABLE_NAME='<TABELNAAM>'
and m.COLUMN_NAME='GEOMETRIE';

Tips

Rapporten plus: Tekst

Samenvattingen

Bij samenvattende rapporten is het inbouwen van de samenvatting in de databron de meest efficiënte manier om dataverkeer te beperken.

Foto's

Foto's kunnen per stuk worden opgehaald met een dynamische databron, zonder deze eerst allemaal in te laden.

bottom of page