Newsgroup: it.comp.appl.access
Titolo: Funzione Replace

Ciao, ho già chiesto la stessa cosa all'altro forum ma non ho avuto
risposta.
Vengo subito al dunque :-)
Ho 45 campi A1 : A45 per 60 record.
Alcuni campi sono vuoti, altri sono popolati da numeri che spesso si
ripetono.
Quello che mi serve è individuare i numeri doppioni ed al loro posto
lasciare il campo vuoto.
Non trovando altra soluzione, avevo pensato alla funzione Replace, in
quanto se volessi trovare nell'intero Recordset tutti i numeri che
hanno la virgola ed al loro posto svuotare il campo, farei:
Dim ss As DAO.Recordset
Dim i As Integer
Set ss = Me.Recordset
Do Until ss.EOF
For i = 1 To 45
If Not IsNull(Me.Controls("A" & i)) Then
If Me.Controls("A" & i) <> Replace(Me.Controls("A" & i), ",", "")
Then
Me.Controls("A" & i) = Null
End If
End If
Next i
ss.MoveNext
Loop
ma per trovare i numeri uguali vale sempre servirsi della funzione
Replace? E come?
Grazie Vladimiro.

vlad...@alice.it
 ha scritto:

Non ho ben compreso quello che ti serve ma a caso pesco una risposta
.....
Dim str as String
Do until ss.eof
    str ="!"
    for i=1 to 45
	rs.edit
        if instr(str,"!" & rs("A" & i) = 0 then
	     str = str & rs("A" & i) & "!"
        else
              rs("A" & i) = null (o "")
        end if
        rs.update
    next
    rs.movenext
loop
--
ac

 - Mostra testo citato -
Ciao Alessandro,
sono proprio contento di "sentirti" anche perchè, ad essere egoisti,
con te vado sul sicuro :-)
Come dicevo ho 45 campi incolonnati per 60 record con all'interno dei
numeri oppure nulla.
Ti faccio un esempio visivo con 5 campi A1 : A5, tanto il discorso non
cambia:
A1  A2  A3  A4  A5
 5   12  13   14   19
13  17  14
12  18  17  19
Il primo record deve rimanere intatto (se proprio non ci si riesce non
fa niente)
il secondo record guarda i doppioni rispetto al primo record svuotando
il campo doppione.
il terzo record guarda sia il primo record che il secondo record e
così via.
A1  A2  A3  A4  A5
 5   12  13   14   19
13  17
      18
Spero che adesso sia un pò più chiara la richiesta.
A presto Vladimiro.

 A presto Vladimiro.
Comunque avevo "abbastanza" compreso.
La routine che ho gia' postato lo fa per record ma facciamo una 
"potente" modifica ed il tutto dovrebbe funzionare.
N.B. Elimina anche all'interno dello stesso record.
Dim str as String
....
str ="!"
Do until ss.eof
      for i=1 to 45
	if "" & rs("A" & i) <> "" then
          rs.edit
          if instr(str,"!" & rs("A" & i) = 0 then
               str = str & rs("A" & i) & "!"
          else
                rs("A" & i) = null (o "")
          end if
          rs.update
        endif
      next
      rs.movenext
loop
la if esterna l'ho messa come "buon" peso.
--
ac

Alessandro Cara ha scritto:
[cut]
me possino ......
la .edit/.update va fuori dal ciclo
i.e.
   str="!"
  Do until ss.eof
      rs.edit
      for i=1 to 45
        .....quello che c'era
      next
      rs.update
      rs.movenext
loop


Scusa Alessandro, secondo me va meglio la routine precedente.
Intanto riscrivo il codice (qualcosina da modificare) se qualcuno ne
avesse bisogno:
Dim rs As DAO.Recordset
Dim str As String
Dim i As Integer
Set rs = Me.Recordset
str = "!"
Do Until rs.EOF
      For i = 1 To 45
        If "" & rs("A" & i) <> "" Then
          rs.Edit
          If InStr(str, "!" & rs("A" & i)) = 0 Then
               str = str & rs("A" & i) & "!"
          Else
                rs("A" & i) = Null ' (o "")
          End If
          rs.Update
        End If
      Next
      rs.MoveNext
Loop
Se è possibile ancora qualche modifica.
Se ad es. nel secondo record ci sono dei numeri non presenti nel primo
record ma nei restanti records,i numeri del secondo record non debbono
essere cancellati.
La stessa cosa nel terzo records( e così via):
se non ci sono numeri presenti nel primo e nel secondo record ma nei
restanti records, i numeri del terzo record non debbono essere
cancellati.
Un'altra cosa che già hai citato, i numeri doppioni sullo stesso
record, che non hanno doppioni nei precedenti records, non debbono
essere cancellati.
Mentre l'altra routine che ti scrivo (sempre se l'ho scritta bene come
mi hai suggerito) mi lascia i doppioni:
Dim rs As DAO.Recordset
Dim str As String
Dim i As Integer
Set rs = Me.Recordset
   str = "!"
  Do Until rs.EOF
      rs.Edit
      For i = 1 To 45
        If "" & rs("A" & i) <> "" Then
          rs.Edit
          If InStr(str, "!" & rs("A" & i)) = 0 Then
               str = str & rs("A" & i) & "!"
          Else
                rs("A" & i) = Null ' (o "")
          End If
          End If
    Next
      rs.Update
      rs.MoveNext
Loop
Ciao Vladimiro.

 mi hai suggerito) mi lascia i doppioni:
Rimango perplesso ed anche un po' "basito". Non dovrebbe. Fermo restando 
che non la ho testata.
In quella che hai scritto (quella in fondo al post, che ho tagliato) 
c'e' un .edit di troppo non so cosa succede in questo caso, potrebbe 
dare fastidio.
Comunque, riepilogando.
str ="!"
strRec=""
Do until ss.eof
     rs.edit
     for i=1 to 45
       if "" & rs("A" & i) <> "" then
          if instr(str,"!" & rs("A" & i) = 0 then
               strRec = strRec & rs("A" & i) & "!"
          else
               rs("A" & i) = null (o "")
          end if
        endif
     next
     str = str & stRec
     rs.update
     rs.movenext
loop
Questa dovrebbe salvaguardare i doppi sullo stesso record e non gia' 
presenti su altro record.
--
ac

 
vladil...@alice.it
 ha scritto:

Puoi farne a meno in quanto non avevo pensato che non ci possono
essere numeri ripetuti sullo stesso record

Succede una cosa strana, quando il numero è 1 e si trova sul primo
record va bene, mentre già dal secondo record viene eliminato insieme
agli altri 1 dei restanti records; se il numero è il 2  secondo la
posizione del campo e del record  viene eliminato allo stesso modo;
mentre per gli altri numeri (almeno per tutte le prove che ho fatto)
va bene.
Ti facio un esempio:
A1  A2  A3  A4  A5
13  17
 5   12  13
 1   12  22
 2   18  23
 1   11  15
Risultato:
A1  A2  A3  A4  A5
13  17
 5   12
           22
     18  23
     11  15
Ciao Vladimiro

vlad...@alice.it
 ha scritto:
[cut]

Hai ragione sono un mezzo pollo, nel senso che avevo pensato al problema 
ma l'ho risolto a meta'. Il problema deriva dal fatto che !1 e !11 per
lui sono uguali. Toglie l' 1 perche' aveva trovato un 1x e lo stesso per 
il 2.
Correzione:
if instr(str,"!" & rs("A" & i) & "!" = 0 then
cosi' confronta !1! e !11!, in questo caso non sono uguali, ovviamente 
se il "!" ti sta antipatico puoi sostituirlo con un qualsiasi altro 
carattere ;-{)
--
ac

 - Mostra testo citato -
Ascolta Alessandro, siccome vedo che sei proprio in gamba vorrei
proporti un altro problema che già ho esposto senza risposta; poi se
debbo aprire un altro post me lo scrivi (sempre se la richiesta è
fattibile).
I 60 record sono costretto ad implementarli manualmente visto che non
so fare altro.
Li prendo da una tabella (che deriva a sua volta da altri sviluppi)
con due campi Data e Numero e li visualizzo tramite maschera e
sottomaschera.
Nella maschera principale c'è la data in raggruppamento con ordine
decrescente con un Top 60 e nella sottomaschera i numeri sempre in
raggruppamento (ecco perchè in un secondo tempo  ti ho scritto che due
numeri uguali sullo stesso record non ci possono essere).
Per farti capire meglio, ho sulla sinistra del monitor maschera con
sottomaschera ed a fianco l'altra maschera con i 45 campi.
Prendo la prima data e visualizzando i numeri ad es. 12 , 25 , 2
inserisco in A12 il 12 in A25 il 25 ed in A2 il 2 ; poi prendo la
seconda data e passo ad inserire i dati sul secondo record della
maschera "A1 : A45".
Domanda:
è possibile fare tutto ciò tramite routine ?
Spero di essermi fatto capire.
A presto Vladimiro.
.

vlad...@alice.it
 ha scritto:

Come sa un mio cliente. Quasi tutto e' possibile e per l'impossibile ci 
si attrezza.
Credo che non ti abbiano risposto poiche', mi spiace dirlo, ma l'analisi 
e' un po' confusa.
Spesso dire cosa si fa confonde. E' bene dire cosa si vuole ottenere 
dall'input fornito. Insomma descrivere bene l'input che si ha e l'output 
che si vuole ottenere.
Da quello che scrivi, ad es, non si capisce perche' , ma soprattutto se 
e' la regola, che An contiene n quando valorizzato.
E' bene comunque che tu faccia un altro post tenendo presente quello che 
ho scritto.
--
ac


Hai ragione, pensa che chi mi ha richiesto questo tipo di analisi,
prima di arrivare a capire cosa realmente voleva ottenere mi ha
lasciato da stracci.
Ci proverò.
Ciao Vladimiro.