Eliminer doublons d'une table avec condition sur un champ

Eliminer doublons d'une table avec condition sur un champ - SQL/NoSQL - Programmation

Marsh Posté le 21-10-2006 à 09:45:05    

Salut encore moi :hello:  
 
J’ai une table Controle_qualite dans laquelle les operateurs entrent les informations concernant les pieces examinees. La structure est la suivante :
 
PieceID          Ligne_production      defaut_ID     la_date
 
chaque piece examinee peut etre sans defaut (dans ce cas, on entre un defautID= ‘GOOd’), ou avoir un ou plusieurs defauts. Par contre des fois les mauvaises informations sont rentrees. Pour la meme piece, on peut trouver un enregistrement où la piece est bonne et un autre enregistrement pour avec un code de defaut. J’essaie de créer un code qui s’il trouve dans la table 2 enregistrements pour la meme piece et que pour l’un des enregistrements defautID=’GOOD’, qu’il supprime cette enregistrement
 
J’ai essaye de le faire avec le code suivant :
 
Dim ra, autre as recordset
Set ra = CurrentDb.OpenRecordset("Controle_qualite", dbOpenDynaset)
ra.MoveFirst
Do Until ra.EOF
Set autre = CurrentDb.OpenRecordset("select * from Controle_qualite where Controle_qualite.ProduitID='" & ra!ProduitID & "'", dbOpenDynaset)
If autre.RecordCount = 1 Or autre.RecordCount = 0 Then
    ra.MoveNext
Else
    Do Until autre.EOF
    autre.MoveFirst
    If (autre!defautID <> ra! defautID And autre!scan_date = re!scan_date And And autre!ligne_production= ra! ligne_production) Then
        If ra! defautID = "GOOD" And autre! defautID <> " GOOD " Then
            ra.Delete
        Else
            If autre! defautID = " GOOD " And ra! defautID <> " GOOD " Then
                autre.Delete
            Else
            autre.MoveNext
            End If
        End If
    Else
        autre.MoveNext
    End If
    Loop
End If
ra.MoveNext
Loop
End Sub
 
Ca donne l’erreur « aucun enregistrement en cours » quand j’execute le code. Quelqu’un a une idee comment faire ?
 
Merci d’avance encore :jap:  

Reply

Marsh Posté le 21-10-2006 à 09:45:05   

Reply

Marsh Posté le 21-10-2006 à 13:18:18    

Bonjour,
dans :

Citation :

If autre.RecordCount = 1 Or autre.RecordCount = 0 Then  
    ra.MoveNext  
Else


 
retires le ra.movenext qui est redondant avec celui qui précède le loop
Cordialement
 
Une question: est-ce le code exact ou le code réécrit sur le post?
parce que je vois re!scan_date re n'existe pas
 
ou encore:
Do Until autre.EOF  
    autre.MoveFirst
 
ce qui laisse supposer que l'on va tourner en rond
 
la séquence suivante mène à un pb:
 

Citation :

 If (autre!defautID <> ra! defautID And autre!scan_date = re!scan_date And And autre!ligne_production= ra! ligne_production) Then  
        If ra! defautID = "GOOD" And autre! defautID <> " GOOD " Then  
            ra.Delete


  en effet ra.delete   supprime le record en cours et lorsque l'on remonte sur le if ra!....., le record n'existe plus!!!  
 
de plus les noms de champs  
 
PieceID          Ligne_production      defaut_ID     la_date  
 
ne sont pas tout à fait ceux du module!!
@+


Message édité par seniorpapou le 21-10-2006 à 15:38:37
Reply

Marsh Posté le 22-10-2006 à 09:02:59    

Bonjour,
En regardant à nouveau ton code, je crains fort qu'il ne faille repenser le tout et trouver quelque chose de moins compliqué.
Cordialement

Reply

Marsh Posté le 22-10-2006 à 09:55:53    

Quelque chose comme ça :
 

Code :
  1. delete from Controle_qualite cq1
  2. where cq1.defautID = 'GOOD'
  3. and exists (select 1 from Controle_qualite cq2 where cq2.PieceID = cq1.PieceID and cq2.defautID <> 'GOOD');

Reply

Marsh Posté le 22-10-2006 à 10:49:22    

Bonjour Beegee,
oui, juste que bouboute veut que ce soit pour "PieceID et ligne_ production et scan-date" identiques
Cordialement
 
edit: bouboute_24


Message édité par seniorpapou le 22-10-2006 à 11:05:45
Reply

Marsh Posté le 22-10-2006 à 11:11:27    

Code :
  1. delete from Controle_qualite cq1
  2. where cq1.defautID = 'GOOD'
  3. and exists (select 1
  4.             from Controle_qualite cq2
  5.             where cq2.PieceID = cq1.PieceID
  6.             and cq2.ligne_production = cq1.ligne_production
  7.             and cq2.scan-date = cq1.scan_date
  8.             and cq2.defautID <> 'GOOD');

Reply

Marsh Posté le 30-10-2006 à 02:23:13    

Merci Beegee,
 
Je viens d'essayer le code et ca marche parfaitement bien

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed