Publicité
+ Répondre à la discussion
Page 2 sur 2 PremièrePremière 12
Affichage des résultats 21 à 34 sur 34
  1. #21
    En attente de confirmation mail
    Inscrit en
    janvier 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 26

    Informations forums :
    Inscription : janvier 2008
    Messages : 106
    Points : 65
    Points
    65

    Par défaut

    Je vais poster ma réponse plus tard mais je crois qu'il y a moyen de rendre encore plus général ton idée. Je vais créer quelque chose mais je ne sais pas du tout si cela sera bien

  2. #22
    Rédacteur

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

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

    Informations forums :
    Inscription : juin 2002
    Messages : 3 841
    Points : 9 058
    Points
    9 058

    Par défaut

    tous les coups sont permis!
    même les tordus à partir du moment que ca marche.
    Si TOUS les coups sont permis...
    Code :
    1
    2
     
    ALTER TABLE table DROP COLUMN n
    Code :
    ALTER TABLE table ADD COLUMN n COUNTER
    Code :
    1
    2
    3
    4
     
    SELECT table.*, iif([n]=4,6,iif([n]=6,4,[n])) As NewOrder
    FROM table
    ORDER BY NewOrder

  3. #23
    Expert Confirmé Sénior Avatar de vodiem
    Homme Profil pro Diem VO
    Vivre
    Inscrit en
    avril 2006
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Nom : Homme Diem VO
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : avril 2006
    Messages : 2 855
    Points : 4 348
    Points
    4 348

    Par défaut

    Friedrick> bienvenu. on attend ta création.

    Maxence HUBICHE> he bien voilà, on se rapproche.

    on peut dire que c'est une semi-solution:
    tu fais un prétraitement sql avant de lancer la requete ce qui n'empêchera pas à jpcheck d'en faire autant en vba et sur lequel il pourra rajouter une requete.
    cette solution étant facile c'est pour cela que je disais:
    Citation Envoyé par defi
    je voudrais une requete...
    et en fait qu'une seul.

    le pb dans cette solus c'est que l' 'alter table' ne pourras pas se faire à l'intérieur d'une requete.
    elle est aussi restictif: on ne peut créer de numéro automatique que sur les tables et pas sur les requetes. (c'est vrai, cela fait pas parti des restrictions de l'énoncé)

    mais l'idée est là! pouvoir utiliser un truc de ce genre:
    Citation Envoyé par Maxence HUBICHE
    Code :
    1
    2
    3
    SELECT table.*, iif([n]=4,6,iif([n]=6,4,[n])) As NewOrder
    FROM table
    ORDER BY NewOrder
    j'imaginais moi une fonction IndiceAuto() qui pourrait s'utiliser comme ca:
    Code SQL :
    1
    2
    SELECT laTable.champ, IndiceAuto() as indice
    FROM laTable
    (j'ai biensur des paramètres dans IndiceAuto car il est difficile de s'en passer).
    à défaut de trouver du 100% sql.

    ce qui donne dans la solus de Maxence pour ce pb:
    Code SQL :
    1
    2
    3
    SELECT table.*
    FROM table
    ORDER BY iif(IndiceAuto()=4,6,iif(IndiceAuto()=6,4,IndiceAuto()))

    mais comme je l'ai dit si j'avais cette solus, on en discuterait pas là, j'aurais posté en contribution.

    toutefois j'ai un embryon qui peut, peut-être, rendre service ou ouvrir une piste vers la vrai solution de IndiceAuto().
    mais qui sait? vous allez peut être trouver vous le truc?

  4. #24
    Rédacteur

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

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

    Informations forums :
    Inscription : juin 2002
    Messages : 3 841
    Points : 9 058
    Points
    9 058

    Par défaut

    Citation Envoyé par vodiem Voir le message
    Friedrick> bienvenu. on attend ta création.
    Et nous la tienne !

  5. #25
    Expert Confirmé Sénior Avatar de vodiem
    Homme Profil pro Diem VO
    Vivre
    Inscrit en
    avril 2006
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Nom : Homme Diem VO
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : avril 2006
    Messages : 2 855
    Points : 4 348
    Points
    4 348

    Par défaut

    bon, je rappel: c'est pas l'idéal, mais ca peut marcher

    gard à vous! je lache l'embryon:

    pour avoir l'indice des enregistrements:
    Code :
    1
    2
    3
    4
    5
    6
    7
    Public monIndice As Variant
     
    Public Function IndiceAuto(Vmax, v As Variant) As Variant
    monIndice = IIf(IsEmpty(monIndice), 1, monIndice + 1)
    IndiceAuto = monIndice
    If monIndice >= Vmax Then monIndice = Empty
    End Function
    avec le sql:
    Code SQL :
    1
    2
    SELECT laTable.champ, IndiceAuto(DCount("*","laTable"),[champ]) AS Indice
    FROM laTable;
    comme c'est un embryon: on touche qu'avec les yeux...
    et pour ceux qui n'ont pas écouté l'avertissement: (à exécuter) je n'ai pas testé en requête action mais cela ne devrait pas poser de pb.
    si vous le protégez en le verrouillant dans un form ca marche aussi : principe du: "touche pas à mon ..." embryon.

    donc puisque la fonction ne peut être appelée deux fois pour le même champ:
    Code :
    1
    2
    3
    SELECT TABLE.*
    FROM TABLE
    ORDER BY iif(IndiceAuto()=4,6,iif(IndiceAuto()=6,4,IndiceAuto()))
    ne marche pas et donc pour résoudre le pb de martine (qui n'a aucun intérêt: je la connais même pas )
    Code SQL :
    1
    2
    3
    SELECT t1.champ
    FROM laTable AS t1
    ORDER BY IndiceAutolaTable(DCount("*","laTable"),[champ]);
    avec pour fonction:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Function IndiceAutolaTable(Vmax, v As Variant) As Variant
    monIndice = IIf(IsEmpty(monIndice), 1, monIndice + 1)
    Select Case monIndice
        Case 4: IndiceAutolaTable = 6
        Case 6: IndiceAutolaTable = 4
        Case Else
        IndiceAutolaTable = monIndice
    End Select
    If monIndice >= Vmax Then monIndice = Empty
    End Function
    vous remarquerez que [champ]=v dans la fonction ne sert à rien que de déclencher la fonction.
    le compte dcount n'est là que pour avoir une relative stabilité.
    dans le cas de martine vous remarquerez que vous avez le droit d'y toucher avec vos doigts puisque l'indice n'est pas visible. (l'embryon est caché )

    j'ai essayé d'avoir un ordre par le temps mais sans succés: pas assez précis (peut être avec le code donné par LedZeppII ici ?)
    si j'ai qq idées tordues qui pourrait peut-être rendre cela plus stable, je voulais vous défiez de trouver mieux...

    donc: qui dit mieux ?

  6. #26
    Responsable Access
    Avatar de Arkham46
    Profil pro
    Inscrit en
    septembre 2003
    Messages
    4 780
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : septembre 2003
    Messages : 4 780
    Points : 9 991
    Points
    9 991

    Par défaut

    Citation Envoyé par vodiem Voir le message
    j'aime bien ton truc random,

    je disais entre 6 et 4 pour simplifier mais je reste indécis sur les valeurs et sur le nombre de personnes.

    une requete un peu plus "généraliste" quoi, tu me trouve un truc comme ca?
    Heu pourtant tu mets 4 et 6 en dur dans ta solution...

    De plus tu demandes une requête et une seule, .... mais tu ajoutes du code

    Donc on n'a pas le droit à plusieurs requêtes mais on a droit à mettre du VBA; les règles ont l'air d'évoluer en fonction de ta solution.

    Et de toute façon je n'ai toujours pas compris l'énoncé dui problème qui évolue à chaque message.

  7. #27
    Rédacteur

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

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

    Informations forums :
    Inscription : juin 2002
    Messages : 3 841
    Points : 9 058
    Points
    9 058

    Par défaut

    Citation Envoyé par Arkham46 Voir le message
    Donc on n'a pas le droit à plusieurs requêtes mais on a droit à mettre du VBA; les règles ont l'air d'évoluer en fonction de ta solution.
    Nope !
    On n'a pas le droit de mettre du VBA, puisue la solution VBA a été rejetée !
    Citation Envoyé par vodiem Voir le message
    Maxence HUBICHE> he bien voilà, on se rapproche.
    <<snip>>et en fait qu'une seul.

    le pb dans cette solus c'est que l' 'alter table' ne pourras pas se faire à l'intérieur d'une requete.
    D'autre part, comme tu n'as pas précisé que cela devait se faire dans un MDB, je fais un ADP, et je fais une procédure stockée, et j'adapte ce SQL à SQLServer, et ça marche en une seule 'requête'

    (tu as dit : tous les coups sont permis !)

  8. #28
    Expert Confirmé Sénior Avatar de vodiem
    Homme Profil pro Diem VO
    Vivre
    Inscrit en
    avril 2006
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Nom : Homme Diem VO
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : avril 2006
    Messages : 2 855
    Points : 4 348
    Points
    4 348

    Par défaut

    ,

    je n'ai pas proscris le vba, à plusieurs reprise je dis même que ma solus est elle-même sql+vba.
    je disais à jpcheck qui avait fourni une solus uniquement en vba:
    Citation Envoyé par vodiem
    tu me la refais dans une requete et tu auras gagné
    les règles n'ont pas évoluées, je rappel le défi c'est toujours:
    je voudrais une requete qui me permute le 6ème enregistrement avec le 4ème à partir de cette table
    et pour arriver à répondre à cette question il faut pouvoir énumérer les enregitrements.

    Citation Envoyé par Arkham46
    Heu pourtant tu mets 4 et 6 en dur dans ta solution...
    s'il n'est pas difficile de mettre en paramètre, je répondais à la solus de random qui n'était pas souple.

    c'est un défi, et je vous remercie à chacun du temps que vous prennez pour y répondre, si vous avez mal pris les remarques que j'ai fait, j'en suis navré, seulement il y a des solus plus pertinante que d'autre, il faut donc cerner les limites de chacune.

    Citation Envoyé par Arkham46
    De plus ta solution proposée n'étant pas "stable"...
    la fonction n'est pas stable dans tous les cas de figure, mais pour ma solution et d'en d'autre cas, elle l'est.

    Citation Envoyé par Maxence HUBICHE
    D'autre part, comme tu n'as pas précisé que cela devait se faire dans un MDB, je fais un ADP, et je fais une procédure stockée, et j'adapte ce SQL à SQLServer, et ça marche en une seule 'requête'

    (tu as dit : tous les coups sont permis !)
    oui, tu as raison. j'admets en procédure stockée, ok.
    mais je n'ai pas dis que tu n'avais pas une solution seulement je remarquais les quelques restrictions.

  9. #29
    Rédacteur

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

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

    Informations forums :
    Inscription : juin 2002
    Messages : 3 841
    Points : 9 058
    Points
    9 058

    Par défaut

    Bon, alors, si on a le droit de faire des fonctions en VBA...
    C'est plus facile !

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Function Permuter(v1 As Long, v2 As Long, un_champ As Variant, NomChamp As String, NomTable As String) As Long
    '---------------------------------------------------------------------------------------
    ' Procédure : Permuter
    ' Crée le   : 07/02/2008 12:19
    ' Auteur    : Maxence Hubiche (mhubiche@club-internet.fr)
    ' Objet     : permuter deux champs
    '
    ' Arguments :   v1 - n° de la 1ère ligne à permuter
    '               v2 - n° de la 2ème ligne à permuter
    '               un_champ - mettre un champ quelconque. ceci sert à forcer le recalcul
    '                   de la fonction
    '               NomChamp - Nom d'un champ (pour compter le nombre d'enr de la table)
    '               NomTable - Nom de la table dont il faut compter les enr.
    '---------------------------------------------------------------------------------------
    '
        Static n As Long
        If n >= DCount("[" & NomChamp & "]", "[" & NomTable & "]") Then
            n = 1
        Else
            n = n + 1
        End If
        Select Case n
            Case v1: Permuter = v2
            Case v2: Permuter = v1
            Case Else: Permuter = n
        End Select
    End Function
    Code :
    SELECT Nom FROM Table1 ORDER BY permuter(4,6,[nom],"Nom","Table1");

  10. #30
    Responsable Access
    Avatar de Arkham46
    Profil pro
    Inscrit en
    septembre 2003
    Messages
    4 780
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : septembre 2003
    Messages : 4 780
    Points : 9 991
    Points
    9 991

    Par défaut

    Bjr,

    Citation Envoyé par vodiem Voir le message
    je n'ai pas testé en requête action mais cela ne devrait pas poser de pb.
    Pas évident pour une création de table avec Select Into :
    http://support.microsoft.com/kb/280049/en-us
    Mais le problème se pose dans tous les cas, le order by ne détermine pas l'ordre d'écriture des enregistrements.

    Je reste sur mes gardes pour l'ordre de lecture, je ne trouve pas de document me garantissant que l'ordre de lecture se fait dans l'ordre de stockage des enregistrements dans la table.
    (même si les tests sont concluants, rien ne me dit qu'il n'y a pas quelque part un buffer de lecture utilisé par Jet et qui va planter mon ordre de sélection une fois sur cent, de la même manière que pour l'écriture)

  11. #31
    Rédacteur

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

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

    Informations forums :
    Inscription : juin 2002
    Messages : 3 841
    Points : 9 058
    Points
    9 058

    Par défaut

    au vu de la complexité de l'interpréteur SQL
    http://support.microsoft.com/kb/464315/fr
    JE suppose que tu n'as pas complètement tort concernant l'ordre variable suivant certains critères...

  12. #32
    Expert Confirmé Sénior
    Inscrit en
    mai 2005
    Messages
    3 419
    Détails du profil
    Informations forums :
    Inscription : mai 2005
    Messages : 3 419
    Points : 4 167
    Points
    4 167

    Par défaut

    Citation Envoyé par Arkham46 Voir le message
    Bjr,




    http://support.microsoft.com/kb/280049/en-us
    Je reste sur mes gardes pour l'ordre de lecture, je ne trouve pas de document me garantissant que l'ordre de lecture se fait dans l'ordre de stockage des enregistrements dans la table.
    j'ai vu des exemples contraires, sur des tables conséquentes, et la documentation d'access est à ce sujet assez claire
    au hasard "les enregistrements d"une variable de type table apparaissent initialement dans n'importe quel ordre"

    un tel défi ne fait que souligner l'absence d'un compteur de ligne véritable
    dans access et l'utilité du compteur auto
    Elle est pas belle la vie ?

  13. #33
    Expert Confirmé Sénior Avatar de vodiem
    Homme Profil pro Diem VO
    Vivre
    Inscrit en
    avril 2006
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Nom : Homme Diem VO
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : avril 2006
    Messages : 2 855
    Points : 4 348
    Points
    4 348

    Par défaut

    Maxence Hubiche>
    Citation Envoyé par Maxence Hubiche
    Bon, alors, si on a le droit de faire des fonctions en VBA...
    C'est plus facile !
    je ne pensais pas que c'était difficile, d'ailleur je pensais et je pense qu'il doit y avoir plusieurs solus à ce pb.
    mais je soupconnais des solus tordues.

    j'avais aussi commencé et eu comme toi ce code puis je l'avais modifié en: (en reprenant à partir de ton code)
    Code SQL :
    SELECT champ FROM laTable ORDER BY permuter(4,6,[champ],"laTable")
    avec:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Function Permuter(v1 As Long, v2 As Long, un_champ As Variant, NomTable As String) As Long
    '---------------------------------------------------------------------------------------
    ' Procédure : Permuter
    ' Crée le   : 07/02/2008 12:19
    ' Auteur    : Maxence Hubiche (mhubiche@club-internet.fr)
    ' Objet     : permuter deux champs
    '
    ' Arguments :   v1 - n° de la 1ère ligne à permuter
    '               v2 - n° de la 2ème ligne à permuter
    '               un_champ - mettre un champ quelconque. ceci sert à forcer le recalcul
    '                   de la fonction
    '               NomTable - Nom de la table dont il faut compter les enr.
    '---------------------------------------------------------------------------------------
    '
        Static n As Long
        n = (n Mod DCount("*", "[" & NomTable & "]")) + 1
        Select Case n
            Case v1: Permuter = v2
            Case v2: Permuter = v1
            Case Else: Permuter = n
        End Select
    End Function
    dans le principe c'est le même que le tien un peu allégé (je n'avais pas non plus le paramètre NomChamp pour le compte)

    le traitement n'est pas très différent mais je vais expliquer pourquoi je n'ai pas fait ce choix:
    je n'ai pas opté pour static car lors d'un pb d'arrêt 'n' n'est pas initialisé et déclarer en public permet plus facilement d'accéder à 'n' pour l'initialiser ou forcer l'initialisation. (encore que l'on devrait pouvoir y accéder par le nom du module si je ne me trompe).
    j'ai renoncé à mettre le calcul du nombre d'enregistrement dans la fonction car s'il s'agit d'une requete avec jointure, cela ne marche plus, alors que si on fournit en paramètre c'est plus libre.
    j'ai renoncé au modulo, je trouvais plus satisfaisant de libérer la valeur. je trouve intellectuellement plus "propre" et satisfaisant de procéder ainsi: je crée la valeur dans la requete, je la libère après.

    Arkham46>qd je parlais de requete action je pensais pour la fonction indiceAuto pour l'énumération des enregistrements.

    mais tu as raison de souligner les limites d'exploitation de tels fonctions qui pourrait rester que dans le domaine du ludique mais je pense que dès lors que l'on part déjà sur des tables sans ordres il y a déjà du hazard et faire par exemple une permutation dans du hazard n'est pas forcemment du domaine de l'utopique.
    (je reste septique sur un décalage entre lecture et écriture.)

    l'enjeu au delà de cette exemple c'est d'avoir ce que random à clairement défini: un compteur de ligne véritable.
    ce en quoi nous pourrions avoir des requetes simplifiées (les calculs qui demande l'enregistrement n-1 par exemple, résolution de pb avec des doublons, selection de plage...)

    si ces fonctions fournissent un compteur, elles ne sont pas vraiment exploitable.
    l'insert+alter table+counter fournit un résultat plus fiable mais lourd pour l'énumération.

    alors celui qui trouveras une autre piste à la résolution de "martine" pourrait peut être résoudre aussi ces autres questions.

  14. #34
    Expert Confirmé Sénior Avatar de vodiem
    Homme Profil pro Diem VO
    Vivre
    Inscrit en
    avril 2006
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Nom : Homme Diem VO
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : avril 2006
    Messages : 2 855
    Points : 4 348
    Points
    4 348

    Par défaut

    bonsoir, j'ai trouvé une facon de rendre l'embryon stable et viable.
    c'est pas beau à voir mais c'est stable et ca marche.
    ceci afin d'avoir un compteur de ligne.

    Code SQL :
    1
    2
    select t2.champ, t3.valeurIndice from (SELECT t1.champ, IndiceAuto(DCount("*","laTable"),[champ]) as li
    FROM laTable t1) t2, IndiceValeur t3 where str(t2.li)=str(t3.indice)
    à partir de :
    . la fonction embryonnaire: IndiceAuto fourni dans le post précédent ici
    . d'une table [IndiceValeur] ayant pour champs: <indice>, <valeur indice> ayant pour valeur:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    indice	valeurIndice
    1	1
    2	2
    3	3
    4	4
    5	5
    6	6
    7	7
    8	8
    9	9
    ....
    bon c'est pas terrible d'avoir une table pour ca mais il faut ce qu'il faut...
    vous remarquerez que je me suis pas foullé dans le where pour résoudre le pb de typage...

    la solus pour "martine" peut donc se faire avec des iif.
    Code SQL :
    1
    2
    3
    4
    select t2.champ, t3.valeurIndice
    from (SELECT t1.champ, IndiceAuto(DCount("*","laTable"),[champ]) as li
    FROM laTable t1) t2, IndiceValeur t3 where str(t2.li)=str(t3.indice)
    ORDER BY iif(t3.valeurIndice=4,6,iif(t3.valeurIndice=6,4,t3.valeurIndice))

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •