Gérer des requêtes très longues

Gérer des requêtes très longues - VB/VBA/VBS - Programmation

Marsh Posté le 15-07-2011 à 18:37:25    

bonjour, voici mon soucis
 
je dois faire une requête insert dans une base access. Soucis, elle ne fonctionne pas. Ce qui est surprenant, c'est que VB ne me donne aucun message d'erreur, je constate kiste après coup que la table reste désespérément vide.
malheureusement celle-ci est très longue, la table comportant 130 champs.  
 
voici la requête, juste pour vous donner un aperçu  [:bighead]  

Spoiler :

sql = "insert into resultatJoueurAmisco " & _
 
                      " values (" & idJoueur & "," & idMatch & "," & Cells(4, 2) & "," & Cells(4, 3) & "," & Cells(4, 4) & "," & Cells(5, 2) & "," & Cells(5, 3) & "," & Cells(5, 4) & "," & Cells(6, 2) & "," & Cells(6, 3) & "," & Cells(6, 4) & "," & Cells(7, 2) & "," & Cells(7, 3) & "," & Cells(7, 4) & "," & Cells(8, 2) & "," & Cells(8, 3) & "," & Cells(8, 4) & "," & Cells(9, 2) & "," & Cells(9, 3) & "," & Cells(9, 4) & "," & Cells(12, 2) & "," & Cells(12, 3) & "," & Cells(12, 4) & "," & Replace(Cells(13, 2), ",", "." ) & "," & Replace(Cells(13, 3), ",", "." ) & "," & Replace(Cells(13, 4), ",", "." ) & "," & _
 
                      "" & Cells(14, 2) & "," & Cells(14, 3) & "," & Cells(14, 4) & "," & Replace(Cells(15, 2), ",", "." ) & "," & Replace(Cells(15, 3), ",", "." ) & "," & Replace(Cells(15, 4), ",", "." ) & "," & Cells(16, 2) & "," & Cells(16, 3) & "," & Cells(16, 4) & "," & Replace(Cells(17, 2), ",", "." ) & "," & Replace(Cells(17, 3), ",", "." ) & "," & Replace(Cells(17, 4), ",", "." ) & "," & Cells(18, 2) & "," & Cells(18, 3) & "," & Cells(18, 4) & "," & Replace(Cells(19, 2), ",", "." ) & "," & Replace(Cells(19, 3), ",", "." ) & "," & Replace(Cells(19, 4), ",", "." ) & "," & Cells(20, 2) & "," & Cells(20, 3) & "," & Cells(20, 4) & "," & _
 
                      "" & Cells(21, 2) & "," & Cells(21, 3) & "," & Cells(21, 4) & "," & Cells(23, 2) & "," & Cells(23, 3) & "," & Cells(23, 4) & "," & Cells(24, 2) & "," & Cells(24, 3) & "," & Cells(24, 4) & "," & Replace(Cells(25, 2), ",", "." ) & "," & Replace(Cells(25, 3), ",", "." ) & "," & Replace(Cells(25, 4), ",", "." ) & ",'" & Format(Cells(26, 2), "hh:mm" ) & "','" & Format(Cells(26, 3), "hh:mm" ) & "','" & Format(Cells(26, 4), "hh:mm" ) & "'," & Cells(27, 2) & "," & Cells(27, 3) & "," & Cells(27, 4) & "," & Cells(28, 2) & "," & Cells(28, 3) & "," & Cells(28, 4) & "," & Replace(Cells(29, 2), ",", "." ) & "," & Replace(Cells(29, 3), ",", "." ) & "," & Replace(Cells(29, 4), ",", "." ) & "," & _
                      "" & Cells(31, 2) & "," & Cells(31, 3) & "," & Cells(31, 4) & "," & Cells(32, 2) & "," & Cells(32, 3) & "," & Cells(32, 4) & "," & Replace(Cells(33, 2), ",", "." ) & "," & Replace(Cells(33, 3), ",", "." ) & "," & Replace(Cells(33, 4), ",", "." ) & "," & Cells(34, 2) & "," & Cells(34, 3) & "," & Cells(34, 4) & "," & Cells(35, 2) & "," & Cells(35, 3) & "," & Cells(35, 4) & "," & Replace(Cells(36, 2), ",", "." ) & "," & Replace(Cells(36, 3), ",", "." ) & "," & Replace(Cells(36, 4), ",", "." ) & "," & Cells(37, 2) & "," & Cells(37, 3) & "," & Cells(37, 4) & "," & _
 
                      "" & Cells(38, 2) & "," & Cells(38, 3) & "," & Cells(38, 4) & "," & Replace(Cells(39, 2), ",", "." ) & "," & Replace(Cells(39, 3), ",", "." ) & "," & Replace(Cells(39, 4), ",", "." ) & "," & Int(Cells(42, 2)) & "," & Int(Cells(42, 3)) & "," & Int(Cells(42, 4)) & "," & Int(Cells(43, 2)) & "," & Int(Cells(43, 3)) & "," & Int(Cells(43, 4)) & ",'" & Format(Cells(44, 2), "hh:mm" ) & "','" & Format(Cells(44, 3), "hh:mm" ) & "','" & Format(Cells(44, 4), "hh:mm" ) & "'," & Int(Cells(45, 2)) & "," & Int(Cells(45, 3)) & "," & Int(Cells(45, 4)) & "," & Cells(46, 2) & "," & Cells(46, 3) & "," & Cells(46, 4) & "," & Int(Cells(47, 2)) & "," & Int(Cells(47, 3)) & "," & Int(Cells(47, 4)) & "," & Cells(48, 2) & "," & Cells(48, 3) & "," & Cells(48, 4) & " )"


 
ma question : quelles sont les bonnes méthodes de travail lorsqu'il s'agit de gérer des requetes de telles longueurs ? c'est très long à écrire, et encore plus chiant à débugguer quand il y a un problème comme dans mon cas.
 
Merci d'avance.

Reply

Marsh Posté le 15-07-2011 à 18:37:25   

Reply

Marsh Posté le 16-07-2011 à 13:17:35    

Bonjour,
 
J'ai déjà fait des requêtes plus longues que celle-là.
Donc, je ne crois pas que ce soit ça qui pose le problème.
Il faudrait débugguer en récupérant cette longue chaine, par exemple avec un MsgBox(sql), et en la testant comme étant une requête autonome.
Une autre manière de débugguer serait de faire des essais avec une chaine dont on aurait enlevé certains morceaux (par exemple les dates et heures qui posent souvent des problèmes).

Reply

Marsh Posté le 16-07-2011 à 22:43:34    

salut,
 
j'affiche évidemment la chaine dans une msgbox, et à sa lecture, je ne vois rien qui cloche...
 
je tente de la récupérer dans le presse papier la chaine avec l'outil Clipboard, mais ça ne marche pas. Je souhaiterais la tester directement dans Access, qui fournit des messages d'erreurs plus explicites.

Message cité 1 fois
Message édité par clements42 le 16-07-2011 à 23:50:09
Reply

Marsh Posté le 17-07-2011 à 08:44:42    

clements42 a écrit :

salut,
 
j'affiche évidemment la chaine dans une msgbox, et à sa lecture, je ne vois rien qui cloche...
 
je tente de la récupérer dans le presse papier la chaine avec l'outil Clipboard, mais ça ne marche pas. Je souhaiterais la tester directement dans Access, qui fournit des messages d'erreurs plus explicites.


il faudrait prendre l'habitude de ne pas débugger à la MessageBox, mais de logger dans un fichier texte les messages d'erreur...


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 17-07-2011 à 11:48:45    

@Harkonnen
Pourquoi ne pas utiliser MsgBox si ça peut rendre service de temps en temps ?
(Et ce n'est pas MessageBox quand on utilise le VB, vous n'avez pas dû passer autant de centaines d'heures que moi sur le VB.)  
 
S'il vous plait, que vous soyez modérateur, ou non, arrêtez de critiquer les interventions de ceux qui répondent !
Cela donne une mauvaise ambiance à ce forum, comme cela a déjà été signalé plusieurs fois.
On n'est pas dans une cour de récréation, où les gros bras font la loi. On a le droit de s'exprimer pour donner une solution, même si ce n'est peut-être pas la solution optimum.
Dans d'autres sections de ce forum (par exemple Windows, Mobiles, etc), il y a beaucoup moins de personnes qui critiquent les autres, et l'ambiance y est plus agréable.
 
Quoi qu'il en soit, pour ma part, je continuerai d'essayer d'aider tous ceux qui posent des questions, malgré les critiques.
 
@clements42
C'est vrai qu'il est très dommage que MsgBox ne permette pas le copier/coller.
 
Mais déjà, cela montre la chaîne s'affiche entièrement, qu'il n'y a pas la limite sur la longueur à laquelle vous pensiez.
 
Regardez bien, c'est obligatoirement un petit problème à l'intérieur de cette chaîne de caractères.
 
Ou bien, tester en prenant une chaine moins longue. Vous verrez qu'un qu'une petite chaîne passe. Puis, vous ajoutez quelques champs, etc. jusqu'à finir par trouver quel morceau de la requête pose un problème.

Message cité 1 fois
Message édité par billgatesanonym le 17-07-2011 à 11:49:49
Reply

Marsh Posté le 17-07-2011 à 12:53:47    

billgatesanonym a écrit :

@Harkonnen
Pourquoi ne pas utiliser MsgBox si ça peut rendre service de temps en temps ?
(Et ce n'est pas MessageBox quand on utilise le VB, vous n'avez pas dû passer autant de centaines d'heures que moi sur le VB.)  
 
S'il vous plait, que vous soyez modérateur, ou non, arrêtez de critiquer les interventions de ceux qui répondent !
Cela donne une mauvaise ambiance à ce forum, comme cela a déjà été signalé plusieurs fois.
On n'est pas dans une cour de récréation, où les gros bras font la loi. On a le droit de s'exprimer pour donner une solution, même si ce n'est peut-être pas la solution optimum.
Dans d'autres sections de ce forum (par exemple Windows, Mobiles, etc), il y a beaucoup moins de personnes qui critiquent les autres, et l'ambiance y est plus agréable.
 
Quoi qu'il en soit, pour ma part, je continuerai d'essayer d'aider tous ceux qui posent des questions, malgré les critiques.


wowowow, du calme hein, mon intervention n'était nullement ici pour critiquer [:cosmoschtroumpf]
Je dis que débugger à la MessageBox (fonction native de Win32, qui est appelée par le MsgBox du VB) est très mal parce que :
- on en prend vite l'habitude, et du coup on en met partout. Et après on a le client qui nous appelle en disant "c'est quoi ce message bizarroïde qui apparaît quand je clique sur mon joli bouton ?". Tu l'auras compris, à force de mettre des MessageBox, on a vite fait d'en laisser une ou deux en production. Alors que le fichier de trace est bien plus discret et surtout non intrusif pour le client.
- les infos de la MessageBox ne sont pas pérennes : elle disparaît une fois qu'on a cliqué sur OK, et pour peu qu'on ait cliqué trop rapidement ou par erreur sans lire le message, c'est tout le processus de debug qui est à refaire. Et si le bug est difficilement reproductible, c'est autant de temps perdu pour récupérer des infos qui seraient figées dans le marbre avec une trace fichier.
- pour récupérer les infos de la MessageBox, c'est soit par capture d'écran, soit par recopie manuelle du message. Pas de copier/coller possible. Vachement pratique [:bien].
- la MessageBox est modale. Elle prend directement le focus une fois qu'elle apparait, et on ne remarque pas forcément de suite qu'elle est là. Donc si tu as continué à utiliser ton clavier pendant que la MessageBox était à l'écran, t'es bon pour tout retaper.
 
Bref le debug à la MessageBox est tout, sauf pro. A éviter autant que possible. Surtout avec la facilité de mise en place de fichiers de trace.


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 16-09-2011 à 08:02:39    

Bon, alors deux propositions pour réduire ton code :
1) il semble que tu vas chercher des valeur dans Excel. Alors au lieu de mettre cells(x,y), qui qui est lourd et rallonge le code, ne peux-tu pas donner directement un nom explicit à tes cellules dans Excel ?
2) tu utilises sans compter la fonction Replace(Cells(x, y), ",", "." ), ne peux-tu pas faire une fonction dédiée avec un nom plus simple et qui te donnerait comme code appellant : Rpl(MaCellule), MaCellule étant le nom que tu as donné à ta cellule dans Excel.


---------------
OtObOxBlOg - - - Etre seul à avoir tort  c'est plus difficile, mais c'est bien plus beau que d'avoir raison avec une bande de cons
Reply

Marsh Posté le 20-09-2011 à 14:55:06    

Et Harkonnen ne fait peut etre pas de VB mais il a raison. On ne passe pas par un msgbox pour debuguer. On utilise debug.print, là on récupere notre chaine, on peut copier/coller etc. Et comme son nom l'indique, c'est fait pour. Et c'est la meme chose qu'un trace.
 
clements42, si tu nous montrais ton tableau Excel, je suis sur que d'une ca serait beaucoup plus parlant, et de deux... hum... beaucoup plus parlant :D
Ensuite, comme le souligne otobox tu utilises la fonction Replace qui ne sert au final qu'a remplacer une virgule par un point. Je ne vois pas à quoi ca sert si tu as définis la virgule comme separateur décimal. Si tel est le cas, Excel ou Access même combat et pas besoin de faire tout ca...
Ensuite tu fais des Int() sur tout ou presque. Es-tu sur que tes cellules contiennent des nombres ? Mais meme souci, je ne vois pas à quoi ca sert etant donné que tu fais un replace() du separateur décimal avant...
 
Edit : ensuite pour simplifier la requete, je ferais tout simplement une boucle qui boucle ( :whistle: ) sur le numéro de ligne et le numéro de colonne.
Ensuite tu parles de 130 champs, alors que tes données sources ne sont que sur 4 colonnes...

Message cité 1 fois
Message édité par SuppotDeSaTante le 20-09-2011 à 15:05:34

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 20-09-2011 à 19:08:12    

SuppotDeSaTante a écrit :

Et Harkonnen ne fait peut etre pas de VB mais il a raison. On ne passe pas par un msgbox pour debuguer. On utilise debug.print, là on récupere notre chaine, on peut copier/coller etc. Et comme son nom l'indique, c'est fait pour. Et c'est la meme chose qu'un trace.

 

clements42, si tu nous montrais ton tableau Excel, je suis sur que d'une ca serait beaucoup plus parlant, et de deux... hum... beaucoup plus parlant :D
Ensuite, comme le souligne otobox tu utilises la fonction Replace qui ne sert au final qu'a remplacer une virgule par un point. Je ne vois pas à quoi ca sert si tu as définis la virgule comme separateur décimal. Si tel est le cas, Excel ou Access même combat et pas besoin de faire tout ca...
Ensuite tu fais des Int() sur tout ou presque. Es-tu sur que tes cellules contiennent des nombres ? Mais meme souci, je ne vois pas à quoi ca sert etant donné que tu fais un replace() du separateur décimal avant...

 

Edit : ensuite pour simplifier la requete, je ferais tout simplement une boucle qui boucle ( :whistle: ) sur le numéro de ligne et le numéro de colonne.
Ensuite tu parles de 130 champs, alors que tes données sources ne sont que sur 4 colonnes...


Sans compter que si une conversion virgule->point est nécessaire, elle pourrait être lancée sur tous les champs avant de faire la requête, ainsi plus la peine d'en tenir compte pour la suite.


Message édité par otobox le 20-09-2011 à 19:08:49

---------------
OtObOxBlOg - - - Etre seul à avoir tort  c'est plus difficile, mais c'est bien plus beau que d'avoir raison avec une bande de cons
Reply

Sujets relatifs:

Leave a Replay

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