Stampa/Unione + Flag

di il
11 risposte

Stampa/Unione + Flag

Salve,
Sono molto nuovo del forum e intanto voglio ringraziarvi per tutte le informazioni utili che ho trovato qui.
Vi spiego il problema che mi trovo ad affrontare, se qualcuno riesce a darmi qualche dritta sarà veramente molto apprezzata.

Uso Office 365
File di origine Database.accdb > Tabella1 in cui ho un Campo1 - impostato come formato Si/No.
File di Stampa/Unione è un documento Word.
Vorrei fare in modo che il Word esportasse i .pdf dei singoli record, ma solamente quelli in cui manca il flag sul Campo1 della Tabella1 del Database, restituendo poi un comando per Flaggare il Campo1.

Ho cercato molto, ho trovato qualcosa, ho preso molti spunti;

Ora come ora l'Esportazione dei singoli pdf viene portata a termine, il flag sul Campo1 del Databse viene messo.
Problema 1) Se provo a ridare il comando di esecuzione su Word mi riesporta (sovrascrivendoli) tutti i pdf, non solo quelli senza flag.
Problema 2) Ad esportazione dei pdf avvenuta mi compare un errore, nello specifico:
Errore di run-time 5631, Word non è riuscito ad unire il documento principale con l'origine dati perchè i record di dati sono vuoti oppure non corrispondono alle opzioni della query.

11 Risposte

  • Re: Stampa/Unione + Flag

    Io non so cosa sia Office 365. Parlerò per quello che so su Access.
    Nella descrizione che dai...rilevo qualcosa di contraddittorio/strano. Provo a ricostruire tutto a parole mie (correggimi dove sbaglio).
    Riguardo i record con Campo1=Falso, io imposterei una query, poi farei stampa unione dalla query. Poi hai detto che vuoi flaggarli TUTTI.
    Una volta flaggati tutti la query non mostrerà più dati e non potrà farti esportare nulla. Per evitare messaggi di errore, potresti controllare il DCount della query e se è 0 non deve partire alcuna procedura...detto in altre parole:
    If DCount("*", "NomeQuery") > 0 Then
    ...tutte le istruzioni di stampa unione…
    End If
  • Re: Stampa/Unione + Flag

    OsvaldoLaviosa ha scritto:


    Nella descrizione che dai...rilevo qualcosa di contraddittorio/strano. Provo a ricostruire tutto a parole mie (correggimi dove sbaglio).Riguardo i record con Campo1=Falso, io imposterei una query, poi farei stampa unione dalla query.
    Hai ragione non ci avevo nemmeno pensato a partire da una query perchè nel file che usavo come origine dati non ce ne era nemmeno una, filtravo direttamente i destinatari da word; effettivamente così come dici mi tornava più comodo. Mi sono però accorto che mi causa una limitazione non trascurabile visto che lavoro con 2 db separati dove in uno ho Maschere Query e TabelleCollegate, mentre nel file di origine dati Database.accdb ci sono le tabelle; mi sono accorto che devo avere la stessa identica query su entrambi i db per avviare correttamente la Stampa/Unione non riuscendo a usare come origine dati il "Fe", purtroppo infatti mi serve lavorare su questi Word anche con il Fe completamente chiuso, e quindi privo di tabelle.

    Ho quindi tristemente abbandonato questa possibilità e per ora sto usando Filtro per Campo1 direttamente nel file di StampaUnione
    EDIT.1
    Purtroppo l'errore non si è risolto, anzi ora mi sono accorto di un comportamento strano, con tutti i record non flaggati, l'esportazione si ferma dopo una decina di record; ho pensato fosse un problema del record in cui si fermava, ma se esco dal file word lo riapro e rieseguo il comando Esporta1x1 rincomincia ad esportare i record rimanenti (compreso quello in cui si fermava), dando l'Errore solo alla fine (altre volte da l'errore 3 volte al posto di 2).
    Il codice dell'errore è sempre lo stesso ed è sempre sul codice:
    .Execute Pause:=False
    Ho pensato fosse importante e che magari da questo comportamento si capisce meglio dove sto sbagliando

    EDIT.2
    Ho fatto in ogni caso come mi consigliavi mettendo come origine dati la query del db di "Fe" per vedere se l'errore spariva ma purtroppo rimane
  • Re: Stampa/Unione + Flag

    Ciao sono ancora bloccato; qualche suggerimento?
  • Re: Stampa/Unione + Flag

    Al momento la mia situazione è questa:

    Ho risolto il Problema1 impostando nel documento word di importare i dati secondo un filtro che prende quindi solo i recond non flaggati.

    Il Problema 2 non riesco a risolverlo, e anzi risolvendo il Problema1 si è complicato il Problema2, ora lo stesso errore compare più volte; mi spiego meglio: per provare a vedere se funziona tolgo il flag da tutti i record, eseguo il comando, l'esportazione si ferma dopo una decina di record; ho pensato fosse un problema del/dei record in cui si fermava, ma se esco/riavvio il debug e rieseguo il comando rincomincia ad esportare i record rimanenti (compreso quello in cui si fermava), dando l'Errore solo alla fine (altre volte da l'errore 3 volte al posto di 2).
    Il codice dell'errore è sempre lo stesso:
    Errore di run-time 5631, Word non è riuscito ad unire il documento principale con l'origine dati perchè i record di dati sono vuoti oppure non corrispondono alle opzioni della query.

    e si ferma sempre sul codice:
    .Execute Pause:=False
    Lo stesso errore lo da anche se provo a fare questo procedimento con tutti i record flaggati al posto che non flaggati.
    Qualche suggerimento?

    Grazie mille in anticipo
  • Re: Stampa/Unione + Flag

    Dovresti postare l'intero codice VBA.
  • Re: Stampa/Unione + Flag

    Ok allora qui metto il codice che ho usato, prendendo molti spunti quà e là, ho cercato di adattare il tutto.
    Stampa Unione ed Esporta1x1, ogni record un pdf.
    Il "Campo1" ha come nome -> Aggiornato
     Sub Esporta1x1()
    
          Application.ScreenUpdating = False
       maindoc = ActiveDocument.Name
    ChangeFileOpenDirectory _
            "\\RisorsaCondivisaAccessibile\CartellaDatabase\"
    
    ActiveDocument.MailMerge.DataSource.ActiveRecord = wdLastRecord
    hmrecords = ActiveDocument.MailMerge.DataSource.ActiveRecord
    ActiveDocument.MailMerge.DataSource.ActiveRecord = wdFirstRecord 
      
        For i = 1 To hmrecords + 1
              With ActiveDocument.MailMerge
            .Destination = wdSendToNewDocument
            .SuppressBlankLines = True
                With .DataSource
                  .FirstRecord = i
                  .LastRecord = i
                  .ActiveRecord = i
    'Utilizzo alcuni campi del file sorgente per impostare il nome del file pdf
                  docName = .DataFields("Campo_3").Value & " " & .DataFields("Campo_4").Value & ".pdf"
                  TheRow = .DataFields("Campo_2").Value
                  Aggiornato = .DataFields("Aggiornato").Value
                  
    'se il record è flaggato salta l'esportazione
    'If Aggiornato = 1 Then GoTo 100
    
                End With
    	.Execute Pause:=False
            Application.ScreenUpdating = False
            End With
    'crea il PDF
            ActiveDocument.ExportAsFixedFormat OutputFileName:=docName, _
            ExportFormat:=wdExportFormatPDF, OpenAfterExport:=False, OptimizeFor:= _
            wdExportOptimizeForPrint, Range:=wdExportAllDocument, From:=1, To:=1, _
            Item:=wdExportDocumentContent, IncludeDocProps:=True, KeepIRM:=True, _
            CreateBookmarks:=wdExportCreateHeadingBookmarks, DocStructureTags:=True, _
            BitmapMissingFonts:=True, UseISO19005_1:=False
            ActiveWindow.Close SaveChanges:=wdDoNotSaveChanges
    'vai alla sub che flagga a "vero" il record appena processato
             UpdateAggiornato (TheRow)
    'se la riga non va esportata salta qui <-- questo veniva usato precedentemente quando importavo tutti i record senza filtrarli per il campo Aggiornato 
    '100
       Next i
    Application.ScreenUpdating = True
    
    End Sub
    Questo invece è il codice che ho utilizzato per andare a Flaggare il campo Aggiornato sul file di origine dati
    Sub UpdateAggiornato(TheRow As Integer)
    'creo la connessione al DB Access
        Dim Con As String
        Dim Connection As ADODB.Connection
        Dim NumOfRec As Integer
       
       Set Connection = New ADODB.Connection
        Con = "Provider=Microsoft.ACE.OLEDB.12.0;"
        Con = Con & "Data Source=\\RisorsaCondivisaAccessibile\CartellaDatabase\Database.accdb"
        Connection.Open ConnectionString:=Con
        Connection.Execute "UPDATE Tabella1 SET [Aggiornato]=1" & _
          " WHERE [Campo 2]=" & TheRow, NumOfRec, adExecuteNoRecords
       Connection.Close
       Set Connection = Nothing
    End Sub
  • Re: Stampa/Unione + Flag

    Ciao, novità in merito?
  • Re: Stampa/Unione + Flag

    Intervengo probabilmente a sproposito, ma visto che Osvaldo è sparito...
    Invece di usare la Tabella1 per il MailMerge... fai una QUery in cui metti come Criterio True sul campo Flag.
  • Re: Stampa/Unione + Flag

    In pratica ho 2 documenti word che utilizzo per fare questo procedimento;
    Utilizzando il Filtro del file di word 1 per una categoria di articoli, 1 per l'altra categoria di articoli.

    Ne ho fatte 6 di query.
    -Q1 e Q2 le ho fatte da Tabella1 ; suddividono i vari articoli in base alla categoria.
    Così eventualmente torno alla prima strategia ovvero quella che prevedeva l'origine dati del Stampa/Unione con tutti gli articoli di una categoria senza criterio per il campo Flag, che mi dava errore solo quando completava il tutto, e mi riesportava anche quelli già flaggati (eviterei)

    -Q1F e Q2F da Q1 e Q2 e hanno come criterio il campo Flag True.

    -Q1FN e Q2FN sempre da Q1 e Q2 hanno come criterio il campo Flag False.

    Va bene come base di partenza?
  • Re: Stampa/Unione + Flag

    Ora entrare nel dettaglio dell'utilità o meno di 6 Queries... è difficile capirlo... mi verrebbe da pensare che se hai fatto 6 Queries, siano talmente diverse le esigenze per farne 6... ma solo tu lo sai...
    In ogni caso le Queries non sono a pagamento, quindi se hai già valutato le ottimizzazioni e realmente ne servono 6... fanne 6...
  • Re: Stampa/Unione + Flag

    Diciamo che in questa fase mi è stato utile per capire dove si fermava l'esportazione dei .pdf per controllare se nei record c'era qualcosa che non andava. In ogni caso pure quando rimane solo 1 l'errore persiste.

    EDIT: Potrebbe essere che alla fine non trovando nessun dato da Flaggare allora vada in errore? Per questo dici di partire impostando la stampa/unione su una query dove il valore è del Flag è Vero?
Devi accedere o registrarti per scrivere nel forum
11 risposte