Répétez apres moi :J'aime PBAdonf. J'aime PBAdonf. J'aime PBAdonf.

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.

#1 16-03-2011 08:34:22

ORIOR  
Membre
Date d'inscription: 07-05-2010
Messages: 10
Pépites: 51
Banque: 0

[RESOLU] Arrêter le Retrieve sur une Datawindow...

Bonjour à tous,


J'ai un léger soucis avec une de mes datawindow.

Je voudrais créer un bouton me permettant de faire un DBCancel() sur la DataWindow.

J'ai donc bien mis la connexion en asynchrone et activer le trigger Retrieverow() avec un RETURN 1 dans le cas d'un click sur le bouton qui effectue le DBCancel() de la datawindow...

Malheureusement, ca ne fonctionne pas et PB ne rend la main à l'utilisateur qu'à la fin du retrieve, le click n'est donc pas déclenché entre chaque lecture de ligne...

Donc, ma question, est de savoir si d'autres personnes auraient déja eu un soucis identique avec cette manipulation?


Petite précision. J'ai plusieurs datawindow qui sont Retrieve en même temps... Une datawindow principal qui "dirige" le retrieve des 4 autres DW dans des onglets. Mais je ne pense pas que le soucis soit celui-ci étant donné que je n'arrive pas à récupérer la main sur PB.


Merci d'avance.

Cordialement.

Dernière modification par ORIOR (16-03-2011 08:50:15)

Hors ligne

 

#2 16-03-2011 09:07:59

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 723
Pépites: 11,352
Banque: 100,221,387,868,884,300
Site web

Re: [RESOLU] Arrêter le Retrieve sur une Datawindow...

Dans ton event retrieverow, tu fais des Yield() ?


https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#3 16-03-2011 10:21:57

ORIOR  
Membre
Date d'inscription: 07-05-2010
Messages: 10
Pépites: 51
Banque: 0

Re: [RESOLU] Arrêter le Retrieve sur une Datawindow...

Oui j'ai bien un Yield()

Code du RetrieveRow

Code: pb

Yield()
If(ib_DbCancel  = True) Then
  RETURN 1
End If

Dernière modification par ORIOR (16-03-2011 10:44:55)

Hors ligne

 

#4 16-03-2011 10:26:06

foon  
N2iGeek + MangasGeek = foon
Award: bf
Lieu: Bonchamp-Lès-Laval
Date d'inscription: 28-02-2007
Messages: 2490
Pépites: 97
Banque: 9,223,372,036,854,776,000

Re: [RESOLU] Arrêter le Retrieve sur une Datawindow...


Seuls ceux qui ne font rien ne font jamais d'erreurs
http://www.nerdtests.com/images/badge/163124fb7fb459a3.gif

Hors ligne

 

#5 16-03-2011 11:32:45

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 723
Pépites: 11,352
Banque: 100,221,387,868,884,300
Site web

Re: [RESOLU] Arrêter le Retrieve sur une Datawindow...

T'as essayé de mettre une trace dans l'event pour voir si tu y passes ?
Il te faut peut-être aprés ton retrieve, une boulce comme :
//Avec ib_retrieving initialisé sur retrievestart / retrieveend

Code: pb

do while dw_master.ib_retrieving = true
    yield()
loop

Maintenant, vu que tu as plusieur datawindow qui font des retrieves "en même" temps, c'est probablement ceux-là qui prennent le devant de la scène et ne laisse pas suffisement de temps au Yield pour traiter les messages.

Autre choses sur Yield(), il vaut mieux écrire une boucle comme celle-ci :

Code: pb

do while Yield() : loop  //car Yield() retourne true  tant qu'il y a des messages à traiter* (enfin pas tout à fait)

https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#6 16-03-2011 12:14:58

ORIOR  
Membre
Date d'inscription: 07-05-2010
Messages: 10
Pépites: 51
Banque: 0

Re: [RESOLU] Arrêter le Retrieve sur une Datawindow...

Oui, je passe bien dans l'event.
J'ai déja tester et ca ne vient pas de la.

Maintenant, je vais essayer ta méthode avec une boucle.

Merci pour la réponse, je vous tiens au courant.

Hors ligne

 

#7 25-10-2013 09:43:18

remypb  
Membre Geek
Date d'inscription: 19-04-2013
Messages: 65
Pépites: 262
Banque: 0

Re: [RESOLU] Arrêter le Retrieve sur une Datawindow...

bonjour

j'ai le meme probleme

je veux permettre a l'utilisateur d'interrompre le retrieve

j'ai 2 datawindows que je retrieve une apres l'autre

sur les 2 dans l'event retrieverow j'ai ce code
----------------------------------------------------
Yield()
If ib_cancel Then
    RETURN 1
End If
----------------------------------------------------

mais l'arret n'est pas instantané des fois il intervient a la fin du retrieve



où dois je placer le code <do while Yield() : loop> pour rendre effectif et instantané mon arret de retrieve

ds le retrieverow ? ailleurs ?

Hors ligne

 

#8 29-10-2013 11:09:52

Yanis  
Modérateur
Lieu: paris
Date d'inscription: 16-06-2010
Messages: 349
Pépites: 665
Banque: 150

Re: [RESOLU] Arrêter le Retrieve sur une Datawindow...

Salut,

    A quel moment met tu ta connexion en mode asynchrone ?.  Il est impératif que celà soit fait avant de se connecter à la  base de donnée. Ce paramètre n'est pas dynamique. Si tu le modifie au cours de ton application, la modif n'a aucun effet.

Cdt.
Yanis

Hors ligne

 

#9 29-10-2013 11:18:31

remypb  
Membre Geek
Date d'inscription: 19-04-2013
Messages: 65
Pépites: 262
Banque: 0

Re: [RESOLU] Arrêter le Retrieve sur une Datawindow...

Bonjour

Je mets DBParm a 1 lors de la connection
comme indiqué ci dessous (TO_Sybase est mon objet de connexion)
-----------------------------------------------------------------------------------------------
.............................
TO_Sybase.DBParm        = '1'
TO_Sybase.AutoCommit = False
connect using TO_Sybase;
-----------------------------------------------------------------------------------------------

mais c'est le yield qui me pose probleme

je l'ai mis ds retrieverow mais meme si je clique l'arrêt n'est pas instantané

merci d'avance

Hors ligne

 

#10 29-10-2013 11:52:41

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 723
Pépites: 11,352
Banque: 100,221,387,868,884,300
Site web

Re: [RESOLU] Arrêter le Retrieve sur une Datawindow...

remypb a écrit:

Bonjour

Je mets DBParm a 1 lors de la connection
comme indiqué ci dessous (TO_Sybase est mon objet de connexion)
...
TO_Sybase.DBParm        = '1'
...

Aïe...
Il faudrait faire :

Code: pb

TO_Sybase.DBParm="Async=1"

https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#11 29-10-2013 12:31:48

remypb  
Membre Geek
Date d'inscription: 19-04-2013
Messages: 65
Pépites: 262
Banque: 0

Re: [RESOLU] Arrêter le Retrieve sur une Datawindow...

Ah ok

et c'est cela qui va donner la possibilité à l'utilisateur d'avoir la main et donc d'interrompre le traitement ?

le code que j'ai placé ds le retrieverow avec yield est donc correct ?

Hors ligne

 

#12 29-10-2013 13:55:34

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 723
Pépites: 11,352
Banque: 100,221,387,868,884,300
Site web

Re: [RESOLU] Arrêter le Retrieve sur une Datawindow...

Oui ça devrait faire l'affaire.


https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#13 29-10-2013 14:02:22

remypb  
Membre Geek
Date d'inscription: 19-04-2013
Messages: 65
Pépites: 262
Banque: 0

Re: [RESOLU] Arrêter le Retrieve sur une Datawindow...

merci pour votre aide !!!

Hors ligne

 

#14 29-10-2013 14:40:13

Yanis  
Modérateur
Lieu: paris
Date d'inscription: 16-06-2010
Messages: 349
Pépites: 665
Banque: 150

Re: [RESOLU] Arrêter le Retrieve sur une Datawindow...

Salut,

     Si celà fonctionne maintenant peut tu mettre résolu sur ton post.


Cdt
Yanis

Hors ligne

 

#15 29-10-2013 15:23:20

remypb  
Membre Geek
Date d'inscription: 19-04-2013
Messages: 65
Pépites: 262
Banque: 0

Re: [RESOLU] Arrêter le Retrieve sur une Datawindow...

non cela fonctionne pas

je clique bien sur le bouton Stop (qui a le code suivant)
------------------------------------------------------------------------------------------
ib_cancel = true

IF is_dw_curr = "dw_count" THEN
    dw_count.dbcancel()                
ELSE
    dw_resultat.dbcancel()
END IF

this.enabled = false
----------------------------------------------------------------------
et quand je clique sur le bouton Stop il se grise bien mais la suite du traitement ne se déroule pas

que fait il apres le dbcancel ? quel event reprend la main apres le clic sur le bouton ???
j'ai mis un point d'arret ds retrieverow mais il passe pas par cet event
ou va t il ?

Dernière modification par remypb (29-10-2013 15:24:18)

Hors ligne

 

#16 29-10-2013 15:34:31

Yanis  
Modérateur
Lieu: paris
Date d'inscription: 16-06-2010
Messages: 349
Pépites: 665
Banque: 150

Re: [RESOLU] Arrêter le Retrieve sur une Datawindow...

Salut,

    Qu'est ce que tu entend par la suite du traitement ne se déroule pas ?

   Après le DBCANCEL l'evt retrieveend est déclenché.

   Peut être n'a t'il pas encore commencé de lire ( faire des FETCH) les lignes renvoyés par le SGBD. Donc ta datawindow est vide.
   Si ta requête est complexe le SGBD peut mettre un certain temps pour définir le ResultSet et seulement après commencé à te renvoyer les lignes.
   


Cdt
Yanis

Hors ligne

 

#17 29-10-2013 15:46:18

remypb  
Membre Geek
Date d'inscription: 19-04-2013
Messages: 65
Pépites: 262
Banque: 0

Re: [RESOLU] Arrêter le Retrieve sur une Datawindow...

ben apres le clic je voulais que le bouton stop se grise et que le retrieve se termine avec affichage du nombre de lignes recuperees + activation du bouton close

donc si c le event retrievend qui est déclenché après le clic je peux coder le end pour finir comme je souhaite le traitement ?

et si ma dw est vide ou si le sgbd na pas renvoyé de lignes quel event est declenché ?

Hors ligne

 

#18 29-10-2013 16:23:03

Yanis  
Modérateur
Lieu: paris
Date d'inscription: 16-06-2010
Messages: 349
Pépites: 665
Banque: 150

Re: [RESOLU] Arrêter le Retrieve sur une Datawindow...

Salut,

     Seul l'evt retrieveend sera déclenché par le DBCANCEL.

     Donc comme le retrieveend est déclenché que ce soit par le DBCANCEL ou par le fait que tu es arrivé à la fin de ta lecture, tu peux coder dans le retieveend le fait de rendre dispo le bouton  close . Pour obtenir le nombre de ligne récupérées appelle la fonction dw_1.rowCount(). Si c'est 0 c'est que tu n'as aucune ligne.

       Il n'y a pas d'evt spécifique déclenché suite à un retrieve qui ne renverrait aucune lignes. C'est l'evt retrieveend qui est déclenché.

Cdt
Yanis

Hors ligne

 

#19 29-10-2013 16:36:22

remypb  
Membre Geek
Date d'inscription: 19-04-2013
Messages: 65
Pépites: 262
Banque: 0

Re: [RESOLU] Arrêter le Retrieve sur une Datawindow...

merci beaucoup

je teste ca et je te dis

mais jai confiance

Hors ligne

 

#20 30-10-2013 09:41:58

remypb  
Membre Geek
Date d'inscription: 19-04-2013
Messages: 65
Pépites: 262
Banque: 0

Re: [RESOLU] Arrêter le Retrieve sur une Datawindow...

ça marche pas du tout ......


sur le bouton STOP j'ai écrit
-------------------------------

Code: pb

int  li_res
ib_cancel = true
li_res = dw_count.dbcancel()  
return 0

------------------------------------

ds le retrieveend j'ai ecrit
------------------------------------

Code: pb

Messagebox("INFO","retrieveend")

wf_fin_retrieve( )                           /// fonction de fin de recherche

return 0

------------------------------------


code de la fonction wf_fin_retrieve
-----------------------------------------

Code: pb

Messagebox("INFO","wf_fin_retrieve")

IF NOT ib_cancel THEN 
  Messagebox("INFO","Arret demandé par l'utilisateur ,StopSign!)  
END IF

cb_stop.enabled = false
..................

-----------------------------------------

lorsque je clique sur STOP il ne passe pas par le retrieveend et encore moins dans la fonction
la seule chose qui se produit c'est le plantage de PB

je comprends pas trop

Dernière modification par remypb (30-10-2013 10:06:21)

Hors ligne

 

#21 30-10-2013 09:51:34

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

Re: [RESOLU] Arrêter le Retrieve sur une Datawindow...

(ça simplifie la lecture des scripts, et vu que c'est là autant en profiter ^^)


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

Hors ligne

 

#22 30-10-2013 10:39:30

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 723
Pépites: 11,352
Banque: 100,221,387,868,884,300
Site web

Re: [RESOLU] Arrêter le Retrieve sur une Datawindow...

Tiens essais déjà çà, ca fonctionne très bien chez moi avec la base de démo ASA v105, c'est une fenêtre response qui permet de tester le fonctionnement.

Code: pb

forward
global type w_test_async from window
end type
type st_status from statictext within w_test_async
end type
type cb_retrieve from commandbutton within w_test_async
end type
type cb_canceldb from commandbutton within w_test_async
end type
type cb_close from commandbutton within w_test_async
end type
type dw_1 from datawindow within w_test_async
end type
end forward

global type w_test_async from window
integer width = 2834
integer height = 1608
boolean titlebar = true
string title = "Untitled"
boolean controlmenu = true
windowtype windowtype = response!
long backcolor = 67108864
string icon = "AppIcon!"
boolean center = true
st_status st_status
cb_retrieve cb_retrieve
cb_canceldb cb_canceldb
cb_close cb_close
dw_1 dw_1
end type
global w_test_async w_test_async

type variables
boolean ib_cancel = false
end variables

event open;if SQLCA.dbhandle() <> 0 then
  DISCONNECT;
end if
// Profile EAS Demo DB V105
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.DBParm = "ConnectString='DSN=EAS Demo DB V105;UID=dba;PWD=sql',Async=1"
CONNECT;
if sqlca.sqlcode <> 0 then
  messagebox( "SQLCA", sqlca.sqlerrtext )
  halt close
end if

string ls_error, ls_dwsyntax
ls_dwsyntax = sqlca.syntaxfromsql( "select * from exam_xref_info", "style(type=grid)", ls_error )
if ls_dwsyntax="" or ls_error <> "" then
  messagebox("syntaxfromsql failed", ls_error)
  return
end if

dw_1.create( ls_dwsyntax, ls_error )
if ls_error <> "" then
  messagebox("syntaxfromsql failed", ls_error)
  return
end if
dw_1.setTransobject( sqlca )
end event

on w_test_async.create
this.st_status=create st_status
this.cb_retrieve=create cb_retrieve
this.cb_canceldb=create cb_canceldb
this.cb_close=create cb_close
this.dw_1=create dw_1
this.Control[]={this.st_status,&
this.cb_retrieve,&
this.cb_canceldb,&
this.cb_close,&
this.dw_1}
end on

on w_test_async.destroy
destroy(this.st_status)
destroy(this.cb_retrieve)
destroy(this.cb_canceldb)
destroy(this.cb_close)
destroy(this.dw_1)
end on

type st_status from statictext within w_test_async
integer x = 901
integer y = 1416
integer width = 1477
integer height = 84
integer textsize = -10
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Tahoma"
long textcolor = 33554432
long backcolor = 67108864
string text = "message here...."
boolean focusrectangle = false
end type

type cb_retrieve from commandbutton within w_test_async
integer x = 18
integer y = 1400
integer width = 402
integer height = 112
integer taborder = 30
integer textsize = -10
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Tahoma"
string text = "Retrieve"
end type

event clicked;this.enabled = false
cb_canceldb.enabled = true
ib_cancel = false
dw_1.retrieve( )
end event

type cb_canceldb from commandbutton within w_test_async
integer x = 425
integer y = 1400
integer width = 448
integer height = 112
integer taborder = 20
integer textsize = -10
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Tahoma"
boolean enabled = false
string text = "Cancel retrieve"
end type

event clicked;int r
r = dw_1.dbcancel( )
if r <> 1 then
  messagebox( "dbcancel failed", r )
  return
end if

ib_cancel = true

end event

type cb_close from commandbutton within w_test_async
integer x = 2405
integer y = 1404
integer width = 402
integer height = 112
integer taborder = 20
integer textsize = -10
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Tahoma"
string text = "Close"
end type

event clicked;close( parent )
end event

type dw_1 from datawindow within w_test_async
integer width = 2821
integer height = 1392
integer taborder = 10
string title = "none"
boolean hscrollbar = true
boolean vscrollbar = true
boolean livescroll = true
borderstyle borderstyle = stylelowered!
end type

event retrieveend;cb_canceldb.enabled = false
cb_retrieve.enabled = true

st_status.text = string(rowcount) + " row(s) retrieved (retrieveend)"
end event

event retrieverow;
st_status.text = string(row) + " row(s) retrieved (retrieverow)"

if ib_cancel then
  return 1
end if

return 0
end event


Par contre, c'est quoi ton moteur de base de données ?

Par ce que la doc v10.5 dit :

Async database parameter
...
Applies to

ASE, SYC Sybase Adaptive Server Enterprise
DIR Sybase DirectConnect
IN9 Informix
JDB JDBC
ODBC (if driver and back-end DBMS support this feature)
O84 Oracle 8.x and Oracle8i (8.1.5 and higher database connections only)
O90 Oracle9i
O10 Oracle 10g


https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#23 30-10-2013 10:45:05

Yanis  
Modérateur
Lieu: paris
Date d'inscription: 16-06-2010
Messages: 349
Pépites: 665
Banque: 150

Re: [RESOLU] Arrêter le Retrieve sur une Datawindow...

Salut

remu a écrit:

Messagebox("INFO","wf_fin_retrieve")

IF NOT ib_cancel THEN
    Messagebox("INFO","Arret demandé par l'utilisateur ,StopSign!)   
END IF

cb_stop.enabled = false
..................

Je pense que tu voulais mettre

Code: PB

IF ib_cancel THEN 
  Messagebox("INFO","Arret demandé par l'utilisateur ,StopSign!)  
END IF



et pourrais tu nous mettre le code de ton retrieverow stp ?


Cdt
Yanis

Hors ligne

 

#24 30-10-2013 11:01:42

remypb  
Membre Geek
Date d'inscription: 19-04-2013
Messages: 65
Pépites: 262
Banque: 0

Re: [RESOLU] Arrêter le Retrieve sur une Datawindow...

code du retrieverow

Code: pb

Yield()

If ib_cancel Then RETURN 1

Hors ligne

 

#25 30-10-2013 13:09:41

remypb  
Membre Geek
Date d'inscription: 19-04-2013
Messages: 65
Pépites: 262
Banque: 0

Re: [RESOLU] Arrêter le Retrieve sur une Datawindow...

là ça va un peu mieux car j'arrive à interrompre le traitement en cliquant sur STOP

mais le problème restant est le temps qui s’écoule entre le moment où je clique sur le bouton STOP et l'arrêt effectif du retrieve avec l’exécution de la fonction wf_fin_retrieve

je viens de faire le test .... entre le moment du clic et l'exécution de wf_fin_retrieve il se passe 34 secondes

pourquoi c'est pas instantané ?

je suis sur Sybase 15

merci pour votre aide

voila

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22