requete SQL sur champs listés via Tabledef Fields - VB/VBA/VBS - Programmation
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!!)
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)
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!
Marsh Posté le 05-09-2007 à 10:15:48
Ca y est le recordset marche avec simplement:
Set Rst = Db.OpenRecordset(Tablecible)
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
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
@ +
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.
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!!
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!!