DDM : Digital Document Manager

Ce document décrit l’implémentation standard de DDM dans la partie application d’ACE. Y sont décrit les écrans et leurs principes, ainsi que les principes généraux d’utilisation et de développement.

Description fonctionnelle

Principes généraux : description des écrans

L’affichage des médias des produits, tiers, événements, etc… répond aux mêmes principes et sont implémentés dans les mêmes composants logiciels et donc toujours affichés dans les même écrans et dans le même format, même si leur intégration ergonomique est propre à chaque objets.

Les différents écrans visibles sont les suivants :

Ecran de visualisation synthétique des médias

Son objectif est d’avoir une vue synthétique des médias existants sur l’objet. Il permet d’accéder à l’écran de gestion en liste des médias ou directement à l’affichage d’un média :

Il est composé de 3 parties.

1. Le bouton d’accès à la gestion en liste des médias

2. L’affichage direct des thumbnails des médias typés « showroom » (PHR).

3. Affichage de tous les autres médias sous forme de petites icônes de fichier.

Il n’y a pas d’affichage des versions, seule la dernière version en cours est référencée.

Rappel : dans les écrans des événements (et des postes), cet écran est accédé de la manière suivante :

Donne :

Ecran de liste des médias : Gérer les médias

Cet écran permet d’afficher les médias en liste, ainsi que de les gérer (modifier/supprimer) et d’en importer de nouveaux directement sur l’objet géré. Il est accessible depuis le bouton « Gérer les médias ».

L’affichage des médias dans cette liste correspond aux règles de gestion des écrans en liste (voir paramétrage table Type de média _ tme).

Cet écran est trié par défaut par date d’import du média (le dernier importé en premier).

Tous les médias existants sont listés, y compris les différentes versions d’un même document.

Sont modifiables : le type de média (voir paramétrage table Type de média _ tme), l’ordre (sensé paramétrer l’ordre d’affichage, actuellement non géré), le libellé et la langue (attribut qui permet essentiellement de filtrer la liste des médias).

NOTA : Il en existe deux autres variantes : celle du portail « I_DDM_F » et celles de « vos documents », abordés plus loin dans ce document.

Ecran d’affichage d’un média

Cet écran correspond aux règles de gestion du mode fiche (plein écran) d’un média. Il permet la visualisation du média en lui-même (selon règles de gestion associées au type de média (voir table tme), voire de son thumbnail, et de ses différentes règles de gestion.

Exemple dans le cas d’une image :

Un clic sur l’icône permet de downloader le média.

Les différentes versions sont directement accessibles. Ici la version 3 est affichée.

Exemple dans le cas d’un PDF (règle de gestion « embeded »):

Si un thumbnail a été généré il sera affiché, comme pour l’image précédente.

Exemple dans le cas d’un visio (non géré en affichage) :

Ici, la seule option possible est de télécharger le document en cliquant sur l’icône.

Cas d’un document indexé :

Une icône de dossier (aussi présente en mode liste) figure le fait que le contenu du document a été indexé.

Cas de l’édition d’un média

Dans certains cas, (portail I_DDM_F) ce même écran permet aussi d’éditer les informations du média (changer son rattachement à un objet de gestion par exemple) :

Ecrans existants

En version 162, les « objets » de gestion auxquels on peut rattacher des médias sont les suivants :

Objet Géré dans les écrans standards 162 Implémentation dans DDM Racine « media_blob.typtie » Composition de la clé fonctionnelle « Media_blob.nomcle »
Produits Oui Oui PRO Codpro
Rubriques de catalogue Oui Oui RCA Codrca
Référencement Non Non PRC  
Tiers Oui Oui TIE Typtie/Sigtie
Evénements Oui Oui EVE Achvte/Typeve/Numeve
Postes d’événements Oui Oui EVP Achvte/Typeve/Numeve/Numpos
Elaborations tarifaires Oui Oui TAL Numelabo
Cibles de paramétrage (GPEV) Oui Oui PEV Codpev
Actions (dossiers) Oui Oui TIM Typtie/Sigtie/Numtim
Compta / finance

Pièces

Relevés

Relances

Mandats de prélèvements

Journaux

Contrats Non Non CNT  
Lignes de contrats Non Non CNP  
Etiquettes (impression) Oui Non ETI  

Non rattaché

(Nouveauté DDM)

Non Oui DDM Racine paramétrée + Numéro de séquence

En complément, sur l’écran d’accueil de l’application, l’onglet « Vos documents » a été repris dans DDM suivant les mêmes principes.

Vos documents

Le principe général est pour l’utilisateur de pouvoir charger des documents pour sa propre utilisation, ainsi que les modifier. Dans le même écran, il peut visualiser des documents « corporate » uploadés sur les entités magasin (niv4) ou groupe (niv1).

Les documents affichés en liste et sont triés par défaut par ordre inverse de chargement en base, afin de présenter les documents les plus récents en premier.

Produits, tiers, événements

L’affichage des médias des produits, tiers et événements répond aux mêmes principes et sont implémentés dans les mêmes composants logiciels, même si leur intégration ergonomique est propre à chaque objet. Les écrans de synthèse, gestion en liste et d’affichage des médias sont décrits dans le chapitre des principes généraux.

GPEV : cibles de paramétrage

Un nouvel écran a été défini en respectant le fonctionnement de l’existant :

Rubriques de catalogue

Présentes à différents endroits dans l’application les images des rubriques ont été reprises à l’identique avec le module DDM :

Nota : ce sont les thumbnails des images typées « showroom » (PHR) qui sont affichées.

Pour ce qui est de la gestion des médias des rubriques, celle-ci est réalisée à l’identique du fonctionnement standard, depuis l’onglet « rubrique » des catalogues :

Nouveau Portail de gestion des médias

Un nouveau portail de gestion des média est livré avec le module. Il permet la gestion en masse des médias. Pour en savoir plus, voir I_DDM_F.

Paramétrage des types de médias

Les règles de gestions sur l’affichage des médias sont à présent définies dans la table (tbl) média. Celle-ci est rendu accessible depuis le portail I_DDM_F en plus de l’accès normal par le portail de configuration I_CONF_F :

Important : conceptuellement, un type de média sert à classifier un média et à fixer les règles de gestion en affichage dans ACE. En aucun cas un type se limite à une extension de fichier.

Un seul type « showroom » ou PHR possède une règle de gestion en propre. C’est ce type de média qui sera systématiquement affiché en illustration (vue synthétique, liste des rubriques par exemple).

Pour un type de média donné, en plus des libellés, on retrouve :

  • La règle d’affichage du média en liste (LIB2). 3 possibilités :

    • Icône uniquement (ICON) [par défaut]
    • Vue retaillée (PREVIEW) : vue redimensionnée
    • Vue (VIEW) : thumbnail
  • La règle d’affichage du média en plein écran (ou mode fiche) : 2 possibilités :

    • Icône uniquement (ICON) [par défaut]
    • Dans la page (EMBEDED) : type particulier pour l’affichage des pdf. Pourrait être étendu pour les vidéos. Peut varier en fonction des possibilités et extensions des navigateurs. Il est recommandé de tester in situ, le fonctionnement ne pouvant être garanti.
    • Vue (VIEW)
  • Le fichier de petites icônes (40px)
    • Une bibliothèque d’icônes est livrée avec DDM. Ces icônes peuvent être facilement personnalisées.
    • Pointe par défaut directement dans les icônes de DDM (géré dans le fichier ddm.resources.xml)
  • Le fichier de grande icône (80px)

  • Mêmes remarques.

Nota : le traitement de reprise ajoute de nouveau type, et complète les types standards du pack.

Nota : certains types sont obsolètes, mais ne sont pas supprimés par le traitement (gif, jpg, etc…). Ils devraient être supprimés conformément à la règle énoncée plus haut.

Paramétrage, principes de développement.

L’objectif de cette partie est d’exposer les principes de paramétrage, le paramétrage par défaut, pour expliquer le déploiement des couches métiers et application du module sous forme d’addon. Il est nécessaire d’aborder cette partie dans le cas où il existe un spécifique dans la gestion des médias existant que l’on souhaite porter sur DDM, ou si l’on souhaite personnaliser le fonctionnement d’un, plusieurs écrans ou du module.

Le développement très modulaire de la couche de présentation du module permet dans de nombreux cas de modifier le comportement du module en ne modifiant (par dérivation) que le template « common ».

Le principe de n’utiliser que la vue métier « bc4j » de la table MEDIA_BLOB (JMediaBlobView) permet de systématiser le rendu, et passer très rapidement de la vue (ViewDef) JMediaView à la vue JMediaBlobView

SQL de paramétrage et reprise de l’existant

ddm_lobs.sql

SQL de création des tables, schémas et index pour le module DDM. Ecrase les éléments éventuellement déjà présents.

ddm_param_pack.sql

Permet de redéfinir la table de paramétrage (« TBL ») tme, avec les nouvelles règles de paramétrage de DDM.

Permet de mettre en place le module DDM par indirection des BusinessViews suffixes MEDIA_D et MEDIA_L.

Permet de référencer les nouveaux écrans, ainsi que le portail I_DDM_F tel que présenté dans ce document. Ce portail est habilité dans la gestion de la centrale.

Permet enfin de définir le PPE DDM001, ainsi que les règles de gestion des différents items du portail I_DDM_F.

ddm_mev_std_pack.sql

Permet de paramétrer rapidement les liens MEV dans un contexte strictement Pack. Les liens sont à recalculer pour les « codent » :

  • MEDIA_BLOB
  • DOC_REC

A noter qu’ils sont strictement équivalents à ceux de la table média.

La table de définition des liens multi entité (MEP) est paramétrée pour les entités ci-dessus dans le fichier « mep.sql ».

Reprise des écrans standards du pack

BV du standard Indirection pour DDM  
%MEDIA_D I_DDM_SHOW Ecran de visualisation synthétique des médias
%MEDIA_L I_DDM_L Ecran de gestion en liste des médias
I_TIESOC_MEDIA_L I_DDM_L Création (La BV n’existant pas dans le Pack)

I_DDM_AFFICHE_MEDIA est la BusinessView d’affichage des média. Elle est nouvelle et elle est systématiquement appelée pour l’affichage/le download voire l’édition des caractéristiques d’un média.

I_DDO_L est la nouvelle BusinessView pour « Vos Documents ».

Impacts sur l’existant standard du pack

La seule feuille de style dérivée sur le standard est « a_edition_utilisateur_entete.xsl » qui permet d’afficher les boutons sur l’écran d’accueil, afin de pouvoir implémenter la nouvelle version de « Vos Documents ».

Table de paramétrage Type de Médias (tme) : écran ouvert à plus de zones.

Tout le fonctionnement des médias.

Nouveau Portail

PPE DDM001

Ce PPE permet de personnaliser le comportement du portail de gestion des médias, par métier.

A1 Codent (=MEDIA_BLOB.TYPTIE). Limite le contenu du portail au type. La valeur ‘ALL’ permet de gérer explicitement tous les médias.

A2 « Segment » (=MEDIA_BLOB.NOMCLE sur 3 caractères). Limite le contenu du portail dans le cas des événements et des tiers.

Paramétrage des cibles livrées dans le module DDM :

Définition d’un nouveau portail :

Dans le portail de configuration, gestion des BusinessViews, une sélection sur le nom I_DDM_GESTION permet d’afficher toutes les BusinessViews définies.

Portail générique (tous les médias)

Exemple pour la définition d’un portail sur les tiers clients (cible GDDMCLI) :

On note les 4 indirections, ainsi que la règle de gestion (Cible), portant le PPE DDM001 adapté :

Traitement et Editions batchs définies (GDDME2)

Une maquette et une vue permettent d’effectuer divers traitement de masse sur les Médias. Ces traitements sont définis sur la fonction GDDME2 (moteur gedte2).

A noter que les traitements batch reposent sur un concept de top. Ainsi les enregistrements sont marqués par les traitements batch, et l’application les traitera en temps masqué dans un second temps (repose sur le serveur d’application). Ainsi les résultats des purges, réindexation, etc… ne sont jamais immédiats.

Critères de lancement

Voici la liste des critères de lancement, elle est commune à tous les traitements :

On notera particulièrement la présence des critères calculés :

Nombre de version en base : Nombre total de version d’un document.

Nombre de versions plus récentes : SI = 0 : version courante (la dernière mise à jour). Ainsi la sélection de toutes les versions sauf la dernière (cas de purges dans anciennes versions, revient à sélectionner toutes les lignes sauf celles qui sont égale à 0).

Nombre de versions plus anciennes : SI = 0 : version la plus ancienne.

Liste des médias (lanceur GDDME2/LIST)

Liste simple des médias. Il est possible de définir 6 niveaux de tris (cumul en taille de fichiers et nombre de fichiers à chaque rupture).

Autres lanceurs : Doublons, Export, Réindexation, Recalcul des thumbnails.

Ces lanceurs sont basés sur la même édition que la liste. Les 6 niveaux de ruptures sont aussi gérés.

Des critères d’entête d’édition, permettent de gérer des Flag (O/N) qui permettent de marquer les enregistrements en indiquant à l’application de déclencher les traitements (MEDIA_BLOB.FLGTRT).

Les traitements ne sont ni immédiats ni synchrones avec la fin du traitement batch.

Les traitements définis par défaut ne font qu’une seule action, mais il est possible de déclencher 1 ou plusieurs actions simultanément dans un même traitement.

Présentation rapide du fichier de templates DDM : ddm_template_common.xsl

Tous les fichiers du module importent le fichier ddm_template_common.xsl. Ceci permet d’avoir autant que possible un comportement uniforme dans la gestion et l’affichage des médias.

La connaissance des templates est indispensable à la modification, la personnalisation ou la création de nouvelles pages utilisant le module DDM.

ddm.properties.xml compatible

Le pré-paramétrage de la partie application et présentation du module DDM inclus quelques prérequis. Un fichier ddm.properties.xml est livré avec le module pour la couche de présentation, il est bon de s’en inspirer.

Les contraintes pour un bon fonctionnement :

fileKeyProviders de type UnknownFileKeyProvider : si le type de document (i.e. Typtie) est inconnu, celui-ci doit être paramétré à « DDM », de manière à pouvoir filtrer dans le portail de gestion des médias. Idem pour le début du « nomcle » si celui-ci est indéterminé.

ThumbSize : cet attribut devrait être paramétré à 125px pour optimiser l’application et les affichages actuels.

Mapping des types de médias (tme) . Par défaut ‘INT’, devrait ressembler à

Même si aucune règle de gestion n’empêche de personnalisation.

Utilisation de l’indexer OracleText : l’ensemble des fonctionnalités liées à l’indexation full text des documents de DDM sur la couche applicative est liées à une indexation OracleText dans cette version.

Auto Archivage des événements commerciaux par DDM

L’objectif est de proposer une fonctionnalité d’auto-archivage des événements commerciaux dans ACE. Cette fonctionnalité requiert la mise en œuvre de StreamServe (Version V4 ou ultérieure).

Le choix peut être donné à l’utilisateur (depuis le lanceur) d’archiver ou pas son édition reposant sur le moteur edeve. Le scanner est par défaut paramétré pour activer la recherche full-text (suivant option de DDM).

Exemple d’écran proposé (paramétrage du lanceur pack CDEVTE effectué dans la SQL de mise en œuvre fonctionnel de DDM) :

Ce choix peut être aussi enregistré dans les procédures, il repose sur l’utilisation de l’option 50 des lanceurs. Un exemple est fourni dans le SQL d’implémentation de DDM.

Cette démarche est aussi compatible avec les batch produisant un seul fichier pdf pour n factures. Avec l’implémentation du module, seront en plus produits 1 fichier/événement dans le répertoire scruté par DDM.

Les événements ainsi traités seront rattachés au tiers de l’événement, avec un nom de fichier formé à partir du code entité de l’événement, son type achat/vente, son type d’événement et son numéro. Plusieurs archivages d’un même événement conduiront donc automatiquement à son versionnement.

La mise en place est détaillée afin de pouvoir être adaptée rapidement aux éditions edeve déjà mises en place.

Mise en place de l’archivage d’événement dans StreamServe

Création de l’arborescence de répertoire (implémentation par défaut)

L’implémentation par défaut de DDM, scrute le sous répertoire ddm_in/edeve de spl du client serveur (variable « ddm.scanner.ACE » du fichier ddm.properties).

Extrait du fichier ddm.properties définissant la variable ddm.scanner.ACE :

ddm.scanner.basedir=/C:/app/ddm_data
ddm.scanner.ACE=/C:/app/ddm_data
ddm.datasource.pooled=false
ddm.scanner.active=true
ddm.indexer=ot_target
ddm.storage.basedir=/C:/app/ddm_data/storage

Extrait du fichier ddm.properties.xml concernant le scan des événements à auto archiver :

< input dir ="${ddm.scanner.ACE}/ddm_in/edeve " includes =" *.ref " frequency =" 1 " fileRefDeletion =" true " fileDeletion =" true ">
< param name =" indexer " value =" ${ddm.indexer} "/>
< param name =" thumbFormat " value =" jpg "/>
< fileKeyProvider name =" ref "/>
< fileKeyProvider name =" flat_ref "/>
</ input >

Installations possible de DDM :

  • DDM est installé en stand-alone sur le serveur de traitement,
  • DDM est installé dans le serveur d’application (dans le webmodule « btoe » par exemple). Un partage réseau soit alors permettre la scrutation du répertoire du serveur de traitement.

Modification de la plateforme

Ajouter le connecteur de sortie DDM par duplication du connecteur pdf :

Paramétrage du connecteur DDM :

  • Output mode doit être positionné à « process »
  • Create directory doit être à « Yes »

Modification des maquettes d’entête édition

  1. Ajouter dans les maquettes entete_edition.str_fra et entete_masquee.str_fra les champs suivants :
    %CR ----------------------------------------
    %CR -- Declenchement option entete 50
    %CR ----------------------------------------
    V ~605=C(40)
    VEE ~605="ddm_in\edeve"
    %EEDDM Archivage @319
    %EEDDM .ref file path ~605
    Ces champs sont :
    • L’indicateur d’archivage O/N
    • Le chemin vers le répertoire d’entrée du module ddm relativement au répertoire de sortie standard (spl)
  2. Il faut également modifier le projet StreamServe entête édition pour intégrer ces champs.
    • Ajout dans l’event de l’entête des nouveaux champs :

    • Définition des champs :

  3. Modification des fonctions de l’entête pour prise en compte des nouvelles variables.

    Dans le fichier fonctions_gnx_entete modification des fonctions InitSessionVariableEntete() et GetSessionVariableEntete()

Fonction InitSessionVariableEntete :
func InitSessionVariableEntete ()
{
$numjobid=#1;
$session_name_entete="session_entete_"+$numjobid;
sessionstart($session_name_entete,120);
// Ajout pour ddm
sessionsetvariable($session_name_entete, "EE_archiver", $EE_archiver);
sessionsetvariable($session_name_entete, "EE_repddm ", $EE_repddm );
// Fin ajout ddm
sessionsetvariable($session_name_entete, "EE_impentete", $EE_impentete);
sessionsetvariable($session_name_entete, "EE_adress_soc ", $EE_adress_soc );…
Fonction GetSessionVariableEntete :
func GetSessionVariableEntete()
{
 $numjobid=#1;
 $session_name_entete="session_entete_"+$numjobid;
 // Ajout pour ddm
 $EE_archiver = sessiongetvariable($session_name_entete,"EE_archiver"); 
 $EE_repddm = sessiongetvariable($session_name_entete,"EE_repddm");
 // Fin ajout ddm
 $EE_impentete = sessiongetvariable($session_name_entete,"EE_impentete"); 
 $EE_adress_soc = sessiongetvariable($session_name_entete,"EE_adress_soc ");
…

Modification du projet de l’état à archiver

Dans notre exemple il s’agit de la commande de vente

Maquette ACE

Ajouter l’include ddm_edeve.str_fra dans la maquette edeve :

include="ap$std_fra:entete_masquee.str_fra"
%05START V1EDIT_COMMANDE
include="ap$std_fra:ddm_edeve.str_fra"
%05Barème lir (B05) @805
%05Calcul en TTC (O N) (B05) @806

Cet « include » ajoute les champs suivants :

%CR ----------------------------------------
%CR -- Variables de generation des .ref
%CR ----------------------------------------
%05DDM Filename of .ref file ~602
%05DDM RefFile filename ~603
%05DDM RefFile typtie TIE
%05DDM RefFile nomcle @54@076
%05DDM RefFile lib256 DDM Auto archivage
%05DDM RefFile codlan @668
%05DDM RefFile codsoc 1
%05DDM RefFile uticod ~604

Ces champs seront utilisés pour la génération du fichier d’indexation (.ref)

Ajout des nouveaux champs au dictionnaire de données

Nous ajoutons les champs nécessaires à la fabrication du fichier d’indexation de DDM à la racine du message StreamServe :

Exemple de la commande de vente :

StreamIn
// Generated with StreamIN
// Sun 17/2-2013, 14:23:46
Root Name "Message"
Field "DDM RefFile filename" $ddm_file
Field "DDM Filename of .ref file" $ddm_ref_file
Field "DDM RefFile typtie" $ddm_ref_typtie
Field "DDM RefFile nomcle" $ddm_ref_nomcle
Field "DDM RefFile lib256" $ddm_ref_lib256
Field "DDM RefFile codlan" $ddm_ref_codlan
Field "DDM RefFile codsoc" $ddm_ref_codsoc
Field "DDM RefFile uticod" $ddm_ref_uticod
Déclenchement de l’archivage

Différents scripts gèrent la génération des fichiers à destination du répertoire d’entrée de DDM. Ces scripts sont regroupés dans le fichier fonctions fonctions_ddm.fcn qu’il faudra déclarer dans le ACE.arg.

Script before event

Script after event

La fonction ddm_after_event prend le nom du process à appeler en paramètre.

Génération du fichier d’indexation (.ref)

Le fichier index est généré par les scripts contenu dans le fichier fonction fonctions_ddm.fcn notamment via la fonction ecrire_fic_ref (). Ci-dessous le code des fonctions DDM :

//!CodePage UTF8!
func ddm_before_event()
{
 // Mémorisation du connecteur demandé dans ACE
 $connecteur=$outq;
// Mémorisation de la destination demandée dans ACE
 $destination=$setdestpath;
// Génération du fichier d'indexation ddm
// Chemin et nom du fichier .ref
 $file_ref=$output_gnx+"\"+$EE_repddm+"\"+$ddm_ref_file; 
 //ouverture du fichier
open_file($file_ref,"w"); 
ecrire_fic_ref();
} 
func ddm_after_event()
{
 //Process à appeler
 $fprocess = #1;
 // Appel du process pour achivage
 // Si l'archivage est demandé
if($EE_archiver="O")
{
// Définition du fichier à produire à destination de ddm
 //$setdestpath= $output_gnx+"\"+$EE_repddm+"\"+$ddm_file;
$setdestpath= $output_gnx+"\"+$ddm_file;
// le connecteur de sortie à utiliser est ddm
$outq="ddm";
// apple du process pour envoyer vers répertoire entrée ddm
callproc($process);
// Après la génération du fichier pour ddm on remet les variables aux valeurs
// demandées dans ACE pour gérer le cas classique
 $setdestpath=$destination; 
$outq=$connecteur;
}
// fermeture du fichier ref
 close_file($file_ref);
} 
func ecrire_fic_ref ()
{
 //write_ln($file_ref,"CodePage UTF8");
$ficref_typtie="typtie="+$ddm_ref_typtie;
 write_ln($file_ref,$ficref_typtie);
$ficref_lib256="lib256="+$ddm_ref_lib256;
 write_ln($file_ref,$ficref_lib256);
$ficref_codlan="codlan="+$ddm_ref_codlan;
write_ln($file_ref,$ficref_codlan);
$ficref_codsoc="codsoc="+$ddm_ref_codsoc;
write_ln($file_ref,$ficref_codsoc);
$ficref_typmed="typmed=ARC";
write_ln($file_ref,$ficref_typmed);
$ficref_filename="filename="+ $ddm_file;
write_ln($file_ref,$ficref_filename);
$ficref_nomcle="nomcle="+$ddm_ref_nomcle;
write_ln($file_ref,$ficref_nomcle);
 $ficref_uticod="utidcod="+$ddm_ref_uticod ;
 write_ln($file_ref,$ficref_uticod);
}
func open_file()
{
$file = #1;
$mode=#2;
$err = fileopen($file, $mode);
 //If the action was unsuccessful, pass the error value
//to ioerrtext and store the error text returned by
//ioerrtext in $errtext.
//Send the error text to the log file
if(num($err)!=0)
{
 $errtext=ioerrtext($err);
log(0,"Errortext "+$errtext);
}
} 
func close_file()
{
$file = #1;  
//Close myfile.txt and store the returned value in $err 
$err = fileclose($file); 
//If the action was unsuccessful, pass the error value
//to ioerrtext and store the error text returned by
//ioerrtext in $errtext.
//Send the error text to the log file 
if(num($err)!=0)
{
$errtext=ioerrtext($err);
 log(0,"Errortext "+$errtext);
}  
}  
func write_ln()
{
 $file = #1;
 $ligne = #2;
 //Write the contents of $utbuf to myfile.txt,
 //add a new line, and store the returned value in $err
$err = filewriteln($file,$ligne);
//If the action was unsuccessful, pass the error value
//to ioerrtext and store the error text returned by
//ioerrtext in $errtext.
 //Send the error text to the log file 
if(num($err)!=0)
{
$errtext=ioerrtext($err);log(0,"Errortext "+$errtext); 
}
}