|
Protéger un document word |
Iniciado por KC76, fev., 28 2020 10:56 AM - 10 respostas |
| |
| | | |
|
| |
Membro registado 121 mensagems Popularité : +3 (3 votes) |
|
Publicado em fevereiro, 28 2020 - 10:56 AM |
Bonjour, Nous avons du très vieux code (ca date de 2002, crée par mon prédécesseur) qui nous permet de faire du publipostage pour faire des étiquettes produit (on crée un nombre illimité pour différents raisons/clients/produits à la carte et ont une bibliothèque des "modèles" étiquette.)
Ce code utilise écrit des données dans un nouveau document Word, puis il remplace un fichier word " base de données " qui est le document source de tous nos modèles d'étiquettes existantes.
Le problème aujourd'hui c'est qu'il n'y pas une personne mais trois qui impriment les étiquettes et s'ils font en même temps, personne A rempli le fichier BDD et avant qu'il puisse imprimer ses étiquettes personne B vient et écrase le fichier de BDD avec d'autres données. Alors les données de personne B impriment chez personne A.
J'aimerais protegee ce document BDD quand personne A le enregistre, et le déprotéger quand il aurait fini d'imprimer. Je ne peux pas utiliser fbloque je pense parce que je n'ouvre pas le document en question, je l'écrase.
Je pense qu'il faut utiliser protect/unprotect mais je ne sais pas trop le faire (j'essaie ici) Tous mes essais avait des erreurs Avec ce code ci, j'ai une erreur sur unprotect, en disant que mon fichier est déjà déprotégé, peut-être parce que je ferme au milieu pour jongler entre documents actives?
Merci pour votre aide,
Voici le code, c'est SAI_DOCUMENTBDD que je dois protéger:
SI SAI_DOCUMENTBDD="" ALORS Info("Aucune base de données n'a été sélectionné") RepriseSaisie(SAI_DOCUMENTBDD) RETOUR FIN // vérifie existence du fichier BDD SI fRep(SAI_DOCUMENTBDD,frFichier)="" ALORS Erreur("La base de données " +SAI_DOCUMENTBDD+" est introuvable") RETOUR FIN NomDocument=SAI_DOCUMENT //nom du document sélectionné //vérifie si un modèle est sélectionné SI NomDocument="" ALORS Info("Aucun modèle n'a été sélectionné") RepriseSaisie(SAI_DOCUMENT) RETOUR FIN // vérifie existence du modèle SI fRep(NomDocument,frFichier)="" ALORS Erreur("Le modèle " +NomDocument+" est introuvable") RETOUR FIN
BTN_Ferme..Etat = Grisé; BTN_Ferme..Visible=Vrai
Sablier(Vrai) Message("Préparations des enregistrements à imprimer") //Ajout de la ligne de titre- Si on ajoute des champs ici il faut ajouter des colonnes dans bdetiq.doc qui devient plein horizontalement ch_listeetiq="Annee"+TAB+"RefProduitClient"+TAB+"NomProduit1"+TAB+"NomProduit2"+TAB+"NomClient"+TAB+"NumeroEtiq"+... TAB+"NumCde"+TAB+"posteCde"+TAB+"CodeProduit"+TAB+"Dimension1"+TAB+"Dimension2"+TAB+"Dimension3"+... TAB+"Caract1"+TAB+"Semaine"+TAB+"SAI_REFCDECLI"+TAB+"SAI_VPOSTE"+TAB+"SAI_MARQUAGE"+TAB+"SAI_AnneePeremption"+TAB+"Mois"+TAB+"Trimestre"+TAB+"SAI_PAS"+TAB+"SAI_QTEDEM"
nNbCol=ChaîneOccurrence(ch_listeetiq,TAB)+1 //on compte le nombre de colonnes en comptant les tabs + 1 NbLig=SAI_NbreEtiq SI NbLig=0 ALORS RepriseSaisie(SAI_NbreEtiq) SI NbLig>0 ALORS SI PAS InitWord(gMail,WordVisible) ALORS Message() Sablier(Faux) BTN_Ferme..Etat = Actif; BTN_Ferme..Visible=Vrai //Ferme les documents gMail>>Documents>>close(OLEFalse) //Fermer Word Message("Fermeture de Word") gMail>>Quit() libérer gMail RETOUR FIN //---------DEBUT Préparation du document de données pour fusion------------// POUR i1=1 À SAI_NbreEtiq Message("Préparation du document de fusion") //Sélectionne uniquement les clients sélectionnés SI NomFichier = "CDELIG" ALORS sLignecmde = CDELIG.CLELIG SINON sLignecmde = F_CMDEINTERNE.CLELIG FIN SI PAS InfoPosteCmde(sLignecmde,UnClient,SAI_NumEtiqDeb+i1-1) ALORS Info("Poste de commande non trouvé") RETOUR SINON SI Taille(ch_listeetiq)+Taille(UnClient)>(32*1024) ALORS //Capacité maximum atteinte //Limite des chaines de caractères du VBA PrepareFusion(nNbCol,ch_listeetiq) ch_listeetiq=UnClient SINON //+= prépare ch_listeetiq +=RC+UnClient
FIN FIN FIN SI ch_listeetiq<>"" ALORS //Fin de la liste PrepareFusion(nNbCol,ch_listeetiq) ch_listeetiq="" FIN
//Voir ici si document en utilisation et sinon protege le
//Enregistrer le document sous le nom "bdetiq.doc" QUAND EXCEPTION DANS gMail>>ActiveDocument>>SaveAs(SAI_DOCUMENTBDD) gMail>>Documents>>open(SAI_DOCUMENTBDD,OLEFaux,OLEFaux) //SAI_DOCUMENTBDD SI gMail>>ActiveDocument>>ProtectionType=2 ALORS Info("Document en cours d'utilisation par "+gMail>>ActiveDocument>>BuiltInDocumentProperties(3)>>value())
SINON gMail>>ActiveDocument>>protect(2,True,"password") FIN
FAIRE Erreur("Impossible de faire le publipostage. Vérifier que le fichier "+SAI_DOCUMENTBDD +" est fermé et non utilisé et réessayer."+RC+RC,ExceptionInfo()) RETOUR FIN //---------FIN Préparation du document de données pour fusion------------// //---------DEBUT Préparation de la fusion------------// //Fermeture des documents Word gMail>>Documents>>close(OLEFalse)
Multitâche(-30) Message("Ouverture de la lettre type") QUAND EXCEPTION DANS //Ouverture de la lettre type gMail>>Documents>>open(NomDocument,OLEFaux,OLEFaux) //SAI_DOCUMENT Multitâche(-30) Message("Fusion") FAIRE Erreur("Impossible d'ouvrir le document. Vérifiez qu'il n'est pas déjà ouvert et que vous avez paramétré votre ordinateur(onglet Paramétrage du poste)."+RC+ExceptionInfo()) RETOUR FIN //Prépare le publipostage vers un nouveau document QUAND EXCEPTION DANS gMail>>ActiveDocument>>MailMerge>>Destination=wdSendToNewDocument Multitâche(-30) // on fusionne vers un nouveau document gMail>>ActiveDocument>>MailMerge>>Execute(OLEFaux) Multitâche(-30)
FAIRE Erreur("Impossible de faire le publipostage.",ExceptionInfo()) RETOUR FIN
//---------FIN Préparation de la fusion------------// //Fermeture des documents Word SAI_DOCUMENT (modèle d'étiquette) QUAND EXCEPTION DANS gMail>>Documents>>Item(NomDocument)>>close(wdDoNotSaveChanges) FAIRE Erreur("Erreur sur le fermeture automatique de modèle d'étiquettes.",ExceptionInfo()) RETOUR FIN
SI INT_APERCU = Faux ALORS //on imprime directement //Imprimer sur Lettres Type1 QUAND EXCEPTION DANS gMail>>ActiveDocument>>printout //Fermer Lettres Type 1 gMail>>Documents>>Item("Lettres Types1")>>close(wdDoNotSaveChanges) FAIRE Erreur("Erreur sur l'impression et fermeture de document des étiquettes crée.",ExceptionInfo()) RETOUR FIN FIN //deproteger le document gMail>>Documents>>open(SAI_DOCUMENTBDD,OLEFaux,OLEFaux) //SAI_DOCUMENTBDD gMail>>ActiveDocument>>unprotect("password") gMail>>Documents>>close(OLEFalse) libérer gMail //temp gris pour test |
| |
| |
| | | |
|
| | |
| |
Membro registado 3.845 mensagems Popularité : +227 (347 votes) |
|
Publicado em fevereiro, 28 2020 - 11:36 AM |
Bonjour, As tu pensé au groupware utilisateur. Le premier utilisateur serait dans un groupe "temporaire" qui aurait les droits sur SAI_DocumentBDD et pas les autres. L'inclusion dans ce groupe ne serait possible que si le groupe est vide. A l'issue de l'impression, l'utilisateur serait "retiré" du groupe.
-- Il y a peut être plus simple, mais, ça tourne |
| |
| |
| | | |
|
| | |
| |
Membro registado 121 mensagems Popularité : +3 (3 votes) |
|
Publicado em fevereiro, 28 2020 - 12:43 PM |
Non, je n'ai pas pensé, je regarderai ca lundi, je ne n'utilise pas du tout groupware utilisateur pour le moment. merci |
| |
| |
| | | |
|
| | |
| |
Publicado em fevereiro, 28 2020 - 4:09 PM |
plutot que de protéger le document word, tu peux créer une file d'attente et ne faire qu'un seul mailmerge à la fois 1. tu extrais la fonction de mailmerge dans un exe à part qjui est lancé (sil ne l'est pas déjà) quand nécessaire 2. dans ton soft, tu prépare toutes les données nécessaires et les stockes dans une file d'attente quelconque 3. donc, si 3 utilisateurs font ca en même temps, il y a 3 entrées dans la file d'attente 4. l'exe externe scrute la file d'attente et fait un traitement à la fois, |
| |
| |
| | | |
|
| | |
| |
Membro registado 121 mensagems Popularité : +3 (3 votes) |
|
Publicado em março, 02 2020 - 9:23 AM |
Merci de votre idée,
Je n'ai pas précisé, mais chaque personne a son logiciel qui tourne sur son pc avec imprimante local (trois imprimantes alors), ca ne serait pas compliqué d'assurer que les bonnes étiquettes sortent au bon endroit? |
| |
| |
| | | |
|
| | |
| |
Membro registado 42 mensagems Popularité : +6 (6 votes) |
|
Publicado em março, 02 2020 - 3:23 PM |
Bonjour, Générer un nom unique par utilisateur pour le document word soit an ajoutant un GUID au nom initial, soit en ajoutant le nom de l'utilisateur ou du poste? |
| |
| |
| | | |
|
| | |
| |
Membro registado 3.845 mensagems Popularité : +227 (347 votes) |
|
Publicado em março, 02 2020 - 6:08 PM |
KC76 a écrit :
ca ne serait pas compliqué d'assurer que les bonnes étiquettes sortent au bon endroit?
Es-tu allé regarder du côté de iDestination ?
-- Il y a peut être plus simple, mais, ça tourne |
| |
| |
| | | |
|
| | |
| |
Membro registado 121 mensagems Popularité : +3 (3 votes) |
|
Publicado em março, 03 2020 - 9:16 AM |
Bonjour, C'est ca presque que je voulais faire, mais comment je gère la source de données dans les document modèles du publipostage?
Pour l'instant je pensais faire une copie local de ma "base de données" mais il faut que je change la source (du fichier serveur au fichier en local) dans des centaines des documents modèles, et je n'ai pas encore trouvé comment faire ça autre que manuellement |
| |
| |
| | | |
|
| | |
| |
Membro registado 121 mensagems Popularité : +3 (3 votes) |
|
Publicado em março, 03 2020 - 10:59 AM |
ou bien changer la source dans le code, j'essaie avec
gMail>>MailMerge>>OpenDataSource>>Name= SAI_DOCUMENTBDD
avant gMail>>ActiveDocument>>MailMerge>>Destination=wdSendToNewDocument
mais je n'arrive pas pour le moment, à faire fonctionner ca non plus...Mensagem modificada, março, 03 2020 - 11:00 AM |
| |
| |
| | | |
|
| | |
| |
Membro registado 3.845 mensagems Popularité : +227 (347 votes) |
|
Publicado em março, 03 2020 - 12:11 PM |
Il y a aussi la possibilité de créer un état étiquette basé sur un fichier texte
-- Il y a peut être plus simple, mais, ça tourne |
| |
| |
| | | |
|
| | |
| |
Membro registado 121 mensagems Popularité : +3 (3 votes) |
|
Publicado em março, 03 2020 - 3:07 PM |
Le problème c'est le nombre de modèles déjà existantes et le fait que les étiquettes peuvent être tellement différent dans chaque cas (souvent c'est le client qui impose LEUR modèle d'étiquette) c'est pour ca on utilise le publipostage.
Cela dit, je pense que j'ai réussi, je n'avais pas eu le bon syntaxe toute à l'heure, je l'ai modifié un peu et maintenant j'ai gMail>>ActiveDocument>>MailMerge>>OpenDataSource(SAI_DOCUMENTBDD)
avant gMail>>ActiveDocument>>MailMerge>>Destination=wdSendToNewDocument
et ca prends bien de ma base indiqué dans SAI_DOCUMENTBDD peu importe la source indiqué dans ma modèle d'étiquette
merci à tout le monde pour leurs suggestions! J'espère que ca aidera qqn d'autre dans le futur. |
| |
| |
| | | |
|
| | | | |
| | |
|