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 :

Colonne calculer et datagridview


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Par défaut Colonne calculer et datagridview
    Bonjour le forum j'ai se bout de code qui me permet de calculer le montant mensuel de chaque employé a partir du salaire de base
    mais sa ne marche que pour le premier nom. comment corrigé ce 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
        Private Sub calculdatagridview()
     
     
     
     
            Try
                Dim facteur1 As Double
                Dim facteur2 As Double
                Dim indexcolfact1 As Integer
                Dim indexcolfact2 As Integer
     
                For R As Integer = 0 To dgvElementSalaire.Rows.Count - 1
     
                    indexcolfact1 = dgvElementSalaire.Columns("NOMBRE").Index
                        indexcolfact2 = dgvElementSalaire.Columns("TAUX").Index
                        facteur1 = CType(Poinvirgule(dgvElementSalaire.Item(indexcolfact1, R).Value), Double)
                        facteur2 = CType(Poinvirgule(dgvElementSalaire.Item(indexcolfact2, R).Value), Double)
                        dgvElementSalaire.Item(dgvElementSalaire.Columns("MONTANT").Index, R).Value = Math.Round(facteur1 * facteur2)
     
                Next
            Catch ex As Exception
     
            End Try
     
            dgvElementSalaire.Refresh()
        End Sub
    Nom : Capture.PNG
Affichages : 523
Taille : 45,4 Ko

  2. #2
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour Massigne,

    Le problème est que tous les calculs se font dans une boucle qui est dans un Try. Quand une erreur se produit, le programme passe au Catch et la boucle est arrêtée sans avoir fini les calculs.

    La première ligne est bien calculée et il y a erreur dès la 2ème ligne parce que les informations numériques sont absentes. La conversion CType produit une exception et la boucle est terminée.

    Peut-être ceci te dépannera-t-il :

    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
        Private Sub calculdatagridview()
     
            Try
                Dim facteur1 As Double
                Dim facteur2 As Double
                Dim indexcolfact1 As Integer
                Dim indexcolfact2 As Integer
     
                For R As Integer = 0 To dgvElementSalaire.Rows.Count - 1
     
                        indexcolfact1 = dgvElementSalaire.Columns("NOMBRE").Index
                        indexcolfact2 = dgvElementSalaire.Columns("TAUX").Index
                   Try
                        facteur1 = CType(Poinvirgule(dgvElementSalaire.Item(indexcolfact1, R).Value), Double)
                        facteur2 = CType(Poinvirgule(dgvElementSalaire.Item(indexcolfact2, R).Value), Double)
                        dgvElementSalaire.Item(dgvElementSalaire.Columns("MONTANT").Index, R).Value = Math.Round(facteur1 * facteur2)
                   Catch
                   End Try
     
                Next
     
            Catch ex As Exception
     
            End Try
     
            dgvElementSalaire.Refresh()
        End Sub
    Sauf erreur de ma part, le second Try devrait empêcher de "sauter" toute la boucle For.

    Dis-moi comment cela fonctionne ...


  3. #3
    Membre éclairé
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Par défaut
    Bonjour Phil Rob et bon dimanche
    effectivement cela fonctionne!
    Maintenant j'ai un second problème:
    si je fait un insert par Entité, j'aurais environs 60 lignes alors tous ce passe très bien;
    mais si je veut faire un insert de tous les employés j'aurais environs 1000 lignes,l'opération prend trop de temps (environ 30 minutes) et parfois l'application s’arrête j'aimerais de comprendre pourquoi et savoir comment faire pour corrigé ce problème Merci.

  4. #4
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour,

    Peut-être appelles-tu cette procédure de calcul à chaque ajout de ligne dans le DataGridView. Si c'est le cas, tâche de ne l'appeler que lorsque que tu a terminé toutes tes insertions, ça ira beaucoup plus vite.

    Par ailleurs, le Try ralenti l'exécution. Vois si le le Try extérieur est bien nécessaire. Je pense que si la procédure est appelée à bon escient (quand le DataGridView n'est vide), ton code pourrait être le suivant :

    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
    Private Sub calculdatagridview()
     
                Dim facteur1 As Double
                Dim facteur2 As Double
                Dim indexcolfact1 As Integer
                Dim indexcolfact2 As Integer
     
                For R As Integer = 0 To dgvElementSalaire.Rows.Count - 1
     
                        indexcolfact1 = dgvElementSalaire.Columns("NOMBRE").Index
                        indexcolfact2 = dgvElementSalaire.Columns("TAUX").Index
                   Try
                        facteur1 = CType(Poinvirgule(dgvElementSalaire.Item(indexcolfact1, R).Value), Double)
                        facteur2 = CType(Poinvirgule(dgvElementSalaire.Item(indexcolfact2, R).Value), Double)
                        dgvElementSalaire.Item(dgvElementSalaire.Columns("MONTANT").Index, R).Value = Math.Round(facteur1 * facteur2)
                   Catch
                   End Try
     
                Next
     
            dgvElementSalaire.Refresh()
        End Sub
    Un dernier point à tester, la ligne dgvElementSalaire.Refresh() n'est sans doute pas nécessaire, essaye donc de la retirer.

    Mais le point le plus important pour gagner du temps est de ne pas appeller cette procédure à chaque insertion.

    Bon dimanche à toi aussi,


  5. #5
    Membre éclairé
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Par défaut
    Bonsoir je n'appel pas cette procédure à chaque insertion cette procédure me permet de calculer et peuplé la colonne MONTANT du datagridview
    après je souhaite insérer toute les lignes de mon datagridview pour le moment j'utilise cette procédure d'insertion
    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
      For Each row As DataGridViewRow In dgvElementSalaire.Rows
                Call Connecter()
                cmd.CommandText = "select a.[IdUtilisateur] as [IdUtilisateur] from [dbo].[SALAIRE] a
    INNER JOIN [dbo].[UTILISATEUR] F ON F.IdUtilisateur=a.IdUtilisateur
    where f.LOGING='" & Label6.Text & "'"
                dv = cmd.ExecuteReader
                While dv.Read
                    Procedure.c = dv.Item("IdUtilisateur")
                End While
                dv.Close()
                txtIdutilisateur.Text = Procedure.c
                Call Connecter()
                cmd.Connection = con
                If row.Cells("BASE").Value.ToString = "" And row.Cells("NOMBRE").Value.ToString = "" And row.Cells("HORAIRE").Value.ToString = "" And row.Cells("TAUX").Value.ToString = "" Then
                    cmd.CommandText = "INSERT INTO [dbo].[SALAIRE]
    ([Date_Debut],[Date_Fin],[EM_ID],[SA_ID],[IDCOTISABLE],[IDNATURE],[IdUtilisateur],[MONTANT])
    VALUES(@Date_Debut,@Date_Fin,@EM_ID,@SA_ID,@IDCOTISABLE,@IDNATURE,@IdUtilisateur,@MONTANT)"
                    cmd.Parameters.Clear()
                    dgvElementSalaire.Refresh()
                    cmd.Parameters.Add("@Date_Debut", SqlDbType.DateTime)
                    cmd.Parameters.Add("@Date_Fin", SqlDbType.DateTime)
                    cmd.Parameters.Add("@EM_ID", SqlDbType.Int)
                    cmd.Parameters.Add("@SA_ID", SqlDbType.Int)
                    cmd.Parameters.Add("@IDCOTISABLE", SqlDbType.Int)
                    cmd.Parameters.Add("@IDNATURE", SqlDbType.Int)
     
                    cmd.Parameters.Add("@IdUtilisateur", SqlDbType.Int)
     
     
                    cmd.Parameters.Add("@MONTANT", SqlDbType.Decimal)
     
     
     
                    cmd.Parameters(0).Value = dtpDateDebut.Value
                    cmd.Parameters(1).Value = dtpDateFin.Value
                    cmd.Parameters(2).Value = row.Cells("EM_ID").Value
                    cmd.Parameters(3).Value = row.Cells("SA_ID").Value
                    cmd.Parameters(4).Value = row.Cells("IDCOTISABLE").Value
                    cmd.Parameters(5).Value = row.Cells("IDNATURE").Value
     
                    cmd.Parameters(6).Value = txtIdutilisateur.Text
     
     
                    cmd.Parameters(7).Value = Val(row.Cells("MONTANT").Value)
     
                    cmd.ExecuteNonQuery()
                Else
                    cmd.CommandText = "INSERT INTO [dbo].[SALAIRE]
    ([Date_Debut],[Date_Fin],[EM_ID],[SA_ID],[IDCOTISABLE],[IDNATURE],[IdUtilisateur],[BASE],[NOMBRE],[HORAIRE],[TAUX],[MONTANT])
    VALUES(@Date_Debut,@Date_Fin,@EM_ID,@SA_ID,@IDCOTISABLE,@IDNATURE,@IdUtilisateur,@BASE,@NOMBRE,@HORAIRE,@TAUX,@MONTANT)"
                    cmd.Parameters.Clear()
                    dgvElementSalaire.Refresh()
                    cmd.Parameters.Add("@Date_Debut", SqlDbType.DateTime)
                    cmd.Parameters.Add("@Date_Fin", SqlDbType.DateTime)
                    cmd.Parameters.Add("@EM_ID", SqlDbType.Int)
                    cmd.Parameters.Add("@SA_ID", SqlDbType.Int)
                    cmd.Parameters.Add("@IDCOTISABLE", SqlDbType.Int)
                    cmd.Parameters.Add("@IDNATURE", SqlDbType.Int)
     
                    cmd.Parameters.Add("@IdUtilisateur", SqlDbType.Int)
                    cmd.Parameters.Add("@BASE", SqlDbType.Decimal)
                    cmd.Parameters.Add("@NOMBRE", SqlDbType.Decimal)
                    cmd.Parameters.Add("@HORAIRE", SqlDbType.Decimal)
                    cmd.Parameters.Add("@TAUX", SqlDbType.Decimal)
                    cmd.Parameters.Add("@MONTANT", SqlDbType.Decimal)
     
     
     
                    cmd.Parameters(0).Value = dtpDateDebut.Value
                    cmd.Parameters(1).Value = dtpDateFin.Value
                    cmd.Parameters(2).Value = row.Cells("EM_ID").Value
                    cmd.Parameters(3).Value = row.Cells("SA_ID").Value
                    cmd.Parameters(4).Value = row.Cells("IDCOTISABLE").Value
                    cmd.Parameters(5).Value = row.Cells("IDNATURE").Value
     
                    cmd.Parameters(6).Value = txtIdutilisateur.Text
                    cmd.Parameters(7).Value = Val(row.Cells("BASE").Value)
                    cmd.Parameters(8).Value = Val(row.Cells("NOMBRE").Value)
     
                    cmd.Parameters(9).Value = Val(row.Cells("HORAIRE").Value)
     
                    cmd.Parameters(10).Value = Val(row.Cells("TAUX").Value)
     
                    cmd.Parameters(11).Value = Val(row.Cells("MONTANT").Value)
     
                    cmd.ExecuteNonQuery()
                End If
                Call deconnecter()
     
            Next
            MsgBox("Ajout effectué avec succès")
    ce qui prend trop de temps

  6. #6
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour Massigne,

    Je vois plusieurs anomalies dans ton code, et je suis sûr qu'elles sont de nature à ralentir fortement l'exécution.
    Il me faudrait un exemple concret, avec des valeurs vraies ou fictives, des enregistrements que tu manipules dans ce code. Peut-être que je pourrais essayer de produire un code plus simple ...

    En fait, je ne suis pas sûr de bien comprendre la nécessité de faire un SELECT compliqué (c'est une jointure) qui "scrute" toute la DB pour ne retenir (si je comprends bien) qu'une seule valeur (Procedure.c = dv.Item("IdUtilisateur")) sur base de laquelle tu effectues un INSERT ou bien un autre. De plus, cette valeur unique est recherchée avec un ExecuteReader alors qu'elle pourrait être plus efficacement être obtenue avec un ExecuteScalar.
    Je pense aussi que cela doit pouvoir être programmé sans ouvrir (et refermer) la connexion plusieurs fois dans ce code (pour chaque insertion).
    A noter encore que tu écris deux fois Call Connecter() et une seule fois Call deconnecter(), ce qui ne semble pas très "normal".

    Je reviendrai sur le forum dans l'après-midi, si tu, peux m'en dire plus ...

    Bonne journée,


  7. #7
    Membre éclairé
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Par défaut
    Bonjour Phil Rob ce n'est que maintenant que je vois ton message Le select me permet de recuperer l'identifiant de l'utilisateur connecter et de l'ajouter à chaque ligne

Discussions similaires

  1. Colonne calculée dans un DataGridView
    Par Massigne dans le forum VB.NET
    Réponses: 12
    Dernier message: 13/07/2019, 09h00
  2. Tri DataGridView sur colonne calculée + DataBinding
    Par TheOnlyMaX dans le forum Windows Forms
    Réponses: 0
    Dernier message: 13/04/2011, 10h26
  3. colonne calculée dans une vue
    Par jfc dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/04/2006, 16h11
  4. [VB.NET] Calculs dans une colonne d'un datagridview
    Par boulete dans le forum Windows Forms
    Réponses: 3
    Dernier message: 31/03/2006, 15h11
  5. [CR] Colonnes calculées
    Par plong dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 23/11/2003, 12h12

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