Newsgroup: it.comp.appl.access
Titolo: [MSDE] Ciclare risultato SP (lunghetto)

La domanda nasce da un problema specifico ma riguarda più le tecniche di
programmazione di/con SQL SERVER. Ovvero quali elaborazioni far fare al
server e quali ai client.
Esposizione 
Ho questa situazione:
Tabella Movimenti 
(IdBadge smallint,
OraInOut smalldatetime,
InOut bit)
In questa tabella vengono archiviate le timbrature dei dipendenti che
hanno un valore di INOUT pari a 0 per le uscite e 1 per le entrate.
Normalmente la persona marca all'ingresso (1) e all'uscita (0).
Dovrei quindi avere:
IdBadge    OraInOut              InOUt
--------------------------------------
0001       20050418 07.30.00       1
0001       20050418 13.30.00       0
Può capitare che una persona timbri con lo stesso "verso" e questa è una
cosa che dovrei controllare. Quindi
IdBadge    OraInOut              InOUt
--------------------------------------
0001       20050418 07.30.00       1
0001       20050418 13.30.00       1
oppure 
0001       20050418 07.30.00       0
0001       20050418 13.30.00       0
Io pensavo di procedere così:
1= estrarre tutte le timbrature ordinate per dataora desc fino a ieri (il
giorno prima del lancio della sp) per ogni idBadge;
ciclare il risultato della sp in base a quello che mi serve, cioè
conservare il record, confrontarlo col successivo e se hanno lo stesso
valore di InOut scriverlo in una tabella Errori
Leggendo vari post mi sembra che questo si possa fare in una sp mediante i
cursori che però sono sconsigliati perché poco performanti. L'alternativa
è vba o c'è un modo?
Grazie
MarcoMac
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Ho questa situazione:
[CUT]
Ciao Marco,
un dipendente entra ed esce sempre nello stesso giorno o ci sono turni che
comprendono due date, ad es dalla 22.00 alle 06.00 ?
Ciao giorgio

 Ciao giorgio
Ciao Giorgio,
no, fortunatamente non devo gestire i turni di notte...
già è un casino così...


 già è un casino così...
Ciao Marco,
dato che aderisco all'idea che al 98% c'è sempre una soluzione senza
ricorrere ai cursori, ti propongo una query.
Si potrebbe fare con una query che controlla per lo stesso dipendente e
stesso giorno che il numero degli ingressi sia uguale al numero delle
uscite.
Però non basta, se il dipendente timbra prima l'uscita e poi l'ingresso
bisonga controllare che il movimento successivo all'ingresso sia un'uscita.
prova con questa query che rende il numero del badge e la data in cui c'è
stata un'anomalia
-----------------
SELECT DISTINCT
       IdBadge,
       Convert(datetime,Convert(varchar,OraInOut,112)) AS Data
FROM   Movimenti M1
WHERE  0<>(SELECT SUM(CASE WHEN InOut=1 THEN 1 ELSE 0 END)-
                  SUM(CASE WHEN InOut=0 THEN 1 ELSE 0 END) AS Differenza
           FROM   Movimenti M2
           WHERE  M1.IdBadge=M2.IdBadge
             AND  CONVERT(varchar,M1.OraInOut,112)=
                  CONVERT(varchar,M2.OraInOut,112)
           )
  --Controllo sequenza degli ingressi/uscite
  OR  (InOut=1 AND
       0 <> IsNull((SELECT TOP 1 M3.InOut
                   FROM   Movimenti M3
                   WHERE  M1.IdBadge=M3.Idbadge
                     AND  CONVERT(varchar,M1.OraInOut,112)=
                          CONVERT(varchar,M3.OraInOut,112)
                     AND  M1.OraInOut<M3.OraInOut
                    ORDER BY OraInOut
                   ),1)
       )
-----------------------
Ciao Giorgio


Se vuoi fare una sp a cui passare l'intervallo di date da controllare ......
---------------
CREATE PROCEDURE usp_CheckBadge
@DaData datetime,
@AData datetime
AS
SET @Adata=@Adata+'23:59:00'
SELECT DISTINCT
       IdBadge,
       Convert(datetime,Convert(varchar,OraInOut,112)) AS Data
FROM   Movimenti M1
WHERE  (0<>(SELECT SUM(CASE WHEN InOut=1 THEN 1 ELSE 0 END)-
                  SUM(CASE WHEN InOut=0 THEN 1 ELSE 0 END) AS Differenza
           FROM   Movimenti M2
           WHERE  M1.IdBadge=M2.IdBadge
             AND  CONVERT(varchar,M1.OraInOut,112)=
                  CONVERT(varchar,M2.OraInOut,112)
           )
  --Controllo sequenza degli ingressi/uscite
  OR  (InOut=1 AND
       0 <> IsNull((SELECT TOP 1 M3.InOut
                   FROM   Movimenti M3
                   WHERE  M1.IdBadge=M3.Idbadge
                     AND  CONVERT(varchar,M1.OraInOut,112)=
                          CONVERT(varchar,M3.OraInOut,112)
                     AND  M1.OraInOut<M3.OraInOut
                    ORDER BY OraInOut
                   ),1)
       ))
   AND CONVERT(varchar,OraInout,112) BETWEEN @Dadata AND @Adata
----------
Ciao Giorgio

 ha scritto nel
messaggio news:426506cb$0$24442$5fc...@news.tiscali.it...
ops..
visto che sommo le 23:59 ad @Adata la conversione nell'ultima riga non
serve, cambiala cosě
---------
   AND OraInout BETWEEN @Dadata AND @Adata
--------
Giorgio