venerdì 11 gennaio 2013

Oracle Trigger

Ieri mi sono trovato a dover fare un trigger su Oracle da zero e ho avuto qualche difficoltà sintattica e concettuale.

Dopo aver scritto il mio trigger e compilato correttamente, durante l'uso veniva generato un errore : 
ORA-04098: trigger name is invalid and failed re-validation. 
Poichè il trigger era compilato correttamente sono dovuto ricorrere al comando "show errors trigger trigger_name;" per avere ulteriori chiarimenti sull'errore.

Una volta risolto il primo problema questo era il corpo del trigger :
update TESDOCUM SET CIG=(select MAX(REGISTRIVA)  
                         from CAUSCONT
                         where CAUSCONTAB=CODICE

                           and NUMERO=:new.NUMERO)
where NUMERO=:new.NUMERO

Eseguendo il trigger sono incorso nell'errore
ORA-04091: table AM is mutating, trigger/function may not see it
Era un problema concettuale. Non si può cambiare utilizzare o modificare un record del database mentre lo stesso record è oggetto di trigger.
I database danno accesso ai dati in lettura/scrittura con degli alias.

Alla fine il trigger è il seguente:
create or replace trigger tesdocum_trg1
 before insert or update
on TESDOCUM
REFERENCING new AS new
FOR EACH ROW
WHEN (NEW.CAUSCONTAB IS NOT NULL)
begin

select MAX(REGISTRIVA) into :new.CIG
  from CAUSCONT
 where :new.CAUSCONTAB=CODICE;


end tesdocum_trg1;

martedì 8 gennaio 2013

Variabili di configurazione database DB2

Dopo l'installazione di DB2 è necessario modificare dei valori di configurazione
I seguenti valori sono per le versioni di DB2 antecedenti alla 9


db2 update dbm cfg using QUERY_HEAP_SZ 1000 

db2 update db cfg for DITTA1 using APPLHEAPSZ 512
db2 update db cfg for DITTA1 using PCKCACHESZ 128 
db2 update db cfg for DITTA1 using BUFFPAGE 1024 
db2 update db cfg for DITTA1 using NUM_IOCLEANERS 3 
db2 update db cfg for DITTA1 using NUM_IOSERVERS 9 
db2 update db cfg for DITTA1 using LOCKLIST 150 
db2 update db cfg for DITTA1 using MAXAPPLS  
db2 update db cfg for DITTA1 using AVG_APPLS   
db2 update db cfg for DITTA1 using LOGFILSIZ 256 
db2 update db cfg for DITTA1 using LOGPRIMARY  
db2 update db cfg for DITTA1 using LOGSECOND  


I seguenti valori sono per le versioni di DB2 uguali o superiori alla 9


db2 update dbm cfg using QUERY_HEAP_SZ 1000 

db2 update db cfg for DITTA1 using APPLHEAPSZ 2048
db2 update db cfg for DITTA1 using APPL_MEMORY 40016
db2 update db cfg for DITTA1 using BUFFPAGE 16384
db2 update db cfg for DITTA1 using DBHEAP 600
db2 update db cfg for DITTA1 using NUM_IOCLEANERS 3 
db2 update db cfg for DITTA1 using NUM_IOSERVERS 9 
db2 update db cfg for DITTA1 using LOCKLIST 300
db2 update db cfg for DITTA1 using SORTHEAP 1024
db2 update db cfg for DITTA1 using AVG_APPLS   
db2 update db cfg for DITTA1 using LOGFILSIZ 256 
db2 update db cfg for DITTA1 using LOGPRIMARY  
db2 update db cfg for DITTA1 using LOGSECOND  
db2 update db cfg for DITTA1 using PCKCACHESZ 128 
db2 update db cfg for DITTA1 using MAXAPPLS  

venerdì 1 giugno 2012

Query Excel con parametri

Visto che mi dimentico sempre come si fa lo scrivo qui.

Per inserire un parametro in una query di Microsoft Query è necessario creare un nuovo criterio. Al posto del valore inserire una label fra parentesi quadre.
NB il nome del parametro deve essere diverso da qualsiasi campo delle tabelle coinvolte nella query.
All'apertura della query o del foglio excel collegato verrà richiesto il parametro.





martedì 8 maggio 2012

Ricalcolo saldi contabili ( Tasalsot )

La seguente query ricrea TASALSOT ( che quindi deve essere svuotato prima ).
La query è per SqlServer
Per gli altri db basta spostituire il funzione ISNULL con VALUE,NVL,IFNULL a seconda del db


INSERT INTO TASALSOT
SELECT CODICE,PIACON.SOTTOCONTO,
       ISNULL(LIRE.DARE,0) DARE,
       ISNULL(LIRE.AVERE,0) AVERE,
       ISNULL(LIRE.DAREINIT,0) DAREINIT,
       ISNULL(LIRE.AVEREINIT,0) AVEREINIT,
       ISNULL(LIRE.EDARE,0) EDARE,
       ISNULL(LIRE.EAVERE,0) EAVERE,
       ISNULL(LIRE.EDAREINIT,0) EDAREINIT,
       ISNULL(LIRE.EAVEREINIT,0) EAVEREINIT,
       DATULTMOV,
       NUMULTMOV
 FROM PIACON INNER JOIN ESC ON 1=1
LEFT OUTER JOIN (SELECT ESECOMPET,SOTTOCONTO,
                        SUM(CASE WHEN SEGNO='D' THEN IMPORTO ELSE 0 END) DARE,
                        SUM(CASE WHEN SEGNO='A' THEN IMPORTO ELSE 0 END) AVERE,
                        SUM(CASE WHEN SEGNO='D' AND TIPOCAUSAL='A' THEN IMPORTO ELSE 0 END) DAREINIT,
                        SUM(CASE WHEN SEGNO='A' AND TIPOCAUSAL='A' THEN IMPORTO ELSE 0 END) AVEREINIT,
                        SUM(CASE WHEN SEGNO='D' THEN EIMPORTO ELSE 0 END) EDARE,
                        SUM(CASE WHEN SEGNO='A' THEN EIMPORTO ELSE 0 END) EAVERE,
                        SUM(CASE WHEN SEGNO='D' AND TIPOCAUSAL='A' THEN EIMPORTO ELSE 0 END) EDAREINIT,
                        SUM(CASE WHEN SEGNO='A' AND TIPOCAUSAL='A' THEN EIMPORTO ELSE 0 END) EAVEREINIT,
                        MAX(DATAREG) DATULTMOV,
                        MAX(NUMERO) NUMULTMOV
                 FROM MOVCO 
                 WHERE SOSPESO_SN='N'
                 AND TEMPORA_SN='N'
                 AND SIMULAZ_SN='N'
                 AND SOLOANA_SN<>'S'
                 GROUP BY ESECOMPET,SOTTOCONTO) LIRE ON ESC.CODICE=LIRE.ESECOMPET AND PIACON.SOTTOCONTO=LIRE.SOTTOCONTO                 
                 ORDER BY ESC.CODICE,PIACON.SOTTOCONTO

Diritti in Oracle

Per concedere un certo diritto su una tabella ad un altro user/schema la sintassi è la seguente :
GRANT <diritto> ON  <tabella> TO < user>
GRANT SELECT ON PIACON TO DITTA1

mercoledì 4 aprile 2012

Esercizi su funzioni per date di SqlServer

Qui sotto c'è un esempio di due funzioni per la manipolazione di date su SQLServer


DATEADD aggiunge un valore ad una certa data
DATEDIFF restituisce la differenza fra due date
-------------------------------------------------------
select CODICE "Articolo", DESCRIZION "Descrizione", 
       substring(DATACREAZI,7,2)+'/'+substring(DATACREAZI,5,2)+'/'+substring(DATACREAZI,1,4) "Dt. Creazione", 
       DATEADD(year, 2, DATACREAZI) "Uscita produzione",
       substring(ULT_AGG,7,2)+'/'+substring(ULT_AGG,5,2)+'/'+substring(ULT_AGG,1,4) "Dt. Ult. Agg", 
       DATEDIFF(day, ULT_AGG, GETDATE()) "gg. dall'ult. aggiorn."
  FROM ANAMAGA
 WHERE STATO = 'S'
-------------------------------------------------------

"Uscita produzione":  2 anni successivi a DATACREAZI
"gg. dall'ult. aggiorn.":  differenza in giorni dal valore del campo ULT_AGG alla data odierna.


Grazie a Gianni per la ricerca

Riferimenti su web

  http://www.w3schools.com/sql/func_dateadd.asp
  http://www.sql-server-helper.com/tips/date-formats.aspx

giovedì 29 marzo 2012

Query per dati registro cespiti di prova

La query di cui sotto restituisce gli stessi dati ( a dir la verità mi mancano le rivalutazioni/svalutazioni ) che vengono stampati durante la stampa di prova del registro cespiti

Dopo la stampa definitiva, la query deve essere rivista.

La query estrae i dati dettagliati per cespite. E' sufficiente utilizzare i subtotali di Excel per totalizzare per Categoria

PS. La query è fatta per ORACLE ( la variazioni per altri db sono semplici ) 

------------- Inizio Testo Query -----------------------------------------------
select  
c.categoria,cat.descrizion,c.codice,c.descrizion,
substr(datainiamm,7,2)||'/'||substr(datainiamm,5,2)||'/'||substr(datainiamm,1,4) Data_Ini_Amm,
case 
when acq.datareg is not null then
  substr(acq.datareg,7,2)||'/'||substr(acq.datareg,5,2)||'/'||substr(acq.datareg,1,4) 
end
  Data_Acq,
c.numfatfor,
substr(c.datafatfor,7,2)||'/'||substr(c.datafatfor,5,2)||'/'||substr(c.datafatfor,1,4) data_fatt_for, 
nvl(acq.eimporto,0) imp_acq,

c.evaloreini costo_sto,c.ebaseammor base_amm,
c.eresiduoam-nvl(amm.eimporto,0) residuo_amm, c.eimpnonamm non_amm,
c.etotaleamm+nvl(amm.eimporto,0) fondo_amm,
nvl(ali.eimporto,0) ali_anno,
nvl(amm.eimporto,0) amm_anno,
c.eplusval-c.eminusval plus_min,

c.eresiduocv-nvl(amm.eimpammciv,0) residuo_amm_civ,
c.eplusciv-c.eminusciv plus_min_civ,
c.efondociv+nvl(amm.eimpammciv,0) fondo_civ,
nvl(amm.eimpammciv,0) amm_civ_anno,

nvl(ali.etotaleamm,0) ali_anno_tot_fondo,
nvl(ali.eimpammort,0) ali_tot_costo_storico,
nvl(ali.etotammciv,0) ali_anno_tot_fondo_civ,

c.evaloreini-nvl(ali.eimpammort,0) netto_ali_costo_sto,
c.etotaleamm+nvl(amm.eimporto,0)-nvl(ali.etotaleamm,0) netto_ali_fondo_amm,
c.efondociv+nvl(amm.eimpammciv,0)-nvl(ali.etotammciv,0) netto_ali_fondo_amm_civ,

nvl(amm.eimporto,0) importo_amm,
nvl(amm.eimpammciv,0) importo_amm_civ,
nvl(AMm.Percamm,0) pct_amm,
nvl(AMm.Perc_civ,0) pct_civ

from 
( select * from cespiti
 where 1=1
 and codice is not null
 and ( 
 (datainiamm < '2012')
   or
 (exists ( select 1 from movce m1 where m1.categoria=cespiti.categoria and m1.codcespite=cespiti.codice and tipomov='A' and esereg='2011') 
 ))
 and (
 (alienat_sn='N') or
 ( alienat_sn='S' and exists ( select 1 from movce m1 where m1.categoria=cespiti.categoria and m1.codcespite=cespiti.codice and tipomov='L' and esereg='2011')
  )

 )
) c 
inner join siglapp.catbeni cat on c.categoria=cat.codice
left outer join (
select * from movce where esereg='2011'
and tipomov='M') amm
on c.categoria=amm.categoria
and c.codice=amm.codcespite
left outer join (
select * from movce where esereg='2011'
and tipomov='L') ali
on c.categoria=ali.categoria
and c.codice=ali.codcespite

left outer join (
select * from movce where esereg='2011'
and tipomov='A') acq
on c.categoria=acq.categoria
and c.codice=acq.codcespite
order by c.categoria,c.codice
------------- Fine Testo Query -----------------------------------------------