OVH Cloud OVH Cloud

Transaction TSQL

7 réponses
Avatar
Eric Dev
Bonjour à tous

Je souhaite faire 5 insertions dans ma base de données mais vu qu'il s'agit
de tables différentes comment faire des transactions en effet

l'ensemble doit s'arreter si un insertion ne fonctionne pas aidez moi


voici ce que j'ai essayé

BEGIN TRAN

SQLInsertClient = "INSERT INTO CLIENT(NOM_MR, PRENOM_MR) VALUES('" & NOMMR &
"', '" & PRENOMMR)"
cmdInsert.commandText = SQLInsertClient
cmdInsert.Execute
SAVE TRAN P1

SQLInsertSC = "INSERT INTO SOURCE_CONTACT (ID_ETABLISSEMENT, DATE_SOURCE)
VALUES ('" & ets & "', '" & date() & "')"
cmdInsert.commandText = SQLInsertSC
cmdInsert.Execute
SAVE TRAN P2

SQLInsertLS = "INSERT INTO LISTE_SOURCE (ID_SOURCE, IDCLIENT, ID_AFFAIRE)
VALUES ('" & MAX_IDSOURCE & "', '" & MAX_IDCLIENT & "', '" & 1 & "')"
cmdInsert.commandText = SQLInsertLS
cmdInsert.Execute
SAVE TRAN P3

SQLInsertLM = "INSERT INTO LISTE_MOYENORIGINE (ID_SOURCE, ID_MODE,
ID_ORIGINE) VALUES ('" & MAX_IDSOURCE & "', '" & 2 & "', '" & origine & "')"
cmdInsert.commandText = SQLInsertLM
cmdInsert.Execute
SAVE TRAN P4

SQLInsertA = "INSERT INTO AFFAIRE (IDCLIENT, ID_AFFAIRE, CODETYPE_PRET)
VALUES ('" & MAX_IDCLIENT & "', '" & 1 & "', '" & typepret & "')"
cmdInsert.commandText = SQLInsertA
cmdInsert.Execute
SAVE TRAN P5

COMMIT TRAN P1, P2, P3, P4, P5

Merci de m'aider

7 réponses

Avatar
Fred BROUARD
Le mieux est d'écrire une proc stok et de la lancer depuis ton code comme s'il
s'agissait d'une requête.

Voici la procédure stiockée (incomplète au niveau des types de données :

A lancer dans l'analyseur de requête sut ta base de prod :

/**************************************************************************/

-- création de la procédure stockée
CREATE PROCEDURE P_MES_5_INSERTIONS
@NOMMR VARCHAR(???),
@PRENOMMR VARCHAR(???),
@ets INTEGER,
@Madate DATETIME,
@MAX_IDSOURCE ???
@MAX_IDCLIENT ???
@origine ???
@typepret ???

AS

-- démarrage de la transaction
BEGIN TRANSACTION

-- première insertion
INSERT INTO CLIENT(NOM_MR, PRENOM_MR) VALUES(@NOMMR, @PRENOMMR)
-- si erreur se brancher à l'étiquette "LBL_ERROR"
IF @@ERROR <> 0 GOTO LBL_ERROR

-- seconde insertion...
INSERT INTO SOURCE_CONTACT (ID_ETABLISSEMENT, DATE_SOURCE) VALUES (@ets, @Madate)
-- si erreur ..
IF @@ERROR <> 0 GOTO LBL_ERROR

INSERT INTO LISTE_SOURCE (ID_SOURCE, IDCLIENT, ID_AFFAIRE) VALUES
(@MAX_IDSOURCE, @MAX_IDCLIENT, 1)
IF @@ERROR <> 0 GOTO LBL_ERROR

INSERT INTO LISTE_MOYENORIGINE (ID_SOURCE, ID_MODE, ID_ORIGINE) VALUES
(@MAX_IDSOURCE, 2, @origine)"
IF @@ERROR <> 0 GOTO LBL_ERROR

INSERT INTO AFFAIRE (IDCLIENT, ID_AFFAIRE, CODETYPE_PRET) VALUES (@MAX_IDCLIENT,
1, @typepret)
IF @@ERROR <> 0 GOTO LBL_ERROR


-- si l'on arrive ici c'est que les 5 INSERT se sont bien passés :
-- on valide la transaction, tout est écrit
COMMIT TRANSACTION
-- et on sort
RETURN


-- c'est ici que l'on arrive en cas d'erreur
LBL_ERROR:
-- annule la transaction : rien n'est écrit
ROLLBACK TRANSACTION

/**************************************************************************/

dans ton code :

SQLInsertClient = "PROCEDURE P_MES_5_INSERTIONS " & NOMMR & "', '" & PRENOMMR...
cmdInsert.commandText = SQLInsertClient
cmdInsert.Execute

Il faut passer tous les paramètres de la procédure en un seul coup, soit 8 valeurs.


Pour en savoir plus :

1) A quoi servent les transactions ?
http://sqlpro.developpez.com/cours/sqlaz/techniques/#L1

2) A quoi servent les procédure stockées ?
http://sqlpro.developpez.com/cours/sqlaz/techniques/#L6

3) écrire des procédures stockées sous MS SQL Server 2000
http://sqlpro.developpez.com/cours/sqlserver/transactsql/#L4

A +


--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************

Eric Dev a écrit:
Bonjour à tous

Je souhaite faire 5 insertions dans ma base de données mais vu qu'il s'agit
de tables différentes comment faire des transactions en effet

l'ensemble doit s'arreter si un insertion ne fonctionne pas aidez moi


voici ce que j'ai essayé

BEGIN TRAN

SQLInsertClient = "INSERT INTO CLIENT(NOM_MR, PRENOM_MR) VALUES('" & NOMMR &
"', '" & PRENOMMR)"
cmdInsert.commandText = SQLInsertClient
cmdInsert.Execute
SAVE TRAN P1

SQLInsertSC = "INSERT INTO SOURCE_CONTACT (ID_ETABLISSEMENT, DATE_SOURCE)
VALUES ('" & ets & "', '" & date() & "')"
cmdInsert.commandText = SQLInsertSC
cmdInsert.Execute
SAVE TRAN P2

SQLInsertLS = "INSERT INTO LISTE_SOURCE (ID_SOURCE, IDCLIENT, ID_AFFAIRE)
VALUES ('" & MAX_IDSOURCE & "', '" & MAX_IDCLIENT & "', '" & 1 & "')"
cmdInsert.commandText = SQLInsertLS
cmdInsert.Execute
SAVE TRAN P3

SQLInsertLM = "INSERT INTO LISTE_MOYENORIGINE (ID_SOURCE, ID_MODE,
ID_ORIGINE) VALUES ('" & MAX_IDSOURCE & "', '" & 2 & "', '" & origine & "')"
cmdInsert.commandText = SQLInsertLM
cmdInsert.Execute
SAVE TRAN P4

SQLInsertA = "INSERT INTO AFFAIRE (IDCLIENT, ID_AFFAIRE, CODETYPE_PRET)
VALUES ('" & MAX_IDCLIENT & "', '" & 1 & "', '" & typepret & "')"
cmdInsert.commandText = SQLInsertA
cmdInsert.Execute
SAVE TRAN P5

COMMIT TRAN P1, P2, P3, P4, P5

Merci de m'aider







Avatar
synopsis
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnproasp/html/batchtransactionmanagement.asp


"Eric Dev" a écrit dans le message de news:
43171963$0$17241$
Bonjour à tous

Je souhaite faire 5 insertions dans ma base de données mais vu qu'il
s'agit de tables différentes comment faire des transactions en effet

l'ensemble doit s'arreter si un insertion ne fonctionne pas aidez moi


voici ce que j'ai essayé

BEGIN TRAN

SQLInsertClient = "INSERT INTO CLIENT(NOM_MR, PRENOM_MR) VALUES('" & NOMMR
& "', '" & PRENOMMR)"
cmdInsert.commandText = SQLInsertClient
cmdInsert.Execute
SAVE TRAN P1

SQLInsertSC = "INSERT INTO SOURCE_CONTACT (ID_ETABLISSEMENT, DATE_SOURCE)
VALUES ('" & ets & "', '" & date() & "')"
cmdInsert.commandText = SQLInsertSC
cmdInsert.Execute
SAVE TRAN P2

SQLInsertLS = "INSERT INTO LISTE_SOURCE (ID_SOURCE, IDCLIENT, ID_AFFAIRE)
VALUES ('" & MAX_IDSOURCE & "', '" & MAX_IDCLIENT & "', '" & 1 & "')"
cmdInsert.commandText = SQLInsertLS
cmdInsert.Execute
SAVE TRAN P3

SQLInsertLM = "INSERT INTO LISTE_MOYENORIGINE (ID_SOURCE, ID_MODE,
ID_ORIGINE) VALUES ('" & MAX_IDSOURCE & "', '" & 2 & "', '" & origine &
"')" cmdInsert.commandText = SQLInsertLM
cmdInsert.Execute
SAVE TRAN P4

SQLInsertA = "INSERT INTO AFFAIRE (IDCLIENT, ID_AFFAIRE, CODETYPE_PRET)
VALUES ('" & MAX_IDCLIENT & "', '" & 1 & "', '" & typepret & "')"
cmdInsert.commandText = SQLInsertA
cmdInsert.Execute
SAVE TRAN P5

COMMIT TRAN P1, P2, P3, P4, P5

Merci de m'aider







Avatar
Eric Dev
Merci je vous tiens informé


"synopsis" a écrit dans le message de news:
4317423e$0$24717$
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnproasp/html/batchtransactionmanagement.asp


"Eric Dev" a écrit dans le message de news:
43171963$0$17241$
Bonjour à tous

Je souhaite faire 5 insertions dans ma base de données mais vu qu'il
s'agit de tables différentes comment faire des transactions en effet

l'ensemble doit s'arreter si un insertion ne fonctionne pas aidez moi


voici ce que j'ai essayé

BEGIN TRAN

SQLInsertClient = "INSERT INTO CLIENT(NOM_MR, PRENOM_MR) VALUES('" &
NOMMR & "', '" & PRENOMMR)"
cmdInsert.commandText = SQLInsertClient
cmdInsert.Execute
SAVE TRAN P1

SQLInsertSC = "INSERT INTO SOURCE_CONTACT (ID_ETABLISSEMENT, DATE_SOURCE)
VALUES ('" & ets & "', '" & date() & "')"
cmdInsert.commandText = SQLInsertSC
cmdInsert.Execute
SAVE TRAN P2

SQLInsertLS = "INSERT INTO LISTE_SOURCE (ID_SOURCE, IDCLIENT, ID_AFFAIRE)
VALUES ('" & MAX_IDSOURCE & "', '" & MAX_IDCLIENT & "', '" & 1 & "')"
cmdInsert.commandText = SQLInsertLS
cmdInsert.Execute
SAVE TRAN P3

SQLInsertLM = "INSERT INTO LISTE_MOYENORIGINE (ID_SOURCE, ID_MODE,
ID_ORIGINE) VALUES ('" & MAX_IDSOURCE & "', '" & 2 & "', '" & origine &
"')" cmdInsert.commandText = SQLInsertLM
cmdInsert.Execute
SAVE TRAN P4

SQLInsertA = "INSERT INTO AFFAIRE (IDCLIENT, ID_AFFAIRE, CODETYPE_PRET)
VALUES ('" & MAX_IDCLIENT & "', '" & 1 & "', '" & typepret & "')"
cmdInsert.commandText = SQLInsertA
cmdInsert.Execute
SAVE TRAN P5

COMMIT TRAN P1, P2, P3, P4, P5

Merci de m'aider











Avatar
Eric Dev
Je comprends mais seulement je ne peux pas passer les 8 paramètres parce que
deux sont dynamiques c'est à dire
MAX_IDSOURCE et MAX_IDCLIENT

La variable MAX_IDCLIENT correspond au dernier client inséré après
l'exécution de 1ere l'insertion.

de même que la variable MAX_IDSOURCE correspond au dernier IDSOURCE inséré

ce qu'il me faut c'est pourvoir la récupérer une fois le client inséré et
c'est pareil pour la deuxième insertion


Merci encore, je continue de mon côté.


"Fred BROUARD" a écrit dans le message de news:

Le mieux est d'écrire une proc stok et de la lancer depuis ton code comme
s'il s'agissait d'une requête.

Voici la procédure stiockée (incomplète au niveau des types de données :

A lancer dans l'analyseur de requête sut ta base de prod :

/**************************************************************************/

-- création de la procédure stockée
CREATE PROCEDURE P_MES_5_INSERTIONS
@NOMMR VARCHAR(???),
@PRENOMMR VARCHAR(???),
@ets INTEGER,
@Madate DATETIME,
@MAX_IDSOURCE ???
@MAX_IDCLIENT ???
@origine ???
@typepret ???

AS

-- démarrage de la transaction
BEGIN TRANSACTION

-- première insertion
INSERT INTO CLIENT(NOM_MR, PRENOM_MR) VALUES(@NOMMR, @PRENOMMR)
-- si erreur se brancher à l'étiquette "LBL_ERROR"
IF @@ERROR <> 0 GOTO LBL_ERROR

-- seconde insertion...
INSERT INTO SOURCE_CONTACT (ID_ETABLISSEMENT, DATE_SOURCE) VALUES (@ets,
@Madate)
-- si erreur ..
IF @@ERROR <> 0 GOTO LBL_ERROR

INSERT INTO LISTE_SOURCE (ID_SOURCE, IDCLIENT, ID_AFFAIRE) VALUES
(@MAX_IDSOURCE, @MAX_IDCLIENT, 1)
IF @@ERROR <> 0 GOTO LBL_ERROR

INSERT INTO LISTE_MOYENORIGINE (ID_SOURCE, ID_MODE, ID_ORIGINE) VALUES
(@MAX_IDSOURCE, 2, @origine)"
IF @@ERROR <> 0 GOTO LBL_ERROR

INSERT INTO AFFAIRE (IDCLIENT, ID_AFFAIRE, CODETYPE_PRET) VALUES
(@MAX_IDCLIENT, 1, @typepret)
IF @@ERROR <> 0 GOTO LBL_ERROR


-- si l'on arrive ici c'est que les 5 INSERT se sont bien passés :
-- on valide la transaction, tout est écrit
COMMIT TRANSACTION
-- et on sort
RETURN


-- c'est ici que l'on arrive en cas d'erreur
LBL_ERROR:
-- annule la transaction : rien n'est écrit
ROLLBACK TRANSACTION

/**************************************************************************/

dans ton code :

SQLInsertClient = "PROCEDURE P_MES_5_INSERTIONS " & NOMMR & "', '" &
PRENOMMR...
cmdInsert.commandText = SQLInsertClient
cmdInsert.Execute

Il faut passer tous les paramètres de la procédure en un seul coup, soit 8
valeurs.


Pour en savoir plus :

1) A quoi servent les transactions ?
http://sqlpro.developpez.com/cours/sqlaz/techniques/#L1

2) A quoi servent les procédure stockées ?
http://sqlpro.developpez.com/cours/sqlaz/techniques/#L6

3) écrire des procédures stockées sous MS SQL Server 2000
http://sqlpro.developpez.com/cours/sqlserver/transactsql/#L4

A +


--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************

Eric Dev a écrit:
Bonjour à tous

Je souhaite faire 5 insertions dans ma base de données mais vu qu'il
s'agit de tables différentes comment faire des transactions en effet

l'ensemble doit s'arreter si un insertion ne fonctionne pas aidez moi


voici ce que j'ai essayé

BEGIN TRAN

SQLInsertClient = "INSERT INTO CLIENT(NOM_MR, PRENOM_MR) VALUES('" &
NOMMR & "', '" & PRENOMMR)"
cmdInsert.commandText = SQLInsertClient
cmdInsert.Execute
SAVE TRAN P1

SQLInsertSC = "INSERT INTO SOURCE_CONTACT (ID_ETABLISSEMENT, DATE_SOURCE)
VALUES ('" & ets & "', '" & date() & "')"
cmdInsert.commandText = SQLInsertSC
cmdInsert.Execute
SAVE TRAN P2

SQLInsertLS = "INSERT INTO LISTE_SOURCE (ID_SOURCE, IDCLIENT, ID_AFFAIRE)
VALUES ('" & MAX_IDSOURCE & "', '" & MAX_IDCLIENT & "', '" & 1 & "')"
cmdInsert.commandText = SQLInsertLS
cmdInsert.Execute
SAVE TRAN P3

SQLInsertLM = "INSERT INTO LISTE_MOYENORIGINE (ID_SOURCE, ID_MODE,
ID_ORIGINE) VALUES ('" & MAX_IDSOURCE & "', '" & 2 & "', '" & origine &
"')" cmdInsert.commandText = SQLInsertLM
cmdInsert.Execute
SAVE TRAN P4

SQLInsertA = "INSERT INTO AFFAIRE (IDCLIENT, ID_AFFAIRE, CODETYPE_PRET)
VALUES ('" & MAX_IDCLIENT & "', '" & 1 & "', '" & typepret & "')"
cmdInsert.commandText = SQLInsertA
cmdInsert.Execute
SAVE TRAN P5

COMMIT TRAN P1, P2, P3, P4, P5

Merci de m'aider











Avatar
Benoit
Raison de plus pour une procédure :

/**************************************************************************/

-- création de la procédure stockée
CREATE PROCEDURE P_MES_5_INSERTIONS
@NOMMR VARCHAR(???),
@PRENOMMR VARCHAR(???),
@ets INTEGER,
@Madate DATETIME,
@origine ???
@typepret ???

AS





DECLARE @MAX_IDSOURCE INTEGER, @MAX_IDCLIENT INTEGER


-- démarrage de la transaction
BEGIN TRANSACTION

-- première insertion
INSERT INTO CLIENT(NOM_MR, PRENOM_MR) VALUES(@NOMMR, @PRENOMMR)
-- si erreur se brancher à l'étiquette "LBL_ERROR"
IF @@ERROR <> 0 GOTO LBL_ERROR

-- seconde insertion...
INSERT INTO SOURCE_CONTACT (ID_ETABLISSEMENT, DATE_SOURCE) VALUES (@ets,
@Madate)
-- si erreur ..
IF @@ERROR <> 0 GOTO LBL_ERROR





SET @MAX_IDSOURCE = @@identity

INSERT INTO LISTE_SOURCE (ID_SOURCE, IDCLIENT, ID_AFFAIRE) VALUES
(@MAX_IDSOURCE, @MAX_IDCLIENT, 1)
IF @@ERROR <> 0 GOTO LBL_ERROR






SET @MAX_IDCLIENT = @@identity

INSERT INTO LISTE_MOYENORIGINE (ID_SOURCE, ID_MODE, ID_ORIGINE) VALUES
(@MAX_IDSOURCE, 2, @origine)"
IF @@ERROR <> 0 GOTO LBL_ERROR

INSERT INTO AFFAIRE (IDCLIENT, ID_AFFAIRE, CODETYPE_PRET) VALUES
(@MAX_IDCLIENT, 1, @typepret)
IF @@ERROR <> 0 GOTO LBL_ERROR


-- si l'on arrive ici c'est que les 5 INSERT se sont bien passés :
-- on valide la transaction, tout est écrit
COMMIT TRANSACTION
-- et on sort
RETURN


-- c'est ici que l'on arrive en cas d'erreur
LBL_ERROR:
-- annule la transaction : rien n'est écrit
ROLLBACK TRANSACTION






--
Benoit

"Eric Dev" a écrit dans le message de news:
43181a8d$0$1746$
Je comprends mais seulement je ne peux pas passer les 8 paramètres parce
que deux sont dynamiques c'est à dire
MAX_IDSOURCE et MAX_IDCLIENT

La variable MAX_IDCLIENT correspond au dernier client inséré après
l'exécution de 1ere l'insertion.

de même que la variable MAX_IDSOURCE correspond au dernier IDSOURCE inséré

ce qu'il me faut c'est pourvoir la récupérer une fois le client inséré et
c'est pareil pour la deuxième insertion


Merci encore, je continue de mon côté.


"Fred BROUARD" a écrit dans le message de
news:
Le mieux est d'écrire une proc stok et de la lancer depuis ton code comme
s'il s'agissait d'une requête.

Voici la procédure stiockée (incomplète au niveau des types de données :

A lancer dans l'analyseur de requête sut ta base de prod :

/**************************************************************************/

-- création de la procédure stockée
CREATE PROCEDURE P_MES_5_INSERTIONS
@NOMMR VARCHAR(???),
@PRENOMMR VARCHAR(???),
@ets INTEGER,
@Madate DATETIME,
@MAX_IDSOURCE ???
@MAX_IDCLIENT ???
@origine ???
@typepret ???

AS

-- démarrage de la transaction
BEGIN TRANSACTION

-- première insertion
INSERT INTO CLIENT(NOM_MR, PRENOM_MR) VALUES(@NOMMR, @PRENOMMR)
-- si erreur se brancher à l'étiquette "LBL_ERROR"
IF @@ERROR <> 0 GOTO LBL_ERROR

-- seconde insertion...
INSERT INTO SOURCE_CONTACT (ID_ETABLISSEMENT, DATE_SOURCE) VALUES (@ets,
@Madate)
-- si erreur ..
IF @@ERROR <> 0 GOTO LBL_ERROR

INSERT INTO LISTE_SOURCE (ID_SOURCE, IDCLIENT, ID_AFFAIRE) VALUES
(@MAX_IDSOURCE, @MAX_IDCLIENT, 1)
IF @@ERROR <> 0 GOTO LBL_ERROR

INSERT INTO LISTE_MOYENORIGINE (ID_SOURCE, ID_MODE, ID_ORIGINE) VALUES
(@MAX_IDSOURCE, 2, @origine)"
IF @@ERROR <> 0 GOTO LBL_ERROR

INSERT INTO AFFAIRE (IDCLIENT, ID_AFFAIRE, CODETYPE_PRET) VALUES
(@MAX_IDCLIENT, 1, @typepret)
IF @@ERROR <> 0 GOTO LBL_ERROR


-- si l'on arrive ici c'est que les 5 INSERT se sont bien passés :
-- on valide la transaction, tout est écrit
COMMIT TRANSACTION
-- et on sort
RETURN


-- c'est ici que l'on arrive en cas d'erreur
LBL_ERROR:
-- annule la transaction : rien n'est écrit
ROLLBACK TRANSACTION

/**************************************************************************/

dans ton code :

SQLInsertClient = "PROCEDURE P_MES_5_INSERTIONS " & NOMMR & "', '" &
PRENOMMR...
cmdInsert.commandText = SQLInsertClient
cmdInsert.Execute

Il faut passer tous les paramètres de la procédure en un seul coup, soit
8 valeurs.


Pour en savoir plus :

1) A quoi servent les transactions ?
http://sqlpro.developpez.com/cours/sqlaz/techniques/#L1

2) A quoi servent les procédure stockées ?
http://sqlpro.developpez.com/cours/sqlaz/techniques/#L6

3) écrire des procédures stockées sous MS SQL Server 2000
http://sqlpro.developpez.com/cours/sqlserver/transactsql/#L4

A +


--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************

Eric Dev a écrit:
Bonjour à tous

Je souhaite faire 5 insertions dans ma base de données mais vu qu'il
s'agit de tables différentes comment faire des transactions en effet

l'ensemble doit s'arreter si un insertion ne fonctionne pas aidez moi


voici ce que j'ai essayé

BEGIN TRAN

SQLInsertClient = "INSERT INTO CLIENT(NOM_MR, PRENOM_MR) VALUES('" &
NOMMR & "', '" & PRENOMMR)"
cmdInsert.commandText = SQLInsertClient
cmdInsert.Execute
SAVE TRAN P1

SQLInsertSC = "INSERT INTO SOURCE_CONTACT (ID_ETABLISSEMENT,
DATE_SOURCE) VALUES ('" & ets & "', '" & date() & "')"
cmdInsert.commandText = SQLInsertSC
cmdInsert.Execute
SAVE TRAN P2

SQLInsertLS = "INSERT INTO LISTE_SOURCE (ID_SOURCE, IDCLIENT,
ID_AFFAIRE) VALUES ('" & MAX_IDSOURCE & "', '" & MAX_IDCLIENT & "', '" &
1 & "')" cmdInsert.commandText = SQLInsertLS
cmdInsert.Execute
SAVE TRAN P3

SQLInsertLM = "INSERT INTO LISTE_MOYENORIGINE (ID_SOURCE, ID_MODE,
ID_ORIGINE) VALUES ('" & MAX_IDSOURCE & "', '" & 2 & "', '" & origine &
"')" cmdInsert.commandText = SQLInsertLM
cmdInsert.Execute
SAVE TRAN P4

SQLInsertA = "INSERT INTO AFFAIRE (IDCLIENT, ID_AFFAIRE, CODETYPE_PRET)
VALUES ('" & MAX_IDCLIENT & "', '" & 1 & "', '" & typepret & "')"
cmdInsert.commandText = SQLInsertA
cmdInsert.Execute
SAVE TRAN P5

COMMIT TRAN P1, P2, P3, P4, P5

Merci de m'aider















Avatar
Fred BROUARD
En effet non seulement benoit à raison, mais vous en faisant cela dans du code
client vous avez toutes les chances que cela se passe mal un jour ou l'autre :
Si, entre votre requête 1 et la requête 2, un autre poste démarre le même
process, alors vous aller récupérer dans le max, non pas celui que vous venez
d'insérer, mais celui que l'autre poste à insére !!!
De toute façon récupérer le max suite à l'insertion d'une ligne ne vous
garantiera JAMAIS que c'est bien le dernier soue VOUS avez inséré, mais que
c'est le dernier qui a été inséré par n'importe qui.
Seule la variable local @@IDENTITY vous le garantrie car elle est propre à la
session.

Donc procédure stockée si vous ne voulez pas pourrir vos données !!!

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************

Benoit a écrit:
Raison de plus pour une procédure :


/**************************************************************************/

-- création de la procédure stockée
CREATE PROCEDURE P_MES_5_INSERTIONS
@NOMMR VARCHAR(???),
@PRENOMMR VARCHAR(???),
@ets INTEGER,
@Madate DATETIME,
@origine ???
@typepret ???

AS






DECLARE @MAX_IDSOURCE INTEGER, @MAX_IDCLIENT INTEGER


-- démarrage de la transaction
BEGIN TRANSACTION

-- première insertion
INSERT INTO CLIENT(NOM_MR, PRENOM_MR) VALUES(@NOMMR, @PRENOMMR)
-- si erreur se brancher à l'étiquette "LBL_ERROR"
IF @@ERROR <> 0 GOTO LBL_ERROR

-- seconde insertion...
INSERT INTO SOURCE_CONTACT (ID_ETABLISSEMENT, DATE_SOURCE) VALUES (@ets,
@Madate)
-- si erreur ..
IF @@ERROR <> 0 GOTO LBL_ERROR






SET @MAX_IDSOURCE = @@identity


INSERT INTO LISTE_SOURCE (ID_SOURCE, IDCLIENT, ID_AFFAIRE) VALUES
(@MAX_IDSOURCE, @MAX_IDCLIENT, 1)
IF @@ERROR <> 0 GOTO LBL_ERROR







SET @MAX_IDCLIENT = @@identity


INSERT INTO LISTE_MOYENORIGINE (ID_SOURCE, ID_MODE, ID_ORIGINE) VALUES
(@MAX_IDSOURCE, 2, @origine)"
IF @@ERROR <> 0 GOTO LBL_ERROR

INSERT INTO AFFAIRE (IDCLIENT, ID_AFFAIRE, CODETYPE_PRET) VALUES
(@MAX_IDCLIENT, 1, @typepret)
IF @@ERROR <> 0 GOTO LBL_ERROR


-- si l'on arrive ici c'est que les 5 INSERT se sont bien passés :
-- on valide la transaction, tout est écrit
COMMIT TRANSACTION
-- et on sort
RETURN


-- c'est ici que l'on arrive en cas d'erreur
LBL_ERROR:
-- annule la transaction : rien n'est écrit
ROLLBACK TRANSACTION









Avatar
Eric Dev
Merci

bcp cela fonctionne

en effet j'ai vous avez raison pour le select max


"Fred BROUARD" a écrit dans le message de news:
%23$
En effet non seulement benoit à raison, mais vous en faisant cela dans du
code client vous avez toutes les chances que cela se passe mal un jour ou
l'autre :
Si, entre votre requête 1 et la requête 2, un autre poste démarre le même
process, alors vous aller récupérer dans le max, non pas celui que vous
venez d'insérer, mais celui que l'autre poste à insére !!!
De toute façon récupérer le max suite à l'insertion d'une ligne ne vous
garantiera JAMAIS que c'est bien le dernier soue VOUS avez inséré, mais
que c'est le dernier qui a été inséré par n'importe qui.
Seule la variable local @@IDENTITY vous le garantrie car elle est propre à
la session.

Donc procédure stockée si vous ne voulez pas pourrir vos données !!!

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************

Benoit a écrit:
Raison de plus pour une procédure :


/**************************************************************************/

-- création de la procédure stockée
CREATE PROCEDURE P_MES_5_INSERTIONS
@NOMMR VARCHAR(???),
@PRENOMMR VARCHAR(???),
@ets INTEGER,
@Madate DATETIME,
@origine ???
@typepret ???

AS






DECLARE @MAX_IDSOURCE INTEGER, @MAX_IDCLIENT INTEGER


-- démarrage de la transaction
BEGIN TRANSACTION

-- première insertion
INSERT INTO CLIENT(NOM_MR, PRENOM_MR) VALUES(@NOMMR, @PRENOMMR)
-- si erreur se brancher à l'étiquette "LBL_ERROR"
IF @@ERROR <> 0 GOTO LBL_ERROR

-- seconde insertion...
INSERT INTO SOURCE_CONTACT (ID_ETABLISSEMENT, DATE_SOURCE) VALUES (@ets,
@Madate)
-- si erreur ..
IF @@ERROR <> 0 GOTO LBL_ERROR






SET @MAX_IDSOURCE = @@identity


INSERT INTO LISTE_SOURCE (ID_SOURCE, IDCLIENT, ID_AFFAIRE) VALUES
(@MAX_IDSOURCE, @MAX_IDCLIENT, 1)
IF @@ERROR <> 0 GOTO LBL_ERROR







SET @MAX_IDCLIENT = @@identity


INSERT INTO LISTE_MOYENORIGINE (ID_SOURCE, ID_MODE, ID_ORIGINE) VALUES
(@MAX_IDSOURCE, 2, @origine)"
IF @@ERROR <> 0 GOTO LBL_ERROR

INSERT INTO AFFAIRE (IDCLIENT, ID_AFFAIRE, CODETYPE_PRET) VALUES
(@MAX_IDCLIENT, 1, @typepret)
IF @@ERROR <> 0 GOTO LBL_ERROR


-- si l'on arrive ici c'est que les 5 INSERT se sont bien passés :
-- on valide la transaction, tout est écrit
COMMIT TRANSACTION
-- et on sort
RETURN


-- c'est ici que l'on arrive en cas d'erreur
LBL_ERROR:
-- annule la transaction : rien n'est écrit
ROLLBACK TRANSACTION