febbraio 2005 - Posts

Quali sono gli errori più comuni che si commettono in fase di progettazione di una base dati?
A che punto ci si deve fermare con il processo di normalizzazione dei dati?
Cosa sono i Dead-Lock e come è possibile evitarli?
Seguendo quali criteri si deve procedere nella scelta del tipo da assgnare alle colonne di una tabella?

La risposta a questi quesiti e a tanti altri la trovate nella sesta parte del corso di Database design in edicola questo mese con DEV n. 126.

Buona lettura

Filed under:

Un lettore di questo blog che non si è firmato mi ha segnalato un comportamento anomalo nella stored procedure che ho pubblicato qualche tempo fa per calcolare il giorno di Pasqua.
L'anomalia segnalata è docuta ad una svista nel codice che compromette la correttezza del calcolo per gli anni precedenti al 2000. In pratica era presente un 16 anziché un 19...

Ecco la stored procedure riveduta e corretta:

CREATE PROCEDURE GetPasqua (
@Anno INT,
@Pasqua DATETIME OUTPUT)
AS
DECLARE @T1 INT
DECLARE @T2 INT
DECLARE @T3 INT
DECLARE @T4 INT
DECLARE @T5 INT
DECLARE @Var1 INT
DECLARE @Var2 INT
DECLARE @NumGG INT

SET @T1 = 0
SET @T2 = 0
SET @T3 = 0
SET @T4 = 0
SET @T5 = 0


IF @Anno < 1900 OR @Anno > 2199
BEGIN
RAISERROR ('La procedura gestisce solo le date comprese tra il 1500 ed il 2199', 16, 1)
END 

IF @Anno >= 1900 AND @Anno <= 2099
BEGIN
SET @Var1 = 24
SET @Var2 = 5
END
IF @Anno >= 2100 AND @Anno <= 2199
BEGIN
SET @Var1 = 24
SET @Var2 = 6
END


SET @T1 = @Anno % 19
SET @T2 = @Anno % 4
SET @T3 = @Anno % 7
SET @T4 = ((19 * @T1) + @Var1) % 30
SET @T5 = ((2 * @T2) + (4 * @T3) + (6 * @T4) + @Var2) % 7

SET @NumGG = 22 + @T4 + @T5

IF @NumGG <= 31
BEGIN
SET @Pasqua = CAST(CAST(@Anno AS VARCHAR(4)) + '03' + RIGHT('0' + CAST(@NumGG AS VARCHAR(2)), 2) AS DATETIME)
END ELSE
BEGIN
SET @NumGG = @NumGG - 31
SET @Pasqua = CAST(CAST(@Anno AS VARCHAR(4)) + '04' + RIGHT('0' + CAST(@NumGG AS VARCHAR(2)), 2) AS DATETIME)
END

RETURN(0)

La cosa interessante è che quel lettore mi ha suggerito un modo alternativo per ottenere il medesimo risultato allegando la stored procedure che riporto di seguito:

CREATE PROCEDURE GetPasqua (
@Anno INT,
@Pasqua DATETIME OUTPUT)
AS
DECLARE @Sec INT
DECLARE @H INT
DECLARE @I INT
DECLARE @J INT
DECLARE @L INT
DECLARE @Mese INT
DECLARE @Giorno INT

SET @Sec = @anno % 19
SET @H = (
24+19*@Sec) % 30
SET @I = @H - CEILING(@H/28)
set @J = (@ANNO + ceiling(@ANNO/4) + @I -13) % 7
SET @L = @i - @j
SET @Mese = 3 + ceiling((@l+40)/44)
SET @Giorno = @L + 28 -31*CEILING(@Mese/4)

IF @Mese > 3
BEGIN
SET @Pasqua = CAST(CAST(@Anno AS VARCHAR(4)) + '04' + RIGHT('0' + CAST(@Giorno AS VARCHAR(2)), 2) AS DATETIME)
END ELSE
BEGIN
SET @Pasqua = CAST(CAST(@Anno AS VARCHAR(4)) + '03' + RIGHT('0' + CAST(@Giorno AS VARCHAR(2)), 2) AS DATETIME)
END
RETURN(0)

 

Per chi, come me, effettua parecchie installazioni e disinstallazioni sul proprio computer, non è raro che si arrivi ad un punto in cui il sistema non funziona più correttamente.
Mi è capitato parecchie volte di ricevere un messaggio che più o meno diceva "Una precedente installazione ha lasciato operazioni su file in sospeso. Riavviare il computer prima di effetuare l'installazione".
Inutile dire che - anche riavviando il pc - il messaggio si ripresenta uguale!
Il problema (come accade spesso) è un problema di registry: una chiave che serve per rinominare o rimuovere i file in uso è rimasta sporca. Si tratta della chiave
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperation.
Per aggirare il problema è sufficente eliminare o rinominare questa chiave.

Lorenzo
Filed under: