Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Outils > Forms
Forms Forum d'entraide sur Oracle Forms
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/12/2004, 09h59   #1
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
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 866
Points : 3 448
Points : 3 448
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 :
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 :
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 :
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 :
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.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2004, 10h02   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
et si tu ajoutes

Et ensuite tu ajoutes :

Code :
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 ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2004, 10h27   #3
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
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 866
Points : 3 448
Points : 3 448
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 :
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.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2004, 10h36   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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'
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2004, 10h40   #5
Invité régulier
 
Inscription : décembre 2004
Messages : 7
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 7
Points : 6
Points : 6
Bonjour,
Ce que forms envoie comme requete à la base dans ce cas est
Code :
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 :
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]
Kast est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2004, 11h00   #6
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
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 866
Points : 3 448
Points : 3 448
Merci pour ta réponse.
Citation:
Envoyé par Kast
Ce que forms envoie comme requete à la base dans ce cas est
Code :
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 :
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 :
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.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2004, 11h05   #7
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
essaye QUERY_DATA_SOURCE_NAME :

http://asktom.oracle.com/pls/ask/f?p=4950:8:12315361640304596965::NO::F4950_P8_DISPLAYID,F4950_P8_CRITERIA:1314002326256
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2004, 11h17   #8
Membre habitué

 
Avatar de Nounoursonne
 
Inscription : mai 2002
Messages : 257
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 257
Points : 145
Points : 145
Tu peux passer par des variables globales.
Je m'explique :

Code :
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
Nounoursonne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2004, 11h35   #9
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
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 866
Points : 3 448
Points : 3 448
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.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2004, 11h40   #10
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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 :
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 :
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)
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2004, 12h00   #11
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
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 866
Points : 3 448
Points : 3 448
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 :
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 :
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.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2004, 12h02   #12
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h53.


 
 
 
 
Partenaires

Hébergement Web