Problem mit Script bzw. Report aus Script

T-Arendt

Benutzer
Beiträge
13
Hallo Liebes Forum,
ich habe seit kurzem Probleme mit einem Report und finde einfach den Grund nicht. Und zwar bricht der Aufruf des Reports nach ca. 2 Minuten aufgrund des Session-Timeouts des Browsers ab. Es handelt sich bei den Report um eine monatliche Anwesenheitsliste.
Hier mal das Script zum einfügen des Personals in den Bericht:
Code:
select distinct
e.str_name_einrichtung Einrichtung,
m.str_mitarbeiter Mitarbeiter,
m.str_personalnummer Personal_Nr,
(select distinct case when ma.str_bemerkung_ma is null then '' else ma.str_bemerkung_ma||', ' end from t_alp_ma ma left outer join t_alp aa on aa.lid = ma.fklid
  where ma.str_personalnummer = m.str_personalnummer
  and aa.REF_EINRICHTUNG = a.REF_EINRICHTUNG
  and aa.str_datum_mo_jahr in ('01.'||$P{Monat}||'.'||$P{Jahr},'02.'||$P{Monat}||'.'||$P{Jahr},'03.'||$P{Monat}||'.'||$P{Jahr},'04.'||$P{Monat}||'.'||$P{Jahr},'05.'||$P{Monat}||'.'||$P{Jahr},'06.'||$P{Monat}||'.'||$P{Jahr},'07.'||$P{Monat}||'.'||$P{Jahr}))||
(select distinct case when ma.str_bemerkung_ma is null then '' else ma.str_bemerkung_ma||', ' end from t_alp_ma ma left outer join t_alp aa on aa.lid = ma.fklid
  where ma.str_personalnummer = m.str_personalnummer
  and aa.REF_EINRICHTUNG = a.REF_EINRICHTUNG
  and aa.str_datum_mo_jahr in ('08.'||$P{Monat}||'.'||$P{Jahr},'09.'||$P{Monat}||'.'||$P{Jahr},'10.'||$P{Monat}||'.'||$P{Jahr},'11.'||$P{Monat}||'.'||$P{Jahr},'12.'||$P{Monat}||'.'||$P{Jahr},'13.'||$P{Monat}||'.'||$P{Jahr},'14.'||$P{Monat}||'.'||$P{Jahr}))||
(select distinct case when ma.str_bemerkung_ma is null then '' else ma.str_bemerkung_ma||', ' end from t_alp_ma ma left outer join t_alp aa on aa.lid = ma.fklid
  where ma.str_personalnummer = m.str_personalnummer
  and aa.REF_EINRICHTUNG = a.REF_EINRICHTUNG
  and aa.str_datum_mo_jahr in ('15.'||$P{Monat}||'.'||$P{Jahr},'16.'||$P{Monat}||'.'||$P{Jahr},'17.'||$P{Monat}||'.'||$P{Jahr},'18.'||$P{Monat}||'.'||$P{Jahr},'19.'||$P{Monat}||'.'||$P{Jahr},'20.'||$P{Monat}||'.'||$P{Jahr},'21.'||$P{Monat}||'.'||$P{Jahr}))||
(select distinct case when ma.str_bemerkung_ma is null then '' else ma.str_bemerkung_ma||', ' end from t_alp_ma ma left outer join t_alp aa on aa.lid = ma.fklid
  where ma.str_personalnummer = m.str_personalnummer
  and aa.REF_EINRICHTUNG = a.REF_EINRICHTUNG
  and aa.str_datum_mo_jahr in ('22.'||$P{Monat}||'.'||$P{Jahr},'23.'||$P{Monat}||'.'||$P{Jahr},'24.'||$P{Monat}||'.'||$P{Jahr},'25.'||$P{Monat}||'.'||$P{Jahr},'26.'||$P{Monat}||'.'||$P{Jahr},'27.'||$P{Monat}||'.'||$P{Jahr},'28.'||$P{Monat}||'.'||$P{Jahr}))||
(select distinct case when ma.str_bemerkung_ma is null then '' else ma.str_bemerkung_ma||', ' end from t_alp_ma ma left outer join t_alp aa on aa.lid = ma.fklid
  where ma.str_personalnummer = m.str_personalnummer
  and aa.REF_EINRICHTUNG = a.REF_EINRICHTUNG
  and aa.str_datum_mo_jahr in ('29.'||$P{Monat}||'.'||$P{Jahr},'30.'||$P{Monat}||'.'||$P{Jahr},'31.'||$P{Monat}||'.'||$P{Jahr}))    Bemerkung
from
t_alp_ma m
    left outer join t_alp a on m.fklid = a.lid
    left outer join t_einrichtungen e on e.lid = a.REF_EINRICHTUNG
where
((substr(str_datum_di_jahr,4,2) = $P{Monat} and substr(str_datum_di_jahr,7,4) = $P{Jahr}) or
(substr(str_datum_mi_jahr,4,2) = $P{Monat} and substr(str_datum_mi_jahr,7,4) = $P{Jahr}) or
(substr(str_datum_do_jahr,4,2) = $P{Monat} and substr(str_datum_do_jahr,7,4) = $P{Jahr}) or
(substr(str_datum_fr_jahr,4,2) = $P{Monat} and substr(str_datum_fr_jahr,7,4) = $P{Jahr}) or
(substr(str_datum_sa_jahr,4,2) = $P{Monat} and substr(str_datum_sa_jahr,7,4) = $P{Jahr}) or
(substr(str_datum_mo_jahr,4,2) = $P{Monat} and substr(str_datum_mo_jahr,7,4) = $P{Jahr})) and
case when exists (select ein.lid from t_einrichtungen ein where a.REF_EINRICHTUNG = ein.lid) then e.str_user end like $P{Einrichtung}
order by
Einrichtung, Mitarbeiter

Und hier das Script zum einfügen des Anwesenheitskategorie pro Tag und Mitarbeiter:
Code:
select
ak.str_kurzbezeichnung Anwesenheitskategorie
 
from
t_alp_ma m
left outer join t_alp a on a.lid = m.fklid
left outer join t_einrichtungen e on e.lid = a.REF_EINRICHTUNG
left outer join KAT_anwesenheitskategorie ak on
  (case when a.str_datum_di_jahr = $P{Datum} then m.REF_DI
  when a.str_datum_mi_jahr = $P{Datum} then m.REF_MI
  when a.str_datum_do_jahr = $P{Datum} then m.REF_DO
  when a.str_datum_fr_jahr = $P{Datum} then m.REF_FR
  when a.str_datum_sa_jahr = $P{Datum} then m.REF_SA
  when a.str_datum_mo_jahr = $P{Datum} then m.REF_MO else null
  end = ak.lid)
 
where
((str_datum_di_jahr = $P{Datum}) or
(str_datum_mi_jahr = $P{Datum}) or
(str_datum_do_jahr = $P{Datum}) or
(str_datum_fr_jahr = $P{Datum}) or
(str_datum_sa_jahr = $P{Datum}) or
(str_datum_mo_jahr = $P{Datum})) and
case when exists (select ein.lid from t_einrichtungen ein where ein.lid = a.REF_EINRICHTUNG) then e.str_user end like $P{Kita} and
str_personalnummer = $P{Personalnummer}

Das zweite Script wird pro Anwesenheitsliste 30 bzw. 31 mal abgerufen, sprich für jeden Tag wird die entsprechende Kategorie dem Tag und dem Mitarbeiter zugeordnet.

Jetzt zu meiner Frage:
Sieht jemand evtl. Optimierungsmöglichkeiten zur Verbesserung der Performance beim Aufruf des Scriptes?

Bin für jeden Tipp dankbar!!!

MFG
T-Arendt
 
Werbung:

PLSQL_SQL

Datenbank-Guru
Beiträge
176
Hy,

1.Stmt müsste so auch funktionieren. Bitte testen!!

Code:
select distinct
e.str_name_einrichtung Einrichtung,
m.str_mitarbeiter Mitarbeiter,
m.str_personalnummer Personal_Nr,
(select distinct case when ma.str_bemerkung_ma is null then '' else ma.str_bemerkung_ma||', ' end from t_alp_ma ma left outer join t_alp aa on aa.lid = ma.fklid
  where ma.str_personalnummer = m.str_personalnummer
  and aa.REF_EINRICHTUNG = a.REF_EINRICHTUNG
  and aa.str_datum_mo_jahr in ('01.'||$P{Monat}||'.'||$P{Jahr},'02.'||$P{Monat}||'.'||$P{Jahr},'03.'||$P{Monat}||'.'||$P{Jahr},'04.'||$P{Monat}||'.'||$P{Jahr},'05.'||$P{Monat}||'.'||$P{Jahr},'06.'||$P{Monat}||'.'||$P{Jahr},'07.'||$P{Monat}||'.'||$P{Jahr}))||
(select distinct case when ma.str_bemerkung_ma is null then '' else ma.str_bemerkung_ma||', ' end from t_alp_ma ma left outer join t_alp aa on aa.lid = ma.fklid
  where ma.str_personalnummer = m.str_personalnummer
  and aa.REF_EINRICHTUNG = a.REF_EINRICHTUNG
  and aa.str_datum_mo_jahr in ('08.'||$P{Monat}||'.'||$P{Jahr},'09.'||$P{Monat}||'.'||$P{Jahr},'10.'||$P{Monat}||'.'||$P{Jahr},'11.'||$P{Monat}||'.'||$P{Jahr},'12.'||$P{Monat}||'.'||$P{Jahr},'13.'||$P{Monat}||'.'||$P{Jahr},'14.'||$P{Monat}||'.'||$P{Jahr}))||
(select distinct case when ma.str_bemerkung_ma is null then '' else ma.str_bemerkung_ma||', ' end from t_alp_ma ma left outer join t_alp aa on aa.lid = ma.fklid
  where ma.str_personalnummer = m.str_personalnummer
  and aa.REF_EINRICHTUNG = a.REF_EINRICHTUNG
  and aa.str_datum_mo_jahr in ('15.'||$P{Monat}||'.'||$P{Jahr},'16.'||$P{Monat}||'.'||$P{Jahr},'17.'||$P{Monat}||'.'||$P{Jahr},'18.'||$P{Monat}||'.'||$P{Jahr},'19.'||$P{Monat}||'.'||$P{Jahr},'20.'||$P{Monat}||'.'||$P{Jahr},'21.'||$P{Monat}||'.'||$P{Jahr}))||
(select distinct case when ma.str_bemerkung_ma is null then '' else ma.str_bemerkung_ma||', ' end from t_alp_ma ma left outer join t_alp aa on aa.lid = ma.fklid
  where ma.str_personalnummer = m.str_personalnummer
  and aa.REF_EINRICHTUNG = a.REF_EINRICHTUNG
  and aa.str_datum_mo_jahr in ('22.'||$P{Monat}||'.'||$P{Jahr},'23.'||$P{Monat}||'.'||$P{Jahr},'24.'||$P{Monat}||'.'||$P{Jahr},'25.'||$P{Monat}||'.'||$P{Jahr},'26.'||$P{Monat}||'.'||$P{Jahr},'27.'||$P{Monat}||'.'||$P{Jahr},'28.'||$P{Monat}||'.'||$P{Jahr}))||
(select distinct case when ma.str_bemerkung_ma is null then '' else ma.str_bemerkung_ma||', ' end from t_alp_ma ma left outer join t_alp aa on aa.lid = ma.fklid
  where ma.str_personalnummer = m.str_personalnummer
  and aa.REF_EINRICHTUNG = a.REF_EINRICHTUNG
  and aa.str_datum_mo_jahr in ('29.'||$P{Monat}||'.'||$P{Jahr},'30.'||$P{Monat}||'.'||$P{Jahr},'31.'||$P{Monat}||'.'||$P{Jahr}))    Bemerkung
from
t_alp_ma m
    left outer join t_alp a on m.fklid = a.lid
    left outer join t_einrichtungen e on e.lid = a.REF_EINRICHTUNG
where
/*
((substr(str_datum_di_jahr,4,2) = $P{Monat} and substr(str_datum_di_jahr,7,4) = $P{Jahr}) or
(substr(str_datum_mi_jahr,4,2) = $P{Monat} and substr(str_datum_mi_jahr,7,4) = $P{Jahr}) or
(substr(str_datum_do_jahr,4,2) = $P{Monat} and substr(str_datum_do_jahr,7,4) = $P{Jahr}) or
(substr(str_datum_fr_jahr,4,2) = $P{Monat} and substr(str_datum_fr_jahr,7,4) = $P{Jahr}) or
(substr(str_datum_sa_jahr,4,2) = $P{Monat} and substr(str_datum_sa_jahr,7,4) = $P{Jahr}) or
(substr(str_datum_mo_jahr,4,2) = $P{Monat} and substr(str_datum_mo_jahr,7,4) = $P{Jahr})) 
*/
(
$P{Monat} IN ( substr(str_datum_di_jahr,4,2)
 ,substr(str_datum_mi_jahr,4,2)
 ,substr(str_datum_do_jahr,4,2)
 ,substr(str_datum_fr_jahr,4,2)
 ,substr(str_datum_sa_jahr,4,2)
 ,substr(str_datum_m0_jahr,4,2)
)
AND
$P{Jahr} IN (  substr(str_datum_di_jahr,7,4)
 ,substr(str_datum_mi_jahr,7,4)
 ,substr(str_datum_do_jahr,7,4)
 ,substr(str_datum_fr_jahr,7,4)
 ,substr(str_datum_sa_jahr,7,4)
 ,substr(str_datum_mo_jahr,7,4)
)
)
and
case when exists (select ein.lid from t_einrichtungen ein where a.REF_EINRICHTUNG = ein.lid) then e.str_user end like $P{Einrichtung}
order by
Einrichtung, Mitarbeiter

2.Stmt müsste so auch funktionieren. Bitte ebenfalls testen!!

Code:
select
ak.str_kurzbezeichnung Anwesenheitskategorie
 
from
t_alp_ma m
left outer join t_alp a on a.lid = m.fklid
left outer join t_einrichtungen e on e.lid = a.REF_EINRICHTUNG
left outer join KAT_anwesenheitskategorie ak on
  (case when a.str_datum_di_jahr = $P{Datum} then m.REF_DI
  when a.str_datum_mi_jahr = $P{Datum} then m.REF_MI
  when a.str_datum_do_jahr = $P{Datum} then m.REF_DO
  when a.str_datum_fr_jahr = $P{Datum} then m.REF_FR
  when a.str_datum_sa_jahr = $P{Datum} then m.REF_SA
  when a.str_datum_mo_jahr = $P{Datum} then m.REF_MO else null
  end = ak.lid)
 
where
/*
((str_datum_di_jahr = $P{Datum}) or
(str_datum_mi_jahr = $P{Datum}) or
(str_datum_do_jahr = $P{Datum}) or
(str_datum_fr_jahr = $P{Datum}) or
(str_datum_sa_jahr = $P{Datum}) or
(str_datum_mo_jahr = $P{Datum})) 
*/
 
$P{Datum} IN ( str_datum_di_jahr
 ,str_datum_mi_jahr
 ,str_datum_do_jahr
 ,str_datum_fr_jahr
 ,str_datum_sa_jahr
 ,str_datum_mo_jahr
)
and
case when exists (select ein.lid from t_einrichtungen ein where ein.lid = a.REF_EINRICHTUNG) then e.str_user end like $P{Kita} and
str_personalnummer = $P{Personalnummer}

Lg
 

PLSQL_SQL

Datenbank-Guru
Beiträge
176
Hy,

Nachtrag zu meinem gestrigen Beitrag:
Bei Abfragen, welche logisch mehrere "ORs" beinhalten ist immer darauf zu achten, ob dies nicht mit "IN" besser zu lösen wäre, da im Normalfall (aber ukulele wird mich berichtigen) ;-) (@ukulele nicht bös gemeint) das DBMS "IN" besser und performanter verarbeitet als mehrere "OR" - Bedingungen!​
Lg
 

T-Arendt

Benutzer
Beiträge
13
Hey,

Vielen Dank erstmal für den Tipp :) Habe soeben die veränderten Scripte ausgeführt und getestet, leider ohne gewünschten Erfolg! Jedes Script für sich, wird im SQL-Developer recht schnell ausgeführt (unter einer Sekunde), jedoch wird das Script im Report-Programm eingefügt, dauert es ewig! Das Problem ist anscheinend, dass das Programm (iReport), warum auch immer, jetzt nicht mehr mit den 30 bzw. 31 Subreports klarkommt, so dass der Aufruf des Berichts ca. 5-6 min. dauert!

Verändert wurde die Scripte nicht, auch sonstige in Verbindung mit dieser Applikation stehenden Tabellen wurden nicht verändert. Ich bin mittlerweile ratlos! Kann es evtl. auch einfach an der Performance des Servers liegen???

MFG
 

ukulele

Datenbank-Guru
Beiträge
4.409
Dann kannst du dein Script (ohne das ich da jetzt grade durchsteige :) ) auch als View in die DB setzen und deinen Report Builder nur die View abfragen lassen. Natürlich ist es immer schön, wenn man den Code optimiert bekommt.
 

T-Arendt

Benutzer
Beiträge
13
Die Idee mit der View hört sich schon mal gut an :) Werde ich gleich mal Lokal testen. Ich hab zwar noch nie eine View erstellt geschweige diese dann von der Report-Software abfragen lassen, aber das krieg ich schon irgendwie hin :)
 

T-Arendt

Benutzer
Beiträge
13
Ich hab schon wieder ein Problem (wie soll's auch anders sein ;-) )!!!!

Und zwar vesuch ich das Problem nun so zu umgehen, dass ich die An-oder Abwesenheit nicht pro Tag auslesen lasse, sondern für den gesamten Monat pro Mitarbeiter

Nun habe ich folgenden Code bisher geschrieben, jedoch erhalte ich gleich zu Beginn des Scriptes die Fehlermeldung: "ORA-00921 - Unerwartetes Ende des SQL-Befehls"

Code:
SELECT DISTINCT
CASE WHEN SubStr(STR_ZEITRAUM, 20,2) = '01' THEN (SELECT ak.str_kurzbezeichnung
from
t_alp_ma m
left outer join t_alp a on a.lid = m.fklid
left outer join t_einrichtungen e on e.lid = a.REF_EINRICHTUNG
left outer join KAT_anwesenheitskategorie ak ON (
CASE WHEN SubStr(a.str_datum_di_jahr,0,2) = SubStr(STR_ZEITRAUM,20,2) then m.REF_DI OR
WHEN SubStr(a.str_datum_mi_jahr,0,2) = SubStr(STR_ZEITRAUM,20,2) then m.REF_MI OR
SubStr(a.str_datum_do_jahr,0,2) = SubStr(STR_ZEITRAUM,20,2) then m.REF_DO OR
SubStr(a.str_datum_fr_jahr,0,2) = SubStr(STR_ZEITRAUM,20,2) then m.REF_FR OR
SubStr(a.str_datum_sa_jahr,0,2) = SubStr(STR_ZEITRAUM,20,2) then m.REF_SA OR
SubStr(a.str_datum_mo_jahr,0,2) = SubStr(STR_ZEITRAUM,20,2) then m.REF_MO) END AS KAT
FROM
.....

und zwar zeigt der mir als Fehlerquelle die erste CASE WHEN Bedingung an (nämlich hier "CASE WHEN SubStr(STR_ZEITRAUM, 20,2) = '01' ") , jedoch verstehe ich nicht warum :-/

Wenn ich den Befehl ohne den anschließenden Subselect ausführe und einfach statische Bedingungen angebe, funktionierts. Hat jemand eine Idee oder einen Tipp????

Vielen Dank im Voraus für die Hilfe

MFG
 

ukulele

Datenbank-Guru
Beiträge
4.409
Also in dem Teil den du gepostet hast sehe ich schonmal 2x CASE WHEN aber nur einmal END. Außerdem manchmal OR WHEN Bedingung THEN und manchmal OR Bedinung THEN innerhalb der CASE Schleife. Dann werden 2 Klammern aufgemacht und nur eine geschlossen, ich weiss aber nicht genau, wo welcher Subselect endet weil das alles so wirr ist :)
 

T-Arendt

Benutzer
Beiträge
13
Ui, du hast Recht! Das ist wirklich im zweiten und dritten Blick salopp gesagt ziemlicher "Schrott" den ich da gemacht hab :-P

Hab auch schon wieder eine neue "erfolgsversprechende" Idee ;-) Ich hab mich da jetzt festgebissen :-P
 
Werbung:
Oben