Buenos días,
Entiendo que no es un error, ya que el comportamiento que deseas no tiene porqué ser siempre así.
Observando tu código, veo que utilizas una columna para un campo que es realmente calculado y por lo tanto no hace falta definirlo y se podría resolver con este código:
Code: Select all
METHOD BrwColumn6GetData( oSender, Value, nImage ) CLASS TForm1
WITH OBJECT ::oMItem
Value := Round( :canart( dsFIELD ) * :preart( dsFIELD ) * ( 100 - :dctart1( dsFIELD ) ) / 100, 2 )
END WITH
RETURN Value
Digno de mencionar es el uso del parámetro dsFIELD al acceder a los campos del dataset. De esta forma, fuerzo a que siempre devuelva los valores de la tabla y no los de edición.
Para forzar el efecto que requieres de alta forzada se puede resolver con un código como este:
Code: Select all
METHOD BrwPostEdit( oSender, lCanceled, nKey ) CLASS TForm1
IF ::oBrw:nEditMode = beAPPEND .AND. !lCanceled
::oBrw:PostMsg( WM_KEYDOWN, VK_DOWN )
ENDIF
RETURN Nil
Es absolutamente necesario utilizar esta técnica de
envío de mensajes simulando la pulsación de tecla abajo, de lo contrario se produce un apilamiento de llamadas que puede provocar un error si se producen muchas altas de forma consecutiva.
Observa que sólo hago el alta, si estábamos en modo ALTA y además no se ha cancelado la edición con ESC.
Un saludo