Forum APEX - Développement Oracle Application Express

Le site des développeurs francophones APEX - Oracle Application Express

Vous n'êtes pas identifié(e).

Annonce

Bienvenue sur le forum Oracle APEX

S'il s'agit de votre première visite, nous vous invitons à consulter la FAQ en cliquant sur le lien ci-dessous. Vous pouvez poster ici toutes vos questions sur l'installation, le développement (composants clients et serveurs), l'administration des instances Oracle APEX. Par ailleurs, ce forum diffuse les annonces et actualités relatives à Oracle APEX.

Oracle APEX 4.1

Oracle APEX 4.1 est disponible depuis le 24 août 2011.

Oracle APEX 4.0

Oracle APEX 4.0 est disponible depuis le 23 juin 2010. Il existe 2 distributions, une distribution en langue anglaise uniquement et une distribution multilingue.

#1 2011-09-05 15:27:46

apocalypse
Membre
Inscription : 2011-09-02
Messages : 16

Région de type interactive report

Bonjour,

Comme je l'ai dis dans un précédent message je débute sous APEX et je m'y perd un peu...
J'essaye d'afficher une liste suivant des infos renseignées par l'utilisateur au préalable cependant lorsque je met ce bout de code dans la source de ma région j'ai l'erreur :
"La requête ne peut pas être analysée, vérifiez-en la syntaxe. (ORA-20001: Query must begin with SELECT or WITH) ".

Quelqu'un pourrait il m'expliquer la démarche à suivre ou l'erreur ?

DECLARE
    l_selected APEX_APPLICATION_GLOBAL.VC_ARR2;
    requete vachar2(4000);
BEGIN

  l_selected := APEX_UTIL.STRING_TO_TABLE(:P_RECENCE);

  --
  -- On boucle sur les récences
  --

  FOR i IN 1..l_selected.count 
  LOOP
    if requete is null then
       requete := l_selected(i);
    else
       requete := ','||l_selected(i);
    end if;
  END LOOP;

  return 'select 
   numcli as Numéro, 
   codesexe as Sexe, 
   nom as Nom, 
   prenom as Prénom, 
   dept as Dpt,
   ad1 as Adr1, 
   ad2 as Adr2,
   pays as Pays, 
   tel as Tél,
   email as Email,
   statucli as Statut,
   recence as Récence
from :P_NOM_TABLE
where recence in (requete)';

END;

Merci

Hors ligne

#2 2011-09-05 15:59:18

admin
Administrateur
Inscription : 2010-08-02
Messages : 83

Re : Région de type interactive report

Ta requête ne peut pas fonctionner, en mettant entre quote ta requête SQL, le moteur SQL n'interprète pas les variables :P_NOM_TABLE et requete.

voici ce qu'il faut faire :

  return 'select
   numcli as Numéro,
   codesexe as Sexe,
   nom as Nom,
   prenom as Prénom,
   dept as Dpt,
   ad1 as Adr1,
   ad2 as Adr2,
   pays as Pays,
   tel as Tél,
   email as Email,
   statucli as Statut,
   recence as Récence
from' || :P_NOM_TABLE ||
'where recence in (' || requete || ')';

Hors ligne

#3 2011-09-05 16:04:36

apocalypse
Membre
Inscription : 2011-09-02
Messages : 16

Re : Région de type interactive report

Merci mais l'erreur est toujours présente sad

Hors ligne

#4 2011-09-05 17:15:44

admin
Administrateur
Inscription : 2010-08-02
Messages : 83

Re : Région de type interactive report

Il faut corriger la boucle LOOP comme ceci :

   FOR i IN 1..l_selected.count
  LOOP
    if requete is null then
       requete := l_selected(i);
    else
       requete := requete || ',' || l_selected(i);
    end if;
  END LOOP;
 
 
  J'attire ton attention sur la variable requete, elle risque d'être mal interprétée. Si la liste est composée de chaines de caractères,
  le moteur SQL risque de considérer son contenu comme une seule chaîne et non pas comme une liste. Pour cela il faut séparer par des quotes
  chaque élément de la liste.
 
  Le message Query must begin with SELECT or WITH s'affiche lorsqu'il y a un problème de syntaxe SQL, essaie de tester ta requête
  soit dans SQL Developer soit dans SQL Command d'APEX pour voir la requête générée.

Hors ligne

#5 2011-09-06 07:58:58

apocalypse
Membre
Inscription : 2011-09-02
Messages : 16

Re : Région de type interactive report

Merci pour l'aide, effectivement je n'avais pas pensé aux quotes...
Cependant je ne sais pas comment fonctionne réellement apex mais à ce niveau là le bout de code n'est pas exécuté si ? Donc l'erreur doit provenir d'une ligne qui ne peut être exécuté je pense.

Ma requête générale fonctionne correctement :

select
   numcli as Numéro,
   codesexe as Sexe,
   nom as Nom,
   prenom as Prénom,
   dept as Dpt,
   ad1 as Adr1,
   ad2 as Adr2,
   pays as Pays,
   tel as Tél,
   email as Email,
   statucli as Statut,
   recence as Récence
from ITL11
 where recence in ('06', 'P24');

Et voici ma source pour le moment...

DECLARE
    l_selected APEX_APPLICATION_GLOBAL.VC_ARR2;
    requete vachar2(4000);
BEGIN
  --
  -- Convert the colon separated string of values into
  -- a PL/SQL array 

  l_selected := APEX_UTIL.STRING_TO_TABLE(:P_RECENCE);

  --
  -- Loop over array to insert department numbers and sysdate
  --
  FOR i IN 1..l_selected.count
  LOOP
    if requete is null then
       requete := chr(39)||l_selected(i)||chr(39)||;
    else
       requete := requete || ',' || chr(39)|| l_selected(i)||chr(39)||;
    end if;
  END LOOP;

    return 'select
   numcli as Numéro,
   codesexe as Sexe,
   nom as Nom,
   prenom as Prénom,
   dept as Dpt,
   ad1 as Adr1,
   ad2 as Adr2,
   pays as Pays,
   tel as Tél,
   email as Email,
   statucli as Statut,
   recence as Récence
from' || :P_NOM_TABLE ||
'where recence in (' || requete || ')';

Hors ligne

#6 2011-09-06 09:05:17

Yann39
Membre
Inscription : 2011-03-28
Messages : 18

Re : Région de type interactive report

Salut,

les "Interractive reports" n'acceptent que des sources de type SQL, pas de PL/SQL.

Il faut donc que tu trouves un moyen de faire ça directement avec une requête, ou alors utiliser un report simple.

Hors ligne

#7 2011-09-06 09:14:59

apocalypse
Membre
Inscription : 2011-09-02
Messages : 16

Re : Région de type interactive report

Merci pour cette précision, je vais donc stocker les valeurs sélectionnées dans une item caché (si c'est possible smile) afin de ne faire que du SQL pour mon report.

Encore merci.

Hors ligne

#8 2011-09-06 19:46:19

ic4it
Membre
Lieu : Grasse
Inscription : 2011-09-05
Messages : 2
Site Web

Re : Région de type interactive report

bonjour Apocalypse comme le dit Yann pas de pl/sql pour les IR par contre j'ai ici un tutoriel qui devrait t'interresser

Oracle APEX Interactive report based on PLSQL function (c'est basé sur une collection Apex)
http://www.oracleapplicationexpress.com/tutorials/71

la doc Apex pour les collections
http://download.oracle.com/docs/cd/E239 … m#AEAPI531
Cordialement
Jean-Yves

Dernière modification par ic4it (2011-09-06 19:51:17)

Hors ligne

#9 2011-09-07 08:27:39

apocalypse
Membre
Inscription : 2011-09-02
Messages : 16

Re : Région de type interactive report

Merci ic4it pour les liens smile.
Cependant je n'arrive pas à utiliser la collection avec ma méthode de nom de table définie dynamiquement...

Voici mon code

APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY(
   'REQ_COMPT',
   'select
   numcli as Numéro,
   codesexe as Sexe,
   nom as Nom,
   prenom as Prénom,
   dept as Dpt,
   ad1 as Adr1,
   ad2 as Adr2,
   pays as Pays,
   tel as Tél,
   email as Email,
   statucli as Statut,
   recence as Récence
from '|| :P_NOM_TABLE);

Et du coup j'ai cette erreur lors de l'exécution:
ORA-00903: invalid table name

Hors ligne

#10 2011-09-07 08:38:28

apocalypse
Membre
Inscription : 2011-09-02
Messages : 16

Re : Région de type interactive report

apocalypse a écrit :

Merci pour cette précision, je vais donc stocker les valeurs sélectionnées dans une item caché (si c'est possible smile) afin de ne faire que du SQL pour mon report.

Encore merci.

Je ne peux même pas utiliser cette méthode car le nom de ma table est stocké dans un item et ceci ne fonctionne pas:

from :P_NOM_TABLE;

Hors ligne

#11 2011-09-07 12:49:14

apocalypse
Membre
Inscription : 2011-09-02
Messages : 16

Re : Région de type interactive report

J'ai finalement réussi à utiliser la collection, merci à tous pour l'aide!

Hors ligne

#12 2011-09-07 15:02:55

apocalypse
Membre
Inscription : 2011-09-02
Messages : 16

Re : Région de type interactive report

Ah non fausse alerte j'ai toujours le problème

ORA-20104: create_collection_from_query Error:ORA-20104: create_collection_from_query ParseErr:ORA-00903: invalid table name

Quelqu'une peut il me guider ?

declare 

l_query varchar2(4000);

begin

l_query := 'select
   numcli as Numéro,
   codesexe as Sexe,
   nom as Nom,
   prenom as Prénom,
   dept as Dpt,
   ad1 as Adr1,
   ad2 as Adr2,
   pays as Pays,
   tel as Tél,
   email as Email,
   statucli as Statut,
   recence as Récence
from '||:P_TABLE_VALIDER||' '||:P3_REQUETE;

--APEX_COLLECTION.DELETE_COLLECTION('REQ_COMPT');
APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY(
   'REQ_COMPT',
   l_query);

end;

Hors ligne

#13 2011-09-08 17:08:17

admin
Administrateur
Inscription : 2010-08-02
Messages : 83

Re : Région de type interactive report

Bonjour,

Le problème vient de l'item :P3_REQUETE, il doit être mal formé. Si je comprend bien il doit traduire la sélection de l'utilisateur clause Where ... etc..

Sinon ton bloc anonyme est correct.

Vérifie le contenu de l'item :P3_REQUETE, tu verras plus clair.

Hors ligne

#14 2011-09-09 09:45:09

apocalypse
Membre
Inscription : 2011-09-02
Messages : 16

Re : Région de type interactive report

Merci je vais faire ça mais moi je pense plutôt que le problème vient de mon item :P_TABLE_VALIDER car à la fin du message d'erreur il est écrit :
ORA-00903: invalid table name

Je te tiens au courant dans la journée smile

Hors ligne

#15 2011-09-09 11:42:58

apocalypse
Membre
Inscription : 2011-09-02
Messages : 16

Re : Région de type interactive report

J'ai réussi à corriger le problème smile.
Cependant mon report interactif ne se rafraichit pas automatiquement lorsque j'arrive sur la page, il faut que je raffraichisse la page pour que les informations correspondent...
Quelqu'un sait il pourquoi ?

Hors ligne

Pied de page des forums