Newsgroup: it.comp.appl.access
Titolo: Dividere/duplicare record con criteri

Ciao A tutti, data una tab origine:
id	Num	stringa
1	1247	AB/CC/DD/
2	1248	BB/ZZ/
Al cambio del campo Num, vorrei creare tanti record secondo quante
volte compare nel campo stringa il carattere / e creare una sequenza
numerica.
Per ottenere:
id	Num	stringa	SEQ
1	1247	AB	1
2	1247	CC	2
3	1247	DD	3
4	1248	BB	1
5	1248	ZZ	2
E' possibile? Sicuramente c'entrano recordset e cicli vero?
Grazie

 E' possibile? Sicuramente c'entrano recordset e cicli vero?
Direi che non hai molta scelta...
due recordset, uno coi dati da leggere e uno coi dati da scrivere,
utilizzi un contatore per ricordarti a che punto della riga sei
arrivato e fai un utilizzo intensivo della funzione instr per trovare
i / nella stringa.
Quando hai finito una stringa passi al record successivo.
Questo potrebbe aiutarti... scritto di getto, ha sicuramente bisogno
di qualche aggiustatina qui e la'
cnt=1
strIn=RS_IN!Stringa
Do
   cnt=instr(cnt,strIn,"/") 'trova il primo / dopo il cnt-esimo
carattere
   if instr(cnt+1,strin,"/") then  'se ci sono altri /...
      strOut=mid(strIn,cnt+1,instr(cnt+1,strIn,"/"))   '... prendi il
testo in mezzo
     else
      strOut=mid(strIn,cnt+1)  ' altrimenti prendi fino in fondo
     endif
   RS_Out.addnew
   RS_Out!Stringa=strOut
   RS_Out.refresh
   loop while instr(cnt+1,strin,"/")>0
cia'
Max


Grazie Max per l'indicazione, posso provarlo soltanto ora.

 - Mostra testo citato -
Non funziona! Per due righe nella tabella di origine, nella tabella di
destinazione mi ha creato milioni di record e non estra niente.
Posto il codice
Private Sub Comando0_Click()
Dim RS_IN As Recordset
Dim RS_Out As Recordset
Dim cnt As Integer
Set RS_IN = CurrentDb.OpenRecordset("TabIN", dbOpenDynaset)
Set RS_Out = CurrentDb.OpenRecordset("TabOUT", dbOpenDynaset)
cnt = 1
strin = RS_IN!Stringa
Do
   cnt = InStr(cnt, strin, "/") 'trova il primo / dopo il cnt-esimo
carattere
   If InStr(cnt + 1, strin, "/") Then 'se ci sono altri /...
      strOut = Mid(strin, cnt + 1, InStr(cnt + 1, strin, "/")) '...
prendi il testo in mezzo
     Else
      strOut = Mid(strin, cnt + 1) ' altrimenti prendi fino in fondo
     End If
   RS_Out.AddNew
   RS_Out!Stringa = strOut
   RS_Out.Update
   Loop While InStr(cnt + 1, strin, "/") > 0
    RS_IN.Close
    RS_Out.Close
    Set RS_IN = Nothing
    Set RS_Out = Nothing
End Sub

 destinazione mi ha creato milioni di record e non estra niente.
Bella forza, non gli hai detto di andare al primo record di RS_In
(RS_In.Movefirst), di passare al record successivo quando ha finito di
smandruppare la stringa (RS_In.movenext) ne' di finirla li' quando
finisce il recordset (loop until RS_In.EOF) ...
cia'
Max


dove dovrei inserirlo?

Set RS_IN = CurrentDb.OpenRecordset("TabIN", dbOpenDynaset)
Set RS_Out = CurrentDb.OpenRecordset("TabOUT", dbOpenDynaset)
cnt = 1
RS_In.movefirst
Do
  strin = RS_IN!Stringa
  Do
     cnt = InStr(cnt, strin, "/")
     If InStr(cnt + 1, strin, "/") Then
        strOut = Mid(strin, cnt + 1, InStr(cnt + 1, strin, "/"))
       Else
        strOut = Mid(strin, cnt + 1)
       End If
     RS_Out.AddNew
     RS_Out!Stringa = strOut
     RS_Out.Update
     Loop While InStr(cnt + 1, strin, "/") > 0
  RS_In.movenext
  Loop until RS_In.EOF
cia'
Max

 ha scritto nel messaggio 
news:a209416f-764a-43cd...@g38g2000yqd.googlegroups.com...

Ciao Max
abbi pazienza, non volermene ...almeno una riga di quoting?
magari, potevi lasciare soltanto la domanda e si capiva
dove andava messo ....
:<))
buon WE
Daniele 

 - Mostra testo citato -
Grazie max! Ma per due record della TabIN ci mette dieci minuti e poi
s'inchioda tutto

 s'inchioda tutto- Nascondi testo citato
Non volermene, ma almeno un minimo di debug? Riguardando con
attenzione il codice, c'e' un errore grosso come una casa (anzi, due),
vale a dire il ciclo si ripete all'infinito perche' la scansione della
stringa non supera mai il primo /...
Prova cosi'
Set RS_IN = CurrentDb.OpenRecordset("TabIN", dbOpenDynaset)
Set RS_Out = CurrentDb.OpenRecordset("TabOUT", dbOpenDynaset)
cnt = 1
RS_In.movefirst
Do
  strin = RS_IN!Stringa
  Do
     cnt = InStr(cnt, strin, "/")
     If InStr(cnt + 1, strin, "/") Then
        strOut = Mid(strin, cnt + 1, InStr(cnt + 1, strin, "/")-cnt
+1)
       Else
        strOut = Mid(strin, cnt + 1)
       End If
     RS_Out.AddNew
     RS_Out!Stringa = strOut
     RS_Out.Update
     cnt=cnt+1
     Loop While InStr(cnt, strin, "/") > 0 and cnt<len(strin)
  RS_In.movenext
  Loop until RS_In.EOF
No, non l'ho provato....
cia'
Max


Questo è quello che ottengo:
ID	Num	stringa
1		CC/D
2		DD/
3
4		BB/Z
5		ZZ/
6
Partendo da:
ID	Num	stringa
1	1247	AB/CC/DD/
2	1248	BB/ZZ/
E' un passo avanti, ma...Grazie e scusami

dottce...@iol.it
 ha scritto:

Dim aStr as variant, vItem as variant, i as long
aStr = split(stringa,"/")
for for i = 0 to ubound(aStr)
    ........qui scrivi il record come: id=id,Num=num, stringa=aStr(i), 
seq=i+1
next

Alessandro Cara ha scritto:

ovviamente manca la do while sul Rs_in
do until rs_in!eof
   for i = 0 to ubound(aStr)
     .....qui scrivi il RS_out come:id=id,Num=num,stringa=aStr(i),seq=i+1
   next
   rs_in.movenext
loop
....e la specifica di scrittura su RS_out
--
ac

 - Mostra testo citato -
Grazie Alessandro, puoi gentilmente spiegarmi che significa:


 - Mostra testo citato -
Grazie Alessandro, ma che significa


 - Mostra testo citato -
Ciao Alessandro, ma che significa:
qui scrivi il record come: id=id,Num=num, stringa=aStr(i),
Grazie ancora

 - Mostra testo citato -
Perdonate la ripetizione, ma si era inchiodato il browser

 
questa e' la routine completa:
Dim aStr as variant,i as long
Dim RS_IN as variant, RS_OUT as variant
Set RS_IN = CurrentDb.OpenRecordset("TabIN", dbOpenDynaset)
Set RS_Out = CurrentDb.OpenRecordset("TabOUT", dbOpenDynaset)
do until rs_in!eof
   aStr = split(rs_in!stringa,"/")
   for i = 0 to ubound(aStr)
	rs_out.addnew
	rs_out!str = aStr(i)
	rs_out!seq = i+1
	rs_out!doc = rs_in!documento
         rs_out.update
   next
   rs_in.movenext
loop
i nomi dei campi ed i nomi delle tabelle dovresti saperli tu. Certamente 
io non li conosco.
E sono *stringa* *str* *seq* *doc* *documento*
--
ac

 
dottcefal...@iol.it
 ha scritto:

Eccezionale! Bellissimo funziona, grazie di cuore