Un newbie total en Access

Hello…

Une petite requête :wink: à vous soumettre…

J’expose donc mon problème :

J’ai une table 1 qui contient :

  • L’identifiant de la socièté : ID
  • Le nom de la socièté : NOM
  • Le nombre de postes de type A : NBTA
  • Le nombre de postes de type B : NBTB

Donc il y a une ligne (et une seule) pour chaque socièté avec le nombre de postes A et B correspondant :

ID NOM NBTA NBTB
1 TOTO 4 15
2 TITI 8 22

J’ai une autre table 2 qui contient :

  • L’identifiant de la socièté : ID (à nouveau)
  • Le nom du type de poste spécialisé (les types A et B n’y sont pas) : NOMTYPE
  • Le nombre de postes correspondant : NBP

On a donc cette fois plusieurs lignes pour la même socièté :

ID NOMTYPE NBP
1 Type1 3
1 Type2 45
1 Type3 25
2 Type1 12
2 Type2 41
2 Type3 6

Mon rêve (et celui de mon chef) serait d’avoir un tableau qui représenterait les données de ces deux tables ainsi :

ID NBTA NBTB Type1 Type2 Type3
TOTO 4 15 3 45 25
TITI 8 22 12 41 6

J’ai tenté pas mal de requêtes, de regroupement, d’analyse croisée… Rien n’y fait… Maintenant, je débute… Et je pense qu’il y a une certaine logique qui m’a échappé…

Je vous fais confiance… ?

Merci…

Bon, j’ai fait ‘ta’ base rapidos sous access.
Pour le schéma relationnel, ca donne ca: (schema.jpg).

Ensuite, ben, en SQL, je suis une truffe question regroupements, donc j’attends la réaction de la zone.
Par un état, c’est très très facile d’avoir ‘ce que tu demandes’, mais comme ca, dans une requete, directement: ??

Voila l’état quand meme:

Edit:
Bon, pis voila la base, aussi. Histoire de motiver ceux qui veulent s’amuser en Skl.

Note aux modos: merci de virer mon message si c’est lourd (je suis pas un pro du ‘Dredi’).

Je ne vois pas trop comment ce serait possible …

A moins de passer par du SQL pas très propre (une table temporaire avec suffisament de colonnes pour tous les cas, un compteur, et on incrémente la colone qui recevrait le type …), mais sinon en SQL, une ligne de données = une ligne affichée …

Désolé !

Edit : la solution de Vectra, même si ce n’est pas exactement ce que tu demandes, est surement le plus proche possible.

Eh ben, petite forme les geeks?
Allez, on se sort les réveille ( B) ), vous allez pas laisser un zélote du logiciel libre tenir le crachoir sur Acces quand même?

Je rajoute juste que :

  • Je n’ai pas fait les tables
  • Je ne peux pas modifier leur structure
  • Lire que ce n’est pas trop possible, me fait " relativiser " vis à vis de mon niveau en Access ;-p

Je surveille la suite quand même… (Et merci déjà aux premiers…)

Mais pourquoi Access?

vectra: pas de souci avec ton post B)

[quote=“Marmottas, post:5, topic: 29743”]Je rajoute juste que :

  • Je n’ai pas fait les tables
  • Je ne peux pas modifier leur structure
  • Lire que ce n’est pas trop possible, me fait " relativiser " vis à vis de mon niveau en Access ;-p

Je surveille la suite quand même… (Et merci déjà aux premiers…)[/quote]

Le problème de ton problème, c’est qu’il est problématique. Pour causer gras, c’est en SQL que le problème se pose, et j’ai vraiment l’impression qu’il n’y a pas de solution ‘en algèbre relationnelle’ au problème posé (en espérant être contredit, mais là, je vois pas). Après, que ce soit le moteur MS Jet d’Access, celui de MySQL ou d’Oracle, ca ne changera rien.

Pour les tables, le schéma relationnel que j’ai donné, c’est la base de la base. Sans les contraintes d’intégrité posées, ton système va partir en sucette, avec des infos redondantes, mal synchronisées, etc, etc. Ca marchera quand meme (en gros), mais si tu t’avisais de faire ca en TD avec moi, tu t’en prendrais une belle… Et si tu montres ca à un pro, il va se mettre à faire des bruits bizarres et à changer de couleur.

Si c’est pour un traitement ponctuel, ca peut en rester là, mais si ta base doit monter en puissance, autant faire propre. Quand on veut récupérer des données de tables mal faites (ou quand on change le schéma relationnel de la base), on pond un bout de code VBA qui recompose une nouvelle table à partir des anciennes. C’est très vite fait (quand on a du code exemple sous la main, ce qui n’est pas mon cas).

Si tu tiens absolument à obtenir un “tableau” (Recordset en Access) contenant ce que tu décris, i.e ce que l’état affiche, eh bien la solution risque d’impliquer du code VBA qui va calculer un tel recordset en manipulant le résultat de requêtes plus simples. Donc oui, ca se fait, mais n’attend pas de solution portable (sur un autre SGBD), et surtout ne t’attend pas à des performances qui poutrent. Si on utilise le SQL plutot que de parcourir les tables comme si c’était des tableaux C, c’est parce que c’est bien optimisé pour ce que ca fait.

To zone: bon, les geeks, c’est pas mon rayon, moi, les SGBD: viendez un peu…

ID NBTA NBTB Type1 Type2 Type3
TOTO 4 15 3 45 25
TITI 8 22 12 41 6

Ah oui, j’avais mal lu. J’en mettrai la barbe de Stallman au feu que c’est définitivement impossible de faire cela en SQL.
La raison toute bête est qu’on ne peut pas avoir de dépendance entre des champs en colonne et le résultat d’une requete (select * from types_de_taf).

Et si les types de tafs sont fixes et constants, je pense que le problème posé ne relève plus vraiment d’un SGBD. Autant faire ca en C avec des matrices, ca sera plus optimisé que du code VBA. Voire avec awk pour faire plus court.

Sinon, si on tient absolument à rentabiliser la licence Access, on peut utiliser VBA pour composer la requete dynamiquement, comme déjà dit, au terme de plusieurs étapes. Mais c’est VBA qui bosse, pas MS-Jet (SQL).

Et hop, structure access dans le fichier joint en zip.

La solution ce sont les tableaux croisés dynamiques:

Bon d’abord je crées tes tables:

table 1 ID NOM NBTA NBTB 1 toto 4 15 2 titi 8 22

Table2 ID NOMTYPE NBP 1 type1 3 1 type2 45 1 type3 25 2 type1 12 2 type2 41 2 type3 6
La requête “requête1” :
[sql]SELECT Table1.ID, Table1.NOM, Table1.NBTA, Table1.NBTB, Table2.NOMTYPE, Table2.NBP
FROM Table1 INNER JOIN Table2 ON Table1.ID = Table2.ID;[/sql]

Et là ça se complique. Ou bien on fait tout à la main avec des requêtes usines à gaz, et pourtant j’adores le SQL c’est mon métier et je n’aimes pas les assistants en général, ou alors on utilise les tableaux croisés dynamiques qui existent dans BO, Excel, Access etc…

Donc tu fais[ol]
[li]onglet requête[/li][li]dans l’assistant choisir "Assistant Requête Analyse Croisée[/li][li]Afficher Requêtes et choisir la requête précédemment créée requête 1[/li][li]Sélectionner tout les champs qui seront en-têtes de ligne : ID, NOM, NBTA, NBTB[/li][li]Sélectionner tout les champs qui seront en-têtes de colonne : NOMTYPE[/li][li]Quel nombre souhaitez vous calculer : NBP, Fonctions: somme[/li][/ol]Ce qui nous donnes

ID NOM NBTA NBTB Total de NBP type1 type2 type3 1 toto 4 15 73 3 45 25 2 titi 8 22 59 12 41 6

Et quand on regardes le source (je ne connaissais pas les tableaux croisés sous Access ni leur syntaxe en mode pseudo SQL:
[sql]TRANSFORM Sum([NBP]) AS [La valeur]
SELECT [ID], [NOM], [NBTA], [NBTB], Sum([NBP]) AS [Total de NBP]
FROM Requête1 GROUP BY [ID], [NOM], [NBTA], [NBTB]
PIVOT [NOMTYPE];[/sql]

[quote=« Marmottas, post:5, topic: 29743 »]- Je n’ai pas fait les tables

  • Je ne peux pas modifier leur structure[/quote]

Arf j’avais pas vu B)

Bon, ben heureusement que phili_b est là :smiley:

[quote=« vectra, post:7, topic: 29743 »]Pour les tables, le schéma relationnel que j’ai donné, c’est la base de la base. Sans les contraintes d’intégrité posées, ton système va partir en sucette, avec des infos redondantes, mal synchronisées, etc, etc. Ca marchera quand meme (en gros), mais si tu t’avisais de faire ca en TD avec moi, tu t’en prendrais une belle…[/quote] Tu as 200 fois raison :stuck_out_tongue: mais[quote=« Marmottas, post:5, topic: 29743 »]- Je n’ai pas fait les tables

  • Je ne peux pas modifier leur structure[/quote] Moi je connais des gens qui font tout ce qu’il ne faudrait pas faire. Les formes normales c’est pour les chiens, on mélange des choux et des carottes, on dit qu’un produit de restitution est mauvais alors qu’on utilise des méga-tables à plein de colonnes. Je me fais un malin plaisir à leur rappeler :smiley:

[quote=« vectra, post:7, topic: 29743 »]Et si tu montres ca à un pro, il va se mettre à faire des bruits bizarres et à changer de couleur.[/quote] Malheureusement il y a des gens qui n’ont que faire des normes et états de l’art et qui veulent imposer le pseudo-connaissance (incompétence) alors qu’il pourrait remplir très bien leur office pour les compétences, hors BDD, qu’ils peuvent avoir.

[quote=« Le, post:9, topic: 29743 »]Et hop, structure access dans le fichier joint en zip.[/quote] heu si en effet on arrive à un résultat et que tu sais te servir d’access, ton modèle de données est un cauchemar. B) :smiley:

OUéééé c’est impossible tout ca…

Au feu Stallman!!! \o/ Gratz phili_b !

[quote=“GloP, post:13, topic: 29743”]OUéééé c’est impossible tout ca…

Au feu Stallman!!! \o/ Gratz phili_b ![/quote] B)

Sinon en SQL on peut faire du tableau croisé mais non dynamique en utilisant grosso modo le principe suivant:
[sql]SELECT A,B,SUM(NB1) AN_2001 ,SUM(NB2) AN_2002,SUM(NB3) AN_2003
FROM ( SELECT A,B,SUM(NB) NB1,0 NB2,0 NB3 FROM Ma_table_ou_req where annee=2001 group by A,B
UNION
SELECT A,B,0 NB1,SUM(NB) NB2,0 NB3 FROM Ma_table_ou_req where annee=2002 group by A,B
UNION
SELECT A,B,0 NB1,0 NB2, SUM(NB) NB3 FROM Ma_table_ou_req where annee=2003 group by A,B)
group by A,B[/sql]ou encore [sql]SELECT A,B,sum(case when annee=2001 then NB else 0 end) AN_2001 ,
sum(case when annee=2002 then NB else 0 end) AN_2002 ,
sum(case when annee=2003 then NB else 0 end) AN_2003
FROM Ma_table_ou_req group by A,B[/sql] case when en access ça doit pouvoir se faire avec IIF()

[quote=“GloP, post:13, topic: 29743”]OUéééé c’est impossible tout ca…

Au feu Stallman!!! \o/ Gratz phili_b ![/quote]

Quelques auto-citations, entre midi et 20h45

To zone: bon, les geeks, c’est pas mon rayon, moi, les SGBD: viendez un peu…

Ensuite, ben, en SQL, je suis une truffe question regroupements, donc j’attends la réaction de la zone.

Eh ben, petite forme les geeks?
Allez, on se sort les réveille ( sweatingbullets.gif ), vous allez pas laisser un zélote du logiciel libre tenir le crachoir sur Acces quand même?

C’est bien beau le décalage horaire, Gloppy, mais faut pas arriver après la bataille non plus…

Et pour ce que je comprends des très bonnes solutions proposées, ce ne sont pas des solutions ‘SQL’, mais des solutions (propres) d’Access pour composer dynamiquement du code SQL qui va bien. C’est pas comme si je disais que des conneries non plus B)

Ceci dit, cela semble résoudre le problème initial dans les conditions demandées. Affaire conclue donc?

Huhu. Tu veux du mercurocrome pour les griffures des branches de quand t’essaye de t’y rattraper tout ca? B) Huhu, c’est pas grave de se tromper, ca arrive a tout le monde… j’etais juste content de bruler du Stallman moi.

La prochaine fois, démerde. B)

Rhooo c’etait vraiment (vraiment) pas mechant, faut pas se vexer.

C’est que j’aime bien l’icône aussi… :smiley:

Nan, mais ce que je voulais dire, c’est que:

1- y’a pas de schéma relationnel
2- y’a aucune contrainte d’intégrité à assurer.
3- y’a pas de requêtes qui relèvent vraiment de l’algèbre relationnelle (« va chercher les champs parmi plusieurs tables qui satisfassent… »)

En fait, le traitement demandé est essentiellement un DT TCD. C’est pourquoi je pense qu’il serait plus logique d’utiliser directement excel.
Il ferait ca aussi bien, il n’y aurait pas besoin de programmer un état pour que ca « rende bien », et le problème (simple) de l’import/export de données serait évacué. Voilà…

Bon, bah je remercie phili_b (et les autres qui ont aussi bien creusé) : effectivement cela fonctionne impec’

Je vais continuer à abuser avec une autre question (newbie, je vous dit) qui sera la dernière, promis (à moins de transformer ce thread en un thread de base " Access pour les gros nuls " ).

Bon voilà, j’ai à nouveau deux tables :

Table 1 :

ID du bureau Fonction du bureau
1 Comptabilité
1 Paiement
2 SRH
2 Achat

Table 2 :

ID du bureau Nom du bureau
1 Bureau de M X
2 Bureau de Mme Y

J’arrive à faire (c’est encore de mon niveau !) une requête qui affiche :

Bureau de M X : Comptabilité
Bureau de M X : Paiement
Bureau de Mme Y : SRH
Bureau de Mme Y : Achat

Mais j’aimerais arriver à :

Bureau de M X : Comptabilité Paiement
Bureau de Mme Y : SRH Achat

J’ai bidouillé avec un DISTINCT mais je n’y arrive pas… (C’est dur les BDD le lundi matin avec mon niveau et ma nuit de samedi…)

Merci à tous…