requete SQL sur champs listés via Tabledef Fields

requete SQL sur champs listés via Tabledef Fields - VB/VBA/VBS - Programmation

Marsh Posté le 04-09-2007 à 16:52:31    

Bonjour,
 
J'intègre des fichiers texte dans une Base access via un code VBA.
Ces fichiers contiennent des lignes blanches que je souhaiterais supprimer via du SQL dans mon code VB.
Cependant je ne connais pas le nom des champs du moins je fais comme ci je ne les connais pas car ces noms de champs pourraient changer dans le futur donc je souhaite avoir un code souple qui cherche et les noms des champs et suppriment les lignes pours lesquels toutes les valeurs des champs sont vides.
Je liste l'ensemble des champs via ce code:
 
                Dim t As TableDef, tablo() As String
                Dim i As Byte, n As Byte, bd As Database
                Set bd = CurrentDb
                Set t = bd.TableDefs(Tablecible)
                n = t.Fields.Count
                ' Remplissage du tableau
                ReDim tablo(n)
                For i = 0 To n - 1
                    tablo(i) = t.Fields(i).Name
                Next i
                Set t = Nothing
                Set bd = Nothing
                ' Affichage du contenu de tableau
                For i = 0 To n - 1 ' ou UBound(tablo)
                    Debug.Print tablo(i)
                Next i
 
Là je bloque je ne vois pas du tout comment rédiger une reqête SQL qui va pouvoir dire "pour chaque ligne entièrement vide alors je la supprime"!
 
Auriez vous une idée?
 
Merci d'avance!!
 
 :bounce:  
 
 
 
 
 

Reply

Marsh Posté le 04-09-2007 à 16:52:31   

Reply

Marsh Posté le 04-09-2007 à 18:27:56    

Personne n'a d'idée ou je suis vraiment pas clair pour un sou (ce qui est tout à fait possible!!)

Reply

Marsh Posté le 04-09-2007 à 21:38:29    

Il faut utiliser un objet recordset pour lire le contenu de ta table.
Les exemples ne manquent pas sur ce forum et les sites consacrés à VB6 ou Access.
Cet objet recordset permet de naviguer dans les enregistrements, via index ou pas, de mettre à jour les valeurs ou supprimer les enregistrements (cf documentation en ligne aussi).
 
Pour savoir quel enregistrement supprimer, tu peux concaténer les valeurs de tous tes champs et si le résultat est un ensemble plus ou moins long de caractères blancs, alors c'est un enregistrement à supprimer.
 
À affiner si les lignes blanches ne sont pas tout à fait blanches (caractères spéciaux, genre tabulation, ASCII 0, ...)
 
Quand on joue avec la suppression d'enregistrements, il faut faire attention à la boucle de lecture de ceux-ci, et commencer par la fin, ou utiliser deux tables (lecture d'un côté, écriture dans une autre)

Reply

Marsh Posté le 05-09-2007 à 10:10:21    

Salut,
 
Je suis en train d'essayer d'envoyer ma table dans un recordset mais j'ai un message d'erreur me disant qu'il n'y a pas de table existante (celle qu eje mets dans la requete SQL:
 
DoCmd.TransferText acImportDelim, "masque d'import des fichiers d'habilitations SAP", Tablecible, FULL_ADDRESS
                'récupération de tous les champs de la table pour pouvoir ensuite sélectionner les lignes dont tous les champs sont nuls dans le but de les supprimer
                Dim t As TableDef, tablo() As String
                Dim i As Byte, n As Byte, bd As Database
                Set bd = CurrentDb
                Set t = bd.TableDefs(Tablecible)
                n = t.Fields.Count
                ' Remplissage du tableau
                ReDim tablo(n)
                For i = 0 To n - 1
                    tablo(i) = t.Fields(i).Name
                Next i
                Set t = Nothing
                Set bd = Nothing
                ' Affichage du contenu de tableau
                For i = 0 To n - 1 ' ou UBound(tablo)
                    Debug.Print tablo(i)
                Next i
                 
                Dim Rst As DAO.Recordset
                Dim Db As DAO.Database
                Set Db = CurrentDb()
               
                Set Recordset = Db.OpenRecordset("Select * From (Tablecible)" )
 
Tablecible est la variable qui contient le nom de ma table, c'est surment de la que vient le problème. J'ai essayé avec "Tablecible", 'Tablecible' et (Tablecible) mais rien ne passe que dois je faire.
Et une fois que ca va passer, comment puis concatener les données de mes champs par ligne sachant que je ne connais pas le nom des champs (mon code dans le post au dessus me permet quand même de lister ces champs).
 
Merci du coup de main, j'arrive au bout de ce code et ca va le faire une fois que j'arriverai à supprimer ces lignes vides de ma tabla access!
 
Merci beaucoup!
 

Reply

Marsh Posté le 05-09-2007 à 10:15:48    

Ca y est le recordset marche avec simplement:
Set Rst = Db.OpenRecordset(Tablecible)
 
 

Reply

Marsh Posté le 05-09-2007 à 11:36:22    

Bon j'arrive à supprimer toutes les lignes de ma table
 
avec  
               Dim Rst As DAO.Recordset
                Dim Db As DAO.Database
                                 
               Set Db = CurrentDb()
                 
                 
               Set Rst = Db.OpenRecordset(Tablecible)
                Rst.MoveFirst
               While Not Rst.EOF
                    Rst.Delete
                    Rst.MoveNext
                 
                Wend
 
Je bug vraiment sur la sélection de lignes vides et leur concanténation.
Mes champs sont dans un tablo(i) en mémoire mais je ne vois pas comment faire une requéte de sélection ou de concanténation à partir de ces champs mis en mémoire dans un tableau?
 
Any idea

Reply

Marsh Posté le 05-09-2007 à 12:19:25    

TEGU j'ai reussi! Merci de ton aide ! Je te montre ma soluce et dis moi juste si tu penses que je peux l'optimiser! Merci encore pour les pistes!
 
DoCmd.TransferText acImportDelim, "masque d'import des fichiers d'habilitations SAP", Tablecible, FULL_ADDRESS
                'récupération de tous les champs de la table pour pouvoir ensuite sélectionner les lignes dont tous les champs sont nuls dans le but de les supprimer
                Dim t As TableDef, tablo() As String
                Dim i As Byte, n As Byte, bd As Database
                Set bd = CurrentDb
                Set t = bd.TableDefs(Tablecible)
                n = t.Fields.Count
                ' Remplissage du tableau
                ReDim tablo(n)
                For i = 0 To n - 1
                    tablo(i) = t.Fields(i).Name
                Next i
                Set t = Nothing
                Set bd = Nothing
                ' Affichage du contenu de tableau
                For i = 0 To n - 1 ' ou UBound(tablo)
                    Debug.Print tablo(i)
                Next i
                 
                Dim Rst As DAO.Recordset
                Dim Db As DAO.Database
                Dim TESTING As String
                 
                TESTING = ""
                Set Db = CurrentDb()
                 
                Set Rst = Db.OpenRecordset(Tablecible)
                 
                Rst.MoveFirst
                 
                While Not Rst.EOF
                             
                             
                    For i = 0 To n - 1
                    TESTING = TESTING & Rst.Fields(i)
                    Next i
                     
                    If TESTING = "" Then
                    Rst.Delete
                    End If
                     
                    Rst.MoveNext
                    TESTING = ""
                Wend
 
@ +

Reply

Marsh Posté le 05-09-2007 à 20:46:29    

Ta boucle d'affichage de « tablo » n'est pas utile en production ; mais je suppose qu'il s'agissait ici de vérifier que les champs sont les bons.

 

Vérifie quand même que tous les enregistrements que tu dois supprimer le sont bien.
Je ne me souviens plus exactement du comportement des recordset, mais il y a un risque de décalage quand tu fais un .Delete (qui supprimerait puis se positionnerait automatiquement sur le suivant), puis un .MoveNext.
Si certains enregistrements perdurent alors qu'ils devraient être supprimés, il te faut commencer ta boucle par un .MoveLast, itérer par des .MovePrevious et la finir par « While not rs.BOF »
Mais peut-être que je confonds avec autre chose.

 

En tout cas, félicitations pour ton boulot.

 


Message édité par tegu le 05-09-2007 à 20:47:01
Reply

Marsh Posté le 06-09-2007 à 11:30:38    

J'ai fait des tests et aucune donnée n'est perdue!
Merci encore et @ + sur le forum!!

Reply

Sujets relatifs:

Leave a Replay

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