[Résolu] équivalent de la fonction NOMPROPRE de Calc

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.
Bouzi
Membre hOOnoraire
Membre hOOnoraire
Messages : 125
Inscription : 10 juil. 2009 06:10

[Résolu] équivalent de la fonction NOMPROPRE de Calc

Message par Bouzi »

Bonjour,

Auparavant les notes de mes élèves étaient gérées avec un classeur. Je faisais toutes mes requêtes à la main en utilisant les fonctions de recherche de Calc (La fonction EQUIV et ses consœurs) . Pour me simplifier la tâche et me familiariser avec les bases de données, j'ai décidé de faire la même chose avec le module Base de OO.

Voici mon problème
J'ai une table Elèves qui contient les champs nom et prénom séparés. Pour mes différentes listes, je veux afficher une chaine de caractères qui est la concaténation du nom et du prénom de l'élève. Sauf que je veux que le nom de famille apparaisse en majuscules et le prénom en minuscules avec l'initiale en majuscule. Quelque soit la casse lors de la saisie des champs nom et prénom dans la table. Un exemple sera plus parlant

dans la table => Présentation
washington denzel => WASHNGTON Denzel
smith WILL => SMITH Will

Dans Calc j'avais trouvé la solution: les fonctions MAJUSCULES et NOMPROPRE. Malheureusement ces deux fonctions n'existent pas dans Base. Puis je me suis souvenu des fonctions UPPER et LOWER que j'utilisai en programmation. La première transforme un texte en majuscules et la seconde en minuscules. Et là,bingo! Ceci donne pour mon champ calculé: UPPER ( "Eleve"."nom" ) + ' ' + LOWER ( "Eleve"."prénom" ).

Malheureusement le prénom entier apparait en minuscules; FERRY jules au lieu de FERRY Jules.
C''est mieux que rien mais connaissez vous un équivalent de la fonction NOMPROPRE de Calc pour le module Base?
Je n'ai rien trouvé dans l'aide de OO et sur le forum, à moins de m'y être mal pris.

Merci pour vos réponses
___________________________________________________________________________
La connaissance est comme l'heure même si on la donne on l'a toujours avec soi.
LibO 1:6.1.5~3+deb10u7 sur Debian 10
LibO 7.6.1.2 sur windows 10
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 16955
Inscription : 03 mars 2006 17:02
Localisation : Venise verte

Re: équivalent de la fonction NOMPROPRE de Calc

Message par jeanmimi »

Bonjour,
Je ne sais pas si la base est facile à retrouver dans le forum, mais Pierre-Yves SAMYN avait proposé une solution avec deux Macros basées sur les commandes SQL UCASE et LCASE.
La première passe les noms en majuscules, la deuxième passe la première lettre du prénom en majuscules.
Pièces jointes
Champ forcé en majuscule.odb
(20.24 Kio) Téléchargé 246 fois
LibreOffice : Version : 24.2.1 (x64)(14 mars 2024)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 10:42

Re: équivalent de la fonction NOMPROPRE de Calc

Message par Pierre-Yves Samyn »

Bonjour

Une solution sans macro qui gère les prénoms composés (test d'un tiret ou d'un espace dans le prénom) :

Code : Tout sélectionner

SELECT "RéfClient", "Nom", "Prénom", CASEWHEN( LOCATE( '-', "Prénom" ) = 0, CASEWHEN( LOCATE( ' ', "Prénom" ) = 0, UCASE( "Nom" ) || ' ' || INSERT( LCASE( "Prénom" ), 1, 1, UCASE( LEFT( "Prénom", 1 ) ) ), UCASE( "Nom" ) || ' ' || INSERT( INSERT( LCASE( "Prénom" ), 1, 1, UCASE( LEFT( "Prénom", 1 ) ) ), LOCATE( ' ', "Prénom" ) + 1, 1, UCASE( SUBSTRING ( "Prénom", LOCATE( ' ', "Prénom" ) + 1, 1 ) ) ) ), UCASE( "Nom" ) || ' ' || INSERT( INSERT( LCASE( "Prénom" ), 1, 1, UCASE( LEFT( "Prénom", 1 ) ) ), LOCATE( '-', "Prénom" ) + 1, 1, UCASE( SUBSTRING ( "Prénom", LOCATE( '-', "Prénom" ) + 1, 1 ) ) ) ) AS "Nom Prénom" FROM "Clients"
Pièces jointes
RequêteNomPropre.odb
(5.31 Kio) Téléchargé 230 fois
Bouzi
Membre hOOnoraire
Membre hOOnoraire
Messages : 125
Inscription : 10 juil. 2009 06:10

Re: équivalent de la fonction NOMPROPRE de Calc

Message par Bouzi »

Bonjour

Une petite précision: ma base est une source données pour un classeur. Avant j'importais les champs nom et prénom bruts dans Calc et j'appliquais MAJUSCULES au champ nom et NOMPROPRE au champ prénom. Mon idée était de mettre un maximum de traitement dans Base et que calc ne serve qu'a la visualisation. Mais si je ne trouve pas de solution simple,je vais reprendre mon ancienne solution.

Ne maitrisant pas le langage SQL ta requête me semble bien compliquée. Je vais tester ton fichier pour voir. Je te remercie.

Pour finir, je trouve étonnant que les fonctions UPPER et LOWER existent et pas de fonction équivalent à la fonction nompropre de Calc. Cette fonction pourrait elle faire partie d'un développement par les programmeurs de la communauté?
___________________________________________________________________________
La connaissance est comme l'heure même si on la donne on l'a toujours avec soi.
LibO 1:6.1.5~3+deb10u7 sur Debian 10
LibO 7.6.1.2 sur windows 10
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 10:42

Re: équivalent de la fonction NOMPROPRE de Calc

Message par Pierre-Yves Samyn »

Bouzi a écrit :Une petite précision: ma base est une source données pour un classeur.
Précision d'importance d'autant que...
Bouzi a écrit :Auparavant les notes de mes élèves étaient gérées avec un classeur
....
j'ai décidé de faire la même chose avec le module Base de OO.
Il aurait donc été utile de préciser puisque la réponse est tout à fait différente...

Tout d'abord soyons sûrs : est-ce que le classeur est la source de données de la base, ou bien les données sont-elles dans une table d'une base OOo ? Dans ce deuxième cas, comment les "rappatries-tu" de Base vers Calc ?

Dans le premier cas (les données sont dans Calc) la requête que je t'ai donnée ne fonctionnera pas car toutes les instructions ne sont pas disponibles (casewhen en particulier). Cela dit puisque les données sont dans Calc il n'y a aucun problème à ajouter la colonne avec la fonction Calc qui fait cela très bien.

Dans le deuxième cas (les données sont dans Base) la requête que j'ai donnée fonctionne et la seule modification à apporter consiste à remplacer les noms de champs par les tiens, ce qui peut se faire par deux cherche-remplace dans writer par exemple.
Bouzi a écrit :Pour finir, je trouve étonnant que les fonctions UPPER et LOWER existent et pas de fonction équivalent à la fonction nompropre de Calc. Cette fonction pourrait elle faire partie d'un développement par les programmeurs de la communauté?
Ce forum n'a aucun lien avec les équipes de développement, en revanche il contient un lien expliquant comment faire : http://user.services.openoffice.org/fr/ ... ic716.html
Bouzi
Membre hOOnoraire
Membre hOOnoraire
Messages : 125
Inscription : 10 juil. 2009 06:10

Re: équivalent de la fonction NOMPROPRE de Calc

Message par Bouzi »

Bonjour Pierre-Yves,
Pierre-Yves Samyn a écrit :
Tout d'abord soyons sûrs : est-ce que le classeur est la source de données de la base, ou bien les données sont-elles dans une table d'une base OOo ? Dans ce deuxième cas, comment les "rappatries-tu" de Base vers Calc ?
Je suis dans le deuxième cas
ma base : elle contient toutes les données et les requêtes pour sélectionner les données.
mon classeur: il récupère les données de la base et après traitement les visualise. J'ai trouvé pour cela un excelent tuto. qui s'appelle "Transfert de Données dans Calc et utilisation avancée des sources de données"

En ce qui concerne ta requête. Ne serait il pas plus simple d'utiliser la fonction UPPER pour le nom et ta requête juste pour ton prénom? Je n'ai pas les compétence pour analyser ta requête donc dis le moi si je dis une grosse bêtise.
Pierre-Yves Samyn a écrit : Ce forum n'a aucun lien avec les équipes de développement, en revanche il contient un lien expliquant comment faire : http://user.services.openoffice.org/fr/ ... ic716.html
merci pour l'info
___________________________________________________________________________
La connaissance est comme l'heure même si on la donne on l'a toujours avec soi.
LibO 1:6.1.5~3+deb10u7 sur Debian 10
LibO 7.6.1.2 sur windows 10
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25143
Inscription : 03 mars 2006 08:45
Localisation : 127.0.0.1
Contact :

Re: équivalent de la fonction NOMPROPRE de Calc

Message par Dude »

Salut,
Bouzi a écrit :Pour finir, je trouve étonnant que les fonctions UPPER et LOWER existent et pas de fonction équivalent à la fonction nompropre de Calc. Cette fonction pourrait elle faire partie d'un développement par les programmeurs de la communauté?
Dans ce cas, je t'invite à voter pour une RFE déjà existante. Si elle voit le jour, tu pourras intégrer n'importe quelle fonction.

4 voix au compteur à ce jour.
Poser une question, c'est bien. Répondre aux autres, c'est encore mieux.
Améliorez AOO et votez pour les issues
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 10:42

Re: équivalent de la fonction NOMPROPRE de Calc

Message par Pierre-Yves Samyn »

Bouzi a écrit :ma base : elle contient toutes les données et les requêtes pour sélectionner les données.
mon classeur: il récupère les données de la base et après traitement les visualise.
Puisque tu fais déjà "un traitement" dans Calc il n'y a décidément aucune raison de se priver de gérer la capitalisation dans ce module...
Bouzi a écrit :En ce qui concerne ta requête. Ne serait il pas plus simple d'utiliser la fonction UPPER pour le nom et ta requête juste pour ton prénom? Je n'ai pas les compétence pour analyser ta requête donc dis le moi si je dis une grosse bêtise.
Je ne suis pas sûr de bien comprendre cette remarque. Si tu proposes d'utiliser deux champs différents c'est toujours possible mais ta demande initiale était :
Bouzi a écrit :je veux afficher une chaine de caractères qui est la concaténation du nom et du prénom de l'élève. Sauf que je veux que le nom de famille apparaisse en majuscules et le prénom en minuscules avec l'initiale en majuscule
Ma requête répond stricto sensu à cette demande :)

Cela dit, en effet il est possible de "simplifier" en n'incluant pas le nom dans les tests, ce qui donne :

Code : Tout sélectionner

SELECT "RéfClient", "Nom", "Prénom", UCASE( "Nom" ) || ' ' || CASEWHEN( LOCATE( '-', "Prénom" ) = 0, CASEWHEN( LOCATE( ' ', "Prénom" ) = 0, INSERT( LCASE( "Prénom" ), 1, 1, UCASE( LEFT( "Prénom", 1 ) ) ), INSERT( INSERT( LCASE( "Prénom" ), 1, 1, UCASE( LEFT( "Prénom", 1 ) ) ), LOCATE( ' ', "Prénom" ) + 1, 1, UCASE( SUBSTRING ( "Prénom", LOCATE( ' ', "Prénom" ) + 1, 1 ) ) ) ), INSERT( INSERT( LCASE( "Prénom" ), 1, 1, UCASE( LEFT( "Prénom", 1 ) ) ), LOCATE( '-', "Prénom" ) + 1, 1, UCASE( SUBSTRING ( "Prénom", LOCATE( '-', "Prénom" ) + 1, 1 ) ) ) ) AS "Nom Prénom" FROM "Clients"
Bon... on n'a guère gagné en lisibilité :)
Verrouillé