|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre du Club
![]() Inscription : novembre 2006 Messages : 219 ![]() |
Bonjour,
Soit la table suivante: Code :
Cette table me permet de garder en mémoire l'entête d'une entrée en stock d'articles. La colonne [RefEntree] doit se présenter suivant le format: "AAAA-MM-CompteurMois-CompteurAnnee" AAAA: Répresentera l'année en cours (Ex.: 2011) MM: Représentera mois (Ex.: 01, 10, 12, .etc) de l'année en cours CompteurMois: Représentera le nombre d'entrée faite dans le mois MM de l'annee AAAA CompteurAnnee: Représentera le nombre d'entrée faite dans l'année AAAA. CompteurMois & CompteurAnnee doit pouvoir s'incrémenter lors d'un nouveau ajout dans la table suivant le mois MM & l'année AAAA. CompteurMois est un entier à 4 caractères CompteurAnnee à 5 caractères Je reste à l'écoute pour des propositions, suggestions de triggers permettrant de prendre cela en compte. NB: [RefEntree] est unique dans la table et: AAAA et MM provient de la date que nous aurons à saisir dans la colonne: [DateEntree] |
||
|
|
00
|
|
|
#2 |
|
Membre chevronné
![]() Analyste - Programmeur Inscription : mai 2006 Messages : 712 ![]() |
Pourquoi ne pas avoir un champ compteurmois et compteurannée dans cette table ?
__________________
Aucune aide par MP, utilisez le forum. |
|
|
00
|
|
|
#3 | ||||||||||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Bonjour,
Il y a 3 erreurs : - toute valeur stockée dans une colonne doit être atomique (première forme normale), or ce n'est pas votre cas - vous stockez des valeurs numériques dans une colonne dont le type permet de stocker des chaînes de caractère, ce qui n'a aucun sens - vos stockez des valeurs qui ne contiennent pas de caractères non latins dans une colonne dont le type (nchar) est conçu pour cela. L'embêtant c'est qu'au lieu de consommer un octet par caractère en char (qui utilise ASCII) vous en utilisez deux en nchar (qui utilise Unicode). Résoudre la première erreur élimine les deux autres. En fait, c'est une erreur de modélisation : il vaudrait mieux que vous ayez une table qui gère votre séquence, et référencer celle-ci par une contrainte d'intégrité dans la table ENTREE. En faisant cela, vous évitez le trigger, qui rallonge la durée de la transaction, donc diminue la concurrence d'accès à la table ENTREE. D'autre part la valeur du compteur par an n'a pas d'utilité (à priori), puisque c'est la somme des compteurs des mois d'une année particulière. Voici donc pour la table : Code :
Et la procédure stockée : Code :
Code :
Au final, il vous faut changer le type de la colonne RefEntree en int : Code :
Ensuite mettre la colonne non-NULLable et mettre la référence d'intégrité : Code :
__________________
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 |
||||||||||
|
00
|
|
|
#4 | |
|
Membre Expert
![]() |
Citation:
Mais ça n’empêche pas que je suis 100% d'accord avec toi sur la dangerosité de ces pratiques fourre tout.
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
|
00
|
|
|
#5 |
|
Membre du Club
![]() Inscription : novembre 2006 Messages : 219 ![]() |
Bonjour à tous,
Merci pour votre critique, cela m'a fait du bien.
|
|
|
00
|
|
|
#6 | |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Citation:
En ce sens je me suis trompé de forme normale : c'est la seconde Mais bon, je sais que je prêche un convaincu @++
__________________
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 |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com