2009-07-17 7 views
0

Salut et merci pour votre aide,Comment mettre à jour un champ d'accès avec la date à chaque fois qu'une modification est apportée à sa ligne?

Note: J'utilise Access 2002

Je suis en train de mettre à jour mon champ « LastUpdatedDate » avec le timbre de date/heure NOW() s'il y a un changement sur son rangée.

En ce moment, j'ai suivi les instructions que Doanair a donné un autre gars essayant de comprendre cela:

DATETIME to the table e.g. named LastUpdatedDate that indicates the last updated date/time of each row. Make it NOT NULL so that you will have to write an updated DATETIME value to that column for each INSERT or UPDATE. Also, set the column to have a default of DATE() for the current date stamp or NOW() for the current date/time stamp.

Malheureusement, il ne change toujours pas le champ si quelque chose a changé sur la ligne. Il a mentionné que je devrais:

Then add a Validation Rule or CHECK constraint e.g. CHECK (LastUpdatedDate = NOW()) to ensure the column is actually updated on each UPDATE and INSERT.

Mais il n'y a pas une fonction de contrôle dans Access XP que je connaisse.

Des idées de gars/filles?

Merci, Est-ce que

Répondre

0

D'après ce que je comprends, vous devrez définir explicitement la valeur du champ LastUpdated à NOW(). Il ne le fera pas automatiquement à la mise à jour.

Vous pouvez définir le champ DefaultUp of LastUpdated sur NOW() - qui devrait prendre en charge les INSERT.

+0

Oui, il fonctionne actuellement avec des insertions, mais pas avec des mises à jour - J'ai besoin de connaître la date/heure de mise à jour d'une ligne - J'ai un champ sur un rapport qui tire le maximum du champ dernière fois que la table a été mise à jour. –

+0

Si les lignes sont en cours d'édition dans un formulaire, vous pouvez utiliser l'événement OnDirty du formulaire ou l'événement Changed de chaque champ, mais c'est assez compliqué. – dsteele

+0

Ce code provient de ce post: http://stackoverflow.com/questions/926897/detect-time-of-last-change-on-a-microsoft-access-database-table –

0

Je suppose que la table est stockée dans un fichier MDB, c'est-à-dire l'accès natif pas dans SQL Server?

S'il s'agit de SQL Server, vous pouvez créer un déclencheur de mise à jour - aucune option de ce type dans les tables d'accès (ou le moteur de base de données Jet). Cela signifie que vous avez la possibilité de définir la valeur partout où les enregistrements sont mis à jour dans les événements de formulaire côté client.

par exemple.

Private Sub Form_BeforeUpdate(Cancel As Integer) 
    Me.txtLastUpdated = Now() 
End Sub 

Où Me.txtLastUpdated est le nom d'un contrôle de zone de texte.

Remarque Une contrainte de vérification ne définit pas de valeur - elle empêche simplement la mise à jour de la ligne si la vérification échoue.

+0

Il provient d'une base de données Native Access, mais il n'est pas modifié à partir d'un formulaire. –

+0

Vous pouvez également utiliser une contrainte CHECK dans SQL Server, en utilisant la même syntaxe que ma réponse à ce thread, mais mieux utiliser une contrainte CHECK au niveau de la colonne dans SQL Server - pour le moteur de base de données Access, les contraintes CHECK niveau. Cependant, je suis d'accord si le moteur de données était SQL Server, puis utiliser un déclencheur pour maintenir la valeur de la colonne serait bon. – onedaywhen

0

Merci pour votre aide. J'ai décidé de mettre un champ de texte sur mon rapport avec = now() et de leur envoyer un pdf de ce rapport. Adobe 1 Tech Guy 0

Will

+0

Je vous recommande vivement de placer vos contraintes d'intégrité des données aussi près que possible des données, c'est-à-dire des contraintes de table telles que CHECK ou des règles de validation plutôt que de créer ou de signaler des champs de texte ou VBA. – onedaywhen

1

L'équipe d'accès n'a pas encore eu le temps de fournir un moyen de créer une contrainte CHECK en utilisant l'interface Access ou DAO pour cette question (ici espère pour Access2010!)

Vous devez créer la contrainte CHECK en utilisant SQL DDL par exemple

ALTER TABLE MyTable ADD 
    CONSTRAINT LastUpdatedDate__must_be_current_timestamp 
     CHECK (LastUpdatedDate = NOW()) 

Pour exécuter ce qui précède, vous devez utiliser ANSI-92 Query Mode.

Notez que vous pouvez également créer une ligne de niveau règle de validation à l'aide du concepteur de table dans l'interface graphique d'accès:

LastUpdatedDate = NOW() 

Juste pour clarifier: une règle de validation au niveau de la ligne est définie dans l'interface utilisateur d'accès à de la table Propriétés; Dans le code ADOX, il est appelé de manière confuse une règle de validation de table (pas sûr de ce qu'il est dans DAO ou ACEDAO). Il tirera à chaque fois qu'une rangée est UPDATE d. Comme vous ne pouvez définir qu'une règle de validation au niveau de la ligne par table, il vaut mieux utiliser une contrainte CHECK au niveau de la table, qui est vérifiée pour chaque ligne du tableau lorsqu'une ou plusieurs lignes sont UPDATE d. Vous pouvez définir plusieurs contraintes CHECK par table et leur donner des noms significatifs (LastUpdatedDate__must_be_current_timestamp, LastUpdatedDate__must_be_during_office_hours, etc.) vous serez en mesure de fournir un feed-back utilisateur avec plus de granularité que les règles de validation.

+0

Cela n'a aucun effet car il ne se déclenche pas à chaque fois que l'enregistrement est modifié.Vous voudriez aussi le rendre non-Nullable, non? –

+0

Comme indiqué dans la question, "Make it NOT NULL de sorte que vous devrez écrire une valeur DATETIME mise à jour à cette colonne pour chaque INSERT ou UPDATE". – onedaywhen

0

Je ne vois pas que quelqu'un ait donné une réponse très claire ici.

Jet/ACE n'a pas de déclencheurs, il n'y a donc aucun moyen de définir au niveau de la table un champ qui sera mis à jour chaque fois que l'enregistrement est mis à jour. Au lieu de cela, vous devez le faire avec les événements des formulaires d'accès. L'événement correct du formulaire pour ceci est l'événement BeforeUpdate, où vous devez simplement définir LastUpdatedDate égal à Now(). Vous avez déjà défini la valeur par défaut sur Now(), ce qui n'est pas grave pour autant que cela se produise, mais comme vous l'avez dit, cela ne remplit le champ que lorsque l'enregistrement est inséré.

Un problème que vous devez prendre en compte est que pour les nouvelles insertions, Now() en tant que valeur par défaut va vous donner la date/heure de initié l'insertion d'enregistrement. C'est-à-dire que vous pourriez démarrer le nouvel enregistrement, LastUpdatedDate serait réglé sur la date/heure actuelle, et si vous partez pendant cinq heures et que vous sauvegardez l'enregistrement, l'heure sera dépassée de 5 heures. Ainsi, il peut ne pas être utile d'avoir la valeur par défaut définie sur Now() - vous pouvez vraiment être sûr que vous obtenez la bonne valeur en utilisant l'événement BeforeUpdate du formulaire que vous utilisez pour le modifier.

Questions connexes