Import excel access . pivot

bonjour a tous!
g un soucis concernant un champs sous access.
j'importe sous access une table d'excel dont un champ est de la forme 1/35/14 ou 97/65/78 par ex , la premiere partie correspondant a l'annee (dans l'ex 1 pour 2001 et 97 pour 1997) or je souhaite ne selectionner que les enregistrements dont l'année est inferieure a l'annee en cours (donc la premiere partie <4 pour cette annee ,5 pour l' annee prochaine)..on m'a parle de "pivot" afin de repondre a mon probleme mais je ne saisis toujours pas(de transformer mon champs texte ,de rajouter 2000 ou 1900 puis de traiter la date)
si quelqu'un pouvait me renseigner un peu..
merci d'avance!

4 réponses

Résumé de la discussion

Le problème porte sur l'importation d'une table Excel dans Access où un champ texte contient des valeurs comme 1/35/14 ou 97/65/78, la première partie indiquant l'année et devant être filtrée. Plusieurs répondants évoquent l'utilisation d'un pivot ou d'une transformation du champ pour extraire l'année, puis comparer avec l'année en cours à l'aide de Left et InStr. Les échanges montrent des essais comme retirer Val(), gérer les noms de champs avec espaces, ou réorganiser la requête pour placer les champs d'agrégat après les non-agrégés, avec des messages d'erreur. En l'absence d'une solution nette, la discussion souligne l'importance d'utiliser des crochets autour des noms de champs et d'organiser la requête pour éviter les erreurs de syntaxe.

Bobot (l’IA à votre service)
  1. Modérateur
    Salut,

    c'est moi le roi du pivot ! ;-)))

    Si tu ne souhaites que sélectionner, alors il faut intégrer une contrainte dans ton SELECT, pour ne sélectionner que les caractères à gauche du / qui sont inférieurs à 4

    Ca donne ça en SQL (on suppose que le champ s'appelle 'test') :
     WHERE val(left(test,InStr(1,test,"/")-1))>4
    Comment ça marche :

    On utilise la fonction instr qui cherche à quel endroit se trouve une chaine dans une autre : instr(1,test,"/") renvoie la position du caractère / en partant de la gauche. On ne peut pas se contenter de prendre les 2 premiers caractères de gauche, car des fois l'année est sur 1.

    Il faut ensuite prendre les caractères à gauche, mais la position renvoyée au dessus est celle du /, il faut donc soustraire 1 :

    left(test,instr(1,test,"/")-1)

    Il ne reste qu'à tester que c'est inférieur à l'année en cours. C'est pourquoi on est obligé d'utiliser la fonction val qui transforme une chaine en numérique.

    C'est plus clair ?

    A+ Blux
     "Les cons, ça ose tout.
    C'est même à ça qu'on les reconnait"
    1. merci pour toutes ces infos!!
      j'avoue que j'ai fait un copier coller et que j'ai tout mis dans le critere de mon champ dans ma requete.or mon champs s'appelle N° Op
      et g le message d'erreur suivant : l'expression comporte un point ! ou ( non valide et ca pointe sur InStr(
      le fait qu'il y ai un espace dans le nom de mon champ peut poser un pb?
      merci d'avance
    2. remoi!!

      ben voila exactement ce que g mis :
      val(left([TableDecompteOperations].[N° Op],InStr(1,[TableDecompteOperations].[N° Op],"/")-1))>4

      et bien cela me met que la syntaxe de l'expression est incorrecte..j'avoue que je ne vois pas bien ou..
      si jamais une erreur te saute aux yeux..
      et encore merci!
    3. Modérateur
      je vois pas du tout !
      SELECT Table1.[N° test]
      FROM Table1
      WHERE val(left([table1].[N° test],InStr(1,table1.[N° test],"/")-1))>4;
      marche très bien chez moi, avec les différentes façons de l'écrire...

      A+ Blux
       "Les cons, ça ose tout.
      C'est même à ça qu'on les reconnait"
    4. @bluxen fait g un nouveau message d'erreur maintenant : "appel de procedure incorrect"...je ne comprend pas
      voila ce que donne ma requete access en sql :
      SELECT TableDecompteOperations.Subdivision, TableDecompteOperations.[Code Nature], Sum(TableDecompteOperations.C) AS SommeDeC, Sum(TableDecompteOperations.R) AS SommeDeR, Sum(TableDecompteOperations.M) AS SommeDeM, Sum(TableDecompteOperations.A) AS SommeDeA, TableDecompteOperations.[N° Op]
      FROM TableDecompteOperations
      WHERE val(left([TableDecompteOperations].[N° Op],InStr(1,TableDecompteOperations.[N° Op],"/")-1))>4
      GROUP BY TableDecompteOperations.Subdivision, TableDecompteOperations.[Code Nature], TableDecompteOperations.[N° Op]
      HAVING (((TableDecompteOperations.[Code Nature]) Like "O"));

      encore merci
      a +!
    5. Modérateur
      @bluxTon GROUP BY a 3 champs, alors que ton SELECT n'en a que 2...

      A+ Blux
       "Les cons, ça ose tout.
      C'est même à ça qu'on les reconnait"
  2. Modérateur
    Voui, dans ce cas, il faut le mettre entre crochets []...

    Est-ce que tu as au moins saisi la méthode utilisée ? (c'est quand même le plus important !)

    A+ Blux
     "Les cons, ça ose tout.
    C'est même à ça qu'on les reconnait"
    1. salut!!

      je ne sais pas si tu te rappelles mais j'avais un soucis pour une requete sur access concernant une date..ben g tjrs ce soucis!!
      tu sais ce que le message d'erreur "appel de procedure incorrect" signifie?
      merci d'avance!
      1. Modérateur
        Ben désolé, mais j'ai dormi depuis !
        Pas de souvenir...

        Appel de procédure incorrect : c'est quand on appelle une procédure avec de mauvais paramètres (dixit la doc)...

        A+ Blux
         "Les cons, ça ose tout.
        C'est même à ça qu'on les reconnait"
        1. merci pour ta reponse!

          ca y est ca marche!!!!!!!!!!!! en fait tu avais raison vendredi dernier..mais au lieu du caractere "/" c'etait "."..hum..oui je sais c tres bete com erreur!!
          voila ma requete:

          SELECT TableDecompteOperations.Subdivision, TableDecompteOperations.[Code Nature], TableDecompteOperations.[N° Op], Sum(TableDecompteOperations.C) AS SommeDeC, Sum(TableDecompteOperations.R) AS SommeDeR, Sum(TableDecompteOperations.M) AS SommeDeM, Sum(TableDecompteOperations.A) AS SommeDeA
          FROM TableDecompteOperations
          WHERE (((Left([TableDecompteOperations].[N° Op],InStr(1,[TableDecompteOperations].[N° Op],".")-1))<Right(Year(Date()),1))) OR (((Left([TableDecompteOperations].[N° Op],InStr(1,[TableDecompteOperations].[N° Op],".")-1))>80) AND ((TableDecompteOperations.[Code Nature]) Like "O"))
          GROUP BY TableDecompteOperations.Subdivision, TableDecompteOperations.[Code Nature], TableDecompteOperations.[N° Op];

          mon soucis com tu peux le voir c que vu que je selectionne que le dernier chiffre de mon annee actuelle cette requete ne sera valable que jusqu'en 2009...pour l'instant je vais me contenter de ca mais j'aurai voulu pouvoir continuer apres 2010..si jamais tu as une idee..
          merci d'avance!
        2. Modérateur
          Ben, il suffit de prendre les 2 derniers caractères de la date !
          Si tu mets les 2 champs en numérique avec val, alors la comparaison marchera...

          C'est trop simple ? ;-)

          A+ Blux
           "Les cons, ça ose tout.
          C'est même à ça qu'on les reconnait"
        3. @bluxle souci c que si je met :

          WHERE (((Left([TableDecompteOperations].[N° Op],InStr(1,[TableDecompteOperations].[N° Op],".")-1))=Right(Year(Date()),2)) AND ((TableDecompteOperations.[Code Nature]) Like "P" Or (TableDecompteOperations.[Code Nature])="A"))

          au lieu de

          WHERE (((Left([TableDecompteOperations].[N° Op],InStr(1,[TableDecompteOperations].[N° Op],".")-1))=Right(Year(Date()),1)) AND ((TableDecompteOperations.[Code Nature]) Like "P" Or (TableDecompteOperations.[Code Nature])="A"))

          ben g plus aucun champ qui correspond...peut etre parceque je ne peux pas comparer deux chiffres a un seul?..est ce que je peux comparer "3" par ex à "04" ?

          encore merci!
          A+!
        4. Modérateur
          @bluxSi tu mets les 2 champs en numérique avec val, alors la comparaison marchera...

          Il me semblait l'avoir écrit... :-)

          A+ Blux
           "Les cons, ça ose tout.
          C'est même à ça qu'on les reconnait"
        5. @bluxje te remercie.j'essaierai apres manger!
          dsl si tu l'avais dit auparavant...c un peu confus pour moi!
          merci!
          a+!