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 :

AUTO-Incrémentation de données de table avec ordre précis


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juin 2014
    Messages : 21
    Par défaut AUTO-Incrémentation de données de table avec ordre précis
    Bonsoir à tous et à toutes, cela fait 2 jours que je suis sur un problème que je n'arrive pas à résoudre et je me suis finalement résolu à vous demander un petit peu d'aide face à la bête

    Je vais essayer d'expliquer en étant le plus concis possible :

    Je possède une table avec 4 Colonnes qui sont : Id | état | numéro | version ;
    table temporaire que j'ai crée pour faciliter la lisibilité de mes table pour ma procédure.

    Le numéro et la version se trouve dans une table annexe qui est : dbo.devis_facture
    L’état se trouve dans une table annexe : dbo.etat_devis_facture
    L'Id est présent dans les deux tables.

    l'id est unique pour chaque version, numéro ou état d'un devis.
    le numéro est global pour toutes les versions et état des devis d'un client
    la version est unique pour chaque numéro d'un devis.
    l'état quand à lui est unique pour chaque version d'un devis.

    En gros j'ai un numéro de devis qui se compose en plusieurs versions qui se composent en plusieurs états et tout ça est inscrit par un ID diffèrent.

    Mon problème est que pour chaque état je dois faire en sorte que les états des précédentes versions s'accumulent par ID pour pouvoir y avoir accès.

    Un exemple : Le numéro du client est 12
    Pour le moment, j'ai un numéro 12 comportant 4 versions (1-2-3-4) La version 1 comporte 2 états, (Ce qui nous donne 1 ID par version soit 2 ID (Admettons 20-21)) Si je passe à la version 2 de ce numéro, L'ID sera 22, et pour l'ID 22 je n'aurai plus accès qu'à son état 1 de la version 2 du numéro 12. Ce que je dois réaliser est de faire en sorte qu'à cet ID 22 je puisse avoir accès aux deux premiers état de la version 1 PLUS l'état 1 de la version 2 du numèro 12. En gros l'état actuel plus les deux précédents...

    J'espère m'être plus ou moins bien fais comprendre, aussi, pour ceux qui voudraient m'aider et qui m'auraient compris, je ne vous demande pas de faire le boulot à ma place, j'ai déjà commencé et je n'aimerai pas ça, je voudrai juste des avis sur ma façon de procéder ou quelques petites astuces qui pourraient m'aider...

    Je vous link mon code actuel :

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
     
    --CREATE PROCEDURE dbo.AutoIncrementEtat_parVersion
    --AS
    --BEGIN
     
    	--SET NOCOUNT ON;
     
     
    	DECLARE @idDF bigint;
    	DECLARE @idEtat smallint;
    	DECLARE @num int;
    	DECLARE @vers int;
    	DECLARE @n int;
     
        DECLARE myCursor1 CURSOR
        FOR
        SELECT TOP 10000 etat.[iddevis_facture],[numero], [version],[idetat_devis_facture]  
    	FROM dbo.etat_devis_facture etat INNER JOIN dbo.devis_facture df ON etat.iddevis_facture = df.iddevis_facture ORDER BY numero ASC ;
    	OPEN myCursor1
     
            FETCH NEXT FROM myCursor1 INTO  @idDF,@num,@vers,@idEtat
            WHILE @@FETCH_STATUS = 0
            BEGIN
    			INSERT INTO dbo.TableTempo(id,numero,versions,etat) SELECT df.iddevis_facture,numero,[version],etat.idetat_devis_facture 
    			FROM dbo.etat_devis_facture etat INNER JOIN dbo.devis_facture df ON etat.iddevis_facture =df.iddevis_facture
    			WHERE df.iddevis_facture=@idDF AND [version]=@vers AND etat.idetat_devis_facture = @idEtat ORDER BY [version] ASC;
     
     
     
    			FETCH NEXT FROM myCursor1 INTO @idDF,@num,@vers,@idEtat
    	    END
     
        CLOSE myCursor1;
    	DEALLOCATE myCursor1;
    En gros j'ai commencé par créer un curseur pour trier mes tables (biensur elles ne sont pas trier c'est là toute la magie de ce géantissime b*****) Ensuite j'ai déjà tester plusieurs hypothéses sur un deuxiemes curseur ou un While mais rien n'y a fait...

    Merci d'avance à tout le monde,

    Etudiant en BTS SIO 2éme Année

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Je pense que vous commettez plusieurs erreurs.

    l'utilisation des curseurs est a proscrire pour des raisons de performances. L'utilisation d'une table temporaire n'est pas forcément non plus une bonne idée (qu'en faites vous après ? quel est le but de tout ça ?).

    Vous pourriez certainement remplacer tout ça par une vue.

    Cependant, je n'ai pas bien compris le besoin. Pourriez vous poster un jeu d'essai avec le résultat attendu et préciser un peu le contexte ?

  3. #3
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Billets dans le blog
    8
    Par défaut
    En complément des recommandations de aieeeuuuuu, qu'il vous faudra absolument suivre , moi non plus, je n'ai pas bien compris la demande, ou plutôt j'ai vaguement compris quelque chose d'un flou nébuleux !

    Comme aieeeuuuuu vous l'a déjà dit ci-dessus, il faut donner des exemples concrets.

    Sinon pour me reste, du peu que j'ai compris de votre exposé, il faut peut-être que vous regardiez du côté de ces 2 fonction de fenêtrage LEAD et LAD (à mon avis plus LAD que LEAD) :

    LEAD (http://msdn.microsoft.com/fr-fr/library/hh213125.aspx )

    LAG (http://msdn.microsoft.com/fr-fr/library/hh231256.aspx)

    NB : Les 2 fonctions LEAD et LAD sont valables uniquement à partir de la version SQL Server 2012 et supérieure (2012, 2014, etc..).

    A+

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juin 2014
    Messages : 21
    Par défaut
    Citation Envoyé par hmira Voir le message
    Sinon pour me reste, du peu que j'ai compris de votre exposé, il faut peut-être que vous regardiez du côté de ces 2 fonction de fenêtrage LEAD et LAD (à mon avis plus LAD que LEAD) :
    Merci ! Je pense en ayant regardé la doc que ces deux fonctions me seront très utiles, c'est un projet ou il y a beaucoup de choses à prendre en compte il est donc difficile de l'expliquer même si au final le boulot n'est pas si monstrueux qu'il y parrait, comme je pense que ces fonctions m'aideront beaucoup je vais essayer celles-ci demain plutôt que d'essayer de vous expliquer encore ce charabia, si je n'y arrive toujours pas je reviendrai vers vous avec des explications plus claires Merci encore!


    Edit : Je posterai la solution à mon problème si j'arrive à le résoudre Et là c'est le drame, ma version ne peux pas utiliser LAG et LEAD lol.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juin 2014
    Messages : 21
    Par défaut
    Je vais donc essayer de vous expliquer ça de manière plus claire :

    On peut voir sur le prochain tableau la table que je dois obtenir à la fin de ma procédure, à l'heure actuelle tout est dans le désordre si ce n'est que j'ai recrée une table pour trier par version.

    Pour faire simple, L'ID 35 possède 2 état : 1 et 2.
    Je veux que pour l'ID 36 je puisse avoir accès aux état 1 et 2 de l'ID 35 mais qu'ils soient stockés à l'ID 36. Puis ensuite aux état de mon ID 36 qui, sur l'exemple, n'en possède qu'un et sera donc archivé en tant que 3ieme état. Et ainsi de suite jusqu'à un changement de numéro ou tout recommence.

    IdDF etat numero version
    35 1 12 1
    35 2 12 1
    36 1 12 2
    36 2 12 2
    36 3 12 2
    37 1 12 3
    37 2 12 3
    37 3 12 3
    37 4 12 3
    37 5 12 3
    38 1 12 4
    38 2 12 4
    38 3 12 4
    38 4 12 4
    38 5 12 4
    38 6 12 4
    38 7 12 4
    39 1 27 1
    39 2 27 1
    40 1 27 2
    40 2 27 2
    40 3 27 2
    40 4 27 2
    41 1 27 3
    41 2 27 3
    41 3 27 3
    41 4 27 3
    41 5 27 3
    42 1 27 4

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Citation Envoyé par DelphiBeginner Voir le message
    Je vais donc essayer de vous expliquer ça de manière plus claire :

    On peut voir sur le prochain tableau la table que je dois obtenir à la fin de ma procédure,
    Quel est le contenu initial des tables ?

    Citation Envoyé par DelphiBeginner Voir le message
    Pour faire simple, L'ID 35 possède 2 état : 1 et 2.
    Je veux que pour l'ID 36 je puisse avoir accès aux état 1 et 2 de l'ID 35 mais qu'ils soient stockés à l'ID 36.
    Qu'entendez-vous par "puisse avoir accés" et par "soient stockés" ???


    Citation Envoyé par DelphiBeginner Voir le message
    Puis ensuite aux état de mon ID 36 qui, sur l'exemple, n'en possède qu'un
    Heu... dans votre exemple, ID36 possède 3 états

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Alors il serait bien de préciser la version que vous utilisez. Notez qu'il existe des tags pour cela.




    Citation Envoyé par DelphiBeginner Voir le message
    En gros j'ai commencé par créer un curseur pour trier mes tables (biensur elles ne sont pas trier c'est là toute la magie de ce géantissime b*****)
    En effet, il n'existe pas d'ordre dans une table, et le seul moyen sûr d'obtenir un résultat ordonné est d'utiliser la clause ORDER BY dans votre requête. Notez cependant que vous pouvez spécifier plusieurs colonnes dans cette clause, et c'est je pense que que vous cherchiez à faire dans votre procédure.

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

Discussions similaires

  1. Auto incrémentation de donnée avec Talend et Oracle
    Par louvah dans le forum Développement de jobs
    Réponses: 16
    Dernier message: 18/02/2014, 09h15
  2. [1.x] perte données des tables avec clé etrangere
    Par bozeclair dans le forum Symfony
    Réponses: 3
    Dernier message: 06/12/2011, 12h39
  3. numéro auto incrément d'un compte bancaire avec c# xml
    Par manidis dans le forum Windows Forms
    Réponses: 6
    Dernier message: 24/03/2011, 14h18
  4. auto-incrémentation sur une primary key avec sql server
    Par pops4 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/05/2007, 14h24
  5. update d'après 2 tables avec ordre de date
    Par fred23195 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 22/12/2005, 17h39

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