Autocompilazione anagrafica di un modulo

di il
21 risposte

Autocompilazione anagrafica di un modulo

Un saluto a tutti,
sono nuovo del forum e da poco mi sono avvicinato a Microsoft Access.
Pur non essendo ferrato nella programmazione di database, mi sono azzardato a preparare un programmino, che serve ad avere l'anagrafica e il susseguirsi delle prestazioni con relativa refertazione di uno studio medico, e devo dire che tutto sommato funziona niente male.
Solo che (come credo sia naturale) dopo aver creato un qualcosa che funziona ci si concentra su come la si può perfezionare.
Mi spiego meglio:
Ho creato una maschera d'inserimento dati paziente che memorizza i dati in una tabella chiamata "Pazienti". In questa maschera c'è un pulsante di "OK" che fa memorizzare i dati del paziente inserito, nella tabella "Pazienti", fa chiudere la maschera di inserimento e fa aprire un'altra maschera chiamata "Scheda paziente" (che attinge i dati anagrafici dalla tabella "Pazienti"), in cui è presente una sottomaschera dove sono elencate le prestazioni effettuate, con un link al referto. In questa maschera "Scheda paziente" c'è anche un bottone chiamato "Crea referto" che fa aprire una finestra di una cartella dove sono contenuti i moduli vuoti, creati in Word, dei referti delle prestazioni eseguite che vengono compilati con i dati necessari e salvati in un'altra cartella chiamata "Referti" da dove vengono poi importati nella sottomaschera delle prestazioni.
Il problema mio a questo punto quale sarebbe?
Mi sto rompendo il capo ma non riesco a cavarci un ragno dal buco!
A questo punto arrivato gradirei, una volta selezionato il modello di referto che si adatta alla prestazione, ritrovarmi com il modello aperto con l'anagrafica del paziente già inserita senza perdere ulteriore tempo per inserirla.
E' un bel pò di tempo che mi sto sforzando di realizzare questo, senza riuscirci; perciò ringrazio anticipatamente tutti quelli che vorranno aiutarmi all'ottenimento del risultato.

21 Risposte

  • Re: Autocompilazione anagrafica di un modulo

    Per compilare il modulo di Word devi aprirlo via codice (si chiama Office Automation) con un oggetto Word.Application, e sostituire i segnalibri che avrai predisposto nel modulo con i dati del paziente presi da un recordset (che aprirai via codice).
    In alternativa puoi usare la stampa unione, che funziona praticamente allo stesso modo.
    Esempi sul web ce ne sono a pacchi.
  • Re: Autocompilazione anagrafica di un modulo

    Grazie per la risposta, gibra,
    però se fosse un solo modulo di referto, allora sicuramente andrebbe benissimo aprirlo via codice, siccome però i moduli sono diversi e devo essere io a scegliere quale utilizzare, ho necessità di aprire la cartella che li contiene (e questo avviene via codice al click sul pulsante "Crea referto" della maschera "Scheda paziente").
    Per farti capire meglio quello che mi serve ti dico che nel corso dell'uso di Access, dopo aver inserito un nuovo paziente mi si apre una maschera chiamata "Scheda paziente" che è composta dall'anagrafica e da una sottomaschera che contiene le prestazioni eseguite. In questa maschera c'è il pulsante "Crea referto" che al click mi apre la cartella dove sono contenuti i vari moduli di referto.
    Io credo (correggimi se sbaglio), che basterebbe inserire un certo codice (che non conosco) nei campi opportuni dei moduli Word dei referti, che attinga ai campi omonimi della maschera "Scheda paziente" che risulta aperta.
    Spero di essermi spiegato esaurientemente.
  • Re: Autocompilazione anagrafica di un modulo

    Si fa tutto da automazione come ti ha suggerito Gibra, ovviamente c'è un po più da lavorare di conoscenza del modello oggetti di Word.
    Qui trovi un demo abbastanza completo che risolve il tuo problema.
    **
    Non è proprio banale... ma nemmeno impossibile, va studiato.

    Chiaramente un gestionale va strutturato in modo da agevolare le scelte dell'utente... quindi potresti creare un sistema di opzioni vincolanti basate su cataloghi... ma devi avere una visione di insieme prima di partire a compilare il modello altrimenti continuerai a rincorrere modifiche con il senno del poi, tipico di chi non affronta una buona fase di ingegnerizzazione.
  • Re: Autocompilazione anagrafica di un modulo

    Totostegi ha scritto:


    A questo punto arrivato gradirei, una volta selezionato il modello di referto che si adatta alla prestazione, ritrovarmi con il modello aperto con l'anagrafica del paziente già inserita senza perdere ulteriore tempo per inserirla.
    DOPO
    I suggerimenti forniti da gibra e @Alex mirano al concetto generale della "stampa unione" sfruttando i segnalibri (Bookmarks) di Word. Puoi leggere anche questo per i concetti più base


    PRIMA
    Hai anche detto che vorresti che ti si aprisse il "modello referto" che si "adatta" alla "prestazione". Se nomini coerentemente i tuoi modelli di Word in funzione del valore inserito (che so) nel campo TipoPrestazione, puoi automatizzare di conseguenza.
  • Re: Autocompilazione anagrafica di un modulo

    Un saluto a tutti.
    Rieccomi qui dopo quasi un anno passato ad approfondire lo studio di Access. Finalmente dopo un corposo approfondimento nello studio del DB di casa Microsoft e l'aiuto di qualche amico sul web, sono riuscito nell'intento di portare a termine il DB citato in precedenza che ora gira in maniera egregia.
    L'unica cosa che non sono riuscito ad ottenere è il comportamento uguale per tutti i modelli di Word da parte del DB. Mi spiego meglio:
    Io ho otto modelli di Word (ciascuno per ogni referto) contenuti nella cartella "Moduli" che si aprono al click sullo specifico pulsante contenuto nella maschera "Scheda Paziente". Si questi otto moduli, tre si aprono correttamente compilati nei Bookmarks e in primo piano con la finestra a tutto schermo, gli altri cinque, sono si compilati correttamente nei Bookmarks come gli altri ma non si aprono in primo piano con la finestra a tutto schermo come gli altri, ma si aproni ridotti a icona sulla barra delle applicazioni. Eppure i moduli hanno tutti le stesse caratteristiche!!!
    Ho provato di tutto ma non sono riuscito a risolvere questa anomalia.
    Confido in una vostra dritta.
  • Re: Autocompilazione anagrafica di un modulo

    Hai avuto tempo per approfondire moto bene...

    Hai provato questo:
    
    myDoc.Application.Activate
    myDoc.Application.WindowState = wdWindowStateMaximize
    
    Ovviamente se Hai usato Latebinding usa il valore esplicito al posto della costante [wdWindowStateMaximize].
  • Re: Autocompilazione anagrafica di un modulo

    Ciao Alex, scusami per il ritardo ma prima sono stato assente, poi sono stato costretto a letto da un'influenzaccia, ed ora, ripresomi, eccomi qua. Grazie per il suggerimento ma non ho usato quel codice, ho creato un modulo che serve ad attivare e portare in primo piano la finestra di Word, richiamato da un'altra serie di codice (che contiene la funzione "Activate.Word") che viene attivato dal click sullo specifico pulsante della finestra "Scheda Paziente". Lo strano è che il tutto funziona bene, però ha un comportamento anomalo. Cioè degli otto referti che ho, tre si aprono perfettamente compilati e in primo piano, gli altri cinque sono perfettamente compilati ma si aprono ridotti a icona nella barra delle applicazioni. come lo spieghi questo comportamento anomalo?
  • Re: Autocompilazione anagrafica di un modulo

    Ci sono troppe variabili "oscure" in quello che hai trattato, non ultima la non piena dimestichezza nella gestione del codice...
    In sostanza per capire questi dettagli serve fare una verifica puntuale di quello che hai fatto... cosa non possibile.
  • Re: Autocompilazione anagrafica di un modulo

    A me non è chiaro se tu hai 8 comandi che aprono SINGOLARMENTE gli 8 moduli Word, oppure un unico comando che apre 8 moduli di Word tutti insieme.
    Nel primo caso non dovrebbe essere difficile comparare gli 8 codici VBA che dovrebbero essere tutti simili.
    Nel secondo caso...direi idem...però trovo un po' caotico gestire 8 finestre di Word aperte...e non escludo che questo piccolo caos mandi un po' in tilt l'istruzione Activate.Word. Diciamo che io almeno mi troverei in difficoltà.
    Prova a ragionare per piccoli passi, altrimenti è bene che tu mostri l'intero codice VBA che gestisce questa cosa.
  • Re: Autocompilazione anagrafica di un modulo

    Grazie Osvaldo per la risposta e per la tua disponibilità. La condizione del DB è quella che tu hai descritto nel primo caso, e cioè io ho una finestra con otto pulsanti che aprono il rispettivo referto che è necessario di volta in volta. Quindi il file di Word che viene aperto di volta in volta è sempre uno. Ora il mio stupore è che tre di questi pulsanti aprono il rispettivo file di Word correttamente compilato nei Bookmarks e in primo piano, Gli altri cinque, aprono il file di Word correttamente compilato nei Bookmarks, ma ridotto a icona sulla barra delle applicazioni (non in primo piano).Eppure il codice è perfettamente identico per tutti. Ora io non so proprio come riuscire a rendere uguale per tutti i files di Word la loro apertura in primo piano.
    Non so se c'è qualche cosa da poter fare. Io potrei pure preparare due file di testo contenenti il codice e mandarteli se necessario (mi dirai tu come, se via PM o postandoli sul forum, o l'intero DB che pesa però circa 26 MB) per visionarli. Credimi, non riesco a capire questo comportamento anomalo.
  • Re: Autocompilazione anagrafica di un modulo

    Posta 2 codici VBA che vanno bene e 2 che ti riducono Word a icona sulla barra applicazioni. Li devi copiare/incollare nel rettangolo editor dove scrivi il messaggio, poi li selezioni e clicca in alto sul tasto </> (Codice) in modo che appariranno scritti con i caratteri monotype tipici dei codici.
  • Re: Autocompilazione anagrafica di un modulo

    Grazie Osvaldo, eccomi qua:
    1- Questo è il codice del modulo che richiama Word in primo piano
    Option Compare Database
    
    #If Win64 Then
    Private Declare PtrSafe Function BringWindowToTop Lib "USER32" ( _
    ByVal HWnd As Long) As Long
    Private Declare PtrSafe Function FindWindow Lib "USER32" Alias "FindWindowA" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long
    Private Declare PtrSafe Function SetFocus Lib "USER32" ( _
    ByVal HWnd As Long) As Long
    #Else
    Private Declare Function BringWindowToTop Lib "user32" ( _
    ByVal HWnd As Long) As Long
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long
    Private Declare Function SetFocus Lib "user32" ( _
    ByVal HWnd As Long) As Long
    #End If
    Public Sub ActivateWord()
    Dim Res As Long     ' General purpose Result variable
    Dim DocHWnd As Long  ' Window handle of Excel
    Const C_MAIN_WINDOW_CLASS = "OpusApp"
    DocHWnd = FindWindow(lpClassName:=C_MAIN_WINDOW_CLASS, _
    lpWindowName:=vbNullString)
    If DocHWnd > 0 Then
    Res = BringWindowToTop(HWnd:=DocHWnd)
    If Res = 0 Then
    Debug.Print "Error With BringWindowToTop:  " & _
    CStr(Err.LastDllError)
    Else
    SetFocus HWnd:=DocHWnd
    End If
    Else
    Debug.Print "Can't find Word"
    End If
    End Sub
    2- Questo è quello che si attiva al click sugli specifici pulsanti:
    Option Compare Database
    
    
    
    Sub ApriFile(NomeFile As String)
    
    Dim appword As Object 'Word.Application
    Dim doc     As Object 'Word.Document
    Dim fPath   As String
    Dim FName   As String
    
    On Error Resume Next
    Set appword = GetObject(, "Word.Application")
    Error.Clear
    If Err.Number <> 0 Then
         Set appword = CreateObject("Word.Application")
    End If
    
    appword.Visible = True
    
    fPath = "C:\Gestione\Moduli\"
    FName = NomeFile
    
    With appword
         Set doc = .Documents.Open(fPath & FName)
         '.Activate
         ActivateWord
    End With
    
    With doc
         .Bookmarks("Cognome").range.insertAfter Me.Cognome
         .Bookmarks("Nome").range.insertAfter Me.Nome
         .Bookmarks("Data_di_nascita").range.insertAfter Me.Data_di_nascita
    End With
    
    Set doc = Nothing
    Set appword = Nothing
    End Sub
    
    
    Private Sub Comando23_Click()
    
    Call ApriFile("Visita Ostetrica.dotx")
    End Sub
    
    Private Sub Comando24_Click()
    
    Call ApriFile("Visita Ginecologica.dotx")
    End Sub
    
    Private Sub Comando25_Click()
    
    Call ApriFile("Ecografia 5-10 Sett..dotx")
    End Sub
    
    Private Sub Comando26_Click()
    
    Call ApriFile("Ecografia I° Trimestre.dotx")
    End Sub
    
    Private Sub Comando27_Click()
    
    Call ApriFile("Ecografia Pelvica.dotx")
    End Sub
    
    Private Sub Comando28_Click()
    
    Call ApriFile("Ecografia Morfologica.dotx")
    End Sub
    
    Private Sub Comando29_Click()
    
    Call ApriFile("Ecografia II° Trimestre.dotx")
    End Sub
    
    Private Sub Comando30_Click()
    
    Call ApriFile("Ecografia III° Trimestre.dotx")
    End Sub
    Vedi un pò tu se riesci a cavarne un ragno dal buco.
  • Re: Autocompilazione anagrafica di un modulo

    Do solo un indizio..., magari con questo codice non tutti hanno dimestichezza, ma risulta abbastanza evidente che in realtà sia molto casuale il fatto che vada... o meglio che attivi le corrette istanze dopo la 1°chiamata...

    Hai verificato quali valori assume questa variabile:
    DocHWnd

    Ti accorgerai che nonostante tu apra N istanze di word, sempre sia vero che ne apri N(Credo tu ne apra solo 1), quindi dovresti ottenere N valori di hwnd diversi... non è così...
    Prova a capire il perché non punti correttamente all'istanza aperta... e magari verifica se devi aprire N istanze singole o aprire sulla stessa istanza gli N files... sono 2 cose diverse.

    Aggiungo, ma Devi prima chiarirti di quanto esposto sopra.. , questa cosa che semplifica molto la gestione del recupero dell'hWnd ... usandola correttamente:

    https://docs.microsoft.com/en-us/office/vba/api/word.window.hwnd

    Per meglio comprenderla:
    https://docs.microsoft.com/en-us/office/vba/api/word.window

    @Alex
  • Re: Autocompilazione anagrafica di un modulo

    Grazie Alex per la risposta e i suggerimenti.
    Ho passato questi giorni a studiarmi la pagine che tu mi hai linkato che fanno riferimento al codice del modulo, ma purtroppo non sono riuscito a cavarne un ragno dal buco.
    Forse perché ancora le mie conoscenze non sono arrivate a tanto. Come dicevo precedentemente sono riuscito a compilare queste due parti di codice anche con l'aiuto di qualche amico e ad essere sinceri il codice del modulo me lo ha passato un mio amico al quale però funziona parfettamente, akmeno a suo dire. In tutti i modi, cercando di capire la causa del mancato funzionamento e dando per scontato che la variabile "hwnd" apra 1 sola istanza come da te sostenuto, secondo me, il tutto dovrebbe funzionare ugualmente in quanto viene usata un'istanza alla volta. Ti faccio un esampio pratico: Io ho aperta la maschera "Scheda Paziente" in cui sono contenuti gli 8 pulsanti che sono collegati ai rispettivi modelli di Word per i referti. Dopo aver inserito la parte anagrafica nella maschera, clicco su un solo pulsante per far aprire lo specifico referto che dopo compilato, viene salvato in una cartella chiamata "Referti" e quindi poi il file di Word viene chiuso. Al successivo paziente viene viene riaperto un altro modello di Word. Perciò come puoi benissimo constatare il file di Word aperto è sempre uno alla volta.
    Ma la cosa che mi ha lasciato ancora più stupito (e che ha scoperto casualmente) è che se dopo avviato Access, prima di aprire la maschera d'inserimento dati, io apro una finestra di codice (il modulo stesso per esempio o, aperta in visualizzazione struttura la maschera "Scheda Paziente", apro le proprietà di un pulsante qualsiasi e apro l'evento su click) anche senza fare nessuna modifica e anche richiudendola subito dopo, tutti gli 8 pulsanti svolgono perfettamente la funzione per cui sono stati programmati fin quando mantengo aperto Access. Dopo averlo chiuso, alla riapertura riprende il solito funzionamento e cioè al click sui pulsanti, quelli attivi sul comando 23,24 e 27 aprono il modello di Word in primo piano e a schermo intero, gli altri cinque aprono si i relativi modelli, ma ridotti a icona sulla barra delle applicazioni. Come si può spiegare questa situazione?
Devi accedere o registrarti per scrivere nel forum
21 risposte