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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 010
    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 010
    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/ * * * * *

+ 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, 11h29
  2. trigger pour tester une clé primaire
    Par keumlebarbare dans le forum PL/SQL
    Réponses: 3
    Dernier message: 15/04/2007, 10h29
  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, 17h00
  4. Réponses: 1
    Dernier message: 22/02/2006, 09h02
  5. Trigger pour faire une table "mirroir"
    Par lgomez dans le forum Oracle
    Réponses: 8
    Dernier message: 26/10/2005, 13h12

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