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 :

Calcul des soldes des données de différentes devises [WD15]


Sujet :

WinDev

  1. #1
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2013
    Messages : 75
    Points : 44
    Points
    44
    Par défaut Calcul des soldes des données de différentes devises
    Salut à tous!
    Je suis entrain de vouloir faire les soldes des différentes devises concernées dans les paramètres (année) de mes rapports des recettes et des dépenses!
    Les codes ci-dessous créent justement mes rapports (recettes ou dépenses) selon le type opération choisi et en fonction de l'année passé comme parametre.
    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
    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
    nNb_colonne est un entier
    sMa_requete est une chaîne
    sdRQ1 est une Source de Données
    sdRQ2 est une Source de Données
    sMa_requete = [
    SELECT DISTINCT 
    OPERATION.Cod_devise AS Cod_devise
    FROM 
    OPERATION
    WHERE 
    ]
    sMa_requete += RC + TAB + "Left(OPERATION.Dat_operation,4) = '" +  SAI_Saisie1 + "'"	
     
    SI COMBO_Opération..ValeurAffichée <> "" ALORS
    	sMa_requete += RC + TAB + "AND OPERATION.Typ_operation = '" + COMBO_Opération..ValeurAffichée + "'"		
    FIN
     
    // Exécution de la requête
    SI PAS HExécuteRequêteSQL(sdRQ1,MaConnexion1,hRequêteSansCorrection,sMa_requete) ALORS Erreur("Problème requête 1"); RETOUR
     
    sMa_requete = [
    SELECT  
    op.Num_compte,
    COMPTE.Lib_compte,
    ]
    // Les colonnes de devise sont construites dynamiquement ici
    POUR TOUT sdRQ1 
    	sMa_requete += RC + TAB + "SUM(CASE op.Cod_devise WHEN '" + sdRQ1.Cod_devise + "' THEN op.Mont ELSE 0 END) AS " + sdRQ1.Cod_devise + ","	
    FIN
     
    // La sous requête "op" effectue les conversions des devises
    sMa_requete += RC + [
    Sum(op.TOT) AS TOT
    FROM
    (
    SELECT  
    OPERATION.Num_compte,
    OPERATION.Cod_devise,
    OPERATION.mont,
    Taux_USD,
    DEVISE.Taux,
    OPERATION.mont * Taux_USD / DEVISE.Taux AS TOT
    FROM 
    OPERATION,
    DEVISE,
    (	SELECT	Taux AS Taux_USD
    FROM		DEVISE
    WHERE	Cod_devise = 'USD'
    ) AS	USD
    WHERE 
    OPERATION.Cod_devise = DEVISE.Cod_devise
    ]
     
    sMa_requete += RC + TAB + "AND Left(OPERATION.Dat_operation,4) = '" +  SAI_Saisie1 + "'"
     
    SI COMBO_Opération..ValeurAffichée <> "" ALORS
    	sMa_requete += RC + TAB + "AND OPERATION.Typ_operation = '" + COMBO_Opération..ValeurAffichée + "'"		
    FIN
    sMa_requete += RC + [
    ) AS op,
    COMPTE
    WHERE 
    op.Num_compte = COMPTE.Num_compte
    GROUP by Num_compte,Lib_compte
    ORDER BY Num_compte ASC
    ]
     
    // copie sMa_requete vers le presse papier pour le debogage
    Res est un entier
    Res = VersPressePapier(sMa_requete)
    SI Res = Faux ALORS
    	Erreur("Erreur lors de l'écriture dans le presse-papiers")
    FIN
     
    // Exécution de la requête
    SI PAS HExécuteRequêteSQL(sdRQ2,MaConnexion1,hRequêteSansCorrection,sMa_requete) ALORS Erreur("Problème requête 2"); RETOUR
     
    // remplit la table TCD
    ConstruitTableFichier(TABLE_TCD_operation_periode,sdRQ2,taRemplirTable)
     
    // renomme les colonnes
    {"TABLE_TCD_operation_periode._COL1",indChamp}..Titre = "N° compte"
     
    {"TABLE_TCD_operation_periode._COL2",indChamp}..Titre = "Libellé compte"
     
    nNb_colonne = TableOccurrence(TABLE_TCD_operation_periode,toColonne)
    {"TABLE_TCD_operation_periode._COL"+nNb_colonne,indChamp}..Titre = "TOT (USD)"
     
    nNb_ligne est un entier
    TableAjouteLigne(TABLE_TCD_operation_periode)
    nNb_ligne = TableOccurrence(TABLE_TCD_operation_periode)
    {"TABLE_TCD_operation_periode._COL1",indChamp}[nNb_ligne] = "TOTAUX"
    POUR i = 3 A nNb_colonne
    	{"TABLE_TCD_operation_periode._COL" + i,indChamp}[nNb_ligne] = {"TABLE_TCD_operation_periode._COL" + i,indChamp}[ligneTotal]
    FIN
    {"TABLE_TCD_operation_periode",indChamp}[nNb_ligne]..CouleurFond = GrisFoncé
    Ce qui me donne quelque chose du genre:
    N° compte-------Libéllé compte------FC------USD------EURO-----TOT (USD)

    qui peut être pour les recettes ou pour les dépenses, tout dépend du choix de l'opération ou type opération choisi.

    Mais ce que je veux obtenir c'est une requête qui va me récupérer les résultats des recettes comme des dépenses de l'année passée en paramètre dans Sai_saisie1 puis en calculer et afficher seulement les soldes pour chaque devises concernées avec la formule : solde = recette - dépense, plus précisément : FC (recette) - Fc(dépense), USD(recette) - USD(Dépense)... TOT(USD) recette - TOT(USD) dépense.

    Merci d'avance pour votre aide!
    pour plus de précision j'ai joint mon analyse!
    Bonne année 2014 à tous!
    Images attachées Images attachées  

  2. #2
    Membre actif
    Homme Profil pro
    Inscrit en
    Mai 2003
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2003
    Messages : 151
    Points : 252
    Points
    252
    Par défaut
    Bonjour,
    Juste une petite question, ton taux de devise est le même d'une année sur l'autre ?

    D'après ce que je vois dans tes requêtes , tu vas calculer tes recettes et dépenses de l'année précédente avec le taux de l'année en cours.
    C'est ce que tu veux ?

    Généralement quand on gère des devises on fait un lien , non seulement sur le code taux, comme tu le fais, mais aussi, et surtout, par rapport à une date d'application.
    Si la réponse vous a aidé, pensez à cliquer sur .

  3. #3
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2013
    Messages : 75
    Points : 44
    Points
    44
    Par défaut
    Merci de ta réponse Cogito.11!
    Au fait le solde à calculer doit être en fonction des recettes et dépenses d'une même année (paramètre)!


    Citation Envoyé par Cogito.11 Voir le message
    Juste une petite question, ton taux de devise est le même d'une année sur l'autre ?

    D'après ce que je vois dans tes requêtes , tu vas calculer tes recettes et dépenses de l'année précédente avec le taux de l'année en cours.
    C'est ce que tu veux ?

    Généralement quand on gère des devises on fait un lien , non seulement sur le code taux, comme tu le fais, mais aussi, et surtout, par rapport à une date d'application.
    Mon problème ici n'est pas de gérer le taux ou les devises, je l'ai déjà géré dans mes procédures, je cherche tout simplement à trouver les soldes selon que ma procédure peut afficher les recettes et les dépenses (voir type opération du fichier OPERATION)

  4. #4
    Membre chevronné Avatar de laurent30s
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 881
    Points : 1 771
    Points
    1 771
    Par défaut
    donne une image de ce que tu veux obtenir ça aidera à comprendre ce que tu veux faire.
    Par ce que là ça reste flou...
    Bon dev
    Laurent

    - C’est génial.
    - Non c’est bizarre.
    - Justement quand c’est simple y’a des milliers de réponses et quand c’est bizarre y’en a aucune.

  5. #5
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2013
    Messages : 75
    Points : 44
    Points
    44
    Par défaut
    Merci de ta réponse Laurent!
    Dans l'image que j'ai joint la première représente justement la requête que forme la procédure locale dont j'ai mis les codes, cette requête est paramétrée par l'année et par type opération. si le type est recette la requête ne va donner que les résultats des recettes et vis versa. Hors pour calculer le solde on a besoin des recettes et dépenses en même temps (d'une même année bien sur) d'où le paramètre type opération doit tomber. je veux que quant je passe le paramètre de l'année par ex 2013, que la procédure me donne pour chaque devise le reste entre le montant recette et le montant dépense de cette même année. tout en précisant que les rubriques numéro et libellé compte ne seront pas concernés dans le résultat de notre requête. voir la deuxième image (solde)

    Merci d'avance!
    Images attachées Images attachées  

  6. #6
    Membre chevronné Avatar de laurent30s
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 881
    Points : 1 771
    Points
    1 771
    Par défaut
    J'essaye encore de comprendre...

    Dans ton image il y a 3 tables.

    Je crois comprendre que pour le 2 premières c'est bon, tu t'es débrouillé.
    Tu utilises une requête en lui passant en paramètre les types opération recettes ou dépenses.
    Est-ce que c'est bien ça les 2 premières tables fonctionnent correctement ?

    La 3ème table présente les cumuls par devise.
    En partant du principe que la requête que tu donnes fonctionne pour les recettes/dépenses

    Il faut modifier cette requête
    1 - Qu'il s'agisse de recette ou de dépense OPERATION.mont est positif on ne peut pas l’additionner tel quel. Il faut transformer en montant positif ou négatif selon que Typ_operation correspond à une recette ou une dépense.
    2 - Tu filtres le type d'opération, là il faut les 2, donc il faut supprimer cette condition.
    3 - Tu veux que la somme fasse pour tout les comptes. Pour cela il faut supprimer dans le SELECT les colonnes op.Num_compte et COMPTE.Lib_compte et les GROUP et ORDER en bas de requête.
    4 - Plus besoin de renommer les colonnes No compte et libelle compte puisque tu ne les as plus
    5 - Le nommage des colonnes des devises commence maintenant à la 1ère et plus à la 3ème (les colonnes No compte et libelle compte ne sont plus là)
    6 - Tu peux également supprimer le changement de couleur de la dernière ligne de la table puisque là tu n'en aura qu'une

    J'ai repris ta requête
    - En bleu les lignes ajoutées ou modifiées
    - En rouge les lignes a supprimer (SINON CA NE MARCHERA PAS)

    ATTENTION dans les CASE je teste les valeurs de Typ_operation(en vert). Comme je ne sais pas ce que tu utilises j'ai mis 'Recette' et 'Depense' remplace les par tes valeurs...

    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
    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
    97
    98
    99
    100
    101
    102
    nNb_colonne est un entier
    sMa_requete est une chaîne
    sdRQ1 est une Source de Données
    sdRQ2 est une Source de Données
    sMa_requete = [
    SELECT DISTINCT 
    	OPERATION.Cod_devise AS Cod_devise
    FROM 
    	OPERATION
    WHERE 
    ]
    sMa_requete += RC + TAB + "Left(OPERATION.Dat_operation,4) = '" +  SAI_Saisie1 + "'"	
     
    SI COMBO_Opération..ValeurAffichée <> "" ALORS
    	sMa_requete += RC + TAB + "AND OPERATION.Typ_operation = '" + COMBO_Opération..ValeurAffichée + "'"
    FIN
    
    // Exécution de la requête
    SI PAS HExécuteRequêteSQL(sdRQ1,MaConnexion1,hRequêteSansCorrection,sMa_requete) ALORS Erreur("Problème requête 1"); RETOUR
    
    sMa_requete = [
    SELECT  
    	op.Num_compte,
    	COMPTE.Lib_compte,
    ]
    // Les colonnes de devise sont construites dynamiquement ici
    POUR TOUT sdRQ1 
    	sMa_requete += RC + TAB + "SUM(CASE op.Cod_devise WHEN '" + sdRQ1.Cod_devise + "' THEN op.Mont ELSE 0 END) AS " + sdRQ1.Cod_devise + ","	
    FIN
    
    // La sous requête "op" effectue les conversions des devises
    sMa_requete += RC + [
    	Sum(op.TOT) AS TOT
    FROM
    	(
    		SELECT  
    			OPERATION.Num_compte,
    			OPERATION.Cod_devise,
    			CASE Typ_operation
    				WHEN 'Recette'	THEN OPERATION.mont
    				WHEN 'Depense'	OPERATION.mont * -1
    			END AS mont,
    			Taux_USD,
    			DEVISE.Taux,
    			CASE Typ_operation 
    				WHEN 'Recette'	THEN OPERATION.mont * Taux_USD / DEVISE.Taux
    				WHEN 'Depense'	THEN OPERATION.mont * Taux_USD / DEVISE.Taux * -1
    			END AS TOT
    		FROM 
    			OPERATION,
    			DEVISE,
    			(	SELECT	Taux AS Taux_USD
    				FROM		DEVISE
    				WHERE	Cod_devise = 'USD'
    			) AS	USD
    		WHERE 
    			OPERATION.Cod_devise = DEVISE.Cod_devise
    ]
    
    sMa_requete += RC + TAB + "AND Left(OPERATION.Dat_operation,4) = '" +  SAI_Saisie1 + "'"
    
    SI COMBO_Opération..ValeurAffichée <> "" ALORS
    	sMa_requete += RC + TAB + "AND OPERATION.Typ_operation = '" + COMBO_Opération..ValeurAffichée + "'"
    FIN
    sMa_requete += RC + [
    	) AS op,
    	COMPTE
    WHERE 
    	op.Num_compte = COMPTE.Num_compte
    GROUP by Num_compte,Lib_compte
    ORDER BY Num_compte ASC
    ]
    
    // copie sMa_requete vers le presse papier pour le debogage
    Res est un entier
    Res = VersPressePapier(sMa_requete)
    SI Res = Faux ALORS
    	Erreur("Erreur lors de l'écriture dans le presse-papiers")
    FIN
    
    // Exécution de la requête
    SI PAS HExécuteRequêteSQL(sdRQ2,MaConnexion1,hRequêteSansCorrection,sMa_requete) ALORS Erreur("Problème requête 2"); RETOUR
    
    // remplit la table TCD
    ConstruitTableFichier(TABLE_TCD_operation_periode,sdRQ2,taRemplirTable)
    
    // renomme les colonnes
    {"TABLE_TCD_operation_periode._COL1",indChamp}..Titre = "N° compte"
    
    {"TABLE_TCD_operation_periode._COL2",indChamp}..Titre = "Libellé compte"
    
    nNb_colonne = TableOccurrence(TABLE_TCD_operation_periode,toColonne)
    {"TABLE_TCD_operation_periode._COL"+nNb_colonne,indChamp}..Titre = "TOT (USD)"
    
    nNb_ligne est un entier
    TableAjouteLigne(TABLE_TCD_operation_periode)
    nNb_ligne = TableOccurrence(TABLE_TCD_operation_periode)
    {"TABLE_TCD_operation_periode._COL1",indChamp}[nNb_ligne] = "TOTAUX"
    POUR i = 1 A nNb_colonne
    	{"TABLE_TCD_operation_periode._COL" + i,indChamp}[nNb_ligne] = {"TABLE_TCD_operation_periode._COL" + i,indChamp}[ligneTotal]
    FIN
    {"TABLE_TCD_operation_periode",indChamp}[nNb_ligne]..CouleurFond = GrisFoncé
    Je n'ai pas testé, il est possible qu'il y ai un problème résiduel.
    Comme la requête est sauvegardée dans le presse papier avant d'être exécuté, s'il y a un problème en faisant un coller tu pourras me la montrer pour que je regarde ce qui ne va pas.
    Tiens moi informé...
    Bon dev
    Laurent

    - C’est génial.
    - Non c’est bizarre.
    - Justement quand c’est simple y’a des milliers de réponses et quand c’est bizarre y’en a aucune.

  7. #7
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2013
    Messages : 75
    Points : 44
    Points
    44
    Par défaut
    Merci Laurent pour ta réponse!
    L'exécution de cette procédure me renvoie ce message d'erreur : "Problème Requête 2"

    Voici les codes de la requête créée par la variable sMa_requete:
    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
    SELECT  
    Sum(op.TOT) AS TOT
    FROM
    (
    SELECT  
    OPERATION.Num_compte,
    OPERATION.Cod_devise,
    CASE Typ_operation
    WHEN 'Recette'	THEN OPERATION.mont
    WHEN 'Dépense'	OPERATION.mont * -1
    END AS mont,
    Taux_USD,
    DEVISE.Taux,
    CASE Typ_operation 
    WHEN 'Recette'	THEN OPERATION.mont * Taux_USD / DEVISE.Taux
    WHEN 'Dépense'	THEN OPERATION.mont * Taux_USD / DEVISE.Taux * -1
    END AS TOT
    FROM 
    OPERATION,
    DEVISE,
    (	SELECT	Taux AS Taux_USD
    FROM		DEVISE
    WHERE	Cod_devise = 'USD'
    ) AS	USD
    WHERE 
    OPERATION.Cod_devise = DEVISE.Cod_devise
    	AND Left(OPERATION.Dat_operation,4) = '2012'
    ) AS op,
    COMPTE
    WHERE 
    op.Num_compte = COMPTE.Num_compte
    Citation Envoyé par laurent30s Voir le message
    Est-ce que c'est bien ça les 2 premières tables fonctionnent correctement ?
    Oui les deux premières requêtes fonctionnent correctement.

    Pour les autres détails, c'est le résultat de la requête qui le déterminera mais il me semble que ma préoccupation a été bel et bien comprise. et merci beaucoup pour les détails qui m'a éclairer sur beaucoup de choses.

    Merci d'avance Laurent de ta disponibilité et de ton aide!!!

  8. #8
    Membre chevronné Avatar de laurent30s
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 881
    Points : 1 771
    Points
    1 771
    Par défaut
    Ci-dessous les remarques sur la requête générée actuellement

    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
    SELECT  
    
    	// Apparemment la première requête n'a pas fonctionnée, ici il devrait y avoir la SOMME pour chacune des devises concernées
    	// Assure toi que SAI_Saisie1 corresponde à une année où il y a des données
    
    	Sum(op.TOT) AS TOT
    FROM
    	(
    		SELECT  
    			OPERATION.Num_compte,
    			OPERATION.Cod_devise,
    			CASE Typ_operation
    				WHEN 'Recette'	THEN 	OPERATION.mont						// est-ce que les valeurs que peut prendre Typ_operation sont 'Recette' ou 'Depense'
    				WHEN 'Dépense'	THEN	OPERATION.mont * -1					// si ce n'est pas le cas il faut que tu les remplaces par tes valeurs
    														// j'avais également oublié un THEN
    			END AS mont,
    			Taux_USD,
    			DEVISE.Taux,
    			CASE WHEN DEVISE.Taux <> 0 THEN								// ajouter une condition pour être sur de ne pas faire une division par 0
    				CASE Typ_operation 
    					WHEN 'Recette'	THEN OPERATION.mont * Taux_USD / DEVISE.Taux		// même remarque
    					WHEN 'Dépense'	THEN OPERATION.mont * Taux_USD / DEVISE.Taux * -1	// que plus haut
    				END
    			ELSE
    				1
    			END AS TOT
    			
    		FROM 
    			OPERATION,
    			DEVISE,
    			(	SELECT	Taux AS Taux_USD
    				FROM	DEVISE
    				WHERE	Cod_devise = 'USD'
    			) AS	USD
    		WHERE 
    			OPERATION.Cod_devise = DEVISE.Cod_devise
    		AND	Left(OPERATION.Dat_operation,4) = '2012'
    	) AS op,
    	COMPTE
    WHERE 
    	op.Num_compte = COMPTE.Num_compte
    Le code devient

    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
    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
    97
    98
    99
    100
    101
    102
    103
    104
    Res est un entier		// juste déplacé
    nNb_colonne est un entier
    sMa_requete est une chaîne
    sdRQ1 est une Source de Données
    sdRQ2 est une Source de Données
    sMa_requete = [
    SELECT DISTINCT 
    	OPERATION.Cod_devise AS Cod_devise
    FROM 
    	OPERATION
    WHERE 
    ]
    sMa_requete += RC + TAB + "Left(OPERATION.Dat_operation,4) = '" +  (Val(SAI_Annee))  + "'"	
    // copie sMa_requete vers le presse papier pour le debogage							// ajouté pour le debogage
    Res = VersPressePapier(sMa_requete)
    SI Res = Faux ALORS
    	Erreur("Erreur lors de l'écriture dans le presse-papiers")
    FIN
    
    // Exécution de la requête
    SI PAS HExécuteRequêteSQL(sdRQ1,MaConnexion1,hRequêteSansCorrection,sMa_requete) ALORS Erreur("Problème requête 1"); RETOUR
    
    SI HNbEnr(sdRQ1) = 0 ALORS											// ajouté pour s'assurer que la sélection n'est pas vide
    	Erreur("La requête 1 ne retourne aucune enregistrement assurez vous qu'il y a  des enregistrements pour l'année sélectionnée", ...
    			"La requête 1 est dans le presse papier vous pouvez la coller avant de passer à la suite")
    	RETOUR
    FIN
    
    sMa_requete = [
    SELECT  
    ]
    // Les colonnes de devise sont construites dynamiquement ici
    POUR TOUT sdRQ1 
    	sMa_requete += RC + TAB + "SUM(CASE op.Cod_devise WHEN '" + sdRQ1.Cod_devise + "' THEN op.Mont ELSE 0 END) AS " + sdRQ1.Cod_devise + ","	
    FIN
    
    // La sous requête "op" effectue les conversions des devises
    sMa_requete += RC + [
    	Sum(op.TOT) AS TOT
    FROM
    	(
    		SELECT  
    			OPERATION.Num_compte,
    			OPERATION.Cod_devise,
    			CASE Typ_operation
    				WHEN 'Recette'	THEN	OPERATION.mont
    				WHEN 'Depense'	THEN	OPERATION.mont * -1					// le THEN oublié et penser de remplacer les valeurs 'Recette'/'Depense' par tes valeurs si nécessaire
    			END AS mont,
    			CASE WHEN DEVISE.Taux <> 0 THEN								// condition ajoutée pour s'assurer qu'il n'y a pas une division par 0 qui provoquerait une erreur
    				CASE Typ_operation 
    					WHEN 'Recette'	THEN	OPERATION.mont * Taux_USD / DEVISE.Taux		// pour 'Recette'/'Depense' même remarque que plus haut
    					WHEN 'Depense'	THEN	OPERATION.mont * Taux_USD / DEVISE.Taux * -1
    				END
    			ELSE
    				1
    			END AS TOT,
    			Taux_USD,
    			DEVISE.Taux
    
    		FROM 
    			OPERATION,
    			DEVISE,
    			(	SELECT	Taux AS Taux_USD
    				FROM	DEVISE
    				WHERE	Cod_devise = 'USD'
    			) AS	USD
    		WHERE 
    			OPERATION.Cod_devise = DEVISE.Cod_devise
    ]
    
    sMa_requete += RC + TAB + "AND Left(OPERATION.Dat_operation,4) = '" +  (Val(SAI_Annee)) + "'"
    
    
    sMa_requete += RC + [
    	) AS op,
    	COMPTE
    WHERE 
    	op.Num_compte = COMPTE.Num_compte
    ]
    
    // copie sMa_requete vers le presse papier pour le debogage
    Res = VersPressePapier(sMa_requete)
    SI Res = Faux ALORS
    	Erreur("Erreur lors de l'écriture dans le presse-papiers")
    FIN
    
    // Exécution de la requête
    SI PAS HExécuteRequêteSQL(sdRQ2,MaConnexion1,hRequêteSansCorrection,sMa_requete) ALORS Erreur("Problème requête 2"); RETOUR
    
    // remplit la table TCD
    ConstruitTableFichier(TABLE_TCD_operation_periode,sdRQ2,taRemplirTable)
    
    // renomme les colonnes
    
    nNb_colonne = TableOccurrence(TABLE_TCD_operation_periode,toColonne)
    {"TABLE_TCD_operation_periode._COL"+nNb_colonne,indChamp}..Titre = "TOT (USD)"
    
    nNb_ligne est un entier
    TableAjouteLigne(TABLE_TCD_operation_periode)
    nNb_ligne = TableOccurrence(TABLE_TCD_operation_periode)
    {"TABLE_TCD_operation_periode._COL1",indChamp}[nNb_ligne] = "TOTAUX"
    POUR i = 1 A nNb_colonne
    	{"TABLE_TCD_operation_periode._COL" + i,indChamp}[nNb_ligne] = {"TABLE_TCD_operation_periode._COL" + i,indChamp}[ligneTotal]
    FIN
    S'il y a encore un problème envoi moi les copies des requêtes générées
    Mais là on doit pas être loin d'être bon...
    Bon dev
    Laurent

    - C’est génial.
    - Non c’est bizarre.
    - Justement quand c’est simple y’a des milliers de réponses et quand c’est bizarre y’en a aucune.

  9. #9
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2013
    Messages : 75
    Points : 44
    Points
    44
    Par défaut
    Merci Laurent de résoudre ce problème!
    Le résultat est vraiment ce que je voulais seulement il se pose un petit problème de duplication des données!
    Dans le fichier joint se trouve le résultat de la procédure dans une table!

    voici le code géneré par la variable sMa_requete.
    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
    SELECT  
    	SUM(CASE op.Cod_devise WHEN 'CDF' THEN op.Mont ELSE 0 END) AS CDF,
    	SUM(CASE op.Cod_devise WHEN 'USD' THEN op.Mont ELSE 0 END) AS USD,
    	SUM(CASE op.Cod_devise WHEN 'LSTL' THEN op.Mont ELSE 0 END) AS LSTL,
    	SUM(CASE op.Cod_devise WHEN 'EURO' THEN op.Mont ELSE 0 END) AS EURO,
    	SUM(CASE op.Cod_devise WHEN 'FCFA' THEN op.Mont ELSE 0 END) AS FCFA,
    Sum(op.TOT) AS TOT
    FROM
    (
    SELECT  
    OPERATION.Num_compte,
    OPERATION.Cod_devise,
    CASE Typ_operation
    WHEN 'Recette'	THEN	OPERATION.mont
    WHEN 'Dépense'	THEN	OPERATION.mont * -1					// le THEN oublié et penser de remplacer les valeurs 'Recette'/'Dépense' par tes valeurs si nécessaire
    END AS mont,
    CASE WHEN DEVISE.Taux <> 0 THEN								// condition ajoutée pour s'assurer qu'il n'y a pas une division par 0 qui provoquerait une erreur
    CASE Typ_operation 
    WHEN 'Recette'	THEN	OPERATION.mont * Taux_USD / DEVISE.Taux		// pour 'Recette'/'Dépense' même remarque que plus haut
    WHEN 'Dépense'	THEN	OPERATION.mont * Taux_USD / DEVISE.Taux * -1
    END
    ELSE
    1
    END AS TOT,
    Taux_USD,
    DEVISE.Taux
     
    FROM 
    OPERATION,
    DEVISE,
    (	SELECT	Taux AS Taux_USD
    FROM	DEVISE
    WHERE	Cod_devise = 'USD'
    ) AS	USD
    WHERE 
    OPERATION.Cod_devise = DEVISE.Cod_devise
    	AND Left(OPERATION.Dat_operation,4) = '2013'
    ) AS op,
    COMPTE
    WHERE 
    op.Num_compte = COMPTE.Num_compte
    Merci beaucoup Laurent! c'est cool et génial!

  10. #10
    Membre chevronné Avatar de laurent30s
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 881
    Points : 1 771
    Points
    1 771
    Par défaut
    Citation Envoyé par djenny Voir le message
    Merci Laurent de résoudre ce problème!
    Le résultat est vraiment ce que je voulais seulement il se pose un petit problème de duplication des données!
    C'est bon ou c'est pas bon ???

    Citation Envoyé par djenny Voir le message
    Dans le fichier joint se trouve le résultat de la procédure dans une table!
    Quel fichier joint ?
    Bon dev
    Laurent

    - C’est génial.
    - Non c’est bizarre.
    - Justement quand c’est simple y’a des milliers de réponses et quand c’est bizarre y’en a aucune.

  11. #11
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2013
    Messages : 75
    Points : 44
    Points
    44
    Par défaut
    Désolé Laurent j'avais oublié de joindre cette image!
    Le résultat de la requête est bel et bien ce que je voulais seulement ça se répète sur la deuxième ligne également, voir fichier joint!

    Merci.
    Images attachées Images attachées  

  12. #12
    Membre chevronné Avatar de laurent30s
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 881
    Points : 1 771
    Points
    1 771
    Par défaut
    Je vois que j'avais laisser la liaison vers le fichier COMPTE alors qu'on n'a plus besoin du Libellé.
    J'ai enlevé cette liaison ça ce passe en bas de la 2ème requête
    Tiens moi informé si ça résout le problème...

    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
    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
    Res est un entier
    nNb_colonne est un entier
    sMa_requete est une chaîne
    sdRQ1 est une Source de Données
    sdRQ2 est une Source de Données
    sMa_requete = [
    SELECT DISTINCT 
    	OPERATION.Cod_devise AS Cod_devise
    FROM 
    	OPERATION
    WHERE 
    ]
    sMa_requete += RC + TAB + "Left(OPERATION.Dat_operation,4) = '" +  (Val(SAI_Annee))  + "'"	
    // copie sMa_requete vers le presse papier pour le debogage
    Res = VersPressePapier(sMa_requete)
    SI Res = Faux ALORS
    	Erreur("Erreur lors de l'écriture dans le presse-papiers")
    FIN
     
    // Exécution de la requête
    SI PAS HExécuteRequêteSQL(sdRQ1,MaConnexion1,hRequêteSansCorrection,sMa_requete) ALORS Erreur("Problème requête 1"); RETOUR
     
    SI HNbEnr(sdRQ1) = 0 ALORS
    	Erreur("La requête 1 ne retourne aucune enregistrement assurez vous qu'il y a  des enregistrements pour l'année sélectionnée", ...
    			"La requête 1 est dans le presse papier vous pouvez la coller avant de passer à la suite")
    	RETOUR
    FIN
     
    sMa_requete = [
    SELECT  
    ]
    // Les colonnes de devise sont construites dynamiquement ici
    POUR TOUT sdRQ1 
    	sMa_requete += RC + TAB + "SUM(CASE op.Cod_devise WHEN '" + sdRQ1.Cod_devise + "' THEN op.Mont ELSE 0 END) AS " + sdRQ1.Cod_devise + ","	
    FIN
     
    // La sous requête "op" effectue les conversions des devises
    sMa_requete += RC + [
    	Sum(op.TOT) AS TOT
    FROM
    	(
    		SELECT  
    			OPERATION.Num_compte,
    			OPERATION.Cod_devise,
    			CASE Typ_operation
    				WHEN 'Recette'	THEN	OPERATION.mont
    				WHEN 'Depense'	THEN	OPERATION.mont * -1
    			END AS mont,
    			CASE WHEN DEVISE.Taux <> 0 THEN
    				CASE Typ_operation 
    					WHEN 'Recette'	THEN	OPERATION.mont * Taux_USD / DEVISE.Taux
    					WHEN 'Depense'	THEN	OPERATION.mont * Taux_USD / DEVISE.Taux * -1
    				END
    			ELSE
    				1
    			END AS TOT,
    			Taux_USD,
    			DEVISE.Taux
     
    		FROM 
    			OPERATION,
    			DEVISE,
    			(	SELECT	Taux AS Taux_USD
    				FROM	DEVISE
    				WHERE	Cod_devise = 'USD'
    			) AS	USD
    		WHERE 
    			OPERATION.Cod_devise = DEVISE.Cod_devise
    ]
     
    sMa_requete += RC + TAB + "AND Left(OPERATION.Dat_operation,4) = '" +  (Val(SAI_Annee)) + "'"
     
     
    sMa_requete += RC + [
    	) AS op
    ]
     
    // copie sMa_requete vers le presse papier pour le debogage
    Res = VersPressePapier(sMa_requete)
    SI Res = Faux ALORS
    	Erreur("Erreur lors de l'écriture dans le presse-papiers")
    FIN
     
    // Exécution de la requête
    SI PAS HExécuteRequêteSQL(sdRQ2,MaConnexion1,hRequêteSansCorrection,sMa_requete) ALORS Erreur("Problème requête 2"); RETOUR
     
    // remplit la table TCD
    ConstruitTableFichier(TABLE_TCD_operation_periode,sdRQ2,taRemplirTable)
    // renomme les colonnes

    nNb_colonne = TableOccurrence(TABLE_TCD_operation_periode,toColonne)
    {"TABLE_TCD_operation_periode._COL"+nNb_colonne,indChamp}..Titre = "TOT (USD)"

    nNb_ligne est un entier
    TableAjouteLigne(TABLE_TCD_operation_periode)
    nNb_ligne = TableOccurrence(TABLE_TCD_operation_periode)
    {"TABLE_TCD_operation_periode._COL1",indChamp}[nNb_ligne] = "TOTAUX"
    POUR i = 1 A nNb_colonne
    {"TABLE_TCD_operation_periode._COL" + i,indChamp}[nNb_ligne] = {"TABLE_TCD_operation_periode._COL" + i,indChamp}[ligneTotal]
    FIN
    Bon dev
    Laurent

    - C’est génial.
    - Non c’est bizarre.
    - Justement quand c’est simple y’a des milliers de réponses et quand c’est bizarre y’en a aucune.

  13. #13
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2013
    Messages : 75
    Points : 44
    Points
    44
    Par défaut
    Salut Laurent!
    Le problème n'est pas toujours résolu, je pense que ça vient du type opération parce qu'à chaque fois c'est toujours deux enregistrements qui s'affichent, je suppose que l'un est pour la recette et l'autre pour la dépense!

    Merci.

  14. #14
    Membre chevronné Avatar de laurent30s
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 881
    Points : 1 771
    Points
    1 771
    Par défaut
    Citation Envoyé par djenny Voir le message
    Le problème n'est pas toujours résolu, je pense que ça vient du type opération parce qu'à chaque fois c'est toujours deux enregistrements qui s'affichent, je suppose que l'un est pour la recette et l'autre pour la dépense!
    Difficile de comprendre ce qui se passe sans ton jeux de données...

    Si c'est sur qu'il s'agit d'un doublon tu peux limiter le résultat de la requête à 1 enregistrement en plaçant à la fin de la 2ème requête
    LIMIT 1
    Bon dev
    Laurent

    - C’est génial.
    - Non c’est bizarre.
    - Justement quand c’est simple y’a des milliers de réponses et quand c’est bizarre y’en a aucune.

  15. #15
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2013
    Messages : 75
    Points : 44
    Points
    44
    Par défaut
    Désolé Laurent!
    Il y avait une erreur de ma part!
    Pour renommer les colonnes j'avais fais un copié/collé avec les codes d'une autre procédure dans lesquels y'avait ces codes d'ajout d'une ligne qui n'a pas normalement d'importance!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    nNb_ligne est un entier
    	TableAjouteLigne(TABLE_TCD_operation_periode)
    	nNb_ligne = TableOccurrence(TABLE_TCD_operation_periode)
    	{"TABLE_TCD_operation_periode._COL1",indChamp}[nNb_ligne] = "TOTAUX"
    	POUR i = 1 A nNb_colonne
    		{"TABLE_TCD_operation_periode._COL" + i,indChamp}[nNb_ligne] = {"TABLE_TCD_operation_periode._COL" + i,indChamp}[ligneTotal]
    FIN
    Dès lors que je les ai remarqués et supprimés le problème a été résolu!

    Merci beaucoup Laurent de ta disponibilité et de ton aide!

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 16/01/2015, 15h09
  2. Requête pour calculer le solde des fournisseurs
    Par Issam dans le forum Langage SQL
    Réponses: 3
    Dernier message: 03/07/2012, 10h12
  3. [XL-2007] Fonction calculant la somme des chiffres des cellules d'une même couleur
    Par XceSs dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/08/2010, 00h23
  4. [MySQL] Utilisation des fonctions des récupérations des données
    Par Konrad Florczak dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 27/10/2006, 15h17

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