Newsgroup: it.comp.appl.access
Titolo: [Help] Costruzione tabella con VBA

Scusandomi preventivamente per la lunghezza del post e per la mia enorme 
ignoranza in materia, vorrei chiedervi un aiuto per risolvere il 
seguente problema:
Utilizzando Access, devo costruire una tabella contenente un turno di 
servizio per i reparti dell’azienda presso cui lavoro; la tabella è 
formata da 36 colonne; la prima colonna contiene il nome dell’operatore; 
le altre 35 contengono il turno di servizio che ciascun operatore svolge 
ogni giorno, ad esempio: P (pomeriggio), M (mattina), N (notte), 
R(riposo) etc.;
quindi il turno di servizio ha una durata di 5 settimane (7giorni x 5); 
la durata di 35 giorni è un vincolo stabilito dall’azienda.
Il numero di operatori, corrispondente al numero di righe della tabella, 
è invece variabile da reparto a reparto.
Ho creato un form per inserire e visualizzare i parametri necessari per 
la costruzione del turno:
-	n. di operatori (es. 12)
-	n. di giorni di durata del “turno base” – ad esempio 6 (per turno base 
intendo l’unità fondamentale di cui è costituito il turno di servizio; 
il turno base, ripetuto per N volte, dà origine all’intero turno di 
servizio; ad esempio un turno base può essere P M M N R R, di durata 
pari a 6 giorni, oppure P P M M N R R R, di durata pari a 8 giorni etc.)
-	un numero variabile di textbox contenenti il turno base. ( es. P M M N 
R R)
Con questi dati il programma dovrebbe costruire la tabella contenente il 
turno di servizio. Con le scarsissime conoscenze in mio possesso, sono 
riuscito a creare la tabella, ma non a riempirla di dati; in realtà ho 
costruito manualmente la tabella, lasciando solo il primo record; con un 
ciclo do…loop faccio poi aggiungere il numero di righe che voglio, 
arrestando il ciclo quando il numero di righe inserite è pari al numero 
di operatori riportato nel form di cui sopra. Basta. Soltanto questo.
Ora il grosso problema che devo affrontare è questo:
facendo riferimento all’esempio di cui sopra, il mio “turno base” è 
composto da 6 giorni\campi; il programma dovrebbe fare queste operazioni:
-	prendere il primo valore (P) ed incollarlo nella colonna 2 (perché la 
prima è riservata al nome dell’operatore) della tabella turno;
-	poi prendere il secondo valore (M) ed incollarlo nella colonna 3 e 
così via fino al sesto valore ( R ) che va incollato nella colonna 7;
-	quindi il ciclo ricomincia: riprendere il primo valore (P) ed 
incollarlo nella colonna 8, riprendere il secondo valore (M) ed 
incollarlo nella colonna 9 e così via fino alla colonna 36;
-	a questo punto l’inserimento dei dati passa al secondo record, 
incollando nella colonna 2 il valore 6, nella colonna 3 il valore 1, 
nella colonna 4 il valore2, etc. etc. fino alla colonna 36; quindi di 
nuovo al record successivo, incollando il valore 5 nella colonna 2 etc. etc.
L’inserimento si arresta una volta completata l’ultima riga.
Purtroppo non sono in grado di scrivere codice visual basic, a malapena 
sono riuscito a scrivere il ciclo do…loop di cui sopra, copiando da 
esempi trovati da qualche parte. Vi prego di aiutarmi a risolvere questo 
problema, perché purtroppo in ambito lavorativo non ho il supporto 
necessario per poterlo risolvere. Mi scuso ancora per la lunghezza del 
post, per la poca chiarezza e per il linguaggio poco tecnico, e vi 
ringrazio per l’attenzione.
Antonio
P.S. se necessario, per una migliore comprensione di quello che deve 
essere il risultato finale di questa elaborazione, posso inviare in 
privato il file di access con un esempio di tabella turni costruita 
“manualmente”.

Scusatemi per l'insistenza, ma avrei bisogno urgente di un aiuto per 
risolvere il problema nel post precedente. Se ho esposto male il 
mioproblema vi pregherei di farmelo sapere; proverň a rifarlo in maniera 
piů chiara.
Grazie
Antonio

 ha scritto nel messaggio
news:KYFWc.140971$OR2.6...@news3.tin.it...

In pratica ti serve un programma che estrapoli una griglia di turni "giusta"
ed "equilibrata" per il numero di dipendenti che vorrai indicare e
distribuita su 35 giorni (domeniche comprese).
E' così? Tutti i dipendenti, alla fine, faranno lo stesso numero e lo stesso
tipo di turno di tutti gli altri. Semplicemente l'olgoritmo dovrebbe far
ruotare il "turno base" tra tutti il numero indicato di "dipendenti".
Ho capito bene?
Ciao, Carlo


Sě, hai centrato il problema, ma io mi acconterei molto di meno...se il
programma riuscisse almeno a riempirmi la griglia con i turni,"spalmando" su
di essa il turno base che io gli indico, poi con una maschera contenente dei
controlli calcolati sono in grado di visualizzare per esempio il n. di turni
M, P e N presenti ogni giorno e di effettuare anche manualmente le eventuali
modifiche che si rendono necessarie.
Puoi aiutarmi?
Non so che pesci pigliare e ti ringrazio davvero per aver preso in
considerazione il mio post.
Ciao , Antonio
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/


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.
Fammi sapere.
Ciao, Carlo

 
Grazie Carlo, credo di aver seguito alla lettera le tue istruzioni; 
all'esecuzione della sub AccodaTurni() ottengo però il seguente 
messaggio: "Errore di compilazione: Errore di sintassi"; il debug mi 
evidenzia in giallo la riga
	Public Sub DimmiNuovaGriglia(VG As String, NGG As Integer)
e mi dà in rosso la riga
  	ST = Mid(VecchiaStringa, iB + 1, Len(VecchiaStringa)) &
	Mid(VecchiaStringa, 1, iB)
Se vado a controllare la TTurni, trovo che sono stati inseriti i record 
solo nei primi 6 campi.
Mi rimetto ancora nelle tue mani!
Ciao
Antonio

 ha scritto nel messaggio
news:WH3Xc.147625$OR2.7...@news3.tin.it...

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)

    End If
End Sub





End Function
Public Sub AccodaTurni()






    .Update
    End With

End Sub
Ciao, Carlo

Cut
Dimenticavo: posso anche mandarti il db zippato in versione Access XP/2003
Ciao, Carlo

 Ciao ti rimando il codice che ho ricontrollato e funziona perfettamente.
Sì, Carlo, funziona perfettamente! Mi hai risolto un problema che mi 
attanagliava da mesi!
Spero di non abusare della tua disponibilità, ti chiedo soltanto la 
cortesia di darmi ancora un paio di dritte sul programmino che hai 
sviluppato, poi cercherò di farcela da solo.
In ordine di importanza:
1. Se la "griglia", invece di contenere codici formati da una sola 	 
lettera (come P per pomeriggio, M per mattina etc.), contenesse anche 
codici di due lettere che io utilizzo per rappresentare particolari 
turni di servizio? Ad esempio P P M1 R R P CS FF R R etc. etc.
2. Il programma può ruotare i dipendenti sulle singole posizioni, in 
modo tale che quando vado ad elaborare i 35 gg successivi, il dipendente 
che era alla prima posizione passa alla seconda, il secondo alla terza e 
così via, fino all'ultimo dipendente che passa alla prima posizione?
Non importa se non puoi rispondere a questi 2 quesiti, non sono di 
"vitale" importanza, ormai mi hai risolto quello che per me era *il 
grande problema*.
Grazie ancora,
Antonio

 ha scritto nel messaggio
news:wG5Xc.189423$5D1.8...@news4.tin.it...

Ciao Antonio
certo tutto si può fare ma già siamo andati al di la delle finalità di
questo NG.
Ti consiglio di leggerti bene l'algoritmo che ti ho inviato e vedrai che
riuscirai a cavartela da solo. Una cosa posso dirtela, se usi più lettere
per specificare un turno, sarà meglio pensare a delle virgole tra le lettere
o usare un numero al posto della seconda lettera. In ogni caso il codice
andrà modificato.
Per quanto riguarda la rotazione è ancora più semplice visto che hai già il
turno completo anche se di un altro dipendente. Si tratta solo di assegnare
al dipendente due il turno del primo e così via.
Ciao, Carlo


Ok Carlo, proverò a fare come mi dici.
Grazie ancora
Ciao
Antonio


ciao Carlo potresti inviarlo cortesemente anche a me?
un grazie anticipato.
ciroteo(chiocciola)
libero.it

 ha scritto nel messaggio
news:cgn9d6$ejg$1...@hulme.interac.it...

grazie Carlo!  Ricevuto il tuo file.
In realtà io dovrei però gestire i turni per cosi dire a scalare ...
vedo di spiegarmi:
1 dip    MMPNNR
2 dip    MPNNRM
3 dip    PNNRMM
4 dip    NNRMMP
5 dip    NRMMPN
e cosi continua il ciclo
so che non è facile, al momento gestiamo con excel, ma in realtà sarebbe
molto più utile con un db.

 ha scritto nel messaggio
news:cgnflp$epk$1...@hulme.interac.it...

La domanda da farsi è: quanti dipendenti voglio far ruotare?
La griglia, se ho ben capito, non cambia o se cambia cambia per tutti.
OK?
Supponiamo di avere 5 dipendenti,
la NuovaGriglia diventa Griglia + Griglia tante volte quanti i dipendenti,
così:
MMPNNRMMPNNRMMPNNRMMPNNRMMPNNR
(ti raccomando che sia senza spazi)
il primo dipendente avrà la prima griglia: MMPNNR
cioè: mid(griglia,NDip,6)
il secondo: mid(griglia,NDip,6)
etc.
cioè sempre la stessa stringa di codice: mid(griglia,NDip,6)
con NDip intendo il numero del dipendente (1, 2, 3 etc.)
Questo algoritmo ha la sua forza e la sua debolezza nel numero di lettere
che indicano il turno. Una indicazione di turno con due lettere fa saltare
il codice.
In questo caso (e vale anche per il problema citato da orkeney) conviene
fare una tabella con almeno due campi: nel primo campo indico il turno con
una lettera (tutte diverse), nel secondo indico il turno con due o più
lettere. Così M starà per mattina nei due campi e PN (pomeriggio e notte) si
scriverà X nel primo campo e PN nel secondo.
Ovviamente è solo un esempio.
L'algoritmo funzionerà sempre e andrà solo "tradotto", "traslato" nel report
o nella maschera dei turni.
Fammi sapere.
Ciao, Carlo


Se inve vuoi far gestire all'aperatore la
turnazione dandogli però tutti gli elementi per
decidere credo di poterti inviare
un mio vecchio db, se ti interessa
MAssimiliano

 ha scritto nel messaggio
news:7KIXc.12779$B06....@news.edisontel.com...

Grazie ad entrambi. MA se me lo mandi mi fai una cortesia, ci vorrà tempo,
perchè in realtà la collega che gestisce i turni, (nello specifico si tratta
di una casa di riposo per anziani) si trova bene con in tabulato fatto in
ecxel.
Con  il suo bel copia e incolla, ritiene di andare alla grande salvo non
saper mai come fare x sistemare le eventuali sostituzioni e variazioni. sob!
Ciononostante non appena avrò tempo mi ci metto e vedo di progettare
qualcosina di più performante grazie ai vs. suggerimenti.
MA la mail la conosci ...
( una mia "fidanzatina" in questo momento si trova nella tua zona ... che
faccio devo temere???)


Non temere... dallo per certo.
MAssimiliano