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![]()
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![]()
Si TOUS les coups sont permis...tous les coups sont permis!
même les tordus à partir du moment que ca marche.![]()
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ALTER TABLE table DROP COLUMN n
Code : Sélectionner tout - Visualiser dans une fenêtre à part ALTER TABLE table ADD COLUMN n COUNTER
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT table.*, iif([n]=4,6,iif([n]=6,4,[n])) As NewOrder FROM table ORDER BY NewOrder
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:
et en fait qu'une seul.Envoyé par defi
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:
j'imaginais moi une fonction IndiceAuto() qui pourrait s'utiliser comme ca:Envoyé par Maxence HUBICHE
(j'ai biensur des paramètres dans IndiceAuto car il est difficile de s'en passer).
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT laTable.champ, IndiceAuto() as indice FROM laTable
à défaut de trouver du 100% sql.
ce qui donne dans la solus de Maxence pour ce pb:
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
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?
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:
avec le sql:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
comme c'est un embryon: on touche qu'avec les yeux...
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT laTable.champ, IndiceAuto(DCount("*","laTable"),[champ]) AS Indice FROM laTable;
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part monIndice=empty
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:
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT TABLE.* FROM TABLE ORDER BY iif(IndiceAuto()=4,6,iif(IndiceAuto()=6,4,IndiceAuto())))
avec pour fonction:
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT t1.champ FROM laTable AS t1 ORDER BY IndiceAutolaTable(DCount("*","laTable"),[champ]);
vous remarquerez que [champ]=v dans la fonction ne sert à rien que de déclencher la fonction.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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 ?![]()
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.![]()
Assistant de création/modification de rubans Office
Utilisez en VBA les librairies graphiques GDI, GDI+ et openGL
Blog Office Mon Site DVP
Nope !
On n'a pas le droit de mettre du VBA, puisue la solution VBA a été rejetée !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 !)
,
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:
les règles n'ont pas évoluées, je rappel le défi c'est toujours:Envoyé par vodiem
et pour arriver à répondre à cette question il faut pouvoir énumérer les enregitrements.je voudrais une requete qui me permute le 6ème enregistrement avec le 4ème à partir de cette table
s'il n'est pas difficile de mettre en paramètre, je répondais à la solus de random qui n'était pas souple.Envoyé par Arkham46
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.
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.Envoyé par Arkham46
oui, tu as raison. j'admets en procédure stockée, ok.Envoyé par Maxence HUBICHE
mais je n'ai pas dis que tu n'avais pas une solution seulement je remarquais les quelques restrictions.
Bon, alors, si on a le droit de faire des fonctions en VBA...
C'est plus facile !
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
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 : Sélectionner tout - Visualiser dans une fenêtre à part SELECT Nom FROM Table1 ORDER BY permuter(4,6,[nom],"Nom","Table1");
Bjr,
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)
Assistant de création/modification de rubans Office
Utilisez en VBA les librairies graphiques GDI, GDI+ et openGL
Blog Office Mon Site DVP
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...
![]()
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 ?
Maxence Hubiche>
je ne pensais pas que c'était difficile, d'ailleur je pensais et je pense qu'il doit y avoir plusieurs solus à ce pb.Envoyé par Maxence Hubiche
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)
avec:
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part SELECT champ FROM laTable ORDER BY permuter(4,6,[champ],"laTable")
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)
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
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
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.![]()
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.
à partir de :
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
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)
. 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:
bon c'est pas terrible d'avoir une table pour ca
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 ....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 : Sélectionner tout - Visualiser dans une fenêtre à part
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))
Je suis tombé sur ce fil totalement par hasard, donc désolé si je le relève d'entre les profondeurs de l'oubli.
Si on peut tricher au point d'utiliser ADP (donc SQL Server), on peut passer par une CTE
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 WITH c AS ( SELECT CASE ROW_NUMBER() OVER (ORDER BY (SELECT 1)) WHEN 4 THEN 6 WHEN 6 THEN 4 ELSE ROW_NUMBER() OVER (ORDER BY (SELECT 1)) END AS numligne, nom FROM latable ) SELECT nom FROM c ORDER BY numligne
Yvan
Une solution n'est valable que dans un contexte donné
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager