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. #161
    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
    Suite ...

    J'ai été un peu vite pour esquisser le code de DBConnector ...

    Voici le code corrigé (je n'ai pas testé, mais ça compile sans erreur) :
    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
     
    Imports System.Data.OleDb
    Module DBconnector
        Public Function DB_ASTUCE() As String
            Dim 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
            Dim DB_ASTUCE_CONNECT = 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
    et le code de test dans FrAcceuil :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ' ... ... ...
        Private Sub Frm_Accueil_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            '**** Vérification de la connection vers la DB_ASTUCE
            Try
                If Not DBconnector.TestDB() Then
                    MsgBox("Base de donnée non trouvée, veuilliez configurer le chemin d'accès...", MsgBoxStyle.Critical + vbSystemModal, "Erreur...")
                End If
            Catch ex As Exception
                MsgBox("Base de donnée non trouvée, veuilliez configurer le chemin d'accès...", MsgBoxStyle.Critical + vbSystemModal, "Erreur...")
            End Try
        End Sub
    ' ... ... ...
    Bonne nuit ...

  2. #162
    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,

    Pour bien commencer la journée, et avant de retourner à mon chantier ....

    Je te confirme que mes codes d'hier soir, le code de TestDB et son implémentation dans le Form d'acceuil, fonctionnent bien.

    Par ailleurs, tes codes de choix de la DB fonctionnent parfaitement ... quand on les utilisent correctement ...
    Ils donnent exactement le même confort que mon fichier de paramètres mais on ne doit pas se soucier de l'impléméntation du fichier. Plus simple finalement ...

    Bonne journée,


  3. #163
    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

    Voila j"ai implémenté le module Dbconnector, je lui aussi ajouté la connexion pour DB_EBOOK.

    Par-contre la vérification de doublon pour les types pose encore problème :

    Pièce jointe 587635

    Bon chantier et si on ne s'entend plus d'ici là, passe une fin bonne année

  4. #164
    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,

    Compte tenu de ta syntaxe (sans paramètre SQL), il te faut remplacer ... WHERE Type = @LeType; " par ... WHERE Type = '" & LeType & "'; ".

    Dans SauveAstuce, tu as utilisé les paramètres SQL. Là, tu pourras utiliser le code que je t'ai envoyé (presque, il ne s'agit pas du même champs, ni de la même table).

    Dis-moi ...

    Bonne soirée et déjà bonne année chez toi aussi ...

  5. #165
    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 ça fonctionne et je l'ai agrémenté d'un petit message :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MsgBox("La valeur existe déja dans la base de données", MsgBoxStyle.Information, "Attention !")
    Bonne soirée

  6. #166
    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
    Bravo !
    )))
    Bonne soirée.

  7. #167
    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 une excellente année 2021 espérons quelle soit meilleur que 2020.

    Petite question pour commencer l'année :

    Pour certain fichier de ma listbox, à l'ouverture j'ai un message pour confirmer l'ouverture de celui-ci :
    Pièce jointe 587738

    Si je clique OK je n'ai pas de problème mais si je clique sur annuler alors j'ai un message d'erreur.

    Pièce jointe 587739

    Aurais-tu une astuce pour éviter cette erreur.

    Merci

    Bonne journée

  8. #168
    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
    Bonne année à toi aussi Rezolu.

    Pour ce qui de ton erreur, je ne vois pas mais pour faire facile, si tu mets l'appel du Process dans Try Catch, tu devrais être dépanné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ' ... ... ...
            If IO.File.Exists(fileLBFichiers) Then
    Try
                Process.Start(fileLBFichiers)
    Catch
    End Try
            Else 
    MsgBox("Fichier introuvable", MsgBoxStyle.Information, "Le chemin d'accès ou le fichier sont introuvables")
            End If
    ' ... ... ...

  9. #169
    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
    Super c'est nickel

    Merci

  10. #170
    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 suis en train de modifier le code pour la suppressions d'une astuce, j'aimerai quand je supprime l'astuce je déplace tous les fichiers des 2 listbox vers un dossier spécifique (Data\Corbeille).

    J'arrive a le faire avec un seul fichier mais pas avec le contenu complet du répertoire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     '********************* Déplacer tous les fichiers du Repertoire **********
                Dim fileLBFichiers As String = My.Settings.APP_PATH + "\Astuces\Fichier\" + CB_Type.Text & "\" + TB_NomAstuce.Text
                Dim Corbeille As String = My.Settings.APP_PATH + "\Corbeille\"
                For Each fichier As String In Directory.GetFiles(fileLBFichiers)
     
                    File.Move(fileLBFichiers, Corbeille) ' Déplacer fichier vers Corbeille
                    ' File.Delete(fichier)
                Next
                '***********************************************************************
    Avec la fonction File.delete j'arrive a tous supprimer, mais je préfère les déplacer vers un dossier temporaire du projet, comme cela je peux garder les fichiers au cas ou.

    Bonne soirée

  11. #171
    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,

    Tu trouveras sûrement l'inspiration dans cette page d'infos : Dossier.pdf.


  12. #172
    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

    Je vais jeter un œil à cela

  13. #173
    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 manque de temps pour terminer ma dernière version de l’application. Je te l’envoie dans son état actuel (DB_ASTUCE_PHR.zip), tous les tests n’ont pas été réalisés et il peut donc subsister des bugs. Pour l’exécuter, il te faut changer la chaine de connexion dans le module MConex.

    De façon générale, j’ai adopté ton approche de l’ergonomie, sans toutefois rejeter complètement la mienne. Cela ne fait qu’améliorer l’accès intuitif.

    Question code, j’ai bien entendu gardé la même organisation du code :
    • mode déconnecté pour la consultation des données (la DB est copiée en tout ou en partie en mémoire et la connexion à la DB n’est plus nécessaire) ;
    • mode connecté dès qu’il y a opération qui doit être enregistrée dans la DB (ouverture de la DB, vérification des contraintes eu égard à l’opération envisagée, exécution de l’opération INSERT, UPDATE, DELETE).


    Cette manière de faire permet de ne pas conserver des connexions inutilement ouvertes et en cas de problèmes hardware pendant la mise à jour, seule la dernière opération (celle qu’on vient de demander) est perdue. Cela se voit de suite et la correction est aisée.

    D’autres manières de faire existent, notamment en mode déconnecté où il est ordinaire de commander les mises à jour de la DB après que de nombreuses modifications aient été effectuées sur le DataSet en mémoire. Cette façon de faire peut poser problèmes s’il survient un problème hardware après des heures de travail mais avant la mise à jour.

    Pour ce qui est de l’amélioration du code, je veux épingler ici deux points.

    Dans la foulée de la remarque que je faisais l’autre jour à propos des New et Dispose (autant de Dispose que de New), je me suis rendu compte que la façon dont j’avais programmé l’usage de l’objet Command provoquait plus de Dispose que de New. En effet, je déclarais Dim MaCommande As New OleDbCommand au niveau du Form (donc une seule fois) et je programmais un MaCommande.Dispose chaque fois qu’une commande avec été exécutée ou abandonnée (dans les procédures d’Ajout, Modif et Suppression).
    Maintenant, au niveau du Form, je déclare la commande Dim MaCommande As OleDbCommand et cet objet est instancié chaque fois que nécessaire (dans les procédures d’Ajout, Modif et Suppression). De cette façon, nous exécutons bien un Dispose pour chaque New, et pas un de plus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            ParametroConexion()
            MaConexion.Open()
            MaCommande = New OleDbCommand()
            MaCommande.Connection = MaConexion
    Comme je l’ai indiqué dans un message précédent, je trouvais dérangeant de devoir écrire plusieurs fois la « longue » suite de paramètres pour les fonctions AjouterAstuce et ModifierAstuce. J’ai donc écrit une procédure qui fait le nécessaire pour ces 2 fonctions.
    Cette fonction pour les astuces :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        Private Sub ChargerDonneesPourAjouterOuModifierAstuce(ByRef DTR As DataRow)
            ' Affecter tous les champs avec les contenus des zones de saisie
            DTR.Item("XIdTypeAstuce") = CBType.SelectedValue
            DTR.Item("NomAstuce") = TBNomAstuce.Text
            DTR.Item("DescripAstuce") = TBDescripAstuce.Text
            DTR.Item("CodeAstuce") = RTBCode.Text
            DTR.Item("NoteAstuce") = RTBNoteAstuce.Text
            DTR.Item("RemAstuce") = RTBRemAstuce.Text
            DTR.Item("CommentAstuce") = RTBCommentAstuce.Text
            DTR.Item("LienAstuce") = TBLienAstuce.Text
        End Sub
    Cette procédure « reçoit » un DataRow qui est ensuite transmis aux fonctions AjouterAstuce et ModifierAstuce. Le code d’affectation des paramètres n’est donc plus écrit qu’une seule fois.

    Bien sûr, le DataRow est créé et passé à cette procédure dans la procédure Bp_.... correspondante, avant l’appel de la fonction de mise à jour de la DB. Dans cette dernière, les paramètres SQL sont maintenant issus des champs du DataRow et non plus des paramètres d’entête de la fonction.
    Par exemple, pour ajouter une astuce (attention, ces codes ne peuvent remplacer les tiens par simple copier-coller, notamment parce que j’active la procédure du bouton « Ignorer » ou une fonction de plausibilité des données qui n’existe actuellement pas dans ton 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
    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
    ‘ Le bouton :
        Private Sub BAjouterAstuce_Click(sender As Object, e As EventArgs) Handles BAjouterAstuce.Click
            If Not DonneesPossiblesAstuce() Then
                BIgnorerAstuce_Click(Me, Nothing)
                Exit Sub
            End If
            Dim NouvelId As Integer
            Dim IdAstuceEnCours As Integer
            IdAstuceEnCours = MesAstuces.Tables(NomTableAstuces).Rows(Me.BindingContext(MesAstuces.Tables(NomTableAstuces)).Position).Item("IdAstuce")
     
            Dim DTR As DataRow = MesAstuces.Tables(NomTableFichiers).NewRow
            ChargerDonneesPourAjouterOuModifierAstuce(DTR)
     
            MesAstuces.Tables(NomTableFichiers).RejectChanges()
     
            If AjouterAstuce(NouvelId, DTR) Then ' envoyer toutes les données et recevoir le nouvel ID par ByRef de NouvelId
                DTR.Item("IdType") = NouvelId
                MesAstuces.Tables(NomTableAstuces).RejectChanges()
                MesAstuces.Tables(NomTableAstuces).Rows.Add(DTR.ItemArray) ' Si ok, on ajoute au DataTable
                MesAstuces.Tables(NomTableAstuces).AcceptChanges()
            Else
                BIgnorerAstuce_Click(Me, Nothing)
            End If
            DTR.Delete()
        End Sub
     
    ‘ La mise à jour effective :
        Private Function AjouterAstuce(ByRef Id As Integer, ByRef DTR As DataRow) As Boolean  ' doit recevoir toutes les données, sans Id.
            Dim SQL As String
     
            ParametroConexion()
            MaConexion.Open()
            MaCommande = New OleDbCommand()
            MaCommande.Connection = MaConexion
            ' Les paramètres dans l'ordre de leur utilisation dans la commande
            MaCommande.Parameters.AddWithValue("@XIdTypeAstuce", DTR.Item("XIdTypeAstuce"))
            MaCommande.Parameters.AddWithValue("@NomAstuce", DTR.Item("NomAstuce"))
            MaCommande.Parameters.AddWithValue("@DescripAstuce", DTR.Item("DescripAstuce"))
            MaCommande.Parameters.AddWithValue("@CodeAstuce", DTR.Item("CodeAstuce"))
            MaCommande.Parameters.AddWithValue("@NoteAstuce", DTR.Item("NoteAstuce"))
            MaCommande.Parameters.AddWithValue("@RemAstuce", DTR.Item("RemAstuce"))
            MaCommande.Parameters.AddWithValue("@CommentAstuce", DTR.Item("CommentAstuce"))
            MaCommande.Parameters.AddWithValue("@LienAstuce", DTR.Item("LienAstuce"))
     
            ' Traiter ici l'interdiction de doublon sur NomAstuce
            SQL = "SELECT COUNT(IdType) FROM T_Type WHERE NomAstuce = @NomAstuce; "
            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 astuces
            '
     
            ' Effectuer l'ajout effectif dans la DB
            SQL = "INSERT INTO T_ASTUCEPROG (XIdTypeAstuce, NomAstuce, DescripAstuce, CodeAstuce, NoteAstuce, RemAstuce, CommentAstuce, LienAstuce) VALUES(@XIdTypeAstuce, @NomAstuce, @DescripAstuce, @CodeAstuce, @NoteAstuce, @RemAstuce, @CommentAstuce, @LienAstuce); "
            MaCommande.CommandText = SQL
     
            If MaCommande.ExecuteNonQuery() = 1 Then
                ' Ajout effectué
            Else
                ' Erreur
                MaConexion.Close()
                MaCommande.Dispose()
                Return False
            End If
     
            ' Lire le dernier ID attribué pour la mise à jour du DataTable (retour par paramètre ByRef)
            SQL = "SELECT MAX(IdAstuce) FROM T_ASTUCEPROG"
            MaCommande.CommandText = SQL
            Id = MaCommande.ExecuteScalar()
     
            MaConexion.Close()
            MaCommande.Dispose()
            Return True
        End Function
    J’espère que ceci te permettra d’améliorer ton code …

  14. #174
    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

    Merci pour ton nouveau fichier test et ton code, je regarderai cela plus en profondeur pour modifier mon projet.

    Concernant la vérification des doublons du nom de l'astuce, j'ai quelque chose qui me chiffonne, l'idée est bonne mais je pourrais avoir un nom d'astuce identique mais pour 2 types d'astuces différentes
    dans le cas présent cela n'est pas possible.

    Par hasard est-il possible d'autoriser un nom identique seulement si le type est différent.

    Je ne sais pas si mon explication est claire.

    Exemple :

    Astuce 1 : Type : VB net => Nom astuce: Création d'un répertoire
    Astuce 2 : Type : Access => Nom astuce : Création d'un répertoire


    De mon coté, voila se que j'ai ajouter au projet :

    - Intégration de la gestion des doublons
    - pour la suppression des astuces, en même temps que supprimer l'astuce, je déplace tous les fichiers et images de cette astuce vers un dossier poubelle temporaire inclus dans les répertoires du projet, comme cela je peux encore recéper les fichier au cas ou.
    Pour la gestion des fichiers supprimer j'aimerais intégrer dans le projet une espèce d'explorateur de fichier où la je pourrais choisir de les supprimer définitivement ou pas.

    Par hasard aurais-tu un exemple d'explorateur de fichier.
    J'ai commencé quelque chose voir ci-joint :

    Mais je ne suis pas encore satisfait

    Bonne soirée

  15. #175
    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,

    Je n'ai pas ta requête "anti-doublon" de ta procédure SauverAstuce(). C'est pourquoi j'ai écrit la requête sur base de mon "anti-doublon" de ma procédure AjouterAstuce().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            ' Traiter ici l'interdiction de doublon sur NomAstuce
            SQL = "SELECT COUNT(IdType) FROM T_Type WHERE XIdTypeAstuce = @XIdTypeAstuce AND NomAstuce = @NomAstuce; "
    Ainsi, on ne considère qu'il y a doublon que si même XIdTypeAstue ET même NomAstuce.

    ...

  16. #176
    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

    Ci-joint ma procédure anti doublon actuelle

    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 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
            Dim SQL As String
     
            ParametroConexion()
            MaConexion.Open()
            MaCommande = MaConexion.CreateCommand()
     
            '*******************************************************
            ' Traiter ici l'interdiction de doublon sur Nom Astuce
            SQL = "SELECT COUNT(NomAstuce) FROM T_ASTUCEPROG WHERE NomAstuce = '" & Nom & "'; "
     
            MaCommande.CommandText = SQL
     
            If MaCommande.ExecuteScalar() > 0 Then
                ' On ne peut créer un doublon sur Type
                MaConexion.Close()
                MaCommande.Dispose()

  17. #177
    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,

    C'est facile non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            '*******************************************************
            ' Traiter ici l'interdiction de doublon sur Nom Astuce
            SQL = "SELECT COUNT(NomAstuce) FROM T_ASTUCEPROG WHERE XIdTypeAstuce = " & XIdType & " AND NomAstuce = '" & Nom & "'; "
     
    ' ... ... ...
    XIdType vient en paramètre dans la fonction et concerne le champ XIdTypeAstuce, et c'est un numérique, c'est pourquoi je ne place pas d'apostrophe (ce genre de distinction dans l'écriture d'une requête n'est plus nécessaire lorsqu'on utilise les paramètres SQL, cf. mes codes récents).

    Je n'ai pas testé ...

  18. #178
    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
    Super ça fonctionne

    Bonne soirée

  19. #179
    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

    Mon projet prend presque fin et cela grâce à toi et je t'en remercie.

    Je joint mon projet pour avoir ton avis.

    Pour la connexion à la db il faut pointer vers : C:\...............\Projet\Astuces en vrac\Data

    Bon week-end
    Fichiers attachés Fichiers attachés

  20. #180
    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 Rezolu, je regarderai cela dès que possible ...

    Merci aussi pour la précision à propos de la connexion à la DB. Mais maintenant, j'ai compris ...

    Très bon week-end à toi.

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