[Access] Ligne vide

Résolu/Fermé
SilverM-A Messages postés 82 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 10 avril 2011 - 30 juil. 2009 à 21:24
Le Pingou Messages postés 12187 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 14 novembre 2024 - 5 août 2009 à 18:35
Bonjour,

j'aimerais savoir comment faire pour filtrer les lignes vides dans une requête. Je m'explique!

Je possède plusieurs requête, avec aucun code behind, qui permet de faire la conversion de mes données d'un table. Cependant, lors de l'importation, mon fichier CSV peut contenir des lignes vides. Lors de l'exécution de ma première requête, il se produit un erreur d'incompatibilité sur les lignes vides. J'ai tenté de filtrer les lignes vides avec la fonction IsEmpty(), mais cela ne fonctionne pas.

Avez-vous une solution pour moi? Je vous rappelle que je ne touche aucunement au VBA, seulement par Query Access 2007.

Merci :)

31 réponses

Le Pingou Messages postés 12187 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 14 novembre 2024 1 449
31 juil. 2009 à 21:59
Bonjour,
Merci pour vos informations.

Entre temps, j’ai fait le tour du problème.

Lorsqu’il n’y a aucune ligne vide le fonctionnement est correct.

Par contre la ligne vide, c’est à dire sans valeur pour les champs au format numérique ce qui engendre une erreur lors d’une opération sur ses champs et provoque le message : Type de données incompatible dans l’expression du critère (exemple : le calcul de cette expression [Puissance: 117*(10*Val([DonneesBrutes]![AnlgIn1])/100)^2] est impossible car le champ [AnlIn1] est vide donc texte d’ou erreur.)

Je vous conseille de supprimer les lignes vides de la table lors de l’importation des données et ainsi le problème sera réglé.
Une idée pour réaliser cette opération, vous importez les données dans une table temporaire et ensuite il vous suffit de recopier les lignes non vides dans la table de travail à l'aide d'un requête ajout; dont voici le code SQL:
INSERT INTO DonneesBrutes ( [Date], Heure, DigIn2, AnlgIn1, FreqIn1, FreqIn3, FreqIn4, FreqDiff2 )
SELECT T_Temporaire.Date, T_Temporaire.Heure, T_Temporaire.DigIn2, T_Temporaire.AnlgIn1, T_Temporaire.FreqIn1, T_Temporaire.FreqIn3, T_Temporaire.FreqIn4, T_Temporaire.FreqDiff2
FROM T_Temporaire
WHERE (((T_Temporaire.Date)<>IsEmpty([T_Temporaire]![Date])));

1
Le Pingou Messages postés 12187 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 14 novembre 2024 1 449
31 juil. 2009 à 16:27
Bonjour,
Pouvez-vous poster le code de votre requête!
0
SilverM-A Messages postés 82 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 10 avril 2011 76
31 juil. 2009 à 16:38
Voici le code sql derrière ma requête
SELECT DonneesBrutes.Date, DonneesBrutes.Heure, 117*(10*Val([DonneesBrutes]![AnlgIn1])/100)^2 AS Puissance, DonneesBrutes.FreqIn3, IIf(Val([DonneesBrutes]![FreqIn3])=0,0,IIf(Val([DonneesBrutes]![FreqIn3])<3.229,(-0.1095*(Val([DonneesBrutes]![FreqIn3])^2)+2.9318*Val([DonneesBrutes]![FreqIn3])-0.1412)*0.48037,IIf(Val([DonneesBrutes]![FreqIn3])<54.362,(0.0052*(Val([DonneesBrutes]![FreqIn3])^2)+2.198*Val([DonneesBrutes]![FreqIn3])+1.1091)*0.48037,0))) AS VitesseVent, DonneesBrutes.FreqIn1
FROM DonneesBrutes
WHERE (((Val([DonneesBrutes]![FreqDiff2])) Between 0 And 360) AND ((Val([DonneesBrutes]![DigIn2])) Between 0 And 1) AND ((Val([DonneesBrutes]![DigIn3])) Between 0 And 1) AND ((Val([DonneesBrutes]![AnlgIn1])) Between 0 And 100))
GROUP BY DonneesBrutes.Date, DonneesBrutes.Heure, 117*(10*Val([DonneesBrutes]![AnlgIn1])/100)^2, DonneesBrutes.FreqIn3, IIf(Val([DonneesBrutes]![FreqIn3])=0,0,IIf(Val([DonneesBrutes]![FreqIn3])<3.229,(-0.1095*(Val([DonneesBrutes]![FreqIn3])^2)+2.9318*Val([DonneesBrutes]![FreqIn3])-0.1412)*0.48037,IIf(Val([DonneesBrutes]![FreqIn3])<54.362,(0.0052*(Val([DonneesBrutes]![FreqIn3])^2)+2.198*Val([DonneesBrutes]![FreqIn3])+1.1091)*0.48037,0))), DonneesBrutes.FreqIn1, DonneesBrutes.AnlgIn1, IsDate([DonneesBrutes]![Heure]), IsDate([DonneesBrutes]![Date]), IsEmpty([DonneesBrutes]![DigIn2]), IsEmpty([DonneesBrutes]![DigIn3]), IsEmpty([DonneesBrutes]![AnlgIn1]), IsEmpty([DonneesBrutes]![FreqIn4]), IsEmpty([DonneesBrutes]![FreqIn3])
HAVING (((IsDate([DonneesBrutes]![Heure]))=-1) AND ((IsDate([DonneesBrutes]![Date]))=-1) AND ((IsEmpty([DonneesBrutes]![DigIn2]))=False) AND ((IsEmpty([DonneesBrutes]![DigIn3]))=False) AND ((IsEmpty([DonneesBrutes]![AnlgIn1]))=False) AND ((IsEmpty([DonneesBrutes]![FreqIn4]))=False) AND ((IsEmpty([DonneesBrutes]![FreqIn3]))=False) AND ((Val([DonneesBrutes]![FreqIn3]))>="0") AND ((Val([DonneesBrutes]![FreqIn1]))>="0"));


La partie importante étant:
HAVING (((IsDate([DonneesBrutes]![Heure]))=-1) AND ((IsDate([DonneesBrutes]![Date]))=-1) AND ((IsEmpty([DonneesBrutes]![DigIn2]))=False) AND ((IsEmpty([DonneesBrutes]![DigIn3]))=False) AND ((IsEmpty([DonneesBrutes]![AnlgIn1]))=False) AND ((IsEmpty([DonneesBrutes]![FreqIn4]))=False) AND ((IsEmpty([DonneesBrutes]![FreqIn3]))=False) AND ((Val([DonneesBrutes]![FreqIn3]))>="0") AND ((Val([DonneesBrutes]![FreqIn1]))>="0"));


Ca semble tout tassé, j'espère que ça te donnera pas trop mal à la tête haha :P

Merci à toi !
0
Le Pingou Messages postés 12187 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 14 novembre 2024 1 449
31 juil. 2009 à 17:18
Bonjour,
Je pense qu’il faut introduire un critère pour filtrer les vides dans la condition [WHERE] se basant sur le champ [Heure] de la table [DonneesBrutes].
La condition [WHERE] devient :

WHERE (([DonneesBrutes]![Heure])<>"vide") AND (((Val([DonneesBrutes]![FreqDiff2])) Between 0 And 360) AND ((Val([DonneesBrutes]![DigIn2])) Between 0 And 1) AND ((Val([DonneesBrutes]![DigIn3])) Between 0 And 1) AND ((Val([DonneesBrutes]![AnlgIn1])) Between 0 And 100)))


La partie [Having] devra-être adapter, je n’ai pas la possibilité de tester ….

Note: selon votre concept il est possible que vous devez le faire sous la clause [HAVING] à la place de [WHERE] !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SilverM-A Messages postés 82 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 10 avril 2011 76
31 juil. 2009 à 17:40
J'ai toujours la même erreur!

"Data type mismatch in criteria expression".

Et si je retire les lignes vides, ma requête fonctionne à merveille. Je n'y comprend plus rien :(
0
Le Pingou Messages postés 12187 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 14 novembre 2024 1 449
31 juil. 2009 à 18:46
Bonjour,
Sans la structure de la base c'est difficile de trouvé.
Vous est-il possible de compacter la base de la compresser en ZIP et de la mettre sur https://www.cjoint.com/
Si confidentiel, la struture avec au moins 10 lignes de la table concernée.
--

Salutations.
Jean-Pierre
0
SilverM-A Messages postés 82 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 10 avril 2011 76
31 juil. 2009 à 18:59
En effet, c'est confidentiel, mais la structure est très simple.

Table DonneesBrutes:
No - autonumber
Date- date/time
Heure - date-time
DigIn2 - number
DigIn3 - number
AnlgIn1 - text
FreqIn1 - text
FreqIn3 - text
FreqIn4 - text
FreqDiff2 - number

Et je possède la requête 01-Conversion 1, qui elle tente de convertir les données brutes qui se situe dans la table DonneesBrutes.

Voilà, je ne crois pas avoir besoin de t'envoyer mon projet confidentiel pour cela :P

Voilà quelques lignes si tu désires faire des tests :)
				AnlgIn1	FreqIn1	FreqIn3	FreqIn4	
				[%]	[Hz]	[Hz]	[Hz]	
								
				AnlgIn1	FreqIn1	FreqIn3	FreqIn4	
				[%]	[Hz]	[Hz]	[Hz]	
2009-02-06	00:00:00	1	0	0.1	0.0	0.0	0.0	40320
2009-07-06	00:00:00	1	1	0.1	0.0	1.3	1.3	44
2009-05-29	00:00:00	1	0	0.1	0.0	0.0	0.0	189
2009-08-06	00:00:00	1	1	0.1	0.0	2.1	0.0	2944

Le fait est que je rassemble plusieurs fichiers ensembles et je désire retirer l'entête. Pour les lignes d'entête, ça va, mais c'est la ligne vide qui cause problème.

Merci énormément de passer du temps sur mon problème :D !!!

P.S.: Dans les données que je t'ai données, tu devrais avoir seulement les 2 lignes de données du milieu. Si tu n'as pas d'erreur de "data type mismatch in criteria epression" c'est déjà un grand pas :D

P.S.2: les entêtes de colonnes sont décalés de 2 colonnes vers la gauche, désolé!
0
Le Pingou Messages postés 12187 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 14 novembre 2024 1 449
31 juil. 2009 à 18:59
Bonjour,
C'est vraiment étonnant, j'ai essayez de reconstituer la base avec la table sur la base du code SQL et j'ai introiduit des données et des lignes vides et tout marche super...!
Je suis curieux de voir la structure de votre base pour comparaison !
0
SilverM-A Messages postés 82 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 10 avril 2011 76
31 juil. 2009 à 19:00
C'est peut-être le type de données dans la table qui cause problème alors ???
0
Le Pingou Messages postés 12187 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 14 novembre 2024 1 449
31 juil. 2009 à 21:15
Bonsoir,
Je découvre à l'instant votre message (6).
Je vais regarder se qui se passe par rapport à mon essai.
Petite question: pour les lignes vides cela veut bien dire aucune valeures (pas de zéro dans les champs numérique) Oui ou Non ?
0
SilverM-A Messages postés 82 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 10 avril 2011 76
31 juil. 2009 à 21:32
Ligne vide signifie qu'il n'y a aucune valeur. Donc je ne sais pas, est-ce que la valeur Access est une valeur de type Empty, de type Null, aucune idée.

Mais ... pour répondre à votre question, non, ligne vide signifie que tout est vide. Donc même les types numériques sont vide, et non zéro. Vide = blanc toute la ligne = aucune valeur !! Bien entendu puisque j'ai un auto incrément sur le champ No, et bien j'ai simplement un nombre dans cette colonne qui est, champ unique.
0
SilverM-A Messages postés 82 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 10 avril 2011 76
31 juil. 2009 à 22:08
Merci beaucoup!!! Infiniment!

Maintenant y a-t-il une façon de retirer les lignes vides dans Access sans l'usage de code VBA ? Mon importation se fait via Access. Existe-t-il une option qui permet de faire cette opération ?

À moins qu'il me soit possible lors du "merge" de mes nombreux fichiers, mais je ne crois pas. L'assemblage se fait via un fichier BAT avec la simple commande :

copy *.csv Global.csv

Donc je ne crois pas possible la suppression de ligne vide via commande BAT.
0
Le Pingou Messages postés 12187 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 14 novembre 2024 1 449
31 juil. 2009 à 22:19
Bonsoir,
On s'est croisé, regardez encore une fois le poste 11....
Au fait mon exemple : https://www.cjoint.com/?hFwwnZ1P8X
0
SilverM-A Messages postés 82 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 10 avril 2011 76
31 juil. 2009 à 22:25
Haha :P Quelques minutes après mon "post", je me suis justement dit: " Je pourrais faire une autre requête pour filtrer les lignes vides"

Ton exemple reviens pas mal au même.

Encore une fois, merci infiniment !!! Merci d'avoir pris le temps de reconstruire le problème. Tu es génial ! merci encore :)
0
Le Pingou Messages postés 12187 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 14 novembre 2024 1 449
31 juil. 2009 à 22:54
Merci, de rien.
0
SilverM-A Messages postés 82 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 10 avril 2011 76
4 août 2009 à 22:20
Salut Jean-Pierre le pingou,

j'ai tenté de régler mon problème à nouveau. J'ai fais une requête préalable à ma conversion. Celle-ci est parfaite, elle retire tout les lignes vides et les lignes d'entête de fichier. Génial !!

Cependant le problème est que je rencontre la même erreur lorsque j'exécute ma requête de conversion. Pourtant, j'ai belle et bien tout mis mes références vers ma nouvelle requête plutôt que vers ma table de données.

Voici le code sql de mes requêtes:

001-Filtre Entête:
SELECT DonneesBrutes.Date, DonneesBrutes.Heure, DonneesBrutes.DigIn2, DonneesBrutes.DigIn3, DonneesBrutes.AnlgIn1, DonneesBrutes.FreqIn1, DonneesBrutes.FreqIn3, DonneesBrutes.FreqIn4, DonneesBrutes.FreqDiff2
FROM DonneesBrutes
WHERE (((IsDate([DonneesBrutes]![Heure]))=-1) AND ((IsDate([DonneesBrutes]![Date]))=-1) AND ((IsEmpty([DonneesBrutes]![DigIn2]))=False) AND ((IsEmpty([DonneesBrutes]![DigIn3]))=False) AND ((IsEmpty([DonneesBrutes]![AnlgIn1]))=False) AND ((IsEmpty([DonneesBrutes]![FreqIn4]))=False) AND ((IsEmpty([DonneesBrutes]![FreqIn3]))=False));


01-Conversion 1:
SELECT [001-Filtre Entête].Date, [001-Filtre Entête].Heure, 117*(10*Val([001-Filtre Entête]![AnlgIn1])/100)^2 AS Puissance, [001-Filtre Entête].FreqIn3, IIf(Val([001-Filtre Entête]![FreqIn3])=0,0,IIf(Val([001-Filtre Entête]![FreqIn3])<3.229,(-0.1095*(Val([001-Filtre Entête]![FreqIn3])^2)+2.9318*Val([001-Filtre Entête]![FreqIn3])-0.1412)*0.48037,IIf(Val([001-Filtre Entête]![FreqIn3])<54.362,(0.0052*(Val([001-Filtre Entête]![FreqIn3])^2)+2.198*Val([001-Filtre Entête]![FreqIn3])+1.1091)*0.48037,0))) AS VitesseVent, [001-Filtre Entête].FreqIn1
FROM [001-Filtre Entête]
WHERE (((Val([001-Filtre Entête]![FreqDiff2])) Between 0 And 360) AND ((Val([001-Filtre Entête]![DigIn2])) Between 0 And 1) AND ((Val([001-Filtre Entête]![DigIn3])) Between 0 And 1) AND ((Val([001-Filtre Entête]![AnlgIn1])) Between 0 And 100))
GROUP BY [001-Filtre Entête].Date, [001-Filtre Entête].Heure, 117*(10*Val([001-Filtre Entête]![AnlgIn1])/100)^2, [001-Filtre Entête].FreqIn3, IIf(Val([001-Filtre Entête]![FreqIn3])=0,0,IIf(Val([001-Filtre Entête]![FreqIn3])<3.229,(-0.1095*(Val([001-Filtre Entête]![FreqIn3])^2)+2.9318*Val([001-Filtre Entête]![FreqIn3])-0.1412)*0.48037,IIf(Val([001-Filtre Entête]![FreqIn3])<54.362,(0.0052*(Val([001-Filtre Entête]![FreqIn3])^2)+2.198*Val([001-Filtre Entête]![FreqIn3])+1.1091)*0.48037,0))), [001-Filtre Entête].FreqIn1, [001-Filtre Entête].AnlgIn1
HAVING (((Val([001-Filtre Entête]![FreqIn3]))>="0") AND ((Val([001-Filtre Entête]![FreqIn1]))>="0"));


Merci !!!
0
Le Pingou Messages postés 12187 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 14 novembre 2024 1 449
4 août 2009 à 23:35
Bonjour,
Vous est-il possible de mettre votre travail (selon poste 16) directement sur ma base exemple [SilverM-A_ccm.accdb] que je vous ai envoyé et mettre le tout sur www.cjoint.com se qui m'évitera de reconstruire vos requêtes.
Ce sera plus facile de vous aider.
Merci pour le MP.

Note : merci de mentionner le libellé du message d'erreur.
0
SilverM-A Messages postés 82 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 10 avril 2011 76
5 août 2009 à 15:13
Désoler du retard pour la réponse!

Mon fichier semble beaucoup plus volumineux que la limite de 1024ko de cjoint. Il m'est donc impossible de l'envoyer :S Je vais essayer un autre moyen!

Mais je me demandais pourquoi tu n'utiliserais pas le fichier que tu m'avais envoyé dans le post 13 ???

Merci encore !
0
Le Pingou Messages postés 12187 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 14 novembre 2024 1 449
5 août 2009 à 15:24
Bonjour,
Point 1, vous ouvrez votre base et la compacter puis fermer.
Point 2, vous compresser le fichier en ZIP ou RAR

Mais je me demandais pourquoi tu n'utiliserais pas le fichier que tu m'avais envoyé dans le post 13 ???
Eh bien tout simplement parce ce que mon fichier n'est pas la réplique exacte du votre sur lequel se produit la faute.
---

Salutations.
Jean-Pierre
0
SilverM-A Messages postés 82 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 10 avril 2011 76
5 août 2009 à 15:28
J'avais déjà essayé de zipper mon fichier mais la limite était encore peu élevé pour mon fichier. Le compact à marcher cependant ;)

https://www.cjoint.com/?ifpAA2Wiil

J'espère que le tout à bien fonctionné et que vous pourrez m'aider.
0