Exécution en mode automatique

Chapitre parent Chapitre précédent

Le mode automatique


LDSQL peut être appelé pour exécuter une ou plusieurs commandes SQL sur une ou plusieurs connexions de façon entièrement automatisée, sans interface graphique.

Et comme il n'y a aucune interaction avec l'utilisateur, ce mode automatique est utilisable via une tâche planifiée notamment.

Un fichier de trace est dans ce cas utilisé pour tracer tout ce qui est fait par LDSQL.


Pour déclencher ce mode automatique, il faut lancer l'exécution de LDSQL en lui passant en ligne de commande le nom d'un fichier à exécuter.


LDSQL.EXE /AUTO=<Nom complet du fichier>


Le fichier en question doit contenir une suite de lignes Connexion, CMD, SQL et Script respectant la syntaxe décrite en détail ci-après.


La ou les lignes Connexion permettent de définir sur quelle connexion les commandes et scripts qui suivent vont s'exécuter.

Les lignes CMD permettent d'exécuter des commandes Windows. L'usage principal est de « monter » des disques réseaux (commande NET USE).

Les lignes SQL permettent d'exécuter toute commande SQL.

Les lignes Script permettent d'exécuter des scripts écrits en langage Windev, ces scripts pouvant bien sûr utiliser les données de la commande SQL exécutée précédemment.


Remarque : les lignes SQL et Script doivent toujours suivre une ligne Connexion ; ces commandes sont exécutées sur la connexion indiquée précédemment. On peut donc enchaîner autant de commandes SQL et de script que souhaités, et on peut basculer à tout moment d'une connexion à l'autre, ou d'un dossier à l'autre, en intercalant une ligne Connexion.


Dans le cas des connexions où l'on a une liste de dossiers (Compta et Paye), on peut indiquer plusieurs dossiers sur la ligne Connexion.

La syntaxe est la même que dans LDETLFB (voir U:\Documentations\Décisionnel\Documentation LDETLFB\Documentation LDETLFB.pdf, paragraphe 6.2 pages 25-26).

L'ensemble des commandes SQL et Script qui suivent cette ligne Connexion (jusqu'à la fin du fichier ou la prochaine ligne Connexion) seront alors répétées pour chaque dossier répondant aux critères de filtrage des dossiers.


Syntaxe du fichier pour exécution automatique


Tout ce qui suit un double //  est considéré comme étant du commentaire et est ignoré

Aucune différence n'est faite entre majuscule et minuscule pour les mots-clés indiqués ci-après.


Paramètres pour la trace


TRACE=ECRAN

ou

TRACE=<Nom du fichier trace>

Si le nom du fichier trace comporte la mention AAAAMMJJ, cette mention est remplacée par la date du jour.

En l'absence d'information sur le fichier trace, LDSQL utilise le fichier nommé TraceAuto AAAAMMJJ.log placé dans le répertoire de l'exécutable.

Notez que dans les scripts exécutés ensuite, il est possible de tracer certaines informations en faisant appel à la procédure zAutoTracer qui attend 2 paramètres :


Syntaxe d'une ligne CMD


CMD=<Commande Windows>


La commande doit être saisie en ANSI. Elle est automatiquement convertie en OEM pour l'exécution.

Les commandes CMD sont systématiquement tracées, que l'exécution soit achevée avec succès ou provoque une erreur.

Exemple avec 2 commandes :

CMD=NET USE Y: /D

CMD=NET USE Y: \\BURDEV-LD\Bureautique

Trace obtenue, si le disque Y: n'est pas déjà alloué au moment de l'exécution :

ERR    NET USE Y: /D --> La connexion réseau est introuvable.  Vous obtiendrez une aide supplémentaire en entrant NET HELPMSG 2250.

INFO    NET USE Y: \\BURDEV-LD\Bureautique --> La commande s'est terminée correctement.


Syntaxe d'une ligne Connexion


CONNEXION=<Nom d'une connexion LDSQL>


Si la connexion nécessite de choisir un dossier, la syntaxe est :


CONNEXION=<Nom d'une connexion LDSQL>(<ListeDossiers>)


La syntaxe pour <ListeDossiers> est :  <Sous-liste1>;<Sous-Liste2>; ... <Sous-listeN>

Chaque sous-liste peut prendre l'une des formes suivantes :

  SSS        le code dossier SSS est à inclure (à traiter)

  SSD-SSF tous les dossiers ayant un code compris entre SSD et SSF sont inclus

  X:SSS     le code dossier SSS est à exclure

  X:SSD-SSF tous les dossiers ayant un code compris entre SSD et SSF sont exclus

  ""LLLLL""     Tous les dossiers dont le libellé contient la chaine LLLLL sont inclus (critère de filtre à placer en 2 paires de doubles quottes)

  X:""LLLLL""  Tous les dossiers dont le libellé ou le code contient la chaine LLLLL sont exclus

  *ALL           Tous les dossiers sont inclus    

Comme indiqué plus haut, lorsque l'expression de sélection utilisée pour <ListeDossiers> aboutit à ce que plusieurs dossiers soient sélectionnés, l'ensemble des commandes SQL et Script qui suivent la ligne Connexion en question, jusqu'à la fin du fichier ou la prochaine ligne Connexion, sont répétées pour chaque dossier.

Point important : les sous-listes sont traitées dans l'ordre de leur apparition. Dès qu'une règle s'applique (égalité sur le code société ou l'intervalle de codes ou présence de la chaine de filtrage dans le libellé ou le code), la règle est appliquée en ignorant les règles qui suivent. Les sociétés qui ne répondent à aucune des règles indiquées sont exclues. Si on veut prendre toutes les sociétés sauf une en particulier, il faut donc écrire :

X:SSS;*ALL

Dans le cas de LDPaye, le code dossier correspond au code société externe ; le code répertoire et le code société interne ne sont pas testés. De plus, LDSQL fait en sorte de ne traiter chaque répertoire qu'une seule fois. AInsi, si on demande une liste comprenant les 3 dossiers AAA;BBB;CCC et que AAA et CCC sont dans le même répertoire, il n'y aura que deux dossiers (2 répertoires) traités : ceux des sociétés AAA et BBB.

Dans le cas de LDCompta, le code dossier correspond au code société « origine ». Dans le cas d’un dossier « courant », il n’y a pas d’ambiguïté. Dans le cas d’un dossier d’archives, c’est le code société archivée dont on parle ici, pas du code dossier « réel » (celui que l’on voit dans la colonne Archive de la liste de tous les sociétés, depuis le menu Fichier/Sociétés de LDCompta, pas celui apparaissant dans la colonne Code société).
De plus, chaque sous-liste peut être complétée par un « qualifiant Exercice ». A défaut, seul l'exercice courant est traité. Le « qualifiant Exercice » peut être soit une valeur qui sera comparée directement à celle portée dans le fichier CPTSOC (année d’archive, sur 4 caractères), soit la valeur particulière *ALL.
Attention : le qualifiant n'est interprété qu'après le filtrage de la société. On ne peut donc pas inclure ou exclure une ou plusieurs sociétés sur un ou plusieurs exercices. La syntaxe ci-dessous est par exemple invalide :

X:LDZ:2009;LDZ:*ALL

La société LDZ va être exclue par la première règle, et ce pour tous les exercices. La 2ème règle ne sera donc jamais traitée.

On peut aussi indiquer le qualifiant exercice sous la forme *ALL>XXXX : l'exercice courant est pris, ainsi que tous les exercices dont le code (l'année d'archive) est supérieur ou égal au code XXXX indiqué dans la règle.

Exemples de syntaxe valide :

LDD;LDM;LDH                        on traite les 3 sociétés LDD, LDM et LDH, exercice courant uniquement

X:LDZ;LDA-LDZ;LD0-LD9                on traite toutes les sociétés dont le code commence par LD, sauf LDZ, exercice courant uniquement

LDD:*ALL                                on traite tous les exercices de la société LDD

LD0-LDZ:2016                        on traite l'exercice 2016 uniquement de toutes les sociétés dont le code commence par LD

X:LDZ;*ALL:*ALL>2016                on traite toutes les sociétés sauf la société LDZ, et pour ces sociétés, on traite l'année courante et tous les dossiers d'archives 2016 et postérieurs.


Si la connexion nécessite une identification (cas d'une connexion à LDCompta, LDPaye ou LDNégoce alors qu'on ne dispose pas d'une « clé » LDSQL autorisant les mises à jour), la syntaxe est :

CONNEXION=<Nom d'une connexion LDSQL> UTILISATEUR=<Code>:<MotDePasse>

ou

CONNEXION=<Nom d'une connexion LDSQL>(<ListeDossiers>) UTILISATEUR=<Code>:<MotDePasse>


Si l'utilisateur n'a pas de mot de passe, on ne renseignera que <Code>.

Le mot de passe peut être indiqué « en clair » ou sous forme cryptée. Dans ce dernier cas, il devra être porté entre accolades { et }. Le cryptage à utiliser est le même que celui utilisé pour encoder le mot de passe de l'utilisateur de connexion à la base HFCS du progiciel concerné par la connexion : LDCompta, LDPaye ou LDNégoce.

Exemple :   UTILISATEUR=COMPTA:COMPTA   ou   UTILISATEUR=COMPTA:{zrJYIZpr}


Syntaxe d'une ligne SQL


SQL=<Commande SQL sur une seule ligne>

ou

SQL=[

Commande SQL

sur plusieurs lignes

]


Syntaxe d'une ligne SCRIPT


SCRIPT=<Nom complet d'un fichier script>

ou

SCRIPT=[

le source du script ici

réparti sur plusieurs lignes

]



Remarque importante : étant donné qu'il n'y a aucun affichage graphique en mode automatique, le résultat d'une commande SQL select n'est pas chargé dans une table comme c'est le cas lors d'une utilisation en interactif. Un script ne peut donc pas parcourir les données de la table nommée TableSQL qui n'est jamais chargée en mode automatique. Il faut travailler directement sur la requête _MaRequeteSQL qui a été déclarée en source de données globale à la collection de procédures.

On peut aussi faire référence, si nécessaire, à la connexion source courante sur laquelle la commande SQL s'est exécutée, via le nom _MaConnexionSQL qui est un objet de type ConnexionSource.

Notez que depuis le niveau 11 de LDSQL Version 2.00, on peut également référencer ces deux éléments _MaConnexionSQL et _MaRequeteSQL dans une procédure exécutée en interactif. La même syntaxe peut ainsi être utilisée dans une procédure pour accéder aux données issues de la requête SQL, quel que soit le mode d'exécution, interactif ou automatique.


Partage de variables


Dans le cas où l'on a plusieurs script qui s'exécutent successivement, éventuellement suite à des commandes SQL différentes ou même sur des connexions différentes, il peut être utile de partager des valeurs entre ces scripts successifs. Pour ce faire, on dispose d'un tableau associatif de chaînes nommé VARG, déclaré en global dans la collection de procédures ProcExécutionAuto. La syntaxe à utiliser pour accéder à ce tableau est donc :


ProcExécutionAuto.VARG["<NomVariable>"]    où   <NomVariable> est une chaine quelconque représentant la variable à partager.


Exemples de fichier de commandes

Exemple 1 - Tout est dans le fichier de commandes

CMD=NET USE Y: /D

CMD=NET USE Y: \\BURDEV-LD\Bureautique

Connexion=COMPTAV10(TOP;LDZ) UTILISATEUR=USER

SQL=select * from CPTPLA where DTFV='' or DTFV < SYSDATE

SCRIPT=[

zAutoTracer("INFO", HNbEnr(_MaRequeteSQL)+" comptes généraux ouverts dans le plan comptable du dossier "+procExécutionAuto._MaConnexionSQL:Dossier+".")

]

SQL=select * from CPTHIS WHERE CLOT='E'

SCRIPT=[

zAutoTracer("INFO", HNbEnr(_MaRequeteSQL)+" écritures de centralisation dans le dossier "+procExécutionAuto._MaConnexionSQL:Dossier+".")

]


Exemple de trace obtenue à l'exécution de ce ficher :


20170828        16473495        INFO        Lancement de l'exécution automatique du fichier TestAuto.sqla.

20170828        16473506        INFO        NET USE Y: /D --> Y: a été supprimé.

20170828        16473514        INFO        NET USE Y: \\BURDEV-LD\Bureautique --> La commande s'est terminée correctement.

20170828        16473529        ERR        Accès non autorisé sur la connexion COMPTAV10, Dossier LDZ : L'utilisateur USER ne dispose pas d'un niveau d'accès Administrateur sur la société LDZ et le domaine de sécurité SQL.

20170828        16473535        INFO        584 comptes généraux ouverts dans le plan comptable du dossier TOP.

20170828        16473881        INFO        122353 écritures de centralisation dans le dossier TOP.

20170828        16473881        INFO        Fin de l'exécution automatique du fichier TestAuto.sqla.


Exemple 2 - On référence un script externe

Connexion=COMPTAV10(TOP) UTILISATEUR=JM

SQL=select * from CPTPLA where DTFV='' or DTFV < SYSDATE

SCRIPT=TracerRequeteSQL.txt


Contenu du fichier TracerRequeteSQL.txt :


TraceDébut(trFichier, "TraceRequeteSQL.txt")  // On demande à ce que la trace Windev soit enregistrée dans le fichier TraceRequeteSQL.txt

ListeRubriques est une chaine = HlisteRubrique(_MaRequeteSQL)

i est un entier

Pour tout "_MaRequeteSQL"

       // Pour tous les comptes de la classe 607, on trace les 2 premières rubriques de la requête

       SI _MaRequeteSQL.CPTG [= "607" Alors

               Trace("Compte "+{"_MaRequeteSQL."+Extraitchaine(ListeRubriques,1,RC)}+" "+{"_MaRequeteSQL."+ExtraitChaine(ListeRubriques,2,RC)})

               i++

       FIN

FIN

zAutoTracer("INFO", i +" comptes généraux ont été listés dans le fichier TraceRequeteSQL.txt. pour le dossier "+procExécutionAuto._MaConnexionSQL:Dossier+".")



Trace obtenue à l'exécution de ce fichier :


20170828        17183005        INFO        Lancement de l'exécution automatique du fichier TestAuto.sqla.

20170828        17183026        INFO        5 comptes généraux ont été listés dans le fichier TraceRequeteSQL.txt. pour le dossier TOP.

20170828        17183026        INFO        Fin de l'exécution automatique du fichier TestAuto.sqla.


Trace obtenue dans le fichier TraceRequeteSQL.txt :


Compte 607000 ACHATS DE MARCHANDISESCEVR

Compte 607510 ACHAT SEMENCE COMMERCIALE

Compte 607200 ACHATS A DES TNA

Compte 607520 ACHAT SEMENCES MERESALLICOP

Compte 607530 ACHATS CONSOMMATION