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

C# Discussion :

Probleme recuperation d'un paramètre output d'une procédure stockée


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 31
    Par défaut Probleme recuperation d'un paramètre output d'une procédure stockée
    Bien le bonsoir à tous.

    J'ai un petit soucis qui dois être bête mais je n'arrive pas

    J'ai tout d'abord trois tables et voici leur create :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CREATE  TABLE Commande (
      Id_Commande uniqueidentifier ROWGUIDCOL  NOT NULL CONSTRAINT [DF_Commande]  DEFAULT (newid()),
      Etat_Commande bit NOT NULL ,
      Clorture BIT NOT NULL ,
      Table_Id uniqueidentifier NOT NULL ,
      PRIMARY KEY (Id_Commande) ,
      CONSTRAINT fk_Commande_Table1
        FOREIGN KEY (Table_Id )
        REFERENCES Tables (Id_Tables )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    GO
    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
     
     
    ------------------------------------Article-------------------------------------------------------------------------
    Create TABLE Article (
      Id_Article uniqueidentifier ROWGUIDCOL  NOT NULL CONSTRAINT [DF_Articles] DEFAULT (newid()),
      IdFamille uniqueidentifier NOT NULL ,
      Nom_Article VARCHAR(45) NULL ,
      CodeBarre_Article VARCHAR(13)NOT NULL ,
      Designation VARCHAR(145) NULL ,
      Visible BIT NOT NULL , 
      Qte_Stock smallint NOT NULL ,  
      Seuil_Articles_Min smallint NOT NULL ,
      Prix_Achat decimal(18, 0) NOT NULL,
      Prix_Vente_Article decimal(18, 0) NOT NULL,
      Marge decimal(18, 0) NOT NULL,
      Constraint pk_article PRIMARY KEY (Id_Article),
      CONSTRAINT fk_Article_Famille FOREIGN KEY (IdFamille)REFERENCES dbo.Famille (IdFamille)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    GO
    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
    ---------------------------------Articles_Commandes---------------------------------------------------------------
    CREATE  TABLE Articles_Commandes (
      Id_Articles_Commandes uniqueidentifier ROWGUIDCOL  NOT NULL CONSTRAINT [DF_Articles_Commandes]  DEFAULT (newid()),
      Id_Commandes uniqueidentifier  NOT NULL,
      Article_Id uniqueidentifier NOT NULL ,
      Quantite smallint NULL ,
      Payer BIT NULL ,
      constraint pk_articles_commandes PRIMARY KEY (Id_Articles_Commandes) ,
      CONSTRAINT fk_Commande_has_Article_Commande
        FOREIGN KEY (Id_Commandes )
        REFERENCES Commande (Id_Commande )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION,
      CONSTRAINT fk_Commande_has_Article_Article1
        FOREIGN KEY (Article_Id )
        REFERENCES Article (Id_Article )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    GO
    Ca donne une commande ->article_commande -> Article.

    J'ai ensuite une procédure stockée qui me permet de faire la sum des articles par commande par date. Donc par exemple nous sommes le 15/09/2010, et bien je veux la somme de tous les articles passer aujourd'hui:

    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
     
    USE [Cafer]
    GO
    /****** Object:  StoredProcedure [dbo].[usp_get_close]    Script Date: 09/15/2010 16:24:39 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER procedure [dbo].[usp_get_close]
    @Date datetime,
    @Gains decimal OUTPUT
    AS
    BEGIN
    SELECT @Gains = Sum(Prix_Vente_Article)
    FROM   [Article] Tab_art                      
           JOIN [Articles_Commandes] Tab_Art_com              
                ON Tab_art.[Id_Article] = Tab_Art_com.[Article_Id]
           JOIN [Commande] Tab_com                  
                ON Tab_Art_com.[Id_Commandes] = Tab_com.[Id_Commande]
    where Tab_com.Date >= CONVERT(DateTime,@date,120) and Tab_com.Date <= CONVERT(DateTime,@date+1,120)
     
    End
    Quand je la test ca fonctionne très bien, ca me renvoi une bonne valeur.

    Le soucis arrive au niveau de mon code csharp:

    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
     
    myCmd.Parameters.Clear();
                            myCmd.CommandType = CommandType.StoredProcedure;
                            SqlParameter param;
     
                            param = new SqlParameter("@Date", SqlDbType.DateTime);
                            param.Direction = ParameterDirection.Input;
                            param.Value = dateTime;
                            myCmd.Parameters.Add(param);
     
                            param = new SqlParameter("@Gains", SqlDbType.Decimal);
                            param.Direction = ParameterDirection.Output;
                            myCmd.Parameters.Add(param);
     
                            myCmd.ExecuteNonQuery();
     
                            myConn.Close();
                            Decimal toto = (Decimal)myCmd.Parameters["@Gains"].Value;
    Il me renvoie une erreur au niveau du cast alors que tout est correcte au niveau des differentes valeur(procedure ...)

    Quelqu'un aurait-il une petite idée pour me secourir ?

    Merci bien et une bonne fin de journée

    IoIO

  2. #2
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Bonjour,

    Il me semble avoir déjà rencontré le problème avec les paramètres de sortie.
    De toutes façons, ta procédure stockée ne retourne que la somme des gains tu peux donc la modifier comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ALTER procedure [dbo].[usp_get_close]
    @Date datetime
    AS
    BEGIN
    SELECT Sum(Prix_Vente_Article)
    FROM   [Article] Tab_art                      
           JOIN [Articles_Commandes] Tab_Art_com              
                ON Tab_art.[Id_Article] = Tab_Art_com.[Article_Id]
           JOIN [Commande] Tab_com                  
                ON Tab_Art_com.[Id_Commandes] = Tab_com.[Id_Commande]
    where Tab_com.Date >= CONVERT(DateTime,@date,120) and Tab_com.Date <= CONVERT(DateTime,@date+1,120)
     
    End
    Et récupérer la valeur retournée en utilisant un executescalar comme suit :
    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
     
    myCmd.Parameters.Clear();
                            myCmd.CommandType = CommandType.StoredProcedure;
                            SqlParameter param;
     
                            param = new SqlParameter("@Date", SqlDbType.DateTime);
                            param.Direction = ParameterDirection.Input;
                            param.Value = dateTime;
                            myCmd.Parameters.Add(param);
     
                            object result = myCmd.ExecuteScalar();
     
                            myConn.Close();
                            Decimal toto = 0;
                            decimal.TryParse(result, out toto);

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 31
    Par défaut
    Hello,

    merci de t'as réponse le soucis est que je dois garder mon champs gains car quand ma procédure et tout le tralala va bien marcher je devrais multiplier les articles par la quantité.

    En gros ca devrait donner ca :

    BEGIN
    SELECT @Gains = Sum(Prix_Vente_Article * Quantite(qui ce trouve dans la table Article_commande).

    Et meme en réfléchissant mon sum est mal positionner. Je devrais d'abord faire un select de mon prix vente, ensuite faire un select de ma quantité dans ma table article_commande. Multiplier le tout, le mettre dans une variable

    et quand tout les articles sont passer faire la somme. Je ne sais pas si en sql c'est possible avec les inner join que j'ai entre mes trois tables complique la tache

    Je devrais peut-être faire un bete select par rapport a une date et faire toute la procédure de calcul au niveau du csharp.

    Merci de vos réponses

  4. #4
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Euh, il me semble tu fais quelques confusions !

    Il y a le sujet de la récupération du résultat de ta proc stock, malgré ta nouvelle remarque, ta proc stoc ne retourne qu'une seule valeur. Dans ce cas comme je l'ai dit dans ma première réponse, l'executescalar est tout indiqué !

    Maintenant pour ta requête, il me semble que tu pars dans tous les sens.
    En gros, tu veux ton CA pour un jour donné, la formule est simple :
    CA Journalier = Somme(Prix_Vente * Quantité Commandée) du jour

    Donc la requête donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT Sum(Prix_Vente_Article * Quantite)
    FROM   [Article] Tab_art                      
           JOIN [Articles_Commandes] Tab_Art_com              
                ON Tab_art.[Id_Article] = Tab_Art_com.[Article_Id]
           JOIN [Commande] Tab_com                  
                ON Tab_Art_com.[Id_Commandes] = Tab_com.[Id_Commande]
    where Tab_com.Date >= CONVERT(DateTime,@date,120) and Tab_com.Date <= CONVERT(DateTime,@date+1,120)
    Par contre j'ai juste une remarque en passant, je ne sais pas comment tu souhaites gérer les modifications de prix de vente sur tes articles. Mais attention, il faut que tu historises d'une manière ou d'une autre le prix de vente correspondant à l'instant de la vente sinon ta requête et toutes autres requêtes risqueront très fortement de donner des résultats complètement faux.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 31
    Par défaut
    Merci pour t'as reponse. Le soucis est que quantité ne se trouve pas dans la meme table que le prix de vente article. Donc exemple

    Un mec commande 3 coca. Donc mon 3 coca va ce retrouver dans ma table article_commande. Mais pour pouvoir recuperer le prix de ce coca je dois allez rechercher la valeur dans Article.

    Donc au niveau des inner join c'est un peu beaucoup galère. D'ou ma proposition de mettre en tampon la valeur du prix de vente. Et même a ce moment la, il me semble impossible de pouvoir calculer la sum a la fin.

  6. #6
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Bon là, il faut reprendre un peu les tutos SQL car ce que tu veux c'est l'essence (oui je sais je m'emballe) du SQL et des jointures.

    C'est tout à fait possible, plus propre, ..., que ce que tu proposes. Donc la requête de mon dernier post est a priori bonne.

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

Discussions similaires

  1. [XL-2010] Pas de retour sur un paramètre output depuis une procédure stockée oracle
    Par darmet dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 28/07/2014, 14h47
  2. Réponses: 0
    Dernier message: 04/12/2013, 17h54
  3. Réponses: 2
    Dernier message: 26/01/2010, 10h05
  4. Réponses: 4
    Dernier message: 17/12/2007, 08h29
  5. Réponses: 1
    Dernier message: 27/08/2007, 17h40

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