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

Requêtes et SQL. Discussion :

[AC 2013] Additionner des champs sur la base du premier caractère d'un autre champ


Sujet :

Requêtes et SQL.

  1. #1
    Membre expérimenté Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Points : 1 591
    Points
    1 591
    Par défaut [AC 2013] Additionner des champs sur la base du premier caractère d'un autre champ
    Bonjour,

    Problème de logique je suppose... Cela m'échappe !

    La composition de ma table est la suivante:
    Compte => Texte court
    SC = Numérique (Réel double)
    SD = Numérique (Réel double)
    SS = Numérique (Réel double)

    Les N° de comptes sont du style: 1; 10; 100; 1000; 1010; 1020.... 2; 20; 200; 2000; 2010; 2020... 3; etc jusqu'à 9999
    SC; SD; SS étant des montants (€)

    J'aimerais réaliser une requête (ou plusieurs) qui affichera par exemple:

    Sur la ligne du compte "1" la somme de tous les comptes débutant par "1"
    Sur la ligne du compte "2" la somme de tous les comptes débutant par "2", etc

    Sur la ligne du compte "10", la somme de tous les comptes débutants par "10",
    Sur la ligne du compte "20", la somme de tous les comptes débutants par "20", etc

    Sur la ligne du compte "100", la somme de tous les comptes débutants par "100",
    Sur la ligne du compte "200", la somme de tous les comptes débutants par "200", etc

    Sur la ligne des comptes > 999, simplement le montant respectif de chaque compte.

    Exemple:
    Pièce jointe 181166

    J'ai tenté beaucoup de solutions mais... sans succès probant, les additions ne jouaient pas.
    Un grand merci pour vos conseils, je suis un peu en train de me noyer :-)

    Bernard

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 841
    Points : 7 975
    Points
    7 975
    Par défaut
    Bonjour,

    Ta demande est claire, par contre les données que tu donnes ne sont pas assez exhaustives pour proposer une réponse précise.
    1- Il faudrait créer une fonction qui fournirait un nouveau compte qui permettrait les regroupements souhaitées.
    Une fonction de genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Function RegCompte(prCompte as Integer) as Integer
    SELECT CASE prCompte
         CASE <999
              'divers cas à traiter (sur lesquels je disais qu'il faut plus d'informations)
    .................
    ..............
         CASE ELSE
              RegCompte = prCompte
    END SELECT
    End Function
    2- Tu crées une requête à partir de ta table avec un nouveau champ résultant de cette fonction avec comme argument le numéro de compte et tes 3 autres champs numériques. Et tu fais une opération de regroupement sur le nouveau champ et des sommes sur les autres champs numériques avec les fonctions d'agrégation.

    Cordialement,

  3. #3
    Membre expérimenté Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Points : 1 591
    Points
    1 591
    Par défaut
    Tout d'abord, un grand merci de bien vouloir réfléchir avec moi sur ce blème :-)

    Voici donc quelques précisions: Il s'agit d'une balance de vérification pour une application de comptabilité. J'ai donc créé une "Balance" fictive, avec des chiffres simples (afin de ne pas devoir s'amuser avec des calculs qui n'ont rien à voir dans la problématique.

    Pièce jointe 181208

    J'espère avoir été assez "exhaustif" dans les données ? :-)

    Au plaisir de te lire, meilleures salutations.

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 841
    Points : 7 975
    Points
    7 975
    Par défaut
    Bonjour,

    Donc a priori, d'après ce que je comprends, tu souhaites avoir le résultat dans un état ? ou c'est obligatoirement une requête ? Dans un état avec les fonctions de regroupement, pas besoin de fioritures !
    1- Tu crées un état "tabulaire" avec tes données initiales (avec l'assistant, ça va vite).
    2- Tu crées un premier regroupement par avec le bouton correspondant sur le champ Compte (que je te conseille de modifier en NumCompte vu que c'est un mot réservé). Et tu demandes un regroupement selon le premier caractère. je pense que sur Access 2013, cette option existe encore et avec un en-tête de groupe.
    - Tu y recopies les champs de la partie Détail.
    - Tu modifies la source du champ correspondant à NumCompte par pour avoir le premier caractère.
    - Et pour les sommes, tu mets par exemple pour avoir le total.
    Ainsi tu as un premier regroupement selon le premier caractère de NumCompte.
    3- Tu crées un deuxième regroupement le champ NumCompte et selon les 2 premiers caractères avec en-tête de groupe :
    - Tu y recopies les champs de la partie Détail.
    - Tu modifies la source du champ correspondant à NumCompte par pour avoir les 2 premiers caractères.
    - Et pour les sommes, tu mets par exemple pour avoir le total.
    Ainsi tu as un deuxième regroupement selon les deux premiers caractères de NumCompte.

    Après ce sont des formatage et mise en page... et ainsi de suite si tu veux d'autres regroupements.
    Une base exemple est jointe.

    J'espère que c'est bon. Bonne continuation

  5. #5
    Membre expérimenté Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Points : 1 591
    Points
    1 591
    Par défaut
    Hello !

    Un grand merci pour ton idée et surtout tout le travail que tu as eu pour me proposer cela. Je vais voir si un état peut répondre à mes besoins. Merci mille fois pour ton travail, c'est super sympa !

  6. #6
    Membre expérimenté Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Points : 1 591
    Points
    1 591
    Par défaut
    Finalement, j'en suis revenu à mon idée de base.

    Je te passe mon code VBA qui donne le résultat escompté:

    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
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    Private Sub Balance()
    Dim sql         As String
    Dim sqlTemp     As String
    Dim rstSrce     As DAO.Recordset
    Dim rstDest     As DAO.Recordset
    Dim rstTemp     As DAO.Recordset
    Dim Compte      As String
    Dim Espace      As String
    Dim Cpte1       As String
    Dim Cpte2       As String
    Dim Cpte3       As String
    Dim Z           As Integer
    Dim I           As Long
    Dim LC          As String
    
    
    '   Suppression du contenu des tables
        CurrentDb.Execute "DELETE * FROM tblBalanceCredit_1"
        CurrentDb.Execute "DELETE * FROM tblBalanceDebit_1"
        CurrentDb.Execute "DELETE * FROM tblBalanceDebitCredit_2"
        CurrentDb.Execute "DELETE * FROM tblBalanceDebitCredit_3"
        CurrentDb.Execute "DELETE * FROM tblBalanceDebitCredit_4"
        
    '   Remplissage des tables tblBalanceCredit_1 & tblBalanceDebit_1
        DoCmd.OpenQuery "qryBalanceC"
        DoCmd.OpenQuery "qryBalanceD"
        
    '   Remplissage conditionnel de la tblBalanceDebitCredit_2
        If Me.CptesCentre = True Then               ' Montre les comptes centralisateurs
            If Me.CptesNuls = True Then                 ' >> Montre les comptes nuls
                DoCmd.OpenQuery "qryBalanceCD_1"
            Else
                DoCmd.OpenQuery "qryBalanceCD_2"        ' >> Ne montre pas les comptes nuls
            End If
        Else                                        ' Ne montre pas les comptes centralisateurs
            If Me.CptesNuls = True Then                 ' >> Montre les comptes nuls
                DoCmd.OpenQuery "qryBalanceCD_3"
            Else
                DoCmd.OpenQuery "qryBalanceCD_4"        ' >> Ne montre pas les comptes nuls
            End If
            GoTo Fin
        End If
        
        Set rstSrce = CurrentDb.OpenRecordset("SELECT * FROM tblBalanceDebitCredit_2 ORDER BY NumCompte")
        Set rstDest = CurrentDb.OpenRecordset("tblBalanceDebitCredit_3")
        With rstSrce
            .MoveLast
            .MoveFirst
            For I = 1 To .RecordCount
                ' Insertion d'une ligne vide entre les comptes centralisateurs de base
                LC = Len(!NumCompte)
                If I > 1 And LC = 1 Then
                    rstDest.AddNew
                        Compte = Val(!NumCompte) - 1 & "9999999"
                        rstDest!NumCompte = Compte
                    rstDest.Update
                End If
    
    
                rstDest.AddNew
                    ' Traitement du N° de compte
                    rstDest!NumCompte = !NumCompte
                    
                    ' Traitement du libellé du compte
                    Espace = ""
                    For Z = 4 To LC
                        Espace = Espace & "> "
                    Next Z
                    rstDest!Libelle = Espace & !Libelle
                    
                    ' Traitement des montants et des différents totaux(Débit, Crédit)
                    Cpte1 = left(!NumCompte, 1)
                    Cpte2 = left(!NumCompte, 2)
                    Cpte3 = left(!NumCompte, 3)
                    
                    Select Case LC
                        Case "1"
                            sqlTemp = "SELECT '" & Cpte1 & "' AS Cpte, Sum(MontantCredit) AS SC, Sum(MontantDebit) AS SD, Sum(Solde) AS SS " & _
                                      "From tblBalanceDebitCredit_2 WHERE (((NumCompte) Like '" & Cpte1 & "???" & "'))"
                        Case "2"
                            sqlTemp = "SELECT '" & Cpte2 & "' AS Cpte, Sum(MontantCredit) AS SC, Sum(MontantDebit) AS SD, Sum(Solde) AS SS " & _
                                      "From tblBalanceDebitCredit_2 WHERE (((NumCompte) Like '" & Cpte2 & "??" & "'))"
                        Case "3"
                            sqlTemp = "SELECT '" & Cpte3 & "' AS Cpte, Sum(MontantCredit) AS SC, Sum(MontantDebit) AS SD, Sum(Solde) AS SS " & _
                                      "From tblBalanceDebitCredit_2 WHERE (((NumCompte) Like '" & Cpte3 & "?" & "'))"
                        Case Else
                            rstDest!MontantCredit = !MontantCredit
                            rstDest!MontantDebit = !MontantDebit
                            GoTo Suite
                    End Select
                    Set rstTemp = CurrentDb.OpenRecordset(sqlTemp)
                    rstDest!MontantCredit = Nz(rstTemp!SC)
                    rstDest!MontantDebit = Nz(rstTemp!SD)
                    
    Suite:
                    ' Calcul du solde
                    If !Solde = 0 Then
                        rstDest!Solde = Nz(rstDest!MontantDebit) - Nz(rstDest!MontantCredit)    ' Calcul du solde pour comptes centralisateurs
                    Else
                        rstDest!Solde = !Solde
                    End If
                rstDest.Update
                .MoveNext
            Next I
        End With
        Set rstDest = Nothing
        Set rstSrce = Nothing
        Set rstTemp = Nothing
        
    Fin:
        ' Supprime les lignes vides
        DoCmd.OpenQuery "qryBalanceCD_5"
        
        ' Traitements des formulaires
        DoCmd.OpenForm "frmBalance"
        Forms!frmBalance.Recalc
        DoCmd.Close acForm, Me.name
    
    
    End Sub
    Voilà, cela fonctionne mais... je trouve que c'est un peu lourd... Je vais voir ce que je peux faire pour alléger :-)

    Encore un grand merci pour ton aide et le temps que tu as passé sur mon problème

    Au plaisir et si je peux te renvoyer l'ascenseur, c'est bien volontiers !

    Bernard

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

Discussions similaires

  1. Echange des données sur deux bases
    Par vlksoft dans le forum Modélisation
    Réponses: 7
    Dernier message: 29/12/2008, 09h03
  2. IMPORTANT : Récupérer des données sur une base de donnee externe
    Par _cece dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 17/10/2008, 16h57
  3. Historique et détails des connexions sur une base
    Par farenheiit dans le forum Administration
    Réponses: 6
    Dernier message: 01/09/2008, 16h53
  4. Historique des requêtes sur une base
    Par Dschub dans le forum Firebird
    Réponses: 1
    Dernier message: 16/04/2008, 15h10
  5. Réponses: 8
    Dernier message: 18/09/2007, 09h55

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