Newsgroup: it.comp.appl.access
Titolo: Alternativa a tanti DLookUp per evitare di rallentare l'applicativo

Access 2003 / 2010
 
Buongiorno a voi tutti.
Vi chiedo se conoscete un metodo altrernativo all'utilizzo di tanti DLookUp 
utilizzato per leggere in tabella se nelle caselle di controllo interessate 
vi è il segno di spunta o meno, precisamente....
in una form basata su query a campi incrociati contenente da 1 a 31 campi 
(gg del mese) su formato calendariale mensile ove vengono visualizzati i 
servizi di un dato mese. In altre 31 caselle di testo, in ognuna viene 
utilizzata il seguente formulone, dove
 
T= Turnazione
R=Reperibilità
P=Pasti
 
 
=IIf(DLookUp("[Turnaz]";"tbl_141_Servizi";"[Data]=[gg16] And 
[Id_Mil]=[Id_Militare]")=-1;"T") & 
IIf(DLookUp("[Rep]";"tbl_141_Servizi";"[Data]=[gg16] And 
[Id_Mil]=[Id_Militare]")=-1;"R") & 
IIf(DLookUp("[Pasti]";"tbl_141_Servizi";"[Data]=[gg16] And 
[Id_Mil]=[Id_Militare]")<>"";"P")
 
Grazie, Bruno
 
 

PUOI PROVARE QUESTO 
http://allenbrowne.com/ser-42.html
 

 [Id_Mil]=[Id_Militare]")<>"";"P")
 
Forse invece di 3 DLookUp basta 1, ma l'espressione dipende
dai dati dei tre campi nella tabella.
T e R sembrano di essere campi S�/No.
P � di tipo testo?
 
-- 
Ciao
Karl
*********
Access FAQ: 
www.donkarl.com/it
 
 
 


...e certo sarebbe molto pi� veloce riempire le caselle con un
recordset di DAO. Ci deve sapere la logica ed i nomi:
Tutte le caselle hanno quest'espressione con Data=gg1, gg2... gg16 ecc.?
Le caselle hanno un nome "seriale" che include il giorno, tipo
txtgg01, txtgg02... ecc?


 ha scritto nel messaggio 
news:b2gdbs...@mid.individual.net...

^^^^^^^
 
Ciao Karl, affermativo.... le caselle che contengono la data sono nominate 
gg01, gg02, ecc. e solo per visualizzare i gg del mese con espressione 
=CDate("01" & "/" & [Mese] & "/" & [Anno]), mentre le caselle che contengono 
i servizi sono nominate 01, 02, 03, ecc., infine le caselle per far apparire 
le turnazioni ecc, posso nominarle anche 001, 002, 003, ecc. oppure 
alfabeticamente come le colonne di excel..
Non ho idea su come fare per riempire le caselle con un recordset di DAO, se 
non ti dispiace avrei bisogno di indicazioni passo passo.
Grazie, Bruno 
 
 

 PUOI PROVARE QUESTO 
http://allenbrowne.com/ser-42.html
 
 
^^^^^^
 
Ti ringrazio per il link. Ci studio su e faccio sapere il risultato.
C'� anche la risposta di carl che appare molto interessante, inoltre potrei 
applicare il recordset DAO per risolvere anche altri problemi.
 
Grazie, Bruno 
 
 

[CUT]
 
Karl, dimenicavo!
 
Confermo anche che le caselle T e R sono di tipo SI/NO mentre la casella 
Pasto � di tipo numerico integer. La casella pasto se crea problemi si pu� 
anche escludere.
 
Bruno 
 
 

 DAO, se non ti dispiace avrei bisogno di indicazioni passo passo.
 
Una pappa pronta non è possibile perché non capisco
parti della descrizione. In principio credo che hai bisogno
di un ciclo da 1 a 31 e un codice che sarebbe circa:
 
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strRis As String
Dim i As Long
 
Set db = CurrentDb
Set rs = db.OpenRecordset("tbl_141_Servizi", dbOpenDynaset)
 
'ciclare da 1 a 31
For i = 1 To 31
 
    'trovare il record con l'Id_Militare (se si tratta di un numero)
    'e la data del ggi
    rs.FindFirst "Id_Mil=" & Me!Id_Militare & _
        " And Data=" & CLng(Me("gg" & Format(i, "00")))
 
    If Not rs.NoMatch Then
        strRis = ""
        'comporre la stringa
        If rs!Turnaz = True Then strRis = "T"
        If rs!Rep = True Then strRis = strRis & "R"
        If Not IsNull(rs!Pasti) Then strRis = strRis & "P"
        'assegnare la stringa alla casella
        Me(Format(i, "00")) = strRis
    End If
 
Next i


 Next i
 
Olala, troppo tardi oggi... meglio cos� (sempre aircode):
 
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL As String, strRis As String
Dim i As Long
 
strSQL = "SELECT Id_Mil, Turnaz, Rep, Pasti " & _
              " FROM tbl_141_Servizi" & _
              " WHERE Id_Mil=" & Me!Id_Militare
 
Set db = CurrentDb
Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
 
'ciclare da 1 a 31
For i = 1 To 31
 
    'trovare il record con la data del ggi
    rs.FindFirst "Data=" & CLng(Me("gg" & Format(i, "00")))


 Next i
^^^^^^^^^^^^^^^^^
 
Buongiorno Karl, scusa per il ritardo nelle darti la risposta; sono 
rientrato verso le 01.00 di notte distrutto.
 
Ci prover� ma non so se riuscir� a far funzionare il tuo ciclo, pensa un 
pocchino quanto sono scarso. Comunque sia.....
 
grazie per l'aiuto, ci mancherebbe di avere la pappa pronta; gi� � tanto 
l'aiuto che dai tu e gli altri guru del NewsGroup. Comunque grazie per le 
istruzioni passo passo che hai dato, anzi di pi�; hai creato il ciclo che io 
non avrei saputo creare, certo che ora ho da studiare! Sono proprio un 
profano con VBA; mi rendo conto che con il codice si pu� fare tanto.
Questa mattina ho provato a risolvere con una query a campi incrociati unica 
di cui faccio seguire l'SQL (non � necessario leggerla). Tutto va alla 
grande, infatti il turno viene rappresentato cos�: dove Pa � il turno vero e 
proprio e andando accapo con Chr(13) & Chr(10) vengono inserite TRP sono le 
indennit� di presenza e pasto. Query funzionale e veloce, unica cosa.... le 
formattazioni condizionali non funzionano pi� perch� basate solo per il 
servizio, esempio: Pa che diventa di un colore prescelto per evidenziarlo 
(in questo esempio l'assenza diventa rosso: 
DLookUp("[Id_CatTurno]";"tbl_141_Turni";"[TurnoName]=[01]")=3 Or 
DLookUp("[Id_CatTurno]";"tbl_141_Turni";"[TurnoName]=[01]")=4 Or 
DLookUp("[Id_CatTurno]";"tbl_141_Turni";"[TurnoName]=[01]")=5).
 
Ho provato con la formula     Replace([Serv];Chr(13) & Chr(10);"")  , ma  il 
risultato �    "MaTRP"   e a me servirebbe solo   "Ma"    per la 
formattazione condizionale.Preciso che la stringa e sempre di lunghezza 
differente, quindi non posso utilizzare left(), ecc. Sarebbe necessario 
escludere da Chr(13) & Chr(10) in poi ma non ci sono riuscito.
 
 
   Servizio
      Pa
      TRP
 
 
TRANSFORM First([TurnoName] & Chr(13) & Chr(10) & 
IIf([tbl_141_Servizi].[Turnaz]=-1,"T") & IIf([tbl_141_Servizi].[Rep]=-1,"R") 
& IIf([tbl_141_Servizi].[SFest]=-1,"S") & IIf([tbl_141_Servizi].[Pasti]=1 Or 
[tbl_141_Servizi].[Pasti]=2,"P")) AS Serv
SELECT tbl_141_Militari.N�_Ord, tbl_141_Servizi.Militare, 
tbl_141_Servizi.Id_Mil, tbl_141_Servizi.Anno, tbl_141_Servizi.Mese
FROM (tbl_141_Servizi INNER JOIN tbl_141_Turni ON tbl_141_Servizi.Turno = 
tbl_141_Turni.Id_Turno) INNER JOIN tbl_141_Militari ON 
tbl_141_Servizi.Id_Mil = tbl_141_Militari.IdMil
WHERE (((tbl_141_Servizi.Id_Mil) Like 
IIf([forms]![frm_141_GeneraleServizi]![Servizi_CI_MeseCorrente].[form]![FiltroMilitare]="","*",[forms]![frm_141_GeneraleServizi]![Servizi_CI_MeseCorrente].[form]![FiltroMilitare])) 
AND 
((tbl_141_Servizi.Anno)=[forms]![frm_141_GeneraleServizi]![Servizi_CI_MeseCorrente].[form]![FiltroAnno]) 
AND 
((tbl_141_Servizi.Mese)=[forms]![frm_141_GeneraleServizi]![Servizi_CI_MeseCorrente].[form]![FiltroMese]))
GROUP BY tbl_141_Militari.N�_Ord, tbl_141_Servizi.Militare, 
tbl_141_Servizi.Id_Mil, tbl_141_Servizi.Anno, tbl_141_Servizi.Mese
ORDER BY tbl_141_Militari.N�_Ord, tbl_141_Servizi.Anno, 
tbl_141_Servizi.Mese, Format([tbl_141_Servizi].[Data],"dd")
PIVOT Format([tbl_141_Servizi].[Data],"dd") In 
("01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31");
 
Saluti, Bruno
 
 
 

 ha scritto nel messaggio 
news:51c40d05$0$1348$4faf...@reader2.news.tin.it...

^^^^^^
 
Grande salto nell'acqua.
 
Non riesco a far funzionare la seguente espressione per la formattazione 
condizionale su form continua. Sicuramente � la sintassi perch� in una query 
di prova l'espressione di cui sopra funziona.
Chi ha l'occhio di falco per aiutarmi.
 
 
DLookUp("[Id_CatTurno]";"tbl_141_Turni";"[TurnoName]=Left([10];(InStr(1;[10];Chr(13) 
& Chr(10))))")=3 Or 
DLookUp("[Id_CatTurno]";"tbl_141_Turni";"[TurnoName]=Left([10];(InStr(1;[10];Chr(13) 
& Chr(10))))")=4 Or 
DLookUp("[Id_CatTurno]";"tbl_141_Turni";"[TurnoName]=Left([10];(InStr(1;[10];Chr(13) 
& Chr(10))))")=5
 
Grazie, Bruno 
 
 

^^^^
ho scoperto che mancavano gli ' apici perch� il confronto � testo
 
esempio:
 
 DLookUp("[Id_CatTurno]";"tbl_141_Turni";"[TurnoName]='" &
 Left([10];(InStr(1;[10];Chr(13) & Chr(10)))-1) &"'")=5
 
grazie e scusate se vi ho stressato inutilmente
Saluti, Bruno
 
--