Newsgroup: it.comp.lang.visual-basic
Titolo: [?] replace

ho bisogno di fare sostituzioni a tappeto su parecchie tabelle.
i caratteri per replace sono +- sempre quelli quindi ho provato con una
procedura:
Public Sub ReplaceTableChar(t As String, f As String)
    Dim db As Database, rs As Recordset, s As String
    Set db = OpenDatabase("mca.mdb")
    Set rs = db.OpenRecordset(t)
    frmUtils.lblSegniTable = t & " - " & f
    With rs
        .MoveFirst
        frmUtils.lblSegniChar = ":"
        Do While Not .EOF
            s = Trim(f)
            If InStr(s, ":") Then
                s = Replace(s, ":", " : ")
            End If
            If InStr(s, ";") Then
                s = Replace(s, ";", " ; ")
            End If
            If InStr(s, ">") Then
                s = Replace(s, ">", "> ")
            End If
            If InStr(s, "<") Then
                s = Replace(s, "<", " <")
            End If
            'While InStr(s, Chr(32) & Chr(32))
            'While InStr(s, Chr(32) & Chr(32)) <> 0
                s = Replace(s, Chr(32) & Chr(32), Chr(32))
            'Wend
            s = Trim(s)
            .Edit
            f = s
            .Update
            .MoveNext
        Loop
    End With
    rs.Close: Set rs = Nothing
    db.Close: Set db = Nothing
End Sub
la richiamo cosi':
    ReplaceTableChar "indice", "indnome"
    ReplaceTableChar "principali", "intinte"
ecc.
non da' errori, ma in una scheda ho provato a mettere due spazi consecutivi
e alla fine ci sono ancora. a questo punto mi viene il dubbio che anche gli
altri cambi non funzionino manco un po'.
con
    If InStr(1, s, ":", vbTextCompare) Then
non cambia niente
cosa sto sbagliando ?
grazie, a.

altri cambi non funzionino manco un po'.
Occorre dirgli esplicitamente di sostituire i due spazi consecutivi con uno solo:
?Replace("ciao  java", "  ", " ")
ciao java
-- 
hth, hal

 altri cambi non funzionino manco un po'.
Strano :( Non stai sbagliando. Forse devi ricordarti di ciclare finche'
la condizione e' "nessun doppio spazio", altrimenti la stringa
"ciao      java" (con 6 spazi) diventa "ciao   java" (con 3 spazi).
Andava bene il while...wend, oppure:
    Do While InStr(s, "  ")
        s = Replace(s, "  ", " ")
    Loop
CIAO!

 ciao java
purtroppo non e' cosi' semplice.
ho provato a mettere un debug.print e
il povero vb interpreta "f" come la stringa che gli passo
per cui con
    ReplaceTableChar "indice", "indnome"
f, e di conseguenza s, restano sempre "indnome".
tonto io.
ma non basta.
ho provato nella procedura
    Set rs = db.OpenRecordset(t)
    Set fd = db.TableDefs.Fields(f)
ma mentre il nome della tabella lo piglia, su fields si blocca e mi da'
oggetto o metodo sconosciuto.
idem o quasi con
    Set fd = rs.Fields(f)
    With rs
        .MoveFirst
        frmUtils.lblSegniChar = ":"
        Do While Not .EOF
            s = !fd
come faccio a passargli un campo ?
grazie, a.

 CIAO!
grazie per la collaborazione, ma il prob sta nel passare i nomi di campo.
come routine diretta, coi nomi hardcoded nel set, andava ok.
dato che sull'instr ho sempre dei dubbi, il while l'ho tolto per essere
sicuro che almeno una volta il campo lo spazzolasse.
ciao, a.

oggetto o metodo sconosciuto.
Hai provato a dichiararlo esplicitamente come DAO.Field ?
Non vorrei che quel frescone di vb decidesse che ADO sia piu' importante
e cerchi di assegnare un DAO.Field ad un ADO.Field
-- 
ciao, hal

 ciao, a.
hai provato a dimensionare f come Field anziche' String?
ciao. buc


Public Sub ReplaceTableChar(t As String, f As String)
    Dim db As Database, rs As Recordset, s As String
    Set db = OpenDatabase("mca.mdb")
    Set rs = db.OpenRecordset(t)
    frmUtils.lblSegniTable = t & " - " & f
    With rs
        .MoveFirst
        frmUtils.lblSegniChar = ":"
        Do While Not .EOF
            s = Trim( rs.fields(f) )
            If InStr(s, ":") Then
                s = Replace(s, ":", " : ")
            End If
            If InStr(s, ";") Then
                s = Replace(s, ";", " ; ")
            End If
            If InStr(s, ">") Then
                s = Replace(s, ">", "> ")
            End If
            If InStr(s, "<") Then
                s = Replace(s, "<", " <")
            End If
            'While InStr(s, Chr(32) & Chr(32))
            'While InStr(s, Chr(32) & Chr(32)) <> 0
                s = Replace(s, Chr(32) & Chr(32), Chr(32))
            'Wend
            s = Trim(s)
            .Edit
            rs.fields(f)  = s
            .Update
            .MoveNext
        Loop
    End With
    rs.Close: Set rs = Nothing
    db.Close: Set db = Nothing
End Sub
ciao
ugo

 ciao. buc
ci avevo pensato nello scrivere la sub, ma a un primo giro non gli era
piaciuta granche', neanche t as tabledef.
quando ho
con calma cerco di riprovarci.
garzie, a.

             s = Trim( rs.fields(f) )
mah, ho smacchinato un po' con rs.fields() e rs! e salvo che nel set non
gradiva molto.
grazie, a.

 e cerchi di assegnare un DAO.Field ad un ADO.Field
be' intanto questo e' "recordset definition" in msdn:
A rowset provided through ActiveXT Data Objects (ADO).
si facessero...
e quelli che mi costringono a dimmare in dao cosa sono ?
tornando, piu' piacevolmente, a noi, forse cosi' va
(fa schifo ma forse va)
(almeno, i doppi spazi li ha tolti):
ciao, a.
Option Explicit
Public Sub ReplaceTableChar(t As String, f As String)
    Dim db As Database, rs As Recordset, fd As Field, s As String
    Set db = OpenDatabase("mca.mdb")
    Set rs = db.OpenRecordset(t)
    Set fd = rs.Fields(f)
    frmUtils.lblSegniTable = t & " - " & f
    With rs
        .MoveFirst
        frmUtils.lblSegniChar = ":"
        Do While Not .EOF
If Not IsNull(fd) Then 'prima non dava mai invalid use of null :))
            s = fd
'Debug.Print "prima: " & s
            If InStr(1, s, ":", vbTextCompare) Then
                s = Replace(s, ":", " : ")
            End If
            If InStr(1, s, ";", vbTextCompare) Then
                s = Replace(s, ";", " ; ")
            End If
            If InStr(1, s, ">", vbTextCompare) Then
                s = Replace(s, ">", "> ")
            End If
            If InStr(1, s, "<", vbTextCompare) Then
                s = Replace(s, "<", " <")
            End If
            While InStr(1, s, Chr(32) & Chr(32), vbTextCompare) <> 0
                s = Replace(s, Chr(32) & Chr(32), Chr(32))
            Wend
            s = Trim(s)
'Debug.Print "dopo: " & s
'DoEvents
            .Edit
            fd = s
            .Update
End If


 ha scritto nel messaggio
news:9ttqjn$4tsu7$1...@ID-51318.news.dfncis.de...

sorry...
ho dimenticato:
s = Trim( rs.fields(f) ).value
sai com'è... troppo tempo che non uso Dao...     :-PPPP
ciao
ugo

 come faccio a passargli un campo ?
Public Sub ReplaceTableChar(t As String, f As String)
    Dim db As Database, rs As Recordset, s As String
    Set db = OpenDatabase("mca.mdb")
    Set rs = db.OpenRecordset(t)
    frmUtils.lblSegniTable = t & " - " & f
    With rs
        .MoveFirst
        frmUtils.lblSegniChar = ":"
        Do While Not .EOF
[...]
            s = Trim(s)
            .Edit
            .(f) = s <----------------------------------
ciao
Alfonso

 sai com'è... troppo tempo che non uso Dao...     :-PPPP
vedo...
ti sei perfino dimenticato che .value e' il default.
mai scritto una volta da 5 anni in qua :PP
ps- immagino che in ado invece vada specificato...
si sa mai che uno non stia sprecando tempo abbastanza... magari di default
vuole la proprieta' name del campo clicod... meglio scrivere anche v-a-l-u-e
(senza trattini) :PP
    ? 
adodb.rs
!
clicod.name
    ---> clicod
ciado, j.

 ps- immagino che in ado invece vada specificato...
no, è di default anche lì, ma... mai lasciare implicite le proprietà di
default!!!!
ciao
ugo

 vergogna: mai lasciare implicite le proprietą di default!!!!
lblCnt := txtCnt := !cnt
:)
la volta che cambiano il default del field il mondo occidentale si ferma...

             .(f) = s <----------------------------------
riemergi dal nulla per risollevarmi !
a questo punto
    Set fd = rs.Fields(f)
e
     s = fd
sembrano reggere.
appena mi riprendo dalla tua apparizione ci provo.
ma allora perche' s = !f / !f = s non gli piacevano ?

 ha scritto nel messaggio
news:9ttuff$4uu3q$1...@ID-51318.news.dfncis.de...

ehm... non vorrei insistere, ma la soluzione di Alfonso è identica alla mia,
tranne per il riferimento implicito all'insieme fields...
...c'è qualcosa che non quadra...
la tua Set dell'oggetto field potrebbe funzionare dal momento che esplicita
il riferimento all'oggetto filed, ma non vedo ragione per cui il riferimento
diretto al field(name) non debba andare...
ciao
ugo

 diretto al field(name) non debba andare...
aaargh !
mi costringete a sostituire del codice (urgente) che va con uno di prova...
debbo amarvi proprio molto
d'altronde a alfonso mica gli ho detto che il suo codice andava. ho solo
detto che mi faceva piacere risentirlo. poi agli amici, per fargli piacere,
posso anche mentire :PPP
ho rimesso:
    Dim db As Database, rs As Recordset, s As String
    Set db = OpenDatabase("mca.mdb")
    Set rs = db.OpenRecordset(t)
    frmUtils.lblSegniTable = t & " - " & f
    With rs
        .MoveFirst
        frmUtils.lblSegniChar = ":"
        Do While Not .EOF
            s = .(f)
-> syntax error sull'assegnazione
sembra andare questo:
    Dim db As Database, rs As Recordset, fd As Field, s As String
    Set db = OpenDatabase("mca.mdb")
    Set rs = db.OpenRecordset(t)
    Set fd = rs.Fields(f)
    frmUtils.lblSegniTable = t & " - " & f
    With rs
        .MoveFirst
        frmUtils.lblSegniChar = ":"
        Do While Not .EOF
            s = fd
d'altronde se field e' un oggetto andra' settato +- come la tabella.
seno' evidentemente vb stringa lo considera.
plz non fatemici rimettere mano...
se poi un va cchiu'...
a.

 se poi un va cchiu'...
;-)
ciao
ugo

 So che ho la testa dura ma proverei...
molto dura :P
a leggere _il_ .value, implicito o esplicito che sia, mi sa che non ci
arrivo finche' vb non capisce che se gli passo il par "clicod" lui deve
analizzare non "clicod" ma il suo contenuto. in clipper bastava &clicod o
(clicod), ma vb un la capisce senza il set. almeno mi sembra.
al codice rimetto mano con molta calma :P

 vergogna: mai lasciare implicite le proprietà di default!!!!
ho letto su MSDN che è sempre meglio mettere il meno possibile l'operatore "
. " e quindi usare il + possibile le proprietà di default senza dichiararle.
FROM MSDN:
(mk:@MSITStore:C:\Programmi\Microsoft%20Visual%20Studio\MSDN98\98VSa\1040\vb
con98.chm::/Html/vbconoptimizingobjects.htm)
Riduzione al minimo dei punti nel codice
Quando si fa riferimento a oggetti di altre applicazioni da Visual Basic,
viene utilizzata la sintassi basata sul punto "." per spostarsi nella
gerarchia di insiemi, oggetti, proprietà e metodi di un oggetto. Questo tipo
di sintassi comporta tuttavia la creazione di stringhe particolarmente
lunghe. Ad esempio:
' Fa riferimento alla cella A1 del Foglio1 nella
' prima cartella di lavoro di un foglio di
' calcolo di Microsoft Excel.
Application.Workbooks.Item(1).Worksheets.Item_
("Foglio1").Cells.Item(1,1)
Oltre a essere una stringa piuttosto lunga da digitare, questa riga di
codice risulta difficile da leggere ed è estremamente poco efficiente.
Quando si richiama un oggetto da Visual Basic, per ciascun "punto" sono
necessarie più chiamate.
Per scrivere applicazioni il più possibile efficienti, ridurre al minimo
l'utilizzo di punti quando si fa riferimento a un oggetto.
È in genere possibile ridurre al minimo i punti analizzando gli oggetti e i
metodi disponibili. La riga di codice riportata di seguito, ad esempio, può
essere abbreviata rimuovendo il metodo Item, che rappresenta comunque il
metodo predefinito per gli insiemi e pertanto viene utilizzato di rado nel
codice, e optando invece per il più efficiente metodo Range:
' Fa riferimento alla cella A1 del Foglio1 nella
' prima cartella di lavoro di un foglio di
' calcolo di Microsoft Excel.
Application.Workbooks(1).Worksheets("Foglio1")_
.Range("A1")
È possibile abbreviare ulteriormente il codice riscrivendolo in modo che
faccia riferimento al foglio attivo della cartella di lavoro attiva, anziché
a un foglio specifico di una cartella di lavoro specifica:
' Fa riferimento alla cella A1 del foglio attivo
' della cartella di lavoro attiva.
Range("A1")
Questo esempio presuppone che sia possibile fare riferimento alla cella A1
di qualsiasi foglio attivo in un determinato momento.
Ciao SIMONE

 lunghe.
piu' che parlare della proprieta' di default, mi sembra che questo msdn
suggerisca di evitare scritture tipo
    rs.fields!pippo=
e propronga qc come
    with rs
        !pippo =
    end with
il che se posso cerco di fare.
sul default ha ragione ugo, ma, scherzi a parte, di solito lo uso in modo
tale che se davvero per qualche motivo -- posto che vb esista ancora -- ms
lo cambiasse, davvero l'80 per cento dei programmi si fermerebbe al primo
rebuild.
vabbe' scrivere
    lblpippo.caption
    txtpluto.text
che mi sa comunque siano usati non da tutti (da me no senz'altro), ma mi
piacerebbe un sondaggio su quanti del ng davvero scrivono
    rs!pippo.value =
grazie cmq per l'appoggio :)
ciao, a.

 dichiararle.
Sì, poi però (vedi .net) ti cambiano le proprietà di default...
Io sono uno dei pazzi che specificano sempre tutto, .Text e .Caption
incluse. E che non dorme bene se non infarcisce tutte le routine di valanghe
di With...
Un'altra asinata che mi permetto di fare in barba alle guide è l'uso
dell'operatore New... In tutti i test di prestazioni che ho fatto ho
constatato un aumento di velocità grazie ad una dichiarazione Dim... As
New... mentre tutti lo sconsigliano.
Mah...
Ciao,
Carlo.

Mah...
Prova il codice qui sotto e ti apparira' lampante.
Crea una classe Class1 e mettici questo codice:
----- inizio codice di Class1.cls-------
Option Explicit
Private m_Nome As String
Public Property Get Nome() As String
    Nome = m_Nome
End Property
Public Property Let Nome(ByVal vNewValue As String)
    m_Nome = vNewValue
End Property
--------- fine codice di Class1.cls -------
In un modulo aggiungi questo:
............... inizio codice di Module1.bas -------
Option Explicit
Public Sub Main()
    Dim c As New Class1
 
    c.Nome = "ciccio"
    MsgBox c.Nome
 
    Set c = Nothing
 
    If (c Is Nothing) Then
        MsgBox "c is nothing"
    Else
        MsgBox "c e' stato nuovamente istanziato"
    End If
End Sub
----------------- fine codice di Module1.bas ------
Il New di v b e' infingardo :-(
-- 
ciao, hal


Verificato e provato:
Public Sub ReplaceTableChar(t As String, f As String)
    Dim db As Database, rs As Recordset, s As String
    Set db = OpenDatabase("mca.mdb")
    Set rs = db.OpenRecordset(t)
    frmUtils.lblSegniTable = t & " - " & f
    With rs
        .MoveFirst
        frmUtils.lblSegniChar = ":"
        Do While Not .EOF
                                                            <==== qui
sarebbe il caso di testare i casi di null etc...
            s = Trim( rs.fields(f).value )        <==== s è String e gli
assegno i _valore_  del campo di nome f
            If InStr(s, ":") Then
                s = Replace(s, ":", " : ")
            End If
            If InStr(s, ";") Then
                s = Replace(s, ";", " ; ")
            End If
            If InStr(s, ">") Then
                s = Replace(s, ">", "> ")
            End If
            If InStr(s, "<") Then
                s = Replace(s, "<", " <")
            End If
            'While InStr(s, Chr(32) & Chr(32))
            'While InStr(s, Chr(32) & Chr(32)) <> 0
                s = Replace(s, Chr(32) & Chr(32), Chr(32))
            'Wend
            s = Trim(s)
            .Edit
            rs.fields(f).value  = s        <==== s continua ad essere string
e assegno il suo valore al _valore_ del campo di nome f
            .Update
            .MoveNext
        Loop
    End With
    rs.Close: Set rs = Nothing
    db.Close: Set db = Nothing
End Sub
ciao
ugo.hardheaded

 Crea una classe Class1 e mettici questo codice:
[...]
Sì, lo so...
Io mi riferivo alle prestazioni: nonostante quello che si trova scritto qua
e là, dichiarare con New è più veloce (non sempre).
Questo non significa che lo consigli ;-)
Ciao,
Carlo.

 ha scritto nel messaggio
news:9tvkp0$4ua$1...@pegasus.tiscalinet.it...

In quest'ottica mi associo.
E sottoscrivo pure le ottime abitudini di specificare tutto e di abbondare
di contrutti with.    :-)
ciao
ugo

 ugo.hardheaded
mi arrendo.
basta. pieta'. surrender.
j.softheaded
se hero hard headed handavo hin hun ng di hw...

 ha scritto nel messaggio
news:9u0383$5c91f$1...@ID-51318.news.dfncis.de...

mmm...
j.headache on?     :-(
me.guilty?            :-(
bye
ugo

 me.guilty?            :-(
figurati...
guilty...
proprio tu...
il coccolatore ufficioso...
figurati...
pero' non azzardarti a chiedermi di ritoccare il codice. stamattina alla
demo davanti al destinatario
CLANG ! loop without do
---> non avevo scommentato un endif
CLANG ! end with
CLANG ! var non dichiarata
e io paonazzo... "ierisera andava benone... chissa' che gli ha preso...
proprio non riesco a immaginarlo..."
alla fine a forza di ritocchi a vista (dell'utente) l'ho scampolata, ma non
chiedrmi altro... :))


Vai ad aiutare gli amici...    ;-)
ciao
ugo

 Ufficiale, prego, ufficiale...
mi dev'essere sfuggito il comma del manifesto :)

 ha scritto nel messaggio
news:9u0enk$5d8a9$1...@ID-51318.news.dfncis.de...

E' vero... manca il relativo comma... bisogna provvedere subito!!!!
:-PPPPP
ciao
ugo

     rs!pippo.value =
Che ha voler essere pignoli dovrebbe essere
    rs.Fields!pippo.value =
-- 
Samuele Battarra
prova il mio newsreader:
http://digilander.iol.it/battarsa/programmi/news/

 ha scritto nel messaggio
news:29200.2001...@news.libero.it...


     rs.Fields!pippo.value =
che a voler essere molto pignoli dovrebbe essere
    db.rs.fields!pippo.value =
che
    ws.db.rs.fields!pippo.value =
il sondaggio mi piacerebbe sempre di piu' :)