Bonjour à tous,
Je cherche un moyen de répartir une valeur sur plusieurs enregistrements au prorata de chaque ligne.
Par exemple : J'ai une commande qui comporte des lignes, chaque ligne possède une valeur. Quand j'ai des frais de ports associés à la commande, je veux les répartir au prorata du montant de chaque ligne.
Je souhaite également être certain de ne pas perdre un centime en route lors de la répartition.
Je sais le faire en SQL, mais je voudrais fédérer mon code à un seul endroit.
J'ai donc créé le type SQL suivant :
J'ai ensuite créé une fonction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 CREATE TYPE [dbo].[ClefValeur] AS TABLE( [Clef] [varchar](max) NULL, [Valeur] [numeric](19, 8) NULL)
Ma fonction fonctionne correctement lorsque je l'utilise comme ci dessous :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 CREATE FUNCTION [GPSQL].[test_prorata] (@ListeClefValeur ClefValeur READONLY, @ValeurARepartir numeric(19,8), @NbChiffreArrondi int) RETURNS @Resultat TABLE (Clef varchar(max), valeur numeric(19,8), ValeurRepartie numeric(19,8))
Afin d'éviter cet INSERT, j'ai tenté la requête suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 DECLARE @x ClefValeur INSERT INTO @x SELECT 'A', 1.5 INSERT INTO @x SELECT 'B', 3.5 SELECT * FROM [GPSQL].[test_prorata] (@x , 0.111, 2)
ça ne fonctionne pas. Je comprends bien les origines possibles du problème :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 ;WITH Liste AS ( SELECT 'A' as Clef, 1.5 as Valeur UNION ALL SELECT 'B' As Clef, 3.5 as Valeur ) --SELECT * from Liste , Repartition as ( SELECT * FROM [GPSQL].[test_prorata] (Liste, 10, 2) ) select * from Repartition
- Liste n'est pas une variable
- Liste n'est pas du type attendu.
Le message d'erreur SQL est "Nom de colonne non valide*: 'Liste'."
Pensez vous que je peux aboutir sur cette piste ?
Il y a peut être une autre idée à explorer ?
Merci d'avance
Partager