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

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

[VB/TSQL/SQL-Server] Mes questions sur les Procédures stockées

n°1568138
Kirvel
WOOOOH 6 MINUTES !!§!
Posté le 31-05-2007 à 17:07:08  profilanswer
 

Reprise du message précédent :
et voilà ... un test entre un VARCHAR(9) et un INT ...
Oracle ça le dérangeait pas ça ...


---------------
MyAnimeList
mood
Publicité
Posté le 31-05-2007 à 17:07:08  profilanswer
 

n°1568283
MagicBuzz
Posté le 31-05-2007 à 19:19:28  profilanswer
 

Ouais, mais Oracle faut pas trop lui faire confiance pour ce genre de choses. Il accepte un peu trop de choses à mon goût, jusqu'au jour où il prend une décision incohérence à ta place :/

n°1568423
Kirvel
WOOOOH 6 MINUTES !!§!
Posté le 01-06-2007 à 10:23:57  profilanswer
 

Ma PS est quasiment terminée, maintenant j'essaie de me faire un jeu de test pour tout mener jusqu'en prod mais je bloque sur un truc :
 
Dans ma PS je fais appel à une autre PS qui est censée me renvoyer une liste de bases dans lesquelles seront effectuées les différentes requêtes. Pour cela on lui passe des paramètres, principalement des dates, vu que les bases sont triées par mois comptable.
 
Et dans cette PS que j'appelle il y a ce passage :
 

Code :
  1. select @wamd = ( @debut * 100 ) - 1
  2. select @wamf = ( @debut + 1 ) * 100
  3. select  @liste = ( @liste +  nom_base + '+' ) from B999..smp_base_table
  4. where an_mois_comptable  between  @wamd  and   @wamf
  5. and trt_min <= @fin  and trt_max >= @fin
  6. and saisie_min < 20990000


 
Bon, en gros il fait un comparatif des dates que je lui envoie et des dates concernées par les différentes bases, et il me retourne les noms des bases dans un varchar ... Sachant que les dates que je passe en paramètres sont les variables @debut et @fin, je ne comprends pas du tout l'utilité des variable @wamd et @wamf qui en découlent et qui sont utilisées dans la requête ... A quoi servent ces 2 premières lignes, sachant que toutes les variables @debut, @fin, @wamd et @wamf sont des INT ?
 
Vu que tu as 8 ans d'expérience, j'imagine que ça doit être une astuce que tu dois connaître ;) Et si quelqu'un d'autre a une idée je suis preneur aussi :jap:
 


---------------
MyAnimeList
n°1568452
MagicBuzz
Posté le 01-06-2007 à 10:44:43  profilanswer
 

J'imagine que tes dates sont stockées sour la forme : YYYYMMDD au format entier non ?
 
@debut est au format YYYYMM non ?
 
Du coup, tu tapes mettons "200705" pour le mois de juin.
 
wamd = (200705 * 100) - 1 = 20070499 => soit le 99 avril 2007 => Soit de façon sûre et certaine, une date entre la fin avril et le début mai.
 
wamf = (200705 + 1) * 100 = 20070600 => soit le 0 juin 2007 => Soit de façon sûre et certaine, une date entre la fin de mai et le début du juin.
 
Ainsi, tu peux comparer ta date au format YYYYMMDD afin de trouver si elle rentre dans le mois en question.
 
Perso, je préfère cette représentation au format VARCHAR(8) On fait juste un " an_mois LIKE '200705%' " c'est plus compréhensible ;)

n°1568466
Kirvel
WOOOOH 6 MINUTES !!§!
Posté le 01-06-2007 à 11:00:59  profilanswer
 

Justement, le champ an_mois_comptable dans la table est aussi au format AAAAMM.
 
Est-ce qu'il saura faire la différence dans le WHERE entre les formats AAAAMM du champ an_mois_comptable et AAAAMMJJ des variables @wamd et @wamf ?
 
De plus je viens de me rendre compte que les valeurs des champs trt_min et trt_max sont très étranges ... Je vais essayer de chopper une description de la table parce que je crois que je m'en sortirai pas sans ...


---------------
MyAnimeList
n°1568475
MagicBuzz
Posté le 01-06-2007 à 11:14:41  profilanswer
 

Si le champ an_mois_comptable est au format AAAAMM ça ne devrait pas marcher...

n°1568487
Kirvel
WOOOOH 6 MINUTES !!§!
Posté le 01-06-2007 à 11:21:14  profilanswer
 

Bon, en fait il y a plusieurs boûts de code dans cette PS pour sélectionner les bases à utiliser ... et je pense que celle que j'essaye d'utiliser n'est pas la plus adaptée à mon cas. Je laisse tomber ce truc pour le moment :whistle:


---------------
MyAnimeList
n°1568492
MagicBuzz
Posté le 01-06-2007 à 11:25:04  profilanswer
 

ps : a, si...
ça peut marcher si @debut est une année

n°1568494
Kirvel
WOOOOH 6 MINUTES !!§!
Posté le 01-06-2007 à 11:27:27  profilanswer
 

MagicBuzz a écrit :

ps : a, si...
ça peut marcher si @debut est une année


mouais, raison de plus pour que ça soit pas la bonne méthode à utiliser :/


---------------
MyAnimeList
n°1570307
Kirvel
WOOOOH 6 MINUTES !!§!
Posté le 05-06-2007 à 13:35:18  profilanswer
 

Me revoilà !
 
Toujours sur cette même procédure stockée, j'ai une question au sujet de ce qu'elle retourne.
 
J'ai dans l'idée que cette PS va retourner tous les enregistrements trouvés dans tous les SELECT effectués dans la boucle WHILE. Comme on n'a pas encore vraiment eu l'occasion de tester ça, je voulais m'en assurer parce que dans l'analyseur de requêtes il me montre 1 tableau de retour différent pour chaque SELECT effectué dans le WHILE.
 
Alors ? Quelle gueule il devrait avoir mon retour ? :/


---------------
MyAnimeList
mood
Publicité
Posté le 05-06-2007 à 13:35:18  profilanswer
 

n°1570314
Kirvel
WOOOOH 6 MINUTES !!§!
Posté le 05-06-2007 à 14:00:34  profilanswer
 

Sinon j'ai vu quelqu'un qui m'a conseillé, pour éviter de me prendre la tête, de tout mettre dans une table temporaire et de retourner cette table.
 
J'ai voulu me renseigner sur l'utilisation des tables temporaires et j'ai trouvé ça :
http://www.developpez.net/forums/s [...] p?t=191218
 
Idéalement c'est ce que je voudrais faire, mais moi je passe par un exec :s C'est quoi la syntaxe à utiliser dans mon cas ? :sweat:


---------------
MyAnimeList
n°1570331
MagicBuzz
Posté le 05-06-2007 à 14:33:02  profilanswer
 

"exec" ça veut rien dire.
 
donne plus d'infos : poste ta structure complète et ce que tu veux faire.

n°1570334
Kirvel
WOOOOH 6 MINUTES !!§!
Posté le 05-06-2007 à 14:40:27  profilanswer
 

C'est bon j'ai posté dans le vent en fait, je m'en suis sorti comme un chef :D  
 
Voilà l'état actuel de ma PS pour laquelle il ne me reste qu'un seul petit problème : quand je fais un RETURN 'chaine', mon collègue n'arrive pas à récupérer la valeur 'chaine' dans son appel à ma PS, et j'ai l'impression que ça vient de moi :
 
 

Code :
  1. CREATE  PROCEDURE dbo.RQTR_INT_MISESENPAIEMENT_CR
  2. @p_NoAssure VARCHAR(9),
  3. @p_DateDeb INT,
  4. @p_DateFin INT,
  5. @p_NoLot INT,
  6. @p_NoFacture INT,
  7. @p_NoINSEE INT,
  8. @p_TypSaisie SMALLINT
  9. AS
  10. DECLARE
  11. @liste  VARCHAR(240),
  12. @excmd VARCHAR(400),
  13. @query  VARCHAR(8000),
  14. @stret  INT,
  15. @xx  VARCHAR(3),
  16. @yy  SMALLINT,
  17. @nblignes INT,
  18. @error_var INT,
  19. @rowcount_var INT
  20. SET NOCOUNT ON
  21. SET CONCAT_NULL_YIELDS_NULL OFF
  22. SET @yy = 1
  23. EXEC @stret = dbo.smp_scan_bases_on_dates 'SAISIE', @p_DateDeb, @p_DateFin, @liste OUT
  24. IF @@error <> 0
  25. RETURN 'ERREUR'
  26. PRINT @stret
  27. SET rowcount 0
  28. SET @nblignes = 0
  29. CREATE TABLE #TMP ( DATRT2 INT, DACRLO INT, DAARFS INT, NOLOT INT, NOFATI INT,
  30.   NOPOUV INT, MTSSDE INT, MTMGDE INT, MTRCDE INT, TYPSAIS SMALLINT )
  31. WHILE ( @stret >  0 )
  32. BEGIN /*  BEGIN of WHILE  */
  33. SELECT @stret = @stret - 1
  34. SELECT @xx = RTRIM ( SUBSTRING ( @liste, @yy, 3 ) )
  35. SELECT @yy = @yy +4
  36. EXEC ( 'set nocount on' )
  37. SET @query = ' SELECT
  38.    Deco.DATRT2, Deco.DACRLO, Deco.DAARFS, Deco.NOLOT, Deco.NOFATI,
  39.    Dest.NOPOUV, Dest.MTSSDE, Dest.MTMGDE, Dest.MTRCDE, Deco.TYPSAIS
  40.   FROM
  41.    (' + @xx + '..G1_DESTINATAIRE AS Dest
  42.                             INNER JOIN ' + @xx + '..G1_DECOMPTE AS Deco ON
  43.     Dest.NOSLIQ = Deco.NOSLIQ
  44.    AND Dest.DASDEC = Deco.DASDEC
  45.    AND Dest.NOLIQU = Deco.NOLIQU
  46.    AND Dest.NOGRTR = Deco.NOGRTR
  47.    AND Dest.NOLIAS = Deco.NOLIAS
  48.    AND Dest.NOORDE = Deco.NOORDE
  49.    AND Dest.NOTRLI = Deco.NOTRLI )
  50.     INNER JOIN ' + @xx + '..G1_ID_DECOMPTE AS IDD ON
  51.     Deco.NOSLIQ = IDD.NOSLIQ
  52.    AND Deco.DASDEC = IDD.DASDEC
  53.    AND Deco.NOLIQU = IDD.NOLIQU
  54.    AND Deco.NOGRTR = IDD.NOGRTR
  55.    AND Deco.NOLIAS = IDD.NOLIAS
  56.    AND Deco.NOORDE = IDD.NOORDE
  57.    AND Deco.NOTRLI = IDD.NOTRLI
  58.   WHERE
  59.     Deco.DATRT2 BETWEEN ' + STR(@p_DateDeb,8) + ' AND ' + STR(@p_DateFin,8)
  60.       + ' AND Dest.NOIDDE = ' + @p_NoAssure
  61. IF ( @p_NoINSEE IS NOT NULL ) AND ( @p_NoINSEE <> '' )
  62.  SET @query = @query + ' AND IDD.NOINSE = ' + @p_NoINSEE
  63. IF NOT ( @p_TypSaisie = 2 AND ( @p_NoLot <> '' AND @p_NoLot IS NOT NULL AND @p_NoFacture <> '' AND @p_NoFacture IS NOT NULL ) )
  64. BEGIN   -- Sinon le Type de saisie n est plus un critere de selection
  65.  SET @query = @query + ' AND ( '
  66.  IF @p_TypSaisie = 0 OR @p_TypSaisie = 2  -- Traitements automatiques
  67.  BEGIN
  68.   SET @query = @query + ' ( Deco.TYPSAIS IN (0,1) '
  69.   IF @p_Nolot <> '' AND @p_NoLot IS NOT NULL
  70.    SET @query = @query + ' AND Deco.NOLOT = ' + @p_NoLot
  71.   IF @p_NoFacture <> '' AND @p_NoFacture IS NOT NULL
  72.    SET @query = @query + ' AND Deco.NOFAC = ' + @p_NoFacture
  73.   SET @query = @query + ' ) '
  74.  END
  75.  IF @p_TypSaisie = 2
  76.   SET @query = @query + ' OR '
  77.  IF  @p_TypSaisie = 1 OR @p_TypSaisie = 2  -- Traitements manuels
  78.   SET @query = @query + ' ( Deco.TYPSAIS > 1 ) '
  79.  SET @query = @query + ' ) '
  80. END
  81. PRINT @query
  82. INSERT INTO #TMP EXEC ( @query )
  83. SELECT @error_var = @@error, @rowcount_var = @@rowcount
  84. IF @error_var <> 0
  85. BEGIN
  86.  SELECT @excmd = 'Probleme requete >> ' + RTRIM(@query) + ' <<RQTR_INT_MISESENPAIEMENT_CR '
  87.  RAISERROR ( @excmd, 16, 1 ) WITH SETERROR
  88.  DROP TABLE #TMP
  89.  RETURN 'ERREUR'
  90. END
  91. SET @nblignes = @nblignes + @rowcount_var
  92. IF @nblignes > 200
  93. BEGIN
  94.  DROP TABLE #TMP
  95.  RETURN '99'
  96. END
  97. END /* END of WHILE */
  98. IF @nblignes = 0
  99. BEGIN
  100. DROP TABLE #TMP
  101. RETURN 0
  102. END
  103. SELECT * FROM #TMP
  104. DROP TABLE #TMP
  105. GO


Message édité par Kirvel le 05-06-2007 à 14:41:25

---------------
MyAnimeList
n°1570355
MagicBuzz
Posté le 05-06-2007 à 15:12:49  profilanswer
 

une procédure ne retourne rien.
 
donc pas de "return".
 
si tu veux que ça retourne quelquechose, alors fait une function. par contre, tu ne peux pas faire de table temporaire dans une fonction. ceci dit, tu peux retourner une table avec une fonction, dans ce cas, cette table s'utilise comme une variable (pas de # mais un @ en préfixe)
 
si tu veux que ta procédure retourne quelquechose, il faut lui passer un paramètre en mode "output" et le remplir dans ta ps.

n°1570364
Kirvel
WOOOOH 6 MINUTES !!§!
Posté le 05-06-2007 à 15:20:17  profilanswer
 

MagicBuzz a écrit :

une procédure ne retourne rien.
 
donc pas de "return".
 
si tu veux que ça retourne quelquechose, alors fait une function. par contre, tu ne peux pas faire de table temporaire dans une fonction. ceci dit, tu peux retourner une table avec une fonction, dans ce cas, cette table s'utilise comme une variable (pas de # mais un @ en préfixe)
 
si tu veux que ta procédure retourne quelquechose, il faut lui passer un paramètre en mode "output" et le remplir dans ta ps.


 
Pourtant dans d'autres procédures stockées déjà utilisées par notre composant VB j'ai vu "RETURN 0" ou "RETURN 99" sans paramètre OUTPUT :??:  
Mais ce que tu me dis me paraît logique, je vais essayer de triffouiller un paramètre OUTPUT dans tout c'merdier


---------------
MyAnimeList
n°1570397
MagicBuzz
Posté le 05-06-2007 à 15:59:11  profilanswer
 

tu peux mettre un "return", mais "normalement" il ne sert à rien. en fait, il va effectivement retourner une valeur, qui peut être utilisée comme un ERRORLEVEL : 0 tout s'est bien passé. autre valeur, erreur numéro X
mais c'est très crade de bosser comme ça. on gère les erreurs proprement en faisant un raise d'erreur, et on retourne des valeurs proprement en utilisant des paramètres output, ou une fonction ;)


Message édité par MagicBuzz le 05-06-2007 à 16:00:30
n°1570402
Kirvel
WOOOOH 6 MINUTES !!§!
Posté le 05-06-2007 à 16:04:03  profilanswer
 

Et voilà ce qui se passe quand on se pose trop de questions : on bosse dessus, puis quand tu vas demander à notre responsable on nous répond "ah ben non vous le gérez pas ça"
 
Du coup maintenant quand c en erreur je renvoie "Nothing", quand y a rien je renvoie un ResSet vide, et quand y a trop de lignes et ben j'balance tout quand même, comme une oie qu'on gave :o
 
C'est beau l'informatique ...


---------------
MyAnimeList
n°1570408
Kirvel
WOOOOH 6 MINUTES !!§!
Posté le 05-06-2007 à 16:08:59  profilanswer
 

tant que j'y suis, comment on force la sortie d'un while ? (genre EXIT WHILE)
 
EDIT : réponse = BREAK
 
Décidemment chuis trop balèze. Merci pour tes réponses encore une fois MagicBuzz :jap:


Message édité par Kirvel le 05-06-2007 à 16:35:40

---------------
MyAnimeList
n°1575008
Kirvel
WOOOOH 6 MINUTES !!§!
Posté le 14-06-2007 à 16:14:08  profilanswer
 

Re !
 
En faisant le transfert de connaissance avant ma fin de mission (demain), on m'a conseillé d'utiliser un exec sp_executesql plutôt qu'un exec à ligne 97 de la dernière PS que j'ai postée.
 
Le truc c'est que j'arrive pas à chopper la syntaxe à utiliser.
 
En gros on veut que j'utilise ça au cas où un autre module fasse appel à ma PS et m'envoie des variables avec des simple-quotes dans les paramètres en CHAR et VARCHAR (@p_NoAssure en l'occurence ici), ça permettrait à ma procédure d'être plus dynamique ...
 
Bref, j'essaye divers appels mais ça marche po
 
exemples :
INSERT INTO #TMP EXEC ( sp_executesql @query )
INSERT INTO #TMP EXEC ( ' EXEC sp_executesql ' + @query )
INSERT INTO #TMP EXEC ( 'sp_executesql' + @query )
 
rien de tout ça ne marche et j'ai pas envie de perdre du temps là-dessus vu que ma mission se termine demain ... HELP PLZ (MagicBuzz je sais que tu es là)


---------------
MyAnimeList
n°1575032
MagicBuzz
Posté le 14-06-2007 à 16:50:18  profilanswer
 

aucune idée :D

n°1575305
Kirvel
WOOOOH 6 MINUTES !!§!
Posté le 15-06-2007 à 09:39:23  profilanswer
 

Merde :/
Faut que ça soit fait pour ce midi, j'ai intérêt à trouver ça vite fait ... ou pas :sarcastic:


---------------
MyAnimeList
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
Problème d'authentification pour accès à une base SQL[SQL] Afficher les 10 derniers
[SQL Server] - fusionner fichiers MDF et NDFaffichage requete SQL
[SQL] Suppression multi tablesexporter des données excel dans une base SQL existante
SQL 7 compatible Windows XP SP2 ?[noob]SQL server : Quel est le meilleur langage pour ce connecter ??
Plus de sujets relatifs à : [VB/TSQL/SQL-Server] Mes questions sur les Procédures stockées


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)