Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
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
Dans ton event retrieverow, tu fais des Yield() ?
Hors ligne
Oui j'ai bien un Yield()
Code du RetrieveRow
Yield() If(ib_DbCancel = True) Then RETURN 1 End If
Dernière modification par ORIOR (16-03-2011 10:44:55)
Hors ligne
Hors ligne
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
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 :
do while Yield() : loop //car Yield() retourne true tant qu'il y a des messages à traiter* (enfin pas tout à fait)
Hors ligne
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
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
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
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
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 :
TO_Sybase.DBParm="Async=1"
Hors ligne
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
Oui ça devrait faire l'affaire.
Hors ligne
merci pour votre aide !!!
Hors ligne
Salut,
Si celà fonctionne maintenant peut tu mettre résolu sur ton post.
Cdt
Yanis
Hors ligne
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
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
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
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
merci beaucoup
je teste ca et je te dis
mais jai confiance
Hors ligne
ça marche pas du tout ......
sur le bouton STOP j'ai écrit
-------------------------------
int li_res ib_cancel = true li_res = dw_count.dbcancel() return 0
------------------------------------
ds le retrieveend j'ai ecrit
------------------------------------
Messagebox("INFO","retrieveend") wf_fin_retrieve( ) /// fonction de fin de recherche return 0
------------------------------------
code de la fonction wf_fin_retrieve
-----------------------------------------
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
(ça simplifie la lecture des scripts, et vu que c'est là autant en profiter ^^)
Hors ligne
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.
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
Hors ligne
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
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
code du retrieverow
Yield() If ib_cancel Then RETURN 1
Hors ligne
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