OVH Cloud OVH Cloud

DELETE les X derniers...

4 réponses
Avatar
JM
Bonjour.

Mettons une table A qui contient le champ CODE et le champ QTE. Mettons une
table B qui contient les champs NUMERO, CODE.

Pour chaque enregistrement de Table A (où code est unique), je génère X
enregistrements dans Table B, où X est égal à TableA.QTE.

Par exemple :

TableA.Code='TOTO'
TableA.QTE=3

--->

TableB.NUMERO=1
TableB.CODE='TOTO'

TableB.NUMERO=2
TableB.CODE='TOTO'

TableB.NUMERO=3
TableB.CODE='TOTO'

Il y a 3 enregistrements dans B pour TOTO parce que il y a 3 dans le champ
QTE de A.

OK.

Maintenant, et c'est là que je n'ai aucune idée et que je me permets de vous
solliciter, si après avoir généré les enregistrements dans TABLE B je
modifie à la baisse (à la hausse, ce n'est pas possible) la valeur du champ
QTE, je ne sais pas enlever de table B les enregistrements devenus inutiles
(les n derniers). Je ne peux pas, pour des raisons de compteur, supprimer
tous les enregistrements de Table B correspondant et les réécrire, ce qui
serait facile.

Dans l'exemple ci-dessus, si QTE=3 devient QTE=1, il faudrait supprimer les
2 derniers enregistrements de Table B où CODE='TOTO'.


Une piste ?

A vous lire, avec un grand merci !!!

4 réponses

Avatar
Patrice
A supposer que NUMERO est séquentiel pour un même CODE, il faudrait
supprimer WHERE CODE='TOTO' AND NUMERO>QTE ?

Sinon voir par exemple le mot clé TOP.

Après, difficile à dire sans savoir de quoi il s'agit, mais cela me parait
un peu arbitraire (l'utilisateur ne risque t'il pas de vouloir supprimer
plutôt la ligne 1 et de garder la 3 qui correspond aux informations qu'il
veut garder ?). Si oui, une autre approche serait laisser l'utilisateur
choisir les lignes à supprimer, QTE étant recalculé pour être égal au nombre
de lignes restantes.

--
Patrice

"JM" a écrit dans le message de
news:
Bonjour.

Mettons une table A qui contient le champ CODE et le champ QTE. Mettons


une
table B qui contient les champs NUMERO, CODE.

Pour chaque enregistrement de Table A (où code est unique), je génère X
enregistrements dans Table B, où X est égal à TableA.QTE.

Par exemple :

TableA.Code='TOTO'
TableA.QTE=3

--->

TableB.NUMERO=1
TableB.CODE='TOTO'

TableB.NUMERO=2
TableB.CODE='TOTO'

TableB.NUMERO=3
TableB.CODE='TOTO'

Il y a 3 enregistrements dans B pour TOTO parce que il y a 3 dans le champ
QTE de A.

OK.

Maintenant, et c'est là que je n'ai aucune idée et que je me permets de


vous
solliciter, si après avoir généré les enregistrements dans TABLE B je
modifie à la baisse (à la hausse, ce n'est pas possible) la valeur du


champ
QTE, je ne sais pas enlever de table B les enregistrements devenus


inutiles
(les n derniers). Je ne peux pas, pour des raisons de compteur, supprimer
tous les enregistrements de Table B correspondant et les réécrire, ce qui
serait facile.

Dans l'exemple ci-dessus, si QTE=3 devient QTE=1, il faudrait supprimer


les
2 derniers enregistrements de Table B où CODE='TOTO'.


Une piste ?

A vous lire, avec un grand merci !!!




Avatar
JM
Merci Patrice.

NUMERO est séquentiel, mais sans rapport avec QTE. Par exemple, NUMERO sera
FTT0128, FTT0129, FTT0130.

Il faut systématiquement supprimer les n dernières lignes, order by NUMERO.
Par chance, c'est un arbitraire qui convient :-)

Il s'agit de numéros de série pour des produits, QTE étant la quantité de
produits fabriqués. J'ai une commande pour 23 TOTO, je crée dans Table B 23
lignes pour TOTO, avec 23 numéros de série. Le client en annule 5, je change
QTE de 23 en 18 et les 5 dernières lignes dans TABLE B sont inutiles..

Idéalement, il faudrait traiter automatiquement l'ensemble des lignes la
nuit, l'opérateur n'ayant pas à se soucier de supprimer les lignes de Table
B en trop. Je pensais faire une proc avec un cursor (?), mais je patine
grave...

Merci encore.


"Patrice" a écrit dans le message de
news:
A supposer que NUMERO est séquentiel pour un même CODE, il faudrait
supprimer WHERE CODE='TOTO' AND NUMERO>QTE ?

Sinon voir par exemple le mot clé TOP.

Après, difficile à dire sans savoir de quoi il s'agit, mais cela me parait
un peu arbitraire (l'utilisateur ne risque t'il pas de vouloir supprimer
plutôt la ligne 1 et de garder la 3 qui correspond aux informations qu'il
veut garder ?). Si oui, une autre approche serait laisser l'utilisateur
choisir les lignes à supprimer, QTE étant recalculé pour être égal au


nombre
de lignes restantes.

--
Patrice

"JM" a écrit dans le message de
news:
> Bonjour.
>
> Mettons une table A qui contient le champ CODE et le champ QTE. Mettons
une
> table B qui contient les champs NUMERO, CODE.
>
> Pour chaque enregistrement de Table A (où code est unique), je génère X
> enregistrements dans Table B, où X est égal à TableA.QTE.
>
> Par exemple :
>
> TableA.Code='TOTO'
> TableA.QTE=3
>
> --->
>
> TableB.NUMERO=1
> TableB.CODE='TOTO'
>
> TableB.NUMERO=2
> TableB.CODE='TOTO'
>
> TableB.NUMERO=3
> TableB.CODE='TOTO'
>
> Il y a 3 enregistrements dans B pour TOTO parce que il y a 3 dans le


champ
> QTE de A.
>
> OK.
>
> Maintenant, et c'est là que je n'ai aucune idée et que je me permets de
vous
> solliciter, si après avoir généré les enregistrements dans TABLE B je
> modifie à la baisse (à la hausse, ce n'est pas possible) la valeur du
champ
> QTE, je ne sais pas enlever de table B les enregistrements devenus
inutiles
> (les n derniers). Je ne peux pas, pour des raisons de compteur,


supprimer
> tous les enregistrements de Table B correspondant et les réécrire, ce


qui
> serait facile.
>
> Dans l'exemple ci-dessus, si QTE=3 devient QTE=1, il faudrait supprimer
les
> 2 derniers enregistrements de Table B où CODE='TOTO'.
>
>
> Une piste ?
>
> A vous lire, avec un grand merci !!!
>
>




Avatar
Med Bouchenafa
Une idée à explorer ...
SET ROWCOUNT = 2
DELETE FROM TableB WHERE CODE='TOTO'
SET ROWCOUNT = 0

Bien cordialement
Med Bouchenafa

"JM" wrote in message
news:
Bonjour.

Mettons une table A qui contient le champ CODE et le champ QTE. Mettons
une
table B qui contient les champs NUMERO, CODE.

Pour chaque enregistrement de Table A (où code est unique), je génère X
enregistrements dans Table B, où X est égal à TableA.QTE.

Par exemple :

TableA.Code='TOTO'
TableA.QTE=3

--->

TableB.NUMERO=1
TableB.CODE='TOTO'

TableB.NUMERO=2
TableB.CODE='TOTO'

TableB.NUMERO=3
TableB.CODE='TOTO'

Il y a 3 enregistrements dans B pour TOTO parce que il y a 3 dans le champ
QTE de A.

OK.

Maintenant, et c'est là que je n'ai aucune idée et que je me permets de
vous
solliciter, si après avoir généré les enregistrements dans TABLE B je
modifie à la baisse (à la hausse, ce n'est pas possible) la valeur du
champ
QTE, je ne sais pas enlever de table B les enregistrements devenus
inutiles
(les n derniers). Je ne peux pas, pour des raisons de compteur, supprimer
tous les enregistrements de Table B correspondant et les réécrire, ce qui
serait facile.

Dans l'exemple ci-dessus, si QTE=3 devient QTE=1, il faudrait supprimer
les
2 derniers enregistrements de Table B où CODE='TOTO'.


Une piste ?

A vous lire, avec un grand merci !!!




Avatar
bruno reiter
delete tableB
from tableB C
join
(
select A.code, B.num
from tableA A
join
(
select code, count(*) as qte, max(numero) as num
from tableB
group by code
) as B
on A.code = B.code
where A.qte < B.qte
) as D
on C.code = D.code
and C.numero = D.num

en passant plusieurs fois cette requete ça doit éliminer les enrs en trop
(pas testé)

br


"JM" a écrit dans le message de news:

Bonjour.

Mettons une table A qui contient le champ CODE et le champ QTE. Mettons
une
table B qui contient les champs NUMERO, CODE.

Pour chaque enregistrement de Table A (où code est unique), je génère X
enregistrements dans Table B, où X est égal à TableA.QTE.

Par exemple :

TableA.Code='TOTO'
TableA.QTE=3

--->

TableB.NUMERO=1
TableB.CODE='TOTO'

TableB.NUMERO=2
TableB.CODE='TOTO'

TableB.NUMERO=3
TableB.CODE='TOTO'

Il y a 3 enregistrements dans B pour TOTO parce que il y a 3 dans le champ
QTE de A.

OK.

Maintenant, et c'est là que je n'ai aucune idée et que je me permets de
vous
solliciter, si après avoir généré les enregistrements dans TABLE B je
modifie à la baisse (à la hausse, ce n'est pas possible) la valeur du
champ
QTE, je ne sais pas enlever de table B les enregistrements devenus
inutiles
(les n derniers). Je ne peux pas, pour des raisons de compteur, supprimer
tous les enregistrements de Table B correspondant et les réécrire, ce qui
serait facile.

Dans l'exemple ci-dessus, si QTE=3 devient QTE=1, il faudrait supprimer
les
2 derniers enregistrements de Table B où CODE='TOTO'.


Une piste ?

A vous lire, avec un grand merci !!!