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

VB.NET Discussion :

Problème de mise à jour liée aux élément interdépendants de ma table


Sujet :

VB.NET

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2015
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Problème de mise à jour liée aux élément interdépendants de ma table
    Bonjour chers membres du forum, j’ai une préoccupation qui est liée à la mise à jour de ma table.

    En effet j’ai conçu une application vb.net pour la gestion des opérations de caisse pour le compte
    d’une structure et tout fonctionne correctement jusqu’au niveau de la modification de la table où j’ai un bémol.

    Le truc c’est qu’une opération est soit une recette ou une dépense d’où j’ai créé une variable
    solde = recette - dépense (recette ou dépense est nulle selon la nature de l’opération) qui représente le solde
    de chaque opération effectuée.
    Pour ce qui est de la part du solde de la caisse à partir d’une opération op2 on a:

    E: solde_caisse_op2 = solde_op2 + solde_caisse_op1 ( égal à solde_op1) et cela fonctionne bien en insertion.

    Mon problème est que sur par exemple 10 opérations effectuées on décide de modifier la 5ème opération,
    comment réajuster le solde de la caisse à partir de la ligne modifiée jusqu’au dernier élément de la table
    solde_caisse, vu que les différentes lignes sont dépendantes pour le calcul des différentes soldes
    de la caisse d’après l’équation E.
    J’ai déjà réfléchi à une solution mais qui me donne une FatalError. En effet j’ai procédé 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
    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
    Imports MySql.Data
    Imports MySql.Data.Entity
    Imports MySql.Data.MySqlClient
    Imports MySql.Data.Types
     
     Public solde_operation As Integer = 0
     Public MaxId As Integer
     Public j As Integer
     Public soldecaisse As Integer
     Public i As MySqlParameter
     
    'La methode GetMaxId() me ramène Id_max stocké dans la variable MaxId qui me servira de 
    'condition d'arrêt de la boucle for
     
     
        Private Sub GetMaxId()
            connecter()
            Dim sql As String
            sql = "(SELECT MAX(Id_operation) FROM tbl_operation)"
            Dim query As New MySqlCommand()
            query = New MySqlCommand(sql, connecter)
            MaxId = Val(query.ExecuteScalar())
            connecter.close()
        End Sub
     
    'celle-ci me calcule le solde de la caisse au cours de l'opération en cours (soldecaisse) en y 
    'ajoutant le solde de la caisse précédent
     
     
        Private Sub GetSoldeCaisse()
            connecter()
            Dim sql As String
            sql = "select ((select Solde_operation from tbl_operation where Id_operation = @i) + (select Solde_operation from tbl_operation where Id_operation = @i-1))"
            Dim query As New MySqlCommand()
            query = New MySqlCommand(sql, connecter)
            i = New MySqlParameter("@i", j)
            soldecaisse = Val(query.ExecuteScalar())
            connecter.close()
        End Sub
     
     
    'et enfin cette dernière qui fera la mise à jour en remplaçant chaque solde par soldecaisse 
    'selon la variation de j dans la boucle for.
    'la mis à jour commence donc à partir de la ligne modifiée jusqu'au dernier élément de la 
    'colonne puisqu'ils sont liés.
     
     
        Private Sub UpdateSolde()
            connecter()
            GetMaxId()
            Dim sql As String
            sql = "UPDATE tbl_operation SET Solde_operation = soldecaisse WHERE Id_operation = @i"
            i = New MySqlParameter("@i", j)
            Dim query As New MySqlCommand()
            For j = Val(txt_num_operation.Text) To MaxId
                GetSoldeCaisse() 'appel de la methode qui retourne le solde de la caisse
                query = New MySqlCommand(sql, connecter)
            Next
            connecter.close()
        End Sub
    En résumé la méthode GetMaxId() lors de son appel renvoie l'id_max de la table opération et cette valeur servira
    de condition d'arrêt dans la boucle.
    Ensuite la méthode GetSoldeCaisse(), quant à elle calcule le solde de la caisse au cours d'une opération donnée.
    Enfin, la méthode UpdateSolde() qui sera appelée juste après celle qui effectuera la modification de la ligne
    concernée, nous recalcule le solde de la caisse à partir de la ligne modifiée jusqu'au dernier élément de la colonne
    car tous liés. La boucle for définit le début et la fin des modifications.

    Je compte sur chacun pour la résolution de cette difficulté. Merci…

  2. #2
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2015
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Désolé Monsieur si j'ai pas bien fait, jusque-là j'ignorais que les forums étaient liés.
    pour votre information, moi je travaille avec sql et lui a dit que sql c'est pas son truc
    mais plutôt Linq qui est tout nouveau pour moi. je le remercie d'ailleurs pour son aide
    même si Jai pas encore fini avec lui. Mon soucis c'est de trouver quelque chose qui est
    compatible avec sql. vous verrez qu'ici j'ai pu mettre le code et là-bas non car lui ne fait pas sql.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Retraité
    Inscrit en
    juin 2019
    Messages
    989
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : juin 2019
    Messages : 989
    Points : 1 510
    Points
    1 510
    Par défaut
    Bonjour,
    Non les deux forums ne sont pas lié, mais la discussion est bien plus avancée sur l'autre Site.

    Si tu avais indiqué le lien nous en aurions pris connaissance et ainsi ne pas dire les mêmes choses ou te proposer une autre solution.

    Je me mets à la place de la personne qui a pris le temps de te répondre sur l'autre forum !

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2015
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    D'accord monsieur, encore une fois je m'en excuse...

  5. #5
    Membre expérimenté
    Homme Profil pro
    Retraité
    Inscrit en
    juin 2019
    Messages
    989
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : juin 2019
    Messages : 989
    Points : 1 510
    Points
    1 510
    Par défaut
    une proposition possible;
    je vais te donner une suite d'exemple qui pourrons je l'espère aboutir à t'es fins!

    j'ai implémenté une table sur Access pour l'exemple

    une table budget avec les champs ID,Credit et Debit; l'idé étant de calculer le solde!
    Code première requête : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT F1.Id ,F1.[Credit]-F1.[Debit] AS A FROM Budget as F1

    Code Deuxième : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT F1.Id ,F1.[Credit]-F1.[Debit] AS A , iif(F2.B  is null,0,F2.B) as B FROM Budget as F1 left join
    (SELECT Id , [Credit]-[Debit] AS B FROM Budget) as F2 on f1.id=F2.id+1

    Code Troisième : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT ID,A+B as solde  From(SELECT F1.Id ,F1.[Credit]-F1.[Debit] AS A , iif(F2.B  is null,0,F2.B) as B FROM Budget as F1 left join
    (SELECT Id , [Credit]-[Debit] AS B FROM Budget) as F2 on f1.id=F2.id+1) as frm

    Code quatrième : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Select frm.ID,Frm2.[Credit],FRM2.[Debit] ,A+B as solde  From(SELECT F1.Id ,F1.[Credit]-F1.[Debit] AS A , iif(F2.B  is null,0,F2.B) as B FROM Budget as F1 left join(SELECT Id , [Credit]-[Debit] AS B FROM Budget) as F2 on f1.id=F2.id+1) as frm
    inner join Budget FRM2 on frm.id=Frm2.id
    la même requête dans un formulaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim ConnString As String = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C:\Myrep\MYDB.accdb; "
            cnn = OpenConnexion("C:\Myrep\MYDB.accdb")
            Dim dt As OleDbDataReader = Execute("Select frm.ID,Frm2.[Credit],FRM2.[Debit] ,A+B as solde  From(SELECT F1.Id ,F1.[Credit]-F1.[Debit] AS A , iif(F2.B  is null,0,F2.B) as B FROM Budget as F1 left join
    (SELECT Id , [Credit]-[Debit] AS B FROM Budget) as F2 on f1.id=F2.id+1) as frm
    inner join Budget FRM2 on frm.id=Frm2.id", cnn)
            Dim ddt As DataTable = MyDataTable(dt)
            Me.DataGridView1.DataSource = ddt
            Dim t As New TextBox
     
     
        End Sub

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2015
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Merci bien monsieur, je vais essayer de les adapter à mon sujet et vous revenir... merci 🙏

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2015
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    après avoir adapté le code à mon contexte je remarque cependant une erreur lors du calcul à partir de la troisième ligne.
    celui-ci devrait être zéro au lieu de 150000. Le solde précédent était débiteur avec un débit de 2000000. d'où le solde au
    niveau de la ligne qui suit avec le crédit de 2000000 devait être nul, car le solde de la caisse en cours est égal au
    solde précédent + le crédit.

    Nom : resultat.JPG
Affichages : 32
Taille : 50,4 Ko

  8. #8
    Membre expérimenté
    Homme Profil pro
    Retraité
    Inscrit en
    juin 2019
    Messages
    989
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : juin 2019
    Messages : 989
    Points : 1 510
    Points
    1 510
    Par défaut
    Bonjour,
    le problème en agissant par requête la c'est un déphasage entre ce qui ce passe dans la base de données et le le datasource du datagrid!

    la méthode de Whismeril par LINQ agit sur le datagrid ce qui le rend réactif au changement de valeurs!

    par requête il fau recharger le datasource du datagrid! il est donc préférable de mettre a jour tous les enregistrement avant de recharger le datagrid.

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2015
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Effectivement, moi je voulais créer une vue en exécutant le code que vous m'avez donner qui sera ma source de données
    pour l'affichage dans le datagrid, comme ça plus besoin de modifier quoique ce soit au niveau du code de l'application.
    mais comme vous lavez bien constaté, à l'exécution à partir de la 3ème ligne une erreur dans le calcul.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : septembre 2010
    Messages : 9
    Points : 13
    Points
    13
    Par défaut
    Peut-être revoir la conception de la base.
    Une table solde qui contient la solde de la caisse en début de journée (avec date+heure)
    Une table opération, avec une colonne valeur contenant un nombre positif si une recette, ou nombre négatif si dépense et la colonne date + heure de l'opération)
    Pour avoir le solde, il suffirait de prendre le solde en début de journée + la somme des opérations à partir de ce début de journée.
    La base stocke, l'application calcule.

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/07/2014, 13h19
  2. [Core] Problème de mise à jour avec tables liées
    Par mithrendil dans le forum Hibernate
    Réponses: 11
    Dernier message: 06/07/2012, 15h32
  3. [SP 2007] Problème de mise à jour d'un élément avec EventHandler
    Par Skaribou dans le forum Développement Sharepoint
    Réponses: 11
    Dernier message: 18/01/2012, 14h29
  4. Problème de mises à jour d'un élément de la table
    Par neowner dans le forum Struts 2
    Réponses: 1
    Dernier message: 30/01/2011, 04h04

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