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 :

probleme de reception d'une procedure stockée considérée comme vide par ma page asp


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
    Avril 2003
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 23
    Par défaut probleme de reception d'une procedure stockée considérée comme vide par ma page asp
    Bonjour,

    J'ai un petit soucis je travaille pour un client sur la création d'un site web, en local sur ma machine tout fonctionne bien, mais lorsque j'integre mes pages sur le serveur du client, j'ai un clash que je ne comprends pas, apres maintes et maintes tentatives je ne trouve pas. Voici le problème :

    Lorsque j'execute une page qui fait appel à une procedure stockée SQL serveur 2003 qui est sensé inserer des données dans une table et retourner la table en question, j'ai le message d'erreur suivant sur ma page :
    ADODB.Recordset erreur '800a0e78'
    Cette opération n'est pas autorisée si l'objet est fermé.

    /****/******/****/****.asp, ligne 99
    voici la fameuse ligne 99 : (et son contexte)
    <%
    function getBillPrice(numCom, numCli)
    {
    var _numCom = numCom;
    var _numCli = numCli;
    var getBillPrice = Server.CreateObject("ADODB.Recordset");
    getBillPrice.ActiveConnection = MM_siteSQL_STRING;
    getBillPrice.source = "GetBillPrice('" + _numCom + "', '" + _numCli + "')";
    getBillPrice.CursorType = 0;
    getBillPrice.CursorLocation = 2;
    getBillPrice.LockType = 1;
    getBillPrice.Open();
    ligne 99 -->if(getBillPrice.EOF || getBillPrice.BOF) {
    getBillPrice = Server.CreateObject("ADODB.Recordset");
    getBillPrice.ActiveConnection = MM_siteSQL_STRING;
    getBillPrice.source = "select 'Pas de montant' as 'TTCPrice'";
    getBillPrice.CursorType = 0;
    getBillPrice.CursorLocation = 2;
    getBillPrice.LockType = 1;
    getBillPrice.Open();
    }

    return getBillPrice;
    }
    %>

    voici le code de la procédure :

    CREATE PROCEDURE GetBillPrice @Bill_Id varchar(9), @Cli_Id varchar(17) AS

    BEGIN TRANSACTION
    Declare @NumPiece varchar(9);
    delete from TA_ResultLines;
    Declare getBillHeaders cursor for select DO_Piece from E_DOCENTETE where Cle_Prod = @Bill_Id and DO_Tiers = @Cli_Id;




    open getBillHeaders;
    fetch getBillHeaders into @NumPiece;

    while(@@FETCH_STATUS <> -1)
    BEGIN
    insert into TA_ResultLines
    (RET_AR_REF, RET_AR_DESIGN, RET_Enum_Cond, Ret_QTE_BC, RET_PUHT, RET_Remise_Valeur,
    RET_Remise_Type, RET_PT_Remise_HT, RET_Type, RET_PUTTC, RET_PT_Remise_TTC)
    select AR_REF, DL_DESIGN, EU_ENUMERE, DL_QTEBC, DL_PrixUnitaire, DL_Remise01REM_Valeur,
    DL_Remise01REM_Type, DL_MONTANTHT,DO_Type, (DL_PrixUnitaire + ((DL_PrixUnitaire * DL_Taxe1)/100)), (DL_MONTANTHT + ((DL_MONTANTHT * DL_Taxe1)/100))
    from E_DOCLIGNE where DO_Piece = @NumPiece and DL_QTE <> 0;

    fetch next from getBillHeaders into @NumPiece;
    END

    close getBillHeaders;
    deallocate getBillHeaders;

    select sum(RET_PT_Remise_HT) as 'HTPrice', sum(RET_PT_Remise_TTC) as 'TTCPrice'
    from TA_ResultLines;
    COMMIT;
    GO
    j'ai regardé, ma table est bien effacée a chaque lancement de la procedure, elel est bien remplie avec toutes les valeurs qui vont bien, mais apres ben bam lors de la reception de la procedure a ma page asp, adodb considere que la reception est invalide et donc ferme mon recordset.

    et la je seche.

    P.S : pour info quand je mets ma procedure en commentaire et que je fait juste ca :
    select 00 as 'HTPrice', 00 as 'TTCPrice';
    Tout fonctionne impec.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    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 : 21 998
    Billets dans le blog
    6
    Par défaut
    0) SQL Server 2003 cela n'existe pas. Il existe SQL Server 2000, SQL Server 2005 et c'est tout.

    1) votre procédure est mal écrite car vous ne testez jamais la survenance des erreurs. Si une requête plante vous continuez tranquillement... C'est stupide d'autant que vous gérez une transaction ce qui veut dire que vous favorisez la possibilité d'une base incohérente...

    voici comment écrire proprement une gestion d'erreur dans le cas de votre PS :

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    CREATE PROCEDURE GetBillPrice @Bill_Id varchar(9), @Cli_Id varchar(17) AS
     
    BEGIN TRANSACTION
     
    Declare @NumPiece varchar(9);
     
    delete from TA_ResultLines;
    IF @@ERROR <> 0 
       GOTO LBL_ERROR
     
    Declare getBillHeaders cursor 
    for 
       select DO_Piece 
       from   E_DOCENTETE 
       where  Cle_Prod = @Bill_Id 
         and  DO_Tiers = @Cli_Id;
     
    open getBillHeaders;
     
    fetch getBillHeaders into @NumPiece;
     
    while @@FETCH_STATUS = 0
    BEGIN
       insert into TA_ResultLines (RET_AR_REF, RET_AR_DESIGN, RET_Enum_Cond, 
                                   Ret_QTE_BC, RET_PUHT, RET_Remise_Valeur,
                                   RET_Remise_Type, RET_PT_Remise_HT, RET_Type, 
                                   RET_PUTTC, RET_PT_Remise_TTC)
       select AR_REF, DL_DESIGN, EU_ENUMERE, DL_QTEBC, DL_PrixUnitaire, DL_Remise01REM_Valeur,
              DL_Remise01REM_Type, DL_MONTANTHT,DO_Type, 
              (DL_PrixUnitaire + ((DL_PrixUnitaire * DL_Taxe1)/100)), 
              (DL_MONTANTHT + ((DL_MONTANTHT * DL_Taxe1)/100))
       from   E_DOCLIGNE 
       where  DO_Piece = @NumPiece 
         and  DL_QTE <> 0;
       IF @@ERROR <> 0 
          GOTO LBL_ERROR
     
       fetch next from getBillHeaders into @NumPiece;
     
    END
     
    close getBillHeaders;
     
    deallocate getBillHeaders;
     
    select sum(RET_PT_Remise_HT) as 'HTPrice', sum(RET_PT_Remise_TTC) as 'TTCPrice'
    from TA_ResultLines;
    IF @@ERROR <> 0 
       GOTO LBL_ERROR
     
    COMMIT;
     
    RETURN
     
    LBL_ERROR:
    ROLLBACK
     
    GO
    Lisez l'article que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/cours/s...nsactsql/#L4.3

    2) D'autre part il est inutile, stupide et dangereux d'utiliser un curseur quand on en a pas besoin... Voici votre procédure sans aucun curseur :

    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
    39
    40
    41
    42
    CREATE PROCEDURE GetBillPrice @Bill_Id varchar(9), @Cli_Id varchar(17) AS
     
    BEGIN TRANSACTION
     
    Declare @NumPiece varchar(9);
     
    delete from TA_ResultLines;
    IF @@ERROR <> 0 
       GOTO LBL_ERROR
     
     
    insert into TA_ResultLines (RET_AR_REF, RET_AR_DESIGN, RET_Enum_Cond, 
                                Ret_QTE_BC, RET_PUHT, RET_Remise_Valeur,
                                RET_Remise_Type, RET_PT_Remise_HT, RET_Type, 
                                RET_PUTTC, RET_PT_Remise_TTC)
    select DLN.AR_REF, DLN.DL_DESIGN, DLN.EU_ENUMERE, DLN.DL_QTEBC, 
           DLN.DL_PrixUnitaire, DLN.DL_Remise01REM_Valeur,
           DLN.DL_Remise01REM_Type, DLN.DL_MONTANTHT,DO_Type, 
           (DLN.DL_PrixUnitaire + ((DLN.DL_PrixUnitaire * DLN.DL_Taxe1)/100)), 
           (DLN.DL_MONTANTHT + ((DLN.DL_MONTANTHT * DLN.DL_Taxe1)/100))
    from   E_DOCLIGNE AS DLN
           INNER JOIN E_DOCENTETE AS DET
                 ON DLN.DO_Piece = DET.DO_Piece
    where  DET.Cle_Prod = @Bill_Id 
      and  DET.DO_Tiers = @Cli_Id
      and  DLN.DL_QTE <> 0;
    IF @@ERROR <> 0 
       GOTO LBL_ERROR
     
    select sum(RET_PT_Remise_HT) as 'HTPrice', sum(RET_PT_Remise_TTC) as 'TTCPrice'
    from TA_ResultLines;
    IF @@ERROR <> 0 
       GOTO LBL_ERROR
     
    COMMIT;
     
    RETURN
     
    LBL_ERROR:
    ROLLBACK
     
    GO
    A partir de là vous verrez sans doute mieux ce qui cloche.

    Tout cela prouve le manque de formation. Sachez que je donne des cous SQL Server à Orsys par exemple...

    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/ * * * * *

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 23
    Par défaut
    alors pour SQL server 2003, dsl j'ai fourché, c'est un SQL 2000 sur un windows 2003, dans la precipitation je me suis planté de chiffre, ca arrive, l'erreur est humaine

    Ensuite j'ai résolu le problème en partie grace a votre réponse puisque j'ai réécris la procedure de la manière suivante, qui est beaucoup plus élégante :


    select
    sum(DLN.DL_MONTANTHT) as 'HTPrice',
    sum((DLN.DL_MONTANTHT + ((DLN.DL_MONTANTHT * DLN.DL_Taxe1)/100))) as 'TTCPrice'
    from E_DOCLIGNE AS DLN
    INNER JOIN E_DOCENTETE AS DET
    ON DLN.DO_Piece = DET.DO_Piece
    where DET.Cle_Prod = @Bill_Id
    and DET.DO_Tiers = @Cli_Id
    and DLN.DL_QTE <> 0;

    Sur ce je vous remercie.

    Par contre j'aurais une remarque à vous faire sur le ton que vous employez, on est ici sur un forum d'entraide où se croisent des Master et des NewBies. Les Masters aident les NewBies etc.. et ca c'est très bien.

    Par contre il faut aussi penser que l'on à le droit de ne pas être un expert dans tous les domaines (et généralement quand on est un expert, on pose pas de questions), et donc de ne pas spécialement penser aux "inner join" à la place d'un curseur quand notre spécialité n'est pas le SQL Server. Un conseil est toujours plus sympa qu'une critique aussi catégorique que la vôtre.

    je suis une personne qui maitrise très bien le JAVA SE, JAVA EE et non le SQL Server, et lorsqu'une personne me demande une question sur un problème en Java (que toute personne utilisant ce langage tous les jours n'imaginent même pas que l'on puisse se poser la question tellement ca nous parait évident), je ne lui dit pas : "He ben dis donc, avant de te mettre à écrire des programmes en Java tapes toi 8 mois de lecture de documentations, et 8 ans de formations, comme ca ca t'évitera d'écrire des abominations pareilles qui me font vomir". je lui réponds : "Je te conseillerais plutot d'éviter cette methode et utiliser celle ci qui est beaucoup plus rapide et sécurisée, mais t'en fait pas à force d'écrire des programmes et de lire de la documention tu éviteras naturellement ce genre de piège parceque c'est en faisant des erreurs qu'on apprend à les éviter."


    Tout ca pour dire merci pour la réponse, et que la grosse tête c'est Mal©

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    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 : 21 998
    Billets dans le blog
    6
    Par défaut
    Vous viendrait-il à l'esprit de conduire une voiture dans le cadre de votre travail sans le permis ni l'assurance ?
    Posez vous la question de la formation....

    Hélas beaucoup de gens ont une formation très nulle en SGBDR/SQL et posent des questions que la simple lecture d'un livre bien fait ou un tutoriel détaillé saurait éviter.

    C'est un gâchis de temps et d'argent pour tout le monde : ceux qui posent des questions, ceux qui emloient ceux qui posent les questions et ceux qui, comme moi répondent à ceux qui posent toujours les mêmes questions...

    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/ * * * * *

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 23
    Par défaut
    L'histoire de la voiture n'est pas comparable, on peut très bien conduire une voiture sans être capable de finir premier d'une course de formule 1.

    L'informatique est un monde très vaste, et si l'on devait toujours tout savoir, on écrirait notre premier programme une semaine avant notre retraite.

    je reste sur l'avis que vous êtes certainement doué en SQL server, mais definitivement très mauvais en pédagogie.

    Mais je vous pardonne, on ne peux pas être bon partout.

  6. #6
    Invité de passage
    Inscrit en
    Juillet 2006
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 1
    Par défaut
    sidero a répondu quelque chose de pertinent, c'est qu'on ne peut pas être expert partout, clairement il n'est pas expert en SQL Server, ça peut s'expliquer par plein de choses, peut-être n'aime-t-il pas gâcher de l'argent dans un SGBD si peu fiable que SQL Server, mais passons, les entreprises l'utilisent alors il faut bien les contenter n'est ce pas ? Qu'en disent les experts Oracle ?

    D'autre part, il est clair que vous connaissez bien le sujet, également Delphi d'après votre site, mais au vu de celui-ci (http://brouardf.club.fr/index.html) il est clair que vous avez quelques lacunes en Web, c'est vraiment une perte de temps, et donc possiblement d'argent de créer ce genre d'atrocités, quand on se sert d'internet, on le fait bien ou pas du tout, pensez à l'accessibilité, aux gens qui ont des déficiences visuelles, il est clair qu'elles ne peuvent pas accéder à l'information (qui est très certainement pertinente) puisque votre site ne réponds pas du tout aux standards du Web... Alors vous n'êtes vraiment pas expert en tout, comme sidero, acceptez-le, et si vous êtes lassé de répondre, laissez des gens plus courtois le faire à votre place.

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

Discussions similaires

  1. probleme de boucle while dans une procedure stockée
    Par aboulemagnifique dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 08/08/2007, 12h39
  2. Probleme avec une procedure stocké avec IF
    Par el_quincho dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 12/10/2006, 16h21
  3. Réponses: 3
    Dernier message: 12/07/2006, 15h56
  4. Probleme dans une procedure stockée
    Par malbaladejo dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 07/07/2004, 14h08
  5. [C#] [Oracle] Probleme avec une procedure stockée
    Par sronin1 dans le forum Accès aux données
    Réponses: 4
    Dernier message: 28/05/2004, 19h04

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