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

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Gérer des requêtes très longues

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Gérer des requêtes très longues

n°2089633
clements42
Posté le 15-07-2011 à 18:37:25  profilanswer
 

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.

mood
Publicité
Posté le 15-07-2011 à 18:37:25  profilanswer
 

n°2089675
billgatesa​nonym
Posté le 16-07-2011 à 13:17:35  profilanswer
 

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).

n°2089742
clements42
Posté le 16-07-2011 à 22:43:34  profilanswer
 

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
n°2089750
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 17-07-2011 à 08:44:42  profilanswer
 

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)
n°2089757
billgatesa​nonym
Posté le 17-07-2011 à 11:48:45  profilanswer
 

@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
n°2089763
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 17-07-2011 à 12:53:47  profilanswer
 

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)
n°2101788
otobox
Maison fondée en 2005
Posté le 16-09-2011 à 08:02:39  profilanswer
 

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
n°2102443
SuppotDeSa​Tante
Aka dje69r
Posté le 20-09-2011 à 14:55:06  profilanswer
 

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 !
n°2102507
otobox
Maison fondée en 2005
Posté le 20-09-2011 à 19:08:12  profilanswer
 

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

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

  Gérer des requêtes très longues

 

Sujets relatifs
gérer des "like"fusionner le résultat de deux requêtes MySQL [Résolu]
Bloqué sur des requetes SQL basiques dans AccessOptimiser le temps de réponse de mes requetes HQL
gerer des calques flash avec un seul bouton en asLogs PostgreSQL et valeurs des paramètres des requêtes loggées
[PHP] Utiliser 2 requêtes SQL dans 1 boucle ?aide en requêtes BD et EJB
[ACCESS] Problème jointure entre requêtesRassembler résultats de 2 requetes sql
Plus de sujets relatifs à : Gérer des requêtes très longues


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