Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > Delphi > Composants VCL
Composants VCL Utilisation des différents composants VCL (Visual Component Library)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 10/01/2011, 10h03   #1
Lung
Membre Expert
 
Avatar de Lung
 
Analyste-programmeur
Inscription : mai 2002
Messages : 2 140
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Yonne (Bourgogne)

Informations professionnelles :
Activité : Analyste-programmeur
Secteur : Industrie

Informations forums :
Inscription : mai 2002
Messages : 2 140
Points : 2 358
Points : 2 358
Par défaut [D2010] Comment créer dynamiquement une TSQLStoredProc ?

Jusqu'à présent, j'utilisais sans problème la TStoredProc du BDE sous Delphi 6 (avec Oracle 10g).
Code :
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
function ProduitEphemere(const szRacinePdt, szFinitPdt: String; Database: TDatabase): Integer;
var
   StoredProc: TStoredProc;
begin
   Result := 0;
   StoredProc := TStoredProc.Create(nil);
   try
      StoredProc.DatabaseName := Database.DatabaseName;
      StoredProc.StoredProcName := 'EST_UN_PRODUIT_EPHEMERE';
      StoredProc.Params.CreateParam(ftString, 'pRACINE_PDT', ptInput);
      StoredProc.Params.CreateParam(ftString, 'pFINIT_PDT', ptInput);
      StoredProc.Params.CreateParam(ftFloat, 'Résultat', ptResult);
      try
         StoredProc.ParamByName('pRACINE_PDT').AsString := szRacinePdt;
         StoredProc.ParamByName('pFINIT_PDT').AsString := szFinitPdt;
         StoredProc.ExecProc;
         Result := StoredProc.ParamByName('Résultat').AsInteger;
      except
         on E: Exception do
         begin
            // Erreur ...
            Exit;
         end;
      end;
   finally
      StoredProc.Free;
   end;
end;
Je commence à développer sous Delphi 2010, et je passe aux composants DBExpress.
Code :
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
function ProduitEphemere(const szRacinePdt, szFinitPdt: String; SQLConnection: TSQLConnection): Integer;
var
   SQLStoredProc: TSQLStoredProc;
begin
   Result := 0;
   SQLStoredProc := TSQLStoredProc.Create(nil);
   try
      SQLStoredProc.SQLConnection := SQLConnection;
      SQLStoredProc.StoredProcName := 'EST_UN_PRODUIT_EPHEMERE';
      SQLStoredProc.Params.CreateParam(ftString, 'pRACINE_PDT', ptInput);
      SQLStoredProc.Params.CreateParam(ftString, 'pFINIT_PDT', ptInput);
      SQLStoredProc.Params.CreateParam(ftFMTBcd, 'Result', ptResult);
      try
         SQLStoredProc.ParamByName('pRACINE_PDT').AsString := szRacinePdt;
         SQLStoredProc.ParamByName('pFINIT_PDT').AsString := szFinitPdt;
         SQLStoredProc.ExecProc;
         Result := SQLStoredProc.ParamByName('Result').AsInteger;
      except
         on E: Exception do
         begin
            // Erreur ...
            Exit;
         end;
      end;
   finally
      SQLStoredProc.Free;
   end;
end;
Et là, j'ai une erreur :
Citation:
"EST_UN_PRODUIT_EPHEMERE" : Le nombre réel de paramètres (4) a dépassé le nombre en cours de paramètres de procédure stockée (3). Désactivez la propriété de composant ParamCheck ou vérifiez le contenu de la liste de paramètres
J'ai donc ajouté SQLStoredProc.ParamCheck := False;, et j'obtiens une erreur PL/SQL. La fonction plante, car elle a reçu le contenu du deuxième paramètre dans le premier, et rien dans le deuxième.

Que faut-il faut faire pour créer convenablement ces paramètres ?

__________________
L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.
______________________________________________________________________________________________

Delphi 6#2 Entreprise - Delphi 2010 Architecte - Delphi XE2 Entreprise
Win XP Pro - OpenGL 2.1 - Oracle 11g - Firebird 2.5.0.2
Écrivez dans un français correct !!
Lung est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 10h41   #2
ShaiLeTroll
Expert Confirmé Sénior
 
Avatar de ShaiLeTroll
 
Homme
Développeur C++\Delphi
Inscription : juillet 2006
Messages : 9 202
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Développeur C++\Delphi
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : juillet 2006
Messages : 9 202
Points : 13 255
Points : 13 255
Que contient "Params" avant d'en Créer ?
Il n'ajouterait pas un paramètre Result par Défaut ?
un petit Clear() par prudence même si avec un objet créé à la volée ça ne devrait pas être utilse

as-tu essayé des variantes sur ptResult et ptOutput ?
ftFMTBcd est-il correctement supporté ?
__________________
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !

L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Halte à la ségrégation des Cinémas, VO sur Paris, VF en Banlieue, Abonnement résilié !
ShaiLeTroll est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 12h46   #3
Linkin
Membre Expert
 
Inscription : août 2002
Messages : 1 073
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : août 2002
Messages : 1 073
Points : 1 285
Points : 1 285
Par défaut (comportement Delphi 7), quand tu affectes le nom de la procédure stockée, l'objet récupère la liste des paramètres.

Par contre, le souci que j'ai eu (avec oracle 11g), c'est que j'ai dû passer par les indices (Params[0]), parce qu'avec FieldByName ça ne passait pas le bon paramètre. (alors que ça fonctionne avec Oracle 9i).

Je ne sais pas quels comportements sont imputables à l'ancienneté de mon Delphi. J'espère avoir pu aider.
__________________
Delphi 7
Windows XP/Vista
Linkin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 14h32   #4
Lung
Membre Expert
 
Avatar de Lung
 
Analyste-programmeur
Inscription : mai 2002
Messages : 2 140
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Yonne (Bourgogne)

Informations professionnelles :
Activité : Analyste-programmeur
Secteur : Industrie

Informations forums :
Inscription : mai 2002
Messages : 2 140
Points : 2 358
Points : 2 358
Citation:
Envoyé par ShaiLeTroll Voir le message
Que contient "Params" avant d'en Créer ?
Params.Count vaut 0.

Citation:
Envoyé par ShaiLeTroll Voir le message
Il n'ajouterait pas un paramètre Result par Défaut ?
Si je ne créé pas le paramètre Result, il ne voit plus la procédure comme une fonction (semble t'il):
Citation:
PLS-00221: 'EST_UN_PRODUIT_EPHEMERE' is not a procedure or is undefined
Citation:
Envoyé par ShaiLeTroll Voir le message
un petit Clear() par prudence même si avec un objet créé à la volée ça ne devrait pas être utilse
Ca ne change rien.

Citation:
Envoyé par ShaiLeTroll Voir le message
as-tu essayé des variantes sur ptResult et ptOutput ?
Quel que soit le type du paramètre, si je le change en ptOutput j'obtiens l'erreur :
Citation:
Erreur DBX : Précision non valide


Citation:
Envoyé par ShaiLeTroll Voir le message
ftFMTBcd est-il correctement supporté ?
C'est à dire ?
Je ne l'utilise que parce qu'en conception, c'est le type qu'il choisit pour ce paramètre (quand je pose une SQLStoredProc en conception).

__________________
L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.
______________________________________________________________________________________________

Delphi 6#2 Entreprise - Delphi 2010 Architecte - Delphi XE2 Entreprise
Win XP Pro - OpenGL 2.1 - Oracle 11g - Firebird 2.5.0.2
Écrivez dans un français correct !!
Lung est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 14h37   #5
Lung
Membre Expert
 
Avatar de Lung
 
Analyste-programmeur
Inscription : mai 2002
Messages : 2 140
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Yonne (Bourgogne)

Informations professionnelles :
Activité : Analyste-programmeur
Secteur : Industrie

Informations forums :
Inscription : mai 2002
Messages : 2 140
Points : 2 358
Points : 2 358
Citation:
Envoyé par Linkin Voir le message
Par défaut (comportement Delphi 7), quand tu affectes le nom de la procédure stockée, l'objet récupère la liste des paramètres.
Aaaaaarg !!
Tu as raison. Ca les récupère tout seul.
(depuis ce matin, que je suis dessus)

Code :
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
function ProduitEphemere(const szRacinePdt, szFinitPdt: String; SQLConnection: TSQLConnection): Integer;
var
   SQLStoredProc: TSQLStoredProc;
begin
   Result := 0;
   SQLStoredProc := TSQLStoredProc.Create(nil);
   try
      SQLStoredProc.SQLConnection := SQLConnection;
      SQLStoredProc.StoredProcName := 'EST_UN_PRODUIT_EPHEMERE';
      try
         SQLStoredProc.ParamByName('pRACINE_PDT').AsString := szRacinePdt;
         SQLStoredProc.ParamByName('pFINIT_PDT').AsString := szFinitPdt;
         SQLStoredProc.ExecProc;
         Result := SQLStoredProc.ParamByName('Result').AsInteger;
      except
         on E: Exception do
         begin
            // Erreur ...
            Exit;
         end;
      end;
   finally
      SQLStoredProc.Free;
   end;
end;
Citation:
Envoyé par Linkin Voir le message
Par contre, le souci que j'ai eu (avec oracle 11g), c'est que j'ai dû passer par les indices (Params[0]), parce qu'avec FieldByName ça ne passait pas le bon paramètre. (alors que ça fonctionne avec Oracle 9i).
Avec Delphi 2010 et Oracle 10g, je peux les appeler par leur nom sans problème.

pour votre aide.
__________________
L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.
______________________________________________________________________________________________

Delphi 6#2 Entreprise - Delphi 2010 Architecte - Delphi XE2 Entreprise
Win XP Pro - OpenGL 2.1 - Oracle 11g - Firebird 2.5.0.2
Écrivez dans un français correct !!
Lung est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2012, 16h03   #6
thomaser
Invité de passage
 
Inscription : juin 2006
Messages : 3
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 3
Points : 2
Points : 2
bonjour,

est ce que je peux avoir le code (ou l’entête) de ta procédure car je me suis inspiré de ton code mais ça ne marche pas

j'ai fais ma procédure comme ça
Code :
1
2
3
4
5
6
7
8
9
create or replace procedure EST_UN_PRODUIT_EPHEMERE (
pRACINE_PDT in  varchar2,
pFINIT_PDT in varchar2, 
Résultat out varchar2 ) 
is 
begin
  Résultat := '12';
  ...
end;/
thomaser est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2012, 17h01   #7
ShaiLeTroll
Expert Confirmé Sénior
 
Avatar de ShaiLeTroll
 
Homme
Développeur C++\Delphi
Inscription : juillet 2006
Messages : 9 202
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Développeur C++\Delphi
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : juillet 2006
Messages : 9 202
Points : 13 255
Points : 13 255
Déjà 'Result' est un entier dans l'extrait de code de Lung !

Et ta démarche est étrange, on commence plutôt par créer la fonction doit l'on a besoin avec les paramètres nécessaires puis l'on fait le code d'appel

Sinon, ce sujet étant , ce n'est pas pratique de le poursuivre en posant une nouvelle question !
__________________
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !

L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Halte à la ségrégation des Cinémas, VO sur Paris, VF en Banlieue, Abonnement résilié !
ShaiLeTroll est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2012, 18h35   #8
thomaser
Invité de passage
 
Inscription : juin 2006
Messages : 3
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 3
Points : 2
Points : 2
Désolé d'avoir polluer
Le problème était que dans Delphi je passais les paramètres en tant qu'entier.
J'ai tout mis en type string et ça marche.
merci.
thomaser est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 03h11.


 
 
 
 
Partenaires

Hébergement Web