Newsgroup: it.comp.appl.access
Titolo: AIUTO Orario lavorativo

 
          Ciao a tutti,
ho letto queste discussioni:
 "Query di raggruppamento Orari" e "Query di raggruppamento Orari2"
come mi avete segnalato purtroppo non ho molta dimestichezza con le select
per cui non sono riuscito a venirne a capo! Vi rispiego il mio problema
sperando che qualche buon anima possa aiutarmi a fare una query o select su
misura! ;o)
ho una tabella degli orari lavorativi dei dipendenti così strutturata
(dbo_TIMBR_RTP):
DATA CODDIP ORA VERSO
01/02/05 1 8.00 E
01/02/05 1 13.00 U
01/02/05 1 15.00 E
01/02/05 1 17.00 U
01/02/05 2 22.00 E
02/02/05 2 6.00 U
Adesso mi serve fare delle query strutturata in quest'altro modo:
DATA CODDIP ENTRATA USCITA ORE
01/02/05 1 8.00 14.00 6
01/02/05 1 15.00 17.00 2
01/02/05 2 22.00
02/02/05 2 6.00
Vi sarei eternamente grato se qualcuno potesse darmi una mano!
Grazie infinite
Francesco
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 Vi sarei eternamente grato se qualcuno potesse darmi una mano!
checco,
dai, è lo stesso identico problema, anzi, il tuo è leggermente più semplice
perchè hai la parte ora staccata dalla parte data.
Facciamo così, se da qui a tre ore non ce la fai ti posto la query con i
tuoi nomi di campi e tabelle, però intanto provaci.
:-)
Ciao Giorgio

 ha scritto:

Ciao Giorgio,
sei gentilissimo e simpaticissimo! ;o)
Ho provato con una query ma riesco solo a tirar fuori il minimo o il
massimo, ho provato anche inserendo nei criteri la funzione Dmin ma mi si
paralizza tutto! Tra l'altro c'è il problema che sto controllando una
tabella via odbc, per intenderci il programma nel quale ci sono queste info
è l'inaz...
Comunque ho pure provato a cambiare i nomi di campo utilizzando la select da
te suggerta me mi da un errore! :o(
Il fatto è che con le query me la cavicchio ma con le select per niente!
Grazie infinite in anticipo! ;o)


 Grazie infinite in anticipo! ;o)
Ciao checco,
hai visto il lavoro che hanno fatto i componenti del Sito Comune ?
in particolare Roberto che gentilmente ha creato un database e commentato i
vari passaggi per ottenere la query che serve a te.
-------------
www.sitocomune.com
sezione Query
Query 2.28 (la prima della lista)
-------------
scarica il database e comincia a studiarla, verso sera appena mi libero un
po' la adatto alla tua tabella.
Ciao Giorgio

                    Il 28 Feb 2005, 15:41, "giorgio rancati"

Grazie mille!
Ci vado subito!
Ciao


 > >
[CUT]
Ciao Francesco,
ce l'hai fatta ?
penso di sě, dovrebbe esserti venuto qualcosa del genere.
-----------------
SELECT DATA,
       CODDIP,
       TimeValue(Ingr) AS Ingresso,
       TimeValue(Usc) AS Uscita,
       TimeValue(Cdate(Usc-Ingr)) AS ORE
FROM [SELECT DATA,
             CODDIP,
             Data+ORA AS Ingr,
            (SELECT TOP 1
                    Data+ORA
             FROM dbo_TIMBR_RTP T2
             WHERE T2.Data+T2.ORA>T1.Data+T1.ORA
               AND T2.CODDIP=T1.CODDIP
               AND T2.VERSO='U'
             ORDER BY T2.DATA+T2.ORA) AS Usc
      FROM dbo_TIMBR_RTP AS T1
      WHERE VERSO='E']. AS Tx
------------------
Ciao Giorgio

                    Il 28 Feb 2005, 17:48, "giorgio rancati"

Ciao Giorgio,
allora grazie mille per avermi risposto, io avevo provato con la prima
soluzione, l'aggregazione sui domini, e comunque la colonna delle uscite mi
dava errore, ora ho provato con la tua select ma ho purtroppo 2 problemi:
1. Mi sono dimenticato di dirti che il campo ORA e in formato numerico e
praticamente le timbrature sarebbero in minuti a partire da mezzanotte, in
un'altra query avevo risolto con questa funzione
DateAdd("n";[Orario];"12/30/1899"), dove dovrei inserirla adesso?
2. Lanciando la select cosě com'č l'access ('97 SP1b) va in panne e si
blocca sistematicamente.
Come posso fare?


 Come posso fare?
Comincia a provare se con quest'ultima query Acc 97 non si blocca, se
dovesse persistere il bloccaggio prova ad aggiornarlo agli ultimi Service
Pack.
Ciao Giorgio

 > > > > > > news:85Z35Z235Z91Y1...@usenet.libero.it...
Per aiutare il motore del database prova a fare cosě:
Salva in una query di nome Q_Timbr_Parziale questo codice
-----------------
SELECT DATA,
       CODDIP,
       DateAdd("n",ORA,Data) AS Ingr,
       (SELECT TOP 1
               DateAdd("n",ORA,Data)
        FROM dbo_TIMBR_RTP T2
        WHERE DateAdd("n",T2.ORA,T2.Data)>DateAdd("n",T1.ORA,T1.Data)
          AND T2.CODDIP=T1.CODDIP
          AND T2.VERSO='U'
        ORDER BY DateAdd("n",T2.ORA,T2.Data)) AS Usc
FROM dbo_TIMBR_RTP AS T1
WHERE VERSO='E'
-------------------
per poi usarla nella query finale
-------------------
SELECT DATA,
       CODDIP,
       TimeValue(Ingr) AS Ingresso,
       TimeValue(Usc) AS Uscita,
       TimeValue(Cdate(Usc-Ingr)) AS ORE
FROM Q_TIMBR_Parziale
-------------------
Ciao Giorgio

 Per aiutare il motore del database prova a fare così:

Ciao Giorgio,
allora ho provato seguendo le tue istruzioni, sia "Q_TIMBR_Parziale" che la
query finale si bloccano inevitabilmente ogni volta che le lancio. Access ha
già l'ultimo Service Pack, MDAC e Data Engine! Non ho fatto altro che
cambiare il campo ORA in ORARIO in quanto nella tabella originaria si chiama
così!


 ha scritto:

La causa del blocco starebbe qui:
(SELECT TOP 1
           DateAdd("n",ORA,Data)
           FROM dbo_TIMBR_RTP T2
           WHERE DateAdd("n",T2.ORA,T2.Data)>DateAdd("n",T1.ORA,T1.Data)
           AND T2.CODDIP=T1.CODDIP
           AND T2.VERSO='U'
          ORDER BY DateAdd("n",T2.ORA,T2.Data)) AS Usc
Quando elimino questo campo la query funziona perň ovviamente non ho piů le
uscite!


Anche con Access XP aggiornato all'ultimo pelo si blocca tutto!
Come posso risolvere?


 Francesco
Ciao Francesco,
Anche io uso AccessXp, è evidente che c'è un problema con il driver ODBC che
si collega al Database Server Dell'Inaz.
i casi sono 2:
1) eseguire una query PASS-THROUGH ma bisogna conoscere il che tipo di
Database Server usi e il suo dialetto
2) Importare in locale la tabella dbo_TIMBR_RTP
---------------
SELECT *
INTO TIMBR_RTP
FROM dbo_TIMBR_RTP
-----------------
e poi usare la query sulla tabella importata TIMBR_RTP
Ciao Giorgio

 Ciao Giorgio
Grazie infinite per tutto!


 fare più niente vero?
no non è vero :-)
con Sql Server gioco in casa.
Crea una nuova Query, chiudi la lista delle tabelle, da menu Query seleziona
Sql Specifico-->Pass-Through
incolla nella finestra bianca questo codice Sql
------------------------
SELECT DATA,
       CODDIP,
       CONVERT(Char(5),Ingr,114) AS Ingresso,
       CONVERT(Char(5),Usc,114) AS Uscita,
       CONVERT(Char(5),Usc-Ingr,114) AS ORE
FROM (SELECT DATA,
             CODDIP,
             DateAdd(n,ORA,Data) AS Ingr,
            (SELECT TOP 1
                    DateAdd(n,ORA,Data)
             FROM dbo.TIMBR_RTP T2
             WHERE DateAdd(n,T2.ORA,T2.Data)>DateAdd(n,T1.ORA,T1.Data)
               AND T2.CODDIP=T1.CODDIP
               AND T2.VERSO='U'
             ORDER BY DateAdd(n,T2.ORA,T2.Data)) AS Usc
      FROM dbo.TIMBR_RTP AS T1
      WHERE VERSO='E') AS Tx
ORDER BY DATA,CODDIP,Ingresso
-----------------------------
(come vedi cambia poco)
poi premi Visualizza-->Proprietà
Nella riga *Stringa Conness ODBC* inserisci (è una riga unica)
-------------
ODBC;Driver={SQL
Server};SERVER=TuoServer;DATABASE=TuoDatabase;Trusted_Connection=yes
-------------
dove c'è TuoServer metti il nome del server Sql
dove c'è TuoDataBase metti il nome del database
*Trusted_Connection=yes* indica che usi la protezione integrata di windows
se accedi con user e password usa questa stringa di connessione
(è una riga unica)
-------------
ODBC;Driver={SQL
Server};SERVER=TuoServer;DATABASE=TuoDatabase;Uid=NumeUser;Pwd=TuaPassword;
-------------
Ciao Giorgio

 > > news:85Z35Z235Z91Y...@usenet.libero.it...
attenzione al primo pezzo della stringa di connessione, tra SQL e Server c'è
uno spazio.
----------
ODBC;Driver={SQL Server}; ecc ecc
----------
Ciao Giorgio

                    Il 01 Mar 2005, 14:17, "giorgio rancati"

MA DAIIIIIII! Ma sei un mito!!!!!!!!!!!11

Allora non riesco a connettermi al database!
1. Ho provato inserendo la tua stringa di connessione:
ODBC;Driver={SQLServer};SERVER=VS3;DATABASE=PRESENZE;Uid=SA;Pwd=;
Preticamente dovrebbe essere questa dove il server è VS3 (nome netbios) il
database sql è PRESENZE... Ma così mi dice che non è possibile raggiungere
il server.
2. Se invece di scrivere io la stringa uso il wizard, mi prendo la
connessione ODBC che ho tra i DSN di sistema anche qui mi da un errore di
timeout (impostato a 60 secondi)!
Com'è possibile? Cosa posso fare?
Ciao Francesco


 ha scritto:

Cavolo infatti il primo errore è proprio dovuto al fatto che ho tolto lo
spazio, ora l'ho scritto nuovamente in maniera corretta ma mi da sempre
errore di timeout!
ciao Francesco


 Ciao Francesco
urka! , quanti dati ci sono in quella tabella ?
Comunque puoi aumentare il tempo di timeout, lo trovi nelle proprietà della
Query alla riga *TimeOut ODBC*
Ciao Giorgio

 > > > news:85Z35Z235Z91Y...@usenet.libero.it...
ghhhhhhhh !!!!
------------
ODBC;Driver={SQL Server};SERVER=VS3;DATABASE=PRESENZE;Uid=SA;Pwd=;
------------
non mi dirai che Inaz paghe esegue installazioni senza proteggere Account di
accesso System Administrator (sa) ???
Giorgio

                    Il 01 Mar 2005, 15:09, "giorgio rancati"

600 dipendenti che timbrano dal 2001! Un casino!
Possiamo provare ad inserire un between sulla data della presenza in modo da
filtrare un pò i records?



 
Praticamente...
Mi continua a dare timeout anche con 480 secondi....



assolutamente si, comincio a capire il crash di Access.
Speriamo che il campo data è un indice della tabella.
-------------------
SELECT DATA,
       CODDIP,
       CONVERT(Char(5),Ingr,114) AS Ingresso,
       CONVERT(Char(5),Usc,114) AS Uscita,
       CONVERT(Char(5),Usc-Ingr,114) AS ORE
FROM (SELECT DATA,
             CODDIP,
             DateAdd(n,ORA,Data) AS Ingr,
            (SELECT TOP 1
                    DateAdd(n,ORA,Data)
             FROM dbo.TIMBR_RTP T2
             WHERE DateAdd(n,T2.ORA,T2.Data)>DateAdd(n,T1.ORA,T1.Data)
               AND T2.CODDIP=T1.CODDIP
               AND T2.VERSO='U'
             ORDER BY DateAdd(n,T2.ORA,T2.Data)) AS Usc
      FROM dbo.TIMBR_RTP AS T1
      WHERE VERSO='E'
        AND DATA BETWEEN '20050101' AND '20051231') AS Tx
ORDER BY DATA,CODDIP,Ingresso
---------------------
(Purtroppo non si può passarla a Runtime)
600*4*242=580.800 righe da analizzare (a fine anno) e 290.400 righe rese,
dovrebbe farcela.
in questo modo sei a posto per tutto il 2005, poi l'anno prossimo la cambi.
Ciao Giorgio

                    Il 01 Mar 2005, 15:28, "giorgio rancati"

SIIIIIIIIIIIIII! Così va molto meglio! Con l'intervallo di un giorno è un
fulmine, ma considerando un anno già scazza... Se devo fare questo lavoro
per periodi lunghi credo sia necessario importarsi i dati in una tabella...
Tu che consiglio mi dai?


 Tu che consiglio mi dai?
non credo che importare tutta la tabella e fare la query in locale sia più
veloce.
Ora non so che uso fai del Db in Access ma se è solo per generare questo
report e se hai AccessXp portesti collegarti a Sql Server con un progetto
ADP quindi creare una Stored procedure (con la query che ti ho suggerito)
che abbia come parametri in ingresso le date desiderate, quindi usare la SP
appena cerata per generare i tuoi report.
non credo che andrai a produrre un report con i dati di tutto l'anno, cosa
te ne fai ?
Avrebbe senso mese per mese.
Ciao Giorgio

 Ciao Giorgio
Sei stato davvero gentilissimo!
Grazie infinite


 Grazie infinite
Prego :-)
Ciao Giorgio


ho fatto dei test con 5 milioni di record e ho ottenuto ottime prestazioni
aggiungendo una funzione,
se la tua versione di Sql Server è la 2000 e se vuoi fare una prova ...
Crea una nuova Query Pass-Through e inserisci questo codice
---------------------
CREATE FUNCTION ufn_TIMBR_USCITE
(@CODDIP int,@Data datetime,@Ora int)
RETURNS DATETIME
AS BEGIN
RETURN (SELECT TOP 1
               DateAdd(n,ORA,Data)
        FROM   dbo.TIMBR_RTP
        WHERE  VERSO='U'
          AND CODDIP=@CODDIP
          AND  DATA>=@Data
          AND  ORA>@ORA
        ORDER BY DATA,ORA)
END
----------------------
inserisci la stringa di connessione ed eseguila, ti verrà notificato che la
query non ritorna nessun recordset, va bene così.
Salva la query con un nome che vuoi (non ci servirà piu)
Crea un'altra query Pass-Through e inserisci questo codice
-----------------------
CREATE PROCEDURE usp_TIMBR_Report
@DaData datetime,
@aData datetime
as
SELECT DATA,
       CODDIP,
       CONVERT(Char(5),Ingr,114) AS Ingresso,
       CONVERT(Char(5),Usc,114) AS Uscita,
       CONVERT(Char(5),Usc-Ingr,114) AS ORE
FROM (SELECT DATA,
             CODDIP,
             DateAdd(n,ORA,Data) AS Ingr,
             dbo.ufn_TIMBR_USCITE(CODDIP,DATA,ORA) AS Usc
      FROM dbo.TIMBR_RTP AS T1
      WHERE VERSO='E'
        AND DATA BETWEEN @DaData AND @aData
      ) AS Tx
ORDER BY DATA,CODDIP,Ingresso
--------------------------
inserisci la stringa di connessione ed eseguila, ti verrà notificato che la
query non ritorna nessun recordset, va bene così.
Salva la query con un nome che vuoi (non ci servirà piu)
Adesso crea una nuova Query Pass-Throuh e inserisci questo codice
--------------------------
EXEC usp_TIMBR_Report '20050101','20050131'
--------------------------
inserisci la stringa di connessione e imposta un timeout di 600 secondi
(bastano e avanzano)
Questa è la query finale che ritorna il risultato, messa così ti verrà molto
semplice modificare le date
ho provato a interrogare un anno intero dove i 600 dipendenti lavorano 365
giorni su 365 (poveretti), mi ritorna 438.000 record in 4 minuti e 40
secondi.
Da te dovrebbe essere molto più veloce.
Ciao Giorgio

 Ciao Giorgio
Alla grandissima! Attendo ansioso tue notizie! ;o)
Ciao Francesco



Ciao Francesco,
lo script funziona bene, o c'č un errore di copia incolla ma non credo
perchč ho riprovato a creare la funzione prelevando il testo dall'Ng, o la
tua versione di Sql Server non č la 2000 ma č la 7.0 e in questo caso non
supporta le funzioni quindi niente da fare :(
Prova sempre per mezzo di una Query Pass-through ad eseguire il comando
--------
SELECT @@Version
--------
cosě vediamo che versione utilizzi.
Ciao Giorgio

 Ciao Giorgio


 Francesco
Prego :-)
Ciao Giorgio