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 :

[DAO]Incompatibilité de type lors d'une concaténation


Sujet :

VBA Access

  1. #1
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 337
    Points : 188
    Points
    188
    Par défaut [DAO]Incompatibilité de type lors d'une concaténation
    Bonjour,

    j'ai un problème compliqué, auquel je n'ai pas réussi à trouver de solution qui fonctionne.

    On va commencer par le tout début:

    j'ai une table ("catalog") dans laquelle je voudrais faire des insertions en masse.
    Pour cela, j'ai créé un formulaire avec des champs indépendants, et un sous-formulaire basé sur une requête sur la table ("catalog_temp")
    (select * from catalog_temp).
    j'utilise la table catalog_temp (qui est une copie conforme de la structure de catalog) pour stocker les données avant de les transférer dans la table catalog (oui je sais j'aurais pu faire mieux mais j'ai cherché et j'ai pas réussi... ça marche pas et ça me met des erreurs --> je suis preneuse si vous avez des idées)

    les champs indépendants du formulaire servent à écrire des données correspondant aux champs de la table catalog_temp.
    j'ai programmé un bouton qui, lorsqu'on clique dessus, insère le contenu des champs dans la table catalog_temp.
    après rafraichissement, je vois apparaitre les champs que je voulais insérer dans le sous-formulaire.
    cette méthode me permet en cliquant plusieurs fois d'affilée d'insérer plein de fois la même chose, puis de modifier chaque champ si nécessaire (ça m'évite de saisir 15 fois les même données, et je trouve l'interface attractive).

    bon, alors pour l'insertion j'ai fait un gros code tout caca:
    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
     
    'On vérifie qu'il y a au moins un champ qui a été saisi dans le formulaire
    If (Me.code = "" Or IsNull(Me.code)) And (Me.buisnessdivision_id = "" Or IsNull(Me.buisnessdivision_id)) And (Me.product_id = "" Or IsNull(Me.product_id)) And (Me.designation = "" Or IsNull(Me.designation)) And (Me.activities = "" Or IsNull(Me.activities)) And (Me.technologies = "" Or IsNull(Me.technologies)) And (Me.volume = "" Or IsNull(Me.volume)) And (Me.type = "" Or IsNull(Me.type)) And (Me.competences = "" Or IsNull(Me.competences)) And (Me.version = "" Or IsNull(Me.version)) And (Me.pc = "" Or IsNull(Me.pc)) And (Me.alea = "" Or IsNull(Me.alea)) Then
     
        MsgBox "Vous n'avez saisi aucune donnée à insérer." + Chr(13) + "Vous devez saisir des données avant d'insérer des lignes.", 64, "Attention !!!"
     
    Else 'Sinon
        'On désactive les warnings
        DoCmd.SetWarnings False
     
        'Construction de la requête d'insertion
        If (Me.code <> "" Or Not IsNull(Me.code)) Then
            If req1 = "" Then
                req1 = req1 + "code"
            Else
                req1 = req1 + ", code"
            End If
        End If
     
        'encore plein de If........puis:
    REQUETE = "INSERT INTO catalog_sbu_temp (" + req1 + ") VALUES (" + req1 + ");"
     
    'voilà, on exécute la requête SQL puis c parti !
    Caca hein ? mais ça fonctionne (idées d'améliorations bienvenues)

    Bon, une fois tout ça inséré, c'est là qu'arrive mon problème:
    ne sachant pas me servir d'un recordset (je ne sais même pas ce que c'est, pourtant j'ai lu tout ce que j'ai pu mais j'ai pas compris), mais j'ai quand même utilisé le recordset:
    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
     
    Dim rst As Variant 'oui variant, sinon ça marchait pas pour le movenext
      Dim db As DAO.Database
      Set db = CurrentDb()
      Set rst = db.OpenRecordset("r_catalog_sbu_temp", DB_OPEN_DYNASET)
      Dim TempCode, TempDes, TempProd, TempBD, ReqInsert As String
      Dim Increment As Integer
     
        Do Until Count = Increment
            TempCode = ("code")
            TempBD = ("buisnessdivision_id")
            TempProd = ("product_id")
            TempDes = ("designation")
     
    ReqInsert = "INSERT INTO catalog (code, buisnessdivision_id, product_id, designation VALUES (" + TempCode + "," + TempBD + "," + TempProd + "," + TempDes +");"
    rst.MoveNext
            Increment = Increment + 1
        Loop
    et là, erreur... incompatibilité de type.........
    HELLLLP !

    Thanx
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

  2. #2
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    Salut,

    Je suppose que c'est là que ça coince..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Do Until Count = Increment
    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
        Dim rst As DAO.Recordset
        Dim db As DAO.Database
        Set db = CurrentDb
        Set rst = db.OpenRecordset("r_catalog_sbu_temp", DB_OPEN_DYNASET)
        Dim TempCode As String, TempDes As String, TempProd As String, TempBD As String, ReqInsert As String
        Dim Increment As Integer
     
        rst.movefirst 
        Do Until rst.RecordCount = Increment
            TempCode = ("code")
            TempBD = ("buisnessdivision_id")
            TempProd = ("product_id")
            TempDes = ("designation")
     
            ReqInsert = "INSERT INTO catalog (code, buisnessdivision_id, product_id, designation VALUES (" + TempCode + "," + TempBD + "," + TempProd + "," + TempDes +");"
            rst.MoveNext
            Increment = Increment + 1
        Loop
    Au niveau du critère d'arrêt, tu peux aussi utiliser :
    Si ces champs sont dans le recordset que tu ouvres :
    ("code")
    ("buisnessdivision_id")
    ("product_id")
    ("designation")

    Alors fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    rst![Code ]
    rst![buisnessdivision_id]
    'etc...

  3. #3
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Incompatibilité de type, c'est quand tu essaies de mettre du texte dans un champ numérique, date, ....

    On n'a pas la définition de tes champs dans la table.
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

  4. #4
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 337
    Points : 188
    Points
    188
    Par défaut
    kikof:
    Je suppose que c'est là que ça coince..
    Code :

    Do Until Count = Increment

    --> j'oubliais: count c'est le résultat d'une fonction qui compte le nombre d'enregistrements de ma table temp. :-)
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

  5. #5
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 337
    Points : 188
    Points
    188
    Par défaut
    Heureux-Oli:
    ("code") --> texte
    ("buisnessdivision_id") --> numérique
    ("product_id") --> numérique
    ("designation") --> texte
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

  6. #6
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Ben voilà, tu as trouvé, tu définis des strings (texte) que tu insère dans du numérique.

    Bingo
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

  7. #7
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    Citation Envoyé par mouaa
    --> j'oubliais: count c'est le résultat d'une fonction qui compte le nombre d'enregistrements de ma table temp. :-)
    Evite d'utiliser un terme qui serait utilisé par Access (Date, Name, Count etc...)

    Count c'est le nom de la fonction ??
    Si r_catalog_sbu_temp est ta table temp alors je t'ai donné la solution :

  8. #8
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 337
    Points : 188
    Points
    188
    Par défaut
    ouh c'est gentil de m'aider comme ça !
    j'essaye et j'vous dis si ça marche !

    :-)

    merchiiiiiii
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

  9. #9
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    Par contre, dans la déclaration des variables, n'oublie pas de modifier les types

  10. #10
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 337
    Points : 188
    Points
    188
    Par défaut
    euh...modifier les types... càd que quand dans la table de destination les données sont du texte je mets string et quand c'est du numérique je mets integer ?

    (oui je sais j'ai du mal.... mais bon j'débute :-))
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

  11. #11
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 337
    Points : 188
    Points
    188
    Par défaut
    Citation Envoyé par mouaa
    euh...modifier les types... càd que quand dans la table de destination les données sont du texte je mets string et quand c'est du numérique je mets integer ?

    (oui je sais j'ai du mal.... mais bon j'débute :-))
    euh.... bah si c'est ça bah ça veut pas... incompatibilité de type !
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

  12. #12
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 337
    Points : 188
    Points
    188
    Par défaut
    Citation Envoyé par mouaa
    euh.... bah si c'est ça bah ça veut pas... incompatibilité de type !
    cela dit, quand je mets tout en string même le numérique, ça ne plante pas !
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

  13. #13
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    C'est quelle ligne qui coince ?

  14. #14
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 337
    Points : 188
    Points
    188
    Par défaut
    Citation Envoyé par Kikof
    C'est quelle ligne qui coince ?
    celle-là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ReqInsert = "INSERT INTO catalog (code,.........
    mais je pense que ça n'est pas grave, puisque les données sont insérées correctement, pas d'erreur non rien, ça me semble bon...

    voilà la requête finale, tout est déclaré en string:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ReqInsert = "INSERT INTO catalog_sbu_temp2 (code, buisnessdivision_id, product_id, designation, activities, technologies, volume, type, competences, price, version, pc, alea, hidden) VALUES ('" + TempCode + "'," + TempBD + "," + TempProd + ",'" + TempDes + "','" + TempAct + "','" + TempTech + "','" + TempVol + "','" + TempType + "','" + TempComp + "'," + TempPrice + ",'" + TempVersion + "','" + TempPC + "','" + TempAlea + "',-1 );"
    et ça marche !!! sisi j'vous assure !
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

  15. #15
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 337
    Points : 188
    Points
    188
    Par défaut
    Bon, et bien merci à tous les deux, et bonne soirée
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

  16. #16
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 337
    Points : 188
    Points
    188
    Par défaut
    ah j'oubliais !

    Comment je fais pour supprimer les enregistrements de ma table temporaire une fois qu'ils ont été insérés dans l'autre table ?

    j'ai bien essayé rst.delete, mais ça ne fonctionne pas....
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

  17. #17
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Avec une requête suppression.
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

  18. #18
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 337
    Points : 188
    Points
    188
    Par défaut
    il faut uniquement passer par une requête sql ?
    il n'y a pas la possibilité d'écrire quelque chose du style rst.delete ?
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

  19. #19
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Pourquoi faire compliqué quand on peut faire très simple.
    Le DAO est très puissant, mais lorsqu'une requête convient, pourquoi ne pas l'utiliser.

    Le SQL est quand même le langage des bases de données.
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

  20. #20
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 337
    Points : 188
    Points
    188
    Par défaut
    ok ça marche !
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

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

Discussions similaires

  1. [XL-2010] Incompatibilité de type lors de la lecture d'une propriété
    Par ptitcool dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 22/06/2014, 12h20
  2. Erreur "incompatibilité de type" lors import dans table Access
    Par spud96 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 05/01/2011, 21h40
  3. Réponses: 4
    Dernier message: 25/07/2010, 17h33
  4. probleme syntaxe lors d'une concaténation
    Par flex@ dans le forum Langage
    Réponses: 1
    Dernier message: 03/02/2008, 13h38
  5. Erreur lors d'une concaténation
    Par baleiney dans le forum Langage
    Réponses: 4
    Dernier message: 30/10/2006, 09h30

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