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

anspauldou 42 Messages postés lundi 14 janvier 2002Date d'inscription 30 juin 2016 Dernière intervention - 24 oct. 2009 à 13:38 - Dernière réponse : Marroubi 51 Messages postés lundi 18 mai 2009Date d'inscription 30 octobre 2009 Dernière intervention
- 30 oct. 2009 à 10:45
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
Afficher la suite 

5 réponses

Répondre au sujet
Marroubi 51 Messages postés lundi 18 mai 2009Date d'inscription 30 octobre 2009 Dernière intervention - 30 oct. 2009 à 10:45
+3
Utile
De rien mon ami,

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

Bonne Casse-Tête.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Marroubi
Marroubi 51 Messages postés lundi 18 mai 2009Date d'inscription 30 octobre 2009 Dernière intervention - 27 oct. 2009 à 12:55
0
Utile
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.
Commenter la réponse de Marroubi
anspauldou 42 Messages postés lundi 14 janvier 2002Date d'inscription 30 juin 2016 Dernière intervention - 28 oct. 2009 à 12:35
0
Utile
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
Commenter la réponse de anspauldou
Marroubi 51 Messages postés lundi 18 mai 2009Date d'inscription 30 octobre 2009 Dernière intervention - 28 oct. 2009 à 12:58
0
Utile
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.
Commenter la réponse de Marroubi
anspauldou 42 Messages postés lundi 14 janvier 2002Date d'inscription 30 juin 2016 Dernière intervention - 30 oct. 2009 à 10:40
0
Utile
Bonjour

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

Cordialement
Commenter la réponse de anspauldou

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.