Newsgroup: it.comp.lang.visual-basic
Titolo: concatenare stringhe senza spazio in mezzo

boh, non so che dire: non mi ricordo che mi sia mai successo, ma non
riesco a risolvere questo problema --del cavolo--.
dal database leggo una stringa, che e' un numero di matricola, nella
forma TSMaaxxxx, con aa anno di produzione e xxxx progressivo che ogni
anno parte da 0000.
dopo aver fatto n operazioni, devo incrementare di 1 il numero di
matricola. allora ho tagliato la stringa, ho isolato xxxx, ho fatto un
val() per avere il numero corrente, ho aumentato di 1 il numero, ho
fatto un str() per passare ad una stringa e ho fatto il pad con degli
0 per tornare ad un numero di 4 cifre --ad esempio, 15 non va bene:
devo avere 0015--.
alla fine, infatti, voglio avere i 2 pezzi TSMaa e xxxy per attaccarli
insieme.
il problema e' che quando faccio il pad mi resta uno spazio in mezzo.
ad esempio, se Progressivo="15", facendo "00" & Progressivo ottengo la
stringa "00 15" con uno spazio in mezzo.
non so come fare... volevo evitare il barbatrucco di tenermi
quell'idiota di spazio e di fare una replace(matricola," ","").
naturalmente, ho gia' guardato su google =)
ciao e grazie in anticipo.
-- 
      Gianni "bugbarbeq" Rondinini, 27+15, RA, 193, 152
   VBR - Vero Birro Romagnolo®, diffidate dalle imitazioni!
 BMW 530D "BatMobile EVO" Driver - Escortone da 500 CV dreamer
Kawasaki "Gas Gas" ZZ-R 1100 - HD Electra Ultra Classic Dreamer
   On contrary of popular belief, Unix *IS* user friendly:
    it just appears to be selective who it is friend with

 ha scritto nel messaggio
news:62k9lus4c0domhsjk...@4ax.com...

Bhoo !! L'unico consisglio è di provare ad usare Trim.
JKLJKL :-)

 stringa "00 15" con uno spazio in mezzo.
L' Str() lascia lo spazio per il segnio (lo dice anche la guida :P).
Al suo posto dovresti usare CStr().
Il mio consiglio è
Format$(15, "0000")
Ciao
--
y = f(
http://neodatatype.interfree.it/index.html
)

 quell'idiota di spazio e di fare una replace(matricola," ","").
stringa=right(10^digits+numero,digits)
ehm... ovviamente se numero è positivo

 naturalmente, ho gia' guardato su google =)
<code tested="false">
numero_matricola = left$(numero_matricola,
len(numero_matricola) - 4) &
format$(val(right$(numero_matricola, 4)) + 1, "0000")
</code>
Ciao.
--
BSD is for UNIX-lovers -- linux is for Windows-haters.

ciao.
come al solito, quando trovo una soluzione decente ad un problema, la
posto cosi' magari e' utile per qualcuno.
ho deciso di procedere cosi':
[...]
    Else
        'carrello con matricola speciale
        'lavoro sul formato della matricola
        PosProgressivo = InStr(1, Formato, "x")
        LenProgressivo = Len(Formato) - PosProgressivo + 1
        Progressivo = Mid(Matr, PosProgressivo, LenProgressivo)
        Progressivo = Replace(Str((Val(Progressivo) + 1)), " ", "")
 
        Do While (Len(Progressivo) < LenProgressivo)
            Progressivo = "0" & Progressivo
        Loop
[...]        
note al problema:
- a seconda del tipo di carrello, la matricola puo' avere formati
differenti. prima di fare le cose di cui sopra, leggo dal database il
formato della matricola e lo metto dentro a Formato. ad esempio, sono
possibili i formati TPWaaxxxx, TSMaaxxxxx, aammxxx e cosi' via, quindi
il pad con gli zeri puo' dover dare risultati differenti
- cosi' sembra andare veloce
- la replace potrebbe essere una trim(str(val(progressivo)+1)), ma ho
preferito lasciarla cosi' perche' cosi' ho il codice uguale in un
altro punto del programma nel quale concateno piu' stringhe e quindi
dovrei fare piu' trim. infatti, altrove devo cambiare anche aa ed mm.
grazie dei consigli.
saluti.


 [...]
Scusa, ma di tutto ciň che č sopra, non č meglio una ben piů
semplice:
<code>
Progressivo = Format$(Val(Right$(Matr, LenProgressivo)) + 1,
String$(LenProgressivo, "0"))
<code>
?


 naturalmente, ho gia' guardato su google =)
    Dim sCod  As String * 9
    sCod = "TSM020000"
    Mid$(sCod, 6, 4) = Format$(Val(Mid$(sCod, 6, 4)) + 1, "0000")
    Debug.Print sCod
--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------

 ha scritto
Passatempo d'un piovoso sabato d'agosto:
Function nuova_matricola(matricola_attuale As String, formato As String,
crt_identificazione_campo As String, Optional nuovo_valore_campo As String =
"+1")
'   Restituisce la matricola modificata (">En" se parametri errati)
'
'   Note ai parametri:
'
'   matricola_attuale           Passare la matricola effettiva da modificare
'
'   formato                     Passare il formato "generico" della
matricola
'
'   crt_identificazione_campo   Passare il carattere che indica il tipo di
campo
'                               da trattare ("a", "x", etc.)
'
'   nuovo_valore_campo          (Default="+1"):
'                               "+n...n"    Incrementa di "n...n"
'                               "-n...n"    Decrementa di "n...n"
'                               "=n...n"    Assegna il valore "n...n"
'       Cerca inizio e fine campo
    pos_crt_inizio_campo = 0
    pos_crt_fine_campo = 0
    For num_crt = 1 To Len(formato)
        If Mid(formato, num_crt, 1) = crt_identificazione_campo Then
            If pos_crt_inizio_campo = 0 Then
                pos_crt_inizio_campo = num_crt
            Else
                pos_crt_fine_campo = num_crt
            End If
        Else
            If pos_crt_fine_campo Then Exit For
        End If
    Next num_crt
'       Verifica se ha trovato inizio e fine
    If pos_crt_inizio_campo = 0 Or pos_crt_fine_campo = 0 Then
        nuova_matricola = ">E1"
        Exit Function
    End If
'       Ricava lunghezza campo
    lunghezza_campo = pos_crt_fine_campo - pos_crt_inizio_campo + 1
'       Ricava il valore attuale del campo
    valore_campo_attuale = Val(Mid(matricola_attuale, pos_crt_inizio_campo,
lunghezza_campo))
'       Ricava il valore di incremento, decremento o assegnazione
    valore_variazione = Val(Mid(nuovo_valore_campo, 2))
'       Ricava il valore nuovo del campo
    Select Case Left(nuovo_valore_campo, 1)
        Case "+"
            valore_campo_nuovo = valore_campo_attuale + valore_variazione
        Case "-"
            valore_campo_nuovo = valore_campo_attuale - valore_variazione
        Case "="
            valore_campo_nuovo = valore_variazione
        Case Else
            nuova_matricola = ">E2"
            Exit Function
    End Select
'       Verifica se troppi caratteri
    If Len(Trim(valore_campo_nuovo)) > lunghezza_campo Then
        nuova_matricola = ">E3"
        Exit Function
    End If
'       Ricompone la nuova matricola col nuovo campo
    nuova_matricola = Left(matricola_attuale, pos_crt_inizio_campo - 1) &
Right(10 ^ lunghezza_campo + valore_campo_nuovo, lunghezza_campo) &
Mid(matricola_attuale, pos_crt_fine_campo + 1)
End Function

 ha scritto
Ottimizzazione e correzione possibile errore:
'       Cerca inizio e fine campo
    pos_crt_inizio_campo = InStr(formato, crt_identificazione_campo)
    pos_crt_fine_campo = pos_crt_inizio_campo
    If pos_crt_inizio_campo Then
        For num_crt = pos_crt_inizio_campo + 1 To Len(formato)
            If Mid(formato, num_crt, 1) <> crt_identificazione_campo Then
Exit For
            pos_crt_fine_campo = num_crt
        Next num_crt
    End If

 End Function
La funzione è un po' troppo lunga e si occupa di troppi
compiti; sarebbe meglio dividerla in più funzioni più piccole,
che si occupino di un compito più specifico.


 che si occupino di un compito più specifico.
A parte il controllo di anomalie (che io, come detto, non inserisco mai) non
mi sembra particolarmente "piena". Credo che scomponendola (certo, si può
sempre spezzettare) in più funzioni più piccole se ne perda, ai fini di
questo post, la leggibilità e forse anche le prestazioni. Comunque, ripeto,
era solo un esempio.
Generalmente programmo in altro modo: Quando scopro di usare due o più volte
lo stesso artificio (in alcuni casi, a priori, anche per una volta sola),
anche se per pochissime righe di codice, faccio una Sub/Function adeguata.

 Comunque, ripeto, era solo un esempio.
Ovviamente la cura ed il tempo che si dedicano a scrivere
codice "reale" sono ben diversi da quelli che si dedicano a
scrivere esempi per il NG, però il tuo modo di scrivere
codice, di risolvere i problemi, per chi ti conosce attraverso
il "filtro" del NG, è quello che tu ci presenti nei messaggi
che scrivi.


<code>
forse potrebbe andare :) non ho provato :)
la soluzione, comunque, mi piace: e' molto c-style :)


    Debug.Print sCod
potrebbero non essere 4 gli zeri: quello sopra era solo un esempio.
comunque grazie: l'idea e' buona.
saluti.


 comunque grazie: l'idea e' buona.
    Non e' un'idea. E' BASIC! ;-)))


 la soluzione, comunque, mi piace: e' molto c-style :)
Purtroppo in VB non era possibile fare qualcosa che fosse un
po' più c++-style ;-)


po' più c++-style ;-)
questa era gia' abbastanza style-osa ;)
saluti geek :)
