Newsgroup: it.comp.appl.access
Titolo: scorrere record in una maschera

 
          Ciao a tutto il NG,
la mia esigenza è aprire una maschera e scorrere i record dal primo
all'ultimo,qualcuno è in grado di darmi una mano?
oppure in base ad un valore aprire e farli scorrere tutti quelli che
appartengono a quel dato valore.
grazie.
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 grazie.
Tizià; perché non ci dici qual'é la reale necessità? O almeno qual'é il senso di scorrere tutti o parte dei record contenuti in una 
tabella?
Quando sei arrivato alla fine o a metà, che devi fare?
Descrivi meglio il problema...
Ciao.
-- 
Sergio MAZZA 


Ciao,
dunque iniziamo col dire che io ho una maschera con 10 sottomaschere
collegate in cui inserisco dei valori numerici,la visualizzazione e la
stampa però non va molto bene perchè posso avere anche per un record della
maschera principale in una delle 10 sottomaschere 30 record la
visualizzazione e la stampa nonchè il dato che devo consegnare deve
necessariamente essere tutto in una tabella sola.
Così mi sono ingegnato a far scrivere questi valori in un campo memo nella
maschera principale.
il problema sorge nel momento in cui i miei dati si aggiornano in modo
automatico all'inserimento di un record nella maschera principale.
ho provato a mandare al NG alcune richieste per risolvere il mio problema e
alla fine mi sono risolto con chiedervi come farli scorrere...
se così non fosse chiaro te ne mando una copia.
Ciao e grazie
Tz


 Tz
Cioč?
Vorresti dire che il termine "scorrere" per te significa "aggiornare i valori nella casella di testo (memo) che contiente tutti i 
valori inseriti nelle 10 sottomaschere per ogni record"?
Ciao.
-- 
Sergio MAZZA 

 Ciao.
'genera valore in campo memo uguale
  Dim rs As DAO.Recordset
  Dim db As Database
  Dim appoggio As String
  Set db = CurrentDb
  Set rs = db.OpenRecordset("Tabella_uguale_a", dbOpenDynaset)
  Dim ID_Località As Integer
  Dim primo, secondo As String
    rs.MoveFirst
    Do Until rs.EOF
    ID_Località = rs("ID_Località")
    primo = rs("us")
    secondo = rs("uguale a")
        If rs("us") = Me.US And rs("ID_Località") = Me.ID_Località Then
            appoggio = rs![Uguale a] & ", " & appoggio
        End If
        rs.MoveNext
    Loop
   If appoggio = "" Then
   Forms![ma_schedatura]![uguale] = "*"
   ElseIf appoggio <> "" Then
       Forms![ma_schedatura]![uguale] = Left(appoggio, Len(appoggio) - 2)
    End If
-----------------------------------------
mi avete aiutato anche provando a pescare i dati direttamente da codice ma
ho dei seri problemi per capire come farlo funzionare poichè non sono un
tecnico riesco a trovarre e modificare del codice ma più in là non ci
riesco. la funzione scritta sotto apre le tabelle "registro" e "riempito da"
cercando le concordanze per due diversi valori e inserendo il dato nella
tabella registro nel campo memo.
non sono però riuscito a farla funzionare mi si pianta sempre, così avrei
ovviato chiedendoti di aprire la maschera e scorrere tutti i record
presenti. questa operazione mi serve unicamente per inserire i valori nel
campo memo nel momento in cui desidero andare in stampa, quindi anche se la
macchina si fermasse per x tempo non sarebbe un problema.
grazie
Tiz
------------------------------------
  Function riempito_da()
 'genera valore in campo memo riempie
 Dim a1 As DAO.Recordset
 Dim a2 As DAO.Recordset
 Dim db As Database
 
 Dim id_localitàRegistro As String
 Dim RegistroUS As String
 Dim RegistroRiempitoDa As String
 Dim id_localitàRiempitoDa As String
 Dim RiempitoDaUS As String
 Dim RiempitoDa_RiempitoDa As String
 Dim str As String
 Dim v1 As String
 Dim pos
 Dim dove As Integer
 Set db = CurrentDb
 Set a1 = db.OpenRecordset("registro", dbOpenDynaset)
 Set a2 = db.OpenRecordset("Tabella_riempito_da", dbOpenDynaset)
 
a1.MoveFirst
Do Until a1.EOF
If a1.EOF Then Exit Do
 id_localitàRegistro = a1("id_località")
 RegistroUS = a1("us")
 RegistroRiempitoDa = a1("riempito_da")
 
 id_localitàRiempitoDa = a2("ID_Località")
 RiempitoDaUS = a2("us")
 RiempitoDa_RiempitoDa = a2("riempito da")
 
 pos = a1.Bookmark
    v1 = id_localitàRiempitoDa & RiempitoDaUS
        str = ""
        Do While Not a2.EOF And id_localitàRegistro & RegistroUS <= v1
                a1.Edit
                RegistroRiempitoDa = str
                a1.Update
            'str = str & RiempitoDa_RiempitoDa & ","
            'v1 = id_localitàRiempitoDa & RiempitoDaUS
            a2.MoveNext
            If a2.EOF Then Exit Do
        Loop
    If v1 = id_localitàRegistro & RegistroUS Then
        str = str & RiempitoDa_RiempitoDa & ","
        a1.Edit
        RegistroRiempitoDa = str
        a1.Update
    End If
    If a2.EOF Then Exit Do
    If id_localitàRegistro & RegistroUS < v1 Then a1.MoveNext
Loop
 a1.Close
 a2.Close
End Function



--- omissis ---
Tiziano, Carlo Costarella ti aveva già risposto suggerendoti un'alternativa; se non risolveva il problema avresti potuto farlo 
notare. Questo per dare a Carlo la possibilità o ri ricalibrare il suggerimento o di proportene un altro e dare al te la possibilità 
di altri interventi; scrivere nuovamente il messaggio con lo stesso problema crea confusione.
Cerchiamo di fare ordine su cosa vuoi fare e su cosa hai a disposizione; riprendendo un tuo messaggio (oggetto: function non 
funzionante del 28/06/2005) che mi sembra il più chiaro io ti suggerirei (senza entrare nel merito):
'----------
Dim rstRegistro1 As DAO.Recordset, rstRegistro2 As DAO.Recordset, rstRiempitoDa As DAO.Recordset
Dim stringaDaScrivere As String
Set rstRegistro1 = CurrentDb.OpenRecordset("SELECT id_località FROM [tabella registro] GROUP BY id_località;")
'--> se ogni volta devi riscrivere i dati, prima svuota la tabella
If Not rstRegistro1.EOF Then
    DoCmd.SetWarnings False
    DoCmd.RunSQL "Delete * From tabella_riempito_da"
    DoCmd.SetWarnings True
End If
Set rstRiempitoDa = CurrentDb.OpenRecordset("tabella_riempito_da")
Do While Not rstRegistro1.EOF
    stringaDaScrivere = ""
    '--> selezioni solo i record che mi servono
    Set rstRegistro2 = CurrentDb.OpenRecordset("Select us From [tabella registro] Where id_località = " & rstRegistro1!id_località)
    '--> per ogni record
    Do While Not rstRegistro2.EOF
        stringaDaScrivere = stringaDaScrivere & rstRegistro2!us & " - "
        rstRegistro2.MoveNext
    Loop
    '<--
    Set rstRegistro2 = Nothing
    stringaDaScrivere = Left(stringaDaScrivere, Len(stringaDaScrivere) - 3) '<-- ci levo gli ultimi 3 car.
    '--> scrivo i dati nel campo memo
    rstRiempitoDa.AddNew
    rstRiempitoDa!id_località = rstRegistro1!id_località
    rstRiempitoDa![us riempito da] = stringaDaScrivere
    rstRiempitoDa.Update
    '<--
    rstRegistro1.MoveNext '<-- avanti il prossimo
Loop
'--> azzero tutte le variabili
rstRegistro1.Close
rstRiempitoDa.Close
Set rstRegistro1 = Nothing
Set rstRegistro2 = Nothing
Set rstRiempitoDa = Nothing
'<--
Exit Sub
sub_errore:
    DoCmd.SetWarnings True
    Set rstRegistro1 = Nothing
    Set rstRegistro2 = Nothing
    Set rstRiempitoDa = Nothing
    MsgBox Err.Number & " " & Application.AccessError(Err.Number)
'------------
Prima di copiare/incollare verifica se ho interpretato bene quello che ti serve...
Ciao.
-- 
Sergio MAZZA 

 Set rstRegistro1 = CurrentDb.OpenRecordset("SELECT id_località FROM
[tabella registro] GROUP BY id_località;")
' <----[domanda come mai per la stessa tabella "tabella registro" la
dichiari sia come rstRegistro1 e come rstRegistro2?]




 dichiari sia come rstRegistro1 e come rstRegistro2?]
Se hai notato sono due recordset diversi per contenuto; uno contiene i record univoci di id_località e l'altro tutto il recordset 
completo.
Utilizzo il primo per effettuare un ciclo su tutti gli id_località e per filtrare il secondo che mi restituirà tutti gli us per ogni 
id_località (del primo recordset).
Ciao.
-- 
Sergio MAZZA 

  Cerco di spiegarmi ancora di piu' perche ritengo sia importante.
nella tabella Tabella Registro ci sono 30 campi tra cui i dieci campi memo
nella tabella "Tabella_Riempito_da" ci sono valori che non possono essere
cancellati.
quello di cui avrei bisogno e' all'attivazione di un click tipo su una
maschera quello da eseguire dovrebbe essere:
1. apro la tabella registro
2. cancello tutti i valori contenuti nei campi memo [non i record]
3. mi posiziono al primo record
4. apro la tabella "Tabella_Riempito_da"
5. mi posiziono al primo record
6. controllo se il primo record della tabella "Tabella_Riempito_da" contiene
il valore della localita' e dell'US
7. se non e' cosi' passa al record successivo
8. se il record contiene il valore della localita' e dell'US
9. copia il valore "riempito da" in una stringa e aggiungi i valori per
quante volte il criterio
tabella registro id_localita' e us + tabella "Tabella_Riempito_da"
id_localita' e us
soddisfa questo criterio [in sostanza la relazione uno a molti]
10. inserisci il valore stringa nel campo memo al record della tabella
Registro che ha soddifatto questo criterio.
Spero di esser stato esaustivo
Tiz


  Cerco di spiegarmi ancora di piu' perche ritengo sia importante.
nella tabella Tabella Registro ci sono 30 campi tra cui i dieci campi memo
nella tabella "Tabella_Riempito_da" ci sono valori che non possono essere
cancellati.
quello di cui avrei bisogno e' all'attivazione di un click tipo su una
maschera quello da eseguire dovrebbe essere:
1. apro la tabella registro
2. cancello tutti i valori contenuti nei campi memo [non i record]
3. mi posiziono al primo record
4. apro la tabella "Tabella_Riempito_da"
5. mi posiziono al primo record
6. controllo se il primo record della tabella "Tabella_Riempito_da" contiene
il valore della localita' e dell'US
7. se non e' cosi' passa al record successivo
8. se il record contiene il valore della localita' e dell'US
9. copia il valore "riempito da" in una stringa e aggiungi i valori per
quante volte il criterio
tabella registro id_localita' e us = tabella "Tabella_Riempito_da"
id_localita' e us
soddisfa questo criterio [in sostanza la relazione uno a molti]
10. inserisci il valore stringa nel campo memo al record della tabella
Registro che ha soddifatto questo criterio.
Spero di esser stato esaustivo
Tiz


Concettualmente è quello che ti ho suggerito solo devi riadattarlo...
Ciao.
-- 
Sergio MAZZA


Si' e' vero devo riadattarlo, pero' quello che mi sembra strano e' che dal
tuo codice crei un nuovo record, invece se volessi scrivere nel record in
cui e' presente uguaglianza come si dovrebbe operare?
            '--> scrivo i dati nel campo memo
    rstRiempitoDa.AddNew
    rstRiempitoDa!id_località = rstRegistro1!id_località
    rstRiempitoDa![us riempito da] = stringaDaScrivere
    rstRiempitoDa.Update
    '<--
in questo modo scrivo i valori in un record nuovo non in quello corrente
giusto?
Ciao
Tz


Sì perche pensavo che la tabella per la stampa dovesse essere solo di
appoggio e quindi temporanea.
Ciao.
-- 
Sergio MAZZA


ciao, purtroppo non è così perchè poi posso consegnare o esportare i dati
provenienti dalla tabella registro senza necessità di altre tabelle
collegate...
è possibile "segnare" il record corrente affinchè i dati vengano inseriti
nel record della tabella Registro interessata dall'uguaglianza?
ovvero il ciclo do loop?
Ciao Tiziano




       Ciao,
purtroppo non è così, desiderei inserire nel record della tabella registro
in cui il criterio di uguaglianza è soddisfatto tutti i record del campo
riempitoda della tabella Tabella_Riempito_da affinchè possa esportare la
tabella nella sua interezza senza necessità di esportare anche i dati delle
10 sottomaschere.E' possibile "segnare"o marcare il record in cui il
criterio è soddisfatto e inserire i record della tabella
Tabella_Riempito_da?
Grazie
Tiziano


ciao,
stavo pensando ad una soluzione ma avrei bisogno della tua consulenza per
capire se è una idea balzana.
partendo dal presupposto di non poter cncellare i record presenti nella
tabella Registro perchè contengono dati che non possono essere cancellati
potrei gestire i 10 campi memo come una tabella tipo "Registro2" in cui il
rapporto con la tabella Registro è 1 a 1. in questo modo i dati presenti
nella tabella "Registro2" anche se cancellati non è un problema e con
l'attivazione della funzione verrebbero riscritti tutti, poi potrei gestire
l'esportazione delle due tabelle in un altro modo ma la cosa fondamentale è
poter capire se il codice e la filosofia di lavoro può funzionare.
Ciao
Tziano


 ha scritto nel messaggio 
news:130Z251Z87Z242Y...@usenet.libero.it...

Allora l'esempio che ti ho inviato calza a pennello, basta che cambi nome 
alla tabella dove vengono aggiunti i record...
Ciao.
-- 
Sergio MAZZA 

Ciao,
in effetti calza a pennello questa è la modifica che ho effettuato al codice
che mi hai inviato,
ma sono ancora qui oltre che per ringraziarti per chiederti come si possa
fare per inserire solo ivalori che soddisfanoil criterio di uguaglianza tra
id_località e us,
ti ho scritto nel codice le variazioni e le modifiche che ritengo debbano
essere inserite per far funzionare corretamente il codice.
Function riempito_da()
Dim rstRegistro1 As DAO.Recordset, rstRegistro2 As DAO.Recordset,
rstRiempitoDa As DAO.Recordset
Dim stringaDaScrivere As String
'Set rstRegistro1 = CurrentDb.OpenRecordset("SELECT id_località FROM
[registro] GROUP BY id_località;")
Set rstRiempitoDa = CurrentDb.OpenRecordset("SELECT
Tabella_riempito_da.ID_Località, Tabella_riempito_da.US FROM
[tabella_riempito_da] GROUP BY Tabella_riempito_da.ID_Località,
Tabella_riempito_da.US;")
'If Not rstRegistro1.EOF Then
If Not rstRiempitoDa.EOF Then
    DoCmd.SetWarnings False
    DoCmd.RunSQL "Delete * From registro2"
    DoCmd.SetWarnings True
End If
'Set rstRiempitoDa = CurrentDb.OpenRecordset("tabella_riempito_da")
Set rstRegistro1 = CurrentDb.OpenRecordset("registro")
'Do While Not rstRegistro1.EOF
Do While Not rstRiempitoDa.EOF
    stringaDaScrivere = ""
    '--> selezioni solo i record che mi servono
 
    '<-------------------- funziona ma inserisce tutti i valori
    'Set rstRegistro2 = CurrentDb.OpenRecordset("Select
Tabella_riempito_da.[Riempito da] From [tabella_riempito_da] Where
Tabella_riempito_da.ID_Località = " & rstRiempitoDa!ID_Località)
    '<-------------------- fine funziona
    '<--------------------modifica con doppio criterio di ugualglianza sia
id_località che us
    Set rstRegistro2 = CurrentDb.OpenRecordset("Select
Tabella_riempito_da.id_località and Tabella_riempito_da.[Riempito da] From
[tabella_riempito_da] Where (((tabella_riempito_da.ID_Località) and
(
tabella_riempito_da.us
))) = " & ((rstRiempitoDa!ID_Località) And
(rstRiempitoDa!US)))
    '<--------------------modifica con doppio criterio di ugualglianza sia
id_località che us
    '--> per ogni record
    Do While Not rstRegistro2.EOF
        stringaDaScrivere = stringaDaScrivere & rstRegistro2![Riempito da] & ","
        rstRegistro2.MoveNext
    Loop
Set rstRegistro2 = CurrentDb.OpenRecordset("registro2")
    rstRegistro2.AddNew
    rstRegistro2!ID_Località = rstRiempitoDa!ID_Località
    rstRegistro2!US = rstRiempitoDa!US
    rstRegistro2![riempito_da] = stringaDaScrivere
    rstRegistro2.Update
    '<--
    rstRiempitoDa.MoveNext '<-- avanti il prossimo
    Loop
End Function
la modifica che ho apprortato però non mi permette di inserire per il
criterio di uguaglianza dia dell'id_località che di us i valori. scrive
correttamente tutti i campi US nella tabella "Registro2" ma nel campo
"Riempito da" della tabella "Registro2" i record sono vuoti. Se inserisco la
stringa precedente scrive tutti i valori filtrandoli solo per la località.
Come posso risolvere questo problema ?
ciao e grazie
Tiziano



Scusa ma non capisco questa query:
'<----modifica con doppio criterio di ugualglianza sia id_località che us
    Set rstRegistro2 = CurrentDb.OpenRecordset("Select
Tabella_riempito_da.id_località and Tabella_riempito_da.[Riempito da] From
[tabella_riempito_da] Where (((tabella_riempito_da.ID_Località) and
(
tabella_riempito_da.us
))) = " & ((rstRiempitoDa!ID_Località) And
(rstRiempitoDa!US)))
La condizione (se di condizione parliamo) io la scriverei così:
'<-------modifica con doppio criterio di ugualglianza sia id_località che us
Set rstRegistro2 = CurrentDb.OpenRecordset("Select id_località, [Riempito da] From
[tabella_riempito_da] Where ID_Località = " & rstRiempitoDa!ID_Località & " And us = " & rstRiempitoDa!US)
Se ho capito bene..
Ciao.
-- 
Sergio MAZZA 


Ciao,
ritengo che sia corretta la tua formulazione io non sono abile, pero'
l'inserimento della stringa che mi hai mandato mi propone un errore:
Errore di run-time '3464':
tipo di dati non corrispondenti nell'espressione criterio
dove posso aver errato?
ciao Tz



E' probabile che il campo us sia di testo non numerico; quindi:
...Where ID_Localitą = " & rstRiempitoDa!ID_Localitą & " And us = '" & rstRiempitoDa!US & "'")
Ciao.
-- 
Sergio MAZZA 

 Sergio MAZZA
ciao sergio!
ho avuto solo ora possibilità di collegarmi e la modifica che mi hai detto
funziona alla grande!!!
funziona!!!!!
grazie mille veramente...
Tiziano
