Modification d'un champ d'une table Access via VBA

C’est précisément ce que je disais :wink:
Et je ne veux ni me battre ni vexer personne, plus on est de fous plus on ris (et moins y a de riz, mais bon, j’ai déjà mangé :paf:)

Il faut soit “jouer” avec On Error Resume Next, soit faire un copier/coller d’une de mes deux focntions ci-dessus…


(La fonction FieldExists, donc)

jray, je ne voulais pas te vexer donc j’ai essayer tes fonctions mé tj pb!! si tu ve je ressaye mé ca sera tj pareil a mon avi (me demande po pk cr je sé po!!mdr)

Il ne serait pas là, le problème ?

Ah, j’ai cru que tu parlais de la fonction de gcc :paf:. Je regarde mieux, alors (mais j’ai tesé chez moi et si le champ existe ça marche et s’il n’existe pas ça marche aussi).

PS: il faut renommer ma fonction FieldExists en FieldExist ou modifier ton code sinon ça va pas marcher

Ne t’en fais pas, on ne se battra pas ; c’est toujours intéressant de voir comment quelqu’un d’autre aborderait le même problème.
Et puis au final ça te donne le choix.

peut ête kil es la, mé ke ve tu ke ji fasse cr la jvoi po du tt??

(tkt jray j’ai essayé ta fonction en changeant tout mé rien ne ve ou alor jme sui encor gourré!!lol)

Heu faut pas prendre trop d’initiatives !! :paf:

Si le code que tu utilises est comme la page précédente, ça va pas aller !

Ca ne suffit pas:

Public Function FieldExist(NomDuChamp As String) As Boolean
On Error Resume Next
FieldExist = (CurrentDb.TableDefs(MaTable).Fields(LeChampCherche).Name = Nom_du_champ_recherché)
CurrentDb.Close
End Function

Il faut le tout:


Public Function FieldExists(strTableName As String, strFieldName As String) As Boolean 

 'Si le champ n'existe pas, cette fonction retourne une erreur 
 On Error GoTo Erreur 
 Dim strTest As String 
 strTest = CurrentDb.TableDefs(strTableName).Fields(strFieldName).Name 
 On Error GoTo 0 
  
 'Pas d'erreur => le champ existe 
 FieldExists = True 
 Exit Function 
  
Erreur: 
 'Erreur => le champ n'existe pas 
 FieldExists = False 

End Function 


Ou alors, si je fais le boulot à ta place :paf:, ça donne quelque chose comme ça:

Private Sub Table_IPMS_Bpss_Click()
On Error goto Err_Table_IPMS_Bpss_Click

If FieldExist("DATE_DER_MAJ1") Then
  MsgBox ("le champ DATE_DER_MAJ1 existe")
  DoCmd.RunSQL "ALTER TABLE Ipms_icxs_pves_epms_iens_ha_naz DROP COLUMN [DATE_DER_MAJ1];"
  MsgBox ("la table est supprimée")
End If
DoCmd.RunSQL "ALTER TABLE Ipms_icxs_pves_epms_iens_ha_naz DROP COLUMN [DATE_DER_MAJ1];"
MsgBox ("le champ est créé")

Exit_Table_IPMS_Bpss_Click:
Exit Sub

Err_Table_IPMS_Bpss_Click:
MsgBox err.Description
Resume Exit_Table_IPMS_Bpss_Click
End Sub


Public Function FieldExist(strTableName As String, strFieldName As String) As Boolean

    'Si le champ n'existe pas, cette fonction retourne une erreur
    On Error GoTo Erreur
    Dim strTest As String
    strTest = CurrentDb.TableDefs(strTableName).Fields(strFieldName).Name
    On Error GoTo 0
    
    'Pas d'erreur => le champ existe
    FieldExist = True
    Exit Function
    
Erreur:
    'Erreur => le champ n'existe pas
    FieldExist = False

End Function

Le but de l’opération, c’est de tester l’existence d’un champ, champ dont tu passes le nom en argument (NomDuChamp as String)
Donc c’est cette nouvelle variable que tu vas utiliser comme paramètre dans le corps de la fonction :
FieldExist = (CurrentDb.TableDefs(MaTable).Fields(NomDuChamp).Name = NomDuChamp)

Pendant qu’on y est, il faudrait faire pareil avec le nom de la table, pour que ta fonction soit vraiment portable :
Au final :

Public Function FieldExist(NomDeLaTable as String, NomDuChamp As String) As Boolean
    On Error Resume Next
    FieldExist = (CurrentDb.TableDefs(NomDeLaTable).Fields(NomDuChamp ).Name = NomDuChamp )
    CurrentDb.Close
End Function

Edité le 13/06/2007 à 14:24

Oups, à part les délires avec “” du forum Clubic.

Autre remarque: évite d’écrire les noms des tables et des champs en toutes lettres dans tes commandes SQL.
OK c’est plus clair, mais pas très souple.

Je te conseille d’utiliser des variables, ainsi ce sera plus facile d’utiliser ton code avec d’autres noms, dans d’autres conditions, ou alors de faire des copier/coller.

Et j’ai encore oublié de corriger quelque chose:
Ma fonction FieldExist demande le nom du champ et le nom de la table

donc:
FieldExist(“Ipms_icxs_pves_epms_iens_ha_naz”, “DATE_DER_MAJ1”)

Donc tu aurais du avoir d’autres erreurs, fait attention de ne pas garder plusieurs fonctions FieldExist ou FieldExists dans ton code, parce que sinon ça va devenir le bordel !

vous savez k’avec vos 2 facon, ca me perturbe plus kotre chose??!! ben mtn vs le savez!!mdr!!

bon j’ai essayé ce ke tu ma mi jray mé dsl ca fct po, ca me dit :

Microsoft Visual Basic

Erreur de compilation:

Argument non facultatif

OK Help

ensuite, gcc je vé essayé ton truc en reprenant le code davt bien entendu!!lol

C’est ce que je préconisais dans mon exemple, du coup faut adapter le code, voir mon message ci-dessus ^:jap:


[quote="loic20h28"] Erreur de compilation: Argument non facultatif [/quote]

Oui c’est ce que je viens de dire plus haut et ce qu’à proposé gcc: il y a deux variables: le nom du champ mais aussi le nom de la table, pour FileExist.
Le débogueur doit d’ailleurs te mettre en évidence où ça coince:

FieldExist(“Ipms_icxs_pves_epms_iens_ha_naz”, “DATE_DER_MAJ1”)

ok jray, donc je devré mettre des variable à la place du nom de la table, C ca??

Oui, quand tu auras résolu les autres problèmes et que tu vaudras faire quelque chose de joli et flexible :paf: :icon_biggrin:

Private Sub Table_IPMS_Bpss_Click()
On Error GoTo Err_Table_IPMS_Bpss_Click

Dim NomDeLaTable As String
Dim NomDuChamp As String

NomDeLaTable = “Ipms_icxs_pves_epms_iens_ha_naz”
NomDuChamp = “DATE_DER_MAJ1”

If FieldExist(NomDeLaTable, NomDuChamp) Then
MsgBox (“le champ DATE_DER_MAJ1 existe”)
DoCmd.RunSQL “ALTER TABLE NomDeLaTable DROP COLUMN [ NomDuChamp ];”
MsgBox (“la table est supprimée”)
End If
DoCmd.RunSQL “ALTER TABLE NomDeLaTable ADD COLUMN [ NomDuChamp ];”
MsgBox (“le champ est créé”)

Exit_Table_IPMS_Bpss_Click:
Exit Sub

Err_Table_IPMS_Bpss_Click:
MsgBox err.Description
Resume Exit_Table_IPMS_Bpss_Click
End Sub

Public Function FieldExist(NomDeLaTable As String, NomDuChamp As String) As Boolean
On Error Resume Next
FieldExist = (CurrentDb.TableDefs(NomDeLaTable).Fields(NomDuChamp).Name = NomDuChamp)
CurrentDb.Close
End Function
voila mon code actuelle, ky a til a modifier?? es-ce bon mes variables??

Nan, pas tout à fait ! Tu peux pas écrire les variables dans la commande SQL comme ça

Private Sub Table_IPMS_Bpss_Click()
On Error GoTo Err_Table_IPMS_Bpss_Click

Dim NomDeLaTable As String
Dim NomDuChamp As String

NomDeLaTable = “Ipms_icxs_pves_epms_iens_ha_naz”
NomDuChamp = “DATE_DER_MAJ1”

If FieldExist(NomDeLaTable, NomDuChamp) Then
MsgBox (“le champ " & NomDuChamp & " existe”)
DoCmd.RunSQL “ALTER TABLE " & NomDeLaTable & " DROP COLUMN [" & NomDuChamp & "];”
MsgBox (“la table est supprimée”)
End If
DoCmd.RunSQL “ALTER TABLE " & NomDeLaTable & " ADD COLUMN [" & NomDuChamp & "];”
MsgBox (“le champ est créé”)

Exit_Table_IPMS_Bpss_Click:
Exit Sub

Err_Table_IPMS_Bpss_Click:
MsgBox err.Description
Resume Exit_Table_IPMS_Bpss_Click
End Sub

Public Function FieldExist(NomDeLaTable As String, NomDuChamp As String) As Boolean
On Error Resume Next
FieldExist = (CurrentDb.TableDefs(NomDeLaTable).Fields(NomDuChamp).Name = NomDuChamp)
‘’’’’’’’’’’’’’'CurrentDb.Close ’ Rien à faire ici !
On Error goto 0 'Plus propre et pour éviter des ennuis avec du code imbriqué (appel de fonction depuis des autres fonctions)
End Function

Là ça devrait être bon si j’ai pas fait de faute de frappe !

Là tu es en train de te savonner la planche …

Edit :
jray : on a vu les mêmes choses, donc ça doit être bon
loic20h28 : dans le même ordre d’idée, et juste pour un peu plus de facilité à suivre le déroulement du programme à l’exécution
MsgBox (“la table " & NomDeLaTable & "est supprimée”)
MsgBox (“le champ "& NomDuChamp & "est créé”)

Ceci dit, je ne crois pas que la commande supprime la table, mais plutôt un champ de la table
Edité le 13/06/2007 à 14:53

lol!!
bon j’ai mi les variable et j’ai tj un pb ki es :

Microsoft Office Access

Syntax error in field definition.

OK

résolou-lon trankilement et sans se savonner l’esprit!!mdr

Et puis une fois que tout est ok tu fais comme ça:

Private Sub Table_IPMS_Bpss_Click()
On Error GoTo Err_Table_IPMS_Bpss_Click

if AjouterChampATable(“Ipms_icxs_pves_epms_iens_ha_naz”, “DATE_DER_MAJ1”) = true then
'Tout s’est passé correctement
else
'Il y a eu une erreur
end if

End Sub

Public Function AjouterChampATable(NomDeLaTable as string, NomDuChamp as string)

On Error GoTo Err_AjouterChampATable

If FieldExist(NomDeLaTable, NomDuChamp) Then
DoCmd.RunSQL “ALTER TABLE " & NomDeLaTable & " DROP COLUMN [” & NomDuChamp & “];”
End If
DoCmd.RunSQL “ALTER TABLE " & NomDeLaTable & " ADD COLUMN [” & NomDuChamp & “];”

Exit_AjouterChampATable:
AjouterChampATable = true
Exit Sub

Err_AjouterChampATable:
MsgBox err.Description
AjouterChampATable = false
End Sub

Public Function FieldExist … (inchangé)


Comme ça, tout n'est pas OK ??? :ane:

Restons calme…

ben ya encor un pb, qui es :

Microsoft Visual Basic

Erreur de compilation:

Étiquette non définie

OK Help


et ca me met en jaune : Private Sub Table_IPMS_Bpss_Click() et ca prend la ligne du dessous aussi!!

C’est là que ça va pas:

DoCmd.RunSQL “ALTER TABLE " & NomDeLaTable & " ADD COLUMN [” & NomDuChamp & “];”

Avec ADD COLUMN il faut indiquer le type du champ et sa taille.

Par exemple
DoCmd.RunSQL “ALTER TABLE " & NomDeLaTable & " ADD COLUMN [” & NomDuChamp & “] TEXT(20);”
pour un champ texte de 20 caractères