OVH Cloud OVH Cloud

Access ADP et trigger SQL Server

7 réponses
Avatar
VUILLERMET Jacques
Une application fonctionne avec un client Access (ADP) et une base SQL
Server.

Elle fonctionne bien, et possède un formulaire ayant comme source une table.

Mais quand je spécifie un trigger (INSERT, UPDATE) sur cette table (qui la
modifie, code après la signature) alors Access est perdu : message d'erreur
"Conflit d'écriture - Cet enregistrement a été modifié par un autre
utilisateur... [Sauvegarder enregistrement] [Copier dans le Presse-papiers]
[Annuler]".

Le trigger fonctionne bien avec un autre client que Access (l'Analyseur de
requêtes par exemple).

Est-il possible d'utiliser Access (ADP) avec une base possédant des triggers
?

Jacques.

***********************************************
CREATE TRIGGER trg_AvoidNullInNb ON [dbo].[MvtColis]
FOR INSERT, UPDATE
AS

UPDATE Mvtcolis
SET NbPal = 0
WHERE NbPal is null

UPDATE Mvtcolis
SET NbColis = 0
WHERE NbColis is null

UPDATE Mvtcolis
SET NbPlis = 0
WHERE NbPlis is null

UPDATE Mvtcolis
SET NbPiece = 0
WHERE NbPiece is null

/* Fin.*/

7 réponses

Avatar
J-Pierre
Bonjour,

Si je peux me permettre en le disant gentiment, ton trigger pourrait être amélioré, là tu fais du balayage de tables....c'est sans
doute ça la source du problème.

La solution la plus simple, ça te fera d'excellents exemples, tu utilises l'assistant pour ne convertir que les tables d'un .MDB
vers un .ADP.

J-Pierre

"VUILLERMET Jacques" a écrit dans le message de news:

Une application fonctionne avec un client Access (ADP) et une base SQL
Server.

Elle fonctionne bien, et possède un formulaire ayant comme source une table.

Mais quand je spécifie un trigger (INSERT, UPDATE) sur cette table (qui la
modifie, code après la signature) alors Access est perdu : message d'erreur
"Conflit d'écriture - Cet enregistrement a été modifié par un autre
utilisateur... [Sauvegarder enregistrement] [Copier dans le Presse-papiers]
[Annuler]".

Le trigger fonctionne bien avec un autre client que Access (l'Analyseur de
requêtes par exemple).

Est-il possible d'utiliser Access (ADP) avec une base possédant des triggers
?

Jacques.

***********************************************
CREATE TRIGGER trg_AvoidNullInNb ON [dbo].[MvtColis]
FOR INSERT, UPDATE
AS

UPDATE Mvtcolis
SET NbPal = 0
WHERE NbPal is null

UPDATE Mvtcolis
SET NbColis = 0
WHERE NbColis is null

UPDATE Mvtcolis
SET NbPlis = 0
WHERE NbPlis is null

UPDATE Mvtcolis
SET NbPiece = 0
WHERE NbPiece is null

/* Fin.*/




Avatar
VUILLERMET Jacques
Bonjour Jean-Pierre,

Si je peux me permettre en le disant gentiment,


Vas-y franco !

ton trigger pourrait être amélioré, là tu fais du balayage de tables....


Pour l'instant, je ne recherche pas la performance (je pourrai faire un
jointure avec la table inserted pour limiter les enregistrements impactés,
...), mon trigger est en version 0.0.1.

c'est sans doute ça la source du problème.


Acces ne se plaint du problème que sur un seul enregistrement ; non ?

La solution la plus simple, ça te fera d'excellents exemples, tu utilises


l'assistant pour ne convertir que les tables d'un .MDB
vers un .ADP.


Sachant que je pars d'une application ADP existante qui utilise une base SQL
Server existante, je ne comprend pas ce que viens faire ici un fichier
MDB... ?
Explique-moi.

Jacques.

"J-Pierre" a écrit dans le message de
news: u#CWa#
Bonjour,

Si je peux me permettre en le disant gentiment, ton trigger pourrait être


amélioré, là tu fais du balayage de tables....c'est sans
doute ça la source du problème.

La solution la plus simple, ça te fera d'excellents exemples, tu utilises


l'assistant pour ne convertir que les tables d'un .MDB
vers un .ADP.

J-Pierre

"VUILLERMET Jacques" a écrit dans le message de


news:
>
> Une application fonctionne avec un client Access (ADP) et une base SQL
> Server.
>
> Elle fonctionne bien, et possède un formulaire ayant comme source une


table.
>
> Mais quand je spécifie un trigger (INSERT, UPDATE) sur cette table (qui


la
> modifie, code après la signature) alors Access est perdu : message


d'erreur
> "Conflit d'écriture - Cet enregistrement a été modifié par un autre
> utilisateur... [Sauvegarder enregistrement] [Copier dans le


Presse-papiers]
> [Annuler]".
>
> Le trigger fonctionne bien avec un autre client que Access (l'Analyseur


de
> requêtes par exemple).
>
> Est-il possible d'utiliser Access (ADP) avec une base possédant des


triggers
> ?
>
> Jacques.
>
> ***********************************************
> CREATE TRIGGER trg_AvoidNullInNb ON [dbo].[MvtColis]
> FOR INSERT, UPDATE
> AS
>
> UPDATE Mvtcolis
> SET NbPal = 0
> WHERE NbPal is null
>
> UPDATE Mvtcolis
> SET NbColis = 0
> WHERE NbColis is null
>
> UPDATE Mvtcolis
> SET NbPlis = 0
> WHERE NbPlis is null
>
> UPDATE Mvtcolis
> SET NbPiece = 0
> WHERE NbPiece is null
>
> /* Fin.*/
>
>





Avatar
VUILLERMET Jacques
Idem avec :

UPDATE Mvtcolis
SET NbPal = 0
WHERE NbPal is null AND id = (SELECT id FROM inserted)

ou bien :

UPDATE Mvtcolis
SET NbPal = 0
FROM MvtColis INNER JOIN inserted ON MvtColis.id = inserted.id
WHERE inserted.NbPal is null

Jacques.

"VUILLERMET Jacques" a écrit dans le message de
news:

Une application fonctionne avec un client Access (ADP) et une base SQL
Server.

Elle fonctionne bien, et possède un formulaire ayant comme source une


table.

Mais quand je spécifie un trigger (INSERT, UPDATE) sur cette table (qui la
modifie, code après la signature) alors Access est perdu : message


d'erreur
"Conflit d'écriture - Cet enregistrement a été modifié par un autre
utilisateur... [Sauvegarder enregistrement] [Copier dans le


Presse-papiers]
[Annuler]".

Le trigger fonctionne bien avec un autre client que Access (l'Analyseur de
requêtes par exemple).

Est-il possible d'utiliser Access (ADP) avec une base possédant des


triggers
?

Jacques.

***********************************************
CREATE TRIGGER trg_AvoidNullInNb ON [dbo].[MvtColis]
FOR INSERT, UPDATE
AS

UPDATE Mvtcolis
SET NbPal = 0
WHERE NbPal is null

UPDATE Mvtcolis
SET NbColis = 0
WHERE NbColis is null

UPDATE Mvtcolis
SET NbPlis = 0
WHERE NbPlis is null

UPDATE Mvtcolis
SET NbPiece = 0
WHERE NbPiece is null

/* Fin.*/




Avatar
J-Pierre
J'explique rapidos, je suis à la bourre, si ça ne suffit pas, tu le dis.

Tu crées une base access.MDB. avec des tables et des relations. Avec l'assistantAccess, tu la convertis à un projet ADP, avec une
nouvelle base SQL. L'assistant ne crée pas de relations dans SQL, mais crées des triggfers pour gérer tes relations.

J-Pierre
PS: J'utilise couramment des triggers avec ADP, je n'ai jamais eu de problèmes.

"VUILLERMET Jacques" a écrit dans le message de news:%
Idem avec :

UPDATE Mvtcolis
SET NbPal = 0
WHERE NbPal is null AND id = (SELECT id FROM inserted)

ou bien :

UPDATE Mvtcolis
SET NbPal = 0
FROM MvtColis INNER JOIN inserted ON MvtColis.id = inserted.id
WHERE inserted.NbPal is null

Jacques.

"VUILLERMET Jacques" a écrit dans le message de
news:
>
> Une application fonctionne avec un client Access (ADP) et une base SQL
> Server.
>
> Elle fonctionne bien, et possède un formulaire ayant comme source une
table.
>
> Mais quand je spécifie un trigger (INSERT, UPDATE) sur cette table (qui la
> modifie, code après la signature) alors Access est perdu : message
d'erreur
> "Conflit d'écriture - Cet enregistrement a été modifié par un autre
> utilisateur... [Sauvegarder enregistrement] [Copier dans le
Presse-papiers]
> [Annuler]".
>
> Le trigger fonctionne bien avec un autre client que Access (l'Analyseur de
> requêtes par exemple).
>
> Est-il possible d'utiliser Access (ADP) avec une base possédant des
triggers
> ?
>
> Jacques.
>
> ***********************************************
> CREATE TRIGGER trg_AvoidNullInNb ON [dbo].[MvtColis]
> FOR INSERT, UPDATE
> AS
>
> UPDATE Mvtcolis
> SET NbPal = 0
> WHERE NbPal is null
>
> UPDATE Mvtcolis
> SET NbColis = 0
> WHERE NbColis is null
>
> UPDATE Mvtcolis
> SET NbPlis = 0
> WHERE NbPlis is null
>
> UPDATE Mvtcolis
> SET NbPiece = 0
> WHERE NbPiece is null
>
> /* Fin.*/
>
>




Avatar
VUILLERMET Jacques
Je vais essayer.

"PS: J'utilise couramment des triggers avec ADP, je n'ai jamais eu de


problèmes."
Ce genre de phrase me fait peur : cela signifie que je suis tombé sur un cas
particulier !

Merci Jean-Pierre !

Jacques.

"J-Pierre" a écrit dans le message de
news:
J'explique rapidos, je suis à la bourre, si ça ne suffit pas, tu le dis.

Tu crées une base access.MDB. avec des tables et des relations. Avec


l'assistantAccess, tu la convertis à un projet ADP, avec une
nouvelle base SQL. L'assistant ne crée pas de relations dans SQL, mais


crées des triggfers pour gérer tes relations.

J-Pierre
PS: J'utilise couramment des triggers avec ADP, je n'ai jamais eu de


problèmes.

"VUILLERMET Jacques" a écrit dans le message de


news:%
> Idem avec :
>
> UPDATE Mvtcolis
> SET NbPal = 0
> WHERE NbPal is null AND id = (SELECT id FROM inserted)
>
> ou bien :
>
> UPDATE Mvtcolis
> SET NbPal = 0
> FROM MvtColis INNER JOIN inserted ON MvtColis.id = inserted.id
> WHERE inserted.NbPal is null
>
> Jacques.
>
> "VUILLERMET Jacques" a écrit dans le message de
> news:
> >
> > Une application fonctionne avec un client Access (ADP) et une base SQL
> > Server.
> >
> > Elle fonctionne bien, et possède un formulaire ayant comme source une
> table.
> >
> > Mais quand je spécifie un trigger (INSERT, UPDATE) sur cette table


(qui la
> > modifie, code après la signature) alors Access est perdu : message
> d'erreur
> > "Conflit d'écriture - Cet enregistrement a été modifié par un autre
> > utilisateur... [Sauvegarder enregistrement] [Copier dans le
> Presse-papiers]
> > [Annuler]".
> >
> > Le trigger fonctionne bien avec un autre client que Access


(l'Analyseur de
> > requêtes par exemple).
> >
> > Est-il possible d'utiliser Access (ADP) avec une base possédant des
> triggers
> > ?
> >
> > Jacques.
> >
> > ***********************************************
> > CREATE TRIGGER trg_AvoidNullInNb ON [dbo].[MvtColis]
> > FOR INSERT, UPDATE
> > AS
> >
> > UPDATE Mvtcolis
> > SET NbPal = 0
> > WHERE NbPal is null
> >
> > UPDATE Mvtcolis
> > SET NbColis = 0
> > WHERE NbColis is null
> >
> > UPDATE Mvtcolis
> > SET NbPlis = 0
> > WHERE NbPlis is null
> >
> > UPDATE Mvtcolis
> > SET NbPiece = 0
> > WHERE NbPiece is null
> >
> > /* Fin.*/
> >
> >
>
>




Avatar
VUILLERMET Jacques
> It works with one UPDATE as you've shown !

THANKS A LOT !!!

Jacques. :-)))


"Uwe Ricken" a écrit dans le message de news:
#
> Hi Jacques,
>
> Vadiim has told you the mistake you've made in your trigger.
> On the other hand it is useful als Vadim has written, to
> use DEFAULT-Values.
>
> If you don't want to use DEFAULTS you do not have to use
> multiple UPDATE-Statements within the trigger but you can
> handle it within only one UPDATE-Statement
>
> CREATE TRIGGER dbo.trg_AvoidNullInNb
> ON dbo.MvtColis
> FOR INSERT, UPDATE
> AS
> SET NOCOUNT ON
>
> UPDATE m
> SET m.nbPal = ISNULL(i..NbPal, 0),
> m.nbColIs = ISNULL(i.nbColIs, 0),
> m.nbPlis = ISNULL(i.nbPlis, 0),
> m.NBPiece = ISNULL(i.NBPiece, 0)
> FROM dbo.Mvtcolis m INNER JOIN inserted i
> ON (m.<PKField> = i.<PKField>)
>
> SET NOCOUNT OFF
> GO
>
> HTH ;-)
>
> --
> Gruß, Uwe Ricken
> MCP for SQL Server 2000 Database Implementation
>
> GNS GmbH, Frankfurt am Main
> http://www.gns-online.de
> http://www.memberadmin.de
> http://www.conferenceadmin.de
> ____________________________________________________
> APP: http://www.AccessProfiPool.de
> dbdev: http://www.dbdev.org
> FAQ: http://www.donkarl.com/AccessFAQ.htm
>
>




"VUILLERMET Jacques" a écrit dans le message de
news:

Une application fonctionne avec un client Access (ADP) et une base SQL
Server.

Elle fonctionne bien, et possède un formulaire ayant comme source une


table.

Mais quand je spécifie un trigger (INSERT, UPDATE) sur cette table (qui la
modifie, code après la signature) alors Access est perdu : message


d'erreur
"Conflit d'écriture - Cet enregistrement a été modifié par un autre
utilisateur... [Sauvegarder enregistrement] [Copier dans le


Presse-papiers]
[Annuler]".

Le trigger fonctionne bien avec un autre client que Access (l'Analyseur de
requêtes par exemple).

Est-il possible d'utiliser Access (ADP) avec une base possédant des


triggers
?

Jacques.

***********************************************
CREATE TRIGGER trg_AvoidNullInNb ON [dbo].[MvtColis]
FOR INSERT, UPDATE
AS

UPDATE Mvtcolis
SET NbPal = 0
WHERE NbPal is null

UPDATE Mvtcolis
SET NbColis = 0
WHERE NbColis is null

UPDATE Mvtcolis
SET NbPlis = 0
WHERE NbPlis is null

UPDATE Mvtcolis
SET NbPiece = 0
WHERE NbPiece is null

/* Fin.*/




Avatar
J-Pierre
Salut Jacques,

Voilà deux exemples de triggers, update et delete.

J-Pierre

>"PS: J'utilise couramment des triggers avec ADP, je n'ai jamais eu de
problèmes."
Ce genre de phrase me fait peur : cela signifie que je suis tombé sur un cas
particulier !



Cela peut aussi signifier que tu as une erreur de programmation.

Si ça ne marche toujours pas, il faudra regarder du côté du RecordSet et des MAJ dans ton formulaire.

J-Pierre

-------------------------------------------------
CREATE TRIGGER X035_update_Trigger ON dbo.X035_collaborateurs FOR UPDATE AS
SET NOCOUNT ON

/* * MISES À JOUR EN CASCADE VERS 'T001_projets' */
IF UPDATE(X035_code_collaborateur)
BEGIN
UPDATE T001_projets
SET T001_projets.T001_code_collaborateur = inserted.X035_code_collaborateur
FROM T001_projets, deleted, inserted
WHERE deleted.X035_code_collaborateur = T001_projets.T001_code_collaborateur
END

/* * MISES À JOUR EN CASCADE VERS 'T025_infographie_temps_passes' */
IF UPDATE(X035_code_collaborateur)
BEGIN
UPDATE T025_infographie_temps_passes
SET T025_infographie_temps_passes.T025_collaborateur = inserted.X035_code_collaborateur
FROM T025_infographie_temps_passes, deleted, inserted
WHERE deleted.X035_code_collaborateur = T025_infographie_temps_passes.T025_collaborateur
END
-----------------------------------------------
CREATE TRIGGER X035_delete_Trigger ON dbo.X035_collaborateurs FOR DELETE AS
SET NOCOUNT ON

/* * PAS DE SUPPRESSIONS SI DES ENREGISTREMENTS LIES EXISTENT DANS 'T001_projets' */
IF (SELECT COUNT(*) FROM deleted, T001_projets WHERE (deleted.X035_code_collaborateur = T001_projets.T001_code_collaborateur)) > 0
BEGIN
RAISERROR 44445 'Ce collaborateur ne peut pas être supprimé. Des enregistrements liés existent dans la table
''T001_projets''.'
ROLLBACK TRANSACTION
END

/* * PAS DE SUPPRESSIONS SI DES ENREGISTREMENTS LIES EXISTENT DANS 'T025_infographie_temps_passes' */
IF (SELECT COUNT(*) FROM deleted, T025_infographie_temps_passes WHERE (deleted.X035_code_collaborateur T025_infographie_temps_passes.T025_collaborateur)) > 0
BEGIN
RAISERROR 44445 'Ce collaborateur ne peut pas être supprimé. Des enregistrements liés existent dans la table
''T025_infographie_temps_passes''.'
ROLLBACK TRANSACTION
END
---------------------------------------------------------


"VUILLERMET Jacques" a écrit dans le message de news:e$
Je vais essayer.

>"PS: J'utilise couramment des triggers avec ADP, je n'ai jamais eu de
problèmes."
Ce genre de phrase me fait peur : cela signifie que je suis tombé sur un cas
particulier !

Merci Jean-Pierre !

Jacques.

"J-Pierre" a écrit dans le message de
news:
> J'explique rapidos, je suis à la bourre, si ça ne suffit pas, tu le dis.
>
> Tu crées une base access.MDB. avec des tables et des relations. Avec
l'assistantAccess, tu la convertis à un projet ADP, avec une
> nouvelle base SQL. L'assistant ne crée pas de relations dans SQL, mais
crées des triggfers pour gérer tes relations.
>
> J-Pierre
> PS: J'utilise couramment des triggers avec ADP, je n'ai jamais eu de
problèmes.
>
> "VUILLERMET Jacques" a écrit dans le message de
news:%
> > Idem avec :
> >
> > UPDATE Mvtcolis
> > SET NbPal = 0
> > WHERE NbPal is null AND id = (SELECT id FROM inserted)
> >
> > ou bien :
> >
> > UPDATE Mvtcolis
> > SET NbPal = 0
> > FROM MvtColis INNER JOIN inserted ON MvtColis.id = inserted.id
> > WHERE inserted.NbPal is null
> >
> > Jacques.
> >
> > "VUILLERMET Jacques" a écrit dans le message de
> > news:
> > >
> > > Une application fonctionne avec un client Access (ADP) et une base SQL
> > > Server.
> > >
> > > Elle fonctionne bien, et possède un formulaire ayant comme source une
> > table.
> > >
> > > Mais quand je spécifie un trigger (INSERT, UPDATE) sur cette table
(qui la
> > > modifie, code après la signature) alors Access est perdu : message
> > d'erreur
> > > "Conflit d'écriture - Cet enregistrement a été modifié par un autre
> > > utilisateur... [Sauvegarder enregistrement] [Copier dans le
> > Presse-papiers]
> > > [Annuler]".
> > >
> > > Le trigger fonctionne bien avec un autre client que Access
(l'Analyseur de
> > > requêtes par exemple).
> > >
> > > Est-il possible d'utiliser Access (ADP) avec une base possédant des
> > triggers
> > > ?
> > >
> > > Jacques.
> > >
> > > ***********************************************
> > > CREATE TRIGGER trg_AvoidNullInNb ON [dbo].[MvtColis]
> > > FOR INSERT, UPDATE
> > > AS
> > >
> > > UPDATE Mvtcolis
> > > SET NbPal = 0
> > > WHERE NbPal is null
> > >
> > > UPDATE Mvtcolis
> > > SET NbColis = 0
> > > WHERE NbColis is null
> > >
> > > UPDATE Mvtcolis
> > > SET NbPlis = 0
> > > WHERE NbPlis is null
> > >
> > > UPDATE Mvtcolis
> > > SET NbPiece = 0
> > > WHERE NbPiece is null
> > >
> > > /* Fin.*/
> > >
> > >
> >
> >
>
>