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

WinDev Discussion :

Appliquer la fonction DSum ou Somme si dans Windev [WD20]


Sujet :

WinDev

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2012
    Messages : 195
    Points : 83
    Points
    83
    Par défaut Appliquer la fonction DSum ou Somme si dans Windev
    Bonjour les amis. Comment allez vous?
    Je suis un débutant dans la programme Windev. Je venais vous exposer mon problème.
    Voilà je veux réaliser un logiciel de gestion de Stock de produit. Je voulais appliquer la fonction DSum ou autrement appeler fonction Somme Si dans Windev.
    J'ai une table comme suit:
    Nom de la table : T_Enr

    Id_Enr id_Prod Prod id_Statut Statut Qte
    01 5 Carte 01 Entrée 10
    02 4 Pallin 01 Entrée 11
    03 5 Carte 02 Sortie 05
    04 5 Carte 01 Entrée 06
    05 4 Pallin 02 Sortie 05

    Je vous utiliser la Fonction DSum (comme dans VBA ACCESS)
    Code en VBA ACCESSS:

    Voici la Fonction pour faire la somme des Quanté Entrée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public function T_Entree (IDPro as long) as double
     
           T_Entree =NZ(DSum("Qte","T_Enr","id_prod="& IDPro &" And id_Statut=1"),0)
     
    end function
    Voici la Fonction pour faire la somme des Quanté Sortie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public function T_Sortie (IDPro as long) as double
     
           T_Sortie  =NZ(DSum("Qte","T_Enr","id_prod="& IDPro &" And id_Statut=2"),0)
     
    end function
    Et pour trouver le Stock Final je Fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public function T_Stock (IDPro as long) as double
     
          T_Stock=T_Entree(IDPro) -T_Sortie (IDPro) 
     
    end function
    Je ne sais pas si je peux le reproduire en WINDEV.

    Merci et je vous attends avec impatience.

  2. #2
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Bonjour,

    Il aurait été bien d'expliquer ce que fait cette fonction DSUM() que nous ne connaissons pas.
    J'ai fait une recherche rapide. D'après une page que j'ai trouvée, cela fait la somme suivant un domaine.

    La question que tu dois te poser est : à quoi correspond le domaine ?
    J'ai l'impression qu'on appelle ça un critère de sélection. Il faut donc que tu écrives soit une requête SQL du genre "SELECT SUM(XXX) FROM Table WHERE id_prod='& IDPro &' And id_Statut=1" ou que tu fasses un parcours de fichier et que tu testes ton id_prod et ton id_Statut.
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  3. #3
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 808
    Points : 5 267
    Points
    5 267
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Ton MLD doit ressembler à ça :
    Nom : CalculStock.png
Affichages : 483
Taille : 8,4 Ko
    Cette requête devrait faire l'affaire:
    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
     
    SELECT 
    	REQ_Mouvement.PK_Produit AS PK_Produit,	
    	REQ_Mouvement.NomProduit AS NomProduit,	
    	REQ_Mouvement.Entrées AS Entrées,	
    	REQ_Mouvement.Sorties AS Sorties,	
    	REQ_Mouvement.Entrées-REQ_Mouvement.Sorties AS Balance
    FROM 
    	(
    	SELECT 
    		REQ_Entrée.PK_Produit AS PK_Produit,	
    		REQ_Entrée.NomProduit AS NomProduit,	
    		REQ_Entrée.NbEntrée AS Entrées,	
    		REQ_Sortie.NbSortie AS Sorties
    	FROM
    		(
    		SELECT 
    			Enr.FK_Produit AS PK_Produit,	
    			Produit.NDX_NomProduit AS NomProduit,	
    			SUM(Enr.Qté) AS NbEntrée
    		FROM 
    			Produit,	
    			Enr,	
    			Mouvement
    		WHERE 
    			Mouvement.PK_Mouvement = Enr.FK_Mouvement
    			AND		Produit.PK_Produit = Enr.FK_Produit
    			AND
    			(
    			Mouvement.NDX_Mouvement = 'Entrée'
    			)
    		GROUP BY 
    			Enr.FK_Produit,	
    			Produit.NDX_NomProduit
    			) AS REQ_Entrée,	
    		(
    		SELECT 
    			Enr.FK_Produit AS PK_Produit,	
    			Produit.NDX_NomProduit AS NomProduit,	
    			SUM(Enr.Qté) AS NbSortie
    		FROM 
    			Produit,	
    			Enr,	
    			Mouvement
    		WHERE 
    			Mouvement.PK_Mouvement = Enr.FK_Mouvement
    			AND		Produit.PK_Produit = Enr.FK_Produit
    			AND
    			(
    			Mouvement.NDX_Mouvement = 'Sortie'
    			)
    		GROUP BY 
    			Enr.FK_Produit,	
    			Produit.NDX_NomProduit
    		) AS REQ_Sortie
    	WHERE 
    	REQ_Sortie.PK_Produit = REQ_Entrée.PK_Produit) AS REQ_Mouvement

    Après, si tu veux, il y a la solution séquentielle avec l'utilisation d'une classe

    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
     
    MProduit est une Classe <MAPPING=Produit>
    	PRIVÉ
    		// Le code se trouvant entre <MAPPING> et <FIN> est généré automatiquement.
    		// Il sera effacé et recréé entièrement à chaque génération depuis l'analyse.
    		<MAPPING>
    		m_pkPK_Produit		est un entier sur 8 octets	<MAPPING=PK_Produit, clé unique>
    		m_sNDX_NomProduit	est une chaîne ANSI			<MAPPING=NDX_NomProduit>
    		<FIN>
    		m_nEntrées est un entier
    		m_nSorties est un entier
    		m_nBalance est entier
    FIN
     
    //Propriétés (Equivalent WINDEV des getter/setter)
    PROCÉDURE PUBLIQUE p_nBalance() : entier
    RENVOYER m_nBalance
    PROCÉDURE PUBLIQUE p_nBalance(nValeur est un entier)
    m_nBalance=nValeur
     
    PROCÉDURE PUBLIQUE p_nEntrées() : entier
    RENVOYER m_nEntrées
    PROCÉDURE PUBLIQUE p_nEntrées(nValeur est un entier)
    m_nEntrées=nValeur
     
    PROCÉDURE PUBLIQUE p_nSorties() : entier
    RENVOYER m_nSorties
    PROCÉDURE PUBLIQUE p_nSorties(nValeur est un entier)
    m_nSorties=nValeur
     
    PROCÉDURE PUBLIQUE p_pkPK_Produit() : entier sur 8 octets
    RENVOYER m_pkPK_Produit
    PROCÉDURE PUBLIQUE p_pkPK_Produit(pkValeur est un entier sur 8 octets)
    m_pkPK_Produit=pkValeur
     
    PROCÉDURE PUBLIQUE p_sNDX_NomProduit() : chaîne
    RENVOYER m_sNDX_NomProduit
    PROCÉDURE PUBLIQUE p_sNDX_NomProduit(sValeur est une chaîne)
    m_sNDX_NomProduit=sValeur
     
    //Cumul des entrées
    PROCÉDURE Entrée(nQuantité est entier)
    :p_nEntrées+=nQuantité
     
    //Cumul des sorties
    PROCÉDURE Sortie(nQuantité est entier)
    :p_nSorties+=nQuantité
     
    //calcul de la balance
    PROCÉDURE Balance()
    :p_nBalance=p_nEntrées-p_nSorties
    Code demandé
    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
     
    FONCTION RécapMouvement():tableau de MProduit
    tabBalance est tableau de MProduit
    clProduitEnCours est MProduit
    nLigneTableau est un entier
     
    POUR TOUT Enr 
    	nLigneTableau=TableauCherche(tabBalance,tcLinéaire,"m_pkPK_Produit",Enr.FK_Produit)
    	SI nLigneTableau=-1 ALORS	//On crée la ligne
    		clProduitEnCours=allouer un MProduit
    		HLitRecherchePremier(Produit,PK_Produit,Enr.FK_Produit)
    		FichierVersMémoire(clProduitEnCours,Produit)
    		nLigneTableau=TableauAjoute(tabBalance,clProduitEnCours)
    	FIN
    	SELON Enr.FK_Mouvement
    		CAS 1 //Entrée
    			tabBalance[nLigneTableau]:Entrée(Enr.Qté)
    		CAS 2 //Sortie
    			tabBalance[nLigneTableau]:Sortie(Enr.Qté)
    	FIN
    	tabBalance[nLigneTableau]:Balance()
    FIN
    RENVOYER tabBalance
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  4. #4
    Membre éclairé
    Avatar de Narwe
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2013
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 253
    Points : 668
    Points
    668
    Par défaut
    Citation Envoyé par Voroltinquo Voir le message
    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
     
    SELECT 
    	REQ_Mouvement.PK_Produit AS PK_Produit,	
    	REQ_Mouvement.NomProduit AS NomProduit,	
    	REQ_Mouvement.Entrées AS Entrées,	
    	REQ_Mouvement.Sorties AS Sorties,	
    	REQ_Mouvement.Entrées-REQ_Mouvement.Sorties AS Balance
    FROM 
    	(
    	SELECT 
    		REQ_Entrée.PK_Produit AS PK_Produit,	
    		REQ_Entrée.NomProduit AS NomProduit,	
    		REQ_Entrée.NbEntrée AS Entrées,	
    		REQ_Sortie.NbSortie AS Sorties
    	FROM
    		(
    		SELECT 
    			Enr.FK_Produit AS PK_Produit,	
    			Produit.NDX_NomProduit AS NomProduit,	
    			SUM(Enr.Qté) AS NbEntrée
    		FROM 
    			Produit,	
    			Enr,	
    			Mouvement
    		WHERE 
    			Mouvement.PK_Mouvement = Enr.FK_Mouvement
    			AND		Produit.PK_Produit = Enr.FK_Produit
    			AND
    			(
    			Mouvement.NDX_Mouvement = 'Entrée'
    			)
    		GROUP BY 
    			Enr.FK_Produit,	
    			Produit.NDX_NomProduit
    			) AS REQ_Entrée,	
    		(
    		SELECT 
    			Enr.FK_Produit AS PK_Produit,	
    			Produit.NDX_NomProduit AS NomProduit,	
    			SUM(Enr.Qté) AS NbSortie
    		FROM 
    			Produit,	
    			Enr,	
    			Mouvement
    		WHERE 
    			Mouvement.PK_Mouvement = Enr.FK_Mouvement
    			AND		Produit.PK_Produit = Enr.FK_Produit
    			AND
    			(
    			Mouvement.NDX_Mouvement = 'Sortie'
    			)
    		GROUP BY 
    			Enr.FK_Produit,	
    			Produit.NDX_NomProduit
    		) AS REQ_Sortie
    	WHERE 
    	REQ_Sortie.PK_Produit = REQ_Entrée.PK_Produit) AS REQ_Mouvement
    Il est possible de simplifier la requête avec une utilisation de DECODE

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT P.PK_Produit, P.NDX_NomProduit
    	 , SUM(DECODE(M.NDX_Mouvement, 'Entrée', E.Qté, 0)) Tot_Entrée
    	 , SUM(DECODE(M.NDX_Mouvement, 'Sortie', E.Qté, 0)) Tot_Sortie
    	 , SUM(DECODE(M.NDX_Mouvement, 'Sortie', (E.Qté *-1), E.Qté)) TotStock
     
    FROM Enr E
    INNER JOIN Mouvement M ON (M.FK_Mouvement=M.PK_Mouvement)
    INNER JOIN Produit P ON (P.PK_Produit=E.FK_Produit)
     
    GROUP BY P.PK_Produit, P.NDX_NomProduit

  5. #5
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 808
    Points : 5 267
    Points
    5 267
    Billets dans le blog
    1
    Par défaut
    Je l'avais testé, celle là, mais il faut passer par une pseudo connexion (ou alors être en C/S.)
    Les mystères de Windev et de sa gestion du SQL.
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  6. #6
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 056
    Points : 9 396
    Points
    9 396
    Par défaut
    Tu parles de logiciel de gestion de Stock.
    Avant d'extraire des statistiques de ta base de données (faire des DSUM() ...), il faut construire ta base de données. Il faut un modèle de données.
    Normalement, tu vas choisir HFSQLCS pour stocker tes données. Ou un autre outil de type SGBDR.
    Tu peux aussi stocker tes données dans des fichiers Excel ou dans Access, mais dans ce cas, ça va être du bricolage.

    La première chose que tu dois décider, c'est donc ça : comment tu stockes tes données.
    Tous les autres intervenants t'ont répondu en partant du principe que tu utilisais une vraie base de donnée (pas Excel, ni Access).
    C'est la bonne piste.
    Mais il faut que tu apprennes pas mal de chose sur SQL ou les SGBDR pour commencer.

    SQL SGBDR ... c'est des mots clés qui vont t'aider à rechercher des tutoriels.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2012
    Messages : 195
    Points : 83
    Points
    83
    Par défaut
    Je tente mais vraiment je suis hyper perdu je suis hyper perdu je n'arrive pas à m'en sortir

  8. #8
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 808
    Points : 5 267
    Points
    5 267
    Billets dans le blog
    1
    Par défaut
    Si tu expliquais où était le problème, on pourrait peut être mieux te renseigner.
    Dans un premier temps, as tu créé ton MLD ?
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2012
    Messages : 195
    Points : 83
    Points
    83
    Par défaut
    Je pense que MLD est comme la base de donnée si Oui j'ai crée.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/03/2018, 16h39
  2. [XL-2010] Colorer de facons differente des plage de cellules en fonction d'une somme dans des cellules
    Par lionel.koch dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 21/08/2016, 09h33
  3. [AC-2007] Fonction DSum dans une requête
    Par jmde dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 31/03/2015, 02h08
  4. Réponses: 3
    Dernier message: 06/08/2009, 17h09
  5. Fonction DSUM dans un recordset
    Par vlksoft dans le forum VBA Access
    Réponses: 4
    Dernier message: 21/01/2009, 09h11

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