Remplacement de valeurs pour formule de calcul [Résolu]

Signaler
Messages postés
42
Date d'inscription
lundi 14 janvier 2002
Statut
Membre
Dernière intervention
30 juin 2016
-
Messages postés
51
Date d'inscription
lundi 18 mai 2009
Statut
Membre
Dernière intervention
30 octobre 2009
-
Bonjour

J'ai deux tables Formule et SaisieValeur
La table Formule contient :
Insert Into Formule (NumFormule, LibFormule)
Values ('01', (({a}+{b})*({c}-{d})/{e}))

La table SaisieValeur contient

Insert Into SaisieValeur (NumVal, Valeur)
Values (a, 2000)
Insert Into SaisieValeur (NumVal, Valeur)
Values (b, 1000)
Insert Into SaisieValeur (NumVal, Valeur)
Values (c, 500)
Insert Into SaisieValeur (NumVal, Valeur)
Values (d, 300)
Insert Into SaisieValeur (NumVal, ValeurNumeric)
Values (e, 1500)

je voudrais un script (procedure stockée ou fonction en SQL 2005) qui me permettra de remplacer les valeurs a,b,c,d,e de la table Formule par les valeurs de la colonne ValeurNumeric la table SaisieValeur de sorte à afficher en finale ((2000+1000)*(500-300)/1500).

Merci d'avance

5 réponses

Messages postés
51
Date d'inscription
lundi 18 mai 2009
Statut
Membre
Dernière intervention
30 octobre 2009
1
De rien mon ami,

tu peux maintenant marquer ta question comme Résolue dans la liste des questions.

Bonne Casse-Tête.
Messages postés
51
Date d'inscription
lundi 18 mai 2009
Statut
Membre
Dernière intervention
30 octobre 2009
1
bonjours anspauldou;

j'ai crée une base de données spécialement pour toi !!


et j'ai crée un proc qui permet de retourner le résultat comme tu indique ci-dessus .

Script de la création des tables:

USE [Teste]
GO
/****** Objet :  Table [dbo].[Formule]    Date de génération du script : 10/27/2009 11:47:23 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Formule](
[NumFormule] [nvarchar](50) NOT NULL,
[LibFormule] [nvarchar](50) NULL,
 CONSTRAINT [PK_Formule] PRIMARY KEY CLUSTERED 
(
[NumFormule] ASC
)WITH (PAD_INDEX  OFF, STATISTICS_NORECOMPUTE  OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]



USE [Teste]
GO
/****** Objet :  Table [dbo].[SaisieValeur]    Date de génération du script : 10/27/2009 11:47:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[SaisieValeur](
[NumVal] [nvarchar](50) NOT NULL,
[Valeur] [nvarchar](50) NULL,
 CONSTRAINT [PK_SaisieValeur] PRIMARY KEY CLUSTERED 
(
[NumVal] ASC
)WITH (PAD_INDEX  OFF, STATISTICS_NORECOMPUTE  OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]


[*] Proc :
CREATE PROC GetFormule (@numFormule AS VARCHAR(2))
AS
BEGIN
DECLARE curValeur  CURSOR FOR SELECT * FROM saisieValeur
DECLARE @numValeur VARCHAR(1)
DECLARE	@valeur VARCHAR(3)

OPEN curValeur
FETCH NEXT FROM curValeur INTO @numValeur,@valeur

DECLARE @formule VARCHAR(50)
SET @formule=(SELECT LibFormule FROM formule WHERE NumFormule=@numFormule)

WHILE(@@fetch_status=0)
BEGIN
SELECT @numValeur,@valeur
DECLARE @caractere VARCHAR(1)
DECLARE @i INT
SET @i=0

WHILE(@i<len(@formule))
BEGIN
DECLARE @pos INT
SET @pos=(SELECT charindex(@numValeur ,@formule,@i))
SET @formule=isnull((SELECT STUFF(@formule,@pos, 1, @valeur)),@formule)
SET @i=@i+1
END
FETCH NEXT FROM curValeur INTO @numValeur,@valeur
END
SELECT @formule

CLOSE curValeur
DEALLOCATE curValeur
END

[*] l'exécution de proc :
EXEC Getformule '01'


Bonne Casse-tête.
Messages postés
42
Date d'inscription
lundi 14 janvier 2002
Statut
Membre
Dernière intervention
30 juin 2016

Bonjour

Je te remercie encore une fois pour ton script qui marche bien sauf qu'il y a un petit souci dans la formulation de mon problème, je souhaite avoir la formule avec les parenthèses sans les accolades '{}' autour de mes valeurs à remplacer dans mes formules exemple :

en entrée de mon paramètre de procédure : (({a}+{b})*({c}-{d})/{e})
en sortie : ((2000+1000)*(500-300)/1500)
C'est ce que je voudrai en sortie.

Merci encore une fois
Messages postés
51
Date d'inscription
lundi 18 mai 2009
Statut
Membre
Dernière intervention
30 octobre 2009
1
de rien,
alors c'est simple:

changer cette ligne de code :

SET @formule=isnull((SELECT STUFF(@formule,@pos,1, @valeur)),@formule)


par :

SET @formule=isnull((SELECT STUFF(@formule,@pos-1,3, @valeur)),@formule)


Bonne Casse-tête.
Messages postés
42
Date d'inscription
lundi 14 janvier 2002
Statut
Membre
Dernière intervention
30 juin 2016

Bonjour

Je tiens encore une fois à te remercier pour ton aide j'ai testé et ça marche à merveille.

Cordialement