Newsgroup: it.comp.appl.access
Titolo: Re: FindFirst non punta il record

 necessità di attribuire il valore di "Contatore" ad una seconda variabile.
Uso sempre variabili multiple per semplificare la lettura del codice.
Contatore è un contatore. :)
inCodiceImpresaCorrente rende l'idea del contenuto della variabile.
Specialmente quando il codice è molto profondo.
Duemila volte grazie per la tua disponibilità

 indice, utilizza il metodo Seek. (vedi guida)



Prima di tutto evita di postare il messaggio più volte...
Detto questo, sei sicuro che intCodiceImpresaCorrente cambi continuamente?
Hai inserito il codice in un ciclo?
In che modo comunichi al codice che intCodiceImpresaCorrente è cambiato?
Manca qualche parte di codice che non hai postato?
Quando scrivi Set rs2 = rs1.OpenRecordset hai pensato che il recordset rs2 
conta solo un record, cioè quello corrispondente a intCodiceImpresaCorrente?
Che necessità hai di aprire un secondo recordset visto che sei già 
posizionato sul giusto recordset di rs1?
Ciao, Carlo 

 Sei sicuro di questo?
2229 per la precisione. Ma è quella più rognosa. :)
Tutto il codice (gestisce dal solo l'attività di un ente pubblico) è di
circa 23.000 righe.
Considera che ci sono commenti ed interlinee per facilitare la lettura.
Diciamo 20.000 righe in tutto.


Vorrei aggiungere che più di 2000 righe in un'unica routine mi sembrano 
moltissime.
Sei sicuro di questo?
Ciao, Carlo 

 ha scritto nel messaggio 
news:oHV%d.685138$b5.31...@news3.tin.it...

Sì OK, non mi meravigliano le 20.000 righe, mi meraviglia scriverne 2000 in 
una sola routine (funzione o sub).
Posso anzi dirti che certamente non è così. Le funzioni saranno varie decine 
se non centinaia.
Ti posto un codice con il quale potrai contare le linee dei moduli pubblici. 
In parte è preso dalla guida il resto è farina del mio sacco.
Due condizioni: impostare una variabile globale in un modulo pubblico 
(Global NUmeroDiLinee As Long), e creare una query che si chiama 
"ElencaModuli" con questo sql:
SELECT MSysObjects.*
FROM MSysObjects
WHERE (((MSysObjects.Type)=-32761));
Public Function ContaRighe()
NUmeroDiLinee = 0
Dim rcs As Recordset, i As Integer
Set rcs = CurrentDb.OpenRecordset("ElencaModuli")
rcs.MoveLast
rcs.MoveFirst
For i = 1 To rcs.RecordCount
    ModuleLineTotal (rcs!Name)
rcs.MoveNext
Next i
MsgBox "Sono state contate " & NUmeroDiLinee & " linee di codice solo nei 
moduli pubblici!"
End Function
Public Function ModuleLineTotal(ByVal strModuleName As String)
    Dim mdl As Module
    ' Open module to include in Modules collection.
    DoCmd.OpenModule strModuleName
    ' Return reference to Module object.
    Set mdl = Modules(strModuleName)
    ' Print number of lines in module.
    Debug.Print "Numero di linee: ", mdl.CountOfLines
    Debug.Print "Numero di linee tra le dichiarazioni: ", _
        mdl.CountOfDeclarationLines
     NUmeroDiLinee = NUmeroDiLinee + mdl.CountOfLines
End Function
Per eseguire il codice esegui: ContaRighe
Ciao, Carlo


A questo punto sono proprio curioso.
Perchè non mi mandi questa tabella "Imprese"?
Magari anche tutto il codice interessato e solo questo.
Prima però fai un cortrollo su questo "Codice Impresa" e cerca i record 
nulli o con zero o (cosa impossibile a tuo dire) duplicati.
Altra prova è quella di passare il "Codice Impresa" in manuale, magari con 
una query. Crea una query con la tabella e nei criteri di "Codice Impresa" 
metti alternativamente 1, 2, 3, e così via. Esegui e vedi cosa succede.
Ciao, Carlo 

Set db = CurrentDb
Set rs1 = db.OpenRecordset("Imprese")


 [CUT]
Access 2003:
-----------------------------------------------------------
Dim RS As Recordset, Contatore As Long, i As Integer
Set RS = CurrentDb.OpenRecordset("Imprese", dbopendynaset)
For i = 1 To 30
    Contatore = Contatore + 1
    RS.FindFirst "[Codice Impresa]=" & Contatore
    With RS
        MsgBox ![Codice Impresa]
    End With
Next
----------------------------------------------------------
Come fa a non funzionare?
Bruno 


Hai scritto un codice poco leggibile e con molti errori.
Questo un esempio pulito di quello che potresti scrivere:
Dim Contatore As Integer, Rs1 As Recordset, bolAttiva, bolNonAttiva, 
bolRegolare, bolNonRegolare
'queste variabili potresti già averle (bolAttiva, bolNonAttiva, bolRegolare, 
bolNonRegolare)
Contatore = 1
Set Rs1 = CurrentDb.OpenRecordset("Imprese")
For Contatore = 1 To 200
    With Rs1
    .FindFirst "[Codice Impresa] = " & Contatore
    .Edit
    !Iscritta = True
    !Attiva = bolAttiva
    !NonAttiva = bolNonAttiva
    !Regolare = bolRegolare
    !NonRegolare = bolNonRegolare
    .Update
    End With
Next Contatore
RS1.Close
Set RS1 = Nothing
Tieni presente che il metodo FinfFirst individua il primo record in un 
oggetto Recordset di tipo dynaset o di tipo snapshot.
Per individuare un record in un oggetto Recordset di tipo tabella con 
indice, utilizza il metodo Seek. (vedi guida)
Ciao, Carlo

 posizionato sul giusto recordset di rs1?
Ma il fatto è che non si posiziona! :(


 primo dei due o tre [Codice Impresa].
Niente da fare.
Non va.
FindFirst punta sempre e solo il primo record del rs1
Ma come c***o e possibile!??
Maledizione..
Scusate, se la sintassi
Set db = CurrentDb
Set rs1 = db.OpenRecordset("Imprese")
StringaCriterio = "[Codice Impresa] = " & intCodiceImpresaCorrente
With rs1
  .FindFirst StringaCriterio
  .Edit
[CUT]
è corretta dico male o  a seconda della StringaCriterio dovrei avere puntati


 Magari anche tutto il codice interessato e solo questo.
Grazie Carlo.
Tutto risolto.


Certo che hai risolto. Contatore si incrementa nel ciclo di For da 1 a 200. 
Se nella tabella sono questi i numeri (ID da 1 a 200) da cercare non hai la 
necessità di attribuire il valore di "Contatore" ad una seconda variabile.
Inoltre [Codice Impresa] deve essere univoco altrimenti prenderà solo il 
primo dei due o tre [Codice Impresa].
Ciao, Carlo 

 Posso anzi dirti che certamente non č cosě.
??
Te lo assicuro.
Chiusa un'ora fa.
2221 righe inclusi commenti ed interlinee.
Il Gestionale che ho sotto le mani č installato lato server e lato client
(solo l'interfaccia) e si aggancia ad altri 31 databases  di dati di enormi
dimensioni. Sono centinaia di variabili temporanee o non pubbliche
necessarie alla routine per funzionare. Solo per le dichiarazioni occorrono
centinaia di linee (io uso sempre Dim NomeVariabile 'Commento per ogni
riga). Moltissime operazione di filtering, statistica, ricerca e output.
La routine "incolpata" - me la sogno anche di notte quella stronza - č un
po' il cuore di tutto il programma: gestisce i timer di disconnessione, le
sessioni di lavoro, le stampe automatiche, le richieste da web e (adesso)
l'esportazione dei dati in files di vario tipo (ASCII). Demanda tutto a
moltissime altre funzioni e subroutines, certo, ma si sta ingrandendo come
un cucciolo di blob...
Grazie per la function.
La userň.
Ciao