ho un campo "descrizione" di tipo memo che contiene un testo attorno ai 500
caratteri fra cui dei ritorno a capo che mi creano dei problemi .
Vorrei primo individuarli, magari con l'istruzione InStr all'interno di una
query, e quindi eliminarli... purtroppo pero' non riesco a beccarli in
nessun modo :-(
C'e' qualcuno che mi puo' dare una mano ?
GRazie
Fabio
La prima cosa che mi viene in mente....
magari non è la più efficiente... ma dovrebbe fungere...
Function PulisciStringa(MiaStringa as String) as String
Dim Ch as String * 1 'Si risparmia memoria ?? mah? ai posters l'ardua
sentenza....
Dim x as Integer
Dim Comodo as String
Comodo = ""
for x = 1 to len(MiaStringa)
Ch = mid(MiaStringa, x, 1)
if asc(Ch) = 13 or asc(Ch) = 10 then 'intercettiamo i cr e i nl
non zi sa mai...
Comodo = Comodo & " "
else
Comodo = Comodo & ch
end if
next x
PulisciString = Comodo
end function
Secondo me diventa tutto di una lentezza spaziale....
magari c'è una API che fa già queste cose guardaci...
che con API si vola... (a volte anche sotto)
Ciao
Dario
vediamo se riusciamo a migliorarla con instr:
function togliacapo(s as string) as string
dim p as long ' esageriamo...
dim oldp as long ' riesageriamo...
dim arrcrlf(1) as string
dim i as integer
arrcrlf(0)= chr(13)
arrcrlf(1)= chr(10)
oldp=1
for i = 0 to 1
do
p = instr(oldp, s, chr(i))
if p = 0 then
exit do
end if
mid(s,p,1) = " "
oldp = p+1
loop
next i
togliacapo = s
end function
ho preferito anche io controllare separatamente il cr e il lf invece
che cercare la combinazione dei due perché proprio di recente ho
dovuto trattare dei testi di origine mac in cui a volte c'erano tutti
e due e a volte no...
inconvenienti: se ci sono tutti e due tra una parola e l'altra possono
esserci due spazi, ma pazienza, questo si risolve in un altro modo.
--
non studio non lavoro non guardo la tv
non vado al cinema non faccio sport
----------------------------------------
il sito comune di it.comp.appl.access:
http://members.xoom.it/it_db_access
Con l' istruzione INSTR setta come stringa di ricerca chr$(10) e poi
CHR$(13)
Spillo <fa...@NOSPAMspilimbergo.com> wrote in message
Ho provato sulle query ma mi ritorna sempre campi vuoti ...c'e' qualcosa che
non torna :-(
Ho inserito la funzione e l'ho inserita sull'evento on_click di un
pulsante... ora mi manca di sapere come lancio la funzione e come gli dico
di andare a "ceccare" sulla tabbela "FILM" nel campo "DESCRIZ" ...
Grazie e perdona l'ignoranza!
Fabio
mah, non ho capito bene cosa vuoi fare... se vuoi lavorare
direttamente su una tabella devi anche sapere in che record (riga)
scrivere.
forse vuoi lavorare sul record corrente di una maschera collegata ad
una tabella. allora puoi intervenire sui controlli della maschera,
non sui campi. i controlli sono legati ai campi, per cui quello che
scrivi sui controlli va a finire nei campi ma campi e controlli non
sono la stessa cosa.
in questo caso, se il controllo si chiama descriz prova con:
me.descriz = true
se no spiega meglio...
Ho una tabella che si chiama "FILM" composta da vari campi fra cui uno
"DESCRIZ" ovvero la descrizione del film e in cui si trovano anche i
"maledetti" caratteri di ritorno a capo che vorrei eliminare.
i record sono ca. 2800, mi piacerebbe che la funzione che mi hai postato
andasse a pescare record per record eliminando i caratteri di ritorno a
capo...
....ho creato una maschera con un pulsante di comando, ho inserito il codice
della funzione sull'evento "on-click" e ora mi manca il pezzo di codice che
lega la funzione ai record di quella tabella in quel campo...
Grazie mille per la tua cortesia!!
PS: se ti interessa un database di tutti i film su VHS aggiornato a
Settembre, te lo mando come premio! ;-)
Fabio
intanto fai una copia della tabella per sicurezza...
poi. una funzione prende un valore e ne restituisce un altro, e
questa è una cosa. esistono le query di aggiornamento, che modificano
i recorde questa è un'altra cosa. le funzioni si possono usare nelle
query. mischia tutto, cosa ottieni?
ottieni che apri una query, ci carichi la tabella, la trasformi in
query di aggiornamento, metti nella colonna il campo da aggiornare,
nella casella "aggiorna a" ci scrivi: NomeFunzione([NomeCampo]), e
vedi che succede...
questo è il metodo più rapido da spiegare e forse anche il più veloce
in termini di prestazioni.
una cosa didatticamente più utile sarebbe che ti aprissi un recordset
sulla tabella, lo scorressi tutto quanto e record per record editassi
il campo in questione. qualcosa del genere:
dim rst as recordset
set rst=currentdb.openrecordset("nometabella")
do until rst.eof
rst.edit
rst!nomecampo = nomefunzione(rst!nomecampo)
rst.update
rst.movenext
loop
Questa funza dovrebbe andare, copiala in un modulo
Public Function TogliACapo(stringa As String) As String
If IsNull(stringa) Then TogliACapo = "": Exit Function
Dim strTemp As String
While InStr(stringa, vbCrLf) > 0
strTemp = strTemp & Left(stringa, InStr(stringa, vbCrLf)
- 1) & " "
stringa = Right(stringa, Len(stringa) - (InStr(stringa,
vbCrLf) + (Len(vbCrLf) - 1)))
Wend
TogliACapo = strTemp & stringa
End Function
Poi esegui un bel
update tabella set campo=TogliACapo(campo)
>PS: se ti interessa un database di tutti i film su VHS aggiornato a
>Settembre, te lo mando come premio! ;-)
Parli sul serio? 8-)
--
Lorenzo Coronati
--
<<Si perché forse Ilbo (ed altri come lui) sono
convinti che noi poveri principianti (nel senso
ironico) scrivano le domande senza pensare.>>
(Ivan Lelli, 25/08/2000)
--
<<se il lavoro non me lo dai tu, me lo da
un'altro stronzo che non capisce una sega
di access e di informatica in generale>>
(Ivan dal lavoro, 30/09/2000)
--
Private Sub cmdPulisci_Click()
Dim rst As Recordset
Set rst = CurrentDb.openrecordset("FilmMySQL")
Do Until rst.EOF
rst.edit
rst!DESCRIZ = togliacapo(rst!DESCRIZ)
rst.Update
rst.MoveNext
Loop
End Function
Function togliacapo(s As String) As String
Dim p As Long ' esageriamo...
Dim oldp As Long ' riesageriamo...
Dim arrcrlf(1) As String
Dim i As Integer
arrcrlf(0) = Chr(13)
arrcrlf(1) = Chr(10)
oldp = 1
For i = 0 To 1
Do
p = InStr(oldp, s, Chr(i))
If p = 0 Then
Exit Do
End If
Mid(s, p, 1) = " "
oldp = p + 1
Loop
Next i
togliacapo = s
End Function
Ma Access 2000 non sembra gradire affatto :-(
Trova un errore di compilazione sulla riga "rst.edit" ... ho sbagliato
qualcosa?
Anche inserendo la funzione sulla Query di Aggiornamento ricevo un messeggio
di errore :-(
Se hai ancora un attimo di pazienza grazie, altrimenti andro' a manina ;-))
ecc.
mi pare vada bene...
Si, ma mi sa che faccio prima a mandarti tutto e a farmelo rimandare
indietro pulito dai ritorno a capo :-)
non ne salto fuori :-(
Ciao
Fabio ;-)
Nota che i campi memo ( e binari) devono venir trattati in maniera
diversa dai campi normali:
Vedi i metodi GetChunk e AppendChunk nell' Online help
La Sub ChiamalaComeTiPare e' parte estrapolata da una Sub molto piu'
lunga e complessa, che trattava piu' campi memo in Array, e spero di
non aver trascurato ne punti fermi ne punti esclamativi durante la
estrapolazione.
Nella Funzione ErsetzeStr rimpiazzi naturalmete la stringa
" NEUEZEILE " con quella che ti serve (" " per esempio)
MSAccess 08
Sub ChiamalaComeTiPare
Dim MemoWertStr as String 'Valore nel Memo
Dim MemoGrsLng as Long 'lunghezza del Memo
Dim MySet as recordset
Dim MemoFld as Field
Set MySet = Currentdb.OpenRecordset ("Film")
With MySet
Set MemoFld = .Fields("Descriz")
Do While Not .EOF
If Not IsNull(MemoFld) Then
MemoGrsLng = Len(MemoFld)
MemoWertStr = MemoFld.GetChunk(0, MemoGrsLng)
MemoWertStr = ErsetzeStr(MemoWertStr, 0)
.Edit
MemoFld = ""
MemoFld.AppendChunk MemoWertStr
.Update
End If
.MoveNext
Loop
End With
MySet.Close
End Sub
Public Function ErsetzeStr(TextInStr As String, NeuFlag As Integer) _
As String
'Parametri:
'TextInStr = Stringa da elaborare
'NeuFlag = 0 - Da Memo a Txt:
' Rimpiazza "Chr(13) & Cht(10)" con la stringa " NEUEZEILE "
'NeuFlag <> 0 Da Txt a Memo:
'Rimpiazza la stringa " NEUEZEILE " con "Chr(13) & Chr(10)"
Dim WorkTextStr As String, PointerInt As Integer
Dim NeuStr As String, SuchStr As String
Dim Msg as String
On Local Error GoTo ErsetzeStr_Err
If NeuFlag = 0 Then
NeuStr = " NEUEZEILE "
SuchStr = vbcrlf
Else
SuchStr = " NEUEZEILE "
NeuStr = vbcrlf
End If
If IsNull(TextInStr) Then
ErsetzeStr = Null
Else
WorkTextStr = TextInStr
PointerInt = InStr(1, WorkTextStr, SuchStr, 0)
Do While PointerInt > 0
WorkTextStr = Left(WorkTextStr, PointerInt - 1) & NeuStr & _
Mid(WorkTextStr, PointerInt + Len(SuchStr))
PointerInt = InStr(PointerInt + Len(NeuStr), WorkTextStr, _
SuchStr, 0)
Loop
ErsetzeStr = WorkTextStr
End If
ErsetzeStr_End:
Exit Function
ErsetzeStr_Err:
Msg = "Error Information..." & vbcrlf & vbcrlf
Msg = Msg & "Function: ErsetzeStr" & vbcrlf
Msg = Msg & "Description: " & Err.Description & vbcrlf
Msg = Msg & "Error #: " & Format$(Err.Number) & vbcrlf
MsgBox Msg, vbInformation, "ErsetzeStr"
Resume ErsetzeStr_End
End Function
--
Tommaso Cafini _...@rhein-neckar.netsurf.de_
_tca...@gmx.net_
PGP-KeyID = C922A2B1
Key fingerprint = 7C 9E 72 C5 11 06 A7 67 54 03 FF 02 4C 90 39 F5