Affecter une valeur en fonction d'un champ d'une table

ludobalu Messages postés 276 Date d'inscription   Statut Membre Dernière intervention   -  
Heliotte Messages postés 1491 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'ai récemment appris le Visual Basic mais maintenant que je l'utilise avec Access j'ai quelques problèmes, notamment que le je veux indiquer des champs dans des tables etc... car ce n'est pas pareil qu'avec Excel, j'ai un peu de mal. J'espère donc que vous me pardonnerez si jamais vous trouviez mes erreurs grossières.

Avant de vous expliquer mon problème, je vais vous expliquer ce compte réaliser :

Je possède une table nommée "t_Card" dans laquelle je possède une colonne nommée "i_Card" (qui correspond à la clé primaire de cette table).
Je possède une seconde table nommée "t_Channel" dans laquelle je possède encore cette colonne "i_Card", ce sont deux tables liées, à chaque valeur de i_Card dans la table t_Card, correspond un ou plusieurs enregistrement de la table t_Channel.

J'aimerais pouvoir compter le nombre d'enregistrements non vides de la table t_Channel pour chaque valeur de i_Card de la table t_Card et ensuite affecter ce nombre dans une nouvelle colonne de la table t_Card pour chaque enregistrement.

(Désolé si je m'explique mal, mais je en gros je souhaiterais afficher pour tous les enregistrements de la table t_Card, le nombre de d'enregistrements non vides qui leurs corresponds par rapport à la table t_Channel)

Voici le code que j'ai pour l'instant réalisé :


Sub essai()
    'Pour chaque enregistrement de la table t_card, i prend la valeur de i_card de la table t_card et
    'affecte la variable nbre_channels_occupes dans le champ channels_occupes de la table t_card
    
    For Each Card In t_Card
        i = i_Card.Value
        'Compte le nombre total de channels dans la table t_Channel pour t_card.i_card=t_channel.i_card
        nbre_total_channels = DCount("[i_Channel]", "t_Channel", "[i_Card] ='& i&'")
        'Compte le nombre de channels non occupés dans la table t_Channel pour t_card.i_card=t_channel.i_card
        nbre_channels_vides = DCount("[i_Channel]", "t_Channel", "IsNull([i_Signal_input])")
        'Calcule le nombre de channels occupés dans la table t_Channel pour t_card.i_card=t_channel.i_card
        nbre_channels_occupes = nbre_total_channels - nbre_channels_vides
        'Pour chaque valeur de i_Card de la table t_Card, le champ Total_Channels prend la valeur de la variable nbre_channels_occupes
        If t_Card.i_Card = i Then
            t_Card.Total_Channels = nbre_channels_occupes
        End If
    Next

End Sub



Voici l'erreur que j'obtiens, pour le For :
Incompatibilité de type


Malheureusement je ne vois pas trop à quoi correspond réellement cette erreur, pourriez-vous m'aider ?

Je vous remercie d'avance,


6 réponses

ludobalu Messages postés 276 Date d'inscription   Statut Membre Dernière intervention   6
 
EDIT-1 : Je cherche énormément pour essayer d'améliorer ce code, j'ai changé le For Each (après avoir initialiser la variable Card en tant qu'objet), voilà ce que j'ai mis maintenant :


Dim Card As Object
For Each Card In CurrentDb().TableDefs("t_Card")


Et j'ai un nouveau message que voici :

Opération non autorisée pour ce type d'objet.
0
Heliotte Messages postés 1491 Date d'inscription   Statut Membre Dernière intervention   92
 
Bonjour ludobalu,
Une bonne pratique en Visual Basic est de mettre "Option Explicit" en haut de chaque feuille ou module, de cette façon, tes variables doivent toujours être déclarée, et pour ne rien gâcher, on sait ce que l'on met dedans !!
Travailles-tu avec SQL ou MySQL ?
Tu peux m'expliquer
- "DCount("[i_Channel]", "t_Channel", "[i_Card] ='& i&'")" et
- "DCount("[i_Channel]", "t_Channel", "IsNull([i_Signal_input])")"
Je veux dire, tu ne peux pas faire ta sélection en concaténant les deux, style :
Je veux que tu me compte le nombre d'occurence correspondant à "i_Card".i dont le champ "machin" n'est pas vide ?
0
ludobalu Messages postés 276 Date d'inscription   Statut Membre Dernière intervention   6
 
Bonjour,
Tout d'abord merci pour ta réponse, oui "Option Explicit" est une bonne habitude à prendre que je n'ai pas encore assimilée désolé.
Je travaille avec SQL.

Non, j'ai cherché mais je n'ai pas trouvé de fonction tel que IsEmpty ou IsNull qui correspondrait à "n'est pas vide" ou "n'est pas nul".
0
ludobalu Messages postés 276 Date d'inscription   Statut Membre Dernière intervention   6
 
EDIT-2 :

En cherchant encore, j'ai réussi à arriver à ce résultat en essayant de comprendre comment fonctionne le VB sous Access :


Sub essai()
Dim Card As Object
Dim t_Card As DAO.TableDef
Dim db As DAO.Database
Set db = CurrentDb
Set t_Card = db.TableDefs("t_Card")

For Each Card In t_Card
'Pour chaque enregistrement de la table t_card, i prend la valeur de i_card de la table t_card et
'affecte la variable nbre_channels_occupes dans le champ channels_occupes de la table t_card
i = i_Card.Value
'Compte le nombre total de channels dans la table t_Channel pour t_card.i_card=t_channel.i_card
nbre_total_channels = DCount("[i_Channel]", "t_Channel", "[i_Card] ='& i&'")
'Compte le nombre de channels non occupés dans la table t_Channel pour t_card.i_card=t_channel.i_card
nbre_channels_vides = DCount("[i_Channel]", "t_Channel", "IsNull([i_Signal_input])")
'Calcule le nombre de channels occupés dans la table t_Channel pour t_card.i_card=t_channel.i_card
nbre_channels_occupes = nbre_total_channels - nbre_channels_vides
'Pour chaque valeur de i_Card de la table t_Card, le champ Total_Channels prend la valeur de la variable nbre_channels_occupes
If t_Card.i_Card = i Then
t_Card.Total_Channels = nbre_channels_occupes
End If
Next Card

End Sub


Maintenant l'erreur se situe au niveau du If à la fin du code, il me disent que les données sont introuvables pour le "t_Card.i_Card", sauriez vous comment indiquer en VBA que je souhaite que le champ "i_Card" de ma table "t_Card" soit égal à ma variable i ? Merci.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ludobalu Messages postés 276 Date d'inscription   Statut Membre Dernière intervention   6
 
Edit-4 :

Voici où j'en suis arrivé, je crois que j'ai réussi à situer comment indiquer les tables et les champs, voici mon code :

Sub essai()
Dim Card As Object
Dim t_Card As DAO.TableDef
Dim db As DAO.Database
Set db = CurrentDb
Set t_Card = db.TableDefs("t_Card")

For Each Card In t_Card
'Pour chaque enregistrement de la table t_card, i prend la valeur de i_card de la table t_card et
'affecte la variable nbre_channels_occupes dans le champ channels_occupes de la table t_card
i = i_Card.Value
'Compte le nombre total de channels dans la table t_Channel pour t_card.i_card=t_channel.i_card
nbre_total_channels = DCount("[i_Channel]", "t_Channel", "[i_Card] ='& i&'")
'Compte le nombre de channels non occupés dans la table t_Channel pour t_card.i_card=t_channel.i_card
nbre_channels_vides = DCount("[i_Channel]", "t_Channel", "IsNull([i_Signal_input])")
'Calcule le nombre de channels occupés dans la table t_Channel pour t_card.i_card=t_channel.i_card
nbre_channels_occupes = nbre_total_channels - nbre_channels_vides
'Pour chaque valeur de i_Card de la table t_Card, le champ Total_Channels prend la valeur de la variable nbre_channels_occupes
If t_Card.Fields("i_Card") = i Then
t_Card.Fields("Total_Channels") = nbre_channels_occupes
End If
Next Card

End Sub

Le message se trouve au niveau du "For Each...", voici l'erreur que j'obtiens :

Opération non autorisée pour ce type d'objet.


Pourriez-vous m'indiquer un élément de réponse ? Merci beaucoup !
0
Heliotte Messages postés 1491 Date d'inscription   Statut Membre Dernière intervention   92
 
Bonjour ludobalu,
Je vois que tu travaille avec "DAO" qui, je crois, n'est plus supporté.
Le but est de faire avancer le smilblick, je vais essayer de comprendre car je ne suis pas très doué en ce qui concerne DAO et Cie
Donc:
- Card As Object --> Card est un Object
- t_Card As DAO.TableDef --> une définition de table ?
. Pourquoi t_Card, qui est une table, devrait recevoir les propriétés d'une table ?
0