Hola Miguel
No veo por ningún lado el fastedit ni el bpasteof(), tampoco en las columnas el bOnpostEdit.
La verdad es que nunca he intentado grabar directamente sobre la tabla, ya que soy muy mal pensado y creo que el usuario es tan ¿==(=)/(%%$% que cuando está terminando el albarán o la factura, va y dice que quiere cancelar lo que ha hecho, de esa manera tengo que borrar los registros y empaquetar la tabla, un fastidio cuando estas en ambiente multiusuario, así que prefiero hacerlo en un array o en una tabla temporal. Como es lógico tanto el array como la tabla temporal están vacíos cuando es una nueva factura o albarán.
Aqui te pongo como lo hago yo y no tengo ningún problema.
Para una tabla temporal.
Code: Select all
oBrw = TXBrowse():New( oDlgAlb )
oBrw:nColDividerStyle := LINESTYLE_BLACK
oBrw:nRowDividerStyle := LINESTYLE_BLACK
oBrw:lRecordSelector := .t.
oBrw:nHeaderLines := 1
oBrw:nDataLines := 1
oBrw:nRowSel := 1
oBrw:nMarqueeStyle := 3 //Highlight row //MARQSTYLE_HIGHLCELL
oBrw:bClrSelFocus := {||{CLR_WHITE,RGB(176,196,222 )}}
oBrw:cAlias := cAlias1
oBrw:bClrStd := {|| { nRGB( 0, 0, 0), nRGB(255,248,220) } } // colores para lineas normales
oBrw:bClrSel := {|| { nRGB(0,0,0), nRGB(241,222,088) } } // para barra de linea selecc cuando el control no tiene el foco
oBrw:bClrSelFocus := {|| { nRGB( 0, 0, 0), nRGB(248,195, 34) } } // para barra de linea selecc cuando el control tiene el foco
oBrw:lFastEdit := .T.
oBrw:bPastEof = {|| (cAlias1)->(Dbappend()), oBrw:GoLeftMost(),oBrw:Refresh(),;
oBrw:aCols[ 1 ]:Edit() }
//agrega registro y "oprime" enter
oCol = oBrw:AddCol()
oCol:bStrData := { ||(cAlias1)->codigo }
oCol:nEditType := EDIT_GET
oCol:cHEADER := "CODIGO"
oCol:bOnPostEdit := { | oCol, xVal, nKey | If( RecCount() == 0,( DbAppend(), oBrw:Refresh() ),) ,;
If( nKey == VK_RETURN, If(BArticulo(oBrw,xVal,"CODIGO"),((cAlias1)->importe := Importe(oBrw,1),;
(cAlias1)->(dbAppend()),oBrw:Refresh(),oBrw:aCols[1]:Edit() ),),),;
If( nKey == VK_ESCAPE .and. Empty((cAlias1)->codigo),( (cAlias1)->(dbDelete()),;
(cAlias1)->(__dbPack()),(cAlias1)->(dbGoBottom()),oBrw:Refresh() ), ) }
oCol = oBrw:AddCol()
oCol:bStrData := { ||(cAlias1)->CONCEPTO}
oCol:nEditType := EDIT_GET
oCol:cHEADER := "CONCEPTO"
oCol:bOnPostEdit = { | oCol, xVal, nKey | If( RecCount() == 0, DbAppend(),),;
If( nKey == VK_RETURN, (cAlias1)->CONCEPTO := xVal ,)}
oCol = oBrw:AddCol()
oCol:bStrData := { ||Transform( (cAlias1)->CANTIDAD,"999,999.99" ) }
oCol:nDataStrAlign := 1 //alineado a la derecha
oCol:nEditType := EDIT_GET
oCol:cHEADER := "CANTIDAD"
oCol:bOnPostEdit = { | oCol, xVal, nKey | If( RecCount() == 0, DbAppend(),),;
If( nKey == VK_RETURN, ( (cAlias1)->CANTIDAD := Val(xVal),;
If ( Val(xVal) <> 0, ((cAlias1)->importe := Importe(oBrw,2) ),)) ,) }
................................etc
Para un Array. ( En realidad es el mismo programa la única diferencia es que el código de más arriba es para dbfs y el de abajo es con ado y acces)
Code: Select all
oBrw = TXBrowse():New( oDlgAlb )
oBrw:SetArray(aLinVentas,.T.,0,.F.)
oBrw:nColDividerStyle := LINESTYLE_BLACK
oBrw:nRowDividerStyle := LINESTYLE_BLACK
oBrw:lRecordSelector := .t.
oBrw:nHeaderLines := 1
oBrw:nDataLines := 1
oBrw:nRowSel := 1
oBrw:nMarqueeStyle := 3 //Highlight row //MARQSTYLE_HIGHLCELL
oBrw:bClrSelFocus := {||{CLR_WHITE,RGB(176,196,222 )}}
oBrw:bClrStd := {|| { nRGB( 0, 0, 0), nRGB(255,248,220) } } // colores para lineas normales
oBrw:bClrSel := {|| { nRGB(0,0,0), nRGB(241,222,088) } } // para barra de linea selecc cuando el control no tiene el foco
oBrw:bClrSelFocus := {|| { nRGB( 0, 0, 0), nRGB(248,195, 34) } } // para barra de linea selecc cuando el control tiene el foco
oBrw:lFastEdit := .T.
oBrw:bPastEof = {|| InsertRow(oBrw) ,oBrw:GoLeftMost(),oBrw:Refresh(),;
oBrw:aCols[ 1 ]:Edit() }
//agrega registro y "oprime" enter
oCol = oBrw:AddCol()
oCol:bStrData := { || aLinVentas[oBrw:nArrayAt,1] }
oCol:nEditType := EDIT_GET
oCol:cHEADER := "ARTICULO"
oCol:bOnPostEdit := { | oCol, xVal, nKey | If( Empty(aLinVentas),( InsertRow(oBrw), oBrw:Refresh() ),) ,;
If( nKey == VK_RETURN, If(BArticulo(oBrw,xVal,"CODIGO"),(aLinVentas[oBrw:nArrayAt,9] := Importe(oBrw,1),;
InsertRow(oBrw),oBrw:Refresh() ),),),;
If( nKey == VK_ESCAPE .and. Empty(aLinVentas[oBrw:nArrayAt,1]), (DeleteRow(oBrw),;
oBrw:Refresh() ), ) }
oCol:nArrayCol := 1
*-------------------------------------------------------------------------------
oCol = oBrw:AddCol()
oCol:bStrData := { || aLinVentas[oBrw:nArrayAt,2] }
oCol:nEditType := EDIT_GET
oCol:cHEADER := "DESCRIPCIÓN"
oCol:bOnPostEdit = { | oCol, xVal, nKey | If( Empty(aLinVentas), (InsertRow(),oBrw:Refresh() ),),;
If( nKey == VK_RETURN, aLinVentas[oBrw:nArrayAt,2] := xVal ,) }
oCol:nArrayCol := 2
*-------------------------------------------------------------------------------
oCol = oBrw:AddCol()
oCol:bStrData := { ||Transform( aLinVentas[oBrw:nArrayAt,3],"999,999.99" ) }
oCol:nDataStrAlign := 1 //alineado a la derecha
oCol:nEditType := EDIT_GET
oCol:cHEADER := "CANTIDAD"
oCol:bOnPostEdit = { | oCol, xVal, nKey | If( Empty(aLinVentas), (InsertRow(),oBrw:Refresh() ),),;
If( nKey == VK_RETURN, ( aLinVentas[oBrw:nArrayAt,3] := xVal,;
If ( xVal <> 0, (aLinVentas[oBrw:nArrayAt,9] := Importe(oBrw,2) ),)) ,) }
oCol:nArrayCol := 3
..............................etc
A ver si te sirve de algo