Se connecter avec
S'enregistrer | Connectez-vous

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.

Autres pages sur : access requetes asp

Lassé par la pub ? Créez un compte
Expert Programmation

Tu peux faire ça avec 10 lignes, à condition que tu puisse exprimer ta formule compliquée en fonction des Cx

Mais franchement, ta base est mal foutue. Si jamais on te disait maintenant que tu n'a plus 10 Cx, mais 200 ?
Expert Programmation

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.
Ca ne viens pas ni d'access ni de MySQL, c'est un bête problème de SQL et de conception de base de donnée. Surtout que tu à un problème plus compliqué qu'il n'y parait.
FireBird a dit :
Là vous m'avancez pas du tout les gars.
Personne ne pourra te dire comment transporter une tonne avec une brouette, tout le monde te dira de changer d'outil ou de méthode.

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 ?
selon moi :
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.

ça devient plus clair. Merci Batchy.

La formule de MAXT est déjà faite en SQL.

Maintenant, vous pensez que c'est faisable directement sur Access par des requêtes SQL ou c'est mieux de créer un script qui ira interroger et mettre à jour la BD ?

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 ?

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.
Expert Programmation

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 ?
Expert Programmation

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)

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