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

Développement SQL Server Discussion :

Générer un code à barre


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 241
    Par défaut Générer un code à barre
    Bonjour tout le monde,
    voilà j'ai fait ce code a fin de générer un code à barre comme suit:
    (uncodefournisseur(3caract))(année(2cartct))(type(1caract)(autoincrémnte(5caract))
    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
    ALTER PROCEDURE [dbo].[Hb_Set_Card_Code] 
    	-- Add the parameters for the stored procedure here
    	@Type nvarchar(50)
    AS
    BEGIN
    DECLARE @Max_Id_Carte nvarchar(50);
    DECLARE @Initial_Code nvarchar(50);
    DECLARE @Code_Client nvarchar(50);
    DECLARE @Year nvarchar(50);
    SELECT @Code_Client = PAR_Value FROM dbo.Hb_Parms WHERE PAR_Libelle ='Code client'
    SELECT @Max_Id_Carte =CONVERT(nvarchar(50),MAX(CAR_Id)) FROM Hb_Cartes;
    SELECT @Year = SUBSTRING(CONVERT( nvarchar(50),DATEPART(year, ANU_DateD)),2,4) FROM dbo.Hb_AnneesUniversitaire;
    SET @Initial_Code =@Code_Client+@Year+@Type+@Max_Id_Carte;
    UPDATE dbo.Hb_Temp_Cartes SET Code_Carte = @Initial_Code WHERE Code_Carte IS NULL;
    END
    mais j'arrive pas à générer l’auto incrémente une idée s'il vous plait ?
    Merci

  2. #2
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Je vois que votre code fait 11 caractères. Plus une clé de 2 caractères, ça ferait un code EAN13.
    => Faite attention, car ce type de code barre est normalisé, essayez dans la mesure du possible de vous y conformer.

    Ensuite, pour faire un auto-incrément avec SQL Server, pas 36 solutions en l'absence d'objets séquence : il faut créer une table de compteurs, et une procédure stockée qui permet de lire et incrémenter une ligne de cette table en faisant un lock exclusif sur la ligne (pour éviter que deux transactions concurrentes ne retourne le même incrément).

    Vous pouvez aussi travailler avec une variable en mémoire, mais ça posera problème en cas de redémarrage de la base et au niveau des accès concurrents.

    Si SQLpro passe par là, il aura peut-être une solution plus propre à vous proposer.

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 241
    Par défaut
    Bonjour StringBuilder,
    Merci pour votre réponse je vais la tester immédiatement

  4. #4
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Voici un exemple d'une telle table de compteur :
    Code sql : 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    drop procedure getNext;
     
    drop table compteur;
     
    create table compteur
    (
    	cpt_id int identity(1, 1) not null primary key,
    	cpt_code varchar(5) not null,
    	cpt_minimum int not null,
    	cpt_maximum int not null,
    	cpt_increment int not null,
    	cpt_boucle bit not null,
    	cpt_valeur int not null
    );
     
    create unique index uix_compteur_code on compteur(cpt_code);
     
    insert into compteur (cpt_code, cpt_minimum, cpt_maximum, cpt_increment, cpt_boucle, cpt_valeur) values ('CDE', 1, 3, 1, 0, 0);
     
    go
     
    create procedure getNext
    	@code as varchar(6),
    	@next as int output
    as
    declare @id		int;
    declare @min	int;
    declare @max	int;
    declare @inc	int;
    declare @boucle	bit;
    declare @val	int;
     
    select @next = null;
     
    begin transaction lock;
     
    select @id = cpt_id, @min = cpt_minimum, @max = cpt_maximum, @inc = cpt_increment, @boucle = cpt_boucle, @val = cpt_valeur
    from compteur with (holdlock, rowlock)
    where cpt_code = @code;
    if @id is null
    begin
    		rollback transaction lock;
    		raiserror('Le compteur %s n''existe pas !', 10, 1, @code);
    		return;
    end;
     
    if @val = @max
    begin
    	if @boucle = 0
    	begin
    		rollback transaction lock;
    		raiserror('Dépassement de l''index du compteur %s', 10, 1, @code);
    		return;
    	end;
    	else
    	begin
    		select @next = @min;
    	end;
    end;
    else
    begin
    	select @next = @val + @inc;
    end;
     
    update compteur
    set cpt_valeur = @next
    where cpt_id = @id;
     
    commit transaction lock;
     
    go
     
    begin
    declare @cpt int;
     
    exec getNext 'CDE', @cpt output;
     
    print 'Compteur CDE = ' + cast(@cpt as varchar);
     
    exec getNext 'CDE', @cpt output;
     
    print 'Compteur CDE = ' + cast(@cpt as varchar);
     
    exec getNext 'CDE', @cpt output;
     
    print 'Compteur CDE = ' + cast(@cpt as varchar);
     
    exec getNext 'CDE', @cpt output;
     
    print 'Compteur CDE = ' + cast(@cpt as varchar);
     
    end;
    /*
    select *
    from compteur;
    */

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 241
    Par défaut
    StringBuilder ça marche nickel

  6. #6
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Je viens de voir une broutille dans mon code, si l'incrément n'est pas de 1, le test sur la borne supérieure n'est pas bon.

    Ligne 48 :

    Devient :


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

Discussions similaires

  1. Générer des codes barre EAN-13
    Par nico62370 dans le forum VBA Access
    Réponses: 4
    Dernier message: 03/06/2014, 11h17
  2. [PHP 4] Générer un code barre 2d PDF417
    Par moumoune_11 dans le forum Langage
    Réponses: 4
    Dernier message: 11/03/2009, 20h43
  3. Réponses: 2
    Dernier message: 19/02/2008, 22h55
  4. Comment générer un code barre 2D ?
    Par topben dans le forum Composants VCL
    Réponses: 2
    Dernier message: 23/01/2008, 18h52
  5. [GD] Générer un code barre 128
    Par fast462 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 12/01/2008, 19h42

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