Ciclo For NEXT o ADO o altro ancora?

di il
11 risposte

Ciclo For NEXT o ADO o altro ancora?

Buongiorno a tutti e buone vacanze a chi ancora lo è.. Ho una situazione che mi ha bloccato e non sò più la strada da percorrere.. per questo chiedo aiuto agli esperti

Ho un gestionale TOUR OPERATOR che crea una PRATICA con IDPratica ed una relazione uno a molti con x VOUCHER ognuno con un suo IDVoucher. Allego la maschera per avere un'idea della situazione.
La maschera principale è "PRATICA" e la sottomaschera è "MASCHERA VOUCHER EMESSI PER PRATICA". All'interno di quest'ultima c'è una casella di testo "StatoVoucher" con la scritta "Da inviare" con accanto un Button con il simbolo posta che una volta cliccato mi allega il voucher, lo invia per email e mi trasforma la dicitura da "Da inviare" in "inviato". Finchè invio singolarmente il voucher il problema non si pone.
Ma supponiamo di voler inviare contemporaneamente tutti i voucher usando il botton sulla maschera principale in un unico file (vedi altro bottone). Il file unico riesco a crearlo ed inviarlo ma come faccio a trasformare lo "StatoVoucher" da "da inviare" a "inviato" per tutti i voucher contemporaneamente?
Pensavo ad un ciclo for next o Ado ma mi sono incartato!!!
Preciso che i dati vengono memorizzati nella tabella "Voucher" con i campi rispettivamente "IDPratica", "IDVoucher", "StatoVoucher"
Chi mi può assistere in questa cosa per favore? mi sono bloccato
Grazie sempre a tutti
Allegati:
17081_643fbe9ce016e4684887538632f6dc27.png
17081_643fbe9ce016e4684887538632f6dc27.png

11 Risposte

  • Re: Ciclo For NEXT o ADO o altro ancora?

    Non capisco cosa c'entra un ciclo for con ado ...
  • Re: Ciclo For NEXT o ADO o altro ancora?

    Credo di aver capito... ma il For...Next direi non c'azzecca nulla.

    A mio avviso, ADO con Access non è l'idea migliore ti possa venire in quanto Nativamente Access-Jet usa DAO.
    Detto questo, puoi ciclare il RecordsetClone della SubForm in modo da non Generare Flikering nella visualizzazione quando sposti con il MoveNext... visto che non aggiorni il Bookmark
    
    With Me!NomeSubForm.Form.RecordsetClone
       .MoveFirst
       Do Until .Eof
          ' Invia il Vaucer(se non è già stato inviato...? Vedi tu quì...)
          .MoveNext
       Loop
    End With
  • Re: Ciclo For NEXT o ADO o altro ancora?

    Ciao Oregon. Forse hai ragione ma mi sto imbattendo adesso nella programmazione ed ho una grande confusione.... Nella mia testa (confusa), il ciclo For next perchè dovrebbe ripetere la stessa operazione di scrivere "inviato" tante volte quante sono i voucher che hanno lo stesso IdPratica, mentre con ADO prendevo i dati della tabella "Voucher" e scorreva i record... ma ti ripeto.. sto cominciando adesso con il VBA è ho una grossa confusione.. mi puoi indirizzare o dare un mano?
  • Re: Ciclo For NEXT o ADO o altro ancora?

    @Alex ha scritto:


    Credo di aver capito... ma il For...Next direi non c'azzecca nulla.

    A mio avviso, ADO con Access non è l'idea migliore ti possa venire in quanto Nativamente Access-Jet usa DAO.
    Detto questo, puoi ciclare il RecordsetClone della SubForm in modo da non Generare Flikering nella visualizzazione quando sposti con il MoveNext... visto che non aggiorni il Bookmark
    
    With Me!NomeSubForm.Form.RecordsetClone
       .MoveFirst
       Do Until .Eof
          ' Invia il Vaucer(se non è già stato inviato...? Vedi tu quì...)
          .MoveNext
       Loop
    End With
    Ciao Alex, grazie sempre.
    ma come faccio a dirgli che questo ciclo lo deve fare per tutti i voucher che hanno lo stesso IDPratica?
  • Re: Ciclo For NEXT o ADO o altro ancora?

    Non ti serve... la SubForm è legata alla Form proprio con IdPratica(Campi Master/Secondario), quindi il RecordsetClone contiene proprio i Record che Visualizzi e che pertanto sono quelli con IdPratica corrispondente alla Visualizzata.
  • Re: Ciclo For NEXT o ADO o altro ancora?

    Ok. Grazie tante Alex . Proverò ad imporvvisare un codice che possa funzionare sulla base delle indicazioni che mi hai dato... sperando che non passino anni .. al limite ti chiedo cortesemente altre indicazioni.. grazie sempre
  • Re: Ciclo For NEXT o ADO o altro ancora?

    Per Alex

    ho provato ad inserire il seguente codice:

    Private Sub test_Click()
    With Me.Maschera_Voucher_emessi.Form.RecordsetClone
    .MoveFirst
    Do Until .EOF
    ' Invia il Vaucer(se non è già stato inviato...? Vedi tu quì...)

    .[Statovoucher] = "inviato"

    .MoveNext
    Loop
    End With
    End Sub

    e di da Errore run-time 3020
    Metodo update o cancel update senza addnew o edit
  • Re: Ciclo For NEXT o ADO o altro ancora?

    Pensavo dovessi fare delle azioni particolari nel ciclo, tipo INVIARE le Mail...
    Se devi solo scrivere INVIATO nel campo [Statovoucher] direi che conviene fare una Query Action...
    
    Dim strSQL As String
    strSQL="UPDATE NomeTabella Set [Statovoucher] = 'inviato' WHERE IdPratica=" & Me.IdPratica
    DbEngine(0)(0).Execute strSQL
    Ovviamente non so a cosa possa servire se poi devi inviare i Vaucer... e la tua procedura sopra non lo fa...
  • Re: Ciclo For NEXT o ADO o altro ancora?

    @Alex ha scritto:


    Pensavo dovessi fare delle azioni particolari nel ciclo, tipo INVIARE le Mail...
    Se devi solo scrivere INVIATO nel campo [Statovoucher] direi che conviene fare una Query Action...
    
    Dim strSQL As String
    strSQL="UPDATE NomeTabella Set [Statovoucher] = 'inviato' WHERE IdPratica=" & Me.IdPratica
    DbEngine(0)(0).Execute strSQL
    Ovviamente non so a cosa possa servire se poi devi inviare i Vaucer... e la tua procedura sopra non lo fa...
    Grazie tante Alex!! con poche righe di codice mi hai risolto un problema (che sicuramente per te era una stupidaggine).
    Per l'invio del voucher ho creato questo codice che sembra funzionare :

    Private Sub imgInviaVoucher_Click()
    On Error GoTo Errore

    Dim strSQL As String
    Dim strNomeFile As String
    Dim strEmail As String
    Dim intRisposta As Integer

    strNomeFile = "C:\Users\STUDIO\Desktop\Voucher\" & "Voucher_PraticaN_" & Me.NPratica & ".pdf"

    If IsNull(Me.txtMailAg) Then
    strEmail = ""
    Else: strEmail = Me.[txtMailAg]
    End If

    intRisposta = MsgBox("Sei sicuro di voler inviare il voucher per email?", vbYesNo + vbQuestion, "")
    If intRisposta = vbYes Then

    strSQL = "UPDATE Voucher Set [Statovoucher] = 'inviato' WHERE IdPratica=" & Me.IDPratica
    DBEngine(0)(0).Execute strSQL
    Forms!Pratica.Refresh

    DoCmd.OpenReport "Voucher unico", acViewReport, "", "[Voucher.IdPratica]=" & [IDPratica], acHidden
    DoCmd.OutputTo acOutputReport, "Voucher unico", "PDFFormat(*.pdf)", strNomeFile, False, "", , acExportQualityPrint

    DoCmd.SendObject acReport, "Voucher unico", "PDFFormat(*.pdf)", strEmail, "", "", "Invio Voucher Pratica N° " & Me.NPratica & " emessa giorno " & [Data emissione pratica] & " da Fevitour di Pietro Catalano", "Spett.le " & Me.txtAgenzia & vbCrLf & "" & vbCrLf & "Con la presente si trasmette il voucher relativamente alla Pratica N° " & Me.NPratica & " emessa giorno " & Me.[Data emissione pratica] & " per il servizio offerto presso la Struttura " & Me.txtStruttura & " con partenza giorno " & Me.DataPartenza & " e rientro giorno " & Me.Datarientro & "." & vbCrLf & vbCrLf & "" & vbCrLf & "Restando sempre a Vs disposizione, vi porgiamo i nostri più cordiali saluti." & vbCrLf & " " & vbCrLf & "Agenzia Pinco Pallo ", True, ""

    Else
    Exit Sub
    End If

    Errore: Exit Sub
    End Sub


    se pensi di possa migliorare non esitare e darmi suggerimenti!! Sto cominciando la poco con la programmazione e mi rendo conto che la strada è lunga.


    Nel frattempo avevo pensato ad un altra soluzione al mio problema (che tu hai risolto in due secondi...) ma non appena faccio il test, effettivamente mi scrive inviato ma mi si blocca il pc . Sembra non finire mai... cosa sbaglio??? Ti allego il codice..e grazie sempre!!

    Dim rs As DAO.Recordset
    Set rs = CurrentDb.OpenRecordset("SELECT * FROM Voucher", dbOpenForwardOnly)
    With rs
    .MoveFirst
    Do Until .EOF
    If !IDPratica = Testo107 Then
    .Edit
    ![Statovoucher] = "inviato"
    .Update
    Else
    .MoveNext
    End If
    Loop
    .Close
    End With
    MsgBox "aggiornamento completato", vbInformation
    update_exit:
    DoCmd.Hourglass False
    Exit Sub
    update_err:
    MsgBox " Errore: " & Err.Number & " " & Err.Description
    Resume update_exit:
    Set rs = Nothing
  • Re: Ciclo For NEXT o ADO o altro ancora?

    Dim rs As DAO.Recordset
    Set rs = CurrentDb.OpenRecordset("SELECT * FROM Voucher", dbOpenForwardOnly)
    With rs
    .MoveFirst
    Do Until .EOF
    If !IDPratica = Testo107 Then
    .Edit
    ![Statovoucher] = "inviato"
    .Update
    Secondo me a questo punto ci va un ".move next", altrimenti si ferma ad aggiornare all'infinito sempre la stessa riga dove incontra l'ID "Testo107"; poi a me risulta che l'apertura di un recordset in modalità ForwardOnly sia di sola lettura ma potrei facilmente sbagliarmi.
  • Re: Ciclo For NEXT o ADO o altro ancora?

    Come da manuale
    
    dbForwardOnly 256 Crea un oggetto Recordset di tipo snapshot con scorrimento di tipo forward-only (solo di tipo snapshot). 
    SnapShot=ReadOnly... quindi NON EDITABILE.

    Suggerisco un [dbOpenDynaset]

    Concordo anche sul MoveNext che probabilmente basterebbe metterlo fuori dall'IF... ma il codice scritto senza i TAG risulta poco leggibile...
Devi accedere o registrarti per scrivere nel forum
11 risposte