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.
Snelle dialoog
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
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
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
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
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.