Newsgroup: it.comp.appl.access
Titolo: turno di servizio - elaborazione in access

Ciao a tutti.
riprendo un vecchio post in cui l'ottimo Carlo Costarella risponde a una
richiesta di Orkey, se non  sbaglio, circa la soluzione diciamo così "mdb"
della compilazione automatica di un turno di servizio personale. Purtroppo,
pur avendo applicato alla lettera tutto il codice nel modulo a cui fa
riferimento Carlo, non riesco a far funzionare il tutto. Devo evidentemente
predisporre le due tabelle menzionate nel codice, ma come?
P.S.: per Carlo (che sicuramente non mancherà di aiutarmi) mi puoi fare un
esempio concreto?
Ciao e mille grazie

 ha scritto nel messaggio 
news:42285541$0$32355$5fc...@news.tiscali.it...

Grazie per l'ottimo...
Per risponderti ho bisogno di sapere quale era il post. Ho cercato tra i 
mittenti Orkey ma non ho trovato nulla.
Posso risponderti solo nella giornata di oggi...da domani sarò assente per 
una settimana.
Ciao, Carlo 

 ha scritto nel
messaggio news:5Z_Vd.1003971$35.37...@news4.tin.it...

Ciao Carlo, grazie per aver risposto, era un post del 24 agosto scorso.

 ha scritto nel messaggio
news:42288cbd$0$6296$5fc...@news.tiscali.it...

Scusami ancora Carlo: 24 agosto, il richiedente era Orkney.

 ha scritto nel messaggio 
news:42288dcd$0$32338$5fc...@news.tiscali.it...

Purtroppo non riesco a trovare il post, avrei bisogno del titolo.
Ho trovato, in agosto, un post di Antonio che tratta dell'argomento che ti 
interessa.
Ti posto di seguito due delle risposte che diedi in quella occasione. Nella 
prima c'è anche come sono formate le tabelle.
Sarò assente una settimana...ci risentiamo domenica l'altra.
Ciao, Carlo
Primo post:
Ciao Antonio
questo il codice da incollare in un nuovo modulo:
seguono poi le spiegazioni:
Option Compare Database
Option Explicit
Global ST As String
Global VecchiaStringa As String
Global ia As Integer
Global ii As Integer
Global iB As Integer
Global NG As Integer
Public Sub DimmiNuovaGriglia(VG As String, NGG As Integer)
Dim rcs As Recordset
Set rcs = CurrentDb.OpenRecordset("TurnoBase")
ii = Int(35 / NGG)
iB = 35 Mod NGG
    If iB > 0 Then
    ST = Mid(VecchiaStringa, iB + 1, Len(VecchiaStringa)) &
Mid(VecchiaStringa, 1, iB)
        With rcs
        .Edit
        !Griglia = ST
        .Update
        End With
    End If
End Sub
Public Function AnalizzaGriglia(g As String, pos As Integer, NG) As String
VecchiaStringa = g
ii = Int(35 / NG)
iB = 35 Mod NG
For ia = 1 To ii - 1
g = g + VecchiaStringa
Next ia
If iB > 0 Then
g = g & Mid(VecchiaStringa, 1, iB)
End If
AnalizzaGriglia = Mid$(g, pos, 1)
End Function
Public Sub AccodaTurni()
Dim RCSTurni As Recordset, iOP As Integer, iGR As Integer, K As Integer
Dim NOperat As Integer, Ngiorni As Integer, Griglia As String
Dim ff As Field
DoCmd.SetWarnings False
DoCmd.RunSQL ("Delete * from TTurni;")
DoCmd.SetWarnings True
NOperat = DLookup("NOperatori", "TurnoBase")
Ngiorni = DLookup("NGiorni", "TurnoBase")
Griglia = DLookup("Griglia", "TurnoBase")
ST = Griglia
Set RCSTurni = CurrentDb.OpenRecordset("TTurni")
For iOP = 1 To NOperat 'ciclo in base al numero di operatori
    With RCSTurni
    .AddNew
    !dip = iOP
            K = 1
                For Each ff In RCSTurni.Fields
                    If ff.Name = "Giorno" & K Then
                        ff = AnalizzaGriglia(Griglia, K, Ngiorni)
                        Griglia = DLookup("Griglia", "TurnoBase")
                        K = K + 1
                            If K > 35 Then
                            Exit For
                            End If
                    End If
                Next
    .Update
    End With
Call DimmiNuovaGriglia(Griglia, Ngiorni)
Griglia = DLookup("Griglia", "TurnoBase")
Next iOP
End Sub
Le tabelle prese in considerazione sono due:
TTurni e TurnoBase così realizzate:
TTurni con un campo "Dip" (dipendente) di tipo numerico e 35 campi con nome
Giorno1...Giorno35 di tipo testo
TurnoBase con un campo "NOperatori" numerico, "NGiorni" Numerico, "Griglia"
di tipo Testo.
Per fare le prove lascia vuota la tabella TTurni e nella tabella TurnoBase
scrivi 12 in NOperatori (puoi inserire il numero che vuoi), 6 in NGiorni
(qui il numero deve essere uguale al numero di lettere usate in "Griglia") ,
PMMNRR (senza spazi) in Griglia.
Questi valori verrano presi dalla maschera che ti servirà per le operazioni
ma saranno oggetto di una fase successiva. Per il momento facciamo solo la
prova per vedere se tutto va bene.
Direttamente dal modulo esegui la sub AccodaTurni() e poi leggi la tabella
TTurni.
Tra i riferimenti non dimenticare Microsoft DAO.
Secondo post di risposta:
Ciao ti rimando il codice che ho ricontrollato e funziona perfettamente.
Accertati bene  di aver scritto i campi e che la stringa (PPMMNRR per
esempio) sia senza spazi e il numero delle lettere corrisponda al numero
inserito in NGiorni della tabella TurnoBase. Quest'ultima dovrà contenere
sempre e soltanto un record, una riga.
Option Compare Database
Option Explicit
Global ST As String
Global VecchiaStringa As String
Global ia As Integer
Global ii As Integer
Global iB As Integer
Global NG As Integer
Public Sub DimmiNuovaGriglia(VG As String, NGG As Integer)
Dim rcs As Recordset
Set rcs = CurrentDb.OpenRecordset("TurnoBase")
ii = Int(35 / NGG)
iB = 35 Mod NGG
    If iB > 0 Then
    ST = Mid(VecchiaStringa, iB + 1, Len(VecchiaStringa)) &
Mid(VecchiaStringa, 1, iB)
        With rcs
        .Edit
        !Griglia = ST
        .Update
        End With
    End If
End Sub
Public Function AnalizzaGriglia(g As String, pos As Integer, NG) As String
VecchiaStringa = g
ii = Int(35 / NG)
iB = 35 Mod NG
For ia = 1 To ii - 1
g = g + VecchiaStringa
Next ia
If iB > 0 Then
g = g & Mid(VecchiaStringa, 1, iB)
End If
AnalizzaGriglia = Mid$(g, pos, 1)
End Function
Public Sub AccodaTurni()
Dim RCSTurni As Recordset, iOP As Integer, iGR As Integer, K As Integer
Dim NOperat As Integer, Ngiorni As Integer, Griglia As String
Dim ff As Field
DoCmd.SetWarnings False
DoCmd.RunSQL ("Delete * from TTurni;")
DoCmd.SetWarnings True
NOperat = DLookup("NOperatori", "TurnoBase")
Ngiorni = DLookup("NGiorni", "TurnoBase")
Griglia = DLookup("Griglia", "TurnoBase")
ST = Griglia
Set RCSTurni = CurrentDb.OpenRecordset("TTurni")
For iOP = 1 To NOperat 'ciclo in base al numero di operatori
    With RCSTurni
    .AddNew
    !dip = iOP
            K = 1
                For Each ff In RCSTurni.Fields
                    If ff.Name = "Giorno" & K Then
                        ff = AnalizzaGriglia(Griglia, K, Ngiorni)
                        Griglia = DLookup("Griglia", "TurnoBase")
                        K = K + 1
                            If K > 35 Then
                            Exit For
                            End If
                    End If
                Next
    .Update
    End With
Call DimmiNuovaGriglia(Griglia, Ngiorni)
Griglia = DLookup("Griglia", "TurnoBase")
Next iOP
End Sub 

 ha scritto nel
messaggio news:Wa2Wd.1006053$35.37...@news4.tin.it...

Carissimo Carlo Ti ringrazio!
mi metto subito al lavoro.
Buon WeekEnd e grazie ancora!

 ha scritto nel messaggio
news:4228b45d$0$6296$5fc...@news.tiscali.it...

Carlo scusami, se ci sei ancora puoi aiutarmi?
Mi da' errore alla riga Set RCSTurni = CurrentDb.OpenRecordset("TTurni"), si
evidenzia di giallo...
(errore di runtime 13, tipo non corrispondente)
Le tabelle sono a posto...


Riferimenti a DAO mancanti?
Se non usi ADO, toglilo dai riferimenti e inserisci DAO:
Microsoft DAO 3.5x Object Library
Ciao, Carlo 

 ha scritto nel
messaggio news:NacWd.620091$b5.28...@news3.tin.it...

Grazie ancora Carlo, l'avevo fatto ma non nella giusta priorità, ora porto
il riferimento piu' in alto nelle priorità dei riferimenti.
Ciao e grazie.