IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Access Discussion :

Mettre un "0" à là place d'une cellule vide. [Débutant(e)]


Sujet :

Access

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 3
    Points
    3
    Par défaut Mettre un "0" à là place d'une cellule vide.
    Bon je précise tout d'abord que je suis plus que newbee avec Access (et en informatique en général), il va donc falloir être très simple dans vos explications si jamais quelqu'un venait à m'aider.

    Je tente actuellement de comparer deux tables de données comportant, l'une pour l'année 2005, une pour l'année 2006, des sinistres automobiles et un ensemble d'info qui y est relatif.
    Je suis dans un premier tant parvenu laborieusement a coup de requête à compter combien de sinistres il y à eu depuis le début de l'année et combien y en avait-il eu, à la même date l'an dernier. Ce qui donne un truc du style:

    tab1:
    nb sinistres
    Vandalisme : 8
    collision: 6

    (bon faut bien sur imaginer ça dans les cellules d'une requête)

    Mon problème vient au moment de la comparaison En effet, des types de sinistres qui ont eu lieu en 2006 n'ont pas eu lieu en 2005. Donc dans ma requête de comparaison j'ai en fin de compte un truc du type:

    tab2:
    2005 2006
    Vandalisme 4 3
    Collision (cellule vide) 6


    Et ce qui donne par la suite

    tab3:
    Différence
    Vandalisme 4
    Collision (cellule vide)


    Il me semble, à première vue que la solution la plus simple consisterait à créer une "fonction" qui remplacerait dans mon tab2 la cellule vide par 0, un peu à la manière d'une fonction si VB:
    If compte de type= ""
    then compte de type= 0
    End If

    Mais pour la mise en pratique, je n'ai absolument pas la moindre idée de comment faire ça sous access. Est-il seulement possible de faire des "fonction si" sous Access ?

    Donc voila si je ne me suis pas trop mal exprimé (pardon pour tout les termes techniques, je n'y connais vraiment pas grand chose) et que quelqu'un pense qu'il peut me venir en aide, n'hésitez pas, tous les coups de mains sont les bienvenus.

    (et puis pendant que j'y suis désolé pour mon orthographe)

  2. #2
    Membre confirmé Avatar de milia
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2006
    Messages : 481
    Points : 532
    Points
    532
    Par défaut
    Bonjour,
    Tu pourrais par exemple dans ta table mettre cette valeur par défaut égale à 0.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 139
    Points : 113
    Points
    113
    Par défaut
    ^
    ||
    ||
    ||
    la solution de milia est surement beaucoup plus simple c'est vrai

    Utilise tu des formulaires ?
    Si oui ( et si non, tu peux en créer ), tu pourrai créer un bouton tout bête qui te permet de réaliser ca...Tu crée donc un bouton que tu appelle "remplacerVideParZero" par exemple, puis tu fais un clic droit dessus et tu clique sur "créer code événement"...
    Et la tu va te retrouver sous VB, ou il est possible d'écrire du code...
    tab1 tab2 tab3 sont des tables sous access c'est ca ?
    Dis moi en un peu plus, on va y arriver

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Mea culpa, tab 1..... désignaient les tableaux que j'obtiens à l'issu des requêtes. En faite là je ne travail que sur des requêtes, un certain nombre de requête ayant déjà été nécessaire en amont

    Mon but ultime est de faire en sorte que l'opérateur 1 dans l'entreprise n'est qu'à saisir les données dans la table de départ et que l'opérateur deux est juste à cliquer sur un raccourci qui le mène directement à l'état récapitulatif, il faut donc que le "mini-mini-sous-logiciel" fonctionne complètement automatiquement, sans jamais que les utilisateurs aient à mettre les mains dans le cambouis (enfin les requêtes plus exactement). Je dis ça car j'avais tenté de passer transformer mes requêtes en table (l'opération a faire étant alors un peu plus simple) mais mon produit final ne s'actualisait plus tout seul

    Pour milia, si ta solution est simple et fonctionne aussi avec les requêtes, je suis preneur (par contre je ne voie pas exactement comment faire)

    Et merci de m'avoir répondu aussi vite.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 139
    Points : 113
    Points
    113
    Par défaut
    euhhhh....
    comprend pas comment t'obtiens des tableau à partir de requêtes...des tables tu veux dire non ?
    écrit nous une requête, n'importe laquelle, simplement pour que l'on comprenne mieux, merci

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Je pense avoir confondu le mot tableu et feuille de donnée

    -->[]

    En fait il s'agit de la vue "feuille de données" de la requête sur laquel on tombe quand on l'execute (pour les requêtes de type selection).

    Mes explications sont moins obscure comme ca ?
    (soyez gentils, dites oui, au moins pour me faire plaisir)

    Et sinon detail qui vient de me traverser subitement l'esprit, je suis sous windows 2000, il est donc fort probable que je n'ai pas là dernière version d'access mais la 2000. (bon je doute qu'a un tel niveau c'est la moindre importance, mais quand même)

  7. #7
    Membre confirmé Avatar de milia
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2006
    Messages : 481
    Points : 532
    Points
    532
    Par défaut
    vi c'est clair, pour la valeur par défaut à 0, c'est dans ta table qu'il faut le changer, dans ta requête tu fais bien appel à une table, pour laquelle le champs (je sais plus le nom) est crée et bien en mode création de ta table de change la valeur par défaut.
    N'hésite pas si je ne suis pas clair.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 139
    Points : 113
    Points
    113
    Par défaut
    Ok ok
    éhé...Bon alors une fois ta requête éxécuté, quand tu te retrouve sur ta feuille de données, clique sur affichage->SQL et copie tout le code qui est écrit et colle le ici, que je vois quelque chose

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    En réalité ma requète s'appuye sur des champs (enfin je crois que c'est le terme) issue d'autre requete.

    Dans mes tables j'ai les sinistres à l'etat brute. C'est à dire un equivalent de tableau excel où chaque sinistre est enregistré un par un, à la suite, avec pour chaque sinistre son n°, sa date, son type.........
    Ensuite dans une première requête je ne selectionne que les sinistres ayant eu lieu à j-365, puis dans une seconde requête, qui ce base sur la premère je compte combien de sinistres de chaque types on eu lieu.
    Et c'est seulement à l'issue de ces deux requêtes, qu'intervient là dernière, celle que j'ai décri plus haut, qui vise à comparer les chiffres de 2005 et ceux de 2006.
    Le probleme etant que des types ne sont pas communs aux deux années, ce qui fait que sur ma feuille de données finale, j'obtiens une cellule vide (à l'intersection du sinistre et de l'année ou il n'a pas eu lieu). Cellule vide que je souhaitrais remplacé par un 0.

    Merci beaucoup de votre persevérance et désolé de rabacher, j'essaie d'etre moins confu dans mon explication!


    Ps: le sql de la dernière requete (celle à probleme):
    SELECT R_SinistreJJ2006.Type, R_SinistreJJ2006.CompteDeType, R_SinistreJJ2005.CompteDeCompteDeType
    FROM R_SinistreJJ2005 RIGHT JOIN R_SinistreJJ2006 ON R_SinistreJJ2005.Type = R_SinistreJJ2006.Type;

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 139
    Points : 113
    Points
    113
    Par défaut
    Ca devient de moins en moins confus pour moi
    Bon et bien que dirais tu aprés ces trois requêtes d'en faire une 4éme
    Histoire de faire un update (=mise a jour) qui remplacera les cellules vides par un 0

    P.S: C'est quelle colonne qui est vide ?

    Type ? CompteDeType? CompteDeCompteDeType?

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Je met aussi le sql des requêtes précedentes:


    Celle qui me par de la table elle meme et qui me permet de ne garder que les sinistres ayant eu lieu à j-365:
    SELECT [Sinistre 2005].Type, Count([Sinistre 2005].Type) AS CompteDeType
    FROM [Sinistre 2005]
    GROUP BY [Sinistre 2005].Type, [Sinistre 2005].Date
    HAVING ((([Sinistre 2005].Date)<Date()-365));


    La suivante qui me permet de classer par type et qui a son équivalent pour 2006:
    SELECT [R_Sinitre-365].[Type], Count([R_Sinitre-365].[CompteDeType]) AS CompteDeCompteDeType
    FROM [R_Sinitre-365]
    GROUP BY [R_Sinitre-365].[Type];

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    C'est la colonne CompteDeCompteDeType qui a une cellule de vide (les autres cellules de la colonnes etant elle bien renseignées).



    (comme vous pouvez le voir je ne maitrise pas encore le changement de nom )

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 139
    Points : 113
    Points
    113
    Par défaut
    Essaye avec une requête update dans ce cas...

    appelle cette requete requeteMaj
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update maRequete set CompteDeCompteDeType=0 where CompteDeCompteDeType=""
    Enfin ta requeteFinale:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM maRequete
    Ca marche ti ? ca marche ti pas?
    comprend tu ce que j'essaye de te faire faire ?

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par P'tit Lio
    Bon je précise tout d'abord que je suis plus que newbee avec Access (et en informatique en général), il va donc falloir être très simple dans vos explications si jamais quelqu'un venait à m'aider.

    Je tente actuellement de comparer deux tables de données comportant, l'une pour l'année 2005, une pour l'année 2006, des sinistres automobiles et un ensemble d'info qui y est relatif.
    Je suis dans un premier tant parvenu laborieusement a coup de requête à compter combien de sinistres il y à eu depuis le début de l'année et combien y en avait-il eu, à la même date l'an dernier. Ce qui donne un truc du style:

    tab1:
    nb sinistres
    Vandalisme : 8
    collision: 6

    (bon faut bien sur imaginer ça dans les cellules d'une requête)

    Mon problème vient au moment de la comparaison En effet, des types de sinistres qui ont eu lieu en 2006 n'ont pas eu lieu en 2005. Donc dans ma requête de comparaison j'ai en fin de compte un truc du type:

    tab2:
    2005 2006
    Vandalisme 4 3
    Collision (cellule vide) 6


    Et ce qui donne par la suite

    tab3:
    Différence
    Vandalisme 4
    Collision (cellule vide)


    Il me semble, à première vue que la solution la plus simple consisterait à créer une "fonction" qui remplacerait dans mon tab2 la cellule vide par 0, un peu à la manière d'une fonction si VB:
    If compte de type= ""
    then compte de type= 0
    End If

    Mais pour la mise en pratique, je n'ai absolument pas la moindre idée de comment faire ça sous access. Est-il seulement possible de faire des "fonction si" sous Access ?

    Donc voila si je ne me suis pas trop mal exprimé (pardon pour tout les termes techniques, je n'y connais vraiment pas grand chose) et que quelqu'un pense qu'il peut me venir en aide, n'hésitez pas, tous les coups de mains sont les bienvenus.

    (et puis pendant que j'y suis désolé pour mon orthographe)

  15. #15
    Membre confirmé Avatar de milia
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2006
    Messages : 481
    Points : 532
    Points
    532
    Par défaut
    C'est dommage de faire une requête qu'il ne comprendra pas forcément, alors ce serait plus simple de changer juste ce paramètre, c'est surtout qu'il est débutant!
    Mais c'est à toi de voir ce que tu préfére, si c'est ça solution bon courage et si c'est le changement du champs, je t'expliquerais calmement jusqu'à que tu y arrive.

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 139
    Points : 113
    Points
    113
    Par défaut
    a moins que je me trompe milia il ne peux pas mettre de valeurs par défaut, enfin ca ne servirait a rien d'aprés ce que j'ai compris, puisque ses tables sont bien remplies...Le fait est qu'il effectue dessus trois requêtes qui vont calculer des choses et donc créer une "vue temporaire" dans laquelle tu ne peux pas spécifier de valeurs par défaut...
    A part l'update je ne vois pas...
    Et je suis désolé mais c'est le weekend, alors faut que j'y aille...
    Bon courage pt'i lio, pense a tout ce qu'on t'as dit, tu trouvera forcément la solution

  17. #17
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Mettre un zéro à la place d'une cellule vide
    Il existe plusieurs solutions à ce problème bien connu :

    1- utiliser les jointures externes : clic droit sur le lien entre 2 champs du même type, une boîte de dialogue propose la nature de lien à effectuer.

    2- beaucoup plus pro : créer une requête sélection de type "union" sous l'éditeur SQL telle que :

    select T1.type_sinistre, T1.année, T1.nbre_sinistre
    from table1 as T1
    union
    select T2.type_sinistre, T2.année, T2.nbre_sinistre
    from table2 as T2;

    enregistrer cette requête,

    créer une nouvelle requête de type "analyse croisée" utilisant cette 1ère requête en prenant :
    type_sinistre en entête de ligne
    année en entête de colonne
    nbre_sinistre en valeur

  18. #18
    Membre expérimenté
    Avatar de Mahefasoa
    Homme Profil pro
    Manager IT
    Inscrit en
    Octobre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Manager IT

    Informations forums :
    Inscription : Octobre 2003
    Messages : 835
    Points : 1 664
    Points
    1 664
    Par défaut
    Salut
    P'tit Lio a écrit:
    SELECT [Sinistre 2005].Type, Count([Sinistre 2005].Type) AS CompteDeType
    FROM [Sinistre 2005]
    GROUP BY [Sinistre 2005].Type, [Sinistre 2005].Date
    HAVING ((([Sinistre 2005].Date)<Date()-365));

    La suivante qui me permet de classer par type et qui a son équivalent pour 2006:
    SELECT [R_Sinitre-365].[Type], Count([R_Sinitre-365].[CompteDeType]) AS CompteDeCompteDeType
    FROM [R_Sinitre-365]
    GROUP BY [R_Sinitre-365].[Type];
    Tu pourrais gagner un temps précieux en simplifiant la première requête. Je constate que la 2è requête est une réplique de la 1ère sans le regroupement sur le champ Date et le critère correspondant. Ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT [Sinistre 2005].Type, Count([Sinistre 2005].Type) AS CompteDeType
    FROM [Sinistre 2005]
    GROUP BY [Sinistre 2005].Type
    HAVING ((([Sinistre 2005].Date)<Date()-365));

    Et v'la! Mais cela ne résout pas ton problème, n'est-ce pas?
    Ce serait simple d'après moi si tu combines tes deux tables pour n'en faire qu'une. Si vraiment les données contenues dans les deux tables sont pareilles, pourquoi les séparer? Pour mieux se retrouver dans les dates? Bon, combines ces tables et comme cela tu dois avoir un truc du genre
    Date Type
    … …
    … …
    … …
    où les 2005 côtoient 2006!
    Si tu ne veux pas créer une nouvelle table pour placer les données de ces deux tables, tu pourras toujours créer une requête UNION qui peux s’écrire comme suit : je nomme TBL2005 la table contenant les données 2005 et TBL2006 celle des 2006.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT TBL2005.Date, TBL2005.Type FROM TBL2005 UNION SELECT TBL2006.Date, TBL2006.Type FROM TBL2006
    Maintenant, en utilisant une requête Analyse croisée de style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TRANSFORM ...
    SELECT ...
    FROM ...
    GROUP BY ...
    PIVOT ...;
    Plus précisément:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TRANSFORM Nz(Count(Table.Type),0) AS [Nb Sinistre]
    SELECT Table.Type
    FROM Table
    GROUP BY Table.Type
    PIVOT DatePart("yyyy",Table.Date);
    • Tout le calcul de regroupement dans la clause TRANSFORM correspond à la valeur affichée. Ici, ajoutons Nz, une fonction qui convertit les "Null" en zéro car si Count(Table.Type) ne correspond à rien (i.e. Null) alors il faut le convertir en zéro!
    • Tout ce qui se trouve dans la clause SELECT va apparaître en en-tête de ligne
    • Ce qui se trouve dans la clause PIVOT va apparaître dans l'en-tête de colonne (les années). La fonction DatePart est une fonction qui permet de soutirer des dates les bonnes informations, ici dans notre cas ce sont les années d'où "yyyy".
    Pour d'autres informations sur DatePart, consultes l'aide d'Access ou parcours le FAQ, il y a sûrement de très bonnes informations.

    Saches que pour les analyses croisées, il n'y a qu'une seule valeur (elle peut-être une somme, une moyenne, un compteur, tout ce qui correspond à la statistique), un seul champ pour en-tête de colonne et peut-être plusieurs pour en-tête de ligne.
    Comme résultat, notre requête analyse croisée affiche
    Type...........2005........2006
    Sinistre 1.....4.............3
    Sinistre 2.....0.............7
    etc.

    Il est possible de modifier l'orientation de la lecture en plaçant les types de sinistre en en-tête de colonne et les années en-tête de ligne. Notre requête se transforme comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TRANSFORM Nz(Count(Table.Type),0) As [Nb sinistre]
    SELECT DatePart("yyyy",Table.Date) As Année
    FROM Table
    GROUP BY DatePart("yyyy",Table.Date)
    PIVOT Table.Type;

    Et cela donne:
    Année....Sinistre 1....Sinistre 2
    2005......4...............0
    2006......3...............7

    J'espère que cela t’a aidé ...
    La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici nous avons réuni théorie et pratique: Rien ne fonctionne ... et personne ne sait pourquoi!
    Albert Einstein

  19. #19
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Bon je vous remercie tous de votre aide mais pour l'instant point de salut malgrés mes multiples tentatives de me servir des solutions proposés

  20. #20
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    YEAAAAAAAAAAAAAAAAH.

    Et un grand merci à vous tous !

    (comme quoi j'avais raison d'insister, en a peine 2 jours de stage je suis parvenu à resoudre mon probleme )

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/03/2012, 23h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo