[LibreOffice BASE] REQUÊTE problème de colonne calculée

Bonjour à tous,
C'est la 1ère fois que j'utilise une liste comme moyen de solliciter de l'aide. J'espère que j'ai bien saisi le principe, et que mon message n'est pas à côté de la plaque :wink:
J'ai cherché sur Internet pour trouver une réponse à mon problème, mais aucune des solutions que j'ai trouvé ne fonctionne, bien qu'elles semblent pertinentes.

J'utilise LibreOffice 6.4.7.2

Le problème : j'ai une table HistoriquePromo (qui est un fichier CSV, la base de donnée est connectée à ce fichier CSV). J'ai un champ Promotion dans cette table, qui contient parfois une information (libellé de la promotion, c'est du texte). Le reste du temps, il est vide (il n'y a donc pas de promotion).
Mon besoin : Dans une requête SELECT "Article" "Article", "Description" "Description", "Date" "Date", "Prix" "Prix", "Promotion" "Promotion" FROM "HistoriquePromo", je veux ajouter une colonne à la requête qui renvoit 1 si une promotion est présente (le champ est rempli avec du texte), 0 sinon.

J'ai testé : SELECT "Article" "Article", "Description" "Description", "Date" "Date", "Prix" "Prix", "Promotion" "Promotion", COALESCE ( "Promotion", 1, 0 ) "PromotionExists" FROM "HistoriquePromo"

mais la nouvelle colonne "PromotionExists" reste vide. Je n'ai, cependant, pas de message d'erreur.

J'ai testé  CASEWHEN ("Promotion"= "", 0, 1 ), mais j'ai un message d'erreur "la fonction n'est pas supportée", bien que j'ai trouvé cette info dans la doc officielle https://wiki.documentfoundation.org/Chapter1_Introduction_to_Base

J'ai testé CASE WHEN "Promotion" = "" THEN 0 ELSE 1 END : la nouvelle colonne reste vide.

J'ai testé CASE WHEN "Promotion" IS EMPTY THEN 0 ELSE 1 END : la nouvelle colonne reste vide.

J'ai testé IFNULL("Promotion",0) bien que ça ne réponde pas au besoin, mais pour vérifier si je comprenais bien le fonctionnement....même cette fonction simple ne fait rien : la nouvelle colonne reste vide (pourtant, j'ai appliqué ce que j'ai trouvé ici https://wiki.documentfoundation.org/Faq/Base/125/fr mais ça ne fonctionne pas)

Avez-vous une idée de ce qu'il faut faire ? Pourquoi ça ne marche pas ?

Merci,

Bonjour,
Je tenterais 0 entre guillemets.

Jean-Michel PIERRE
Tél : 05.49.255.333
Tél : 06.19.55.73.22

Bonjour,
Merci pour votre réponse.
J'ai re-testé toutes les formules en remplaçant 0 par "0" et 1 par "1", mais rien n'y fait. Le résultat est toujous une colonne complètement vide.

Bonjour,

Bonjour à tous,
C'est la 1ère fois que j'utilise une liste comme moyen de solliciter de l'aide. J'espère que j'ai bien saisi le principe, et que mon message n'est pas à côté de la plaque :wink:
J'ai cherché sur Internet pour trouver une réponse à mon problème, mais aucune des solutions que j'ai trouvé ne fonctionne, bien qu'elles semblent pertinentes.

J'utilise LibreOffice 6.4.7.2

Cette version est obsolète, la dernière version stable est la 7.06 (mais ce n'est pas la cause du problème)

Le problème : j'ai une table HistoriquePromo (qui est un fichier CSV, la base de donnée est connectée à ce fichier CSV). J'ai un champ Promotion dans cette table, qui contient parfois une information (libellé de la promotion, c'est du texte). Le reste du temps, il est vide (il n'y a donc pas de promotion).
Mon besoin : Dans une requête SELECT "Article" "Article", "Description" "Description", "Date" "Date", "Prix" "Prix", "Promotion" "Promotion" FROM "HistoriquePromo", je veux ajouter une colonne à la requête qui renvoit 1 si une promotion est présente (le champ est rempli avec du texte), 0 sinon.

J'ai testé : SELECT "Article" "Article", "Description" "Description", "Date" "Date", "Prix" "Prix", "Promotion" "Promotion", COALESCE ( "Promotion", 1, 0 ) "PromotionExists" FROM "HistoriquePromo"

mais la nouvelle colonne "PromotionExists" reste vide. Je n'ai, cependant, pas de message d'erreur.

Attention, il y a deux manières de gérer une table texte, il est possible que ça ne fonctionne pas dans l'une des deux. Lire le chapitre 2 du Guide Base ; https://wiki.documentfoundation.org/Documentation/Publications/fr#Guide_Base

Il est précisé dans la documentation que pour qu'une base CSV soit modifiable, elle doit être munie d'un champ numérique à valeurs uniques.

J'ai testé CASE WHEN "Promotion" = "" THEN 0 ELSE 1 END : la nouvelle colonne reste vide.

J’essaierais  CASE "Promotion" WHEN "" THEN 0 ELSE 1

Cordialement,

Il est aussi possible de poser les questions sur cette page :
https://ask.libreoffice.org/fr/questions/
Un fichier peut y être téléversé pour être testé

Jean-Michel PIERRE
Tél : 05.49.255.333
Tél : 06.19.55.73.22

Merci à tous les deux.

Concernant le forum https://ask.libreoffice.org/fr/questions/, je l'avais vu, mais il ne m'a pas semblé très actif autour de Base, et comme sur la page officielle de LibreOffice, ils mentionnent que le canal officiel pour demander de l'aide, c'est la liste...je suis allé par là.
Concernant ma version (obsolète) de LibreOffice, c'est parceque je travaille sous Linux, distribution non compilée Gentoo, qui du coup a toujours un peu de retard dans la mise à disposition de paquets stables, pour privilégier la stabilité des versions officiellement stables (même si je peux installer la nouvelle version de LibreOffice en "forçant" le paquet jugé instable sous Gentoo)
Merci Jean-Michel (COSTE) pour le lien vers la documentation (dont il semble que vous êtes le traducteur ? Merci pour ça !).
J'y apprends qu'il y a 2 manières de se connecter à un fichier CSV :
1) Tables de texte dans une base de données HSQLDB interne
2)Les tables texte comme base d’une base de données autonome
J'ai utilisé la 2ème méthode. Et dans ce cas, la documentation indique "L’accès aux tables par requêtes est également limité à une table à la fois et sans l’utilisation de
fonctions. De même, les relations ne sont pas prises en charge"...
Si on ne peut pas utiliser de fonctions, ça explique donc pourquoi ma colonne reste toujours vide !
Donc j'ai testé la méthode 1). Mais elle ne convient pas non plus, car je n'ai pas de clé primaire numérique dans mon fichier CSV...donc impossible de lier la table (je peux créer le squelette vide à l'aide de l'instruction SQL, mais pas faire la liaison)

Je suis donc un peu coincé...
A l'origine, mon vrai besoin était de créer des analyses graphiques depuis les données sources du fichier CSV, et j'avais besoin de simplifier le champ "Promotion" par une simple information "présence ou absence : 1 ou 0. Et de restituer, pour 1 produit au choix, un historique de prix sous forme de graphique "courbe" et des batons lorsqu'une période est sous promotion (bâtons à 1 lors d'une période sous promotion, et à 0 (donc invisible) hors période de promotion).
Je pensais donc faire le graphique dans CALC, grâce à un tableau croisé dynamique dont la source aurait été une base de données BASE (enregistrée pour être utilisable dans CALC) qui elle-même aurait été liée à mon fichier CSV.
Manifestement, je ne peux pas faire ça.
A tout hasard, auriez une idée pour contourner le problème ?
En tout cas, merci de vos contributions fort utiles !
Cordialement,

bonjour,

supposons ton fichier .csv avec 3 champs dont le dernier est le champ
"promotion".
A partir de calc,
Feuilles - lien vers données externes - <choisir ton fichier .csv>
le fichier sera importé dans ta feuille,
dans la colonne D1 : =SI(C1="";0;1)

indiquera 1 si promotion different de zéro (tu copies/colles cette formule
sur toutes les lignes).
Si ensuite, fon fichier csv venait à être modifié : Editon - liens de
données externes- [actualiser]

idée rapide et à l'arrache. A voir si ça peut convenir.
nb: ton problème avec la requêtes est sql est probablement du à ce que base
ne considère pas un fichier .csv comme une table "standard" sql de base.
Si tu importes ton fichier normalement et le transforme comme une table,
probablement que cela fonctionnera.

Yves

Merci à tous les deux.

Concernant le forum https://ask.libreoffice.org/fr/questions/, je l'avais vu, mais il ne m'a pas semblé très actif autour de Base, et comme sur la page officielle de LibreOffice, ils mentionnent que le canal officiel pour demander de l'aide, c'est la liste...je suis allé par là.
Concernant ma version (obsolète) de LibreOffice, c'est parceque je travaille sous Linux, distribution non compilée Gentoo, qui du coup a toujours un peu de retard dans la mise à disposition de paquets stables, pour privilégier la stabilité des versions officiellement stables (même si je peux installer la nouvelle version de LibreOffice en "forçant" le paquet jugé instable sous Gentoo)
Merci Jean-Michel (COSTE) pour le lien vers la documentation (dont il semble que vous êtes le traducteur ? Merci pour ça !).
J'y apprends qu'il y a 2 manières de se connecter à un fichier CSV :
1) Tables de texte dans une base de données HSQLDB interne
2)Les tables texte comme base d’une base de données autonome
J'ai utilisé la 2ème méthode. Et dans ce cas, la documentation indique "L’accès aux tables par requêtes est également limité à une table à la fois et sans l’utilisation de
fonctions. De même, les relations ne sont pas prises en charge"...
Si on ne peut pas utiliser de fonctions, ça explique donc pourquoi ma colonne reste toujours vide !
Donc j'ai testé la méthode 1). Mais elle ne convient pas non plus, car je n'ai pas de clé primaire numérique dans mon fichier CSV...donc impossible de lier la table (je peux créer le squelette vide à l'aide de l'instruction SQL, mais pas faire la liaison)

Bonjour,

Pourquoi ne pas créer une colonne avec Calc pour numéroter les lignes ?

Je suis donc un peu coincé...
A l'origine, mon vrai besoin était de créer des analyses graphiques depuis les données sources du fichier CSV, et j'avais besoin de simplifier le champ "Promotion" par une simple information "présence ou absence : 1 ou 0. Et de restituer, pour 1 produit au choix, un historique de prix sous forme de graphique "courbe" et des batons lorsqu'une période est sous promotion (bâtons à 1 lors d'une période sous promotion, et à 0 (donc invisible) hors période de promotion).
Je pensais donc faire le graphique dans CALC, grâce à un tableau croisé dynamique dont la source aurait été une base de données BASE (enregistrée pour être utilisable dans CALC) qui elle-même aurait été liée à mon fichier CSV.
Manifestement, je ne peux pas faire ça.
A tout hasard, auriez une idée pour contourner le problème ?

Par curiosité, d'où proviennent ces données ?
Il est aussi possible de poser la question ici  : https://forum.openoffice.org/fr/forum/, mais bien lire les conditions avant de s'inscrire, les règles sont très strictes :wink:

Pas le temps ce week end (le beau temps encourage les balades en vélo), mais je vois ça plus tard.

Cordialement,

Bonjour,

Ouh là la... le moteur de requêtes LibreOffice sur les fichiers CSV est très pauvre, je crois qu'il ne faut pas lui en demander tant.

Voir s'il n'y a pas un autre moyen de résoudre le problème d'origine.

bonjour à tous,et encore merci pour toutes vos contributions.Oui, ici aussi on a profité du soleil hier :wink: et on recommence
      aujourd'hui, donc pas de souci Jean-Michel !pour répondre à la question "d'où viennent ces données ? "C'est un script Python que j'ai programmé, qui vient
      quotidiennement extraire d'un site web en ligne les données
      prix/promotions sur 250 produits. Le script constitue une base de
      données (le fichier CSV), qui grossit donc tous les jours.Oui : je pourrais  modifier mon script pour ajouter cette fameuse
      colonne PromotionExists, mais j'avais envie d'apprendre à me
      servir de LibreOffice, que je n'ai jamais vraiment utilisé, donc
      je ne voulais pas faire un constat d'échec dès le début ;-)Force est de constater que BASE + table CSV, ça ne marche pas.
      Tant pis.

Initialement, j'étais parti sur cette idée de faire un lien de
      données externes dans CALC comme proposé par Yves. Mais le fait de
      devoir manuellement "prolonger" les formules jusqu'à la dernière
      ligne pour que le graphique final soit à jour ne m'allait pas.
      C'est pourquoi je m'étais rabbattu sur l'idée d'une requête dans
      BASE (dont la formule n'a pas besoin d'être corrigée
      quotidiennement).Donc je reviens à mon idée initiale, mais avec cette fois-ci comme
      problématique de prolonger automatiquement les formules jusqu'à la
      dernière ligne. Je vais partir sur une macro je pense.A ce stade, je devrais pouvoir me débrouiller (il faut juste que
      je comprenne quels sont les objets accessibles par macro en
      LibreOffice, ansi que leurs attributs et méthodes)Merci à tous pour votre aide,

et profitez bien de la journée !

Bonjour à toutes et tous,

......Oui : je pourrais  modifier mon script pour ajouter cette fameuse colonne PromotionExists, mais j'avais envie d'apprendre à me
       servir de LibreOffice, que je n'ai jamais vraiment utilisé, donc je ne voulais pas faire un constat d'échec dès le début :wink:
       Force est de constater que BASE + table CSV, ça ne marche pas.
       Tant pis.

Si cela fonctionne, mais d'une façon limitée, un CSV n'est en aucune manière une base de données.
    La méthode utilisée n'est effectivement pas satisfaisante. Comme le conseille Jean-Michel voir le guide Base - chapitre 2 - page 26.
    L'assistant Bases de données - Paramétrer une connexion aux fichiers texte indique :
    """"Sélectionnes le dossier où les fichiers CSV sont stockés. LibreOffice ouvrira ces fichiers en mode lecture seule."""""
    Comme dirait Mercotte "Lisez bien la recette" :wink:

Initialement, j'étais parti sur cette idée de faire un lien de
       données externes dans CALC comme proposé par Yves. Mais le fait de
       devoir manuellement "prolonger" les formules jusqu'à la dernière
       ligne pour que le graphique final soit à jour ne m'allait pas.

Effectivement tirer la cellule contenant la formule jusqu'à la fin des données est fastidieux et inadapté.
    Mais, si la colonne "PromotionExists" se trouve à droite de la colonne "Prix" par exemple (il n'y a aucun prix vide je suppose), et non à droite de
    la colonne "Promotion" (Il y a des cellules vides), il existe une solution simplissime pour recopier la formule jusqu'à la fin :
    Il faut sélectionner la cellule contenant la formule et faire un double clic sur le petit carré (poignée) en bas à droite et hop c'est magique.

       C'est pourquoi je m'étais rabbattu sur l'idée d'une requête dans
       BASE (dont la formule n'a pas besoin d'être corrigée
       quotidiennement).Donc je reviens à mon idée initiale, mais avec cette fois-ci comme
       problématique de prolonger automatiquement les formules jusqu'à la
       dernière ligne. Je vais partir sur une macro je pense.A ce stade, je devrais pouvoir me débrouiller (il faut juste que
       je comprenne quels sont les objets accessibles par macro en
       LibreOffice, ansi que leurs attributs et méthodes)

Une macro sous Calc me semble être la meilleure solution.

Merci à tous pour votre aide,

et profitez bien de la journée !

Soleil en Haute-Vienne et donc jardinage !
    ...... Après la sieste bien sur. :grin::grin:
    Bien cordialement Patrick.

Bonjour,

dépendant de la source (je connais pas le site, donc pas possible de savoir
si faisable),
1) calc peut lire des flux web pour les intégrer via : Données - flux
(ça éviterait peut-être le script python),
2) Il y a aussi la possibilité de développer le script python comme
"plugin" calc,
3) la recopie manuelle se fait très facilement : (une fois que la cellule
D1 est faite, se positionner dessus, puis :
Ctrl-C + Ctrl-Shift-End + Ctrl-V :slight_smile:
4) script Libreoffice via un bouton associé au script,

bref, y'a plein de moyen d'y arriver :wink:
Bon dimanche
Yves

Bonjour

larb wrote

Concernant le forum https://ask.libreoffice.org/fr/questions/, je
l'avais vu, mais il ne m'a pas semblé très actif autour de Base

Un site d'assistance n'est actif que si on pose des questions :slight_smile:
En l'occurence je t'aurais donné les éléments suivants.

larb wrote

Les tables texte comme base d’une base de données autonome
...
Si on ne peut pas utiliser de fonctions, ça explique donc pourquoi ma
colonne reste toujours vide !

Les possibilités sont très réduites mais on peut utiliser
quelques fonctions. Tu peux par exemple obtenir un résultat très
approchant comme ceci :

SELECT "promotion", LOCATE( 'µ', CONCAT( 'µ', "promotion" ) ) "yapromo" FROM
"test"

Ceci crée une colonne "yapromo" contenant 1 pour les enregistrements
ayant un champ "promotion" non vide.

larb wrote

Tables de texte dans une base de données HSQLDB interne
...
je n'ai pas de clé primaire numérique dans mon fichier CSV...donc
impossible de lier la table

On peut tout à fait faire des jointures dans une requête sur
un champ autre qu'une clé primaire : il suffit que les types
de champ le permette.

Pour revenir à la question, dans ce type de base on peut utiliser
par exemple :

SELECT casewhen( "promotion" IS NULL, 0, 1 ) "yapromo" FROM
"NomTableLiaison"

Cordialement
Pierre-Yves

Bonjour Pierre-Yves,

Bonjour

Un site d'assistance n'est actif que si on pose des questions :slight_smile:
En l'occurence je t'aurais donné les éléments suivants.

Certes...mais je suis trop souvent cassé les dents sur des forums inactifs, et je préfère perdre quelques secondes à sélectionner la façon de demande de l'aide, que perdre quelques jours à attendre une réponse qui ne vient jamais sur un forum inactif. Chat échaudé craint l'eau froide :wink:
Mais si vous y étiez, effectivement, ça aurait fonctionné ! Je note
(j'ai finalement l'impression que vous êtes nombreux à préférer le forum ?)

larb wrote

Les tables texte comme base d’une base de données autonome
...
Si on ne peut pas utiliser de fonctions, ça explique donc pourquoi ma
colonne reste toujours vide !

Les possibilités sont très réduites mais on peut utiliser
quelques fonctions. Tu peux par exemple obtenir un résultat très
approchant comme ceci :

SELECT "promotion", LOCATE( 'µ', CONCAT( 'µ', "promotion" ) ) "yapromo" FROM
"test"

Ceci crée une colonne "yapromo" contenant 1 pour les enregistrements
ayant un champ "promotion" non vide.

Effectivement, je viens de tester, ça fonctionne. Comment peut-on connaître les fonctions qui "fonctionnent" ? alors que la doc officielle dit que les fonctions ne sont pas autorisées ?
Cependant, ça pose quand même un problème dans mon cas : la colonne est soit "vide" soit égale à 1...impossible de faire une somme sur ce type de données dans un tableau croisé dynamique dans CALC.
Mais merci pour l'astuce : intéressant !

larb wrote

Tables de texte dans une base de données HSQLDB interne
...
je n'ai pas de clé primaire numérique dans mon fichier CSV...donc
impossible de lier la table

On peut tout à fait faire des jointures dans une requête sur
un champ autre qu'une clé primaire : il suffit que les types
de champ le permette.

Pour revenir à la question, dans ce type de base on peut utiliser
par exemple :

SELECT casewhen( "promotion" IS NULL, 0, 1 ) "yapromo" FROM
"NomTableLiaison"

Cordialement
Pierre-Yves

En fait, mon problème avec cette table, c'est que je n'arrive même pas à la lier au fichier CSV. D'après la doc, j'en ai conclu que c'était à cause de l'absence de clé primaire.
Votre message m'a fait douter : j'ai retenté sans clé primaire. Mais l'exécution de la requête SQL permettant de lier la table vide (donc créée cette fois ci sans clé primaire) au fichier CSV abouti à une erreur qui n'est pas cohérente :
j'exécute SET TABLE "HistoriquePromotion" SOURCE "HistoriquePromo.csv;ignore_first=true;encoding=UTF-8";1
La table HistoriquePromotion possède 5 champs : Article VARCHAR(50), Description VARCHAR(150), Prix NUMERIC, Date Date, Promotion VARCHAR(255)

Le fichier HistoriquePromo.csv possède ces 5 champs, et jamais le type de données ou sa longueur ne pourrait poser problème (et certainement pas la 1ère ligne).
Or le message d'erreur reçu lors de l'exécution est :
bad TEXT table source file - line number: 1 Value too long in statement [set table "HistoriquePromotion" source "HistoriquePromo.csv;ignore_first=true;encoding=UTF-8"]

donc laissant penser que dès la première ligne, les données sont trop longues...
Or la 1ère ligne (non ignorée) est
MPX_2455127;Casa Azzurra Parmigiano reggiano râpé 60g;27/05/2021;1,15;

du coup, je n'arrive pas à aller plus loin avec cette piste....

Sur base de l'idée de Pierre-Yves ,

SELECT "article", 1*locate('1',concat('1',"promotion")) FROM "data"

Te donnera ce que tu souhaites :wink:
Yves

effectivement, je viens juste de simplement ajouter 1* devant ce que Pierre-Yves avait indiqué, et ça réalise une conversion de type.

Impeccable ! du coup, ça répond à mon besoin initial.
Merci à tous !

bonjour

j'ai créé depuis plusieurs années une base de données pour stocker mes comptes-rendu de réunion. Je la partage au cas elle puisse être utilisée (j'ai un souci pour que la case en haut à gauche (ID) se remplisse automatiquement puisqu'elle est égale au n° d'enregistrement)

L’utilisateur lambda préfère CALC à Base est-il possible de faire la même chose sous CALC ?

merci

Benoist Hitier
23 rue d'Aumont
62200 Boulogne-sur-mer
+33 6 77 67 84 04

Bonjour,

y'a surement une solution mais les pièces jointes ne passent pas sur la
liste, je ne sais pas si tu avais joint un exemple ?
car ici, difficile à comprendre ton problème ?
Il nous faudrait à minima comprendre ce que tu souhaites faire :wink:
Tu as une db base avec quelle structure de table ? et la zone id est
définie dans ta table ou est extraite de base ?

Cet id est unique à ton enregistrement dans la table ou est un numéro
séquentiel par rapport à ce que tu veux afficher (exemple si un filtre est
appliqué et que c'est simplement un numéro de séquence appliqué au résultat
du filtre qui doit être affiché).

J'attends les éclaircissements.
Yves

bonjour

j'ai créé depuis plusieurs années une base de données pour stocker mes comptes-rendu de réunion. Je la partage au cas elle puisse être utilisée (j'ai un souci pour que la case en haut à gauche (ID) se remplisse automatiquement puisqu'elle est égale au n° d'enregistrement)

Je ne comprends pas bien. Si l'ID est un entier autovaleur, il se remplit automatiquement ?

Les compte-rendus sont stockés comment ?

L’utilisateur lambda préfère CALC à Base est-il possible de faire la même chose sous CALC ?

Et il a bien tort ! Au risque de passer pour le radoteur de service, CALC n'est pas fait pour gérer une base de donnée.

Même si ça semble plus facile au premier abord : on met des choses dans des cases et on pense au besoin réel ensuite. Le contraire de la démarche d'analyse nécessaire à la conception d'une base de données.

On arrive à faire semblant à coups de formules alambiquées et de macros, qui fabriquent des "usines à gaz" difficiles à faire évoluer.

Cordialement,

Bonjour

j'aime beaucoup ta réponse Jean Michel....
Mais vu que le titre est "formulaire", qu'elle est vraiment la question ?

Créer un formulaire, dans Calc qui affiche les résultats ?
Des lors que c'est un formulaire, en quoi cela dérangerait les gens d'utiliser un formulaire directement dans Base ? Préférer le formulaire Calc, c'est plutôt si on a une contrainte (technique) qui passe par Calc... Mais là une fois qu'on est dans Base..

l'objectif c'est de permettre une consultation ou une alimentation de la base de données (Calc fait des tableurs... Matérialiser une base avec calc c'est franchement... Pas une bonne idée : Jean Michel l'a dit !)

Dernière question car ça m'intrigue : qu'est ce qui est stocké en fait?
-Les fichiers des cr ? Euh.... ?
-Le contenu lui même comme si on était dans un cms ?=> Dans ce cas basculer sur un cms...
-Juste les infos générales des cr (date, objet... )

Claire