Newsgroup: it.comp.lang.visual-basic
Titolo: mi aiutate con un ciclo?

Salve a tutti,
chiedo nuovamente il vostro aiuto perch� ho un ciclo che mi sta facendo 
impazzire...
la situazione � questa: conto gli elementi che ho nella inbox di outlook, 
poi quelli inviati ad un certo indirizzo email vengono processati e spostati 
in un'altra cartella. Il problema � che quando sposto l'elemento outlook li 
reindicizza mandandomi fuori di testa... per ora ho fatto un ciclo di questo 
tipo:
for i=1 to <numeromessaggi>  'il primo messaggio ha indice 1 non 0
    if messaggio.destinatario = "
i...@qui.it
" then
     ...
     ...
          sposta messaggio
          i=i-1
     end if
     <ricalcola numero di messaggi>
next i
ovviamente non funziona... ad un certo punto smette di processare i msg 
rimanenti senza capirne il motivo... � da stamattina che ci perdo la 
testa...aiutooooo
grazie 1000
dade 

 impazzire [...]
...
Il tuo codice mi sembra incasinato un bel po'.
Per capire dove sta l'inghippo, il consiglio e' sempre quello di eseguire 
una riga alla volta. In ogni caso, io cambierei un po' il modo di lavorare.. 
anziche' ricalcolare il numero di messaggi totali ogni volta che ne sposti 
uno, e contestualmente deincrementare la variabile contatore (I, nel tuo 
caso), prima farei un ciclo (se non ci sono altri metodi piu' puliti) tra 
tutti i messaggi per sapere se il destinatario e' effettivamente quello che 
ti serve; se e' quello, mi "prenderei nota" del messaggio (una collezione, 
una matrice, un qualunque altro modo che riterrai opportuno), poi sposterei 
tutti i messaggi di cui ho, appunto, preso nota.
Andarsi a scontrare con cicli incrementati, decrementati, ricalcolato il 
valore finale ... porta facilmente ad errori

          sposta messaggio
Ecco:
NON spostare il messaggio, recuperane l'ID (messageID) , e mettilo in un 
elenco.
alla fine della spulciatura, e SOLO alla fine, usi l'elenco per spostare i 
messaggi.
contatore = 0
for i = 1 to numeromessaggi
 if messaggio.destinatario = "
i...@qui.it
" then
   elenco.aggiungi messaggio.ID
   contatore = contatore +1
 end if
next i
If contatore <> 0 then
  for i = 1 to contatore
    messaggio = elenco(i)
    spostamessaggio 
messaggio.id
  next i
end if


Avete ragione entrambi, in effetti in un primo momento avevo proprio tentao 
un approcio di quel genere: salvare in array i messaggi da spostare e poi 
spostarli in un secondo momento. Il problema � che dopo aver spostato il 
primo messaggio, mi vengono cambiati tutti gli indici... quindi ad esempio 
il messaggio n. 3 non sar� piu' 3 se ho spostato il messaggio n.2 ma 
diventer� 2... � un po' incasinata questa cosa lo so...  :( 

 incasinata questa cosa lo so...  :(
...
Butto li una cretinata.....
Se parti a spostare dal piu' alto?
Mi spiego... hai una lista di messaggi da spostare
7,12,34,41
tu inizi spostando il 41, poi il 34 e cosi via.... Puo' andare?

 questa cosa lo so...  :(
e ben per questo che ti ho suggerito di usare il messageID: e' univoco.
comunque c'e' un errore concettuale nel precedente pseudolistato
che ho scritto nel precedente post.... rifo:
contatore = 0
for i = 1 to numeromessaggi
 if messaggio.destinatario = "
i...@qui.it
" then
   elenco.aggiungi messaggio.ID
   contatore = contatore +1
 end if
next i
If contatore <> 0 then
  for i = 1 to contatore
    messaggiodaspostare = elenco(i)
    for y = 1 to numeromessaggi
      if 
messaggio.id
 = messaggiodaspostare.ID
         spostamessaggio 
messaggio.id
      end if
    next y
  next i
next i

 ha scritto nel messaggio 
news:4aba...@news.x-privat.org...

Se "messaggio.destinatario" non ha alcun indice (sarebbe i, nel tuo caso)
... che messaggio ti prende?
Non potresti usare un ciclo
for each... next
e fregartene dell'indice?
Ciao,
E. 


L'idea del messageID mi piace... devo vedere come ottenerlo e se ai vari 
comandi Messaggio.Move li piace...
Tu mi hai suggerito il MessageID perch� hai gi� lavorato con OLE e Outlook e 
sai che funziona?

 ha scritto nel messaggio 
news:4aba3a19$0$1094$4faf...@reader3.news.tin.it...

in effetti non c'avevo pensato... domani ci provo :-) 

 Outlook e sai che funziona?
Non per lo stesso scopo, ma feci un'applicazione che estraeva dei dati
dai messaggi di posta, dopo varie madonne arrivai al messageID
leggendo le header del messaggio. 

 leggendo le header del messaggio.
ah quindi mi sembra di capire che bisogna leggerlo in modalit� raw e che non 
� una propriet� dell'oggetto mailitem? Purtroppo devo tenere conto anche 
delle prestazioni... pero' una buona idea sarebbe ciclare con step -1 come 
suggeritomi da VBMizio e spostare il messaggio leggendo il messageid... 
pensa che ieri in un test non so cos'� successo e mi ha spostato circa 30 
volte la stessa email... forse dopo il .move devo inserire un doevents e uno 
sleep(1) altrimenti mi collassa il pc per la mole di dati... 

 collassa il pc per la mole di dati...
a naso, l'uso "a rovescio" della lista (step-1) come diceva VBmizio ti 
potrebbe
dare casini ancor piu' grandi se durante la "frullata" arriva un nuovo
messaggio, tutti i messaggi variano di "posizione", potrebbe essere
questo il caso...
come dicevo ho un po' di ruggine sull'argomento, ma ricordo che anche io ci
sbattei la testa non poco.... pero' ricordo che risolsi con una 
identificazione
univoca del messaggio da una delle proprieta'... insisterei su entryID 

Ho provato secondo la dritta di Franz_aRTiglio, usando la propriet� MsgID 
per memorizzare gli identificativi dei messaggi e sembra funzioni benissimo.
Su un Form ho inserito una List1, una Label1 e un bottone per chiudere.
Alla fine della scansione, nell'array "DaSpostare" ci sono tutti i MsgID 
interessati allo spostamento.
A me pare che funzioni!
______________________________
Option Explicit
______________________________
Private Sub Command1_Click()
   Unload Me
End Sub
______________________________
Private Sub Form_Load()
Dim i As Long, n As Long, DaSpostare() As Long
MAPISession1.DownLoadMail = False
MAPISession1.LogonUI = False
MAPISession1.SignOn
MAPISession1.NewSession = True
MAPIMessages1.SessionID = MAPISession1.SessionID
MAPIMessages1.FetchSorted = True
MAPIMessages1.Fetch
n = -1
For i = 0 To MAPIMessages1.MsgCount - 1
   MAPIMessages1.MsgIndex = i
   If MAPIMessages1.RecipAddress = "
i...@qui.it
" Then
      n = n + 1
      ReDim Preserve DaSpostare(n)
      DaSpostare(n) = MAPIMessages1.MsgID
      List1.AddItem MAPIMessages1.MsgID
   End If
   DoEvents
Next
End Sub
______________________________
Private Sub List1_Click()
   Dim i As Long
   For i = 0 To MAPIMessages1.MsgCount - 1
      MAPIMessages1.MsgIndex = i
      If MAPIMessages1.MsgID = List1.Text Then
         Label1.Caption = List1.Text _
            & vbCrLf & MAPIMessages1.RecipAddress _
            & vbCrLf & MAPIMessages1.MsgDateReceived _
            & vbCrLf & MAPIMessages1.MsgOrigAddress
         Exit For
      End If
   Next
End Sub
______________________________ 

 per memorizzare gli identificativi dei messaggi [cut]
qui c'e' un "coso" che potrebbe semplificarti la vita , maybe:
http://www.ostrosoft.com/pop3_component/pop3_vb.zip
da:
http://www.ostrosoft.com/POP3_component.asp
--
Fosco

"Fosco" <fa...@fake.invalid> ha scritto nel messaggio 
news:h9hkbv$qh0$1...@megan.servidellagleba.it...

ti ringrazio... lo metto tra i bookmark puo' sempre tornare utile, ma per 
questo progetto ho bisogno di automatizzare outlook :( 

 univoca del messaggio da una delle proprieta'... insisterei su entryID
Ieri pomeriggio ho modificato il programma per lavorare con l'entryid ed 
inoltre spulciando il link che mi hai passato ho scoperto il metodo find che 
mi evita di ciclare tutte le email comprese quelle che non mi interessano... 
praticamente tutto il core del mio software � stato rifatti, ma ora � molto 
piu' pulito, sicuro e con molto meno codice!!! Lunedi' c'ho il test 
definitivo al lavoro... ma direi che ora � quasi allo stato dell'arte e 
delego quanto piu' possibile ad outlook! Non posso che ringraziarti 
tantissimo per il preziosissimo suggerimento che mi hai dato!!!
Ciao
dade