Access DB - requêtes et ASP
Dernière réponse : dans Programmation
Salut tout le monde,
Tout d'abord je suis newbie en Access et ASP mais je demande d'abord juste pour la faisabilité.
J'ai une table d'un BD Access avec une colonne MAXT (integer) et une dizaine de colonne C0 à C9 (pour simplifier) qui sont des integer également.
MAXT n'est pas un max au sens mathématiques des valeurs de C0 à C9 mais calculé avec une fonction spéciale très compliquée.
J'ai à peu près 3000 lignes. Oui ça fait pas mal.
Ce que je voudrais faire c'est détecter si un Cx (x=0,1...9) ou deux ont comme valeur plus que la moitié de MAXT et dans ce cas mettre leur valeur à zéro (i.e. les Cx concernés) et mettre à jour MAXT.
C'est possible à avoir ça directement dans Access ou il faut écrire un script ASP, PHP ou autre ?
Tout aide est la bienvenue.
Merci infiniment.
Tout d'abord je suis newbie en Access et ASP mais je demande d'abord juste pour la faisabilité.
J'ai une table d'un BD Access avec une colonne MAXT (integer) et une dizaine de colonne C0 à C9 (pour simplifier) qui sont des integer également.
MAXT n'est pas un max au sens mathématiques des valeurs de C0 à C9 mais calculé avec une fonction spéciale très compliquée.
J'ai à peu près 3000 lignes. Oui ça fait pas mal.
Ce que je voudrais faire c'est détecter si un Cx (x=0,1...9) ou deux ont comme valeur plus que la moitié de MAXT et dans ce cas mettre leur valeur à zéro (i.e. les Cx concernés) et mettre à jour MAXT.
C'est possible à avoir ça directement dans Access ou il faut écrire un script ASP, PHP ou autre ?
Tout aide est la bienvenue.
Merci infiniment.
Autres pages sur : access requetes asp
Lassé par la pub ? Créez un compte
zeb a dit :
C'est très faisable, même sans connaître la formule, pourvu que MAXT soit enregistré.Citation :
Ce que je voudrais faire c'est détecter si un Cx (x=0,1...9) ou deux ont comme valeur plus que la moitié de MAXT et dans ce cas mettre leur valeur à zéro (i.e. les Cx concernés) et mettre à jour MAXT.En y pensant, 10 requettes ne suffiront peut être pas. En mettant à jour MAXT, on pourrait faire remplir la condition à d'autres Cx ... Tout dépend de la formule, mais dans le pire des cas, il faudra faire 10 passes. donc 100 requettes maximum ...
FireBird a dit :
C'est pas moi qui ai conçu la BD, sinon je l'aurais fait en MySQL.FireBird a dit :
Là vous m'avancez pas du tout les gars.Je vois bien une méthode crade pour remplacer 10 requêtes par deux ou une, à condition qu'access supporte un opérateur ternaire ou autre, et que ta formule puisse être éxprimée en SQL.
FireBird a dit :
Comment je pourrais faire ?Créer deux tables : la premiere contient un maxt et une clef primaire par ligne,
la deuxième contient une clef secondaire, x et Cx.
Ensuite, mettre les bon Cx à zero est bien facile :
update tablecx set cx=0 where cx > (select maxt/2 from tablemaxt where tablecx.key == tablemaxt.key);
Ensuite pour la formule, il faudrai déjà la voir avant de savoir si elle est transposable en SQL.
Si j'ai bien compris c'est plutot :
update tablecx set cx=0 where cx > maxt/2;
où x (0,9)
pour tout faire en sql (si ton calcul est faisable en sql) je ferrai :
H1 : j'invente un calcul vue que je ne sais pas ce qu'est ton calcul
H2: prenons la ligne qui gère c1
update tablecx set maxt=c2/c4+2*c3, c1=0 where c1 > maxt/2;
edit : pour définir où mettre ces bouts de code il faut savoir quand tu veux lancer cela :
- toutes les X secondes/minutes
- a chaque mises a jour de ta table
- sur une action (click sur une page o autre)
Qu'est ce qui met à jour cette table ?
update tablecx set cx=0 where cx > maxt/2;
où x (0,9)
pour tout faire en sql (si ton calcul est faisable en sql) je ferrai :
H1 : j'invente un calcul vue que je ne sais pas ce qu'est ton calcul
H2: prenons la ligne qui gère c1
update tablecx set maxt=c2/c4+2*c3, c1=0 where c1 > maxt/2;
edit : pour définir où mettre ces bouts de code il faut savoir quand tu veux lancer cela :
- toutes les X secondes/minutes
- a chaque mises a jour de ta table
- sur une action (click sur une page o autre)
Qu'est ce qui met à jour cette table ?
Non non, les Cx ne sont pas des tables mais des colonnes appartenant à la même table que MAXT
Id C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 MAXT
00001 12 4 7 5 1 0 0 2 2 3 13
00002 1 0 2 1 1 2 0 2 1 3 7
etc...jusqu'à Id = 2980
les Id sont les identifiants (unique)
Pour Id = 00001, il y a C0 et C2 qui ont plus de la moitié de MAXT=13 (12 > 6.5 et 7 > 6.5)
mais pour Id=00002 aucun Cx n'a de valeur > à 7/2 = 3.5
Donc il faut juste mettre à jour Id=00001 en mettant à zéro C0 et C2 et recalculant MAXT
Id C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 MAXT
00001 0 4 0 5 1 0 0 2 2 3 NewMAXT
00002 1 0 2 1 1 2 0 2 1 3 7
voilà l'exemple.
Id C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 MAXT
00001 12 4 7 5 1 0 0 2 2 3 13
00002 1 0 2 1 1 2 0 2 1 3 7
etc...jusqu'à Id = 2980
les Id sont les identifiants (unique)
Pour Id = 00001, il y a C0 et C2 qui ont plus de la moitié de MAXT=13 (12 > 6.5 et 7 > 6.5)
mais pour Id=00002 aucun Cx n'a de valeur > à 7/2 = 3.5
Donc il faut juste mettre à jour Id=00001 en mettant à zéro C0 et C2 et recalculant MAXT
Id C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 MAXT
00001 0 4 0 5 1 0 0 2 2 3 NewMAXT
00002 1 0 2 1 1 2 0 2 1 3 7
voilà l'exemple.
Si par exemple on met C0 à 0 puis on recalcule MaxT, est ce que C2 sera encore supérieur à Maxt/2 ? Est-ce pareil si on commence par C2 ?
Est ce que le cas de bouclage peut arriver ? (par exemple, est ce que NewMAXT /2 est t'il plus petit que 5) ?
Est ce que MAXT est nul si tout les Cx sont égal à 0 ?
Est ce que le cas de bouclage peut arriver ? (par exemple, est ce que NewMAXT /2 est t'il plus petit que 5) ?
Est ce que MAXT est nul si tout les Cx sont égal à 0 ?
batchy=> CREATE TABLE tablemaxt (key INTEGER, maxt FLOAT, PRIMARY KEY(key));
NOTICE: CREATE TABLE / PRIMARY KEY créera un index implicite « tablemaxt_pkey » pour la table « tablemaxt »
CREATE TABLE
batchy=> CREATE TABLE tablecx (key INTEGER, x INTEGER, cx FLOAT, FOREIGN KEY(key) REFERENCES tablemaxt(key));
CREATE TABLE
batchy=> INSERT INTO tablemaxt (key, maxt) VALUES (1,13), (2,7);
INSERT 0 2
-- juste pour réference : ",".join(["(1,%d,%d)"%(x,cx) for x,cx in enumerate([int(a) for a in "12 4 7 5 1 0 0 2 2 3".split(" ")])])
batchy=> INSERT INTO tablecx (key, x, cx) VALUES (1,0,12),(1,1,4),(1,2,7),(1,3,5),(1,4,1),(1,5,0),(1,6,0),(1,7,2),(1,8,2),(1,9,3),(2,0,1),(2,1,0),(2,2,2),(2,3,1),(2,4,1),(2,5,2),(2,6,0),(2,7,2),(2,8,1),(2,9,3);
INSERT 0 20
batchy=> select x,cx from tablemaxt NATURAL JOIN tablecx where cx > maxt/2;
x | cx
---+----
0 | 12
2 | 7
batchy=> update tablecx set cx=0 where cx > (select maxt/2 from tablemaxt where tablecx.key = tablemaxt.key);
UPDATE 2
batchy=> select x,cx from tablemaxt NATURAL JOIN tablecx where cx > maxt/2;
x | cx
---+----
(0 lignes)
batchy=> select x,cx from tablecx WHERE key = 1 ORDER BY x;
x | cx
---+----
0 | 0
1 | 4
2 | 0
3 | 5
4 | 1
5 | 0
6 | 0
7 | 2
8 | 2
9 | 3
(10 lignes)
NOTICE: CREATE TABLE / PRIMARY KEY créera un index implicite « tablemaxt_pkey » pour la table « tablemaxt »
CREATE TABLE
batchy=> CREATE TABLE tablecx (key INTEGER, x INTEGER, cx FLOAT, FOREIGN KEY(key) REFERENCES tablemaxt(key));
CREATE TABLE
batchy=> INSERT INTO tablemaxt (key, maxt) VALUES (1,13), (2,7);
INSERT 0 2
-- juste pour réference : ",".join(["(1,%d,%d)"%(x,cx) for x,cx in enumerate([int(a) for a in "12 4 7 5 1 0 0 2 2 3".split(" ")])])
batchy=> INSERT INTO tablecx (key, x, cx) VALUES (1,0,12),(1,1,4),(1,2,7),(1,3,5),(1,4,1),(1,5,0),(1,6,0),(1,7,2),(1,8,2),(1,9,3),(2,0,1),(2,1,0),(2,2,2),(2,3,1),(2,4,1),(2,5,2),(2,6,0),(2,7,2),(2,8,1),(2,9,3);
INSERT 0 20
batchy=> select x,cx from tablemaxt NATURAL JOIN tablecx where cx > maxt/2;
x | cx
---+----
0 | 12
2 | 7
batchy=> update tablecx set cx=0 where cx > (select maxt/2 from tablemaxt where tablecx.key = tablemaxt.key);
UPDATE 2
batchy=> select x,cx from tablemaxt NATURAL JOIN tablecx where cx > maxt/2;
x | cx
---+----
(0 lignes)
batchy=> select x,cx from tablecx WHERE key = 1 ORDER BY x;
x | cx
---+----
0 | 0
1 | 4
2 | 0
3 | 5
4 | 1
5 | 0
6 | 0
7 | 2
8 | 2
9 | 3
(10 lignes)
Après, pour refaire maxt, faut ésperer que ce n'est pas trop lourd à faire calculer, parce que tel que je l'ai fait, faudra le recaculer pour toutes les lignes ....
Citation :
Non non, les Cx ne sont pas des tables mais des colonnes appartenant à la même table que MAXT Oui c'est bien le cas dans mon exemple, je ne comprend pas ton problème avec ma solution ?
tu dois faire :
update tablecx set maxt=TONCALCUL, c0=0 where c0 > maxt/2;
update tablecx set maxt=TONCALCUL, c1=0 where c1 > maxt/2;
update tablecx set maxt=TONCALCUL, c2=0 where c2 > maxt/2;
update tablecx set maxt=TONCALCUL, c3=0 where c3 > maxt/2;
update tablecx set maxt=TONCALCUL, c4=0 where c4 > maxt/2;
update tablecx set maxt=TONCALCUL, c5=0 where c5 > maxt/2;
update tablecx set maxt=TONCALCUL, c6=0 where c6 > maxt/2;
update tablecx set maxt=TONCALCUL, c7=0 where c7 > maxt/2;
update tablecx set maxt=TONCALCUL, c8=0 where c8 > maxt/2;
update tablecx set maxt=TONCALCUL, c9=0 where c9 > maxt/2;
Cela traite l'ensemble des données en tenant compte uniquement des colones contenant des 0 et recalcul ton maxt.
L'exemple de batchy est sur 2 tables différentes si je comprends bien ta structure tu as une seule table avec les 10 colones + colones maxt + autres colones ...
Ensuite pour où mettre ce code il faut que tu répondes à :
Citation :
pour définir où mettre ces bouts de code il faut savoir quand tu veux lancer cela :
- toutes les X secondes/minutes
- a chaque mises a jour de ta table
- sur une action (click sur une page o autre)
Lassé par la pub ? Créez un compte
- Contenus similaires :
- ForumRequete access
- ForumSelection date formulaire requete access
- ForumCritères pour requête Access 2003
- ForumAccess : Lié un module à une requête
- ForumAccess : Requête SQL, fonction SYSDATE
- Forum[access]requete selection a partir d'un formulaire
- ForumREQUETTE ACCESS SUR DEUX FICHIERS POUR AVOIR LES ELEMENTS DIFFERENTS
- Forummettre une variable dans une requête access 2003
- ForumMS Access: lien entre une requete et un formulaire
- Voir plus