Accueil > Lotus Notes logiciel , Lotus Notes Solution , Lotus Notes Tutoriel , LotusScript , notes Designer > Lotus Notes Attachmentment domaine Richtext cochant ou Taille Without Saving le document

Lotus Notes Richtext vérification sur le terrain ou Attachmentment Taille Without Saving le document

Plusieurs threads couvrir le thème de la prévention de la fixation du excessivement gros fichiers à un document Notes, et un obstacle majeur semble être la manière de le faire sans enregistrer d'abord le document, et encore moins sans avoir d'abord joindre le fichier. Sans couvrant l'ensemble des raisons pour lesquelles c'est un défi, j'ai pensé qu'il pourrait être utile pour moi de détailler la solution que je suis venu avec après avoir lu plusieurs postes dans ce forum et reconstituer le tout.

Objectifs de la conception:

1 - Limiter la taille permise des accessoires (taille totale, dans ce cas, pas de fichier par fichier) à tout document spécifique
2 - Comme il peut prendre une éternité pour joindre un fichier qui peut finalement être rejetée (le plus long de l'éternité, la plus grande vraisemblance la il sera refusé), nous voulons idéalement pour vérifier la taille d'un fichier avant il est attaché à un document . Cela se traduit par la nécessité de vérifier la taille du fichier d'un fichier au niveau système de fichiers.
3 - Préserver quelle que soit la convivialité qui existe déjà dans le processus d'attachement (je sais "Qu'est-ce la convivialité?"). En bref, lorsque nous joindre des fichiers, la boîte de dialogue d'ouverture de fichier devrait continuer à ouvrir le répertoire, nous consulté pour la dernière, et pas toujours vers le répertoire de données Notes.

Étapes:
1 - Créer un sous-formulaire appelé «pièces jointes»
2 - Mettez le code suivant dans les déclarations globales:

Dim ws Comme NotesUIWorkspace
Session As NotesSession
Dim db Comme NotesDatabase
Uidoc As NotesUIDocument
Doc As NotesDocument
GlobalSaveFlag As Integer 'sera utilisé pour vérifier si le document a été effectivement sauvé plus tard

Declare Function NEMGetFile Lib "NNOTESWS" Alias ​​"NEMGetFile" _
(Zéro As Integer, ByVal filename As String, ByVal filtre As String, ByVal titre As String) As Integer

3 - Mettez cette fonction dans les sous-formulaires globales:

Fonction LocalBrowse (titre As String, par défaut As String, filtre As String) As String
Filename As String * 1024
filename = par défaut
Si le filtre = "" Then filtre = "Tous les fichiers | * |."
le statut% = NEMGetFile (0, nom de fichier, filtre, le titre)

Sélectionnez l'état de cas%
Cas 0: LocalBrowse = "" 'annulation
Cas 1: LocalBrowse = Trim $ (nom de fichier)
Case Else: Erreur 1000, "Erreur & H" & Hex $ (% d'état) & "dans LocalBrowse"
End Select
End Function

4 - Evénement PostOpen:

»Besoin d'initialiser plusieurs variables globales
Réglez ws = New NotesUIWorkspace
Session Set = New NotesSession
Set db = Session.currentdatabase
Réglez uidoc = Source
Réglez doc = uidoc.document

5 - PostRecalc (Fonctions @ au lieu de script)

@ Si (AttachFileName = ""; @ return (""); "");
@ Command ([EditGotoField]; «pièces jointes»);
@ Command ([EditInsertFileAttachment]; AttachFileName; "0");
AttachFileName DOMAINE: = "";

6 - QuerySave:

DBProfile As NotesDocument 'option - si vous voulez être en mesure de configurer votre limite de taille
SizeLimit As long

GlobalSaveFlag = Continuer »De sorte que si rien d'autre modifie Continuer, il est détecté.

Set DBProfile = db.GetProfileDocument ("DBSettings") 'Ceci est mon profil DB générique, mais vous pouvez utiliser ce que vous voulez ici

«Ou utiliser ce document pour stocker le profil en quelque sorte la limite, ou coder en dur la limite (en octets) ici
SizeLimit = DBProfile.AttachSizeLimit (0)
Des sizelimit = 1048576 '1 Mo

»Ajoutons jusqu'à la taille totale des pièces jointes existantes pour voir si elle dépasse notre limite
'Ce script ne devrait être nécessaire si un utilisateur a été sneeky et a utilisé un traditionnel "Joindre"
«Commande dans le menu fichier, au lieu des boutons pour sélectionner un fichier
Si doc.AttachmentSizeTotal (0)> Puis SizeLimit
Msgbox "Vous avez dépassé la limite de 1 Mo sur les pièces jointes. "& Chr (10) & Chr (10) & _
"S'il vous plaît supprimer les pièces jointes ou compresser votre fichier (s).", 16, "Erreur pièce jointe"
Continuer = False
Exit Sub
D'autre
Continuer = True
End If

7 - QueryClose:

«Réinitialiser le domaine AttachFileName si nous avons laissé rempli et ont enregistré le document
«Probablement redondant, mais juste au cas où
Si GlobalSaveFlag = True Et doc.AttachFileName (0) <> "" Then
doc.AttachFileName = ""
Appelez doc.Save (True, False)
End If

8 - Créer un bouton "Joindre un fichier" avec le lotuscript suivante:

Sous Click (Source As Button)
NouveauNomFichier Dim As String
Currentpath Dim As String
DBProfile As NotesDocument
VerLen As long
SizeLimit As long

Set DBProfile = db.GetProfileDocument ("DBSettings") 'Ceci est mon profil DB générique, mais vous pouvez utiliser ce que vous voulez ici

«Ou créer ce document en quelque sorte le profil pour stocker la limite, ou coder en dur la limite (en octets) ici
SizeLimit = DBProfile.AttachSizeLimit (0)
Des sizelimit = 1048576 '1 Mo

NouveauNomFichier = LocalBrowse ("Joindre un fichier", "", "")
doc.AttachFileName = NouveauNomFichier
currentpath = Strleftback (NouveauNomFichier, "\")

«Ceci permet de réinitialiser la valeur par défaut en revue le répertoire à celui qui vient recherché
Appeler Session.SetEnvironmentVar ("FileDlgDirectory", currentpath)

verLen & = FileLen (doc.AttachFileName (0)) 'la fonction FileLen est le vrai truc pour tout ce

»Ajoutons jusqu'à la taille totale des pièces jointes existantes et le nouveau fichier sélectionné pour voir si elle dépasse notre limite
Si (verLen & + doc.AttachmentSizeTotal (0))> Puis SizeLimit
Msgbox "Ce fichier sera supérieure à la limite de 1 Mo sur les pièces jointes. "& Chr (10) & Chr (10) & _
"S'il vous plaît supprimer les pièces jointes ou compresser votre fichier (s).", 16, "Erreur pièce jointe"
doc.AttachFileName = ""
D'autre
doc.AttachmentSizeTotal = doc.AttachmentSizeTotal (0) + verLen et
End If

Appelez uidoc.Refresh 'déclenche l'événement postrecalc qui viendra compléter le processus d'attachement

End Sub

9 - Créer un champ de texte éditable appelé "AttachFileName". Ne pas entrer dans les formules, et masquer le champ de la vue.

10 - Créer un caché, le champ nombre calculé appelé "AttachmentSizeTotal" avec la formule suivante:

REM "ne sont pas vraiment recalculer ce domaine si nous n \ 'êtes au milieu d'un processus d'attachement";
tmp: = @ Si (AttachFileName = ""; @ @ Sum (AttachmentLengths); AttachmentSizeTotal);
@ Si (@ IsError (tmp); 0; tmp)

11 - Maintenant, créez le champ de texte riche réelle qui va stocker les pièces jointes. Appelez ce champ modifiable "Pièces jointes", et décochez la case "Afficher le champ délimiteurs" case à cocher (cela vous permettra d'en faire "look" comme un champ calculé pour les utilisateurs et les aider de les empêcher de faire de la normale "Fichier - Fixer ..." routine qui ruinerait nos objectifs.

C'est tout ce que vous devez faire. Simple non? :-) . En supposant que vous avez fait tout cela correctement (et que je l'ai décrit à juste titre), l'utilisateur doit être en mesure d'utiliser notre bouton pour sélectionner un fichier pour la fixation, et continuer à cliquer jusqu'à ce qu'ils aient sélectionné un fichier qui sera mis les dessus de la limite. À ce moment-là, l'opération de fixation s'arrête et ils verront un message d'avertissement. Donc, la prochaine fois, vos utilisateurs tentez de joindre un fichier de 100 Mo, ils n'auront pas à attendre après le déjeuner pour découvrir qu'ils ont fait une mauvaise chose. Si elles parviennent malgré tout à joindre des fichiers qui dépassent la limite en utilisant la normale "Fichier - Fixer ..." approche, le QuerySave va attraper cette situation. Donc, pour résumer, les trois principales «avancées» dans cette approche sont les suivants:

1 - Utilisation de la fonction API NEMGetFile d'appeler une boîte de dialogue Fichier Ouvrir normale
2 - Ecriture d'une valeur pour le répertoire le plus récent à la variable d'environnement dans le FileDlgDirectory Notes.ini
3 - Utilisation de la fonction FileLen pour vérifier la taille d'un fichier dans le système de fichiers de l'utilisateur, étant donné le filepath comme entrée

Plusieurs threads couvrir le thème de la prévention de la fixation du excessivement gros fichiers à un document Notes, et un obstacle majeur semble être la manière de le faire sans enregistrer d'abord le document, et encore moins sans avoir d'abord joindre le fichier. Sans couvrant l'ensemble des raisons pour lesquelles c'est un défi, j'ai pensé qu'il pourrait être utile pour moi de détailler la solution que je suis venu avec après avoir lu plusieurs postes dans ce forum et reconstituer le tout.

Objectifs de la conception:

1 - Limiter la taille permise des accessoires (taille totale, dans ce cas, pas de fichier par fichier) à tout document spécifique
2 - Comme il peut prendre une éternité pour joindre un fichier qui peut finalement être rejetée (le plus long de l'éternité, la plus grande vraisemblance la il sera refusé), nous voulons idéalement pour vérifier la taille d'un fichier avant il est attaché à un document . Cela se traduit par la nécessité de vérifier la taille du fichier d'un fichier au niveau système de fichiers.
3 - Préserver quelle que soit la convivialité qui existe déjà dans le processus d'attachement (je sais "Qu'est-ce la convivialité?"). En bref, lorsque nous joindre des fichiers, la boîte de dialogue d'ouverture de fichier devrait continuer à ouvrir le répertoire, nous consulté pour la dernière, et pas toujours vers le répertoire de données Notes.

Étapes:
1 - Créer un sous-formulaire appelé «pièces jointes»
2 - Mettez le code suivant dans les déclarations globales:

Dim ws Comme NotesUIWorkspace
Session As NotesSession
Dim db Comme NotesDatabase
Uidoc As NotesUIDocument
Doc As NotesDocument
GlobalSaveFlag As Integer 'sera utilisé pour vérifier si le document a été effectivement sauvé plus tard

Declare Function NEMGetFile Lib "NNOTESWS" Alias ​​"NEMGetFile" _
(Zéro As Integer, ByVal filename As String, ByVal filtre As String, ByVal titre As String) As Integer

3 - Mettez cette fonction dans les sous-formulaires globales:

Fonction LocalBrowse (titre As String, par défaut As String, filtre As String) As String
Filename As String * 1024
filename = par défaut
Si le filtre = "" Then filtre = "Tous les fichiers | * |."
le statut% = NEMGetFile (0, nom de fichier, filtre, le titre)

Sélectionnez l'état de cas%
Cas 0: LocalBrowse = "" 'annulation
Cas 1: LocalBrowse = Trim $ (nom de fichier)
Case Else: Erreur 1000, "Erreur & H" & Hex $ (% d'état) & "dans LocalBrowse"
End Select
End Function

4 - Evénement PostOpen:

»Besoin d'initialiser plusieurs variables globales
Réglez ws = New NotesUIWorkspace
Session Set = New NotesSession
Set db = Session.currentdatabase
Réglez uidoc = Source
Réglez doc = uidoc.document

5 - PostRecalc (Fonctions @ au lieu de script)

@ Si (AttachFileName = ""; @ return (""); "");
@ Command ([EditGotoField]; «pièces jointes»);
@ Command ([EditInsertFileAttachment]; AttachFileName; "0");
AttachFileName DOMAINE: = "";

6 - QuerySave:

DBProfile As NotesDocument 'option - si vous voulez être en mesure de configurer votre limite de taille
SizeLimit As long

GlobalSaveFlag = Continuer »De sorte que si rien d'autre modifie Continuer, il est détecté.

Set DBProfile = db.GetProfileDocument ("DBSettings") 'Ceci est mon profil DB générique, mais vous pouvez utiliser ce que vous voulez ici

«Ou utiliser ce document pour stocker le profil en quelque sorte la limite, ou coder en dur la limite (en octets) ici
SizeLimit = DBProfile.AttachSizeLimit (0)
Des sizelimit = 1048576 '1 Mo

»Ajoutons jusqu'à la taille totale des pièces jointes existantes pour voir si elle dépasse notre limite
'Ce script ne devrait être nécessaire si un utilisateur a été sneeky et a utilisé un traditionnel "Joindre"
«Commande dans le menu fichier, au lieu des boutons pour sélectionner un fichier
Si doc.AttachmentSizeTotal (0)> Puis SizeLimit
Msgbox "Vous avez dépassé la limite de 1 Mo sur les pièces jointes. "& Chr (10) & Chr (10) & _
"S'il vous plaît supprimer les pièces jointes ou compresser votre fichier (s).", 16, "Erreur pièce jointe"
Continuer = False
Exit Sub
D'autre
Continuer = True
End If

7 - QueryClose:

«Réinitialiser le domaine AttachFileName si nous avons laissé rempli et ont enregistré le document
«Probablement redondant, mais juste au cas où
Si GlobalSaveFlag = True Et doc.AttachFileName (0) <> "" Then
doc.AttachFileName = ""
Appelez doc.Save (True, False)
End If

8 - Créer un bouton "Joindre un fichier" avec le lotuscript suivante:

Sous Click (Source As Button)
NouveauNomFichier Dim As String
Currentpath Dim As String
DBProfile As NotesDocument
VerLen As long
SizeLimit As long

Set DBProfile = db.GetProfileDocument ("DBSettings") 'Ceci est mon profil DB générique, mais vous pouvez utiliser ce que vous voulez ici

«Ou créer ce document en quelque sorte le profil pour stocker la limite, ou coder en dur la limite (en octets) ici
SizeLimit = DBProfile.AttachSizeLimit (0)
Des sizelimit = 1048576 '1 Mo

NouveauNomFichier = LocalBrowse ("Joindre un fichier", "", "")
doc.AttachFileName = NouveauNomFichier
currentpath = Strleftback (NouveauNomFichier, "\")

«Ceci permet de réinitialiser la valeur par défaut en revue le répertoire à celui qui vient recherché
Appeler Session.SetEnvironmentVar ("FileDlgDirectory", currentpath)

verLen & = FileLen (doc.AttachFileName (0)) 'la fonction FileLen est le vrai truc pour tout ce

»Ajoutons jusqu'à la taille totale des pièces jointes existantes et le nouveau fichier sélectionné pour voir si elle dépasse notre limite
Si (verLen & + doc.AttachmentSizeTotal (0))> Puis SizeLimit
Msgbox "Ce fichier sera supérieure à la limite de 1 Mo sur les pièces jointes. "& Chr (10) & Chr (10) & _
"S'il vous plaît supprimer les pièces jointes ou compresser votre fichier (s).", 16, "Erreur pièce jointe"
doc.AttachFileName = ""
D'autre
doc.AttachmentSizeTotal = doc.AttachmentSizeTotal (0) + verLen et
End If

Appelez uidoc.Refresh 'déclenche l'événement postrecalc qui viendra compléter le processus d'attachement

End Sub

9 - Créer un champ de texte éditable appelé "AttachFileName". Ne pas entrer dans les formules, et masquer le champ de la vue.

10 - Créer un caché, le champ nombre calculé appelé "AttachmentSizeTotal" avec la formule suivante:

REM "ne sont pas vraiment recalculer ce domaine si nous n \ 'êtes au milieu d'un processus d'attachement";
tmp: = @ Si (AttachFileName = ""; @ @ Sum (AttachmentLengths); AttachmentSizeTotal);
@ Si (@ IsError (tmp); 0; tmp)

11 - Maintenant, créez le champ de texte riche réelle qui va stocker les pièces jointes. Appelez ce champ modifiable "Pièces jointes", et décochez la case "Afficher le champ délimiteurs" case à cocher (cela vous permettra d'en faire "look" comme un champ calculé pour les utilisateurs et les aider de les empêcher de faire de la normale "Fichier - Fixer ..." routine qui ruinerait nos objectifs.

C'est tout ce que vous devez faire. Simple non? :-) . En supposant que vous avez fait tout cela correctement (et que je l'ai décrit à juste titre), l'utilisateur doit être en mesure d'utiliser notre bouton pour sélectionner un fichier pour la fixation, et continuer à cliquer jusqu'à ce qu'ils aient sélectionné un fichier qui sera mis les dessus de la limite. À ce moment-là, l'opération de fixation s'arrête et ils verront un message d'avertissement. Donc, la prochaine fois, vos utilisateurs tentez de joindre un fichier de 100 Mo, ils n'auront pas à attendre après le déjeuner pour découvrir qu'ils ont fait une mauvaise chose. Si elles parviennent malgré tout à joindre des fichiers qui dépassent la limite en utilisant la normale "Fichier - Fixer ..." approche, le QuerySave va attraper cette situation. Donc, pour résumer, les trois principales «avancées» dans cette approche sont les suivants:

1 - Utilisation de la fonction API NEMGetFile d'appeler une boîte de dialogue Fichier Ouvrir normale
2 - Ecriture d'une valeur pour le répertoire le plus récent à la variable d'environnement dans le FileDlgDirectory Notes.ini
3 - Utilisation de la fonction FileLen pour vérifier la taille d'un fichier dans le système de fichiers de l'utilisateur, étant donné le filepath comme entrée

Vu 7832 fois par 2651 spectateurs

  1. ed
    26 août 2010 à 10:53 | # 1

    Une bonne. Ce poste est très utile. Merci!

  2. Jon
    22 novembre 2010 à 05:41 | # 2

    Peu importe ce que je tente, je continue à avoir plusieurs «variante ne contient pas une valeur" des messages d'erreur. Il semble que je dois déclarer parfois plusieurs variabels. Qu'est-ce que je peux faire. S'il vous plaît aviser. Merci.

  3. Jon
    22 novembre 2010 à 06:35 | # 3

    Désolé, déjà résolu. Le poste est grande. Thnx

  1. Aucun trackback pour l'instant.