Refrescar Recorset Tiempo Ejecucción

Refrescar Recorset Tiempo Ejecucción

Postby leandro » Mon Nov 16, 2020 9: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: Select all  Expand view  RUN

#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  RUN

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

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Refrescar Recorset Tiempo Ejecucción

Postby Rick Lipkin » Mon Nov 16, 2020 9: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
User avatar
Rick Lipkin
 
Posts: 2666
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA

Re: Refrescar Recorset Tiempo Ejecucción

Postby leandro » Thu Nov 19, 2020 2: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

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Refrescar Recorset Tiempo Ejecucción

Postby leandro » Sat May 22, 2021 12:11 am

Encontré una forma de hacerlo "a pie" jejejejeje

Code: Select all  Expand view  RUN

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

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Refrescar Recorset Tiempo Ejecucción

Postby nageswaragunupudi » Sun May 23, 2021 10:19 pm

Code: Select all  Expand view  RUN
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
User avatar
nageswaragunupudi
 
Posts: 10656
Joined: Sun Nov 19, 2006 5:22 am
Location: India

Re: Refrescar Recorset Tiempo Ejecucción

Postby leandro » Mon May 24, 2021 3: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

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Refrescar Recorset Tiempo Ejecucción

Postby nageswaragunupudi » Mon May 24, 2021 6: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: Select all  Expand view  RUN
#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
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
 
Posts: 10656
Joined: Sun Nov 19, 2006 5:22 am
Location: India


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 21 guests