Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/06/2011, 17h04   #1
Candidat au titre de Membre du Club
 
Inscription : septembre 2008
Messages : 29
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 29
Points : 11
Points : 11
Par défaut Trigger pour calculer une clé

Es-que il ya un exemple pour calculer une clé unique et composé a l'aide d'un trigger avant l'insertion des données

La structure de ma table ( tb_Rapport )
Rapport (IDRapport, Description)

Ma clé (IDRapport) est simple de 8 chiffres

4 chiffres pour l'année en cours + 4 chiffres Numéro auto incrémenté de 1 a 9999, et chaque année est mise a un.

Exemple clé générer

2010-9998
2010-9999
2011-0001
2011-0002
sans le '-'

Merci d'avance
mustargus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/06/2011, 19h01   #2
Membre habitué
 
Avatar de tfc3146
 
Homme Robert Labrousse
Développeur décisionnel
Inscription : février 2009
Messages : 79
Détails du profil
Informations personnelles :
Nom : Homme Robert Labrousse
Localisation : France

Informations professionnelles :
Activité : Développeur décisionnel
Secteur : Boutique - Magasin

Informations forums :
Inscription : février 2009
Messages : 79
Points : 134
Points : 134
Bonsoir,

Pourquoi ne pas utiliser comme clé un simple numéro auto incrément. Je pense que vous vous compliquez la vie.

Structure de la table : IdRapport,Année,Description
tfc3146 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2011, 07h20   #3
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 520
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 520
Points : 3 967
Points : 3 967
Citation:
Envoyé par tfc3146 Voir le message
Pourquoi ne pas utiliser comme clé un simple numéro auto incrément. Je pense que vous vous compliquez la vie.
Et histoire d'avoir l'année et plus, je rajouterais un timestamp avec la date de création de la ligne.
Structure de la table : IdRapport,Année,Description, ts datetime (valeur par défaut : getdate() )
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2011, 08h12   #4
Candidat au titre de Membre du Club
 
Inscription : septembre 2008
Messages : 29
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 29
Points : 11
Points : 11
Oui j'ai déjà pensé à cette solution, mais le problème est que les rapports sont
Ré-incrémente chaque année donc ont commence à compter de 1 chaque nouvelle année et je ne sais pas comment faire ca !!
mustargus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2011, 19h32   #5
Candidat au titre de Membre du Club
 
Inscription : septembre 2008
Messages : 29
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 29
Points : 11
Points : 11
Ok j'ai dû improviser un petit peut, l'idée que je fixe le compteur a 4 chiffres n'été pas idéal donc voici mon code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[ShowInsert] ON [dbo].[tb_Rapport]
INSTEAD OF INSERT
 
AS
 
Declare @IDNew bigint , @IDTemp bigint , @CurrentYear bigint
 
BEGIN
 
SET @CurrentYear   = Year (Getdate())
SET @IDTemp = (  SELECT ISNULL(MAX(CAST(RIGHT(CAST(IDRapport AS varchar),LEN(CAST(IDRapport AS varchar))- 4) AS bigint)),0)  
		 FROM [tb_Rapport] 
		 WHERE ( CAST(SUBSTRING(CAST(IDRapport AS varchar), 1, 4) AS bigint) =  @CurrentYear ) ) + 1
 
SET @IDNew = CAST(@CurrentYear AS varchar(04)) +  CAST(@IDTemp AS varchar)
 
INSERT INTO [tb_Rapport] (Description,IDRapport) SELECT  Description,CAST(@IDNew AS bigint) FROM INSERTED
 
END
S'il y a des erreurs faites moi savoir svp. Merci
mustargus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2011, 22h46   #6
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 954
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 954
Points : 17 774
Points : 17 774
Il suffit tout simplement d'implémenter une vue sur votre table comportant :
1) la colonne ANNEE en SMALLINT par exemple
2) la colonne incrémentée.
La vue devant présenter la renumérotation par année.

Exemple :

la table :
Code :
1
2
3
4
5
CREATE TABLE T_INCREMENT_RUPTURE_ANNNEE_IRA
(IRA_ID           INT IDENTITY NOT NULL,
 IRA_AN           SMALLINT NOT NULL DEFAULT YEAR(CURRENT_TIMESTAMP),
 IRA_DATA         VARCHAR(32),
 CONSTRAINT PK_IRA PRIMARY KEY (IRA_ID, IRA_AN));
Un jeu d'essai :
Code :
1
2
3
4
5
6
INSERT INTO T_INCREMENT_RUPTURE_ANNNEE_IRA
VALUES (2010, 'blablabla');
GO 10 
INSERT INTO T_INCREMENT_RUPTURE_ANNNEE_IRA
VALUES (2011, 'blablabla');
GO 3
La vue :
Code :
1
2
3
4
5
6
7
8
9
CREATE VIEW V_INCREMENT_RUPTURE_ANNNEE_IRA
AS
SELECT CAST(IRA_AN AS CHAR(4)) * POWER(10, 5) + 
       1 + IRA_ID - (SELECT MIN(IRA_ID) 
                     FROM   T_INCREMENT_RUPTURE_ANNNEE_IRA AS Tin 
                     WHERE  Tin.IRA_AN = Tout.IRA_AN) AS CLEF,
       IRA_DATA
FROM   T_INCREMENT_RUPTURE_ANNNEE_IRA AS Tout;
GO
La requête :
Code :
1
2
SELECT *
FROM   V_INCREMENT_RUPTURE_ANNNEE_IRA
Le résultat :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CLEF        IRA_DATA
----------- --------------------------------
201000001   blablabla
201000002   blablabla
201000003   blablabla
201000004   blablabla
201000005   blablabla
201000006   blablabla
201000007   blablabla
201000008   blablabla
201000009   blablabla
201000010   blablabla
201100001   blablabla
201100002   blablabla
201100003   blablabla
Dans la vue, POWER(10, 5) le 5 est le paramètre du nombre de position de la clef auto-incrémentée.
Si vous dépasser 5, pensez à caster la clef en BIGINT.

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 06h11   #7
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Bonjour,

On peut aussi faire une table très simple :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE annee_rapport
(
	annee smallint NOT NULL CONSTRAINT PKannee_rapport PRIMARY KEY
	, indice_rapport int NOT NULL
)
GO
 
ALTER TABLE annee_rapport
ADD CONSTRAINT CHK_annee_rapport__indice_apport CHECK(indice_rapport BETWEEN 0 AND 10000)
GO
 
ALTER TABLE annee_rapport
ADD CONSTRAINT DF_annee_rapport__indice_rapport DEFAULT 0 FOR indice_rapport
GO
Et écrire la procédure stockée suivante :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
ALTER PROCEDURE ps_rapport_ajoute
	@indice int = NULL OUTPUT 
AS
BEGIN
	SET NOCOUNT ON
 
	DECLARE @annee_courante smallint
	SELECT	@annee_courante = DATEPART(year, GETDATE())
 
	IF NOT EXISTS
	(
		SELECT	*
		FROM	dbo.annee_rapport
		WHERE	annee = @annee_courante
	)
	BEGIN
		INSERT INTO dbo.annee_rapport (annee)
		VALUES (@annee_courante)
	END
 
	UPDATE	dbo.annee_rapport
	SET	@indice = indice_rapport = indice_rapport + 1
	WHERE	annee = @annee_courante
 
	SELECT	@indice = CAST(CAST(@annee_courante AS char(4)) + REPLICATE('0', 5 - LEN(@indice)) AS int) + CAST(@indice AS varchar(5))
END
GO
Utilisation :

Code :
1
2
3
4
5
DECLARE @annee_indice int
 
EXEC	dbo.ps_rapport_ajoute @indice = @annee_indice OUTPUT
 
SELECT	@annee_indice
@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 08h40   #8
Candidat au titre de Membre du Club
 
Inscription : septembre 2008
Messages : 29
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 29
Points : 11
Points : 11
Merci beaucoup
mustargus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 09h09   #9
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
Aller une autre (si vous êtes en version 2005 ou plus) :

Code :
1
2
3
4
5
6
7
8
CREATE VIEW V_INCREMENT_RUPTURE_ANNNEE_IRA_2
AS
SELECT 
 CAST(IRA_AN AS CHAR(4)) + '-' 
 + LEFT('000', 4 - LEN(CAST(ROW_NUMBER() OVER (PARTITION BY IRA_AN ORDER BY IRA_ID) AS VARCHAR(4)))) 
 + CAST(ROW_NUMBER() OVER (PARTITION BY IRA_AN ORDER BY IRA_ID) AS VARCHAR(4)) AS CLEF,
 IRA_DATA
FROM T_INCREMENT_RUPTURE_ANNNEE_IRA
++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 11h14   #10
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 433
Points : 10 433
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
La même que mikedavem en plus court :
Code :
1
2
3
SELECT IRA_AN * 1e4 + ROW_NUMBER() OVER (PARTITION BY IRA_AN ORDER BY IRA_ID ASC) AS CLEF,
       IRA_DATA
  FROM dbo.T_INCREMENT_RUPTURE_ANNNEE_IRA
Edit : le '-' n'est pas à écrire dans la clef.
__________________
Email : http://scr.im/waldar
Waldar est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h42.


 
 
 
 
Partenaires

Hébergement Web