Pas de problème (pb), que du PowerBuilder (PB) ^^

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.
  • Index
  •  » Powerscripts
  •  » [RESOLU] 1 Datawindow, 1 procédure stockée, 2 possibilités de scrolling...

#1 17-06-2008 15:45:20

Nyphel  
Membre Power Geek
Lieu: Grenoble
Date d'inscription: 06-05-2008
Messages: 253
Pépites: 12
Banque: 529,705,333,097,693

[RESOLU] 1 Datawindow, 1 procédure stockée, 2 possibilités de scrolling...

Bonsoir,

Mon petit soucis va être relativement difficile à décrire, alors je vais tenter d'être aussi clair que possible.

J'ai une sheet qui contient uniquement une datawindow, destinée à afficher les comptes utilisateurs d'un produit.
Cette datawindow ressemble à un courrier postal (Nom, adresse, téléphone, etc.). Chaque row retourné par ma procédure stockée occupe donc une page.

J'utilise la molette de la souris pour passer d'un row à l'autre (et j'ai bien pris garde à ce que la molette de la souris scrolle 1 ligne à la fois, dans le panneau de configuration Windows).

Mieux encore, l'utilisateur dispose de boutons pour passer d'une page à l'autre (donc d'un row à l'autre) définis dans mon ue_scroll(integer ai_scrolltype) event de ma sheet :

Code: pb

long ll_row

// security
IF NOT IsValid(idw_datawindow) THEN RETURN

// change active row
CHOOSE CASE ai_scrolltype
    
CASE guo_cst.ii_first_page
  ll_row = 1
  idw_datawindow.ScrollToRow(ll_row)

CASE guo_cst.ii_previous_page
  idw_datawindow.ScrollPriorPage()
  ll_row = idw_datawindow.GetRow()

CASE  guo_cst.ii_next_page
  idw_datawindow.ScrollNextPage()
  ll_row = idw_datawindow.GetRow()
  
CASE  guo_cst.ii_last_page
  ll_row = idw_datawindow.RowCount()
  idw_datawindow.ScrollToRow(ll_row)

END CHOOSE

// select active row
idw_datawindow.SelectRow(0,FALSE)
idw_datawindow.SelectRow(ll_row,TRUE)

Cet event est décrit dans mon objet ancêtre de toutes mes fenêtres : c'est mon w_base_sheet.
Jusque là, tout fonctionne parfaitement.

Maintenant ce se complique : dans ma datawindow j'affiche des informations complémentaires, à savoir la liste des produits déjà achetés par l'utilisateur.
Auparavant j'avais donc 1 utilisateur = 1 row retourné par la procédure stockée.
Maintenant j'ai donc 1 utilisateur = N rows retournés.
Je mets en place un GROUP dans ma datawindow, sur le critère du numéro d'utilisateur. Ainsi j'affiche ses informations personnelles comme auparavant, et dans la zone de groupe j'affiche la liste des produtis achetés.

Ainsi, j'ai encore et toujours 1 page affichée par utilisateur.
Ca fonctionne correctement.

Mais voilà les conséquences :
- lorsque l'utilisateur de l'application clic sur le bouton "Scroll jusqu'à la page suivante", ca scroll jusqu'à la dernière page.
- lorsque l'utilisateur scrolle directement avec sa souris, ca produit des affichages bizarres... Notemment au niveau de la liste des produits achetés.

Il semblerait qu'en fait mon scroll ne fonctionne plus correctement.
Je ne parviens pas vraiment à déterminer ce qui pose problème :
- si c'est le fait que pour 10 rows retournés on n'aie que 2-3 pages affichées (10 produtis répartis entre 2-3 utilisateurs de produit)
- ou bien si c'est que mes fonctions relative au Scroll (ScrollNextPage() et GetRow()) se mélangent les pinceaux entre le row "utilisateur" qui occupe la majeure partie de la page, et le row "produit" de la liste des produits pour cet utilisateur.

Une solution serait probablement de remplacer ma liste de produits par un vrai sous-rapport (une seconde datawindow). Malheureusement c'est ce que j'avais fait initialement, et ca me posait des problèmes similaires voire pires.

Avez-vous une idée du problème ?
Je bataille là-dessus sans en venir à bout. Bien que ne pouvant plus toucher au code pendant quelques jours, je reste à l'écoute de vos conseils et suggestions.

Merci, encore une fois, pour votre aide !

Dernière modification par Nyphel (23-06-2008 11:04:00)

Hors ligne

 

#2 17-06-2008 16:05:19

JCZ  
Builder Power
Award: bf
Lieu: 75019 paris
Date d'inscription: 21-05-2007
Messages: 1724
Pépites: 496,453,703,213
Banque: 9,223,372,036,854,776,000

Re: [RESOLU] 1 Datawindow, 1 procédure stockée, 2 possibilités de scrolling...

Salut
dans la DW page() est correcte ? row() est correcte ?

Code: pb

ll_page = idw_datawindow.ScrollNextPage()
ll_page = Long(idw_datawindow.describe("Evaluate( 'Page()', "+ string(ll_page)+" )" ))

ll_page est bon ?


Face à l'agression, la puissance de l'intelligence

Hors ligne

 

#3 18-06-2008 06:58:34

Nyphel  
Membre Power Geek
Lieu: Grenoble
Date d'inscription: 06-05-2008
Messages: 253
Pépites: 12
Banque: 529,705,333,097,693

Re: [RESOLU] 1 Datawindow, 1 procédure stockée, 2 possibilités de scrolling...

Je ne pourrai pas tester le code avant lundi, mais lorsque j'affichais mon rowcount, j'avais bien un nombre qui semblait correspondre à ma liste de produits :s

Hors ligne

 

#4 23-06-2008 07:18:06

Nyphel  
Membre Power Geek
Lieu: Grenoble
Date d'inscription: 06-05-2008
Messages: 253
Pépites: 12
Banque: 529,705,333,097,693

Re: [RESOLU] 1 Datawindow, 1 procédure stockée, 2 possibilités de scrolling...

Bonjour,

Voici le code de mon ue_scroll event, défini dans mon ancêtre pour mes sheet :

Code: pb

long ll_row

// security
IF NOT IsValid(idw_datawindow) THEN RETURN

// change active row
CHOOSE CASE ai_scrolltype
    
CASE guo_cst.ii_first_page
  ll_row = 1
  idw_datawindow.ScrollToRow(ll_row)

CASE guo_cst.ii_previous_page
  idw_datawindow.ScrollPriorPage()
  ll_row = idw_datawindow.GetRow()

CASE  guo_cst.ii_next_page
  idw_datawindow.ScrollNextPage()
  ll_row = idw_datawindow.GetRow()
  
CASE  guo_cst.ii_last_page
  ll_row = idw_datawindow.RowCount()
  idw_datawindow.ScrollToRow(ll_row)

END CHOOSE

// select active row
idw_datawindow.SelectRow(0,FALSE)
idw_datawindow.SelectRow(ll_row,TRUE)


Le problème, c'est que du coup ca sélectionne le row courant sur mon rapport puisqu'il hérite de cet ancêtre.
J'ai donc voulu surcharger cet event dans la sheet de mon rapport, et j'ai fait comme suit :

Code: pb

//override !

long ll_row

// security
IF NOT IsValid(idw_datawindow) THEN RETURN

// change active row
CHOOSE CASE ai_scrolltype
    
CASE guo_cst.ii_first_page
  ll_row = 1
  idw_datawindow.ScrollToRow(ll_row)

CASE guo_cst.ii_previous_page
  idw_datawindow.ScrollPriorPage()
  ll_row = idw_datawindow.GetRow()

CASE  guo_cst.ii_next_page
  idw_datawindow.ScrollNextPage()
  ll_row = idw_datawindow.GetRow()
  
CASE  guo_cst.ii_last_page
  ll_row = idw_datawindow.RowCount()
  idw_datawindow.ScrollToRow(ll_row)

END CHOOSE

// select active row
//idw_datawindow.SelectRow(0,FALSE)
//idw_datawindow.SelectRow(ll_row,TRUE)


La conséquence, c'est que lorsque l'utilisateur clique sur un bouton pour passer à la page suivante, les deux events vont être appelés successivement. Il n'y a pas de surcharge comme je le pensais.
Dès lors, puisque mon test comporte 3 pages, j'avais l'impression que ca scrollait directement jusqu'à la dernière page.

Voici mon nouveau ue_scroll event défini dans la sheet de mon rapport :

Code: pb

// Unselect active row, that has been selected by ancester event
idw_datawindow.SelectRow(idw_datawindow.GetSelectedRow(0),FALSE)


Voilà une bonne chose de faite.
Mais dès lors survient une question : est-il impossible de surcharger un event défini dans un ancêtre ? J'avoue que ça me perturbe.

Par contre mon second problème persiste : lorsque je scrolle directement avec ma souris, le comportement du rapport est étrange.
Si la page courante contient plusieurs produits, alors ca scrolle de produit en produit... Ou quelque chose de similaire : ca réaffiche la page, en affichant 1 produit en moins (celui en haut de la liste).
Si la page courante contient un seul produit, alors ca scrolle bien jusqu'à la page suivante.

Je ne parviens pas à trouver où se gère l'évènement correspondant.

Dernière modification par Nyphel (23-06-2008 07:18:40)

Hors ligne

 

#5 23-06-2008 08:36:52

abdelta  
Bienfaitrice du site
Award: bf
Lieu: La Daguenière
Date d'inscription: 21-03-2007
Messages: 393
Pépites: 14,703
Banque: 9,223,372,036,854,776,000

Re: [RESOLU] 1 Datawindow, 1 procédure stockée, 2 possibilités de scrolling...

Nyphel a écrit:

est-il impossible de surcharger un event défini dans un ancêtre ? J'avoue que ça me perturbe.

Lorsque tu es sur le code de ton héritier, avec un clic droit tu peux choisir d'étendre le script de l'ancêtre ou non dans le menu contextuel. Par défaut l'option "Extend ancestor Script" est cochée, mais tu peux la décocher pour ne plus prendre en compte les niveaux supérieurs de la hiérarchie de code.

Dernière modification par abdelta (23-06-2008 08:41:02)


La sirène noire
http://www.nerdtests.com/images/badge/bf1f6c78865210a9.gif

Hors ligne

 

#6 23-06-2008 08:46:20

Nyphel  
Membre Power Geek
Lieu: Grenoble
Date d'inscription: 06-05-2008
Messages: 253
Pépites: 12
Banque: 529,705,333,097,693

Re: [RESOLU] 1 Datawindow, 1 procédure stockée, 2 possibilités de scrolling...

Mmmmmh d'accord !
Merci pour ce tip, j'avais cherché sans succès. J'admets que j'ai un peu de mal à trouver les menus cachés sous Pb... Je ne vous raconte pas le temps que j'ai passé avant de parvenir à afficher la Stored Procedure de mes datawindows (J'interviens sur l'évolution d'un ancien projet).

Hors ligne

 

#7 23-06-2008 11:03:31

Nyphel  
Membre Power Geek
Lieu: Grenoble
Date d'inscription: 06-05-2008
Messages: 253
Pépites: 12
Banque: 529,705,333,097,693

Re: [RESOLU] 1 Datawindow, 1 procédure stockée, 2 possibilités de scrolling...

J'ai trouvé une solution à mon problème : j'ai surchargé le comportement par défaut pour un scroll avec la molette de souris, ou bien avec les flèches du clavier. Il est à noter que le changement de row via les page-up/page-down du clavier fonctionnait parfaitement.

Donc j'ai créé 2 user events sur ma datawindow (et non pas sur la sheet qui contient la datawindow).

Le 1er event est mappé sur pbm_vscroll et contient le code suivant :

Code: pb

CHOOSE CASE scrollcode
CASE 0
  idw_datawindow.ScrollPriorPage()
CASE 1
  idw_datawindow.ScrollNextPage()
END CHOOSE

return 1


Le 2nd event est mappé sur pbm_dwkey et contient le code suivant :

Code: pb

IF KeyDown(KeyDownArrow!) THEN
  idw_datawindow.ScrollNextPage()
ELSEIF KeyDown(KeyPageDown!) THEN
  idw_datawindow.ScrollNextPage()
ELSEIF KeyDown(KeyUpArrow!) THEN
  idw_datawindow.ScrollPriorPage()
ELSEIF KeyDown(KeyPageUp!) THEN
  idw_datawindow.ScrollPriorPage()
ELSEIF KeyDown(KeyHome!) THEN
  idw_datawindow.ScrollToRow(1)
ELSEIF KeyDown(KeyEnd!) THEN
  idw_datawindow.ScrollToRow(idw_datawindow.RowCount())
END IF

return 1


Merci pour votre aide, une fois encore ;)

Dernière modification par Nyphel (23-06-2008 11:12:59)

Hors ligne

 

#8 23-06-2008 12:28:35

Nyphel  
Membre Power Geek
Lieu: Grenoble
Date d'inscription: 06-05-2008
Messages: 253
Pépites: 12
Banque: 529,705,333,097,693

Re: [RESOLU] 1 Datawindow, 1 procédure stockée, 2 possibilités de scrolling...

Et dans le cas où l'utilisateur a défini dans les propriétés de sa souris que un scroll de molette correspond à plusieurs pages, alors il risque de ne pas voir tous les utilisateurs. Ca va en 'sauter' en scrollant. En pratique on a N fois l'event mappé sur pbm_vscroll qui va être levé.

Je me base donc sur la fonction CPU() qui retourne le nombre de millisecondes écoulées depuis le lancement de l'application pour déterminer si il faut accepter la série de scrolls ou non. Si on a 3 scrolls qui surviennent à quelques millièmes de secondes près, c'est que l'utilisateur a modifié les paramètres de sa souris pour scroller par 3.

Code: pb

long ll_current_mousescroll, ll_elapsed_time, ll_minimal_delay
ll_minimal_delay = 50

CHOOSE CASE scrollcode

CASE 0  
  ll_current_mousescroll = CPU()
  ll_elapsed_time = ll_current_mousescroll - il_previous_mousescroll
  IF ll_elapsed_time >= ll_minimal_delay THEN
    il_previous_mousescroll = ll_current_mousescroll
    idw_datawindow.ScrollPriorPage()
  END IF
  
CASE 1
  ll_current_mousescroll = CPU()
  ll_elapsed_time = ll_current_mousescroll - il_previous_mousescroll
  IF ll_elapsed_time >= ll_minimal_delay THEN
    il_previous_mousescroll = ll_current_mousescroll
    idw_datawindow.ScrollNextPage()
  END IF
END CHOOSE

return 1

Hors ligne

 

#9 23-06-2008 12:59:20

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: [RESOLU] 1 Datawindow, 1 procédure stockée, 2 possibilités de scrolling...

  0.000  pépites


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#10 23-06-2008 14:01:40

Nyphel  
Membre Power Geek
Lieu: Grenoble
Date d'inscription: 06-05-2008
Messages: 253
Pépites: 12
Banque: 529,705,333,097,693

Re: [RESOLU] 1 Datawindow, 1 procédure stockée, 2 possibilités de scrolling...

Mmmmhhh... Il y a quelque chose que je n'avais pas prévu.

Imaginons que l'on réduise la résolution de l'écran en 800x600 pixels et que l'utilisateur ne voit plus que la partie haute du rapport. Naturellement, il va vouloir scroller pour afficher la partie basse. Dans les différents rapports ca se passe ainsi : si on scrolle et qu'une partie de la page n'est pas visible, ca l'affiche. Si on est en bas de la page, alors on affiche la page suivante.

Dans mon cas je redéfini l'event scrolling, donc je ne gère plus du tout cela.
Croyez-vous qu'il soit possible de :
- détecter si on visualise uniquement une partie de la page, et qu'il reste un morceau à afficher ?
- scroller sur la page courante, comme le ferait une vertical scroll barre ?

Hors ligne

 

#11 23-06-2008 14:45:56

Sebou  
Membre Power Geek
Lieu: Villeneuve-sur-Lot
Date d'inscription: 21-12-2007
Messages: 189
Pépites: 1,787
Banque: 13,693,461,510

Re: [RESOLU] 1 Datawindow, 1 procédure stockée, 2 possibilités de scrolling...

j'en profite pour faire irruption ici...et surtout sur pbm_vscroll...
a quoi correspondent les valeurs de scrollcode ?

ptet que ca va m'aider pour mon ascenceur vertical qui déconne toujours lol

Merci

Hors ligne

 

#12 23-06-2008 15:03:08

Nyphel  
Membre Power Geek
Lieu: Grenoble
Date d'inscription: 06-05-2008
Messages: 253
Pépites: 12
Banque: 529,705,333,097,693

Re: [RESOLU] 1 Datawindow, 1 procédure stockée, 2 possibilités de scrolling...

C'est simplement le code qui identifie ton scroll : scroll vers le haut, scroll vers le bas, etc. Il s'agit là de scroll avec la molette de la souris, pas des ascenseurs manuels.
Le mieux c'est de te faire un messagebox qui affiche le code du scroll, et tu t'amuses à scroller pour identifier le code qui t'intéresse ;)

messagebox('', 'Code du scroll = ' + string(long(scrollcode)))

Dernière modification par Nyphel (23-06-2008 15:03:53)

Hors ligne

 

#13 23-06-2008 15:24:17

Sebou  
Membre Power Geek
Lieu: Villeneuve-sur-Lot
Date d'inscription: 21-12-2007
Messages: 189
Pépites: 1,787
Banque: 13,693,461,510

Re: [RESOLU] 1 Datawindow, 1 procédure stockée, 2 possibilités de scrolling...

ah ok, merci ...bon béh ca m'aide pas alors :'(

Hors ligne

 

#14 23-06-2008 15:43:10

shahin  
Modérateur
Award: bf
Lieu: val de marne
Date d'inscription: 26-09-2006
Messages: 938
Pépites: 8,675,050,269
Banque: 16,218,225,127,617

Re: [RESOLU] 1 Datawindow, 1 procédure stockée, 2 possibilités de scrolling...

Pourtant Nyphel a bien répondu à ta question

Quand on scroll avec la molette de la souris, les valeurs de scrollcode sont 2 ou 3


never let people work on more than one thing at once.

Hors ligne

 

#15 23-06-2008 15:49:29

Sebou  
Membre Power Geek
Lieu: Villeneuve-sur-Lot
Date d'inscription: 21-12-2007
Messages: 189
Pépites: 1,787
Banque: 13,693,461,510

Re: [RESOLU] 1 Datawindow, 1 procédure stockée, 2 possibilités de scrolling...

oui mais moi j'ai un probleme avec une dw de saisie avec un groupe, où, quand on insère une ligne "en bas de page", ca saute sur la page suivante au lieu de descendre que d'une ligne

Hors ligne

 

#16 23-06-2008 16:02:22

Nyphel  
Membre Power Geek
Lieu: Grenoble
Date d'inscription: 06-05-2008
Messages: 253
Pépites: 12
Banque: 529,705,333,097,693

Re: [RESOLU] 1 Datawindow, 1 procédure stockée, 2 possibilités de scrolling...

Quand on scroll avec la molette de la souris, les valeurs de scrollcode sont 2 ou 3

C'est ce que j'avais lu moi aussi, mais cela ne fonctionnait pas.
Après tests, ce sont les valeurs 0 et 1 qui sont fonctionnelles sur mon poste... Etrange ! Il y a peut-être quelque chose qui m'échappe. C'est même probable :-/

J'en profite pour rappeler ce sur quoi je bloque depuis tout à l'heure, des fois qu'un lecteur passerait par là ;)

Mmmmhhh... Il y a quelque chose que je n'avais pas prévu.

Imaginons que l'on réduise la résolution de l'écran en 800x600 pixels et que l'utilisateur ne voit plus que la partie haute du rapport. Naturellement, il va vouloir scroller pour afficher la partie basse. Dans les différents rapports ca se passe ainsi : si on scrolle et qu'une partie de la page n'est pas visible, ca l'affiche. Si on est en bas de la page, alors on affiche la page suivante.

Dans mon cas je redéfini l'event scrolling, donc je ne gère plus du tout cela.
Croyez-vous qu'il soit possible de :
- détecter si on visualise uniquement une partie de la page, et qu'il reste un morceau à afficher ?
- scroller sur la page courante, comme le ferait une vertical scroll barre ?

Hors ligne

 
  • Index
  •  » Powerscripts
  •  » [RESOLU] 1 Datawindow, 1 procédure stockée, 2 possibilités de scrolling...

Pied de page des forums

Propulsé par FluxBB 1.2.22