IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Trigger pour calculer une clé


Sujet :

MS SQL Server

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Septembre 2008
    Messages : 31
    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

  2. #2
    Membre éprouvé Avatar de tfc3146
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2009
    Messages : 79
    Par défaut
    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

  3. #3
    Invité
    Invité(e)
    Par défaut
    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() )

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Septembre 2008
    Messages : 31
    Par défaut
    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 !!

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Septembre 2008
    Messages : 31
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 009
    Billets dans le blog
    6
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT *
    FROM   V_INCREMENT_RUPTURE_ANNNEE_IRA
    Le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    On peut aussi faire une table très simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DECLARE @annee_indice int
     
    EXEC	dbo.ps_rapport_ajoute @indice = @annee_indice OUTPUT
     
    SELECT	@annee_indice
    @++

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Septembre 2008
    Messages : 31
    Par défaut
    Merci beaucoup

  9. #9
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Aller une autre (si vous êtes en version 2005 ou plus) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    ++

  10. #10
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    La même que mikedavem en plus court :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. RK4 pour calculer une fonction P(x,t)!
    Par driss80 dans le forum Fortran
    Réponses: 6
    Dernier message: 14/04/2009, 12h29
  2. trigger pour tester une clé primaire
    Par keumlebarbare dans le forum PL/SQL
    Réponses: 3
    Dernier message: 15/04/2007, 11h29
  3. [MySQL] Aide pour calculer une durée
    Par Sandara dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 19/06/2006, 18h00
  4. Réponses: 1
    Dernier message: 22/02/2006, 10h02
  5. Trigger pour faire une table "mirroir"
    Par lgomez dans le forum Oracle
    Réponses: 8
    Dernier message: 26/10/2005, 14h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo