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 Expand view RUN
- #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