Newsgroup: it.comp.appl.access
Titolo: [A97] - Problemi di sincronizzazione o di lunghezza? decifrazione di una stringa

Ciao a tutti!
Con A97 grazie a delle dll, interrogo un modulo di comunicazione
usando un modem 56Kbps.
Io invio un comando di interrogazione; quando mi viene inviata la
stringa di risposta, la dll richiama una mia routine, la quale,
siccome può far nulla (se no mi si blocca Access) chiama una maschera
"_A" nella quale c'è una casella di testo, in cui metto la stringa di
risposta.
nell'evento timer della maschera "_A" (timer = 0) imposto innanzitutto
il timer = 0, poi memorizzo in una variabile il comando, scrivo che il
dato è arrivato, memorizzo la stringa ricevuta in una tabella, quindi
in base al comando inviato chiamo la routine di decifrazione apposita
(ogni comando dà una risposta di tipo diverso).
Questo è il codice
   Dim rstStrOttenute As Recordset
   Dim com As String
 
   Me.TimerInterval = 0
 
   com = Left(Comando, 2)
 
   RisanaCursore 'sub che fa uno showcursor, se no mi sparisce il
mouse.
 
   Forms![LOCALI_Connessione]![E].Caption = "Dato Arrivato.
Elaborazione..."
   Forms![LOCALI_Connessione]![E].Visible = True
'MEMORIZZO LA STRINGA DI RISPOSTA "NUDA E CRUDA" CHE HO RICEVUTO.
-------------------------------------------------
      Set rstStrOttenute = CurrentDb().OpenRecordset("SELECT * FROM
StringheOttenute;")
         rstStrOttenute.AddNew
            rstStrOttenute![idrichiesta] = mioIDrichiesta 'variabile
globale.
            rstStrOttenute![stringaOttenuta] = Me![Dato]
         rstStrOttenute.Update
      rstStrOttenute.Close
 
      Set rstStrOttenute = Nothing
 
 
'ASSEGNO IL CONTENUTO DEL MEMO ALLA VARIABILE DI TIPO STRING CHE USERò
PER LA DECIFRAZIONE. -----------------------
   stringaOttenuta = Me![Dato] 'stringaOttenuta è una variabile
globale.
 
   com = Left(stringaOttenuta, 2)
 
 
   If Left(Com, 1) = "#" Then
         'E' UNO DEI COMANDI "NOSTRI"
         Select Case com 'Left(Comando, 2)
            Case Is = "#*"
                  DiesisAsterisco 'chiamo la routine per la
decifrazione di questa stringa
            Case Is = "#&"
                  'Forms![LOCALI_Connessione]![F1].Visible = True
'------------------------
                  DiesisECOMMERCIALE 'chiamo la routine per la
decifrazione di questa stringa
            Case Is = "#@"
                  DiesisAcommerciale
            Case Is = "#^"
                  DiesisCirconflesso
            Case Else
                     DoCmd.OpenForm "ComandiAvanzati_M"
                     Forms![ComandiAvanzati_M]![IDLocale] =
mioIdLocale
                     Forms![LOCALI_Connessione]![Interruttore4] =
False
         End Select
   Else
      'E' UNO DEI COMANDI AVANZATI.
      DecifraAvanzati
   End If
========================================
Io invio due comandi in sequenza: al primo ("#*"), ottengo la
risposta, la memorizzo e la decifro. Quindi viene inviato il "#&",
ottengo la risposta, la memorizzo ma non entro nella routine di
decifrazione.
inoltre il mouse mi sparisce e Access risulta bloccato (non mi sposto
neanche con le frecce).
Ho provato a far visualizzare dei controlli per vedere dove arriva, ma
benché essi fossero prima dell'apertura del recordset (che viene
fatta, come anche il suo popolamento), non venivano mostrati, almeno
non quelli che dovevano esser resi visibili al secondo comando.
Se eseguo gli stessi due comandi su altri moduli, tutto ok.
L'unica differenza è la lunghezza della stringaOttenuta: 6700
caratteri quando fa tutto, 15200 quando si blocca.
Non so come venirne fuori: poteri pensare che tale lunghezza possa
dare problemi se NEANCHE la memorizzasse, ma questo lo fa!
Almeno dovrebbe entrarmi nella routine DiesisECOMMERCIALE!!
Se eseguo il codice riga per riga, TUTTO OK!!!
Qualcuno ha avuto problemi simili o sa come venirne a capo?
Grazie!
Alessio

Dopo una giornata di prove e controprove, sono riuscito a trovare la
soluzione.
Inizialmente avevo provato ad inserire uno Sleep all'inizio
dell'evento Timer, ma non risolveva.
Neppure attendere la risposta per più tempo era la soluzione.
ho risolto invece mettendo uno Sleep di almeno 2 secondi
immediatamente prima della chiamata della sub DiesisECOMMERICIALE, in
fondo all'evento Timer.
tutto è bene ciò che finisce bene! ;)
Ciao di nuovo