[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[pmb.user] Différences et liens entre les requêtes dans les paniers et les états personnalisables




Bonjour à tous,


Voici la copie d'un texte que je vais mettre sous peu sur le Wiki
J'essaie de faire une petite synthèse, et d'expliquer les différences entre les requêtes (paniers) et les états personnalisables, et la manière de relier les deux.
     Tout est relatif quand on se relit  !! 
Je réalise que le terme "petite" synthèse est peu adéquat, vu la longueur de mon texte      ;-)   ;-) 


Bonne journée à tous
(Une chouette balade aujourd'hui. Le soleil brille à Bruxelles !)


Anne-Marie Cubat

Ecole N.-D. de la Sagesse
Avenue Van Overbeke, 10
B-1083 Bruxelles
Belgique



Différences et liens entre les requêtes dans les paniers et les états personnalisables


1) Notions de base sur les paniers, les contenus et les procédures qui s'y appliquent

a) Il y a différents types de paniers (en fonction du contenu), on le constate entre autres dans les requêtes de sélection 
Ces requêtes commencent par une des 3 manières suivantes :
 - panier d'exemplaires :    select expl_id as object_id, 'EXPL' as  object_type from exemplaires
 - panier de notices      :    select notice_id as object_id, 'NOTI' as object_type from notices
 - panier de bulletins    :     select bulletin_id as object_id, 'BULL' as object_type from bulletins (bulletins de périodiques)
Le type de contenu détermine ce qu'on peut faire (ou non) avec les éléments contenus dans le panier.


b) La notion de panier est géniale car elle permet d'agir globalement sur un ensemble de notices, exemplaires ou bulletins.

Dans un premier stade, on place par exemple des exemplaires dans un panier, il y a donc une procédure de sélection (par la douchette ou par exécution d'une requête sql).

Dans un deuxième stade, on peut agir globalement sur tous ces exemplaires. Certaines actions sont proposées par PMB : 
     éditer, transférer d'un panier à l'autre, vider le panier, exporter, supprimer de la base de données.
D'autres actions (ou requêtes) peuvent être rédigées et paramétrées par l'utilisateur, et vous trouvez sur le Wiki quelques exemples de requêtes applicables à un panier : 
     changer les exemplaires ou les notices de statut, de section, d'indexation, de cote de rangement, etc.

Par l'exécution d'une seule requête d'action, on modifie donc un champ dans une série de notices ou d'exemplaires, il s'agit donc d'une mise à jour irréversible de la base de données. 
Pas irréversible à 100% puisqu'on pourrait essayer de refaire la manoeuvre en sens inverse, mais dès que vous lancez l'exécution, le processus est lancé, et les champs concernés seront modifiés. 
Prudence donc.

.
c) Par conséquent, les procédures applicables aux paniers sont de 2 types :
 - requêtes de sélection : on choisit les notices ou exemplaires à ajouter dans le panier en fonction de tel ou tel critère (condition à vérifier)
 - requêtes d'action : on agit globalement afin de modifier un champ dans une table, il s'agit donc d'une mise à jour (update) d'une partie de la base de données
Attention dans le cas des requêtes de sélection! 
 On ne remplace pas le contenu du panier, on ajoute "à ce qui s'y trouve déjà" - donc il faut souvent commencer par vider le panier avant d'y mettre de nouveaux éléments.


Exemple de requête de sélection d'exemplaires : on veut sélectionner tout le rayon littérature
 donc tous les exemplaires dont la cote de rangement est >=800 et <=890 (dans l'hypothèse d'une indexation Dewey)

Code sql (attention si vous faites un copier-coller - effacer les ENTER dans ce code, sinon il ne fonctionne pas) 
select expl_id as object_id, 'EXPL' as object_type from exemplaires where left(expl_cote,3) >= '!!param1!!' and left(expl_cote,3) <= '!!param2!!'
Explications
 - on sélectionne les exemplaires : select expl_id as object_id
 - 'EXPL' as object_type
 - à partir de la table exemplaires : from exemplaires
 - à condition que la cote de rangement soit >=800 et <=890 : where left(expl_cote,3) >= '!!param1!!' and left(expl_cote,3) <= '!!param2!!'
  '!!param1!!' et '!!param2!!' symbolisent deux valeurs introduites au clavier


Exemple de requête d'action sur des exemplaires : on veut changer le statut de certains exemplaires (voir sur le Wiki d'autres requêtes de changement)

Code sql (attention si vous faites un copier-coller - effacer les ENTER dans ce code, sinon il ne fonctionne pas)
update exemplaires set expl_statut=!!nouveau_type!! where expl_id in (CADDIE(EXPL))
Explications
 - on met à jour (update) la table exemplaires
 - on change (set) le contenu du champ expl_statut
 - en fonction du choix introduit au clavier par l'utilisateur (!!nouveau_type!!)
 - et ceci pour tous les exemplaires contenus dans ce panier 
  la condition est donc where expl_id in (CADDIE(EXPL))
  la requête doit être exécutée si - et seulement si - "id" (la clef primaire d'identification) a été sélectionnée dans le panier.

La requête d'action se termine toujours par une des 3 conditions
 where expl_id in (CADDIE(EXPL))      :  panier d'exemplaires
 where notice_id in (CADDIE(NOTI))   :  panier de notices
 where bulletin_id in (CADDIE(BULL)) :  panier de bulletins

Vous verrez plus loin l'utilité primordiale de cette requête de changement de statut (voir point n° 3).


d) Mode opératoire des requêtes

Avant de pouvoir exécuter une requête sur un panier (qu'elle soit d'action ou de sélection), il faut d'abord sélectionner le panier; ensuite la liste des requêtes possibles (action - sélection) s'affichera.

N.B. La liste des requêtes affichées peut vous sembler de prime abord incomplète, mais PMB ne montre pas toutes les procédures d'action qui ont été créées.
PMB ne vous propose que les requêtes qui pourraient s'appliquer au type de panier choisi.(en fonction de son contenu : notices, exemplaires ou bulletins).



2) Les états (ou actions) personnalisables (administration - éditions)

a) But général
Ces états personnalisables permettent par exemple
 - d'extraire les données nécessaires pour imprimer des étiquettes, des listes de livres, des listes de lecteurs, etc.
 - de faire des comptages, des statistiques (lecteurs par âge, exemplaires par statut, par section ....)
en explorant au départ toute la base de données, mais en ne retenant que les exemplaires qui répondent à telle ou telle condition et en faisant des liens entre différentes tables


b) Schéma de base et exemples (impression et tri)

Le schéma général (très simplifié !) est le suivant
 - select : liste de champs
 - from : liste de tables
 - where : liste de conditions
 - group by : comment regrouper et éviter les doublons
 - order by : dans quel ordre trier et afficher les résultats


Deux exemples de requêtes d'impression d'étiquettes de rangement - voir détails sur le Wiki (étiquettes et inventaire - 2e et 3e parties)

Requête d'impression d'étiquettes de rangement - pour les exemplaires dont le code-barres est >= ... et <= ...

Code sql (attention si vous faites un copier-coller - effacer les ENTER dans ce code, sinon il ne fonctionne pas) 
select left(expl_cote,3), substring(expl_cote from 5 for 3), substring(expl_cote from 9 for 3), tit1, expl_cb from exemplaires, notices where expl_cb >='!!param1!!' and expl_cb <='!!param2!!' and expl_notice=notice_id order by expl_cb 

C'est la procédure que j'emploie lorsque je viens d'encoder une série de livres. Il me suffit de dire que je veux des étiquettes pour les exemplaires dont le code-barres est >= ... et <= ..., 
et j'obtiens les données nécessaires pour les étiquettes des 30 derniers exemplaires encodés (par exemple).

Variante de cette requête d'impression d'étiquettes - pour les exemplaires dont le statut est ..
select left(expl_cote,3), substring(expl_cote from 5 for 3), substring(expl_cote from 9 for 3), tit1, expl_cb from exemplaires, notices where expl_statut=!!param1!! and expl_notice=notice_id order by expl_cb

J'explique un peu plus loin l'utilité de cette variante (choix sur base du statut) - voir point n° 3 b - 3c.


Exemple d'une requête de statistiques - comptage des exemplaires par prêteur, section et statut
select lender_libelle as Prêteur, section_libelle as Section, statut_libelle as Statut, count(*) as Nombre from exemplaires, lenders, docs_section, docs_statut where expl_owner=idlender and idsection=expl_section and expl_statut=idstatut group by idlender, idsection, idstatut order by lender_libelle, section_libelle, statut_libelle



c) Différence entre mode "administration" et en mode "éditions".

Les mêmes requêtes apparaissent dans les deux onglets - à condition d'avoir accordé les autorisations aux autres personnes que admin (bib, cat, circ ..)
(N'oubliez pas, lorsque vous créez l'état personnalisable, de cocher les cases requises en-dessous de la requête afin d'accorder les "autorisations" nécessaires).

Les états personnalisables peuvent donc être exécutés en mode "administration" ou en mode "éditions".
L'onglet administration est pratique pour tester la procédure, mais vu qu'en général on souhaite imprimer le résultat des requêtes, il est plus judicieux de les exécuter dans l'onglet "éditions". 
Ainsi vous aurez la possibilité d'exporter ensuite le résultat vers un fichier de type Excel ou vers un autre format, et d'améliorer la mise en pages - dans Excel, Word ou un logiciel d'impression d'étiquettes, suivant les circonstances.



3) Lien entre les paniers et les états personnalisables

a) Dans les actions personnalisables vues jusqu'à présent, il y avait toujours une condition "objectivable"
 - compter le nombre d'exemplaires dont le statut est ... 
 - imprimer la liste des livres qui sont dans la section ...
 - imprimer les étiquettes des périodiques dont le code-barres est >= .. et <...


b) Or, dans certains cas, on veut exécuter une action personnalisable pour un panier dont les éléments sont a priori "disparates".

Quelques exemples concrets : 
 - vous avez constaté que les étiquettes de rangement d'une quinzaine de livres sont détériorées ou erronées
 - vous voulez disposer d'une liste "papier" des livres mis à l'honneur ce mois-ci sur une étagère virtuelle de l'OPAC.
 - vous avez décidé de retirer certains livres des rayons et de les proposer à la vente
Vous les avez donc regroupés dans un panier (par sélection à la douchette ou à la souris)

Problème : ces exemplaires n'ont a priori aucun autre point commun que l'absence d'étiquette correcte, le fait de figurer sur une étagère virtuelle ou d'être à vendre.
Aucun critère "objectivable" ne permet à coup sûr de les identifier - si ce n'est l'appartenance au même panier.. 
On ne pourrait pas dire "codes-barres >= ... et <=...", "cote de rangement >= ... et <= ...", "section = ...", "propriétaire = ....."

Que faire dans ce cas?
Ces livres sont regroupés dans un panier, mais les requêtes d'action dans les paniers ne permettent pas d'imprimer une liste ou d'obtenir des statistiques.
Et comble de malchance, les actions personnalisables (onglets "administration et éditions" ) semblent n'avoir aucun lien avec les paniers !
Rassurez-vous, il y a une solution !


c) Comment lier paniers et états personnalisables?  Comment introduire ce critère "objectivable" dans la requête? 

La solution passe par un changement provisoire de statut de tous les exemplaires de ce panier.
N'employez pas un statut "normal" de PMB, créez un autre "statut spécial", un statut provisoire, par exemple "à vendre - sans étiquette - étagère virtuelle", etc.
Après exécution de l'action personnalisable, il vous suffit de ramener tous les exemplaires du panier à leur statut antérieur.

Pourquoi un changement de statut?
Parce que la sélection par statut est la seule manière d'identifier à coup sûr des exemplaires disparates mais contenus dans le même panier - et seulement ceux-là.
Vous avez dès lors le "critère objectivable" dont je parlais - vous pouvez dire "exécuter cette requête pour tous les exemplaires dont le statut est ...".

La requête d'impression d'étiquettes que je citais en exemple ci-dessus (point 2 - b) devient donc parfaitement utilisable.
 puisque que le critère de sélection est dans ce cas "tous les exemplaires dont le statut est ..."
select left(expl_cote,3), substring(expl_cote from 5 for 3), substring(expl_cote from 9 for 3), tit1, expl_cb from exemplaires, notices where expl_statut=!!param1!! and expl_notice=notice_id order by expl_cb

Il suffit de dire : dont le statut est "sans étiquette", "à vendre" ou "étagère virtuelle", et vous obtiendrez la liste ou les étiquettes désirées.

Il est donc indispensable d'avoir quelques variantes de certaines procédures de base d'impression (d'étiquettes ou de listes de livres) ou de statistiques - la différence réside dans le critère de sélection.
C'est pour cela que j'ai donné tellement de variantes de procédures d'impression sur le Wiki (étiquettes et inventaire - 2e et 3e parties)

Exemple : de quels exemplaires imprimer la liste?
 - ceux dont le code-barres est compris entre ... et ... ?
 - ceux dont la cote de rangement est comprise entre ... et ... ?
 - ceux qui sont dans la section ...?
 - ceux qui se trouvent dans le panier ... et dont j'ai modifié provisoirement le statut afin de pouvoir les identifier à coup sûr?

Cette dernière variante (statut) me permet de faire facilement le lien entre la sélection dans un panier et les états personnalisables (administration - éditions).
Outre les statuts "courants" (document en bon état - consultable sur place - en cours d'import/saisie ...), j'ai donc créé en fonction des besoins quelques statuts provisoires "sans étiquette - étagère virtuelle ..."


d) Exemple concret : étiquettes erronées ou détériorées  - étapes à suivre

Préliminaires (éventuellement - il se peut que vous ayez déjà fait tout cela)
 - administration - exemplaires - statut - créer un statut spécial d'exemplaires, statut que j'ai appelé "sans étiquette"
 - administration - outils - états personnalisables - créer la requête d'impression d'étiquettes sur base du statut
 - paniers - gestion des procédures - créer la procédure d'action "changer le statut"
 - paniers - gestion des paniers - créer le panier "étiquettes à refaire" - le vider éventuellement avant de le réutiliser

Etapes
 - paniers - sélection - (par douchette par exemple) mettre tous les exemplaires concernés dans le panier appelé "étiquettes à refaire"
 - paniers - action - modifier globalement le statut de tous les exemplaires de ce panier - ils passent du statut "document en bon état" au statut "sans étiquette"
 - éditions - exécuter une action personnalisable - impression d'étiquettes - mais cette fois-ci, la version basée sur le statut des exemplaires
  choisir bien sûr le statut "sans étiquette" ce qui permet d'imprimer des étiquettes pour la quinzaine de livres concernés.- et uniquement pour ceux-là.
 - paniers - action - remodifier globalement le statut de tous les exemplaires de ce panier - ils repassent du statut "sans étiquette" au statut "document en bon état"

C'est comme cela que vous pourrez gérer le lien entre la sélection dans un panier et l'exécution d'une action personnalisable uniquement pour les exemplaires de ce panier : en les faisant transiter par un statut provisoire, un "statut spécial" qui ne sert qu'à cela..


e) Deux exemples de requête (inventaire)

Un inventaire complet : j'extrais les données suivantes et je prévois un titre pour les colonnes (as Cote, as Auteur, as Titre ...)
 - cote de rangement (e.expl_cote)
 - code-barres (e.expl_cb)
 - nom et prénom de l'auteur principal (a.author_name, a.author_rejete)
 - titre (n.tit1)
 - éditeur (p.ed_name)
 - année de parution (n.year)
L'inventaire se présente en colonnes, chaque ligne correspond à un exemplaire. J'ai choisi un tri par cote de rangement, titre et numéro de code-barres.
    N.B. Vous pouvez bien sûr supprimer certains de ces champs, s'il vous semblent inutiles.

Ceci pourrait donc vous donner la liste des livres à vendre, de ceux qui figurent sur une étagère virtuelle de l'OPAC, etc.
Code sql (attention si vous faites un copier-coller - effacer les ENTER dans ce code, sinon il ne fonctionne pas)

Inventaire des livres - sélection par statut
SELECT e.expl_cote as Cote, e.expl_cb as Code_barres, GROUP_CONCAT(REPEAT(CONCAT(a.author_name, ', ', a.author_rejete), 1/(r.responsability_type=0)) SEPARATOR ', ') as Auteur, n.tit1 as Titre, p.ed_name as Editeur, n.year as Année FROM exemplaires e, notices n, authors a, publishers p, responsability r WHERE e.expl_statut= !!param1!! and e.expl_notice=n.notice_id and r.responsability_notice = n.notice_id AND responsability_author = a.author_id and n.ed1_id = p.ed_id GROUP BY e.expl_cb ORDER BY e.expl_cote, n.index_sew, e.expl_cb

Titre du paramètre : Statut
Mode de choix : sélection à partir d'un requête - obligatoire
Options (cocher liste multiple)  :    select idstatut,statut_libelle from docs_statut order by statut_libelle
N.B. Ne pas oublier de cliquer sur "enregistrer" avant de fermer la fenêtre options


N.B. Dans le cas d'un inventaire de tous les exemplaires d'une section, il n'est pas nécessaire de "transiter" par la constitution d'un panier et un changement de statut.

Il suffit de changer légèrement la requête précédente
 WHERE e.expl_statut= !!param1!!       devient  WHERE e.expl_section= !!param1!!
et  les options changent aussi
 select idstatut,statut_libelle from docs_statut  order by statut_libelle        devient      select idsection, section_libelle from docs_section order by section_libelle

Inventaire des livres - sélection par section
SELECT e.expl_cote as Cote, e.expl_cb as Code_barres, GROUP_CONCAT(REPEAT(CONCAT(a.author_name, ', ', a.author_rejete), 1/(r.responsability_type=0)) SEPARATOR ', ') as Auteur, n.tit1 as Titre, p.ed_name as Editeur, n.year as Année FROM exemplaires e, notices n, authors a, publishers p, responsability r WHERE e.expl_section= !!param1!! and e.expl_notice=n.notice_id and r.responsability_notice = n.notice_id AND r.responsability_author = a.author_id and n.ed1_id = p.ed_id GROUP BY e.expl_cb ORDER BY e.expl_cote, n.index_sew, e.expl_cb

Titre du paramètre : Section
Mode de choix : sélection à partir d'un requête - obligatoire
Options (cocher liste multiple)  :  select idsection, section_libelle from docs_section order by section_libelle
N.B. Ne pas oublier de cliquer sur "enregistrer" avant de fermer la fenêtre options


f) Remarque finale

Ne vous sentez pas obligé, en toutes circonstances; de passer par un statut provisoire.
N'oubliez pas que ce n'est nécessaire que s'il s'agit d'exemplaires disparates contenus dans le même panier.

Si je reprends l'exemple mentionné ci-dessus : de quels exemplaires imprimer la liste?
 - ceux dont le code-barres est compris entre ... et ... ?
 - ceux dont la cote de rangement est comprise entre ... et ... ?
 - ceux qui sont dans la section ...?
 - ceux qui se trouvent dans le panier ... et dont j'ai modifié provisoirement le statut afin de pouvoir les identifier à coup sûr?
la transition par un statut "spécial" n'est nécessaire que dans le dernier cas
Si vous avez encodé les diverses variantes de procédure d'impression, vous ne devrez pas "transiter" par le panier et le statut provisoire.


L'encodage des diverses variantes est loin d'être une perte de temps. A vous de voir celles dont vous aurez le plus besoin.
Ne vous contentez pas de la sélection sur base du statut.


Exemple concret :
Encoder la procédure qui permet l'impression des étiquettes dont le code-barres est >=... et <=... me semble être un véritable gain de temps à long terme.

En effet, vous devrez sinon à chaque fois (*) mettre tous ces exemplaires dans un panier, en modifier le statut, imprimer les étiquettes, rechanger le statut et vider le panier - avec les risques d'erreur. 
        (* A chaque fois = très souvent dans ce cas-ci, car c'est à chaque fois que vous encodez de nouveaux livres ou périodiques dans votre base).
Ce qui vous prendra finalement beaucoup plus de temps que d'encoder une variante supplémentaire d'impression d'étiquettes (d'autant plus qu'avec un copier-coller, on encode assez peu).


Bon travail !

Cordialement,

Anne-Marie

Liste de diffusion pmb.user
Pour se désinscrire : mailto:pmb.user_request@sigb.net?subject=unsubscribe