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 :

Erreur lors d'un update


Sujet :

Développement SQL Server

  1. #1
    Expert éminent sénior

    Avatar de FirePrawn
    Homme Profil pro
    Consultant technique
    Inscrit en
    Mars 2011
    Messages
    3 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique

    Informations forums :
    Inscription : Mars 2011
    Messages : 3 179
    Points : 19 374
    Points
    19 374
    Par défaut Erreur lors d'un update


    Je viens poster ici car la boite à MP de notre ami SQLPro est pleine, impossible de le contacter !

    J'ai suivi ce cours : http://sqlpro.developpez.com/cours/gestiontemps/#L6
    Et j'ai quelques petits soucis avec le script d'update des rangs

    L'erreur que j'ai eu en exécutant les update :

    (2568*ligne(s) affectée(s))

    (2568*ligne(s) affectée(s))
    Avertissement*: la valeur NULL est éliminée par un agrégat ou par une autre opération SET.

    (2568*ligne(s) affectée(s))
    Msg*8134, Niveau*16, État*1, Ligne*57
    Division par zéro.
    L'instruction a été arrêtée.
    Msg*8134, Niveau*16, État*1, Ligne*75
    Division par zéro.
    L'instruction a été arrêtée.
    Tous les rangs trimestre et semestre sont NULL. Et je crois que la valeur pour les rangs semaine n'est pas juste. Voici ce que j'ai pour le 01/01/2014 par exemple :

    PJR_DATE PAN_ID PMS_ID PJM_ID PSM_ID PJS_ID PJA_ID PTR_ID PST_ID PJR_RANG_JOUR PJR_RANG_SEMAINE PJR_RANG_MOIS PJR_RANG_TRIMESTRE PJR_RANG_SEMESTRE PJR_RANG_AN PJR_ALEA
    2014-01-01 00:00:00.000 2014 1 1 1 3 1 1 1 41638 53.2857 1369.0000 NULL NULL 114.0000 75278
    Je copie l'update pour les ceusses qui ont la flemme d'aller voir sur l'article :

    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
     
     
    REQUÊTE DE MISE A JOUR DES RANGS
    ********************************
     
    -- maj du rang des années
    UPDATE T_PLN_JOUR_PJR
    SET PJR_RANG_AN = 
           CAST(
           (CAST(PAN_ID AS FLOAT) - 1899.0) 
         + (CAST(PJR_RANG_JOUR AS FLOAT) 
         - (SELECT CAST(PJR2.PJR_RANG_JOUR AS FLOAT)
            FROM   T_PLN_JOUR_PJR PJR2
            WHERE  PJR2.PJM_ID = 1
              AND  PJR2.PMS_ID = 1
              AND  PJR2.PAN_ID = PJR.PAN_ID +1))
         / (SELECT CAST(COUNT(*) AS FLOAT)
            FROM   T_PLN_JOUR_PJR PJR3
            WHERE  PJR3.PAN_ID = PJR.PAN_ID)
            AS DECIMAL(10,4))
    FROM T_PLN_JOUR_PJR PJR
     
    -- maj du rang des mois
    UPDATE T_PLN_JOUR_PJR
    SET PJR_RANG_MOIS = 
           CAST(
           (CAST(PAN_ID AS FLOAT) - 1900.0) * 12 + PMS_ID + 1
         + (CAST(PJR_RANG_JOUR AS FLOAT) 
         - (SELECT CAST(PJR2.PJR_RANG_JOUR AS FLOAT)
            FROM   T_PLN_JOUR_PJR PJR2
            WHERE  PJR2.PJM_ID = 1
              AND  PJR2.PMS_ID = (PJR.PMS_ID  % 12) + 1
              AND  PJR2.PAN_ID =
                   CASE 
                   WHEN PJR.PMS_ID + 1 = 13
                        THEN PJR.PAN_ID +1
                       ELSE PJR.PAN_ID
                   END))
         / (SELECT CAST(COUNT(*) AS FLOAT)
            FROM   T_PLN_JOUR_PJR PJR3
            WHERE  PJR3.PMS_ID = PJR.PMS_ID
              AND  PJR3.PAN_ID = PJR.PAN_ID) 
            AS DECIMAL(10,4))
    FROM T_PLN_JOUR_PJR PJR
     
    -- maj du rang des semaines
    UPDATE T_PLN_JOUR_PJR
    SET PJR_RANG_SEMAINE = 
            CAST( 
            CAST(PSM_ID AS FLOAT) + 51
         + (SELECT SUM(MAX_PSM_ID)
            FROM   (SELECT MAX(PSM_ID) AS MAX_PSM_ID
                    FROM   T_PLN_JOUR_PJR
                    WHERE  PAN_ID < PJR.PAN_ID
                    GROUP  BY PAN_ID)
            T )
        + (CAST(PJS_ID AS FLOAT) - 1) / 7 )
           AS DECIMAL(10,4))
    FROM T_PLN_JOUR_PJR PJR
     
    -- maj du rang des trimestres
    UPDATE T_PLN_JOUR_PJR
    SET PJR_RANG_TRIMESTRE =
    CAST((CAST(PAN_ID AS FLOAT) - 1900) * 4 + PTR_ID
    -- + nombre de jours écoulé
         + (CAST((SELECT COUNT(*) 
                 FROM   T_PLN_JOUR_PJR PJR2
                 WHERE  PJR2.PTR_ID = PJR.PTR_ID
                    AND PJR2.PAN_ID = PJR.PAN_ID
                    AND PJR2.PJR_DATE <= PJR.PJR_DATE) AS FLOAT) - 1) 
    -- divisé par le total de jours
         / (CAST((SELECT COUNT(*) 
                 FROM   T_PLN_JOUR_PJR PJR3
                 WHERE  PJR3.PTR_ID = PJR.PTR_ID
                    AND PJR3.PAN_ID = PJR.PAN_ID) AS FLOAT)) 
           AS DECIMAL(10,4))
    FROM T_PLN_JOUR_PJR PJR
     
    -- maj du rang des semestres
    UPDATE T_PLN_JOUR_PJR
    SET PJR_RANG_SEMESTRE =
          CAST((CAST(PAN_ID AS FLOAT) - 1900) * 2 + PST_ID
    -- + nombre de jours écoulé
         + (CAST((SELECT COUNT(*) 
                 FROM   T_PLN_JOUR_PJR PJR2
                 WHERE  PJR2.PST_ID = PJR.PST_ID
                    AND PJR2.PAN_ID = PJR.PAN_ID
                    AND PJR2.PJR_DATE <= PJR.PJR_DATE) AS FLOAT) - 1) 
     
    -- divisé par le total de jours
         / (CAST((SELECT COUNT(*) 
                 FROM   T_PLN_JOUR_PJR PJR3
                 WHERE  PJR3.PST_ID = PJR.PST_ID
                    AND PJR3.PAN_ID = PJR.PAN_ID) AS FLOAT)) 
           AS DECIMAL(10,4))
    FROM T_PLN_JOUR_PJR PJR

    Merci d'avance de votre aide !
    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Je ne réponds pas aux questions techniques en MP.

  2. #2
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Hello,

    J'avais également suivi ce tuto mais je n'avais pris que le partie pour créer une table calendrier (sa table PLN_JOUR si mes souvenirs sont bons).

    Et effectivement, j'avais du bidouiller un peu les scripts car il y avait quelques bugs. Mais cela ne devait pas être grand chose vu que j'ai réussi à corriger ça tout seul (vu mon niveau à l'époque, c'est dire ).

    Donc voilà, tout ça pour dire qu'il va falloir bosser un peu au lieu de juste faire un copier/coller .
    Kropernic

  3. #3
    Expert éminent sénior

    Avatar de FirePrawn
    Homme Profil pro
    Consultant technique
    Inscrit en
    Mars 2011
    Messages
    3 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique

    Informations forums :
    Inscription : Mars 2011
    Messages : 3 179
    Points : 19 374
    Points
    19 374
    Par défaut
    Si je pose la question c'est que je n'ai pas trouvé tout seul...
    J'ai déjà corrigé quelques erreurs dans les scripts, mais pour celle-ci, je ne trouve pas le pourquoi du comment...
    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Je ne réponds pas aux questions techniques en MP.

  4. #4
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Comme déjà dit, je n'ai pas utilisé ces scripts-là vu que j'avais besoin que d'une table de son schéma.

    Le message d'erreur indique une division par 0. Donc dans le script de calcul des rangs, cherche la requête qui donne 0 comme diviseur et tu auras le pourquoi...
    Kropernic

  5. #5
    Expert éminent sénior

    Avatar de FirePrawn
    Homme Profil pro
    Consultant technique
    Inscrit en
    Mars 2011
    Messages
    3 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique

    Informations forums :
    Inscription : Mars 2011
    Messages : 3 179
    Points : 19 374
    Points
    19 374
    Par défaut
    Ben ça c'est tout trouvé...

    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
    UPDATE T_PLN_JOUR_PJR
    SET PJR_RANG_SEMESTRE =
          CAST((CAST(PAN_ID AS FLOAT) - 1900) * 2 + PST_ID
    -- + nombre de jours écoulé
         + (CAST((SELECT COUNT(*) 
                 FROM   T_PLN_JOUR_PJR PJR2
                 WHERE  PJR2.PST_ID = PJR.PST_ID
                    AND PJR2.PAN_ID = PJR.PAN_ID
                    AND PJR2.PJR_DATE <= PJR.PJR_DATE) AS FLOAT) - 1) 
     
    -- divisé par le total de jours
         / (CAST((SELECT COUNT(*) 
                 FROM   T_PLN_JOUR_PJR PJR3
                 WHERE  PJR3.PST_ID = PJR.PST_ID
                    AND PJR3.PAN_ID = PJR.PAN_ID) AS FLOAT)) 
           AS DECIMAL(10,4))
    FROM T_PLN_JOUR_PJR PJR
    C'est le COUNT(*) du dénominateur qui ne retourne rien donc 0 ligne donc division par 0.
    Mais justement, j'arrive pas à comprendre pourquoi il retourne 0 ligne
    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Je ne réponds pas aux questions techniques en MP.

  6. #6
    Expert éminent sénior

    Avatar de FirePrawn
    Homme Profil pro
    Consultant technique
    Inscrit en
    Mars 2011
    Messages
    3 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique

    Informations forums :
    Inscription : Mars 2011
    Messages : 3 179
    Points : 19 374
    Points
    19 374
    Par défaut
    Bon j'ai trouvé le pourquoi du comment !

    C'est à cause des premières lignes de ma table :

    PJR_DATE PAN_ID PMS_ID PJM_ID PSM_ID PJS_ID PJA_ID PTR_ID PST_ID PJR_RANG_JOUR PJR_RANG_SEMAINE PJR_RANG_MOIS PJR_RANG_TRIMESTRE PJR_RANG_SEMESTRE PJR_RANG_AN PJR_ALEA
    2013-12-26 00:00:00.000 2013 12 26 NULL 4 360 NULL NULL 41632 NULL 1368.0000 NULL NULL 113.0000 89078
    2013-12-27 00:00:00.000 2013 12 27 NULL 5 361 NULL NULL 41633 NULL 1368.1667 NULL NULL 113.1667 10110
    2013-12-28 00:00:00.000 2013 12 28 NULL 6 362 NULL NULL 41634 NULL 1368.3333 NULL NULL 113.3333 93399
    2013-12-29 00:00:00.000 2013 12 29 NULL 7 363 NULL NULL 41635 NULL 1368.5000 NULL NULL 113.5000 33845
    2013-12-30 00:00:00.000 2013 12 30 1 1 364 NULL NULL 41636 NULL 1368.6667 NULL NULL 113.6667 79294
    2013-12-31 00:00:00.000 2013 12 31 1 2 365 NULL NULL 41637 NULL 1368.8333 NULL NULL 113.8333 73394
    Le PTR_ID est NULL pour ces lignes là, le résultat du COUNT est donc 0
    Maintenant est-ce normal que le PTR_ID soit NULL, seul SQLPRo pourrait le dire, mais du coup en attendant il suffit de modifier un peu la requête pour ne pas renvoyer 0 quand ça fait 0
    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Je ne réponds pas aux questions techniques en MP.

  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
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Il y a en effet quelques corrections a apporter, et vous avez dû faire une erreur quelque part.

    Qu'avez-vous apporté comme modifications aux scripts originaux ?

  8. #8
    Expert éminent sénior

    Avatar de FirePrawn
    Homme Profil pro
    Consultant technique
    Inscrit en
    Mars 2011
    Messages
    3 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique

    Informations forums :
    Inscription : Mars 2011
    Messages : 3 179
    Points : 19 374
    Points
    19 374
    Par défaut
    De mémoire, juste le nom d'une colonne dans le script de création des tables, à savoir PJR_RANG_JOUR qui était nommé PJR_RANG dans le create table alors que plus loin dans les scripts elle s'appelle bien PJR_RANG_JOUR.
    Le nom d'une contrainte en double également : CKC_PJM_ID_TR_PLN_J sur la table des jours fériés fixes que j'ai renommé CKC_PJM_ID_TR_PLN_JO car on a déjà une CKC_PJM_ID_TR_PLN_J un peu plus haut dans la table TR_PLN_JOUR_MOIS_PJM.
    Et puis ensuite bien évidemment j'ai modifié le script d'update des rangs, il manquait une parenthèse pour l'update des semaines pour le cast du dénominateur :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    + (CAST(PJS_ID AS FLOAT) - 1) / 7 )
           AS DECIMAL(10,4))

    Que j'ai transformé en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    + ((CAST(PJS_ID AS FLOAT) - 1) / 7)
           AS DECIMAL(10,4))
    Et puis pour ne pas avoir de 0 j'ai donc modifié les update des rangs trimestres & semestres en rajoutant une condition sur le COUNt(*) <> 0.

    Maintenant comme dit j'ai identifié le pourquoi du comment de l'erreur : si le COUNT(*) = 0, alors on divise par 0, donc ça plante (logique).
    Il se trouve que si on regarde les données, les 6 premières et les 6 dernières lignes de ma table T_PLN_JOUR contiennent des NULL pour les PTR_ID et PSR_ID. Ce sont les jours de "débordement" dans la procédure stockée. Du coup est-ce normal que ces quelques jours ne soient pas correctement complétés ? Oui, car ils ne font pas partie d'une année entière ? Je n'en ai aucune idée.
    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Je ne réponds pas aux questions techniques en MP.

  9. #9
    Membre à l'essai
    Inscrit en
    Janvier 2012
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 10
    Points : 12
    Points
    12
    Par défaut Reponse
    Il faut ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where PTR_ID is not null
    pour maj du rang des semaines et maj du rang des trimestres

  10. #10
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    Et effectivement, j'avais du bidouiller un peu les scripts car il y avait quelques bugs. Mais cela ne devait pas être grand chose vu que j'ai réussi à corriger ça tout seul (vu mon niveau à l'époque, c'est dire ).
    Vérifiez aussi que pour les opérations d'ajout de semaines/mois/... date == (date + delta) - delta, pour un range de deltas dont vous aurez besoin... (date ± delta restant dans la table des jours évidemment)

Discussions similaires

  1. erreur lors d'un update
    Par harjer dans le forum VBA Access
    Réponses: 5
    Dernier message: 20/11/2007, 11h07
  2. [SQL] erreur lors d'un update
    Par opeo dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 25/09/2007, 14h45
  3. erreur lors d'un update d'une base de données
    Par tibtibby dans le forum ASP
    Réponses: 1
    Dernier message: 09/06/2006, 14h30
  4. [ADO.Net][Access] Pourquoi ai-je une erreur lors de l'Update ?
    Par nazimb dans le forum Accès aux données
    Réponses: 1
    Dernier message: 15/05/2006, 09h37
  5. Erreur lors d'un Update en SQlserver
    Par kedig dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 30/08/2005, 08h22

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