Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Problem mit Script bzw. Report aus Script

Dieses Thema im Forum "Oracle" wurde erstellt von T-Arendt, 8 Mai 2012.

  1. T-Arendt

    T-Arendt Benutzer

    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
     
  2. PLSQL_SQL

    PLSQL_SQL Datenbank-Guru

    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
     
    Walter gefällt das.
  3. PLSQL_SQL

    PLSQL_SQL Datenbank-Guru

    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
     
  4. T-Arendt

    T-Arendt Benutzer

    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
     
  5. ukulele

    ukulele Datenbank-Guru

    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.
     
    PLSQL_SQL gefällt das.
  6. T-Arendt

    T-Arendt Benutzer

    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 :)
     
  7. T-Arendt

    T-Arendt Benutzer

    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
     
    PLSQL_SQL gefällt das.
  8. ukulele

    ukulele Datenbank-Guru

    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 :)
     
    PLSQL_SQL gefällt das.
  9. T-Arendt

    T-Arendt Benutzer

    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
     
  10. ukulele

    ukulele Datenbank-Guru

    That's the spirit!
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden