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 :

Manipulations autour d'une base de données ACCESS


Sujet :

VB.NET

  1. #141
    Membre émérite 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
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour Rezolu,

    Je vois ton message par hasard car je n'ai pas reçu de notification !

    Tu écris ces procédures en te basant sur les procédures d'ajout. Pourquoi ne te bases-tu pas sur les procédures ModifierType ?

    Dans ModifierAstuce, il faut ajour le paramètre @LeIdAstuce et compléter la clause WHERE avec IdAstuce = @LeIdAstuce.
    Il ne faut pas dans cette procédure relire l'Id du dernier Id attribué.

    Dans Bp_modifier_Astuce_Click(... ), il faut donner la valeur de l'IdAstuceEncours. C'est cette valeur quoi doit arriver dans ModifierAstuce pour affecter le paramètre @LeIdAstuce.

    Je devrais avoir un peu de temps tantôt pour corriger ces procédures.

    Je te tiens au courant ...

  2. #142
    Membre émérite 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
    Points : 2 865
    Points
    2 865
    Par défaut
    Re,

    Tant qu'à faire, j'ai travaillé sur la modification et sur la suppression d'un enregistrement Astuce. ll te faut réintégrer ces codes avec prudence vu que j'ai travaillé sur une version qui n'a pas de "Prepara ajout", ni blocage de déplacelent, ...

    J'ai trouvé pourquoi tu observais des enregistrements en doubles dans le DGV après ajout (je ne sais pourquoi je ne les ai pas vu ... ):

    Toutes les modifications faites sur les composants d'affichages liés au DataTable sont automatiquement répercutées sur ce DataTable.
    Ainsi, lors d'un Ajout, l'encodage dans les composants liés modifie l'encours et l'ajout provoque une nouvelle ligne : donc nous voyons alors 2 lignes identiques dans le DGV. Comme il n'y a eu qu'un seul ajout, lors du rechargement, le nouvel enregistrement est présent et celui qui avait été modifié à repris ses valeurs réelles.

    Pour éviter cela, j'ai ajouté un DataTable.RejetChanges pour l'obliger à oublier les modifs. J'exécute le DataTable. ... Add ensuite.

    Pour la suppression d'un enregistrement, la suppression dans le DataTable provoque la mise à jour du DGV. Or il y a une procédure qui lance ChargeDetail et MontreDetail lors d'un changement de sélection dans le DGV. Mais ChargeDetails calcule l'IdAstuceEnCours, cela devient impossible quand l'encours vient d'être supprimé. Pour cette raison, je replace le calcul l'IdAstuceEnCours dans un bloc Try.

    Dans ChargeDetails() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ' ... ... ...
           Dim IdAstuceEnCours As Integer
            Try
                IdAstuceEnCours = MesAstuces.Tables(NomTableAstuces).Rows(Me.BindingContext(MesAstuces.Tables(NomTableAstuces)).Position).Item("IdAstuce")
            Catch
                Exit Sub
            End Try
    ' ... ... ...
    La procédure Bp_Ajout_Astuce que j'ai utilisée (pour éviter les "doublons" en DGV) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        Private Sub Bp_Ajout_Astuce_Click(sender As Object, e As EventArgs) Handles Bp_Ajout_Astuce.Click
            Dim NouvelId As Integer
            If AjouterAstuce(NouvelId, CB_Type.SelectedValue, TB_NomAstuce.Text, TB_DescripAstuce.Text, RTBCode.Text, RTB_NoteAstuce.Text, RTB_RemAstuce.Text, RTB_CommentAstuce.Text, TB_LienAstuce.Text) Then ' reçoit le nouvel ID par ByRef de NouvelId
                ' refuser la mise à jour des composant liés pour permettre l'ajout effectif dansle DataTable faute de quoi, il y a d'abord modification du l'encours avant l'ajout du nouveau
                MesAstuces.Tables(NomTableAstuces).RejectChanges() ' refuser la mise à jour des composant liés pour permettre l'ajout effectif dansle DataTable
                MesAstuces.Tables(NomTableAstuces).Rows.Add(NouvelId, CB_Type.Text, TB_NomAstuce.Text, TB_DescripAstuce.Text, RTBCode.Text, RTB_NoteAstuce.Text, RTB_RemAstuce.Text, RTB_CommentAstuce.Text, TB_LienAstuce.Text) ' Si ok, on ajoute au DataTable
            End If
        End Sub
    Les codes pour Modifier et Supprimer :

    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
     
        Private Function ModifierAstuce(ByVal Id As Integer, ByVal XIdType As Integer, Nom As String, Description As String, Code As String, Note As String, Remarque As String, Commentaire As String, Lien As String) As Boolean
            Dim SQL As String
     
            ParametroConexion()
            MaConexion.Open()
            MaCommande = MaConexion.CreateCommand()
     
            MaCommande.Parameters.AddWithValue("@XIdType", XIdType)
            MaCommande.Parameters.AddWithValue("@Nom", Nom)
            MaCommande.Parameters.AddWithValue("@Description", Description)
            MaCommande.Parameters.AddWithValue("@Code", Code)
            MaCommande.Parameters.AddWithValue("@Note", Note)
            MaCommande.Parameters.AddWithValue("@Remarque", Remarque)
            MaCommande.Parameters.AddWithValue("@Commentaire", Commentaire)
            MaCommande.Parameters.AddWithValue("@Lien", Lien)
            MaCommande.Parameters.AddWithValue("@LeIdAstuce", Id)
     
            SQL = "UPDATE T_ASTUCEPROG SET XIdTypeAstuce = @XIdType, NomAstuce = @Nom, DescripAstuce = @Description, CodeAstuce = @Code, NoteAstuce = @Note, RemAstuce = @Remarque, CommentAstuce = @Commentaire, LienAstuce = @Lien " &
                "WHERE IdAstuce = @LeIdAstuce;"
     
            MaCommande.CommandText = SQL
     
            If MaCommande.ExecuteNonQuery() = 1 Then
                ' Modif effectée
            Else
                ' Erreur
                MaConexion.Close()
                MaCommande.Dispose()
                Return False
            End If
     
            MaConexion.Close()
            MaCommande.Dispose()
            Return True
        End Function
     
        Private Sub Bp_modifier_Astuce_Click(sender As Object, e As EventArgs) Handles Bp_modifier_Astuce.Click
            Dim IdAstuceEnCours As Integer
            IdAstuceEnCours = MesAstuces.Tables(NomTableAstuces).Rows(Me.BindingContext(MesAstuces.Tables(NomTableAstuces)).Position).Item("IdAstuce")
            If ModifierAstuce(IdAstuceEnCours, CB_Type.SelectedValue, TB_NomAstuce.Text, TB_DescripAstuce.Text, RTBCode.Text, RTB_NoteAstuce.Text, RTB_RemAstuce.Text, RTB_CommentAstuce.Text, TB_LienAstuce.Text) Then
                MesAstuces.Tables(NomTableAstuces).AcceptChanges()  ' provoque la màj des composants liés 
            End If
        End Sub
        Private Function SupprimerAstuce(ByVal Id As Integer) As Boolean
            Dim SQL As String
     
            ParametroConexion()
            MaConexion.Open()
            MaCommande = MaConexion.CreateCommand()
     
            MaCommande.Parameters.AddWithValue("@LeIdAstuce", Id)
     
            SQL = "DELETE FROM T_FICHIER WHERE XIdAstuceFichier = @LeIdAstuce;"
            MaCommande.CommandText = SQL
            MaCommande.ExecuteNonQuery()
     
            SQL = "DELETE FROM T_IMAGE WHERE XIdAstuceImage = @LeIdAstuce;"
            MaCommande.CommandText = SQL
            MaCommande.ExecuteNonQuery()
     
            SQL = "DELETE FROM T_ASTUCEPROG WHERE IdAstuce = @LeIdAstuce;"
            MaCommande.CommandText = SQL
            If MaCommande.ExecuteNonQuery() = 1 Then
                ' Suppression effectée
            Else
                ' Erreur
                MaConexion.Close()
                MaCommande.Dispose()
                Return False
            End If
     
            MaConexion.Close()
            MaCommande.Dispose()
            Return True
     
        End Function
     
        Private Sub Bp_Supprimer_Astuce_Click(sender As Object, e As EventArgs) Handles Bp_Supprimer_Astuce.Click
            Dim IdAstuceEnCours As Integer
            IdAstuceEnCours = MesAstuces.Tables(NomTableAstuces).Rows(Me.BindingContext(MesAstuces.Tables(NomTableAstuces)).Position).Item("IdAstuce")
            If SupprimerAstuce(IdAstuceEnCours) Then ' si OK, on supprime dans le DataTable
                MesAstuces.Tables(NomTableAstuces).Rows(Me.BindingContext(MesAstuces.Tables(NomTableAstuces)).Position).Delete()
            End If
        End Sub
    J'eepsère que cela te permettra d'avancer ...

  3. #143
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2020
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2020
    Messages : 117
    Points : 17
    Points
    17
    Par défaut
    Bonjour Phil Rob

    Un tout grand merci, tout à l'air de fonctionner il ne manque plus qu'un textbox de recherche d'astuce et se sera le top.

    Petite question qui me passe par la tête :

    Quand on fait une modification de l'astuce est-il possible de faire un vérification sur sur textbox ?

    je m'explique :
    Quand j'ajoute un fichier ou une image je crée un répertoire avec le Type et un sous-répertoire avec le nom et dans celui-ci j'importe le fichier ou l'image
    maintenant si je modifie le type ou le nom l'ouverture ne fonctionne plus, donc je me demandais quand je fais une modification soit du type ou du nom alors je déplace les fichier ou image vers le nom répertoire.

    Bonne journée et passe de bonne fête.

  4. #144
    Membre émérite 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
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour Rezolu,

    Je suis bien content que tu as pu mettre en place mes "chipos" ...
    Je travaille à mettre au point un version plus épurée, davantage indépendante des composants d'affichage, mais je manque de temps ...

    Pour la recherche d'une astuce sur base d'un mot (mort clé) encodé dans un TextBox, pense à l'opérateur LIKE.

    Exemple (approximatif) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            SQL = "SELECT IdAstuce, Type, NomAstuce, DescripAstuce, CodeAstuce, NoteAstuce, RemAstuce, CommentAstuce, LienAstuce  " &
                  "FROM T_ASTUCEPROG INNER JOIN T_TYPE ON T_ASTUCEPROG.XIdTypeAstuce = T_TYPE.IdType "  &
                  "WHERE NomAstuce LIKE '*" & TextBoxDuMotCle.Text & "*';"
    Pour ta question (qui vient d'arriver pendant que je rédige le message ci-dessus), je pense que si les stockages sur disques sont conditionnés par le type, quand ce type change il te faut déplacer tous les fichiers et images liés à l'astuce en cours dans le dossier affecté à ce nouveau type.
    Si le type a changé, cela se vérifie immédiatement par comparaison du type de l'enregistrement en cours avec celui demandé pour la mise à jour. Cela devrait se faire dans Bp_Modifier ... et le traitement de manipulation des fichiers devrait se faire avant la sortie de cette procédure.

    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
     
        Private Sub Bp_modifier_Astuce_Click(sender As Object, e As EventArgs) Handles Bp_modifier_Astuce.Click
            Dim IdAstuceEnCours As Integer
            IdAstuceEnCours = MesAstuces.Tables(NomTableAstuces).Rows(Me.BindingContext(MesAstuces.Tables(NomTableAstuces)).Position).Item("IdAstuce")
            Dim IdTypeEnCours As Integer
          IdTypeEnCours = MesAstuces.Tables(NomTableAstuces).Rows(Me.BindingContext(MesAstuces.Tables(NomTableAstuces)).Position).Item("XIdTypeAstuce")
            Dim NouveauType As Integer = CB_Type.SelectedValue
            If ModifierAstuce(IdAstuceEnCours, CB_Type.SelectedValue, TB_NomAstuce.Text, TB_DescripAstuce.Text, RTBCode.Text, RTB_NoteAstuce.Text, RTB_RemAstuce.Text, RTB_CommentAstuce.Text, TB_LienAstuce.Text) Then
                MesAstuces.Tables(NomTableAstuces).AcceptChanges()  ' provoque la màj des composants liés 
     
    If IdTypeEnCours <> NouveauType Then
     ' Il y a changement de type ... ===> Traitement des fichiers
    End if
     
            End If
        End Sub
    Mais je trouve cette organisation très compliquée. Elle serait utile s'il devait être nécessaire de manipuler ensemble tous les fichiers d'un Type, ce qui n'a guère de sens puisqu'ils sont liés à une astuce (qui contient d'autres infos, notamment les codes). Indépendamment de "son" astuce, un fichier n'aura généralement pas d'intérêt.
    Je comprendrais mieux de créer un dossier pas astuce et d'y regrouper fichiers et images ensemble. La suppression d'une astuce se résumerait (niveau fichiers) à la suppression du dossier. Un changement de type d'astuce ne changerait rien aux fichiers et images.
    Mais même ainsi, je trouve l'organisation trop lourde ..., en fait je ne vois pas bien son intérêt

    Bonnes fêtes chez aussi, et bonne journée jusque là ...

  5. #145
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2020
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2020
    Messages : 117
    Points : 17
    Points
    17
    Par défaut
    Bonjour Phil Rob

    Je te souhaite un joyeux Noël

    J'ai essayé ceci pour la recherche :

    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
     
    Private Sub TextBoxDuMotCle_TextChanged(sender As Object, e As EventArgs) Handles TextBoxDuMotCle.TextChanged
            Dim SQL As String
            Dim UneDataTable As New DataTable
     
            ParametroConexion()
     
     
                Sql = "SELECT IdAstuce, Type, NomAstuce, DescripAstuce, CodeAstuce, NoteAstuce, RemAstuce, CommentAstuce, LienAstuce  " &
                      "FROM T_ASTUCEPROG INNER JOIN T_TYPE ON T_ASTUCEPROG.XIdTypeAstuce = T_TYPE.IdType " &
                      "WHERE NomAstuce LIKE '*" & TextBoxDuMotCle.Text & "*';"
            Dim MonAdapter As OleDbDataAdapter = New OleDbDataAdapter(SQL, MaConexion)
     
            MonAdapter.Fill(UneDataTable)
     
            DGVTout.DataSource = UneDataTable
     
        End Sub
    Mais dès que je tape une lettre le DGVTout se vide complétement.

  6. #146
    Membre émérite 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
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonsoir Rezolu,

    Bon Noël à toi aussi.

    Avant de vérifier ta requête, je te propose de mettre tout ce code dans une Sub ChercheSelonMotCle() et d'ajouter un bouton Bp_ChercheSelonMotCle() qui appelle cette Sub.

    En programmant ton code sous l'évènement TextChanged, ça démarre au premier caractère tapé et, bien entendu, ça ne trouve rien, d'où le DGV vide.

    Je ne l'ai pas testée mais la requête doit convenir.

    Mais comme je l'indiquais, l'évènement ne convient pas.

    En fait, la procédure doit être une "2ème" ChargeDonnees avec la requête LIKE à la place de l'autre. Son exécution doit être lancée comme ChargeDonnees :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            ChargeDonnees()
            MontreDonnees()
            ChargeDetails()
            MontreDetails()
            ChargeComboType()
            MontreComboType()
    Il s'en suivra que tout le Form de gestion des astuces sera réaffecté à la sélection trouvée. La requête retournera de 0 à N lignes, selon que le mot clé ne soit pas trouvé, ou soit trouvé plusieurs fois.

    J'ai commencé à réfléchir à cette option et voici l'ergonomie que j'envisage de mettre en place dans mon projet de test :
    Nom : MotCle.jpg
Affichages : 135
Taille : 10,3 Ko

    ...

  7. #147
    Membre émérite 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
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour,

    Il y a une erreur de syntaxe dans le LIKE (la faute à Access qui prend des * dans son interface, mais pas via VB, où il faut des %).
    Donc, remplacer les * par %.

    J'ai modifié la procédure ChargeDonnees() et j'ai écrit le code d'un bouton BCherche :

    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
     
        Private Sub ChargeDonnees(Optional Recherche As String = "")
     
            If MesAstuces.Tables.Count > 0 Then  ' Para muchas pruebas
                MesAstuces.Tables.Clear()
            End If
     
            ParametroConexion()
     
            Dim UneDataTable As New DataTable
            Dim SQL As String
     
            If Recherche = String.Empty Then                         ' alors requête habituelle
                SQL = "SELECT IdAstuce, Type, NomAstuce, DescripAstuce, CodeAstuce, NoteAstuce, RemAstuce, CommentAstuce, LienAstuce  " & _
                      "FROM T_ASTUCEPROG INNER JOIN T_TYPE ON T_ASTUCEPROG.XIdTypeAstuce = T_TYPE.IdType;"
            Else                                                                    ' sinon requête LIKE
                SQL = "SELECT IdAstuce, Type, NomAstuce, DescripAstuce, CodeAstuce, NoteAstuce, RemAstuce, CommentAstuce, LienAstuce  " & _
                      "FROM T_ASTUCEPROG INNER JOIN T_TYPE ON T_ASTUCEPROG.XIdTypeAstuce = T_TYPE.IdType " & _
                      "WHERE NomAstuce LIKE '%" & Recherche & "%';"
            End If
     
            Dim MonAdapter As OleDbDataAdapter = New OleDbDataAdapter(SQL, MaConexion)
     
            MonAdapter.Fill(UneDataTable)
            UneDataTable.TableName = NomTableAstuces
            MesAstuces.Tables.Add(UneDataTable)
     
            MonAdapter.Dispose()
     
            MaConexion.Close()
     
        End Sub
     
        Private Sub BCherche_Click(sender As Object, e As EventArgs) Handles BCherche.Click
     
            ChargeDonnees(TBChercheAstuce.Text)
            MontreDonnees()
            ChargeTypes()
            MontreTypes()
     
         End Sub
    Bon dimanche,


  8. #148
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2020
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2020
    Messages : 117
    Points : 17
    Points
    17
    Par défaut
    Bonjour Phil Rob

    J'ai essayé d'intégrer ton code mais je reçoit des erreur voir capture ci-joint

    Pièce jointe 587487

  9. #149
    Membre émérite 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
    Points : 2 865
    Points
    2 865
    Par défaut
    Je n'ai pas de fonction Recherche().
    Peut-être dois-tu intégrer mon code du message précédent tel qu'il est.

    Il s'agit de remplacer ta procédure ChargeDonnees et d'écrire le code de ma procédure BCherche_Click (quitte à changer BCherche par le nom de ton bouton et TBChercheAstuce par le nom de ta TextBox).

    Si ça ne va pas, renvoie-moi ton code de ChargeDonnees et la réponse événementielle au click de ton bouton de recherche.

    A tantôt ...

  10. #150
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2020
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2020
    Messages : 117
    Points : 17
    Points
    17
    Par défaut
    Voila ce que j'ai dans mon code :

    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
     
    Private Sub ChargeDonnees(Optional Recherche As String = "")
     
            If MesAstuces.Tables.Count > 0 Then  ' Para muchas pruebas
                MesAstuces.Tables.Clear()
            End If
     
            ParametroConexion()
     
            Dim UneDataTable As New DataTable
            Dim SQL As String
     
            If Recherche = String.Empty Then                         ' alors requête habituelle
                SQL = "SELECT IdAstuce, Type, NomAstuce, DescripAstuce, CodeAstuce, NoteAstuce, RemAstuce, CommentAstuce, LienAstuce  " &
                      "FROM T_ASTUCEPROG INNER JOIN T_TYPE ON T_ASTUCEPROG.XIdTypeAstuce = T_TYPE.IdType;"
            Else                                                                    ' sinon requête LIKE
                SQL = "SELECT IdAstuce, Type, NomAstuce, DescripAstuce, CodeAstuce, NoteAstuce, RemAstuce, CommentAstuce, LienAstuce  " &
                      "FROM T_ASTUCEPROG INNER JOIN T_TYPE ON T_ASTUCEPROG.XIdTypeAstuce = T_TYPE.IdType " &
                      "WHERE NomAstuce LIKE '%" & Recherche & "%';"
            End If
     
            Dim MonAdapter As OleDbDataAdapter = New OleDbDataAdapter(SQL, MaConexion)
     
            MonAdapter.Fill(UneDataTable)
            UneDataTable.TableName = NomTableAstuces
            MesAstuces.Tables.Add(UneDataTable)
     
            MonAdapter.Dispose()
     
            MaConexion.Close()
     
        End Sub
     
     
    Private Sub Bp_Recherche_Click(sender As Object, e As EventArgs) Handles Bp_Recherche.Click
            ChargeDonnees(TextBoxDuMotCle.Text)
            MontreDonnees()
            ChargeComboType()
            MontreComboType()
        End Sub
    Mais maintenant j'ai une erreur a l"ouverture du formulaire

    Pièce jointe 587488

  11. #151
    Membre émérite 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
    Points : 2 865
    Points
    2 865
    Par défaut
    Je viens de comparer avec le code de ta version (évidemment différente de la mienne).

    Il te faut ajouter la ligne NomTableAstuces = "Astuces" après la ligne ParametroConexion().

    ...

  12. #152
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2020
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2020
    Messages : 117
    Points : 17
    Points
    17
    Par défaut
    Merci

    ça fonctionne directement mieux

    Bonne soirée

  13. #153
    Membre émérite 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
    Points : 2 865
    Points
    2 865
    Par défaut
    Merci pour le feedback.
    Bonne soirée chez toi aussi.

  14. #154
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2020
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2020
    Messages : 117
    Points : 17
    Points
    17
    Par défaut
    Bonjour Phil Rob

    Voilà mon projet est en phase finale.
    Je lui ai ajouté une deuxième table pour la gestion des ebooks.

    Je joint le projet pour avoir ton avis, voir ce qui peut-être amélioré ...

    Bonne journée

  15. #155
    Membre émérite 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
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour Rezolu,

    Je compilerai tout à l'heure ... Il ne me suffit pas de lancer, j'ai quelques problèmes avec My.Settings.APP_PATH, je dois modifier un peu ce code pour trouver la DB. Ordinairement, j'utilise un fichier paramètre logé à côté de l'EXE et qui contient le nom et chemin de la DB, ou bien plus simplement, quand c'est permis, je stocke la DB à côté de l'EXE et le chemin est alors CurDir().

    En attendant, j'ai examiné ta DB EBook ..., nickel !

    Dans ton code (un Form ouvert au hasard), j'ai vu que tu as placé des infos-bulles. C'est super, très convivial.

    J'ai rouvert le module DBconnector et là, à titre strictement éducatif, j'ai quelques remarques à faire.

    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
    Imports System.Data.OleDb
     
    Module DBconnector
     
        Public DB_ASTUCE_CONNECT As New OleDbConnection()
     
        Public Connection As String
     
        Public Function DB_ASTUCE() As String
     
            Connection = "Provider= MICROSOFT.JET.OLEDB.4.0; Data Source=" & My.Settings.APP_PATH & "\DataBase\DB_ASTUCE.mdb"
     
            Return Connection
        End Function
     
        Public Sub OpenConnection_Astuce()
            If DB_ASTUCE_CONNECT.State <> ConnectionState.Open Then
                DB_ASTUCE_CONNECT.ConnectionString = DB_ASTUCE()
                DB_ASTUCE_CONNECT.Open()
                Exit Sub
            End If
        End Sub
        Public Sub CloseConnection_Astuce()
            If DB_ASTUCE_CONNECT.State <> ConnectionState.Closed Then
                DB_ASTUCE_CONNECT.Close()
                Exit Sub
            End If
        End Sub
     
    End Module
    Dans le Frm_Acceuil, tu appelles les procédures PUBLIC :
    Call OpenConnection_Astuce()
    Call CloseConnection_Astuce()


    Par contre, tu n'appelles pas la fonction DB_ASTUCE() ailleurs que dans le module même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Private Sub ParametroConexion()
          '  MaConexion.ConnectionString = "Provider= MICROSOFT.JET.OLEDB.4.0; Data Source=" & My.Settings.APP_PATH & "\DataBase\DB_ASTUCE.mdb"
    ' Pourquoi ne pas faire (dans chaque Form) :
    MaConexion.ConnectionString = DBconnector.DB_ASTUCE()
    ' Note au passage que tu peux utiliser la même syntaxe dans Frm_Acceuil pour appler les Open et Close ...
        End Sub
    Donc, pour en revenir à DBconnector, la fonction ne sert pas et tant qu'à l'avoir écrite, ce serait mieux de l'utiliser.
    Tes variables (DB_ASTUCE_CONNECT et Connection) sont PUBLIC : il ne faut pas définir PUBLIC des variables, fonctions, procédures, qui ne sont pas appelées depuis d'autres Form ou Module. Ces variables ne servent que des codes de ce module : PRIVATE suffit.

    Dans les procédures OPEN ... et CLOSE ..., tu as placé une instruction EXIT SUB. Elle n'est pas gênante, mais tout à fait inutile, que tu l'écrive ou non, l'exécution ne peut rien faire d'autre à cet endroit.

    Une dernière por la route .... , un détail qui n'est pas gênant ici (car ce code n'est utilisé qu'une seule fois au démarrage de l'application) :
    La variable DB_ASTUCE_CONNECT est déclarée avec New, elle est donc instanciée mais elle n'est pas utilisée ailleurs dans le programme (car en suivant mon organisation, tu ouvres un connexion quand elle est nécessaire et elle fermée aussitôt qu'elle ne sert plus). Dans ton code, elle est seulement utilisée par les procédures OPEN et CLOSE (ce pourquoi elle peut être PRIVATE). Le détail que je veux épingler ici est que cette variable (cet objet instancié) n'est jamais détruit. Or (en principe), à chaque New doit correspondre un Dispose.
    Pour satisfaire ce principe, j'écrirais le code autrement :

    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
    Imports System.Data.OleDb
    Module DBconnector
     
    Private DB_ASTUCE_CONNECT As OleDbConnection()
     
    Public Function DB_ASTUCE() As String
            Connection = "Provider= MICROSOFT.JET.OLEDB.4.0; Data Source=" & My.Settings.APP_PATH & "\DataBase\DB_ASTUCE.mdb"
            Return Connection
    End Function
     
    Public Function TestDB() As Boolean  ' True ===> DB ok, False ===> DB pas ok
       DB_ASTUCE_CONNECT = New New OleDbConnection()
       DB_ASTUCE_CONNECT.ConnectionString = DB_ASTUCE()
    Try
       DB_ASTUCE_CONNECT.Open()
       DB_ASTUCE_CONNECT.Close()
    Catch
       DB_ASTUCE_CONNECT.Dispose
       Return False
    End Try
       DB_ASTUCE_CONNECT.Dispose
       Return True
    End Function
     
    End Module
    Ceci n'est qu'un exemple, cela peut être programmé de diverses manières (au gré des manies des programmeurs ... ), mais respecter le principe d'un Dispose par New est une bonne pratique.

    A tantôt probablement ...

  16. #156
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2020
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2020
    Messages : 117
    Points : 17
    Points
    17
    Par défaut
    Re bonjour Phil Rob

    Merci pour tes remarques, je regarderai pour corriger cela.

    D’ici là passe une bonne soirée

  17. #157
    Membre émérite 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
    Points : 2 865
    Points
    2 865
    Par défaut
    Re,

    Belle application ! Et rien à redire sur le code, ou presque ... , juste une info que j'aurais pu te donner plus tôt (avec ta version "09-Astuces en vrac").

    Tu crées un DataSet par "lot" d'infos :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        Dim MesAstuces As New DataSet
        Dim MesFichiers As New DataSet
        Dim MesImages As New DataSet
        Dim MesTypes As New DataSet
    En fait, chacun de ces "lots" d'infos correspond à une table de la DB et le DataSet "doit" constituer une copie de la DB. Chaque DataTable créée (qui correspond à une table de la DB ou a une jointure) est ajoutée au même DataSet.
    On donnera généralement au DataSet, un nom représentant l'ensemble de la DB (de la gestion), par exemple MesAstuces parce que c'est l'objet de cette gestion. Dans MesAstuces, j'ajoute le DataTable "TAstuces" qui est la jointure qui récupère toutes les données. J'ajoute également les DataTable "TFichiers", "TImages" et "TTypes". De cette manière, je dispose d'une DB en mémoire qui permet le fonctionnement du Form de gestion.
    Dans la partie spécifique "Type", le DataSet s'appelle MesTypes (parce que cette partie ne sert qu'à cela) et il contient le DataTable "TTypes". A noter que lorsque le DataSet ne contient qu'un seul DataTable, on peut se passer du DataSet et travailler directement avec le DataTable (dans mon projet de test, je garde DataSet et DataTable dans tous les cas pour conserver la similitude dans l'organisation des codes).
    Voici des extraits de mon code :
    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
     
    Public Class FGestAstuces
     
        Dim MaConexion As New OleDbConnection
     
        Dim MaCommande As OleDbCommand
     
        Dim MesAstuces As New DataSet
     
        Dim NomTableAstuces As String = "TAstuces"
        Dim NomTableTypes As String = "TTypes"
        Dim NomTableFichiers As String = "TFichiers"
        Dim NomTableImages As String = "TImages"
     
    ' ... ... ...
                 MonAdapter.Fill(UneDataTable)
                 UneDataTable.TableName = NomTableAstuces
                 MesAstuces.Tables.Add(UneDataTable)
     
    ' ... ... ...
                MonAdapter.Fill(UneDataTable)
                UneDataTable.TableName = NomTableTypes
                MesAstuces.Tables.Add(UneDataTable)
     
    ' ... ... ...
                MonAdapter.Fill(UneDataTable)
                UneDataTable.TableName = NomTableFichiers
                MesAstuces.Tables.Add(UneDataTable)
     
    ' ... ... ...
                MonAdapter.Fill(UneDataTable)
                UneDataTable.TableName = NomTableImages
                MesAstuces.Tables.Add(UneDataTable)
    J'ai tenté d'utiliser le menu "Préférence" pour trouver la DB. Je ne suis pas sûr du nom de dossier que tu enregistres là ... ou je ne sais pas m'en servir . J'ai donc modifié les chaine de connexion pour pouvoir tester.

    Je travaille à améliorer ma version de tests, notamment en remplaçant la longue liste de paramètres des fonctions SauverAstuce et ModifierAstuce (Private Function SauverAstuce(ByRef Id As Integer, ByVal XIdType As Integer, Nom As String, Description As String, Code As String, Note As String, Remarque As String, Commentaire As String, Lien As String) As Boolean) par un dispositif où ces paramètres ne sont écrits qu'une seule fois. Actuellement, ils sont écrits 4 fois : dans l'entête de la fonction SauverAstuce et dans l'appel de cette fonction, dans l'entête de la fonction ModifierAstuce et dans l'appel de cette fonction.

    Je t'enverrai les extraits les plus intéressants dans quelques jours.

    Bonne nuit ...

  18. #158
    Membre émérite 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
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour,

    J'ai oublié de te signaler un petit manquement ...

    On ne peut accepter de doublons sur des champs d'identification (Type dans TType et NomAstuce dans TAstuce) or tu n'as pas programmé ce contrôle et il est possible d'encoder des doublons sur Type et sur NomAstuce. Je pense que nous n'avons pas abordé cette question ...

    Voici le code pour éviter le doublon sur Type :

    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
     
    Private Function AjouterType(ByRef Id As Integer, ... ... ...
    ' ... ... ...
            ' Traiter ici l'interdiction de doublon sur Type
            SQL = "SELECT COUNT(IdType) FROM T_Type WHERE Type = @LeType; "
            MaCommande.CommandText = SQL
     
            If MaCommande.ExecuteScalar() > 0 Then
                ' On ne peut créer un doublon sur Type
                MaConexion.Close()
                MaCommande.Dispose()
                Return False
            End If
     
            ' Vérifier ici les autres contraintes (interdiction et obligations diverses pour la cohérence des données)
            '
            ' Rien à faire pour la gestion des types
            '
     
            ' Effectuer l'ajout effectif dans la DB
            SQL = "INSERT INTO T_TYPE (Type) VALUES (@LeType); "
            MaCommande.CommandText = SQL
     
    ' ... ... ...
    Bonne journée,


  19. #159
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2020
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2020
    Messages : 117
    Points : 17
    Points
    17
    Par défaut
    Bonjour Phil Rob

    Pour le My.Settings.APP_PATH, j'ai préféré utiliser ce système car je vais placer la Db et les répertoire des fichiers sur mon Nas comme cela je pourrais avoir accès aussi bien avec mon pc fixe ou mon portable, je trouve cela plus facile quand c'est une db partagée.

    Par contre j'ai essayé de modifier le module DBconnection avec tes dernières remarques, mais j'obtiens plusieurs erreur.

    Pièce jointe 587572

    Et comme tu le dis autant utiliser le module.

    Concernant la gestion des doublons je dois ajouter en plus les lignes que tu as donné ou adapter une partie du code :

    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
     
    Private Function AjouterType(ByRef Id As Integer, ByVal LeType As String) As Boolean
            Dim SQL As String
            If Requis() = True Then
     
            End If
            ParametroConexion()
            MaConexion.Open()
            MaCommande = MaConexion.CreateCommand()
     
            SQL = "INSERT INTO T_TYPE (Type) VALUES( '" & LeType & "'); "
            MaCommande.CommandText = SQL
            If MaCommande.ExecuteNonQuery() = 1 Then
                ' Ajout effectué
            Else
                ' Erreur
                MaConexion.Close()
                MaCommande.Dispose()
                Return False
            End If
     
            SQL = " SELECT MAX(IdType) FROM T_TYPE"
            MaCommande.CommandText = SQL
            Id = MaCommande.ExecuteScalar()
     
            MaConexion.Close()
            MaCommande.Dispose()
            Return True
        End Function
    Bonne journée

  20. #160
    Membre émérite 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
    Points : 2 865
    Points
    2 865
    Par défaut
    Désolé de voir ton message seulement maintenant. C'est la 2ème fois que je ne reçois pas de notification !!!

    Pour éviter les doublons, mon code doit se placer dans la procédure d'ajout, avant la commande INSERT. Si mes lignes de code "voient" un doublon, on sort de" la procédure et donc, on ne fait pas l'INSERT.

    Ceci est le code d'ajout d'un Type dans FGestType :

    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
       Private Function AjouterType(ByRef Id As Integer, ByVal LeType As String) As Boolean
            Dim SQL As String
            If Requis() = True Then
     
            End If
            ParametroConexion()
            MaConexion.Open()
            MaCommande = MaConexion.CreateCommand()
     
            ' Traiter ici l'interdiction de doublon sur Type
            SQL = "SELECT COUNT(IdType) FROM T_Type WHERE Type = @LeType; "
            MaCommande.CommandText = SQL
     
            If MaCommande.ExecuteScalar() > 0 Then
                ' On ne peut créer un doublon sur Type
                MaConexion.Close()
                MaCommande.Dispose()
                Return False   ' On retourne FALSE et on ne faoit pas l'INSERT.
            End If
     
            SQL = "INSERT INTO T_TYPE (Type) VALUES( '" & LeType & "'); "
            MaCommande.CommandText = SQL
            If MaCommande.ExecuteNonQuery() = 1 Then
                ' Ajout effectué
            Else
                ' Erreur
                MaConexion.Close()
                MaCommande.Dispose()
                Return False
            End If
     
            SQL = " SELECT MAX(IdType) FROM T_TYPE"
            MaCommande.CommandText = SQL
            Id = MaCommande.ExecuteScalar()
     
            MaConexion.Close()
            MaCommande.Dispose()
            Return True
        End Function
    Il faut faire ± la même chose dans SauverAstuce pour éviter les doublon sur "NomAstuce".

    Pour le module, je vois demain matin et je t'envoie le code corrigé.

    Bonne nuit,


Discussions similaires

  1. [Débutant] Manipuler une base de données Access en C#
    Par jed72 dans le forum C#
    Réponses: 18
    Dernier message: 18/05/2016, 16h51
  2. Réponses: 3
    Dernier message: 05/09/2015, 20h23
  3. Réponses: 0
    Dernier message: 11/11/2014, 18h08
  4. Réponses: 15
    Dernier message: 25/10/2004, 11h50
  5. associer une base de données(access) a un dbgrid
    Par ange1708 dans le forum MFC
    Réponses: 3
    Dernier message: 11/06/2002, 12h18

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