DanielPuente wrote:servicomver:
La propia clase twbrowse de hernan te permite hacer eso, ya sea sobre matrices o sobre dbfs. Uno de los ejemplos que vienen con la clase (sample01.prg) hace justamente eso sobre matrices. Fijate estos metodos:
oLbx:lAutoEdit := .t.
oLbx:bEdit:= {|nCol, cBuffer, lFirstEdit|;
EditaCelda( oLbx, nCol, cBuffer, aDatos, lFirstEdit, aTotal ) }
Algo similar podes hacer con browses sobre dbfs:
oBcli:lAutoEdit := .t.
oBcli:bKeyChar := {|nK| if( nK==VK_RETURN,oBcli:Edit(oBcli:nColAct,.t.),) }
oBcli:bEdit:= {|nCol, cBuffer, lFirstEdit|;
Edita2Celda( oDlg,oBcli, nCol,cBuffer,lFirstEdit )}
Function Edita2Celda( oFld,oLbx, nCol, cBuffer, lFirstEdit )
LOCAL lContinue:= .t., bValid, nColReal:= nCol
Do Case
Case nCol == 2
cBuffer:=val( left( Personas->C4, 2 )) //C41
bValid:= {|| If( cBuffer < 0 , ;
(MsgStop( "Numero de Nucleos Familiares Incorrecto, ingrese: "+CRLF+CRLF+;
"un valor",oemtoansi("Dato Inv lido") ),.f.), .T. ) }
If lContinue:= oLbx:lEditCol( nColReal, @cBuffer, "@ZE 99", bValid,,CLR_YELLOW )
TrPerson->C4:=PADL(cBuffer,2,'0')
EndIf
Case nCol == 6
cBuffer:=Personas->FECNAC
If lContinue:= oLbx:lEditCol( nColReal, @cBuffer, "@d", bValid,,CLR_YELLOW )
TrPerson->FECNAC:=cBuffer
EndIf
return lContinue
Con la variable lContinue controlas si sigue el ciclo de edicion (para pasar al siguiente registro y continuar agregando uno nuevo o si salis del modo de edicion).
La mayoria de las clases para browses (la tsbrowse de manuel mercado por ejemplo) permiten hacerlo.
Saludos,
No logro refrescar la edicion de la celda.
Lo que quiero es poder ir editando en celda y que se actualicen los datos, no logro conseguir esto:
Mi código:
- Code: Select all Expand view RUN
FUNCTION Facturacion()
LOCAL aDatos, ;
nI := 0, ;
nLimite := 0
LOCAL oDlg, ;
oBrw, ;
aFuente:= Array( 7 )
DEFINE FONT aFuente[1] name "Arial Black" size 0, -13
DEFINE FONT aFuente[2] name "Square721 BT" size 0, -13
DEFINE FONT aFuente[3] name "MS Sans Serif" size 0, -8
//define font aFuente[4] name "Square721 BT" size 0, -12
DEFINE FONT aFuente[4] name "Monospac821 BT" size 0, -13
DEFINE FONT aFuente[5] name "Eras Bold ITC" size 0, -16
DEFINE FONT aFuente[6] name "Square721 BT" size 0, -12 BOLD
DEFINE FONT aFuente[7] name "Square721 BT" size 0, -18 BOLD
// Array de línea en Factura
IF aSetVars[32] //Terminal Fiscal
nLimite:= 100
ELSE //Terminal No Fiscal
nLimite:= 15
ENDIF
aDatos:= Array( nLimite, 15 )
FOR nItem:= 1 TO nLimite
aDatos[nItem, 1] := space(35) // Descripción
aDatos[nItem, 2] := 0.00 // Cantidad
aDatos[nItem, 3] := 0.00 // Precio Final (siempre para cualquier condición)
aDatos[nItem, 4] := 0.00 // % de Descuento de Linea
aDatos[nItem, 5] := 0.00 // Total de Linea
aDatos[nItem, 6] := 0.00 // Neto Gravado (o exento si no tiene IVA) No está descontado el descuento de linea
aDatos[nItem, 7] := 0.00 // Alicuota IVA
aDatos[nItem, 8] := 0.00 // Imp. Internos ($ x unidad)
aDatos[nItem, 9] := 0.00 // Libre
aDatos[nItem, 10] := 0.00 // Libre
aDatos[nItem, 11] := space(1) // Bienes o Servicios (actualiza o no el stock)
aDatos[nItem, 12] := space(13) // Codigo del Articulo (no visible)
aDatos[nItem, 13] := space(2) // Código de Lista de Precios
aDatos[nItem, 14] := 0.00 // Libre
aDatos[nItem, 15] := space(1) // Libre
NEXT nItem
//----------( Dialogo Factura )----------
DEFINE DIALOG oDlg RESOURCE "FACTURA"
REDEFINE LISTBOX oBrw ;
FIELDS ;
sizes 300, 80, 80, 80, 80 ;
ID 110;
OF oDlg;
FONT aFuente[2];
UPDATE;
colors CLR_BLACK, CLR_2 ;
oBrw:nHeaderHeight := 20
oBrw:nLineHeight := 24
oBrw:lCellStyle := .T.
oBrw:lAutoEdit := .T.
oBrw:ladjlastcol := .T.
oBrw:nLineStyle := 2
oBrw:nHeaderStyle:= 2
oBrw:aHEADERS := { "Descripcion", "Cantidad", "Precio", "% Dto.", "Total" }
oBrw:bLine := {|| { aDatos[obrw:nAt, 1], aDatos[obrw:nAt, 2],;
aDatos[obrw:nAt, 3], aDatos[obrw:nAt, 4],;
aDatos[obrw:nAt, 5] } }
oBrw:SetArray( aDatos )
// nStyle:
// 0 = Celdas normales
// 3 = celda con el foco
// 1 = Cabecera
// 2 = footer
oBrw:bFont := { | nRow, nCol, nStyle | ;
IF ( nStyle == 0 .or. nStyle == 3, afuente[2]:hFont, NIL ) }
oBrw:aHJustify := { 2, 2, 2, 2, 2 }
oBrw:aJustify := { 2, .F. }
obrw:bBkColor := { | nRow, nCol, nStyle | ;
IF ( nStyle = 0, if( nRow % 2==0, CLR_1 , CLR_2 ), ) }
//----------( Estos van juntos )----------
oBrw:bEdit:= { | nCol, cBuffer, lFirstEdit |;
EditaCelda( oBrw, nCol, cBuffer, @aDatos, lFirstEdit ) }
oBrw:bKeyChar := { | nTecla | IF ( nTecla != VK_ESCAPE, oBrw:Edit( oBrw:nColAct, .T. ), ) }
//------------------------------------------
ACTIVATE DIALOG oDlg CENTERED
RETURN ( NIL )
//------------------------------------------------------------------------------
FUNCTION EditaCelda( oBrw, nCol, cBuffer, aDatos, lFirstEdit )
LOCAL ubuffer, ;
bValid, ;
lContinuar, ;
aResultados
// Cantidad Unidades
LOCAL PictuCant := "@EZ 999,999" + if( aSetVars[60] <> 0, substr( ".9999", 1, aSetVars[60] + 1 ), "" )
// Precios Unitarios
LOCAL PictuUnit := "@EZ 99,999" + if( aSetVars[61] <> 0, substr(".9999", 1, aSetVars[61] + 1 ), "" )
// Porcentaje Descuento
LOCAL PictuPorc := "@EZ 999.99"
// Importes en Totales
LOCAL PictuImpo := "@EZ 9,999,999" + if( aSetVars[62] <> 0, substr(".9999", 1, aSetVars[62] + 1 ), "" )
ubuffer:= adatos[ oBrw:nAt, nCol ]
DO CASE
// Para descripcion del producto
CASE nCol = 1
bValid:= {|| aResultados:= Validar( uBuffer ), .T. }
IF lContinuar:= oBrw:lEditCol( nCol, @uBuffer, "@KX", bValid, ,CLR_YELLOW )
aDatos[ oBrw:nAt, 1 ]:= uBuffer
aDatos[ oBrw:nAt, 2 ]:= aResultados[ 1 ]
aDatos[ oBrw:nAt, 3 ]:= aResultados[ 2 ]
ENDIF
// Cantidad
CASE nCol = 2
oBrw:lEditCol( nCol, @uBuffer, "@EZ 999,999",,,CLR_YELLOW )
// Precio
CASE nCol = 3
oBrw:lEditCol( nCol, @uBuffer, PictuUnit,,,CLR_YELLOW )
// Descuento
CASE nCol = 4
oBrw:lEditCol( nCol, @uBuffer, PictuPorc,,,CLR_YELLOW )
END DO
RETURN lContinuar
//------------------------------------------------------------------------------
FUNCTION Validar( uBuffer )
LOCAL aResultados:= Array( 4 )
aResultados[1] := 0.00 // Cantidad
aResultados[2] := 0.00 // Precio Final (siempre para cualquier condición)
aResultados[3] := 0.00 // % de Descuento de Linea
IF Empty( ubuffer )
MsgInfo( "no hay nada aca dentro" )
ENDIF
IF AllTrim( uBuffer ) == "1"
aResultados[1]:= 111
aResultados[2]:= 1.11
aResultados[3]:= 11.1
ENDIF
RETURN ( aResultados )
//------------------------------------------------------------------------------