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

Forms Oracle Discussion :

[forms] Bloc basé sur une clause from


Sujet :

Forms Oracle

  1. #1
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut [forms] Bloc basé sur une clause from
    Je suis sous forms6i et Oracle >= 8i.

    Ne pouvant pas créer de vue (de toute façon cela ne résoudrait sans doute pas mon problème), j'ai basé un bloc en consultation simple sur une clause from du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select col1, col2, sum(col3), sum(col4), count(*)
    from matable
    group by col1, col2
    Sur ce bloc j'ai une clause where du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where col1 = :monbloc.colonne1;
    Sur ma base de test cela fonctionnait bien. Sauf que lorsque j'ai testé cela sur une base un peu plus conséquente, cela rame un peu.

    Si j'exécute la requête de la clause from sous sql+ ça rame également.
    Mais si j'exécute la même requête en ajoutant la clause where :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select col1, col2, sum(col3), sum(col4), count(*)
    from matable
    where col1 = 1
    group by col1, col2;
    le résultat est instantanné, puisque col1 est indexée.

    Donc ce que je souhaiterais faire, c'est ajouter dans ma clause from cette clause where. Or comme cela dépend d'un champs d'un bloc, à l'exécution j'ai le message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Unable to perform query
    Quelqu'un aurait-il une solution pour contourner ce problème ?
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    et si tu ajoutes

    Et ensuite tu ajoutes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AND col1 = :monbloc.colonne1
    Mais ce qui m'étonne c'est que je pensais que c'était faisable de référencer un champ dans la chere clause... tu peux pas mettre : col1 = monbloc.colonne1 ?

  3. #3
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par orafrance
    Mais ce qui m'étonne c'est que je pensais que c'était faisable de référencer un champ dans la chere clause... tu peux pas mettre : col1 = monbloc.colonne1 ?
    Moi aussi je pensais que c'était possible, mais cela ne fonctionne pas.

    Citation Envoyé par orafrance
    et si tu ajoutes
    Et ensuite tu ajoutes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AND col1 = :monbloc.colonne1
    Je ne comprends pas trop ce que tu veux dire
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Et bien, apparement tu veux mettre col1 dans la clause where au niveau des propriétés du bloc... c'est ce que je te propose... ensuite en WHEN-NEW-BLOC-INSTANCE ou un trigger du stype tu fais un SET_PROPERTY où la where clause est 'col1 = :monbloc.colonne1'

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    Bonjour,
    Ce que forms envoie comme requete à la base dans ce cas est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Select col1,col2,col3,col4,NB
    From 
    (Select col1,col2,sum(col3) col3,sum(col4) col4,count(*) NB
      from matable 
    group by col1, col2)
    Where col1 = :monbloc.colonne1
    donc Oracle execute ce qu'il y a dans ton from clause query puis fais la restriction sur col1.

    Citation Envoyé par plaineR
    Donc ce que je souhaiterais faire, c'est ajouter dans ma clause from cette clause where.
    Je te confirme qu'on ne peux pas utilisé des champs dans la clause from mais tu peux t'en sortir avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Set_block_property('Nom_block',From_Clause_Query,'Select col1,col2,sum(col3) col3,sum(col4) col4,count(*) NB
      from matable 
    where col1 = '||:monbloc.colonne1||'
    group by col1, col2')
    dans le declencheur pre-query
    [/code]

  6. #6
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Merci pour ta réponse.
    Citation Envoyé par Kast
    Ce que forms envoie comme requete à la base dans ce cas est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Select col1,col2,col3,col4,NB
    From 
    (Select col1,col2,sum(col3) col3,sum(col4) col4,count(*) NB
      from matable 
    group by col1, col2)
    Where col1 = :monbloc.colonne1
    donc Oracle execute ce qu'il y a dans ton from clause query puis fais la restriction sur col1.
    Là je suis d'accord avec toi et c'est la tout mon problème !

    Citation Envoyé par Kast
    Je te confirme qu'on ne peux pas utilisé des champs dans la clause from mais tu peux t'en sortir avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Set_block_property('Nom_block',From_Clause_Query,'Select col1,col2,sum(col3) col3,sum(col4) col4,count(*) NB
      from matable 
    where col1 = '||:monbloc.colonne1||'
    group by col1, col2')
    dans le declencheur pre-query
    Il n'a pas l'air de reconnaître From_Clause_Query, du moins en forms 6i, quand je compile j'ai le message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    identifier FROM_CLAUSE_QUERY must be declared
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  7. #7
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    essaye QUERY_DATA_SOURCE_NAME :

    http://asktom.oracle.com/pls/ask/f?p=4950:8:12315361640304596965::NO::F4950_P8_DISPLAYID,F4950_P8_CRITERIA:1314002326256

  8. #8
    Membre actif Avatar de Nounoursonne
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 264
    Points : 208
    Points
    208
    Par défaut
    Tu peux passer par des variables globales.
    Je m'explique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    :global.var1:=:monbloc.colonne1;
    set_block_property('monbloc',default_where,'col1=:global.var1');
    execute query;
    Ca doit marcher, c'est ce que j'utilise

  9. #9
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Merci Orafrance ça fonctionne !

    Nounoursonne : ce n'est pas la clause where qui me posait problème mais la clause from de mon bloc
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  10. #10
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Nounoursonne Ce n'est pas le problème

    Relis les posts précédents tu verras que la clause WHERE est appliquée sur une requête qui fait un FULL SCAN

    mais ce qui m'étonne c'est qu'elle devrait quand même passer par l'index :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SQL>select *
      2  from (select * from orafrance);
     
    aucune ligne sélectionnée
     
     
    Plan d'exécution
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE
       1    0   TABLE ACCESS (FULL) OF 'ORAFRANCE'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SQL>select *
      2  from (select * from orafrance)
      3  where id = 1;
     
    aucune ligne sélectionnée
     
     
    Plan d'exécution
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE
       1    0   TABLE ACCESS (BY INDEX ROWID) OF 'ORAFRANCE'
       2    1     INDEX (RANGE SCAN) OF 'PK_ORAFRANCE' (NON-UNIQUE)

  11. #11
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Cela vient du fait que j'ai simplifié le problème

    Ensuite je calcule la position de l'enregistrement après insertion pour raffraichissement de l'écran, à partir de la requête initiale (en dynamique) et j'obtenais le résultat suivant:
    Code : 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
    select rang
    from (select col1, col2,
                 rank () over (order by col1, col2) rang
          from (select col1, col2, sum(col3), sum(col4), count(*) 
                from matable 
                group by col1, col2)
          where col1 = 1
          )
    Operation	Object Name	Rows	Bytes	Cost	Object Node	In/Out	PStart	PStop
     
    SELECT STATEMENT Optimizer Mode=CHOOSE
      VIEW
        WINDOW BUFFER
          VIEW
            SORT GROUP BY
              TABLE ACCESS FULL	TEST
    et maintenant j'obtiens :
    Code : 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
    select rang
    from (select col1, col2,
                 rank () over (order by col1, col2) rang
          from (select col1, col2, sum(col3), sum(col4), count(*) 
                from test
                where col1 = 1
                group by col1, col2)
          )
     
    Operation	Object Name	Rows	Bytes	Cost	Object Node	In/Out	PStart	PStop
     
    SELECT STATEMENT Optimizer Mode=CHOOSE
      VIEW
        WINDOW BUFFER
          VIEW
            SORT GROUP BY
              TABLE ACCESS BY INDEX ROWID	TEST
                INDEX UNIQUE SCAN	I_COL1
    Et je passe de environ 5s à instantané !
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  12. #12
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Forms 6i] Bloc basé sur une procédure
    Par macben dans le forum Forms
    Réponses: 1
    Dernier message: 30/01/2009, 14h29
  2. Bloc basé sur une vue complexe
    Par tommy_f dans le forum Forms
    Réponses: 9
    Dernier message: 19/03/2008, 14h10
  3. Réponses: 1
    Dernier message: 06/02/2008, 04h03
  4. Réponses: 1
    Dernier message: 19/02/2007, 12h45
  5. SS Form basé sur une requete
    Par _developpeur_ dans le forum Access
    Réponses: 8
    Dernier message: 19/10/2005, 09h41

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