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

Access Discussion :

[Débutant]: Problème non respect règles validation dans Module


Sujet :

Access

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 20
    Points : 12
    Points
    12
    Par défaut [Débutant]: Problème non respect règles validation dans Module
    Salut la francophonie.

    Hay problema. J'ai confectionné une table de tri de données(tblTri) venant d'une autre table(tblFiltre), et ce par une Requête Ajout. Pour un champ de cette table([tblTri].[Die]), je veux pouvoir changer le dernier caractère (Champ Texte de 6 caractères) selon l'aspect du dernier caractère du champ de la table d'origine ([tblFiltre].[Extrudeuses]). J'ai confectionné une fonction dans un Module, que voici (en anglais, mea culpa):

    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
    Function FDie(varExt() As String, varDie() As String) As String
    
    Dim varTampDie(0 To 5) As String
    Dim varTampExt(0 To 5) As String
    
    For intI = 0 To 5
    varTampExt(intI) = varExt(intI)
    varTampDie(intI) = varDie(intI)
    Next intI
    
    If varTampExt(5) = "0" Then Exit Function
    
    End If
    
    If varExt(5) = "1" Or "2" Or "3" Then
    varTampDie(5) = "G"
    End If
    
    For intL = 0 To 5
    FDie(intL) = varTampDie(intL)
    Next intL
    
    End Function
    Le code SQL problématique de ma requête Ajout va comme suit:

    INSERT INTO tblTRI ( P, S2, NoCV, Extrudeuse, DateFab, RCP, Die )
    SELECT ... FDie([tblFILTRE].[Extrudeuse],[tblFILTRE].[Die])=FDie([tblFILTRE].[Extrudeuse],[tblFILTRE].[Die]) AS Die
    FROM tblFILTRE;

    Lorsque j'exécute ma requête voici ce qui s'affiche:

    'MAccess ne peut ajouter tous les enreg...à la suite d'une erreur de conversion de type, ... violations de clé,... violations de verrou,...violations de règles de validation'.
    Bref, je suis un violeur tous azimuts .

    SVP me dire ce qui cloche, sans doute une pécadille.

    * Police réduite. il te suffisait d'éditer le post et reformater la plice du code.
    Faw

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 20
    Points : 12
    Points
    12
    Par défaut Taille carac
    Mes excuses, je croyais RÉDUIRE la taille de code, pas la faire exploser!

  3. #3
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,

    une première chose.
    La fonction de renvoie rien.
    Pour retourner une valeur il faut faire NomFonction = valeur à Retourner.
    FDie = une string
    Sinon tu risques de renvoyer Null ou "", ce qui peut selon la configuration du champ texte
    ne pas être acceptable (Null interdit ou/et chaînes vides interdites).

    2.
    D'autre part tu n'es pas obligé d'utiliser des tableaux de caractères.
    Mid(varDie, 5, 1) extrait le 5e caractère de la chaîne varDie.
    Pour changer le 5e caractère : Mid(varDie, 5, 1) = "G"

    Bon courage

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 20
    Points : 12
    Points
    12
    Par défaut Même Prob
    Merci pour indice. Oubli pour retour de valeur :0. J'ai des modifs, nouveau 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
    Function FDie(varExt() As String, varDie() As String) As String
     
    Dim varTampDie(1 To 6) As String
    Dim varTampExt(1 To 6) As String
    varTampDie = varDie
     
    If Mid(varExt, 6, 1) = "0" Then
    FDie = varDie
    Exit Function
     
     
    If Mid(varExt, 6, 1) = "1" Or "2" Or "3" Then
    Mid(varTampDie, 6, 1) = "G"
    End If
     
    FDie = varTampDie
     
    End Function
    Mais toujours même problème en bout de ligne. Serait-ce un problème d'intégrité référentielle? Pourtant mon tableau de relations ne comporte que des liens Un à Plusieurs.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 20
    Points : 12
    Points
    12
    Par défaut Oubli
    Il manque un End If, rajouté ensuite.

  6. #6
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Dans le message rapport d'erreur(s) qu'affiche Access, à la place des ... il y a des chiffres.
    Quels sont-ils ?
    0 signifie pas d'erreur.
    Le problème se situe partout où il y a un nombre>0.
    Ca devrait permettre d'affiner.
    A+

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 20
    Points : 12
    Points
    12
    Par défaut Message complet le 1er juin
    Je vais te transcrire le message complet demain a.m. sans faute, merci pour ton temps. (je voudrais bien le faire de suite, mais ma version à domicile est anglaise).

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 20
    Points : 12
    Points
    12
    Par défaut Message d'erreur complet
    'Microsoft Access a attribué la valeur Null à 33 champ(s) à la suite d'une erreur de conversion de type, 0 enregistrement(s) n'ont pas été ajoutés à la table à la suite de violations de clé, 0 enregistrement(s) à la suite de violations de verrou et 0 enregistrement(s) à la suite de violations des règles de validation. Voulez-vous exécuter toute de même cette requête action?'

    voilà le message d'erreur complet. Il attribue Null aux champs p.c.q. erreur de conversion de type, pourtant tel que dit hier, la valeur retournée par la fonction est un String, et le champ d'accueil est un champ de type texte de la bonne longueur.

  9. #9
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,

    Le problème doit alors se situer au niveau de la requête INSERT.

    Les champs des tables source et destination sont du même type ?
    D'ailleurs, quel le type de [tblFILTRE].[Die] ?
    S'il est numérique, lors de l'appel à la fonction, Access effectue les convertions suivantes :
    Num -> String puis String -> Num
    Quand tu remplaces un chiffre par "G", la convertion String -> Num n'est plus possible.

    Bon courage

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Merci pour l'aide.

    Les champs sont de même type (Texte, Taille du champ:6). Par contre, dans le paramètre varDie([tblFILTRE].[Die]) passé à la fonction, seuls les 5 premiers caractères sont remplis(ex. 4407s_), le dernier est vide. Dernier code sans bogue après compilation:

    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
    Function FDie(varExt() As String, varDie() As String) As Variant
     
    Dim varTampDie(1 To 6) As String
    Dim varTampExt(1 To 6) As String
     
     
    If Mid(varExt, 6, 1) = "0" Then
     
        For intI = 1 To 6
        varTampDie(intI) = varDie(intI)
        Next intI
    FDie = varTampDie
    Exit Function
    End If
     
    If Mid(varExt, 6, 1) = "1" Or "2" Or "3" Then
        For intI = 1 To 6
        varTampDie(intI) = varDie(intI)
        Next intI
     
    varTampDie(6) = "G"
    FDie = varTampDie
     
    End If
    End Function
    J'ai mis FDie en Variant, sans succès.

    Est-ce que je pourrais intégrer une routine Sub() et y mettre le retour de valeur
    FDie = varTampDie ?

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 20
    Points : 12
    Points
    12
    Par défaut Oubli
    J'ai aussi essayé de passer les arguments par valeur:

    Function FDie(ByVal varExt() As String, varDie() As String) As Variant

    Erreur de compilation: l'argument du tableau doit être ByRef. Pourquoi?

  12. #12
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Ce que je te suggererai pour isoler la source du problème, c'est d'essayer ta requête sans appeler la fonction FDie.
    Tu remplace FDie(...) par le champs [Die]. On verra bien si il y a toujours l'erreur.

    Pour la fonction je l'écrirai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function FDie(varExt As String, varDie As String) As String
    Dim varTampDie As String*6
     
    varTampDie = VarDie
     
    Select Case Mid(varExt, 6, 1)
        Case "1", "2", "3"
             Mid(varTampDie, 6, 1) = "G"
    End Select
     
    FDie = varTampDie
     
    End Function
    J'ai un peu de mal à suivre avec les tableaux de caractères.

    Bon courage

  13. #13
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Je viens d'essayer ton code.
    Je n'arrive pas du tout à le faire fonctionner.
    VBA ne peut pas convertir une String en Array.

    Si je l'utilise dans une requête SELECT, j'ai #Erreur dans la colonne.

    Par conséquent je préconise ce code (variante de celui juste avant, mais sans limite à 6 caractères)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function FDie(varExt As String, varDie As String) As String
    Dim varTampDie As String
     
    varTampDie = varDie
     
    Select Case Mid(varExt, 6, 1)
        Case "1", "2", "3"
             If Len(varDie) < 6 Then varTampDie = varDie & String(6 - Len(varDie), " ")
             Mid$(varTampDie, 6, 1) = "G"
    End Select
     
    FDie = varTampDie
     
    End Function
    Bon courage

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Merci pour la fonction.
    Plus de problème de conversion de type. Toutefois, le résultat renvoyé dans le champ de destination est -1, invariablement. À noter, la plupart du temps, l'argument varDie n'est adressé que pour les 4 premiers caractères(ex. 4401__), DES FOIS 5(ex. 4401A_). Avec un 4 caractères, la fonction donnerait, pour varExt ="AS-701": FDie = "4401_G"
    Est-ce que l'espace entre 4401 et G serait à l'origine du problème?
    N.B. Suis québécois, alors: Allez les Bleus!

  15. #15
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Non ça vient de ta requête.
    Je croyais que c'était une erreur de recopie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO tblTRI ( P, S2, NoCV, Extrudeuse, DateFab, RCP, Die )
    SELECT ... FDie([tblFILTRE].[Extrudeuse],[tblFILTRE].[Die])=FDie([tblFILTRE].[Extrudeuse],[tblFILTRE].[Die]) AS Die
    FROM tblFILTRE;
    L'expression en rouge renvoie True (-1)
    C'est comme "A"="A" ou 5=5. C'est toujours vrai.
    Il faut juste mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO tblTRI ( P, S2, NoCV, Extrudeuse, DateFab, RCP, Die )
    SELECT ... FDie([tblFILTRE].[Extrudeuse],[tblFILTRE].[Die]) AS Die
    FROM tblFILTRE;
    Je crois que ça devrait fonctionner maintenant

    La fièvre du foot commence à monter dans l'entreprise où je travaille.
    Espèrons que les bleus ferront mieux qu'il y a quatre ans.

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 20
    Points : 12
    Points
    12
    Par défaut Bingo
    Merci Led!
    Suis tellement euphorique, si j'avais une soeur, te la présenterais, ouïda, je dis.
    Tout est ok dans ma table destination. Hombre, c'est dans le cadre d'un stage, et je n'avais JAMAIS codé en VBA avant de commencer ici (j'ai un peu euh... amplifié mes talents de programmeur ). Tu viens d'allonger ma vie active de qq semaines! À donf la France 'stie, et que l'Italie soit sortie en première ronde (c'est tout ce qu'ils méritent).

  17. #17
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Content de t'avoir dépanné cousin québécoi.
    De plus ta joie fait plaisir à voir.

    A un de ces jours.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 08/02/2013, 13h35
  2. Réponses: 4
    Dernier message: 26/06/2008, 18h15
  3. Réponses: 4
    Dernier message: 27/05/2007, 11h11

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