Problème SQL Urgent

Signaler
-
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
-
Bonjour, j'ai la table suivante :

R A CA CH TX TX_1 FORMULA RESULTAT
R1 A1 100 20 0.8 -(CA+CH)*TX
R2 A1 200 10 0.5 -(CA+CH)*TX_1


Je me prend la tête car je dois mettre à jour la colonne résultat avec l'execution de la colonne (FORMULA)

Par exemple pour la première ligne

La colonne résultat devrait être égal à :

-96

-(100+20)*0.8

-105

-(200+10)*0.5

Pour la deuxième ligne


Avez-vous une idée

Merci d'avance,

Teddy

1 réponse

Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
24
Salut,

il te faudra passer par une exécution dynamique "ligne à ligne", cad :
1 - Récupération de la ligne que l'on veut traiter
2 - Extraction de la formule (format texte)
3 - Reconstruction de la requete UPDATE en insérant la formule comme si c'était des champs de la table
4 - Exécution de la requete "UPDATE"
5 - ligne suivante

Exemple avec SQL-Server (mais tu peux faire çà dans n'importe quel language !)

/* table TEMPORAIRE de test */
CREATE TABLE #LA_TABLE 
(
_ID int identity(1,1), /*Simule une PK*/
R varchar(35), A varchar(35), CA float, CH float, TX float, TX_1 float,
FORMULA varchar(500),
RESULTAT float
);
/* Les données de test */
INSERT INTO #LA_TABLE VALUES('R1', 'A1', 100.0, 20.0, 0.8, 0.0, '-(CA+CH)*TX', null);
INSERT INTO #LA_TABLE VALUES('R2', 'A1', 200.0, 10.0, 0.0, 0.5, '-(CA+CH)*TX_1', null);


/* Boucle sur chaque ligne (SELON _ID) */
DECLARE 
@sql varchar(500),
@tmpFormule varchar(500),
@cpt int
SET @cpt = 1
WHILE @cpt <= (SELECT max(_ID) FROM #LA_TABLE)
BEGIN
/* Récupère la formule */
SELECT @tmpFormule FORMULA FROM #LA_TABLE WHERE _ID @cpt 

/* Exécute l'UPDATE de la ligne selon la formule */
SET @sql 'UPDATE #LA_TABLE SET RESULTAT '+@tmpFormule+' WHERE _ID = '+cast(@cpt as varchar)
EXECUTE( @sql );

/* Ligne suivante */
SET @cpt = @cpt + 1 
END


/* Vérif RESULTAT */
SELECT * FROM #LA_TABLE /*ici résultat contient les bonnes valeurs -96 et -105*/
DROP TABLE #LA_TABLE;


Bye...