Page 1 of 1

Cómo resetear oBrw:oseek [SOLUCIONADO]

Posted: Mon Nov 30, 2020 9:08 pm
by Ramón J.
Hola a todos
Veréis tengo dos base de datos relacioandas: Proveedores y productos y se muestran los datos en un Folderex, por una parte los datos del proveedors y en el otro los productos.
Al principio se muestran en xbrowse todo los proveedores por orden de código y he puesto un cuadro de búsqueda incremental por código y por nombre. El de código me da error y, si bien el del nombre me funciona a la hora salir de la edición se queda en el mismo registro y no se resetea el filtro. ¿Sabéis cómo se puede resetear? Otra cosa: ¿hay alguna manera de que en los obrw:oseek el cursor?

El código es el siguiente:

#include "FiveWin.ch"
#include "ord.ch"
#include "XBrowse.Ch"

function TELEM()

local oDlg, obrw

USE PROVEEDOR NEW SHARED alias "PROVE"
index on PROVE->CODIGO_PRO to CODPROVE
Set index to CODPROVE

USE PRODUCTOS NEW SHARED alias "PRODU"
index on PRODU->CODIGO_PRO to CODPRODU
Set index to CODPRODU

SELE PROVE
SET RELATION TO PROVE->CODIGO_PRO INTO PRODU


DEFINE DIALOG oDlg FROM 3, 3 TO 33, 100 TITLE "PROVEEDORES"

@ 1,1 XBROWSE oBrw SIZE 360, 160;
COLUMNS "CODIGO_PRO", "NOMBRE", "PROVINCIA" OF oDlg alias "PROVE";
HEADERS "Código", "Denominación", "Provincia";
COLSIZES 200, 300, 70 NOBORDER FASTEDIT FOOTERS

@ 2,10 SAY "Búsqueda por código:" SIZE 100,10 PIXEL OF oDlg
@ 2,70 SAY oBrw:oSeek VAR oBrw:cSeek SIZE 100,10 PIXEL OF oDlg COLOR CLR_HRED,CLR_YELLOW

@ 2,178 SAY "Búsqueda por nombre:" SIZE 100,10 PIXEL OF oDlg
@ 2,250 SAY oBrw:oSeek VAR oBrw:cSeek SIZE 100,10 PIXEL OF oDlg COLOR CLR_HRED,CLR_YELLOW
/*
oBrw:lIncrFilter := .t.
oBrw:lSeekWild := .t.
oBrw:cFilterFld := "CODIGO_PRO"
oBrw:bChange := {|| oBrw:oSeek:Refresh() <--- da error
*/
oBrw:lIncrFilter := .t.
oBrw:lSeekWild := .t.
oBrw:cFilterFld := "NOMBRE"
oBrw:bChange := {|| oBrw:oSeek:Refresh() }


oBrw:CreateFromCode()

@ 11, 15 BUTTON "Nuevo " OF oDlg ACTION oBrw:EditSource( .t. )
@ 11, 25 BUTTON "Editar " OF oDlg ACTION EditPro(oBrw)
@ 11, 35 BUTTON "Eliminar" OF oDlg ACTION oBrw:Delete()
@ 11, 45 BUTTON "&Imprimir" OF oDlg ;
ACTION oBrw:Report( "Listado ", .t. ) ; // .t. --> wants preview
SIZE 40, 12
@ 11,55 BUTTON "&Terminar" OF oDlg ACTION oDlg:End() SIZE 40, 12
ACTIVATE DIALOG oDlg CENTERED

return nil

//***************** EDICION CON FOLDER---------------
Function editPro(oBrw)
Local oDlg, oFld, oLbx
local nProve, oProve, cNombre, oNombre,cProvincia, oProvincia

NProve :=PROVE->CODIGO_PRO
cNombre :=PROVE->NOMBRE
cProvincia:=PROVE->PROVINCIA

DEFINE DIALOG oDlg FROM 3, 3 TO 20,70 TITLE "Mantenimiento"

@ 10, 5 FOLDEREX oFld PIXEL PROMPT "&Proveedor", "&Datos mercancías" SIZE 250,100

@ 20, 5 SAY "Código:" OF oFld:aDialogs[ 1 ] SIZE 60,10 PIXEL
@ 20, 100 SAY oProve var nProve OF oFld:aDialogs[ 1 ] SIZE 60,10 PIXEL
@ 30, 5 SAY "Razón social" OF oFld:aDialogs[ 1 ] SIZE 60,10 PIXEL
@ 30, 100 GET oNombre VAR cNombre OF oFld:aDialogs[ 1 ] SIZE 100,10 PIXEL
@ 40, 5 SAY "Provincia" OF oFld:aDialogs[ 1 ] SIZE 60,10 PIXEL
@ 40, 100 GET oProvincia VAR cProvincia OF oFld:aDialogs[ 1 ] SIZE 100,10 PIXEL
@ 60, 50 BUTTON "Grabar" OF oFld:aDialogs[1] SIZE 40,10 PIXEL action oDlg:end()
@ 60, 150 BUTTON "Salir" OF oFld:aDialogs[1] SIZE 40,10 PIXEL ACTION oDlg:End()

sele produ

produ->(ordscope(0, nProve))
produ->(ordscope(1, nProve))
produ->(DBSKIP(0))

if produ->(ordKeyCount())==0
MsgInfo("No se encontraron productos")
endif

@ 1,1 XBROWSE oLbx SIZE 250, 65 PIXEL;
COLUMNS "CODIGO_PRO", "PRODUCTO", "PRECIO" OF oFld:aDialogs[ 2 ] alias "PRODU";
HEADERS "Código proveedor", "Producto", "Precio";
COLSIZES 70,300,140;
JUSTIFY AL_RIGHT, AL_LEFT, AL_RIGHT;
PICTURES , , "@E 9,999,999.99" LINES NOBORDER FASTEDIT

oLbx:CreateFromCode()

ACTIVATE DIALOG oDlg CENTERED

Return nil

Re: Cómo resetear oBrw:oseek

Posted: Mon Nov 30, 2020 9:55 pm
by Ramón J.
Aquí adjunto los archivos dbf, prg y el exe:

https://drive.google.com/file/d/1uXyoOz ... sp=sharing

Re: Cómo resetear oBrw:oseek

Posted: Tue Dec 01, 2020 12:58 pm
by karinha
Comente, porfa:

Code: Select all

#include "FiveWin.ch"
#include "ord.ch"
#include "XBrowse.Ch"
 
FUNCTION TELEM()

   LOCAL oDlg, obrw, nKey := VK_RETURN
            
   USE PROVEEDOR NEW SHARED ALIAS "PROVE"
   INDEX ON PROVE->CODIGO_PRO TO CODPROVE
   SET INDEX TO CODPROVE
   
   USE PRODUCTOS NEW SHARED ALIAS "PRODU"
   INDEX ON PRODU->CODIGO_PRO TO CODPRODU
   SET INDEX TO CODPRODU
   
   SELE PROVE
   SET RELATION TO PROVE->CODIGO_PRO INTO PRODU
                             
   DEFINE DIALOG oDlg FROM 3, 3 TO 33, 100 TITLE "PROVEEDORES"
    
   @ 1, 1 XBROWSE oBrw SIZE 360, 160;
      COLUMNS "CODIGO_PRO", "NOMBRE", "PROVINCIA" OF oDlg ALIAS "PROVE";
      HEADERS "Código", "Denominación", "Provincia";
      COLSIZES 200, 300, 70 NOBORDER FASTEDIT FOOTERS

   @ 2, 10 SAY "Búsqueda por código:" SIZE 100, 10 PIXEL OF oDlg

   @ 2, 70 SAY oBrw:oSeek VAR oBrw:cSeek SIZE 100, 10 PIXEL OF oDlg COLOR CLR_HRED, CLR_YELLOW
 
   @ 2, 178 SAY "Búsqueda por nombre:" SIZE 100, 10 PIXEL OF oDlg

   @ 2, 250 SAY oBrw:oSeek VAR oBrw:cSeek SIZE 100, 10 PIXEL OF oDlg COLOR CLR_HRED, CLR_YELLOW

   /*
   oBrw:lIncrFilter      := .t.
   oBrw:lSeekWild        := .t.
   oBrw:cFilterFld       := "CODIGO_PRO"
   oBrw:bChange   := {|| oBrw:oSeek:Refresh()    <--- da error
   */

   oBrw:lIncrFilter      := .T.
   oBrw:lSeekWild        := .T.
   oBrw:cFilterFld       := "NOMBRE"
   // oBrw:bChange   := {|| oBrw:oSeek:Refresh() }
   oBrw:bChange   := {|| oBrw:oSeek( "" ) }
   oBrw:bKeyChar   := { |nKey| If( nKey == VK_ESCAPE, ( oBrw:Seek( "" ), oDlg:End() ), nil ) }
 
   oBrw:CreateFromCode()

   @ 11, 15 BUTTON "Nuevo   " OF oDlg  ACTION oBrw:EditSource( .T. )

   @ 11, 25 BUTTON "Editar  " OF oDlg  ACTION EditPro( oBrw )

   @ 11, 35 BUTTON "Eliminar" OF oDlg  ACTION oBrw:Delete()

   @ 11, 45 BUTTON "&Imprimir"  OF oDlg ;
      ACTION oBrw:Report( "Listado de SAT", .T. ) ;  // .t. --> wants preview
      SIZE 40, 12

   @ 11, 55 BUTTON "&Terminar" OF oDlg ACTION oDlg:End() SIZE 40, 12

   ACTIVATE DIALOG oDlg CENTERED                                             ;
      ON INIT ( oBrw:cSeek( "" ), oBrw:SetFocus(), .F. )

RETURN nil

//***************** EDICION CON FOLDER---------------

FUNCTION editPro( oBrw )

   LOCAL oDlg, oFld, oLbx
   LOCAL nProve, oProve, cNombre, oNombre, cProvincia, oProvincia

   NProve    := PROVE->CODIGO_PRO
   cNombre   := PROVE->NOMBRE
   cProvincia := PROVE->PROVINCIA

   DEFINE DIALOG oDlg FROM 3, 3 TO 20, 70 TITLE "Mantenimiento"


   @ 10, 5 FOLDEREX oFld PIXEL PROMPT "&Proveedor", "&Datos mercancías" SIZE 250, 100
 
   @ 20, 5 SAY "Código:" OF oFld:aDialogs[ 1 ]  SIZE 60, 10 PIXEL

   @ 20, 100 SAY oProve var nProve OF oFld:aDialogs[ 1 ]  SIZE 60, 10 PIXEL

   @ 30, 5 SAY "Razón social" OF oFld:aDialogs[ 1 ] SIZE 60, 10 PIXEL

   @ 30, 100 GET oNombre VAR cNombre OF oFld:aDialogs[ 1 ]  SIZE 100, 10 PIXEL

   @ 40, 5 SAY "Provincia" OF oFld:aDialogs[ 1 ] SIZE 60, 10 PIXEL

   @ 40, 100 GET oProvincia VAR cProvincia OF oFld:aDialogs[ 1 ]  SIZE 100, 10 PIXEL

   @ 60, 50 BUTTON "Grabar" OF oFld:aDialogs[1] SIZE 40, 10 PIXEL action oDlg:end()

   @ 60, 150 BUTTON "Salir" OF oFld:aDialogs[1] SIZE 40, 10 PIXEL ACTION  oDlg:End()

   SELE produ

   produ->( ordscope( 0, nProve ) )
   produ->( ordscope( 1, nProve ) )
   produ->( DBSKIP( 0 ) )

   IF produ->( ordKeyCount() ) == 0
      MsgInfo( "No se encontraron productos" )
   ENDIF
 
   @ 1, 1 XBROWSE oLbx SIZE 250, 65 PIXEL;
      COLUMNS "CODIGO_PRO", "PRODUCTO", "PRECIO" OF oFld:aDialogs[ 2 ] ALIAS "PRODU";
      HEADERS "Código proveedor", "Produto", "Precio";
      COLSIZES 70, 300, 140;
      JUSTIFY AL_RIGHT, AL_LEFT, AL_RIGHT;
      PICTURES , , "@E 9,999,999.99" LINES NOBORDER FASTEDIT

   oLbx:CreateFromCode()
 
   ACTIVATE DIALOG oDlg CENTERED

RETURN nil
 
Saludos.

Re: Cómo resetear oBrw:oseek

Posted: Tue Dec 01, 2020 9:09 pm
by Ramón J.
Gracias,

Lo que buscaba es que al salir de la edición del registro se reseteara el obrw:cseek y se mostraran de nuevo todos los registros.

Es decir, lo que está en rojo:

FUNCTION editPro( oBrw )

LOCAL oDlg, oFld, oLbx, Lsalir:=.f.
LOCAL nProve, oProve, cNombre, oNombre, cProvincia, oProvincia

NProve := PROVE->CODIGO_PRO
cNombre := PROVE->NOMBRE
cProvincia := PROVE->PROVINCIA

DEFINE DIALOG oDlg FROM 3, 3 TO 20, 70 TITLE "Mantenimiento"


@ 10, 5 FOLDEREX oFld PIXEL PROMPT "&Proveedor", "&Datos mercancías" SIZE 250, 100

@ 20, 5 SAY "Código:" OF oFld:aDialogs[ 1 ] SIZE 60, 10 PIXEL

@ 20, 100 SAY oProve var nProve OF oFld:aDialogs[ 1 ] SIZE 60, 10 PIXEL

@ 30, 5 SAY "Razón social" OF oFld:aDialogs[ 1 ] SIZE 60, 10 PIXEL

@ 30, 100 GET oNombre VAR cNombre OF oFld:aDialogs[ 1 ] SIZE 100, 10 PIXEL

@ 40, 5 SAY "Provincia" OF oFld:aDialogs[ 1 ] SIZE 60, 10 PIXEL

@ 40, 100 GET oProvincia VAR cProvincia OF oFld:aDialogs[ 1 ] SIZE 100, 10 PIXEL

@ 60, 50 BUTTON "Grabar" OF oFld:aDialogs[1] SIZE 40, 10 PIXEL action oDlg:end()

@ 60, 150 BUTTON "Salir" OF oFld:aDialogs[1] SIZE 40, 10 PIXEL ACTION (lSalir:=.t., oDlg:End())

SELE produ

produ->( ordscope( 0, nProve ) )
produ->( ordscope( 1, nProve ) )
produ->( DBSKIP( 0 ) )

IF produ->( ordKeyCount() ) == 0
MsgInfo( "No se encontraron productos" )
ENDIF

@ 1, 1 XBROWSE oLbx SIZE 250, 65 PIXEL;
COLUMNS "CODIGO_PRO", "PRODUCTO", "PRECIO" OF oFld:aDialogs[ 2 ] ALIAS "PRODU";
HEADERS "Código proveedor", "Produto", "Precio";
COLSIZES 70, 300, 140;
JUSTIFY AL_RIGHT, AL_LEFT, AL_RIGHT;
PICTURES , , "@E 9,999,999.99" LINES NOBORDER FASTEDIT

oLbx:CreateFromCode()

ACTIVATE DIALOG oDlg CENTERED valid lSalir

if lsalir
oBrw:cSeek( "" )
OBrw:refresh()
oBrw:SetFocus()
endif

RETURN nil

Re: Cómo resetear oBrw:oseek

Posted: Sat Dec 05, 2020 11:39 am
by Ramón J.
Hola, de nuevo
Hace unos días, planteé un tema de cómo refrescar el oBrw:oseek después de editar un registro. Me ayudó mucho João, pero me da la impresión de que en mi respuesta posterior a una parte de mi planteamiento no me expliqué bien y puse en rojo el código que yo pretendía que funcionara. También planteé cómo hacer que se vea el cursor en cuando está el foco en SAY oBrw: oBuscar VAR oBrw: cBuscar

Es decir, que después de buscar un registro con SAY oBrw: oBuscar VAR oBrw: cBuscar , editarlo con editPro(oBrw) y después, al terminar de editarlo, volver a oBrw con todos los registros, no solo los buscados:

El código es el siguiente:

#include "FiveWin.ch"
#include "ord.ch"
#include "XBrowse.Ch"

FUNCTION TELEM()

LOCAL oDlg, obrw, nKey := VK_RETURN

USE PROVEEDOR NEW SHARED ALIAS "PROVE"
INDEX ON PROVE->CODIGO_PRO TO CODPROVE
SET INDEX TO CODPROVE

USE PRODUCTOS NEW SHARED ALIAS "PRODU"
INDEX ON PRODU->CODIGO_PRO TO CODPRODU
SET INDEX TO CODPRODU

SELE PROVE
SET RELATION TO PROVE->CODIGO_PRO INTO PRODU

DEFINE DIALOG oDlg FROM 3, 3 TO 33, 100 TITLE "PROVEEDORES"

@ 1, 1 XBROWSE oBrw SIZE 360, 160;
COLUMNS "CODIGO_PRO", "NOMBRE", "PROVINCIA" OF oDlg ALIAS "PROVE";
HEADERS "Código", "Denominación", "Provincia";
COLSIZES 200, 300, 70 NOBORDER FASTEDIT FOOTERS

@ 2, 10 SAY "Búsqueda por código:" SIZE 100, 10 PIXEL OF oDlg

@ 2, 70 SAY oBrw:oSeek VAR oBrw:cSeek SIZE 100, 10 PIXEL OF oDlg COLOR CLR_HRED, CLR_YELLOW

@ 2, 178 SAY "Búsqueda por nombre:" SIZE 100, 10 PIXEL OF oDlg

@ 2, 250 SAY oBrw:oSeek VAR oBrw:cSeek SIZE 100, 10 PIXEL OF oDlg COLOR CLR_HRED, CLR_YELLOW

/*
oBrw:lIncrFilter := .t.
oBrw:lSeekWild := .t.
oBrw:cFilterFld := "CODIGO_PRO"
oBrw:bChange := {|| oBrw:oSeek:Refresh() <--- da error
*/

oBrw:lIncrFilter := .T.
oBrw:lSeekWild := .T.
oBrw:cFilterFld := "NOMBRE"
// oBrw:bChange := {|| oBrw:oSeek:Refresh() }
oBrw:bChange := {|| oBrw:oSeek( "" ) }
oBrw:bKeyChar := { |nKey| If( nKey == VK_ESCAPE, ( oBrw:oSeek( "" ), oDlg:End() ), nil ) }

oBrw:CreateFromCode()

@ 11, 15 BUTTON "Nuevo " OF oDlg ACTION oBrw:EditSource( .T. )

@ 11, 25 BUTTON "Editar " OF oDlg ACTION EditPro( oBrw )

@ 11, 35 BUTTON "Eliminar" OF oDlg ACTION oBrw:Delete()

@ 11, 45 BUTTON "&Imprimir" OF oDlg ;
ACTION oBrw:Report( "Listado de SAT", .T. ) ; // .t. --> wants preview
SIZE 40, 12

@ 11, 55 BUTTON "&Terminar" OF oDlg ACTION oDlg:End() SIZE 40, 12

ACTIVATE DIALOG oDlg CENTERED ;
ON INIT ( oBrw:cSeek( "" ), oBrw:SetFocus(), .F. )

RETURN nil

//***************** EDICION CON FOLDER---------------

FUNCTION editPro( oBrw, oDlg )

LOCAL oDlg1, oFld, oLbx, Lsalir:=.f.
LOCAL nProve, oProve, cNombre, oNombre, cProvincia, oProvincia

NProve := PROVE->CODIGO_PRO
cNombre := PROVE->NOMBRE
cProvincia := PROVE->PROVINCIA

DEFINE DIALOG oDlg1 FROM 3, 3 TO 20, 70 TITLE "Mantenimiento"


@ 10, 5 FOLDEREX oFld PIXEL PROMPT "&Proveedor", "&Datos mercancías" SIZE 250, 100

@ 20, 5 SAY "Código:" OF oFld:aDialogs[ 1 ] SIZE 60, 10 PIXEL

@ 20, 100 SAY oProve var nProve OF oFld:aDialogs[ 1 ] SIZE 60, 10 PIXEL

@ 30, 5 SAY "Razón social" OF oFld:aDialogs[ 1 ] SIZE 60, 10 PIXEL

@ 30, 100 GET oNombre VAR cNombre OF oFld:aDialogs[ 1 ] SIZE 100, 10 PIXEL

@ 40, 5 SAY "Provincia" OF oFld:aDialogs[ 1 ] SIZE 60, 10 PIXEL

@ 40, 100 GET oProvincia VAR cProvincia OF oFld:aDialogs[ 1 ] SIZE 100, 10 PIXEL

@ 60, 50 BUTTON "Grabar" OF oFld:aDialogs[1] SIZE 40, 10 PIXEL action oDlg1:end()

@ 60, 150 BUTTON "Salir" OF oFld:aDialogs[1] SIZE 40, 10 PIXEL ACTION (lSalir:=.t., oDlg1:End())

SELE produ

produ->( ordscope( 0, nProve ) )
produ->( ordscope( 1, nProve ) )
produ->( DBSKIP( 0 ) )

IF produ->( ordKeyCount() ) == 0
MsgInfo( "No se encontraron productos" )
ENDIF

@ 1, 1 XBROWSE oLbx SIZE 250, 65 PIXEL;
COLUMNS "CODIGO_PRO", "PRODUCTO", "PRECIO" OF oFld:aDialogs[ 2 ] ALIAS "PRODU";
HEADERS "Código proveedor", "Produto", "Precio";
COLSIZES 70, 300, 140;
JUSTIFY AL_RIGHT, AL_LEFT, AL_RIGHT;
PICTURES , , "@E 9,999,999.99" LINES NOBORDER FASTEDIT

oLbx:CreateFromCode()

ACTIVATE DIALOG oDlg1 CENTERED valid lSalir


if lsalir
oBrw:oSeek( "" )
oBrw:refresh()
oBrw:Update()
oBrw:SetFocus()
endif

RETURN nil


Lo que está en rojo es lo que pretendo que haga al salir de la edición del registro, es decir, que se muestre el oBrw con todos los registros y no los buscados y que el cursor se vuelva a poner en el campo de búsqueda y además, como comentaba antes, que se vea el cursor, porque con say confunde mucho y parece que el cursor se ha perdido.

No sé si me he explicado bien.

Re: Cómo resetear oBrw:oseek

Posted: Sat Dec 05, 2020 12:30 pm
by karinha
Ramon, haga un ZIP ó RAR con los bancos de datos y ponga en:

https://mega.nz/

Y post el link para download para que los usuários hagan pruebas, si?

Regards, saludos.

Re: Cómo resetear oBrw:oseek

Posted: Sun Dec 06, 2020 2:36 pm
by Marc Venken

Re: Cómo resetear oBrw:oseek

Posted: Sun Dec 06, 2020 9:38 pm
by Ramón J.
Muchas gracias, João y Marc.

Creo que ya lo tengo. Es un poco casero, pero funciona. Os dejo el enlace de descarga de los ficheros prg, exe y dbf de ejemplo de búsqueda incremental.

Me gustaría que el cursor se visualizara cuando está el foco en cseek, pero por lo demás funciona bien.

https://mega.nz/file/p1pVmIyQ#5_ZFaiqK2 ... w-tbhfSDr0

Un saludo

Re: Cómo resetear oBrw:oseek

Posted: Wed Dec 09, 2020 3:42 am
by nageswaragunupudi
Cancel oSeek

Code: Select all

oBrw:Seek( "" )
 

Code: Select all

@ 2,250 SAY oBrw: oSeek VAR oBrIZE: cSeek 100,10 PIXEL OF oDlg COLOR CLR_HRED, CLR_YELLOW
 
This is a SAY control and so can not get focus and does not have cursor.

It is possible if this is a Get control, but this is possible in the next version yet to be released.
http://forums.fivetechsupport.com/viewt ... =3&t=39723

Re: Cómo resetear oBrw:oseek

Posted: Thu Dec 10, 2020 4:21 pm
by Ramón J.
Muchas gracias, Nageswaragunupudi

Tengo la versión FWH1804 y mi situación económica no me permite efectuar un desembolso de 170 euros para actualizarla a la versión más reciente, solo por, en principio, hacer una búsqueda incremental con get en lugar de say.

De todas maneras se agradece la respuesta.

Un saludo