FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Refrescar Recorset Tiempo Ejecucci贸n
Posts: 1816
Joined: Wed Oct 26, 2005 02:49 PM
Refrescar Recorset Tiempo Ejecucci贸n
Posted: Mon Nov 16, 2020 09:14 PM
Buenas tardes para todos,

En este momento me surge la necesidad de actualizar o mejor dicho cambiar el recorset en tiempo de ejecuci贸n, lo estoy intentando de la siguiente manera, pero al hacer el requery, sale un error.

Cabe aclarar que la primera vez, se muestra bien, el problema surge cuando hago click sobre uno de los botones.

Code (fw): Select all Collapse
#include "fivewin.ch"
#include "ado.ch"

function Main()

聽 聽local oCnFtr, oRsFtr, oDlg, oBrw,cCnd,cQry,oError
聽 聽local aSql 聽:= { 聽"select * from tbl_empr", ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"select * from tbl_empr WHERE e_codi='01'", ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"select * from tbl_empr WHERE e_tipo='CONTABLE'" }

聽 聽 //CREAMOS UNA CONEXION PARA SOLO FACTURACION
聽 聽 cCnd := "DSN=dlyma;Uid=root;Pwd=secret;"
聽 聽 oCnFtr := FW_OpenAdoConnection( cCnd )
聽 聽 cQry := "USE dlyma"
聽 聽 TRY
聽 聽 聽 oCnFtr:Execute(cQry)
聽 聽 CATCH oError
聽 聽 聽 FW_ShowAdoError(oCnFtr)
聽 聽 END
聽 聽 
聽 聽 oRsFtr := FW_OPENRECORDSET(oCnFtr,aSql[1],adLockOptimistic,adOpenKeyset)

聽 聽DEFINE DIALOG oDlg SIZE 600,400 PIXEL TRUEPIXEL ;
聽 聽 聽 TITLE "SWITCH TABLES/FIELDS AT RUNTIME"

聽 聽@ 60, 20 XBROWSE oBrw SIZE -20,-20 PIXEL OF oDlg ;
聽 聽 聽 DATASOURCE oRsFtr AUTOCOLS CELL LINES NOBORDER
聽 聽oBrw:CreateFromCode()

聽 聽@ 20, 20 BTNBMP PROMPT "sin filtro" ;
聽 聽 聽 SIZE 100,35 PIXEL OF oDlg FLAT ;
聽 聽 聽 ACTION ( CursorWait(), oRsFtr:Requery( aSql[ 1 ] ), oRsFtr:SetXbrColumns( oBrw ) )

聽 聽@ 20,140 BTNBMP PROMPT "filtro 1" ;
聽 聽 聽 SIZE 100,35 PIXEL OF oDlg FLAT ;
聽 聽 聽 ACTION ( CursorWait(), oRsFtr:Requery( aSql[ 2 ] ), oRsFtr:SetXbrColumns( oBrw ) )

聽 聽@ 20,260 BTNBMP PROMPT "filtro 2" ;
聽 聽 聽 SIZE 100,35 PIXEL OF oDlg FLAT ;
聽 聽 聽 ACTION ( CursorWait(), oRsFtr:Requery( aSql[ 3 ] ), oRsFtr:SetXbrColumns( oBrw ) )

聽 聽ACTIVATE DIALOG oDlg CENTERED

聽 聽oCnFtr:Close()

return nil


El error

Code (fw): Select all Collapse
Application
===========
聽 聽Path and name: C:\fwh1909\samples\leandro.exe (32 bits)
聽 聽Size: 3,862,528 bytes
聽 聽Compiler version: xHarbour 1.2.3 Intl. (SimpLex) (Build 20190613)
聽 聽FiveWin 聽version: FWH 19.09
聽 聽C compiler version: Borland/Embarcadero C++ 7.3 (32-bit)
聽 聽Windows version: 6.2, Build 9200 

聽 聽Time from start: 0 hours 0 mins 1 secs 
聽 聽Error occurred at: 11/16/20, 16:10:35
聽 聽Error description: Error ADODB.RecordSet/6 聽DISP_E_UNKNOWNNAME: REQUERY
聽 聽Args:
聽 聽 聽[ 聽 1] = C 聽 select * from tbl_empr WHERE e_codi='01'

Stack Calls
===========
聽 聽Called from: 聽=> TOLEAUTO:REQUERY( 0 )
聽 聽Called from: leandro.prg => (b)MAIN( 36 )
聽 聽Called from: .\source\classes\BTNBMP.PRG => TBTNBMP:CLICK( 704 )
聽 聽Called from: .\source\classes\BTNBMP.PRG => TBTNBMP:LBUTTONUP( 990 )
聽 聽Called from: .\source\classes\CONTROL.PRG => TCONTROL:HANDLEEVENT( 1791 )
聽 聽Called from: .\source\classes\BTNBMP.PRG => TBTNBMP:HANDLEEVENT( 2030 )
聽 聽Called from: .\source\classes\WINDOW.PRG => _FWH( 3559 )
聽 聽Called from: 聽=> DIALOGBOXINDIRECT( 0 )
聽 聽Called from: .\source\classes\DIALOG.PRG => TDIALOG:ACTIVATE( 304 )
聽 聽Called from: leandro.prg => MAIN( 42 )
Saludos
LEANDRO AREVALO
Bogot谩 (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 2706
Joined: Fri Oct 07, 2005 01:50 PM
Re: Refrescar Recorset Tiempo Ejecucci贸n
Posted: Mon Nov 16, 2020 09:57 PM

leandro

Generally speaking, if you add a record, Delete or Edit a record .. usually oLbx:ReFresh() takes care of the change in the recordset in xBrowse()...

oRsAdd()
...

oRs:Update()
oLbx:ReFresh()

Rick Lipkin

Posts: 1816
Joined: Wed Oct 26, 2005 02:49 PM
Re: Refrescar Recorset Tiempo Ejecucci贸n
Posted: Thu Nov 19, 2020 02:34 PM
Gracias por responder Rick

Lo que pasa es que los recorset se est谩n volviendo demasiado grandes y la consulta esta empezando a tardar mas tiempo a medida que va creciendo la base de datos, por lo que requiero 煤nicamente cargar al inicio de la aplicaci贸n algunos registros, puede ser usando LIMIT o un WHERE, dependiendo del mes activo o el id del cliente... etc...

Por lo que requiero hacer algo similar a una paginaci贸n para que los recorset se vayan creando a medida que el usuario va navegando por la informaci贸n, y de paso solucionamos los tiempo de carga de dicha informaci贸n.

Yo estuve mirando en el foro y me tope con una soluci贸n que monto Mr.Rao, pero con MySql/MariaDB: RowSet object, estuve adaptando ese ejemplo con ADO, pero me di cuenta en un post mas adelante que no es compatible.

http://forums.fivetechsupport.com/viewtopic.php?f=3&t=32737&p=192380&hilit=requery+ado#p192380
De antemano gracias,
Saludos
LEANDRO AREVALO
Bogot谩 (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 1816
Joined: Wed Oct 26, 2005 02:49 PM
Re: Refrescar Recorset Tiempo Ejecucci贸n
Posted: Sat May 22, 2021 12:11 AM
Encontr茅 una forma de hacerlo "a pie" jejejejeje

Code (fw): Select all Collapse
function cambiorecorset()
//Primero Cerramos el recorset
oRsFtr:close()
//Cambiamos la consulta
cVar := "SELECT * FROM tbl_tal WHERE tipo=1"
//Creamos el nuevo recorset
oRsFtr := FW_OPENRECORDSET(oCnFtr,cVar,adLockOptimistic,adOpenKeyset)
//Se lo asignamos al xbrowse
oBrwFt:oRs := oRsFtr
//refrescamos
oBrwFt:refresh()
Return nil
Saludos
LEANDRO AREVALO
Bogot谩 (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Refrescar Recorset Tiempo Ejecucci贸n
Posted: Sun May 23, 2021 10:19 PM
Code (fw): Select all Collapse
oRs := FW_OpenRecordSet( ... )
// BROWSE oRs

// Changing query at runtime:
oRs:Close()
oRs:Source := <new query>
oRs:Open()
oBrw:GoTop()
oBrw:Refresh()
Regards



G. N. Rao.

Hyderabad, India
Posts: 1816
Joined: Wed Oct 26, 2005 02:49 PM
Re: Refrescar Recorset Tiempo Ejecucci贸n
Posted: Mon May 24, 2021 03:02 PM

Mr Nages.

De la manera que dices no funciona para mi, el recorset parece estar ah铆, pero al refrescar el xbrowse, este se muestra vac铆o.

Saludos
LEANDRO AREVALO
Bogot谩 (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Refrescar Recorset Tiempo Ejecucci贸n
Posted: Mon May 24, 2021 06:21 PM
It has to work.
Please check your implementation once again and try.

We give you a very small example here.
In this example, the recordset is first opened with:
"select * from customer where [STATE] = 'NY'".

On right-click on the browse, the recordset source is changed to
"SELECT * FROM CUSTOMER WHERE [STATE] = 'WA'"

Code (fw): Select all Collapse
#include "fivewin.ch"

function Main()

   local oCn, oRs

   oCn   := FW_OpenADOConnection( "xbrtest.mdb" )
   oRs   := FW_OpenRecordSet( oCn, "select * from customer where [STATE] = 'NY'" )

   XBROWSER oRs TITLE FWVERSION COLUMNS "FIRST", "CITY", "STATE" SETUP ( ;
      oBrw:bRClicked := { |r,c,f,brw| brw:oRs:Close(), ;
           brw:oRs:Source := "SELECT * FROM CUSTOMER WHERE [STATE] = 'WA'", ;
           brw:oRs:Open(), ;
           brw:GoTop(), ;
           brw:Refresh() } )

   oRs:Close()
   oCn:Close()

return nil


Regards



G. N. Rao.

Hyderabad, India

Continue the discussion