Stampa record in database multiutente

di il
8 risposte

Stampa record in database multiutente

Ciao a tutti,
avrei bisogno dei vostri suggerimenti su come poter gestire la stampa su Word tramite un database multiutente dei dati contenuti nelle tabelle. Il mio problema non è nell'automazione della stampa ma nella gestione della possibilità che lo stesso record possa essere stampato contemporaneamete da due persone che si trovano a lavorare in contemporanea.
La procedura di creazione del documento Word avviene tramite la pressione di un pulsante in una maschera che visualizza il singolo record dell'insieme di quelli che devono essere stampati. Per evitare che si verifichi la stampa dello stesso record ho già predisposto il seguente meccanismo: all'inizio della routine viene prima controllato e poi eventualmente valorizzato a "True" un campo "Si/No" del record, il quale indica che quel record è impegnato. Finita la generazione del documento Word questo campo viene impostato a "False " e viene scritta la dicitura "STAMPATO" in un campo testo apposito, riportato anche in una casella di testo sulla maschera, campo controllato alla pressione del suddetto tasto.
Da precisare che il documento una volta stampato potrà essere successivamente ristampato. Il controllo effettuato sul campo "Si/No", fa comparire un avviso ed interrompe la routine mentre il controllo sulla dicitura "STAMPATO" fa comparire un messaggio che avvisa che il documento è già stato stampato, nel caso che trovi la dicitura, e fa scegliere all'utente se vuole proseguire o meno con la stampa.
Facendo così non sono riuscito a scongiurare che due utenti possano stampare lo stesso record.
Dove sto sbagliando? Secondo voi come potrei risolvere questo problema?
Grazie a tutti.

8 Risposte

  • Re: Stampa record in database multiutente

    Premesso che non capisco l'esigenza di impedire la stampa (quasi) contemporanea dello stesso record (con gli eventuali records correlati), a meno che tu voglia tenere traccia di data/ora/utente che effettua la stampa (o che durante la fase di stampa vengano anche modificati dei records) ....

    Comunque, potresti fare così :
    - verifichi il campo bool 'StampaInCorso', se = true esci dalla routine
    - apri un recordset in modifica sul record incriminato con un lock pessimistico, aggiorni a true il campo 'StampaInCorso' e chiudi il recordset
    - fai tutto quello che devi fare con la stampa
    - riapri il recordset sempre con un lock pessimistico, aggiorni a false il campo 'StampaInCorso' e chiudi il recordset
  • Re: Stampa record in database multiutente

    Aggiungo che i Report possono essere aperti in modalità SINCRONA acDialog dalla versione 2010 mi pare... e questo consente di impostare il flag di stampa alla fine reale... e di liberare il blocco in modo sincrono.
  • Re: Stampa record in database multiutente

    Ringrazio entrambi per le risposte che mi avete dato.

    max.riservo ha scritto:


    Premesso che non capisco l'esigenza di impedire la stampa (quasi) contemporanea dello stesso record (con gli eventuali records correlati), a meno che tu voglia tenere traccia di data/ora/utente che effettua la stampa (o che durante la fase di stampa vengano anche modificati dei records) ....
    L'esigenza di impedire la stampa quasi contemporanea è quella di non far produrre documenti cartacei duplicati, evitando spreco di carta e tempo. Cercando di spiegare meglio, provo a fare un esempio:
    L'utente A apre la maschera nel suo front-end per stampare e visualizza il primo record ma non lo manda ancora in stampa. L'utente B poco dopo apre anche lui la maschera nel suo front-end per stampare e visualizza il primo record che risulta ancora non stampato. A questo punto l'utente A manda in stampa. Per l'utente B il record che sta visualizzando è ancora da stampare e manda in stampa anche lui. In alcune situazioni, che non sono riuscito ad individuare, i 2 controlli che ho predisposto non impedito che l'utente A e l'utente B stampassero gli stessi documenti.

    max.riservo ha scritto:


    Comunque, potresti fare così :
    - verifichi il campo bool 'StampaInCorso', se = true esci dalla routine
    - apri un recordset in modifica sul record incriminato con un lock pessimistico, aggiorni a true il campo 'StampaInCorso' e chiudi il recordset
    - fai tutto quello che devi fare con la stampa
    - riapri il recordset sempre con un lock pessimistico, aggiorni a false il campo 'StampaInCorso' e chiudi il recordset
    Proverò a ricontrollare la sequenza degli eventi e proverò anche a variare il lock da ottimistico a pessimistico come mi hai suggerito.

    @Alex ha scritto:


    Aggiungo che i Report possono essere aperti in modalità SINCRONA acDialog dalla versione 2010 mi pare... e questo consente di impostare il flag di stampa alla fine reale... e di liberare il blocco in modo sincrono.
    Magari la mia non sarà la scelta corretta ma, date anche le mie limitate conoscenze, quando ho creato questa cosa ho optato per usare un documento Word già formattato, con tabelle e testo di default già inserito, dove vado ad aggiungere i dati ricavati dal database. Il documento risultante è molto articolato, 8 pagine, e riprodurlo in un report non mi sembrava una cosa facile, dato anche che, se non mi sbaglio, mi sembra di ricordare che in un report più di un certo numero di controlli non si possono inserire.
  • Re: Stampa record in database multiutente

    Certo ma è assolutamente normale anche usare Template di Word o Excel... sono fatti appositamente.
    In quel caso non userai l'anteprima ma manderei in stampa ed il metodo per rendere sincrona la stampa richiede l'apertura di un processo sincrono API ed il wait ... un po più complesso.
    Potrebbe non essere indispensabile...
  • Re: Stampa record in database multiutente

    Ciao @Alex, leggendo la tua risposta, mi sono accorto di aver dimenticato un particolare nel processo di stampa che avevo descritto. Ho dimenticato di specificare che gli utenti devono anche visualizzare il documento per controllare che non ci siano errori dato che vengono inseriti testi e commenti. Finita l'azione di controllo inviano il documento in stampa manualmente.

    @Alex ha scritto:


    In quel caso non userai l'anteprima ma manderei in stampa ed il metodo per rendere sincrona la stampa richiede l'apertura di un processo sincrono API ed il wait ... un po più complesso.
    Potrebbe non essere indispensabile...
    Cosa intendi per aprire un processo sincrono API ed il wait? Mi potresti dare qualche indicazione in più per capire meglio?
    Intanto, darò un'occhiata alla Demo "Eseguire un File e determinarne la chiusura" che ho trovato sul tuo sito. Ho pensato che potrei lasciare valorizzato a "True" il campo "Si/No" del record fino a che il documento Word non venga effettivamente chiuso dall'utente dopo la stampa manuale.
    Ci potrebbe essere un modo, che abbia senso fare, per aggiornare un controllo sulla maschera ed evitare di avere la falsa indicazione che il record che sta visualizzando un utente risulti ancora da stampare quando invece non lo è più perché è stato stampato da un altro utente?
    Grazie.
  • Re: Stampa record in database multiutente

    Buongiorno,
    provo a suggerire un approccio logico per determinare, in ambiente access, la priorità di stampa e quindi la scelta dell'utente che deve stampare il record.

    - Supponiamo di avere un campo associato ad ogni utente nel quale scriveremo il nr del record che si sta stampando.... (immagino ne stampino uno alla volta...) e un altro campo associato al record da valorizzare con "stampato", "si", 1 o similari nel momento in cui la stampa é avvenuta
    - l'utente preme stampa e quindi il campo viene valorizzato con l ID del record in fase stampa;
    - una volta scritto nel campo, supponiamo di ritardare la stampa "effettiva" di 5 secondi e, nell'attesa, verificare nel campo, se qualche altro utente ha lo stesso ID e, contemporaneamente, cerchiamo anche nel campo associato al record per vedere che lo stesso non sia già stato stampato.

    ...5 secondi (ma anche 1) sono piu che sufficienti per adottare delle procedure che determinino il via alla stampa x l'uno e il diniego per gli altri, eventuali utenti...


    Così. Facendo si eviterebbe anche il blocco pessimistico dei record...
  • Re: Stampa record in database multiutente

    Non so se è una buona idea... il codice è abbastanza semplice ma non immediato...

    Qui trovi 2 esempi... sono datati e non li ho riprovati su versioni 64bit... ma credo andrebbero ri-adattati in quanto le API hanno subito qualche variazione.

    Il primo è forse più adatto... ma il 2° anche su singolo ciclo... forse è meglio... ovviamente devi compilare il documento all'interno del processo...
  • Re: Stampa record in database multiutente

    Ringrazio tutti per i contributi forniti. Ora cercherò di riordinare un po' le idee, fare delle prove e vedere se riesco a realizzare qualcosa di buono.
Devi accedere o registrarti per scrivere nel forum
8 risposte