[Résolu] Lancer une requête UPDATE au démarrage de l'ODB

Discussions sur le module de base de données Base et plus particulièrement sur le langage SQL ou sur les connexions aux SGBD tiers.
Les questions sur les macros doivent être postées dans la section dédiée en dessous.

Modérateur : Vilains modOOs

Règles du forum
Cette section est dédiée au module Base et plus particulièrement sur le langage SQL ou sur les connexions aux SGBD tiers. Vous ne devez pas poster ici de questions sur les macros mais utiliser la section éponyme.
Pour accélérer les réponses, vous pouvez mettre en ligne votre base en joignant un fichier ODB : comment faire.
cegtio
Membre OOrganisé
Membre OOrganisé
Messages : 68
Inscription : 09 avr. 2023 18:50

[Résolu] Lancer une requête UPDATE au démarrage de l'ODB

Message par cegtio »


La modération vous a écrit: Encore une fois !
Veillez à ne pas mettre de terme implicite dans un titre.
Toutes les questions ici traitent forcément de base de données.

Bonjour la communauté,

je souhaite réaliser une succession de trois requêtes UPDATE au démarrage de ma base de données. Comment-puis je faire ?

Merci pour vos suggestions.
Dernière modification par cegtio le 19 juin 2023 04:47, modifié 1 fois.
LibreOffice 7.5 sous MacOS 10.15.7
pulcinopio
Membre prOOscrit
Messages : 243
Inscription : 13 juil. 2022 17:13

Re: Lancer une requete UPDATE au démarrage de ma base de donnée

Message par pulcinopio »

Bonsoir Cegtio!

1. les requêtes de la base sont toujours actuelles. Evidemment, si il n'y a aucun ajout au formulaire, elles restent tel quel.
2. Si vous choisissez les rapports dynamiques, ceux-ci seront toujours actuels.

Slts

Pulcinopio
Libre Office 6.0.4 sur Ubuntu 18.04
cegtio
Membre OOrganisé
Membre OOrganisé
Messages : 68
Inscription : 09 avr. 2023 18:50

Re: Lancer une requete UPDATE au démarrage de ma base de donnée

Message par cegtio »

Je me demandais si une macro pouvait faire cela.

Executer une requête du type au démarrage de la base :

Code : Tout sélectionner

UPDATE "CLIENT"
SET "CAT_AGE" = 'Enfant'
WHERE FLOOR(
            DATEDIFF(
                'dd',
                "CLIENT"."DATE_NAISS_CLIENT",
                "CLIENT"."DATE_1PRESTATION"
            ) / 365.25
        ) < 13

UPDATE "CLIENT"
SET "CAT_AGE" = 'Ado'
WHERE FLOOR(
            DATEDIFF(
                'dd',
                "CLIENT"."DATE_NAISS_CLIENT",
                "CLIENT"."DATE_1PRESTATION"
            ) / 365.25
        ) BETWEEN 13 AND 17

UPDATE "CLIENT"
SET "CAT_AGE" = 'Adulte'
WHERE FLOOR(
            DATEDIFF(
                'dd',
                "CLIENT"."DATE_NAISS_CLIENT",
                "CLIENT"."DATE_1PRESTATION"
            ) / 365.25
        ) > 17
LibreOffice 7.5 sous MacOS 10.15.7
Avatar de l’utilisateur
Oukcha
RespOOnsable modération
RespOOnsable modération
Messages : 4343
Inscription : 06 oct. 2008 08:03

Re: Lancer une requete UPDATE au démarrage de ma base de donnée

Message par Oukcha »

Bonjour,
cegtio a écrit : 11 juin 2023 05:22 Je me demandais si une macro pouvait faire cela.
Je rappelle que cette section n'est pas consacrée aux macros (voir le bandeau rouge en haut de la page). Si vous avez à poursuivre dans cette voie, merci de poster au bon endroit. Ceci dans un but de recherche efficace de l'information dans ce forum.

Si vous postez une solution, faites le en section "Macros et API" et ajoutez dans ce fil un lien vers celle-ci.
                                        
Pour tout savoir sur le fonctionnement de ce forum :arrow: À lire avant tout ! Image
cegtio
Membre OOrganisé
Membre OOrganisé
Messages : 68
Inscription : 09 avr. 2023 18:50

Re: Lancer une requete UPDATE au démarrage de ma base de donnée

Message par cegtio »

Merci pour votre rappel... J'aurais espéré pouvoir me passer d'une macro pour faire cela, d'où la question ici...mais j'ai également posé la question dans la section macro, si c'est incontournable de passer par une macro pour lancer une requête UPDATE au démarrage de ma base.
La modération vous a écrit: suite en section macros

LibreOffice 7.5 sous MacOS 10.15.7
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 17219
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Re: Lancer une requete UPDATE au démarrage de ma base de donnée

Message par jeanmimi »

Bonjour,
cegtio a écrit : 11 juin 2023 05:22 DATEDIFF(
'dd',
"CLIENT"."DATE_NAISS_CLIENT",
"CLIENT"."DATE_1PRESTATION"
) / 365.25
) BETWEEN 13 AND 17
Les données traitées doivent plutôt l'être dans des requêtes.
Ces requêtes seront forcément actualisées à l'ouverture de la Base.
Enfin, l'instruction SQL de calcul de l'âge est différente, que ce soit par une Requête utilisant DATEDIFF :

Code : Tout sélectionner

SELECT "ID_CLIENT", DATEDIFF( 'year', "DATE_NAISS_CLIENT", NOW( ) ) || ' ' || 'ans' AS "âge en années", DATEDIFF( 'month', "DATE_NAISS_CLIENT", NOW( ) ) || ' ' || 'mois' AS "âge en mois", DATEDIFF( 'day', "DATE_NAISS_CLIENT", NOW( ) ) || ' ' || 'jours' AS "âge en jours" FROM "CLIENTS" AS "membres"
ou par une requête utilisant CURRENT_DATE en SQL direct :

Code : Tout sélectionner

SELECT "DATE_NAISS_CLIENT",
CASE
WHEN Month(CURRENT_DATE) < month("DATE_NAISS_CLIENT") or ( Month(CURRENT_DATE) = Month("DATE_NAISS_CLIENT") and day(CURRENT_DATE)<day("DATE_NAISS_CLIENT") )   THEN
      CAST((year(CURRENT_DATE) - year("DATE_NAISS_CLIENT") -1) AS VARCHAR) || ' ans'
ELSE
      CAST((year(CURRENT_DATE) - year("DATE_NAISS_CLIENT") ) AS VARCHAR) || ' ans' END as "Age" 
from "CLIENTS"
LibreOffice : Version : 25.8.4 (x64)(23 février 2026)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
cegtio
Membre OOrganisé
Membre OOrganisé
Messages : 68
Inscription : 09 avr. 2023 18:50

Re: Lancer une requête UPDATE au démarrage de l'ODB

Message par cegtio »

Merci beaucoup pour votre aide. Mais mon objectif est, je crois un peu différent:

J'ai créé une requete CLIENTS_REQ dans laquelle je calcule un catégorie d'age à partir de la date de naissance (soit enfant, ado, adulte). Je voudrais injecter les résultats de cette requète dans la colonne CAT_CLIENT de laTable CLIENTS et que cela soit mis à jour si je modifie l'âge dans la rêquete.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice 7.5 sous MacOS 10.15.7
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 17219
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Re: Lancer une requête UPDATE au démarrage de l'ODB

Message par jeanmimi »

cegtio a écrit : 11 juin 2023 16:24 "graver" le résultat de cette requete d'âge dans un tierce colonne CATEGORIE D'AGE
Je suppose que dans votre expérience, celui qui est enfant un jour, devient un autre jour un ado, voire un adulte. Quel est alors l'intérêt de "graver" un client dans une catégorie d'âge alors que le client va changer de Catégorie d'âge ?
Cette requête va tenir compte de ces variations d'âges pour les classer dans une catégorie :

Code : Tout sélectionner

SELECT "ID_CLIENT", DATEDIFF( 'year', "DATE_NAISS_CLIENT", NOW( ) ) || ' ' || 'ans' AS "âge en années", 
DATEDIFF( 'month', "DATE_NAISS_CLIENT", NOW( ) ) || ' ' || 'mois' AS "âge en mois", 
DATEDIFF( 'day', "DATE_NAISS_CLIENT", NOW( ) ) || ' ' || 'jours' AS "âge en jours", 
CASE WHEN ( DATEDIFF( 'year', "DATE_NAISS_CLIENT", NOW( ) ) ) < 13 THEN 'enfant' 
WHEN ( DATEDIFF( 'year', "DATE_NAISS_CLIENT", NOW( ) ) ) BETWEEN 13 AND 17 THEN 'ado' 
ELSE 'adulte' 
END AS "CATEGORIE D'AGE" FROM "CLIENTS" AS "membres"
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par jeanmimi le 24 juin 2023 12:47, modifié 1 fois.
LibreOffice : Version : 25.8.4 (x64)(23 février 2026)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
cegtio
Membre OOrganisé
Membre OOrganisé
Messages : 68
Inscription : 09 avr. 2023 18:50

Re: Lancer une requête UPDATE au démarrage de l'ODB

Message par cegtio »

Le noeud du problème est (je sens que je vais me faire taper sur les doigts...) que j'ai mis en place un système qui me permet faire une recherche dans un formulaire, à partir de plusieurs critères, mais à partir du moment où j'ajoute le critère CATEGORIE D'AGE, cela génère un temps de calcul énorme. D'où mon idée de graver le résultat de la requete une bonne fois pour toutes (enfin, jusqu' au prochain enregistrement de ma base de données) afin de limiter les calculs pour ce critère de recherche.
(j'ai ajouté une base de données tests en pièce jointe à mon précédent mon message pour avoir du concret)
Merci pour votre aide (une fois de plus)!
LibreOffice 7.5 sous MacOS 10.15.7
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 17219
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Re: Lancer une requête UPDATE au démarrage de l'ODB

Message par jeanmimi »

cegtio a écrit : 11 juin 2023 16:58 cela génère un temps de calcul énorme
Difficile à dire avec deux enregistrements.
J'ai seulement remarqué que les Tables et les formulaires ne sont pas toujours optimisés et conformes aux critères d'une Base relationnelle.
LibreOffice : Version : 25.8.4 (x64)(23 février 2026)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
pulcinopio
Membre prOOscrit
Messages : 243
Inscription : 13 juil. 2022 17:13

Re: Lancer une requête UPDATE au démarrage de l'ODB

Message par pulcinopio »

cegtio a écrit : 11 juin 2023 16:58 D'où mon idée de graver le résultat de la requete une bonne fois pour toutes (enfin, jusqu' au prochain enregistrement de ma base de données) afin de limiter les calculs pour ce critère de recherche.
(j'ai ajouté une base de données tests en pièce jointe à mon précédent mon message pour avoir du concret)
Bonjour Cegtio,

A mon avis, rien de sert de faire une logorrhée pour une question simple comme le bonjour, car soit l'instruction NOW() que CURDATE() sont paramétrées au CLOCK du système et l'usager sait quelle heure il est pratiquement dans l'immédiat.

"Pierre qui roule n'amasse pas mousse!"

Slts

pulcinopio
Libre Office 6.0.4 sur Ubuntu 18.04
cegtio
Membre OOrganisé
Membre OOrganisé
Messages : 68
Inscription : 09 avr. 2023 18:50

Re: Lancer une requête UPDATE au démarrage de l'ODB

Message par cegtio »

pardon ?
LibreOffice 7.5 sous MacOS 10.15.7
pulcinopio
Membre prOOscrit
Messages : 243
Inscription : 13 juil. 2022 17:13

Re: Lancer une requête UPDATE au démarrage de l'ODB

Message par pulcinopio »

Mon ami Cegtio,

Loin de moi toute idée de critiquer les montres Cartier ou Bulgari. Veuillez donc pardonner mon offense.

Je n'ai pas la prétention du Grand Architecte....

Amitiés

pulcinopio :)
Libre Office 6.0.4 sur Ubuntu 18.04
Rafkus_pl
Membre lOOyal
Membre lOOyal
Messages : 35
Inscription : 23 févr. 2022 11:45

Re: Lancer une requête UPDATE au démarrage de l'ODB

Message par Rafkus_pl »

cegtio a écrit : 11 juin 2023 16:58 cela génère un temps de calcul énorme
Je pense que le problème est votre formule de calcul de l'âge. Essayez de calculer le nombre de jours entre la date et aujourd'hui par VOUS-MÊME, puis divisez par 365,25. Je me demande à quelle vitesse tu peux le faire. :lol:
Je suggère d'utiliser une autre façon de calculer l'âge, par exemple en utilisant la fonction : DATEDIFF('year', "DATE_BIRTH_CLIENT", CURRENT_DATE)... ou YEAR(CURRENT_DATE) - YEAR("DATE_BIRTH_CLIENT") ... voir si cela expression génère une énorme quantité de calculs de temps.
cegtio a écrit : 10 juin 2023 19:45 je souhaite réaliser une succession de trois requêtes UPDATE au démarrage de ma base de données. Comment-puis je faire ?
Malheureusement, uniquement avec une macro ou en tapant vous-même la commande SQL.

EDIT:
J'ai testé, dans votre base de données "interface patients.obd" ajouté 1050 enregistrements à la table "CUSTOMERS" et exécuté la requête :

Code : Tout sélectionner

SELECT "PRENOM", "NOM", "EMAIL", "DATE_NAISSANCE", 
CASE WHEN FLOOR( DATEDIFF( 'dd', "CLIENTS"."DATE_NAISSANCE", CURDATE( ) ) / 365.25 ) < 13 THEN 'Enfant' 
	WHEN FLOOR( DATEDIFF( 'dd', "CLIENTS"."DATE_NAISSANCE", CURDATE( ) ) / 365.25 ) BETWEEN 13 AND 17 THEN 'Ado' 
	WHEN FLOOR( DATEDIFF( 'dd', "CLIENTS"."DATE_NAISSANCE", CURDATE( ) ) / 365.25 ) > 17 THEN 'Adulte' 
ELSE 'NULL' END AS "CAT_AGE" 
FROM "CLIENTS"
J'ai dû attendre environ 60 secondes pour le résultat.
J'ai modifié cette requête sous la forme:

Code : Tout sélectionner

SELECT "PRENOM", "NOM", "EMAIL", "DATE_NAISSANCE", 
CASE WHEN "CLIENTS"."DATE_NAISSANCE" is null THEN 'NULL'
	WHEN "CLIENTS"."DATE_NAISSANCE" > CURDATE( ) THEN 'Mauvaise date'
	WHEN (DATEDIFF( 'yy', "CLIENTS"."DATE_NAISSANCE", CURDATE( ) )- casewhen( RIGHT( CURDATE(), 5 ) < RIGHT( "CLIENTS"."DATE_NAISSANCE", 5 ), 1, 0 ))> 17 THEN 'Adulte'
	WHEN (DATEDIFF( 'yy', "CLIENTS"."DATE_NAISSANCE", CURDATE( ) )- casewhen( RIGHT( CURDATE(), 5 ) < RIGHT( "CLIENTS"."DATE_NAISSANCE", 5 ), 1, 0 ))< 13 THEN 'Enfant' 
	ELSE 'Ado' END  AS "CAT_AGE" 
FROM "CLIENTS"
J'ai eu le résultat presque immédiatement.
OpenOffice 4.1.6, LibreOffice 7.1.6 - Widows 10
J'écris avec Google Translator, désolé pour l'orthographe...
nounours2
Membre prOOscrit
Messages : 88
Inscription : 18 juin 2023 15:10

Re: Lancer une requête UPDATE au démarrage de l'ODB

Message par nounours2 »

Salut Cegtio,

Ce fil est plus simple viewtopic.php?t=67397.

A mon avis il n'y avait pas besoin d'ameuter le quartier...
:D

A+
Libre Office 6.0.7 sous Ubuntu 18.04
cegtio
Membre OOrganisé
Membre OOrganisé
Messages : 68
Inscription : 09 avr. 2023 18:50

Re: [Résolu] Lancer une requête UPDATE au démarrage de l'ODB

Message par cegtio »

@ Rafkus_pl :
Merci beaucoup, je vais tester ça !!
LibreOffice 7.5 sous MacOS 10.15.7
cegtio
Membre OOrganisé
Membre OOrganisé
Messages : 68
Inscription : 09 avr. 2023 18:50

Re: [Résolu] Lancer une requête UPDATE au démarrage de l'ODB

Message par cegtio »

@ Rafkus_pl
En fait, je me rends compte que ta méthode donne une erreur pour les âges plus petits que 10, comment pourrais je arranger ça ?
Précisément ceci renvoie une aberration pour les ages de moins de 10 ans :

Code : Tout sélectionner

WHEN (DATEDIFF( 'yy', "CLIENTS"."DATE_NAISSANCE", CURDATE( ) )- casewhen( RIGHT( CURDATE(), 5 ) < RIGHT( "CLIENTS"."DATE_NAISSANCE", 5 ), 1, 0 ))< 13 THEN 'Enfant'
LibreOffice 7.5 sous MacOS 10.15.7
Rafkus_pl
Membre lOOyal
Membre lOOyal
Messages : 35
Inscription : 23 févr. 2022 11:45

Re: [Résolu] Lancer une requête UPDATE au démarrage de l'ODB

Message par Rafkus_pl »

je ne vois pas d'erreur
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
OpenOffice 4.1.6, LibreOffice 7.1.6 - Widows 10
J'écris avec Google Translator, désolé pour l'orthographe...
cegtio
Membre OOrganisé
Membre OOrganisé
Messages : 68
Inscription : 09 avr. 2023 18:50

Re: [Résolu] Lancer une requête UPDATE au démarrage de l'ODB

Message par cegtio »

Etrange. accepteriez-vous de jeter un oeil au fichier de base de données joint à ce message ?

Dans la requête LISTE_CLIENTS, il apparait que l'âge du premire client est de 7 ans mais il est classé dans la catégorie Adulte.


Je ne vois pas où est mon erreur.

Merci beaucoup.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice 7.5 sous MacOS 10.15.7
pulcinopio
Membre prOOscrit
Messages : 243
Inscription : 13 juil. 2022 17:13

Re: [Résolu] Lancer une requête UPDATE au démarrage de l'ODB

Message par pulcinopio »

cegtio a écrit : 24 juin 2023 05:43 Etrange. accepteriez-vous de jeter un oeil au fichier de base de données joint à ce message ?

Dans la requête LISTE_CLIENTS, il apparait que l'âge du premire client est de 7 ans mais il est classé dans la catégorie Adulte.


Je ne vois pas où est mon erreur.

Merci beaucoup.
Très cher ami cegtio,

Tu m'excuseras mais on m'appelle "simplet".

Voir fichier en annexe.

A+

Pulcinopio
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libre Office 6.0.4 sur Ubuntu 18.04
cegtio
Membre OOrganisé
Membre OOrganisé
Messages : 68
Inscription : 09 avr. 2023 18:50

Re: [Résolu] Lancer une requête UPDATE au démarrage de l'ODB

Message par cegtio »

Bonjour, cela ne répond pas à la question. Néanmoins merci pour l'effort.
LibreOffice 7.5 sous MacOS 10.15.7
Rafkus_pl
Membre lOOyal
Membre lOOyal
Messages : 35
Inscription : 23 févr. 2022 11:45

Re: [Résolu] Lancer une requête UPDATE au démarrage de l'ODB

Message par Rafkus_pl »

Dans ce cas:

Code : Tout sélectionner

CASE WHEN SUBSTR( DATEDIFF( 'yy', "CLIENT"."DATE_NAISS_CLIENT", CURDATE( ) ) - casewhen( RIGHT( CURDATE( ), 5 ) < RIGHT( "CLIENT"."DATE_NAISS_CLIENT", 5 ), 1, 0 ), 1 ) < 13 THEN 'Enfant'
	WHEN SUBSTR( DATEDIFF( 'yy', "CLIENT"."DATE_NAISS_CLIENT", CURDATE( ) ) - casewhen( RIGHT( CURDATE( ), 5 ) < RIGHT( "CLIENT"."DATE_NAISS_CLIENT", 5 ), 1, 0 ), 1 ) BETWEEN 13 AND 17 THEN 'Ado' 
	WHEN SUBSTR( DATEDIFF( 'yy', "CLIENT"."DATE_NAISS_CLIENT", CURDATE( ) ) - casewhen( RIGHT( CURDATE( ), 5 ) < RIGHT( "CLIENT"."DATE_NAISS_CLIENT", 5 ), 1, 0 ), 1 ) > 17 THEN 'Adulte' 
	ELSE 'NULL' END AS "CAT_AGE", 
utiliser la fonction SUBSTR ici est une erreur. Convertit un nombre en texte que vous comparez avec un nombre. Et c'est pourquoi vous obtenez des résultats "étranges" qui sont en fait corrects. Cette expression vous donnera les résultats attendus:

Code : Tout sélectionner

CASE WHEN ( DATEDIFF( 'yy', "CLIENT"."DATE_NAISS_CLIENT", CURDATE( ) ) - casewhen( RIGHT( CURDATE( ), 5 ) < RIGHT( "CLIENT"."DATE_NAISS_CLIENT", 5 ), 1, 0 )) < 13 THEN 'Enfant'
	WHEN ( DATEDIFF( 'yy', "CLIENT"."DATE_NAISS_CLIENT", CURDATE( ) ) - casewhen( RIGHT( CURDATE( ), 5 ) < RIGHT( "CLIENT"."DATE_NAISS_CLIENT", 5 ), 1, 0 )) BETWEEN 13 AND 17 THEN 'Ado' 
	WHEN ( DATEDIFF( 'yy', "CLIENT"."DATE_NAISS_CLIENT", CURDATE( ) ) - casewhen( RIGHT( CURDATE( ), 5 ) < RIGHT( "CLIENT"."DATE_NAISS_CLIENT", 5 ), 1, 0 )) > 17 THEN 'Adulte' 
	ELSE 'NULL' END AS "CAT_AGE", 
L'ordre de tri suit les règles :
  • Texte : 'a' < ... < 'g' < ... < 'z' < ...
  • Nombres : ... < -10 < ... < 0 < ... < 10 < ... < 10000 < ...
  • Numéros de texte: ... < '-33' < ... < '0' < ... < '10' < ... < '3' < ... < '456' < ... < '8' < ...
    REMARQUE : il ne s'agit pas d'une erreur '10' < ... < '3' . Ce n'est pas un nombre, c'est un texte, les caractères consécutifs sont comparables et le caractère '1' est antérieur au caractère '3'. Analogie au texte, assignez le texte aux nombres : '0'='a', '1'='b', '3'='c' ---> '10' = 'ba' ---> 'ba' <'c'
PS. et donc l'expression '7'<13 en CASE est FALSE
OpenOffice 4.1.6, LibreOffice 7.1.6 - Widows 10
J'écris avec Google Translator, désolé pour l'orthographe...
cegtio
Membre OOrganisé
Membre OOrganisé
Messages : 68
Inscription : 09 avr. 2023 18:50

Re: [Résolu] Lancer une requête UPDATE au démarrage de l'ODB

Message par cegtio »

Fantastique ! Merci pour votre aide et pour l'explication !!
LibreOffice 7.5 sous MacOS 10.15.7