Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1272 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  requete SQL sur champs listés via Tabledef Fields

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

requete SQL sur champs listés via Tabledef Fields

n°1608171
guiguisb
Enlèves tes doigts de ton nez!
Posté le 04-09-2007 à 16:52:31  profilanswer
 

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:  
 
 
 
 
 

mood
Publicité
Posté le 04-09-2007 à 16:52:31  profilanswer
 

n°1608214
guiguisb
Enlèves tes doigts de ton nez!
Posté le 04-09-2007 à 18:27:56  profilanswer
 

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

n°1608271
tegu
Posté le 04-09-2007 à 21:38:29  profilanswer
 

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)

n°1608376
guiguisb
Enlèves tes doigts de ton nez!
Posté le 05-09-2007 à 10:10:21  profilanswer
 

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!
 

n°1608377
guiguisb
Enlèves tes doigts de ton nez!
Posté le 05-09-2007 à 10:15:48  profilanswer
 

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

n°1608426
guiguisb
Enlèves tes doigts de ton nez!
Posté le 05-09-2007 à 11:36:22  profilanswer
 

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

n°1608466
guiguisb
Enlèves tes doigts de ton nez!
Posté le 05-09-2007 à 12:19:25  profilanswer
 

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
 
@ +

n°1608678
tegu
Posté le 05-09-2007 à 20:46:29  profilanswer
 

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
n°1608819
guiguisb
Enlèves tes doigts de ton nez!
Posté le 06-09-2007 à 11:30:38  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  requete SQL sur champs listés via Tabledef Fields

 

Sujets relatifs
Importer dans Access 2007 un MCD de PowerAMC en fichier requêtes SQLRequête SQL "complexe"
sqlplus: pb format colonne dans un fichier texte issu d'une requête[MySQL] UPDATE d'un champs à partir d'une autre table
rédation d'un SQL bien durDuplication de tables entre MSDE et SQL server 2000
[SQL Server] Retrouver le login / mot de passe du serveurProb de lancement d'une requete
PB REQUETE SQL POUR SE LOGGER SUR MON SITE 
Plus de sujets relatifs à : requete SQL sur champs listés via Tabledef Fields


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR