IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Erreur OLEDB sur appel d'une procédure stockée, mais ok depuis le serveur Sql


Sujet :

WinDev

  1. #1
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut Erreur OLEDB sur appel d'une procédure stockée, mais ok depuis le serveur Sql
    Bonjour à toutes et tous,

    j'ai une procédure stockée qui me construit (sur demande), un échéancier des commandes clients, groupé par référence, et sur un horizon de 12 semaines glissantes.

    Je m'aperçois que cette procédure s'exécute très bien quand je l'exécute localement depuis mon serveur Sql, en revanche lorsqu'elle est appelée depuis mon appli windev j'ai systématiquement cette erreur :

    Nom : Capture.PNG
Affichages : 473
Taille : 65,1 Ko

    En cherchant un peu sur le code erreur, j'ai lu que ça pourrait être un problème de typage des données...

    Effectivement en relisant ma PS, je me suis rendu compte que je faisais des INSERT de valeurs int dans des champs de type decimal(19,6).
    Bon j'ai mis à jour, mais ça ne change rien.
    Et puis surtout je me dis que la PS s'est toujours bien exécutée en local sur le serveur, ce qui veut dire qu'elle a toujours réussi à s'affranchir ou s'arranger des problèmes de transtypage qui pouvaient exister (même si ce n'est pas bien, on est d'accord ).
    Et quand windev fait appel à la PS, ça ne devrait pas rentrer en compte, c'est juste une demande d'exécuter une procédure stockée comme une autre.

    Je vous mets ci-dessous le code de la dite procédure, j'essaye de commenter au maximum.
    Pour comprendre l'essentiel, j'ai :
    - une table vdf qui contient les articles que je souhaite suivre dans mon échéancier
    - une table ral dans laquelle le système met à jour en temps réel le reste à livrer (ral) pour un quadruplet {site, article, année, semaine}
    - des tables cc et ccl pour les commandes et leurs lignes
    - une table bl pour les bons de livraisons
    - la table trfv qui sert à gérer des tarifs de vente, mais qui ici sert uniquement à récupérer une référence client associée à un article
    - enfin la table ech qui stock l'échéancier ainsi recalculé

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    USE [GPAO]
    GO
    /****** Object:  StoredProcedure [dbo].[rebuildECHEANCIER]    Script Date: 08/11/2019 10:11:30 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[rebuildECHEANCIER]
    	-- Add the parameters for the stored procedure here
    	@site integer
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    	SET DATEFIRST 1;
     
    	DECLARE @aid int;
    	DECLARE @aujourdhui date;
    	DECLARE @semaine smallint;
    	DECLARE @annee smallint;
    	DECLARE @lundi date;
    	DECLARE @dimanche date;
    	DECLARE @fin_periode date;
    	DECLARE @i int;
    	DECLARE @first_article bit;
    	DECLARE @ref_client varchar(100);
    	DECLARE @retard decimal(19, 6);
    	DECLARE @solde decimal(19, 6);
    	DECLARE @s1 decimal(19, 6);
    	DECLARE @s2 decimal(19, 6);
    	DECLARE @s3 decimal(19, 6);
    	DECLARE @s4 decimal(19, 6);
    	DECLARE @s5 decimal(19, 6);
    	DECLARE @s6 decimal(19, 6);
    	DECLARE @s7 decimal(19, 6);
    	DECLARE @s8 decimal(19, 6);
    	DECLARE @s9 decimal(19, 6);
    	DECLARE @s10 decimal(19, 6);
    	DECLARE @s11 decimal(19, 6);
    	DECLARE @s12 decimal(19, 6);
     
    	DECLARE @livrees_semaine decimal(19, 6);
    	DECLARE @chiffre_semaine decimal(19, 6);
     
    	DECLARE @volume_periode decimal(19, 6);
    	DECLARE @chiffre_periode decimal(19, 6);
     
    	SET @first_article = 1;
    	SET @aujourdhui = GETDATE();
    	SET @lundi = DATEADD(dd, -(DATEPART(dw, @aujourdhui)-1), @aujourdhui);
    	SET @dimanche = DATEADD(dd, 6, @lundi);
     
     
    	-- SUPPRIMER LES DONNES QUI VONT ETRE REGENEREES
    	DELETE FROM ech WHERE ech_site = @site
     
     
    	-- PARCOURS DE LA TABLE VDF (qui contient les articles pour lesquels on veut l'échéancier)
    	DECLARE MyCursor CURSOR 
    	FOR 
    		SELECT vdf_article FROM vdf WHERE vdf_site = @site
    	OPEN MyCursor
    	FETCH MyCursor INTO @aid;
    	WHILE @@fetch_Status = 0
    	BEGIN
     
    		-- initialisation de la semaine de départ
    		-- pour chaque article analysé
     
    		SET @semaine = DATEPART(wk,@aujourdhui);
    		SET @annee = year(@aujourdhui);
     
     
    		-- recherche de la ref client
    		SET @ref_client = (SELECT TOP 1 trfv_article_client FROM trfv WHERE trfv_site = @site AND trfv_article = @aid AND trfv_client = 0);
    		IF @ref_client is null
    			SET @ref_client = (SELECT TOP 1 trfv_article_client FROM trfv WHERE trfv_site = @site AND trfv_article = @aid);
     
     
    		-- recherche du retard
    		SET @retard = (SELECT coalesce(sum(ral_qte), 0) FROM ral
    							WHERE ral_site = @site AND ral_article = @aid 
    							AND ((ral_annee = @annee AND ral_semaine < @semaine) OR ral_annee < @annee));
     
     
    		-- recherche des RAL de l'article pour les 12 semaines à venir
    		SET @i = 1;
    		WHILE @i <= 12
    		BEGIN
     
    			SET @solde = (SELECT coalesce(sum(ral_qte), 0) FROM ral
    							WHERE ral_site = @site AND ral_article = @aid AND ral_annee = @annee AND ral_semaine = @semaine);
     
    			IF @i = 1 SET @s1 = @solde;
    			ELSE IF @i = 2 SET @s2 = @solde;
    			ELSE IF @i = 3 SET @s3 = @solde;
    			ELSE IF @i = 4 SET @s4 = @solde;
    			ELSE IF @i = 5 SET @s5 = @solde;
    			ELSE IF @i = 6 SET @s6 = @solde;
    			ELSE IF @i = 7 SET @s7 = @solde;
    			ELSE IF @i = 8 SET @s8 = @solde;
    			ELSE IF @i = 9 SET @s9 = @solde;
    			ELSE IF @i = 10 SET @s10 = @solde;
    			ELSE IF @i = 11 SET @s11 = @solde;
    			ELSE IF @i = 12 SET @s12 = @solde;
     
     
    			SET @i = @i + 1;
     
    			SET @semaine = @semaine + 1;
    			if @semaine > 52
    			BEGIN
    				SET @semaine = 1;
    				SET @annee = @annee + 1;
    			END
     
     
    		END
     
     
    		IF @first_article > 0   -- ce traitement ne se fait qu'une seule fois, pour calculer la date du dimanche qui termine la 12ème semaine (à partir de @annee et @semaine)
    		BEGIN
    			-- mémorise la date de fin de période
    			SET @fin_periode = dateadd(dd, 6, dateadd(week, @semaine-1, dateadd (year, @annee-1900, 0)) - 4 - datepart(dw, dateadd (week, @semaine-1, dateadd (year, @annee-1900, 0)) - 4) + 1)
    			SET @first_article = 0
    		END
     
     
     
    		-- requete volume en commande et chiffre total (jusqu'à @fin_periode)
    		SET @volume_periode = 0;
    		SET @chiffre_periode = 0;
    		SELECT @volume_periode = coalesce(sum(ccl_qte_cde - ccl_qte_livree), 0), @chiffre_periode = coalesce(sum((ccl_qte_cde - ccl_qte_livree) * ccl_prix), 0) FROM ccl
    							INNER JOIN cc ON ccl_cc_id = cc_id
    							WHERE cc_site = @site AND ccl_article_id = @aid AND cc_confirme = 1 AND ccl_qte_cde > ccl_qte_livree AND ccl_fermee = 0
    							AND ccl_delai_confirme <= @fin_periode
     
     
    		-- requete volume et chiffre d'affaire pour la semaine en cours (à partir de @lundi et @dimanche calculés en début de procédure)
    		SET @livrees_semaine = 0;
    		SET @chiffre_semaine = 0;
    		SELECT @livrees_semaine = coalesce(sum(bl_qte_livree), 0), @chiffre_semaine = coalesce(sum(bl_qte_livree * bl_prix), 0) FROM bl
    							WHERE bl_site = @site AND bl_article_id = @aid AND bl_date >= @lundi AND bl_date <= @dimanche
     
     
    		-- pour chaque article, insertion dans la table ech
    		INSERT INTO ech (ech_site, ech_aid, ech_ref_client, ech_retard, ech_s1, ech_s2, ech_s3, ech_s4, ech_s5, ech_s6, ech_s7, ech_s8, ech_s9, ech_s10, ech_s11, ech_s12, ech_volume_periode, ech_chiffre_periode, ech_volume_semaine, ech_chiffre_semaine)
    				VALUES (@site, @aid, @ref_client, @retard, @s1, @s2, @s3, @s4, @s5, @s6, @s7, @s8, @s9, @s10, @s11, @s12, @volume_periode, @chiffre_periode, @livrees_semaine, @chiffre_semaine);
     
     
    		FETCH MyCursor INTO @aid;
     
    	END
    	CLOSE myCursor
    	DEALLOCATE myCursor
     
     
     
    END

    Voilà, je sais que ça ne sera pas évident de se mettre dedans, avec ma vision de l'algo, mais si vous comprenez pourquoi mon appel de cette PS depuis windev échoue, ça m'aidera grandement.

    EDIT : J'ai oublié de préciser comment j'appelle ma procédure depuis mon appli, mais bon je procède comme ça partout alors je ne sais pas si c'est utile, quoi qu'il en soit, voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ProcedureStockee est une Source de Données
     
    Sql est une chaîne = "EXECUTE [GPAO].[dbo].[rebuildECHEANCIER] @site = " + sitid + ";"
    SI PAS HExécuteRequêteSQL(ProcedureStockee,Cnx,hRequêteSansCorrection,Sql) ALORS
    	Erreur("Erreur d'initialisation de la requête"+RC+HErreurInfo() + RC + RC + Sql)
    	RETOUR
    FIN
    HLibèreRequête(ProcedureStockee)
    Salutations,

    droliprane
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  2. #2
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    Un peu d'eau à mon moulin.

    je me suis intéressé à mon objet connexion dans windev (Cnx), et j'utilise OLE DB Provider for SQL Server.

    J'ai changé pour Sql Server Native Client 11.0, recompilé mon appli et testé.

    Toujours en erreur mais message différent :

    Nom : Capture2.PNG
Affichages : 429
Taille : 102,2 Ko
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  3. #3
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    Bonjour,
    quelques news après ce weekend de 3 jours ^^
    En attendant de comprendre pourquoi ça plante, je contourne le problème en utilisant l'agent sql pour planifier une tâche qui exécutera ma procédure 1 fois par heure.
    Comme ça mon échéancier est tout le temps à jour à +/- 1 heure.
    Pensez-vous que ce soit d'avantage un problème de sql que de windev ? Auquel cas je devrais modifier l'entête de mon sujet...
    Bonne journée
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  4. #4
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Bonjour,

    Question à 2 balles : as-tu contacté le ST. Ils n'ont peut-être pas la réponse précise mais te donneront, je l'espère quelques pistes.
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  5. #5
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2003
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2003
    Messages : 942
    Points : 1 933
    Points
    1 933
    Par défaut
    Bonjour,

    Je dirai que c'est au niveau de la connexion au serveur SQL qu'il y a un problème. Voir les informations étendues de la connexion.

    Nom : 2019-11-13_16h17_47.png
Affichages : 387
Taille : 37,3 Ko
    Philippe,


    N'hésitez à lever le pouce si mon aide vous a été utile.

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/02/2011, 21h24
  2. Erreur sur execution d'une procédure stockée
    Par Loubna.B dans le forum C#
    Réponses: 6
    Dernier message: 16/07/2009, 14h24
  3. Erreur lors de l'appel d'une procédure stockée
    Par aperrin dans le forum JDBC
    Réponses: 1
    Dernier message: 04/01/2008, 13h54
  4. Réponses: 2
    Dernier message: 10/12/2004, 15h43
  5. Appel d'une procédure stockée par un vbscript
    Par NicoNours dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/10/2004, 13h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo