PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 2024 → Protéger un document word
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.