Refrescar Recorset Tiempo Ejecucción

Post Reply
User avatar
leandro
Posts: 1770
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Has thanked: 49 times
Been thanked: 12 times
Contact:

Refrescar Recorset Tiempo Ejecucción

Post 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


#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


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 24.09 ] [ xHarbour 64 bits) ]
User avatar
Rick Lipkin
Posts: 2669
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA

Re: Refrescar Recorset Tiempo Ejecucción

Post 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
User avatar
leandro
Posts: 1770
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Has thanked: 49 times
Been thanked: 12 times
Contact:

Re: Refrescar Recorset Tiempo Ejecucción

Post 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,
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 24.09 ] [ xHarbour 64 bits) ]
User avatar
leandro
Posts: 1770
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Has thanked: 49 times
Been thanked: 12 times
Contact:

Re: Refrescar Recorset Tiempo Ejecucción

Post by leandro »

Encontré una forma de hacerlo "a pie" jejejejeje

Code: Select all | Expand


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 24.09 ] [ xHarbour 64 bits) ]
User avatar
nageswaragunupudi
Posts: 10729
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 10 times
Contact:

Re: Refrescar Recorset Tiempo Ejecucción

Post by nageswaragunupudi »

Code: Select all | Expand

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
leandro
Posts: 1770
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Has thanked: 49 times
Been thanked: 12 times
Contact:

Re: Refrescar Recorset Tiempo Ejecucción

Post 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.
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 24.09 ] [ xHarbour 64 bits) ]
User avatar
nageswaragunupudi
Posts: 10729
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 10 times
Contact:

Re: Refrescar Recorset Tiempo Ejecucción

Post 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

#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
Post Reply