Merci pour cette réponse.
Partons du principe que je souhaite absolument utiliser l'événement After pour procéder à la mise à jour de ma date. (la solution de la valeur par défaut ne convient pas si on veut modifier la date de modification "After Update")
La solution que vous avez envoyée
Code:
1 2
| <?xml version="1.0" encoding="UTF-16" standalone="no"?>
<DataMacros xmlns="http://schemas.microsoft.com/office/accessservices/2009/04/application"><DataMacro Event="AfterInsert"><Statements><EditRecord><Data/><Statements><Action Name="SetField"><Argument Name="Field">testmodif</Argument><Argument Name="Value">Now()</Argument></Action></Statements></EditRecord></Statements></DataMacro></DataMacros> |
ne fait aucune mise à jour. Si j'y ajoute au préalable un lookUp, alors celà met à jour mais toujours uniquement le premier enregistrement.
Pour essayer de comprendre pourquoi il ne modifie que le premier enregistrement, j'ai rajouté un quatrième champ dans ma table testTbl qui devient:
Citation:
testID Number
testNom Text
testModif Date/Time
testIdChange Number
ce champ testIdChange contiendra l'identifiant de la ligne que j'ai mis à jour.
dans mon exemple, j'ai au départ
Citation:
1 toto Null 0
2 tutu Null 0
si je change dans le deuxième enregistrement tutu en tututu, je voudrais que la date/heure soit mise à jour et que le testIdChange contienne le testID de l'enregistrement modifié. Donc:
Citation:
1 toto Null 0
2 tututu 7/10/2010 2
Mais j'obtiens:
Citation:
1 toto 7/10/2010 1
2 tututu Null 0
Donc deux problèmes, c'est le premier enregistrement qui est modifié, et mon identifiant stocké dans testIdChange est 1 à la place de deux.
Pour en arriver là, j'ai créé une "Named Macro" qui s'appelle "testModif":
Code:
1 2
| <?xml version="1.0" encoding="UTF-16" standalone="no"?>
<DataMacros xmlns="http://schemas.microsoft.com/office/accessservices/2009/11/application"><DataMacro Name="testModif"><Parameters><Parameter Name="parTestID" Description="id test"/></Parameters><Statements><LookUpRecord><Data><Reference>testTbl</Reference><WhereCondition>[testTbl].[testID]=[partestID]</WhereCondition></Data><Statements><EditRecord><Data/><Statements><Action Collapsed="true" Name="SetField"><Argument Name="Field">testTbl.testIdChange</Argument><Argument Name="Value">[partestID]</Argument></Action><Action Collapsed="true" Name="SetField"><Argument Name="Field">testTbl.testModif</Argument><Argument Name="Value">Now()</Argument></Action></Statements></EditRecord></Statements></LookUpRecord></Statements></DataMacro></DataMacros> |
et en plus clair, c'est une macro qui crée un paramètre "parTestID" qui représentera l'identifiant de l'enregistrement sur lequel je suis positionné dans testTbl
qui fait un look Up dans testTbl ou mon testID est égal à mon paramètre
Une fois l'enregistrement trouvé,
met mon paramètre dans le champ testIdChange
met Now dans testModif
J'appelle cette Named Macro dans l'événement after Update de ma table test par:
Code:
1 2
| <?xml version="1.0" encoding="UTF-16" standalone="no"?>
<DataMacros xmlns="http://schemas.microsoft.com/office/accessservices/2009/11/application"><DataMacro Event="AfterUpdate"><Statements><Action Name="RunDataMacro"><Argument Name="MacroName">testTbl.testModif</Argument><Parameters><Parameter Name="partestID" Value="[testID]"/></Parameters></Action></Statements></DataMacro></DataMacros> |
en gros, je lance ma named macro "testModif" avec comme paramètre "testID" qui est l'identifiant de l'enregistrement qui a été mis à jour.
Je peux comprendre que comme dans un "after update" je lui demande de modifier l'enregistrement en cours, il relance l'after update de manière récursive, il faut modifier l'appel pour qu'il ne lance la named macro que quand je modifie "testNom". J'ajoute donc un:
If Updated("testNom") Then......end If
Ce qui donne:
Code:
1 2
| <?xml version="1.0" encoding="UTF-16" standalone="no"?>
<DataMacros xmlns="http://schemas.microsoft.com/office/accessservices/2009/11/application"><DataMacro Event="AfterUpdate"><Statements><ConditionalBlock><If><Condition>Updated("testNom")</Condition><Statements><Action Name="RunDataMacro"><Argument Name="MacroName">testTbl.testModif</Argument><Parameters><Parameter Name="partestID" Value="[testID]"/></Parameters></Action></Statements></If></ConditionalBlock></Statements></DataMacro></DataMacros> |
Avec l'ajout du if, j'obtiens maintenant:
Citation:
1 toto 7/10/2010 2
2 tututu Null 0
et 2 dans testIdChange , c'est bien la preuve que mon paramètre correspond bien à mon deuxième enregistrement .
Pourquoi le lookUp et l'edit se produisent sur le premier ??