Page 1 of 1

Ejemplo de xbrowse con edicion de registros,altas,bajas...

Posted: Wed Nov 04, 2020 7:47 pm
by ACC69
Hola buenas tardes aqui de nuevo.

adjunto el archivo de xbrowse con la tabla, lo unico que no pude y logre hacerlo con tabla dbf es crear o cargar registros y modificar registros y grabar registros con arrays.

Desde fiveDBU cree registros al dbf MOVDET y jugar con el xBrowse capturando o modificando edicion en linea, pero como puedo en edicion de linea crear nuevo registro con el siguiente folio num 4 y otro detalle al llegar al final del ultimo registro al darle enter porque no me hace el salto para siguiente nuevo registro.

Este comando bOnPostEdit se supone que debe grabar despues de editar la linea y pasar siguiente linea, pero no me hace el efecto estoy usando version 12.04 FWH.


oBrw:aCols[2]:bOnPostEdit := { | oCol,xVal, nKey |IF( nKey == VK_RETURN ,;
IF( xVal = spac(29) ,;
( RegDat( xVal ),oBrw:Refresh(),;
oBrw:SetFocus()),),)}



Adjunto mi codigo fuente y su ejecutable.

https://www.4shared.com/account/home.jsp#dir=a_9IZFb7

Code: Select all

#include "FiveWin.ch"
#Include "xBrowse.ch"

REQUEST  DbfCdx, DbfFpt, RPreview
EXTERNAL OrdKeyCount, OrdKeyGoTo, OrdKeyNo

Static oDlg, oGet, oBrw
Static nNumfol, cDescrip, cArchivo, dFecha, nImporte
Static cAlias, x,I, aDatos

//------------------------------------------------------------------------------
Function Main()
 SET EXCLUSIVE OFF
 SET 3DLOOK ON
 SET DELETED ON
 SET CONFIRM ON
 SET EPOCH TO 1969
 SET DATE BRITISH

 SetHandleCount(64)
 DbSetDriver("DBFCDX")
 RddSetDefault("DBFCDX")

 oGet     := ARRAY(1)
 nNumfol  := 0
 cDescrip := SPACE(20)
 cArchivo := Space(20)
 dFecha   := CTOD(" / / ")
 nImporte := 0

 Select 1
 USE MOV Alias "S01"

 Select 2
 USE MOVDET Alias "S02"
 INDEX ON STR(S02->NUMFOL,2) TAG MOVDET
 S02->(DbSetIndex("MOVDET"))

 DEFINE DIALOG oDlg RESOURCE "FACT" TITLE "Demo edicion TxBrowse"
  REDEFINE GET oGet[01] VAR nNumFol  ID 101 OF oDlg PICT "99" VALID V_NUMFOL()

  REDEFINE XBROWSE oBrw ID 102 OF oDlg ;
           HEADERS "Descripción"    , "Archivo","Fecha" ,"Importe" ;
           COLUMNS "DESCRIPCIO","ARCHIVO","FECHA","IMPORTE"     ;
           SIZES 88,66,52,78 ;
           ALIAS S02->( ALIAS() ) // FOOTERS CELL AUTOCOLS

    AEval( oBrw:aCols, { |o| o:nEditType    := 1     ,; // Editables
                             o:nHeadStrAlign:= 2 } )    //texto encab/col centrado

    WITH OBJECT oBrw
      //ESTILOS DE LINEAS
      :lHScroll := .F. // Horizontal
      :lVScroll := .f. // Vertical

      :nColDividerStyle := LINESTYLE_BLACK
      :nRowDividerStyle := LINESTYLE_BLACK
      :nMarqueeStyle    := MARQSTYLE_HIGHLCELL

      :lFastEdit          := .T.

      :bKeyDown     := {| nKey| Val_nKDet(nKey) }


      // Como hago para que me pase al siguiente registro despues de grabar la edicion \\

      // Esta parte de aqui porque no me graba con el comando bOnPostEdit\\

      oBrw:aCols[2]:bOnPostEdit  :=  { |  oCol,xVal, nKey |IF( nKey == VK_RETURN ,;
                                                                 IF( xVal  = spac(29) ,;
                                                                 ( RegDat( xVal ),oBrw:Refresh(),;
                                                                   oBrw:SetFocus()),),)}
    END

 ACTIVATE DIALOG oDlg CENTER ON INIT Inicia(oBrw)

 DbCloseAll()

 SELECT 2
 USE

 CLOSE ALL //S02->MOVDET
Return Nil


//------------------------------------------------------------------------------
 Static Function Inicia(oBrw)
  S02->( OrdScope(0,STR(nNumFol,2)) )
  S02->( OrdScope(1,STR(nNumFol,2)) )

  S02->(DbGoTop())

  S02->( DbSeek(STR(nNumFol,2)) )

  oBrw:Refresh()
RETURN NIL

//------------------------------------------------------------------------------
Static Function V_NUMFOL()
 IF nNumfol <1 .OR. nNumfol >3
     MsgInfo("Favor teclear num folio 1, 2 ó 3") // Este es una prueba, ya que podria ser mas de mil registros de folios....

     RETURN .F.
 ENDIF

 S02->( OrdScope(0,STR(nNumFol,2)) )
 S02->( OrdScope(1,STR(nNumFol,2)) )

 S02->( DbSeek(STR(nNumFol,2)) )

 oBrw:GoTop()
 oBrw:Refresh()
RETURN .T.


//------------------------------------------------------------------------------
STATIC FUNCTION RegDat( cVal )
  msgalert("que pasa")
  MsgInfo(cVal+" SE GRABO LA MODIFICACION?")
  S02->DESCRIPCIO := cVal
  S02->NUMFOL     = nNumfol
 S02->DESCRIPC = cDescrip
 S02->ARCHIVO    = cArchivo
 S02->FECHA      = dFecha
 S02->IMPORTE    = nImporte

  MsgInfo(S02->DESCRIPCIO+" SE GRABO LA MODIFICACION?")
RETURN .T.

*-------------
function AppendRow( oBrw )
  local aArray := { { 0, Date(), Time() , 1 } }


  *if empty( oBrw:aArrayData )
  *  oBrw:SetArray( aArray )
  *else
  *   AAdd( oBrw:aArrayData, { oBrw:nLen + 1, Date() + oBrw:nLen, time(), oBrw:nLen + 2  } )
  *endif

  DBAPPEND()

  msginfo("que hace aqui...")
  oBrw:GoBottom()
  oBrw:refresh()

return nil

//------------------------------------------------------------------------------
STATIC FUNCTION Val_nKDet(nKey, oDlg2)

 DO CASE
    CASE nKey == VK_INSERT // .AND. lNew
          KeyToggle(VK_INSERT)
          *Mod_Cap(.T.)

    CASE nKey == VK_DELETE // .AND. lNew
          *Sup_Cap()

    CASE nKey == VK_RETURN // .AND. lNew
          *Mod_Cap(.F.)

    CASE nKey == VK_F8     // .AND. lNew
         *Chg_MatCon()
    CASE nKey == VK_F9     //  .AND. lNew
         *Get_Concep()
    CASE nKey == VK_F11
         *Get_Descri()
    CASE nKey == VK_F12
         *Get_Notas()
 ENDCASE
RETURN (NIL)


Este es un ejemplo por el cual deseo hacerlo pero con arrays , editar, modificar y grabar registros y me pase siguiente linea, pero tengo detalles por solucionar en forma habitual sin arrays.
He creado xbrowse pero con botones de añadir nuevo registro, modificar y grabar registro, pero nunca en EDICION, eso es lo que deseo hacer ya que son apenas 4 campos para un control de registro.

Alguien me pueda echar la mano por favor, sigo batallando y no doy ni con dbf normal sin arrays ni con arrays con dbf?

Atte: Adriano C. C.

acc69@hotmail.com

Re: Ejemplo de xbrowse con edicion de registros,altas,bajas...

Posted: Thu Nov 05, 2020 11:24 am
by JESUS MARIN
Hola ACC69

Entiendo que quieres un XBROWSE, donde de una forma rápida y ágil introduces datos, utilizando arrays.

Te he montado un ejemplo.
5 campos : Código, Artículo, Cantidad, Precio, Importe.
Los 4 primeros son editables.
Dependiendo de que acción realices, se busca, se calcula, y se posiciona.

Para que sea algo rápido, lo he hecho que introduces 1 codigo de artículo e introduces cantidad y .... te crea un nuevo registro.

Obviamente, esto es solo un ejemplo. Debes implementar grabar en tu base de datos, los datos contenidos en el array.
Tambien poner un boton para eliminar o al pulsar boton derecho.... a tu gusto

Image

Aqui tienes el código. Pruebalo y nos cuentas

Code: Select all

STATIC FUNCTION EDITA_BROWSE()

LOCAL oWnd, oBar
LOCAL aBotones:=ARRAY(10)
LOCAL oBrw, aLineas:={}


   DEFINE WINDOW oWnd MDICHILD OF oWndP TITLE "EDICION XBROWSE" COLOR CLR_BLACK, RGB(242,242,242) 

   DEFINE BUTTONBAR oBar OF oWnd BUTTONSIZE 40,40
      oBar:SetColor(CLR_BLACK, CLR_WHITE)
      oBar:bRClicked := {|| nil }
  



   // BROWSE ////////////////////////
    aLineas:={{SPACE(10),SPACE(50),0.00,0.00,0.00}}               // para nuevos registros. Si editas lineas existentes, busca en tu tabla y cargalo en aLineas
    oBrw:=TxBrowse():New(oWnd)
    oBrw:nDataLines := 1
    oBrw:SetArray(aLineas)
    oBrw:nColDividerStyle := LINESTYLE_BLACK
    oBrw:nRowDividerStyle := LINESTYLE_BLACK
    oBrw:nMarqueeStyle    := MARQSTYLE_HIGHLCELL
    oBrw:nTop     := 45
    oBrw:nLeft    := 5
    oBrw:nBottom  := 625
    oBrw:nRight   := 720
    oBrw:nRowHeight := 32
    oBrw:oFont    := oFont
    oBrw:aCols[1]:cHeader      := "Código"
    oBrw:aCols[2]:cHeader      := "Artículo"
    oBrw:aCols[3]:cHeader      := "Cantidad"
    oBrw:aCols[3]:cEditPicture := "999.99"
    oBrw:aCols[3]:nDataStrAlign := AL_RIGHT
    oBrw:aCols[4]:cHeader      := "Precio"
    oBrw:aCols[4]:cEditPicture := "999.99"
    oBrw:aCols[4]:nDataStrAlign := AL_RIGHT
    oBrw:aCols[5]:cHeader      := "Importe"
    oBrw:aCols[5]:nDataStrAlign := AL_RIGHT


    oBrw:aCols[1]:nWidth   :=75
    oBrw:aCols[2]:nWidth   :=265
    oBrw:aCols[3]:nWidth   :=95
    oBrw:aCols[4]:nWidth   :=95
    oBrw:aCols[5]:nWidth   :=125


    oBrw:aCols[1]:nEditType    := 1
    oBrw:aCols[2]:nEditType    := 1
    oBrw:aCols[3]:nEditType    := 1
    oBrw:aCols[4]:nEditType    := 1



    oBrw:aCols[1]:bOnPostEdit := { |o,x|  aLineas:=Graba_Edicion(aLineas,oBrw,x)  }
    oBrw:aCols[2]:bOnPostEdit := { |o,x|  aLineas:=Graba_Edicion(aLineas,oBrw,x)  }
    oBrw:aCols[3]:bOnPostEdit := { |o,x|  aLineas:=Graba_Edicion(aLineas,oBrw,x)  }
    oBrw:aCols[4]:bOnPostEdit := { |o,x|  aLineas:=Graba_Edicion(aLineas,oBrw,x)  }

    oBrw:CreateFromCode()


   ACTIVATE WINDOW oWnd MAXIMIZED ON INIT oBrw:SetFocus()

RETURN(NIL)

STATIC FUNCTION Graba_Edicion(aLineas,oBrw,x)   // x=valor ingresado en el campo editado

// PRIMERO GUARDAMOS TODO EN EL ARRAY Y HACEMOS OTRAS ACCIONES. BUSCAR ARTICULO, CALCULAR, ETC...

IF oBrw:nLastEditCol = 1               // HEMOS EDITADO CODIGO DE ARTICULO
   aLineas[oBrw:nArrayAt,1]:=x

   // aqui buscaria este codigo de artículo en mi tabla de artículos
   // para este ejemplo te lo pongo asi.
   // Tambien tomo el precio de la ficha del artículo, aunque lo podras modificar

   IF X="1" ; aLineas[oBrw:nArrayAt,2]:="Articulo 1                    " ; aLineas[oBrw:nArrayAt,4]:=1.25 ; ENDIF
   IF X="2" ; aLineas[oBrw:nArrayAt,2]:="Articulo 2                    " ; aLineas[oBrw:nArrayAt,4]:=3.95 ; ENDIF
   IF X="3" ; aLineas[oBrw:nArrayAt,2]:="Articulo 3                    " ; aLineas[oBrw:nArrayAt,4]:=9.70 ; ENDIF
ENDIF
IF oBrw:nLastEditCol = 2               // HEMOS EDITADO DESCRIPCION DE ARTICULO
   aLineas[oBrw:nArrayAt,2]:=x
ENDIF
IF oBrw:nLastEditCol = 3               // HEMOS EDITADO CANTIDAD
   aLineas[oBrw:nArrayAt,3]:=x
   aLineas[oBrw:nArrayAt,5]:=aLineas[oBrw:nArrayAt,3]*aLineas[oBrw:nArrayAt,4]
ENDIF
IF oBrw:nLastEditCol = 4               // HEMOS EDITADO PRECIO
   aLineas[oBrw:nArrayAt,4]:=x
   aLineas[oBrw:nArrayAt,5]:=aLineas[oBrw:nArrayAt,3]*aLineas[oBrw:nArrayAt,4]
ENDIF



oBrw:aArrayData:=aLineas
oBrw:Refresh()


// AHORA DECIDO COMO ME VOY A MOVER DESPUES DE CADA EDICION
IF oBrw:nLastEditCol = 1 ; oBrw:SelectCol(3) ; ENDIF
IF oBrw:nLastEditCol = 2 ; oBrw:SelectCol(3) ; ENDIF
IF oBrw:nLastEditCol = 3 ; oBrw:SelectCol(3) ; ENDIF
IF oBrw:nLastEditCol = 4 ; oBrw:SelectCol(4) ; ENDIF

// AHORA DEFINO QUE DESPUES DE EDITAR LA CANTIDAD ME CREE UN NUEVO REGISTRO SI EL UTLIMO NO ESTA EN BLANCO EL CODIGO. PARA NO DUPLICAR

IF oBrw:nLastEditCol = 3 .AND. .NOT. EMPTY( aLineas[LEN(aLineas),1] ) // O LA CONDICION QUE QUIERAS
      AADD(aLineas, {SPACE(10),SPACE(50),0.00,0.00,0.00} )
      oBrw:aArrayData:=aLineas
      oBrw:Refresh()
      oBrw:GoDown()
      oBrw:SelectCol(1)
ENDIF




// AHORA, GRABAS EL CONTENIDO DEL ARRAY EN TU BASE DE DATOS
// LLAMA A LA FUNCION QUE LO GRABA EN LA BD
// Nota: El ejemplo esta montado de una forma sencilla. 
//       Si estas editando registros, aLineas no será un array vacio, si no el contenido que quieras mostrar.
//       Tambien debes controlar que al grabar no grabas un registro sin datos, etc....
return(aLineas)

 

Re: Ejemplo de xbrowse con edicion de registros,altas,bajas...

Posted: Thu Nov 05, 2020 4:08 pm
by ACC69
JESUS MARIN wrote:Hola ACC69

Entiendo que quieres un XBROWSE, donde de una forma rápida y ágil introduces datos, utilizando arrays.

Te he montado un ejemplo.
5 campos : Código, Artículo, Cantidad, Precio, Importe.
Los 4 primeros son editables.
Dependiendo de que acción realices, se busca, se calcula, y se posiciona.

Para que sea algo rápido, lo he hecho que introduces 1 codigo de artículo e introduces cantidad y .... te crea un nuevo registro.

Obviamente, esto es solo un ejemplo. Debes implementar grabar en tu base de datos, los datos contenidos en el array.
Tambien poner un boton para eliminar o al pulsar boton derecho.... a tu gusto

Image

Aqui tienes el código. Pruebalo y nos cuentas

Code: Select all

STATIC FUNCTION EDITA_BROWSE()

LOCAL oWnd, oBar
LOCAL aBotones:=ARRAY(10)
LOCAL oBrw, aLineas:={}


   DEFINE WINDOW oWnd MDICHILD OF oWndP TITLE "EDICION XBROWSE" COLOR CLR_BLACK, RGB(242,242,242) 

   DEFINE BUTTONBAR oBar OF oWnd BUTTONSIZE 40,40
      oBar:SetColor(CLR_BLACK, CLR_WHITE)
      oBar:bRClicked := {|| nil }
  



   // BROWSE ////////////////////////
    aLineas:={{SPACE(10),SPACE(50),0.00,0.00,0.00}}               // para nuevos registros. Si editas lineas existentes, busca en tu tabla y cargalo en aLineas
    oBrw:=TxBrowse():New(oWnd)
    oBrw:nDataLines := 1
    oBrw:SetArray(aLineas)
    oBrw:nColDividerStyle := LINESTYLE_BLACK
    oBrw:nRowDividerStyle := LINESTYLE_BLACK
    oBrw:nMarqueeStyle    := MARQSTYLE_HIGHLCELL
    oBrw:nTop     := 45
    oBrw:nLeft    := 5
    oBrw:nBottom  := 625
    oBrw:nRight   := 720
    oBrw:nRowHeight := 32
    oBrw:oFont    := oFont
    oBrw:aCols[1]:cHeader      := "Código"
    oBrw:aCols[2]:cHeader      := "Artículo"
    oBrw:aCols[3]:cHeader      := "Cantidad"
    oBrw:aCols[3]:cEditPicture := "999.99"
    oBrw:aCols[3]:nDataStrAlign := AL_RIGHT
    oBrw:aCols[4]:cHeader      := "Precio"
    oBrw:aCols[4]:cEditPicture := "999.99"
    oBrw:aCols[4]:nDataStrAlign := AL_RIGHT
    oBrw:aCols[5]:cHeader      := "Importe"
    oBrw:aCols[5]:nDataStrAlign := AL_RIGHT


    oBrw:aCols[1]:nWidth   :=75
    oBrw:aCols[2]:nWidth   :=265
    oBrw:aCols[3]:nWidth   :=95
    oBrw:aCols[4]:nWidth   :=95
    oBrw:aCols[5]:nWidth   :=125


    oBrw:aCols[1]:nEditType    := 1
    oBrw:aCols[2]:nEditType    := 1
    oBrw:aCols[3]:nEditType    := 1
    oBrw:aCols[4]:nEditType    := 1



    oBrw:aCols[1]:bOnPostEdit := { |o,x|  aLineas:=Graba_Edicion(aLineas,oBrw,x)  }
    oBrw:aCols[2]:bOnPostEdit := { |o,x|  aLineas:=Graba_Edicion(aLineas,oBrw,x)  }
    oBrw:aCols[3]:bOnPostEdit := { |o,x|  aLineas:=Graba_Edicion(aLineas,oBrw,x)  }
    oBrw:aCols[4]:bOnPostEdit := { |o,x|  aLineas:=Graba_Edicion(aLineas,oBrw,x)  }

    oBrw:CreateFromCode()


   ACTIVATE WINDOW oWnd MAXIMIZED ON INIT oBrw:SetFocus()

RETURN(NIL)

STATIC FUNCTION Graba_Edicion(aLineas,oBrw,x)   // x=valor ingresado en el campo editado

// PRIMERO GUARDAMOS TODO EN EL ARRAY Y HACEMOS OTRAS ACCIONES. BUSCAR ARTICULO, CALCULAR, ETC...

IF oBrw:nLastEditCol = 1               // HEMOS EDITADO CODIGO DE ARTICULO
   aLineas[oBrw:nArrayAt,1]:=x

   // aqui buscaria este codigo de artículo en mi tabla de artículos
   // para este ejemplo te lo pongo asi.
   // Tambien tomo el precio de la ficha del artículo, aunque lo podras modificar

   IF X="1" ; aLineas[oBrw:nArrayAt,2]:="Articulo 1                    " ; aLineas[oBrw:nArrayAt,4]:=1.25 ; ENDIF
   IF X="2" ; aLineas[oBrw:nArrayAt,2]:="Articulo 2                    " ; aLineas[oBrw:nArrayAt,4]:=3.95 ; ENDIF
   IF X="3" ; aLineas[oBrw:nArrayAt,2]:="Articulo 3                    " ; aLineas[oBrw:nArrayAt,4]:=9.70 ; ENDIF
ENDIF
IF oBrw:nLastEditCol = 2               // HEMOS EDITADO DESCRIPCION DE ARTICULO
   aLineas[oBrw:nArrayAt,2]:=x
ENDIF
IF oBrw:nLastEditCol = 3               // HEMOS EDITADO CANTIDAD
   aLineas[oBrw:nArrayAt,3]:=x
   aLineas[oBrw:nArrayAt,5]:=aLineas[oBrw:nArrayAt,3]*aLineas[oBrw:nArrayAt,4]
ENDIF
IF oBrw:nLastEditCol = 4               // HEMOS EDITADO PRECIO
   aLineas[oBrw:nArrayAt,4]:=x
   aLineas[oBrw:nArrayAt,5]:=aLineas[oBrw:nArrayAt,3]*aLineas[oBrw:nArrayAt,4]
ENDIF



oBrw:aArrayData:=aLineas
oBrw:Refresh()


// AHORA DECIDO COMO ME VOY A MOVER DESPUES DE CADA EDICION
IF oBrw:nLastEditCol = 1 ; oBrw:SelectCol(3) ; ENDIF
IF oBrw:nLastEditCol = 2 ; oBrw:SelectCol(3) ; ENDIF
IF oBrw:nLastEditCol = 3 ; oBrw:SelectCol(3) ; ENDIF
IF oBrw:nLastEditCol = 4 ; oBrw:SelectCol(4) ; ENDIF

// AHORA DEFINO QUE DESPUES DE EDITAR LA CANTIDAD ME CREE UN NUEVO REGISTRO SI EL UTLIMO NO ESTA EN BLANCO EL CODIGO. PARA NO DUPLICAR

IF oBrw:nLastEditCol = 3 .AND. .NOT. EMPTY( aLineas[LEN(aLineas),1] ) // O LA CONDICION QUE QUIERAS
      AADD(aLineas, {SPACE(10),SPACE(50),0.00,0.00,0.00} )
      oBrw:aArrayData:=aLineas
      oBrw:Refresh()
      oBrw:GoDown()
      oBrw:SelectCol(1)
ENDIF




// AHORA, GRABAS EL CONTENIDO DEL ARRAY EN TU BASE DE DATOS
// LLAMA A LA FUNCION QUE LO GRABA EN LA BD
// Nota: El ejemplo esta montado de una forma sencilla. 
//       Si estas editando registros, aLineas no será un array vacio, si no el contenido que quieras mostrar.
//       Tambien debes controlar que al grabar no grabas un registro sin datos, etc....
return(aLineas)

 


Hola muchas gracias Ing. Marin Jesus, intentare adaptarlo a mi necesidad ya que no requiero boton de agregar nuevo registro, unicamente necesito que estando en linea de edicion que en la ultima columna al darle ENTER me deje siguiente linea y que me añade nuevo registro en la nueva linea y asi sucesivamente...sin limites de registros en el browse.

He visto muchos ejemplos en samples y en el foro, pero la mayoria todos usan con boton de agregar nuevos registros, no encontre nada parecido a mi necesidad lo que quiero hacer de algun ejemplo sencillo con dbfs, ya que me he encontrado ejemplos con arrays pero sin dbfs.

Y otro detalle que no encontre la mayoria de samples y ejemplos en el foro con REDEFINE XBROWSE. :(

Pongo aqui la imagen:

Image

https://www.4shared.com/account/home.jsp#dir=a_9IZFb7

https://ibb.co/K6J5R9z

https://www.4shared.com/account/home.jsp#dir=a_9IZFb7

Con teclear el folio 2 me muestra todos los folios 2 de eso no tengo problemas, pero si tecleo nuevos folios, en el browse capturo la primera linea, pero no me deja pasar siguiente linea de registros....

Los 4 registros que estan dentro del browse los añadi desde fiveDBU, ya que no logro añadir registros nuevos estando en linea de edicion, ya que al darle enter estando en la ultima columna de importe, no me deja añadir siguiente registro.....eso es lo que quiero adaptarlo a mi necesidad.

Y no me funciona con el comando: oBrw:aCols[2]:bOnPostEdit := { | oCol,xVal, nKey |IF( nKey == VK_RETURN ,;
IF( xVal = spac(29) ,;
( RegDat( xVal ),oBrw:Refresh(),;


Y ahi esta la funcion RegDat()


Y quiero crear dos modelos de edicion de registros para a futuro me permita elijar con cualquier iniciar :

1.- Modelo con edicion de registros dbf SIN ARRAYS
2.- Modelo con edicion de registros con dbf con ARRAYS ya que este seria una buena opcion insertar registros en medio de algun registro en orden.

Bueno espero haberme explicado de mi necesidad.


He desarrollado Redefine xbrowse con botones de agregar de ahi no tengo problemas porque son mas de 10 campos y 10 columnas, pero ahora quiero hacerlo de diferente manera ya que contiene unicamente 4 campos en las 4 columnas.


Saludos .
Atte: Adrian C. C.

acc69@hotmail.com

Re: Ejemplo de xbrowse con edicion de registros,altas,bajas...

Posted: Thu Nov 05, 2020 7:51 pm
by JESUS MARIN
Has probado el ejemplo ?

Hace justo lo que pides.

Digamos que solo cambia el enfoque. Trabaja con array para luego guardarlo en la dbf.

Como es solo un ejemplo, no está completo. ¿Cómo ayudarte?

No entiendo que es un folio. Me lo puedes explicar ?

Pero supongamos que tengo pedidos de clientes y en otro xbrowse, las lineas del pedido ( este ejemplo serían las lineas del pedido). Hace justo lo que pides. Despues del último campo (yo para el ejemplo lo he definido en el campo 3, dado que el campo 5 es el importe calculado), te crea una nueva linea.
Obviamente faltan los REPLACE nombredelcampo WITH aLista[x,y]

Si me dices la estructura de la dbf, te monto el resto, que sería grabar los datos que contienen el array.

Ya me dices

Re: Ejemplo de xbrowse con edicion de registros,altas,bajas...

Posted: Thu Nov 05, 2020 8:00 pm
by ACC69
JESUS MARIN wrote:Has probado el ejemplo ?

Hace justo lo que pides.

Digamos que solo cambia el enfoque. Trabaja con array para luego guardarlo en la dbf.

Como es solo un ejemplo, no está completo. ¿Cómo ayudarte?

No entiendo que es un folio. Me lo puedes explicar ?

Pero supongamos que tengo pedidos de clientes y en otro xbrowse, las lineas del pedido ( este ejemplo serían las lineas del pedido). Hace justo lo que pides. Despues del último campo (yo para el ejemplo lo he definido en el campo 4, dado que el campo 5 es el importe calculado), te crea una nueva linea.
Obviamente faltan los REPLACE nombredelcampo WITH aLista[x,y]

Si me dices la estructura de la dbf, te monto el resto, que sería grabar los datos que contienen el array.

Ya me dices

Hola de nuevo ing. Jesus Marin, bueno el folio es como si fuera consecutivo de factura del 1 al infinito :) ....peror por mientras añadi 3 folios desde fiveDBU en lugar de añadir desde edicion del browse, cosa que no logro conseguir.


Y aqui adjunto el codigo fuente y su ejecutable y la base de datos es sencillo, para cuando lo domine lo hago ya mas complicado, pero me falta dominar lo que pretendo proponerme.

https://www.4shared.com/account/home.jsp#dir=a_9IZFb7


Saludos ing. Jesus Marin

Gracias de nuevo.

acc69@hotmail.com

Re: Ejemplo de xbrowse con edicion de registros,altas,bajas...

Posted: Thu Nov 05, 2020 8:23 pm
by JESUS MARIN
no puedo acceder a tu enlace
no tengo cuenta 4share y no voy a crear una.

Esta noche, donde yo vivo es la hora de cenar (y eso no hay que perdonarlo), te montaré un ejemplo completo.
Te pasaré la estructura de los ficheros y podras ver el funcionamiento.

Puedo grabar un video, veré como subirlo.

Pues lo he revisado y no puedo subir un video. Si alguien me indica (en formato mp4 o avi) Gracias

Re: Ejemplo de xbrowse con edicion de registros,altas,bajas...

Posted: Thu Nov 05, 2020 8:46 pm
by ACC69
JESUS MARIN wrote:no puedo acceder a tu enlace
no tengo cuenta 4share y no voy a crear una.

Esta noche, donde yo vivo es la hora de cenar (y eso no hay que perdonarlo), te montaré un ejemplo completo.
Te pasaré la estructura de los ficheros y podras ver el funcionamiento.

Puedo grabar un video, veré como subirlo.

Pues no he revisado y no puedo subir un video. Si alguien me indica (en formato mp4 o avi) Gracias

Hola de nuevo Ing. Jesus Marin, aqui le paso la estructura de la base de datos del MOVDET.DBF el MOV.DBF lo puedes omitir ....

Estructura de la base de datos:

NOMBRE TIPO LONGITUD DEC
-------------------------------------------
NUMFOL N 2 0
DESCRIPCIO C 20 0
ARCHIVO C 20 0
FECHA D 8 0
IMPORTE N 8 2


Gracias y saludos.
acc69@hotmail.com

Re: Ejemplo de xbrowse con edicion de registros,altas,bajas...

Posted: Thu Nov 05, 2020 11:17 pm
by JESUS MARIN
Buenas de nuevo Adriano.
Ya lo has visto en el video que te he mandado.
Aquí tienes el código, con las funciones de grabación en la tabla con la estructura que tu me has dado.

Code: Select all

STATIC FUNCTION EDITA_BROWSE()

LOCAL oWnd, oBar
LOCAL aBotones:=ARRAY(10)
LOCAL oBrw, aLineas:={}
LOCAL nFolio:=0, oGet

SET DEFAULT TO
USE MOVDET SHARED NEW
SET INDEX TO MOVDET


   DEFINE WINDOW oWnd MDICHILD OF oWndP TITLE "EDICION XBROWSE" COLOR CLR_BLACK, RGB(242,242,242) 

   DEFINE BUTTONBAR oBar OF oWnd BUTTONSIZE 40,40
      oBar:SetColor(CLR_BLACK, CLR_WHITE)
      oBar:bRClicked := {|| nil }
       @01,000 BTNBMP aBotones[1] FILE oApp:cIcons+"EXIT_W10.BMP",oApp:cIcons+"EXIT_W10B.BMP"   SIZE 40,40 ACTION oWnd:End() OF oBar UPDATE NOBORDER
         aBotones[1]:cToolTip=CRLF+"   Salir   "+CRLF+" "
         aBotones[1]:SetColor(CLR_WHITE, CLR_WHITE )
       

   @50,05 SAY "Folio" OF oWnd SIZE 40,24 PIXEL FONT oFont RIGHT COLOR CLR_BLUE
   @50,50 GET oGet VAR nFolio OF oWnd SIZE 150,32 PIXEL FONT oFont PICT "999999" RIGHT
      oGet:bLostFocus := { || ( aLineas:=Carga_Lineas(nFolio,aLineas), oBrw:aArrayData:=aLineas, oBrw:Refresh() ) }


    aLineas:={{SPACE(20),SPACE(20),DATE(),0.00}}
    oBrw:=TxBrowse():New(oWnd)
    oBrw:nDataLines := 1
    oBrw:SetArray(aLineas)
    oBrw:nColDividerStyle := LINESTYLE_BLACK
    oBrw:nRowDividerStyle := LINESTYLE_BLACK
    oBrw:nMarqueeStyle    := MARQSTYLE_HIGHLCELL
    oBrw:nTop     := 90
    oBrw:nLeft    := 5
    oBrw:nBottom  := 625
    oBrw:nRight   := 720
    oBrw:nRowHeight := 32
    oBrw:oFont    := oFont
    oBrw:aCols[1]:cHeader      := "Descripción"
    oBrw:aCols[2]:cHeader      := "Archivo"
    oBrw:aCols[3]:cHeader      := "Fecha"
    oBrw:aCols[3]:nDataStrAlign := AL_RIGHT
    oBrw:aCols[4]:cHeader      := "Importe"
    oBrw:aCols[4]:cEditPicture := "999.99"
    oBrw:aCols[4]:nDataStrAlign := AL_RIGHT

    oBrw:aCols[1]:nWidth   :=200
    oBrw:aCols[2]:nWidth   :=265
    oBrw:aCols[3]:nWidth   :=95
    oBrw:aCols[4]:nWidth   :=95

    oBrw:aCols[1]:nEditType    := 1
    oBrw:aCols[2]:nEditType    := 1
    oBrw:aCols[3]:nEditType    := 1
    oBrw:aCols[4]:nEditType    := 1

    oBrw:aCols[1]:bOnPostEdit := { |o,x|  aLineas:=Graba_Edicion(aLineas,oBrw,x,nFolio)  }
    oBrw:aCols[2]:bOnPostEdit := { |o,x|  aLineas:=Graba_Edicion(aLineas,oBrw,x,nFolio)  }
    oBrw:aCols[3]:bOnPostEdit := { |o,x|  aLineas:=Graba_Edicion(aLineas,oBrw,x,nFolio)  }
    oBrw:aCols[4]:bOnPostEdit := { |o,x|  aLineas:=Graba_Edicion(aLineas,oBrw,x,nFolio)  }

    oBrw:bRClicked  := { || aLineas:=Borra(aLineas,oBrw) }

    oBrw:CreateFromCode()


   ACTIVATE WINDOW oWnd MAXIMIZED ON INIT oGet:SetFocus() VALID Cerrar()



RETURN(NIL)
////////////////////////////////////////////////////////////////////////////////////////////
STATIC FUNCTION CERRAR()

CLOSE MOVDET
RETURN .T.
//////////////////////////////////////////////////////////////////////////////////////////
STATIC FUNCTION Graba_Edicion(aLineas,oBrw,x,nFolio)   // x=valor ingresado en el campo editado

// PRIMERO GUARDAMOS TODO EN EL ARRAY Y HACEMOS OTRAS ACCIONES. BUSCAR ARTICULO, CALCULAR, ETC...
// POR SI TENEMOS QUE HACER ALGUN CALCULO, ETC...

IF oBrw:nLastEditCol = 1               // HEMOS EDITADO DESCRIPCIO
   aLineas[oBrw:nArrayAt,1]:=x
ENDIF
IF oBrw:nLastEditCol = 2               // HEMOS EDITADO ARCHIVO
   aLineas[oBrw:nArrayAt,2]:=x
ENDIF
IF oBrw:nLastEditCol = 3               // HEMOS EDITADO FECHA
   aLineas[oBrw:nArrayAt,3]:=x
ENDIF
IF oBrw:nLastEditCol = 4               // HEMOS EDITADO IMPORTE
   aLineas[oBrw:nArrayAt,4]:=x
ENDIF



oBrw:aArrayData:=aLineas
oBrw:Refresh()


// AHORA DECIDO COMO ME VOY A MOVER DESPUES DE CADA EDICION
IF oBrw:nLastEditCol = 1 ; oBrw:SelectCol(2) ; ENDIF
IF oBrw:nLastEditCol = 2 ; oBrw:SelectCol(3) ; ENDIF
IF oBrw:nLastEditCol = 3 ; oBrw:SelectCol(4) ; ENDIF
IF oBrw:nLastEditCol = 4 ; oBrw:SelectCol(4) ; ENDIF

// AHORA DEFINO QUE DESPUES DE EDITAR LA CANTIDAD ME CREE UN NUEVO REGISTRO SI EL UTLIMO NO ESTA EN BLANCO EL CODIGO. PARA NO DUPLICAR

IF oBrw:nLastEditCol = 4 .AND. .NOT. EMPTY( aLineas[LEN(aLineas),1] ) .AND. oBrw:nArrayAt=LEN(aLineas) // O LA CONDICION QUE QUIERAS
      AADD(aLineas, { SPACE(20), SPACE(20), DATE(), 0.00  } )
      oBrw:aArrayData:=aLineas
      oBrw:Refresh()
      oBrw:GoDown()
      oBrw:SelectCol(1)
ENDIF

// LLAMA A LA FUNCION QUE LO GRABA EN LA BD
Graba_Lineas(aLineas,nFolio)

oBrw:Refresh()

return(aLineas)

///////////////////////////////////////////////////////////////////////////////
STATIC FUNCTION Borra(aLineas,oBrw)

IF MsgNoYes("Deseas eliminar este registro","Atención")
   MsgAlert("Eliminamos esta linea del array y luego lo eliminamos de la BD")   // Y REFRESCAMOS EL XBROWSE
ENDIF

RETURN(NIL)


///////////////////////////////////////////////////////////////////////////////
STATIC FUNCTION Carga_Lineas(nFolio,aLineas)

DBSEEK(nFolio)
aLineas:={}
IF FOUND()
   DO WHILE .T.
      IF EOF() ; EXIT ; ENDIF
      IF MOVDET->NUMFOL<>nFolio ; EXIT ; ENDIF
      AADD(aLineas, { MOVDET->DESCRIPCIO, MOVDET->ARCHIVO, MOVDET->FECHA, MOVDET->IMPORTE } )
      DBSKIP(1)
   ENDDO
ELSE
   AADD(aLineas, { SPACE(20), SPACE(20), DATE(), 0.00  } )
ENDIF

return(aLineas)

///////////////////////////////////////////////////////////////////////////////
STATIC FUNCTION Graba_Lineas(aLineas,nFolio)

// Si hemos llegado aquí es que se ha editado algun dato.
// Para este ejemplo, vamos a grabar todos los registros excepto si el PRIMER campo esta vacio
// Como este ejemplo no tiene numero de registro de linea, lo haremos en un bucle DO WHILE

LOCAL n:=1

DBSEEK(nFolio)
IF .NOT. FOUND()  // No hay ningun registro todavia en este folio
   MOVDET->(DBAPPEND())
   IF RLOCK()
      REPLA MOVDET->NUMFOL     WITH nFolio
      REPLA MOVDET->DESCRIPCIO WITH aLineas[n,1]
      REPLA MOVDET->ARCHIVO    WITH aLineas[n,2]
      REPLA MOVDET->FECHA      WITH aLineas[n,3]
      REPLA MOVDET->IMPORTE    WITH aLineas[n,4]
      UNLOCK
   ENDIF
ELSE
   DO WHILE .T.
      IF n>LEN(aLineas) ; EXIT ; ENDIF
      IF .NOT. EMPTY(aLineas[n,1])
         IF MOVDET->NUMFOL<>nFolio // estamos en un nuevo registro
            MOVDET->(DBAPPEND())
            REPLA MOVDET->NUMFOL  WITH nFolio
         ENDIF
         IF RLOCK()
            REPLA MOVDET->DESCRIPCIO WITH aLineas[n,1]
            REPLA MOVDET->ARCHIVO    WITH aLineas[n,2]
            REPLA MOVDET->FECHA      WITH aLineas[n,3]
            REPLA MOVDET->IMPORTE    WITH aLineas[n,4]
            UNLOCK
         ENDIF
      ENDIF
      DBSKIP(1)
      ++N
   ENDDO
ENDIF

RETURN(NIL)