Page 1 of 1

Refrescar Recorset Tiempo Ejecucción

PostPosted: Mon Nov 16, 2020 9:14 pm
by leandro
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: Select all  Expand view

#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: Select all  Expand view

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 )
 

Re: Refrescar Recorset Tiempo Ejecucción

PostPosted: Mon Nov 16, 2020 9:57 pm
by Rick Lipkin
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

Re: Refrescar Recorset Tiempo Ejecucción

PostPosted: Thu Nov 19, 2020 2:34 pm
by leandro
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,

Re: Refrescar Recorset Tiempo Ejecucción

PostPosted: Sat May 22, 2021 12:11 am
by leandro
Encontré una forma de hacerlo "a pie" jejejejeje

Code: Select all  Expand view

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
 

Re: Refrescar Recorset Tiempo Ejecucción

PostPosted: Sun May 23, 2021 10:19 pm
by nageswaragunupudi
Code: Select all  Expand view
oRs := FW_OpenRecordSet( ... )
// BROWSE oRs

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

Re: Refrescar Recorset Tiempo Ejecucción

PostPosted: Mon May 24, 2021 3:02 pm
by leandro
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.

Re: Refrescar Recorset Tiempo Ejecucción

PostPosted: Mon May 24, 2021 6:21 pm
by nageswaragunupudi
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: Select all  Expand view
#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
 


Image