C’est précisément ce que je disais
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…
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)
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.
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
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 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 !
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:
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??
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 !
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