[Résolu] [Base] Requête pour afficher des champs en ligne

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
bouee
Membre lOOyal
Membre lOOyal
Messages : 31
Inscription : 12 mai 2008 21:44

[Résolu] [Base] Requête pour afficher des champs en ligne

Message par bouee »

La modération a écrit :Depuis 2008, vous n'êtes toujours pas habitué aux règles de ce forum.
Lisez le bandeau rouge en haut de cette page !
Bonjour,

ce fil est la suite de : https://forum.openoffice.org/fr/forum/v ... 65#p240065

Ma question initiale :
j'aimerais savoir s'il existe une fonction pour mettre des données en ligne au lieu de colonnes. Dans ma base de données, j'ai des catégories qui se subdivisent en plusieurs sous catégories, et j'aimerais que ces sous catégories apparaissent en ligne à côté des grandes catégories, qui, elles doivent rester en colonne.

Y a t il moyen d'écrire une requête qui aboutisse à ce résultat ? Et en plus en créant autant de colonnes que nécessaire ?

EX :
Catégorie A- Sous Catégorie A.1- produit Machin
Catégorie A- Sous Catégorie A.1- produit Bidule
Catégorie A- Sous Catégorie A.1- produit Truc

Je voudrais obtenir :

Catégorie A- Sous Catégorie A.1- produit Machin - produit Bidule -produit Truc
En créant autant de colonnes que de produit dans la sous catégorie "A.1".
Suite aux réponses de Piaf et DLE, j'ai recherché ce qu'était le fonction group concat : mettre les données en ligne dans une seule colonne. Ça peut me convenir aussi, mais ça n'existe pas (encore?) dans Base.

De là je suis tombé su ce fil :https://forum.openoffice.org/fr/forum/v ... =8&t=33843

Mais je n'y connais rien en macros.. J'ai quand même essayé de l'adapter à ma base, en remplaçant les noms de champs dans la macro originale, mais je me suis vite retrouvé les bras ballants, car nos bases ne sont pas construites tout à fait de la même façon. Et là, ben je bloque...

Bref, est ce que l'un(e) d'entre vous peut m'aider à faire une macro qui fasse ce dont j'ai besoin ?
Soit en créant plusieurs colonnes, soit en concaténant dans le même champ d'une seule colonne.

En résumant , en prenant l'exemple de la base que je joins :


- Je pars de
Produit A - déclinaison a
Produit A - déclinaison b
Produit A - déclinaison c

- Je voudrais :
Produit A - Déclinaison a , déclinaison b, déclinaison c (une seule colonne)
ou
Produit A - Déclinaison a - déclinaison b - déclinaison c (plusieurs colonnes)
Selon ce qui est le plus facile à faire pour vous, je m'en arrangerai.

- Le nombre de déclinaisons d'un produit peut aller de 0 (champ non rempli) à X (je ne connais pas le nombre, il peut varier beaucoup d'un produit à l'autre).

J'espère que c'est clair, en tous cas, un grand grand merci !
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par bouee le 18 juil. 2014 21:15, modifié 2 fois.
openoffice 4.1, windows 8
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Base] Requête pour faire apparaître des champs en lign

Message par Piaf »

Bonjour
Pas forcément tout compris, étant donné que la question du fil n'est plus la même que celle du fil initial.
Un exemple à tester pour les produits et les déclinaisons.
A+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
bouee
Membre lOOyal
Membre lOOyal
Messages : 31
Inscription : 12 mai 2008 21:44

Re: [Base] Requête pour faire apparaître des champs en lign

Message par bouee »

Bonjour,

merci Piaf d'avoir pris le temps. Oui, l'idée est la bonne, le résultat de la macro me convient parfaitement.
Mais.... elle ne fonctionne pas avec ma table : je suppose que le problème vient qu'il y a une différence entre les tables. Dans la mienne, le champ qui correspond à "idProduit" n'existe pas.

Du coup, dans cette ligne, dans la partie remplir déclinaison, " strSQL2 = "SELECT ""tDeclinaisons"".""Declinaison"" FROM ""tDeclinaisons"", ""tProduits"" WHERE ""tDeclinaisons"".""refProduit"" = ""tProduits"".""IdProduit"" AND ""tProduits"".""Produit"" = " & Apos(strFiltre)" , je suppose qu'il faudrait enlever la partie en rouge ? Mais... n'y connaissant pas grand chose en macro, je n'y arrive pas. Certes, je progresse, mais c'est pas encore ça...

Lorsque j’exécute la macro, j'ai un message d'erreur "unexpected end of command", je joins la table, ce sera sûrement plus clair. J'ai laissé la macro telle quelle, et changé les noms des tables et des champs dans la base, pour qu'ils correspondent à la macro.

La table que je mets sur le forum n'est pas la "vraie" (confidentielle). Dans la vraie, j'ai essayé de rajouter des champs dans les tables concernées pour contourner le problème, mais je ne peux pas rajouter des champs integer en auto value... Vu qu'il y a déjà beaucoup de choses dans la base (données, formulaires, etc...), je ne pourrai pas tout refaire.

Du coup, est il possible de changer la macro ? Si oui, comment ?

Merci
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
openoffice 4.1, windows 8
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Base] Requête pour faire apparaître des champs en lign

Message par Piaf »

Bonjour
A tester avec la dernière base mise en ligne.

Code : Tout sélectionner

Sub RemplirProduits
Dim maConnexion as Object, ReqSelect as Object, ReqInsert as Object, resuQuery As Object
Dim strSQL as String, instrSQL as String
	maConnexion = ThisDatabasedocument.CurrentController.ActiveConnection
	strSQL = "SELECT ""Produit"" FROM ""tProduits"""
	ReqSelect = maConnexion.createStatement() 
	resuQuery = ReqSelect.executeQuery(strSQL)
		 while resuQuery.next
			instrSQL = "Insert into ""tLignes"" (""Produit"") values(" & Apos(resuQuery.getString(1)) & ")"
			ReqInsert = maConnexion.createStatement()
			ReqInsert.executeUpdate(instrSQL)
		wend
	ReqSelect.Close
	ReqInsert.close
	RemplirDeclinaison
End Sub

Sub RemplirDeclinaison
Dim maConnexion as Object, ReqSelect as Object, ReqSelect2 as Object, ReqUpdate as Object, resuQuery As Object, Resultat as Object
Dim strSQL as String, strSQL2 as String, UPstrSQL as String, strFiltre as String, Dec as String
	maConnexion = ThisDatabasedocument.CurrentController.ActiveConnection
	strSQL = "SELECT ""Produit"", ""Declin"" FROM ""tLignes"""
	ReqSelect = maConnexion.createStatement() 
	resuQuery = ReqSelect.executeQuery(strSQL)
	while resuQuery.next
		strFiltre = resuQuery.getstring(1)
		strSQL2 = "SELECT ""tDeclinaisons"".""Declinaison"" FROM ""tDeclinaisons"", ""tProduits"" WHERE ""tDeclinaisons"".""refProduit"" = ""tProduits"".""Produit"" AND ""tProduits"".""Produit"" = " & Apos(strFiltre)
		ReqSelect2 = maConnexion.createStatement() 
		Resultat = ReqSelect2.executeQuery(strSQL2)
		while resultat.next
			Dec = Dec & Resultat.getstring(1) & " ; "	
		wend
		If Dec <> "" Then
			Dec = left(Dec,len(Dec)-3)
			UPstrSQL = "UPDATE ""tLignes"" SET ""Declin"" =" & Apos(Dec) & "WHERE ""Produit"" =" & Apos(strFiltre)
			ReqUpdate = maConnexion.createStatement()
			ReqUpdate.executeUpdate(UPstrSQL)
			Dec = ""
		End If	
	wend
	ReqSelect.Close
	ReqSelect2.Close
	ReqUpdate.Close
	MsgBox("Table Lignes remplie",64)
End Sub

Function Apos(ByVal chaine As String) As String
	Apos = "'" & join(split(chaine, "'"), "''") & "'"
End Function
GroupConcat.png
A+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
bouee
Membre lOOyal
Membre lOOyal
Messages : 31
Inscription : 12 mai 2008 21:44

Re: [Base] Requête pour faire apparaître des champs en lign

Message par bouee »

MER-VEIL-LEUX !!!

Merci BEAUCOUP ! Ca marche nickel :super:
openoffice 4.1, windows 8