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

Ruby on Rails Discussion :

Trier les records 'strings'


Sujet :

Ruby on Rails

  1. #1
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut Trier les records 'strings'
    Je dois pouvoir attribuer un numéro de référence qui auto-augmente et se présente comme 'yyyy-référence'. Donc si je fais comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    prj = Project.find(:last, :order => 'ref',:conditions=>["ref IS NOT NULL"])
    if prj
            last_ref = prj.ref
            year, ref = last_ref.split('-')
            self.ref = Date.today.year.to_s + '-' + (ref.to_i+1).to_s
          else
            self.ref = Date.today.year.to_s + '-' + 1.to_s
          end
    Les records seront triés comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    2009-1
    2009-11
    2009-12
    etc...
    2009-2
    ...
    2009-9
    Donc je n'obtiens jamais 2009-10 comme dernier record pour pouvoir créer une nouvelle référence '2009-11'.
    Comment resoudre ce problème?

  2. #2
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Points : 36
    Points
    36
    Par défaut
    Salut,

    En triant d'abord sur l'année puis sur la réf, cela semble fonctionner. La condition order de ton find devrait ressembler à:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    prj = Project.find :last, :conditions => ["ref IS NOT NULL"],
      :order => "SUBSTRING(ref, 1, 4), CONVERT(SUBSTRING(REPLACE(ref, '-', ''), 5), signed)"
    Je ne sais pas si c'est bien propre ou s'il y a plus simple, mais ça a l'air de faire ce que tu souhaites.

    a+

  3. #3
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut
    Je l'ai teste sur MySQL et voici l'erreur que j'ai eu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ActiveRecord::StatementInvalid (Mysql::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DESC, 1 DESC, 4) DESC, CONVERT(SUBSTRING(REPLACE(ref DESC, '-' DESC, '') DES' at line 1: SELECT * FROM `projects` WHERE (ref IS NOT NULL)  ORDER BY SUBSTRING(ref DESC, 1 DESC, 4) DESC, CONVERT(SUBSTRING(REPLACE(ref DESC, '-' DESC, '') DESC, 5) DESC, signed) DESC LIMIT 1):
    Je suis sur Ubuntu 9.04, ruby 1.8.7, Rails 2.3.3.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Points : 36
    Points
    36
    Par défaut
    Je suppose que tu as rajouté des DESC pour avoir la liste dans l'ordre décroissant?

    Dans ce cas, il te faudrait plutôt faire ça je pense:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    prj = Project.find :last, :conditions => ["ref IS NOT NULL"],
      :order => "SUBSTRING(ref, 1, 4) DESC, CONVERT(SUBSTRING(REPLACE(ref, '-', ''), 5), signed) DESC"
    Je ne peux pas testé, je n'ai pas de MySQL sous la main, mais la requête que je t'ai filé hier, fonctionnait dans MySQL.

    En revanche, j'ai tester la requête ci-dessus dans PostgreSQL en l'adaptant un peu, et elle fonctionne.

    Après tu n'as plus qu'à modifier les ASC/DESC pour que ce soit dans l'ordre que tu souhaites.

    a+

  5. #5
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut
    Non, ça ne fonctionne toujours pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ActiveRecord::StatementInvalid (Mysql::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DESC, 1 DESC, 4) ASC, CONVERT(SUBSTRING(REPLACE(ref DESC, '-' DESC, '') DESC' at line 1: SELECT * FROM `projects` WHERE (ref IS NOT NULL)  ORDER BY SUBSTRING(ref DESC, 1 DESC, 4) ASC, CONVERT(SUBSTRING(REPLACE(ref DESC, '-' DESC, '') DESC, 5) DESC, signed) ASC LIMIT 1):
    Je devrais me plonger dans la DOC de MySQl pour trouver la syntax exacte. En plus ce ne sera plus 'portable' si jamais on change de DB.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Points : 36
    Points
    36
    Par défaut
    Je pige pas, c'est Rails qui rajoute tous ces DESC dans la requête? comme dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUBSTRING(REPLACE(ref DESC, '-' DESC, '') DESC, 5)
    Car j'ai testé les requêtes SQL dans MySQL et elles fonctionnent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT *
    FROM projects
    WHERE ref IS NOT NULL
    ORDER BY SUBSTRING(ref, 1, 4), CONVERT(SUBSTRING(REPLACE(ref, '-', ''), 5), signed)
    Pourtant, il ne me semble pas que Rails modifie le contenu de l'option order de la méthode find.

  7. #7
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut
    C'est vrai. ta requête fonctionne telle quelle. Si je l'intègre dans Rails comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    prjs = Project.find_by_sql("SELECT * FROM projects WHERE ref IS NOT NULL ORDER BY SUBSTRING(ref, 1, 4), CONVERT(SUBSTRING(REPLACE(ref, '-', ''), 5), signed)")
    je recevrai un Array de Projets. Est-ce qu'il y a un moyen de ne prendre que celui avec la toute dernière référence ?

  8. #8
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut
    Il suffit de rajouter ceci pour récupérer le dernier projet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    prjs = Project.find_by_sql("SELECT * FROM projects WHERE ucb_ref IS NOT NULL ORDER BY SUBSTRING(ucb_ref, 1, 4), CONVERT(SUBSTRING(REPLACE(ucb_ref, '-', ''), 5), signed)")
    if not prjs.empty?
            last_ref = prjs.last.ref
            year, ref = last_ref.split('-')
            self.ref = Date.today.year.to_s + '-' + (ref.to_i+1).to_s
          else
            self.ref = Date.today.year.to_s + '-' + 1.to_s
          end
    Merci beaucoup pour ton aide. Il ne reste que vérifier maintenant si par ex. Oracle DB accepte ce genre de traitement.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Points : 36
    Points
    36
    Par défaut
    La requête qui fonctionne sous MySQL ne fonctionne pas sous PostgreSQL par exemple. Il faut utiliser to_number au lieu de CONVERT ou quelque chose comme ça.

    Pour Oracle, je ne sais pas. Il te faut regarder au niveau des fonctions disponibles avec la base de données.

  10. #10
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut
    Par exemple pour Oracle ça marche avec la syntax suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    "SELECT * FROM projects WHERE ref IS NOT NULL ORDER BY SUBSTR(ref, 1, 4),
    TO_NUMBER(SUBSTR(REPLACE(ref, '-', ''), 5) )

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 08/07/2011, 16h22
  2. Trier les données d'un TDecisionCube
    Par kinettoman dans le forum Bases de données
    Réponses: 2
    Dernier message: 15/09/2004, 10h31
  3. Trier les enregistrements en fonction de la date
    Par mpereg dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 12/09/2004, 14h16
  4. Réponses: 3
    Dernier message: 26/04/2004, 12h51
  5. trier les données dans le cache ??
    Par psyco2604 dans le forum XSL/XSLT/XPATH
    Réponses: 31
    Dernier message: 10/06/2003, 10h03

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