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

VBA Access Discussion :

Recordset pour INSERT INTO dans une table vide


Sujet :

VBA Access

  1. #1
    Membre averti
    Directeur technique
    Inscrit en
    Novembre 2006
    Messages
    584
    Détails du profil
    Informations personnelles :
    Âge : 61

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 584
    Points : 403
    Points
    403
    Par défaut Recordset pour INSERT INTO dans une table vide
    Bonjour à tous,

    Voilà, j'ai une fonction pour créer un certain nombre de nouveaux enregistrements, déclenchée par un bouton et passant trois variables (un champ identificateur, une variable début(ProchainArticle) et un champ NbreArticle.
    Ca fonctionne sauf si la table cible de l'INSERT est vide car alors le recordset est vide et ne peut pas calculer le prochain champ clé en numauto.

    J'ai essayé différents tests (qui d'habitude me donnent satifaction) avec BOF ou EOF sans résultat, c'est curieux: je n'ai pas le debug print "coucou" dans le cas de la table cible vide alors que j'execute bien l'incrémentation du numauto dans le cas ou il existe déjà au moins un enregistrement.

    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
    Public Function CreationArticle(ByVal VersementID As Long, ByVal NbreArticle As Integer, ByVal ProchainArticle As Integer) As String
     Dim valMax As Long
     Dim Renvoircd As Integer
     Renvoircd = 0
    Dim rcd As DAO.Recordset
         'on récupère la valeur max
    Dim boucle As Integer
    On Error GoTo Fin
    DoCmd.SetWarnings (False)
    For boucle = ProchainArticle To (ProchainArticle + NbreArticle)
         Set rcd = CurrentDb.OpenRecordset("SELECT MAX(ArticleAVerserID) FROM tblArticleAVerser")
         If rcd.EOF Then  'Pas de record
            valMax = 1
        Debug.Print "coucou"
        Else
            valMax = rcd.Fields(0) + 1
        End If
            Debug.Print "valMax4 "; valMax
            rcd.Close
            'on l'insère
         CurrentDb.Execute "INSERT INTO tblArticleAVerser (ArticleAVerserID, VersementIDParent, NumeroArticle)" & _
                            "VALUES (" & "" & valMax & "" & "," & "" & VersementID & "" & "," & "" & ProchainArticle & "" & ")"
         'Compteur
         ProchainArticle = ProchainArticle + 1
         Renvoircd = Renvoircd + 1
         CreationArticle = Renvoircd
    Next boucle
    DoCmd.SetWarnings (True)
    Fin:
     MsgBox ("Ca s'est mal passé...")
    CreationArticle = Renvoircd
    Ce code fonctionne seulement si il existe au moins un enregistrement, que puis-je mettre au lieu de < valMax = 1> (car le pb n'est probablement dans le test mais dans l'action)?

    D'autre part , bien que je ne vois pas d'erreur (que mon insert se passe bien ou pas) le msgbox de Fin: est toujours activé. Pourquoi?

    Merci pour votre attention.

  2. #2
    Expert éminent sénior
    Avatar de Dolphy35
    Homme Profil pro
    Responsable Systemes d'Information
    Inscrit en
    Octobre 2004
    Messages
    4 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable Systemes d'Information
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 373
    Points : 11 218
    Points
    11 218
    Par défaut
    Salut,

    je n'ai pas éplucher ton code mais pourquoi tu ne teste pas si il y a un enregistrement avec rcd.RecordCount qui te donne le nombre d'enregistrement de ton Recordset et en fonction tu triate différemment.

    Dolphy

  3. #3
    Membre actif Avatar de Gary_Stoupy
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 244
    Points : 232
    Points
    232
    Par défaut
    Alors juste en jetant un oeil rapide...
    J'ai déjà un indice pour ton msgbox de Fin...

    Avant la balise <Fin> il faut que tu lui dise soit de sortir (si c'est la fin de ta function ou de ton sub -> exit function ou exit sub.
    Ou alors, comme ca a l'air d'etre le cas ici, il faut que tu lui fasse un goto...
    juste avant fin, tu lui écris <goto suite> et juste après Fin tu lui met <suite>

    Ca donne un truc du genre :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DoCmd.SetWarnings (True)
    GoTo suite
    Fin:
     MsgBox ("Ca s'est mal passé...")
    Suite :
    CreationArticle = Renvoircd
    Ainsi, si il n'y a pas d'erreur, il n'exécutera pas Fin...

    Pour le reste, je regarde dès que j'ai de nouveau 2 minutes ^^

  4. #4
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 87
    Points : 80
    Points
    80
    Par défaut hello!
    tu peu en debut de code initialiser
    valmax="0" et ensuite tester valmax
    mais la solution de Dolphy35 est plus dans l'esprit d'un programmeur

    bon courage

  5. #5
    Membre averti
    Directeur technique
    Inscrit en
    Novembre 2006
    Messages
    584
    Détails du profil
    Informations personnelles :
    Âge : 61

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 584
    Points : 403
    Points
    403
    Par défaut
    Bonjour à tous,

    Merci Gary pour
    Avant la balise <Fin> il faut que tu lui dise soit de sortir (si c'est la fin de ta function ou de ton sub -> exit function ou exit sub.
    Ou alors, comme ca a l'air d'etre le cas ici, il faut que tu lui fasse un goto...
    juste avant fin, tu lui écris <goto suite> et juste après Fin tu lui met <suite>
    Ca fonctionne

    Merci Dolphy et Giloo mais tjrs pb. Voilà ce que donne le code après vos modif et après activation des SetWarnings
    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
    Public Function CreationArticle(ByVal VersementID As Long, ByVal NbreArticle As Integer, ByVal ProchainArticle As Integer) As String
     Dim valMax As Long
     Dim Renvoircd As Integer
     Renvoircd = 0
    Dim rcd As DAO.Recordset
    Dim boucle As Integer
    Dim trouve As Long
    'On Error GoTo Fin
    'DoCmd.SetWarnings (False)
    DoCmd.SetWarnings (True)
    For boucle = ProchainArticle To (ProchainArticle + NbreArticle)
    'Cherche le plus grand des NumAuto
         Set rcd = CurrentDb.OpenRecordset("SELECT MAX(ArticleAVerserID) FROM tblArticleAVerser")
        Debug.Print "RecordCount "; rcd.RecordCount
        trouve = rcd.RecordCount
        If trouve > 0 Then
            valMax = rcd.Fields(0) + 1
        Else
            valMax = 1
            Debug.Print "coucou"
        End If
            Debug.Print "valMax6 "; valMax
            rcd.Close
         CurrentDb.Execute "INSERT INTO tblArticleAVerser (ArticleAVerserID, VersementIDParent, NumeroArticle)" & _
                            "VALUES (" & "" & valMax & "" & "," & "" & VersementID & "" & "," & "" & ProchainArticle & "" & ")"
         ProchainArticle = ProchainArticle + 1
         Renvoircd = Renvoircd + 1
         CreationArticle = Renvoircd
    Next boucle
    'DoCmd.SetWarnings (True)
    GoTo Suite
    Fin:
     MsgBox ("Ca s'est mal passé...")
    Suite:
    CreationArticle = Renvoircd
    Utilisation incorrecte de null car Fields(0) est null, et trouve est = 1 alors que la table est vide!

    Je m'y perds...

  6. #6
    Membre éclairé Avatar de ft035580
    Profil pro
    Inscrit en
    Août 2004
    Messages
    689
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 689
    Points : 812
    Points
    812
    Par défaut
    Salut,

    Et en essayant

  7. #7
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 316
    Points : 367
    Points
    367
    Par défaut
    Bonjour,

    Pourquoi tu n'utilise pas un champ de type numAuto.

    A+

  8. #8
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 184
    Points : 1 363
    Points
    1 363
    Par défaut
    Je me suis permis de réécrire un peu ta fonction :
    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
    Public Function CreationArticle(ByVal VersementID As Long, ByVal NbreArticle As Integer, ByVal ProchainArticle As Integer) As String
    Dim valMax As Long
    Dim Renvoircd As Integer
    Renvoircd = 0
    'Dim rcd As DAO.Recordset
    Dim boucle As Integer
    Dim trouve As Long
    dim iStr_SQL as string
    'On Error GoTo Fin
    'DoCmd.SetWarnings (False)
    DoCmd.SetWarnings (True)
    For boucle = ProchainArticle To (ProchainArticle + NbreArticle)
    'Cherche le plus grand des NumAuto
        'Set rcd = CurrentDb.OpenRecordset("SELECT MAX(ArticleAVerserID) FROM tblArticleAVerser")
        'Debug.Print "RecordCount "; rcd.RecordCount
        trouve = nz(dmax("ArticleAVerserID", "tblArticleAVerser"), -1)
        If trouve > 0 Then
            valMax = trouve + 1
        Else
            valMax = 1
            Debug.Print "coucou"
        End If
        Debug.Print "valMax6 "; valMax
        'rcd.Close
        iStr_SQL = "INSERT INTO tblArticleAVerser (ArticleAVerserID, VersementIDParent, NumeroArticle) " & _
                   "VALUES (" & valMax & ", " & VersementID & ","  ProchainArticle & ")"
        CurrentDb.Execute istr_sql, dbfailonerror
        ProchainArticle = ProchainArticle + 1
        Renvoircd = Renvoircd + 1
        CreationArticle = Renvoircd
    Next boucle
    'DoCmd.SetWarnings (True)
    GoTo Suite
    Fin:
     MsgBox ("Ca s'est mal passé...")
    Suite:
    CreationArticle = Renvoircd
    end function

  9. #9
    Membre averti
    Directeur technique
    Inscrit en
    Novembre 2006
    Messages
    584
    Détails du profil
    Informations personnelles :
    Âge : 61

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 584
    Points : 403
    Points
    403
    Par défaut
    Bonjour ft35,

    Je met trouve = 0 en début de fonction
    et j'ai essayé ton idée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        If trouve = 0 Then
            valMax = 1
            Debug.Print "coucou"
        Else
            valMax = rcd.Fields(0) + 1
        End If
    Mais trouve est tjrs = 1!

  10. #10
    Membre averti
    Directeur technique
    Inscrit en
    Novembre 2006
    Messages
    584
    Détails du profil
    Informations personnelles :
    Âge : 61

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 584
    Points : 403
    Points
    403
    Par défaut
    Bonjour soltani,

    Pourquoi tu n'utilise pas un champ de type numAuto.
    C'est un champ NumAuto

    Bonjour Kloun,

    Merci, ca marche.
    Code final (je le mets car il y avait une erreur de syntaxe):
    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 Function CreationArticle(ByVal VersementID As Long, ByVal NbreArticle As Integer, ByVal ProchainArticle As Integer) As String
    Dim valMax As Long
    Dim Renvoircd As Integer
    Renvoircd = 0
    Dim boucle As Integer
    Dim trouve As Long
    Dim iStr_SQL As String
    On Error GoTo Fin
    'DoCmd.SetWarnings (False)
    DoCmd.SetWarnings (True)
    For boucle = ProchainArticle To (ProchainArticle + NbreArticle)
        trouve = Nz(DMax("ArticleAVerserID", "tblArticleAVerser"), -1)
        If trouve > 0 Then
            valMax = trouve + 1
        Else
            valMax = 1
            Debug.Print "coucou"
        End If
        Debug.Print "valMax6 "; valMax
        iStr_SQL = "INSERT INTO tblArticleAVerser (ArticleAVerserID, VersementIDParent, NumeroArticle) " & _
                   "VALUES (" & valMax & ", " & VersementID & "," & ProchainArticle & ")"
        CurrentDb.Execute iStr_SQL, dbFailOnError
        ProchainArticle = ProchainArticle + 1
        Renvoircd = Renvoircd + 1
        CreationArticle = Renvoircd
    Next boucle
    'DoCmd.SetWarnings (True)
    GoTo Suite
    Fin:
     MsgBox ("Ca s'est mal passé...")
    Suite:
    CreationArticle = Renvoircd
    End Function
    Ce genre de pb peut ne se poser qu'une fois dans la vie de la base, faut-il l'ignorer pour autant?
    Encore merci à tous pour votre aide.
    JC

  11. #11
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 316
    Points : 367
    Points
    367
    Par défaut
    Bonjour,

    Pourquoi alors lui faire un update avec pour valeur Valmax(si j'ai bien compris).

    A+

  12. #12
    Membre averti
    Directeur technique
    Inscrit en
    Novembre 2006
    Messages
    584
    Détails du profil
    Informations personnelles :
    Âge : 61

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 584
    Points : 403
    Points
    403
    Par défaut
    Soltani:
    Pourquoi alors lui faire un update avec pour valeur Valmax(si j'ai bien compris).
    Parce que j'ai du prendre cette solution sur le forum et ne pas trop me poser de question, ca a marché mais effectivement il y a surement plus simple.
    A+

  13. #13
    Membre averti
    Directeur technique
    Inscrit en
    Novembre 2006
    Messages
    584
    Détails du profil
    Informations personnelles :
    Âge : 61

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 584
    Points : 403
    Points
    403
    Par défaut Pour finir...
    Arkham46 a écrit ailleurs:
    slt,

    tu insères tes données sans préciser le numéro auto, access le gère tout seul

    du coup il faut préciser la liste des champs (sans le numéro auto) dans la requête
    CQFD

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

Discussions similaires

  1. Insert Into dans une même page que la création de la table
    Par keke21410 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 19/07/2010, 09h56
  2. [AC-2007] Insérer le résultat d'un calcul (INSERT INTO) dans une table access
    Par mrpropre99 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 19/04/2010, 00h10
  3. [MySQL] PHP-MySQL: Insertion de donnée dans une table vide
    Par jrosenzw dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 07/03/2009, 02h11
  4. INSERT INTO dans une table vide
    Par DeepXtaZy dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 22/06/2007, 08h37
  5. Insert Into dans une table avec select
    Par smail25 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 15/12/2006, 13h06

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