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 :

Re - Trier des données par ordre d'importance


Sujet :

Access

  1. #1
    Membre du Club Avatar de popoliline
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 88
    Points : 62
    Points
    62
    Par défaut Re - Trier des données par ordre d'importance
    Bonjour,
    vous allez rire, mais j'ai besoin de ré-ouvrir la discution,
    le code fournit par Mahefasoa fonctionne très bien .......quand on ne rentre qu'une seul fois l'accident pas Casier.
    par contre, je me suis rendu compte que j'avais besoin d'intégrer une notion de cycle.
    car les accidents de culture doivent être fait chaque année (obligation)
    donc j'ai essayé d'intégrer cette notion mais je ne vois pas comment modifier le code
    en fait, ma table 8_Accident contiendrait maintenant:
    · N°_Accident (num auto)
    · Id_Casier (texte)
    · Accident (texte)
    · Surface_Ac (numérique)
    · Id_Cycle (texte)

    donc quand j'utilise le code fournit par Mahefasoa avec l'ajout des cycles dans ma requête, j'obtiens le résultat de la pièce jointe alors que ma table contient les infos: cf fichier joint.
    en fait, il m'ajoute le même type d'accidents à chaque fois qu'il est enregistré plusieurs fois dans la table pour un même casier.

    Donc si Mahefasoa ou quelqu'un d'autre pouvez me proposer une solution
    merci d'avance
    Pauline

    PS: pour avoir le début du pb.
    http://www.developpez.net/forums/sho...d.php?t=197708
    Images attachées Images attachées   

  2. #2
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    je t'avais proposé cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Function Accidents(NumParcelle As Long) as string
    Dim rst as dao.recordset
    dim strTemp as string
    set rst=currentdb.openrecordset("Select Accident from TaTable OrderBy Sum(Surface) Desc;",DbOpenSnapshot)
    Do until rst.eof
        strTemp=strTemp & "+" & rst(0)
        rst.movenext
    loop
     
    if strTemp ="" then
        exit function
    else
        strTemp = mid(strTemp,2)
    end if
     
    rst.close
    set rst=nothing
    end function
    la même en prenant en compte
    • les cycles
    • les noms de tes colonnes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Function Accidents(NumParcelle As Long, Cycle as string) as string
    Dim rst as dao.recordset
    dim strTemp as string
    set rst=currentdb.openrecordset("Select Accident from [8_Accident] OrderBy Sum([Surface_Ac]) Desc GROUP BY Accident WHERE Id_Casier =" & NumParcelle & " AND ID_Cycle='" & Cycle & "'",DbOpenSnapshot)
    Do until rst.eof
        strTemp=strTemp & "+" & rst(0)
        rst.movenext
    loop
     
    if strTemp ="" then
        exit function
    else
        strTemp = mid(strTemp,2)
    end if
     
    rst.close
    set rst=nothing
    end function
    Ca ne devrait pas être trop mal...

  3. #3
    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
    Citation Envoyé par popoliline
    le code fournit par Mahefasoa fonctionne très bien .......quand on ne rentre qu'une seul fois l'accident pas Casier.
    Salut,
    J'avoue ne rien comprendre car il (le code) marche même avec plusieurs accidents par casier. En outre, il est assez pareil de celui que Maxence HUBICHE a proposé au début (Merci Maxence, j'ai suivi tes conseils ).

    Mais je vais voir ça avec les nouvelles infos que tu communiques...si ce n'est déja résolu à mon retour.
    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

  4. #4
    Membre du Club Avatar de popoliline
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 88
    Points : 62
    Points
    62
    Par défaut
    bonjour,

    déjà, @ Mahefasoa,
    vraiment désolé, je me suis mal exprimé,
    en fait, ton code fonctionne très bien avec plusieurs accidents par casier mais plusieurs accidents différents ,
    dans mon cas, il arrivera que j'ai besoin de rentrer 2 accidents identiques pour un même casier (donc par ex 2 fois Herbe) mais pour 2 cycles différents:
    Cylce Casier Accident Surface
    2005_1 101 Herbe 5
    2005_2 101 Herbe 10

    et dnas ce cas, le code renvoie
    101 Herbe + Herbe 15
    il manque donc la prise en compte du cycle (notion que j'avais complétement oubliée quand j'ai énnoncé mon pb, )

    ensuite, @ Maxence Hubiche,
    merci pour le code que tu me propose
    je l'ai copié dans un module et j'ai essayé d'y faire référence dans ma requête pour ensuite m'en servir dans mon état (comme me l'avait expliqué Mahefasoa)
    par contre, comme c'est bien la première fois que je me sers d'un module (faut bien commencé un jour), je sais maintenant comme y faire référence pour un paramètre, mais pour 2, là je sais pas du tout

    donc j'ai essayé de mettre un AND entre mes paramètres dans mon champs de requête, comme ceci:
    Dégats: TriParImportance([Id_Casier] Et [Id_Cycle])

    ce qui me donne le SQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT [8_Accident].Id_Casier, Sum([8_Accident].Surface_Ac) AS TotalSurface, TriParImportance([Id_Casier] And [Id_Cycle]) AS Dégats, [8_Accident].Id_Cycle
    FROM 8_Accident
    GROUP BY [8_Accident].Id_Casier, TriParImportance([Id_Casier] And [Id_Cycle]), [8_Accident].Id_Cycle
    ORDER BY [8_Accident].Id_Cycle DESC;
    je n'ai pas de message d'erruer, par contre, la requête ne me met rien dans la colonne des dégâts.
    et là j'avoue que je ne sias pas du tout quoi faire.
    j'ai ajouté dans ma requête le champs Id_Cycle , faut-il que je l'ajoute ou pas du tout?

    Pauline

  5. #5
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    remplace ton AND par une ,

    Ce sera suffisant

  6. #6
    Membre du Club Avatar de popoliline
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 88
    Points : 62
    Points
    62
    Par défaut
    Maxence HUBICHE a écrit:
    remplace ton AND par une ,
    désolé mais cela ne fonctionne pas, j'ai une erreur:
    la syntaxe de l'expression entrée n'est pas correcte
    vous avez omis une opérande ou un opérateur, vous avez entré un caractère ou une virgule non valides, ou encore du texte sans le délimiter par des guillemets
    que dois-je faire ?

  7. #7
    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
    Citation Envoyé par popoliline
    Dégats: TriParImportance([Id_Casier] Et [Id_Cycle])
    Pauline
    Salut,
    Ecris ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dégats: TriParImportance([Id_Casier];[Id_Cycle])
    Dans la requête en mode création, le séparateur de paramètres (argument) est le point-virgule ( ; ) alors que dans un code VB, le séparateur est la virgule ( , ).
    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

  8. #8
    Membre du Club Avatar de popoliline
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 88
    Points : 62
    Points
    62
    Par défaut
    je suis vraiment désolé d'insister,
    mais j'ai toujours une erreur de syntaxe dans l'expression:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Accidents([Id_Casier] ; [Id_Cycle])
    j'ai tout essayé, la virgule, les (), les [], l'espace, AND, OR, et là je sais pas trop....
    voici ceux que donne la requête en mode création si j'utilise le ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT [8_Accident].Id_Casier, Sum([8_Accident].Surface_Ac) AS TotalSurface,Accidents([Id_Casier] ; [Id_Cycle]) AS Dégats, [8_Accident].Id_Cycle
    FROM 8_Accident
    GROUP BY [8_Accident].Id_Casier, Accidents([Id_Casier] And [Id_Cycle]), [8_Accident].Id_Cycle;
    en fait j'ai utilisé le code proposé par Maxence Hubiche qui a intégrer la notion de cycle mais cela reveint au même si j'utilise celui de Mahefasoa....

    Pauline

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    Bonjour,

    voici la fonction corriger à mettre dans un module standard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    Public Function Accidents(NumParcelle As Long, Cycle As String) As String
    Dim rst As DAO.Recordset
    Dim sSql As String
    sSql = "SELECT Accident FROM 8_Accident WHERE Id_Casier = '" & NumParcelle & "' And Id_Cycle = '" & Cycle & "' GROUP BY Accident ORDER BY Sum(Surface_Ac) DESC;"
    Set rst = CurrentDb.OpenRecordset(sSql, dbOpenSnapshot)
    Do Until rst.EOF
        Accidents = Accidents & "+" & rst(0)
        rst.MoveNext
    Loop
     
    If Accidents <> vbNullString Then
        Accidents = Mid$(Accidents, 2)
    End If
     
    rst.Close
    Set rst = Nothing
    End Function
    La requête est celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT [8_Accident].Id_Casier, Sum([8_Accident].Surface_Ac) AS TotalSurface, [8_Accident].Id_Cycle, Accidents([Id_Casier],[Id_Cycle]) AS Degats
    FROM 8_Accident
    GROUP BY [8_Accident].Id_Casier, [8_Accident].Id_Cycle, Accidents([Id_Casier],[Id_Cycle]);
    Cordialement,

    Philippe

    Complément :
    -------------
    J'ai considéré que Id_Casier est un champ texte.
    Si c'est un champ numérique, remplacer la ligne correspondante par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sSql = "SELECT Accident FROM 8_Accident WHERE Id_Casier = " & NumParcelle & " And Id_Cycle = '" & Cycle & "' GROUP BY Accident ORDER BY Sum(Surface_Ac) DESC;"

  10. #10
    Membre du Club Avatar de popoliline
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 88
    Points : 62
    Points
    62
    Par défaut
    bonsoir philben,
    j'ai essayé ton code est j'ai une erreur d'éxecution 3464 (type de donnée incompatible, à ce niveau du module:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rst = CurrentDb.OpenRecordset(sSql, dbOpenSnapshot)
    et là je vois encore moins de quoi il s'agit....désolé

    Pauline

  11. #11
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    re bonjour,

    il suffit de mettre la correction du post précédent.

    Philippe

  12. #12
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    Re bonjour,

    j'ai testé et tout fonctionne bien !

    ci-joint le test.

    Philippe

  13. #13
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    Citation Envoyé par popoliline
    bonsoir philben,
    j'ai essayé ton code est j'ai une erreur d'éxecution 3464 (type de donnée incompatible, à ce niveau du module:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rst = CurrentDb.OpenRecordset(sSql, dbOpenSnapshot)
    et là je vois encore moins de quoi il s'agit....désolé

    Pauline
    Va dans Outils / Références
    Coches Microsoft DAO 3.6 Object library
    Dans l'ordre de priorité, arrange toi pour que ce soit AVANT Microsoft Activex Data Objects ............

    et définis rst comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim rst as DAO.Recordset

  14. #14
    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
    Citation Envoyé par popoliline
    je suis vraiment désolé d'insister,
    mais j'ai toujours une erreur de syntaxe dans l'expression:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Accidents([Id_Casier] ; [Id_Cycle])
    (...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT [8_Accident].Id_Casier, Sum([8_Accident].Surface_Ac) AS TotalSurface,Accidents([Id_Casier] ; [Id_Cycle]) AS Dégats, [8_Accident].Id_Cycle
    FROM 8_Accident
    GROUP BY [8_Accident].Id_Casier, Accidents([Id_Casier] And [Id_Cycle]), [8_Accident].Id_Cycle;
    (...)
    J'ai bien insisté sur le fait que si c'est en mode création de requête (là où tu conçois la requête en mode visuel le QBE) tu dois utiliser ( ; ) et si c'est dans le code (VB ou SQL) tu dois utiliser ( , ).

    Je te conseille de passer en mode création de requête (là où tu vois la grille d'interrogation) et places le point-virgule. Ou bien, transforme to code SQL en ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    'PAS CECI
    SELECT [8_Accident].Id_Casier, Sum([8_Accident].Surface_Ac) AS TotalSurface,Accidents([Id_Casier] ; [Id_Cycle]) AS Dégats, [8_Accident].Id_Cycle
    FROM 8_Accident
    GROUP BY [8_Accident].Id_Casier, Accidents([Id_Casier] And [Id_Cycle]), [8_Accident].Id_Cycle;
    
    'MAIS CECI
    SELECT [8_Accident].Id_Casier, Sum([8_Accident].Surface_Ac) AS TotalSurface,Accidents([Id_Casier], [Id_Cycle]) AS Dégats, [8_Accident].Id_Cycle
    FROM 8_Accident
    GROUP BY [8_Accident].Id_Casier, Accidents([Id_Casier] And [Id_Cycle]), [8_Accident].Id_Cycle;
    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

  15. #15
    Membre du Club Avatar de popoliline
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 88
    Points : 62
    Points
    62
    Par défaut Merci
    Bonjour,
    et merci beaucoup à tous,
    tout fonctionne à merveille,
    juste quelques petites précisions,

    @Maxence Hubiche,
    Microsoft DAO 3.6 Object library était bien coché est le plus haut possible dans la liste et rst était bien défini comme tu me l'a dit,

    @ Mahefasoa, j'ai esssayé toutes les possibilités et j'avais à chaque fois une erreur de syntaxe, pas trop compris...

    @philben, tout fonctionne merci pour l'exemple que tu m'a envoyé.

    sinon, pour tout récapituler et pour les prochains qui auraient le même problème,
    voici le module:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Public Function Accidents(NumParcelle As Long, Cycle As String) As String
    Dim rst As DAO.Recordset
    Dim sSql As String
    sSql = "SELECT Accident FROM 8_Accident WHERE Id_Casier = " & NumParcelle & " And Id_Cycle = '" & Cycle & "' GROUP BY Accident ORDER BY Sum(Surface_Ac) DESC;"
    Set rst = CurrentDb.OpenRecordset(sSql, dbOpenSnapshot)
    Do Until rst.EOF
        Accidents = Accidents & "+" & rst(0)
        rst.MoveNext
    Loop
     
    If Accidents <> vbNullString Then
        Accidents = Mid$(Accidents, 2)
    End If
     
    rst.Close
    Set rst = Nothing
    End Function
    et le code de la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT [8_Accident].[Id_Casier], Sum([8_Accident].[Surface_Ac]) AS TotalSurface, [8_Accident].[Id_Cycle], Accidents([Id_Casier],[Id_Cycle]) AS Degats
    FROM 8_Accident
    GROUP BY [8_Accident].[Id_Casier], [8_Accident].[Id_Cycle], Accidents([Id_Casier],[Id_Cycle]);
    encore pour votre aide
    Pauline

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

Discussions similaires

  1. Trier des combobox par ordre croissant et alphabétique
    Par floflo50100 dans le forum Excel
    Réponses: 6
    Dernier message: 09/04/2015, 15h31
  2. [MySQL] Trier des données par catégories
    Par robinowned dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 22/11/2013, 14h43
  3. [XL-2010] Trier des données par intervalle et tracer un histogramme
    Par Grichka146 dans le forum Excel
    Réponses: 1
    Dernier message: 05/01/2012, 20h35
  4. Trier des lignes par ordre alphabétique ?
    Par Evocatii dans le forum Eclipse
    Réponses: 0
    Dernier message: 11/08/2007, 11h26
  5. Trier des données par ordre d'importance
    Par popoliline dans le forum Access
    Réponses: 19
    Dernier message: 23/08/2006, 19h42

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