|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 300 ![]() |
Bonjour à tous,
Je ne sais pas trop comment présenté le problème de manière claire et concise donc je vais rentrer directement dans le vif du sujet ^^. Actuellement, il existe une base de donnée nommée GIFTCARD et qui contient cette table : Code :
Et jusqu'ici, aucun souci. Maintenant, pour une demande particulière, j'ai besoin d'avoir un record par bon/carte. J'ai donc créé une DB de test qui contient la table suivante : Code :
Sur base d'exemples trouvés sur divers forum et sur le site de MSDN, j'ai écrit le code suivant : Code :
Je dois bien avouer que c'est la première fois que j'utilise ce genre d'instruction dans sql server. Mes actions se limitent en général à des requêtes classiques. Pourriez-vous donc m'aider à débugger ce bout de code afin que je puisse alimenter ma table tbTest ? Voilà, j'espère avoir données toutes les informations nécessaires. Merci d'avance, Griftou. |
||||||
|
|
00
|
|
|
#2 | ||
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 300 ![]() |
Bon, ça m'apprendra à faire des trucs sans trop comprendre le pourquoi du comment...
En approfondissant, je me suis rendu compte que mon curseur ne lisait que la première ligne de la requête de sélection. J'ai modifié comme ci-dessous et ça a l'air de fonctionné. Code :
|
||
|
|
00
|
|
|
#3 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour
Il serait plus simple de vous passer de votre curseur et de votre boucle. Ce serait en outre plus performant. Il vous suffit pour cela de créer (ou générer à la volée) une table de nombres couvrant l'ensemble de vos barcode, et de faire un jointure dessus |
|
|
00
|
|
|
#4 |
![]() ![]() Administrateur de base de données Inscription : août 2007 Messages : 1 158 ![]() |
Lorsque vous dites pour une demande particuliere, est ce que cette demande concerne l'historique aussi ?
Si oui, je vous suggererais d'utiliser une CTE recursive pour generer vos barcodes. Concernant la creation d'une nouvelle table, est ce que l'impact est limite ? Sinon une idee serait de fixer barcode min = barcode max et de reutiliser la meme table, ce qui pourrait a mon sens eviter trop de changement colateraux (apres ca depend de votre temps et de l'impact potentiel). Suite a cela, vous pourrez supprimer vos rows ou barcode min est different de barcode max - pour autant qu'il n'y ai pas eu de lot de 1 vendu. A verifier. |
|
|
00
|
|
|
#5 | ||
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 300 ![]() |
Bonjour,
Déjà, merci de vous intéresser à mon problème :-) Par contre, il faut savoir que je suis plutôt débutant. Du coup, même si je vois ce qu'est une CTE et si j'en ai déjà utilisé une fois ou deux, je ne vois pas comment l'utiliser pour le cas qui m'occupe. Citation:
Citation:
Au passage, le code que j'avais posté ne portait que sur un type de bons/cartes (ceux dont le barcode commence par 24501) et me servait de test. Avec ce code, pas de souci. Par contre après, j'ai donc retiré cette restriction. Tout avait l'air de bien fonctionner jusqu'à un moment où le script continuait de tourner mais plus aucun nouveau messages "1 row(s) affected" n'apparaissait. Est-ce un bug dans mon script ou bien l'onglet message de management studio à une limite de ligne qu'il ne peut dépasser ? |
||
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
non, je pense surtout que vous entrez dans une boucle infinie car vous ne reinitialisez pas @minimum et @maximum entre deux produits.
Tel que vous le faites, il vous faudrait donc deux boucles : Celle que vous aviez dans votre premier post, englobée dans une autre boucle qui fait le fetch et l'initialisation de @minimum et @maximum pour chaque chequeAchat Pour être plus clair, une boucle pour chaque ligne de la table source, dans laquelle vous avez une boucle pour chaque ligne insérée dans la table cible. pour la génération de la table des nombres, je reviens vers vous avec un exemple que je vous laisserai adapter... |
|
|
00
|
|
|
#7 | ||
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 300 ![]() |
Code :
|
||
|
|
00
|
|
|
#8 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
En effet, je n'avais pas vu la deuxième boucle.
L'erreur vient peut etre de vos données : un barcodemin > barcodemax par exemple... voici l'exemple dont je vous parlais pour la génération des nombres. Avec ceci, vous pouvez remplacer tout votre code par une seule requete Code SQL :
|
||
|
|
00
|
|
|
#9 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Code SQL :
vos codes barre ne font-ils pas 13 caractères ??? dans votre table source, c'est du varchar(13) du coup, vous tronquez le dernier chiffre, et vos calculs sont faux. |
||
|
|
00
|
|
|
#10 | |
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 300 ![]() |
A première vue, je crois pas que votre code fonctionnerait dans mon cas (mais il y a probablement moyen de l'adapter sans trop d'effort).
Je pense cela car vous prenez min et max de barcodemin et barcodemax mais, comme je l'ai mentionné auparavant (sans trop insisté, je vous l'accorde), il y a différent type de bons et ces types sont différencié par les 5 premiers digits du barcode. Par exemple, il existe les types suivant : - 24501 - 24502 - 24503 Ce sont là les 5 premiers digits des barcodes de ces bons/cartes. Les digits suivant étant l'équivalent d'un numéro de série. Il est donc plus que certain que le range entre 245010000001 et 245010000002 ne sera pas entièrement rempli. Maintenant, j'imagine qu'il doit être possible d'adapter le code que vous avez fourni pour tenir compte de cela. EDIT : Ou alors je n'ai pas compris ce que fait exactement votre procédure ![]() Concernant votre remarque : Citation:
Deplus, même si le checkdigit était repris, celui-ci ne sert qu'à vérifier l'intégrité du barcode et ne devrait de toute façon pas être pris en compte dans les calculs. Bien à vous, |
|
|
|
00
|
|
|
#11 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
en effet, la CTE est générique.
Rien ne vous empêche de restreindre la plage aux seuls barcodes nécessaire, en ajoutant par exemple votre filtre sur le préfixe des code barres dans l'ancrage de la CTE Cependant, à part dégrader les perfs pour rien, les code barre générés en trop n'auront pas d'impact sur le résultat, puisqu'il qu'ils passeront à la trappe par la jointure interne... pour les codes sur 12 ou 13 chiffres, un petit jeu de données rendrait cela plus concret et on pourrait faire quelques tests. je pense que l'erreur vient des données en elles-memes. |
|
|
00
|
|
|
#12 | |||
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 300 ![]() |
Voici en pièce jointe un fichier contenant quelques records de la table qui nous occupe.
Entre temps, je vais tenter d'adapter votre code à mes besoins afin de tester cela. EDIT : J'ai donc fait ceci : Code :
Citation:
|
|||
|
|
00
|
|
|
#13 | |
![]() ![]() Administrateur de base de données Inscription : août 2007 Messages : 1 158 ![]() |
Citation:
Cela peut avoir des impacts sur diverses applications, autant une application live, qu'un ETL, ou qu'une application de reporting. Avec la structure actuelle de votre table, il est pourtant possible d'obtenir ce nouveau niveau de granularite, au cout d'un varchar(13) duplique. En effet, si barcodemin est egal a barcodemax, cela cree un lot de 1 objet. |
|
|
|
00
|
|
|
#14 |
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 300 ![]() |
Il n'a jamais été question de toucher à la structure de la table actuelle. La table créer n'est destinée qu'à un usage personnel et ponctuel afin de facilité l'écriture de certaines requêtes car je ne suis pas encore assez familier avec le language sql .
|
|
|
00
|
|
|
#15 |
![]() ![]() Administrateur de base de données Inscription : août 2007 Messages : 1 158 ![]() |
Autant pour moi.
Votre erreur provient d'un mauvais alignement entre vos colonnes dans votre insert et celles de votre select. |
|
|
00
|
|
|
#16 |
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 300 ![]() |
Bonjour à tous !
J'ai trouvé ce qui provoquait la boucle infinie de ma procédure avec curseur (car c'était bel et bien une boucle infinie). Pour 2 type de barcode, j'avais des records ou barcodemin était plus grand que barcodemax. Du coup, boucle infinie sur le while car le condition de sortie n'était jamais atteinte. Voilà donc un problème résolu Merci encore à tous ! |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com