Gustavo, your indication is totally different as I have suggested. Please note this example:
Code: Select all
#include "hmg.ch"
#define APP_TITLE "EDIT EXTENDED Demo"
Function Main()
SET CENTURY ON
SET DELETED OFF
SET DATE TO BRITISH
// SET LANGUAGE TO PORTUGUESE
// InitMessages("PT")
SET LANGUAGE TO SPANISH
// SET CODEPAGE TO SPANISH
InitMessages( "ES" )
// HB_LANGSELECT( "ES" )
DEFINE WINDOW Win_1 ;
AT 0,0 ;
WIDTH getdesktopWidth() ;
HEIGHT getDeskTopHeight()-27 ;
TITLE APP_TITLE ;
MAIN ;
NOMAXIMIZE ;
NOSIZE ;
ON INIT OpenTable() ;
ON RELEASE CloseTable()
DEFINE BUTTON Button_1
ROW 250
COL 240
WIDTH 100
HEIGHT 28
ACTION BasicDemo( "TEST2" )
CAPTION "Editar DBF"
FONTNAME "Arial"
FONTSIZE 9
TOOLTIP ""
FONTBOLD .F.
FONTITALIC .F.
FONTUNDERLINE .F.
FONTSTRIKEOUT .F.
ONGOTFOCUS Nil
ONLOSTFOCUS Nil
HELPID Nil
FLAT .F.
TABSTOP .T.
VISIBLE .T.
TRANSPARENT .F.
MULTILINE .F.
PICTURE Nil
PICTALIGNMENT TOP
END BUTTON
END WINDOW
ACTIVATE WINDOW Win_1
return NIL
Function OpenTable()
// USE TEST2 Shared
If !Open_Dbf("TEST2.DBF", .f., .f., "TEST2", "DBFNTX")
MsgStop("Não foi possível abrir o arquivo: TEST2.DBF")
Return Nil
Endif
if !File( "TEST2COM.NTX" )
// Create order by first field plus last field.
// You can't search by this order. Only for test.
TEST2->( ordCreate( "TEST2COM.NTX", ;
"First Name", ;
"TEST2->First + TEST2->Last", ;
{|| TEST2->First + TEST2->Last } ) )
endif
if !File( "TEST2LAS.NTX" )
// Create order by last field.
TEST2->( ordCreate( "TEST2LAS.NTX", ;
"Last Name", ;
"TEST2->Last", ;
{|| TEST2->Last } ) )
endif
if !File( "TEST2HIR.NTX" )
// Create order by hiredate field.
TEST2->( ordCreate( "TEST2HIR.NTX", ;
"Hire Date", ;
"TEST2->Hiredate", ;
{|| TEST2->Hiredate } ) )
endif
if !File( "TEST2AGE.NTX" )
// Create order by age field.
TEST2->( ordCreate( "TEST2AGE.NTX", ;
"Age", ;
"TEST2->Age", ;
{|| TEST2->Age } ) )
endif
if !File( "TEST2MAR.NTX" )
// Create order by.
// You can't search by this order. Only for test.
TEST2->( ordCreate( "TEST2MAR.NTX", ;
"Married", ;
"TEST2->Married", ;
{|| TEST2->Married } ) )
endif
TEST2->( ordListAdd( "TEST2COM.NTX", "Primeiro Nomes" ) )
TEST2->( ordListAdd( "TEST2LAS.NTX", "Sobre Nomes" ) )
TEST2->( ordListAdd( "TEST2HIR.NTX", "Data de aluguel" ) )
TEST2->( ordListAdd( "TEST2AGE.NTX", "Idade" ) )
TEST2->( ordListAdd( "TEST2MAR.NTX", "Casado" ) )
TEST2->( ordSetFocus( 1 ) )
Return Nil
Function Open_Dbf(cDbfName, lUseExclusive, lReadonly, cAlias, cRddName, nTries, lAsk)
Local nTriesOrig, lReturn:=.f., lNewArea:=.t.
DEFAULT lNewArea:=.t.
DEFAULT lReadonly:=.f.
DEFAULT lAsk:=.t.
DEFAULT nTries:=5
DEFAULT cRddName:="DBFNTX"
nTriesOrig := nTries
Do While nTries > 0
DbUseArea(lNewArea,cRddName,cDbfName,cAlias,!lUseExclusive,lReadonly)
If (!NetErr()) .and. Used()
lReturn := .t.
Exit
Endif
Inkey(.5)
nTries--
If nTries = 0 .and. lAsk
If MsgRetryCancel(aLng[027]+cDbfName+aLng[143]+CRLF+aLng[144],aLng[145])
nTries := nTriesOrig
Endif
Endif
Enddo
Return lReturn
Function CloseTable()
CLOSE TEST2
Return
Function BasicDemo( cArea )
Local aFieldName := { "Primeiro Nome", "Sobrenome", "Endereço", "Cidade", ;
"Estado", "CEP", "Data Aluguel", "Casado", "Idade", ;
"Salário", "Observações" }
Local aFieldAdvise := { "Digite o primeiro nome", ;
"Digite o sobrenome", ;
"Digite o endereço onde mora", ;
"Digite a cidade onde mora", ;
"Digite o estado (em dois caracteres)", ;
"Entre com o código postal", ;
"Selecione a data de aluguel", ;
"Deixe marcado se for casado", ;
"Entre com a idade", ;
"Entre com o salário", ;
"Deixe alguma observação, se for necessário" }
Local aVisTable := { .t., .t., .t., .t., .f., .f., .f., .f., .t., .t., .f. }
Local aFieldEdit := { .t., .t., .t., .t., .t., .t., .t., .t., .t., .f., .t. }
Local aOptions := Array( 3, 2 )
Local bSave := {|aValues, lNew| Salvar( aValues, lNew, cArea ) }
Local bSearch := {|| MsgInfo( "Sua rotina de pesquiça" ) }
Local bPrint := {|| MsgInfo( "Sua rotina para imprimir" ) }
aOptions[1,1] := "Executa opção 1"
aOptions[1,2] := {|| MsgInfo( "Você pode fazer a sua rotina 1" ) }
aOptions[2,1] := "Executa opção 2"
aOptions[2,2] := { || MsgInfo( "Você pode fazer a sua rotina 2" ) }
aOptions[3,1] := "Execute opção 3"
aOptions[3,2] := { || MsgInfo( "Você pode fazer a sua rotina 3" ) }
EDIT EXTENDED WORKAREA &cArea ;
TITLE "Employees maintenance" ;
FIELDNAMES aFieldName ;
FIELDMESSAGES aFieldAdvise ;
FIELDENABLED aFieldEdit ;
TABLEVIEW aVisTable ;
OPTIONS aOptions ;
ON SAVE bSave ;
ON FIND bSearch ;
ON PRINT bPrint
Return Nil
Function Salvar( aValues, lNew, cArea )
Local i := 1
If Empty( aValues[1] ) // Primeiro nome
MsgInfo( "O nome não pode estar em branco !" )
Return .f.
Endif
// Calcula o salario
aValues[10] := 100.5
// Salva o registro
If lNew
(cArea)->( dbAppend() )
Endif
For i := 1 TO Len( aValues )
(cArea)->( FieldPut( i, aValues[i] ) )
Next
Return .t.
Please return if your tests was made with sucess, otherwise I can send my executable file to prove that is working the way I have indicated.
You can make this PRG in C:\hmg.3.1.3\SAMPLES\EDIT_EXTENDED folder just for testing.