lunes, 20 de septiembre de 2010

Machote de Mantenimiento de Datos

#include "minigui.ch"
#include "Dbstruct.ch"

Function Main

SET CENTURY ON
SET DELETED ON
SET BROWSESYNC ON

DEFINE WINDOW Form_1 ;
AT 0,0 ;
WIDTH 640 HEIGHT 480 ;
TITLE 'Demo de Mantenimiento de Datos' ;
MAIN NOMAXIMIZE ;
ON INIT OpenTables() ;
ON RELEASE CloseTables()

DEFINE MAIN MENU
POPUP 'Registros'
ITEM 'Ingresar' ACTION PDatos_Detalles("INGRESAR")
ITEM 'Editar' ACTION PDatos_Detalles("EDITAR")
ITEM 'Actualizar Ventana' ACTION Form_1.Browse_1.Refresh()
SEPARATOR
ITEM 'Exit' ACTION Form_1.Release()
END POPUP
POPUP 'Help'
ITEM 'About' ACTION MsgInfo ( "Machote de mantenimiento de Datos", "About" )
END POPUP
END MENU

DEFINE STATUSBAR
KEYBOARD
DATE
IF "/" $ Set( 4 )
CLOCK AMPM
ELSE
CLOCK
ENDIF
END STATUSBAR

DEFINE BROWSE Browse_1
ROW 10
COL 10
WIDTH 610
HEIGHT 390
HEADERS { 'Codigo' , 'Nombre' , 'Apellido', 'Nacimiento', 'Casado'}
WIDTHS { 150 , 150 , 150 , 150 , 150 }
WORKAREA Test
FIELDS { 'Test->Code' , 'Test->First' , 'Test->Last' , 'Test->Birth' , 'if(Test->Married,"SI","NO")' }
VALUE 1
ON DBLCLICK PDatos_Detalles("EDITAR")
END BROWSE

END WINDOW

CENTER WINDOW Form_1

Form_1.Browse_1.SetFocus()

ACTIVATE WINDOW Form_1

Return Nil
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
Procedure OpenTables()

if !file("test.dbf")
CreateTable()
endif

Use Test Shared
Index on field->code to code temporary

Return
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
Procedure CloseTables()

Use

Return
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
PROCEDURE PDatos_Detalles(mUso)
PRIVATE mNuevo // varible que controla si se agrega un dato nuevo
// Prifijo determina el termina a que se le esta dando mantenimiento
// Puede ser, WLista1_Destalles, WUsuarios_Detalles, WArticulos_Destalles, Etc.
IF mUso = "INGRESAR"
mNuevo:= .T.
ENDIF

DEFINE WINDOW WPrefijo_Detalles ;
AT 0,0 ;
WIDTH 650 ; //GetDesktopWidth()-250;
HEIGHT 250 ;
TITLE "Detalles de Datos" ;
MODAL ;
NOSIZE

DEFINE TOOLBAR TlB_Datos BUTTONSIZE 50,40 SIZE 8 FLAT //BORDER

BUTTON Btn_nuevo ;
CAPTION "&Nuevo" ;
TOOLTIP 'nueva Cuenta' ;
ACTION PPrefijo_Accion("INGRESAR") ;
PICTURE "edit_new.bmp"

BUTTON Btn_Editar ;
CAPTION "&Editar";
TOOLTIP 'Cambiar Datos de Cuenta' ;
ACTION PPrefijo_Accion("EDITAR") ;
PICTURE "edit_edit.bmp" ;
SEPARATOR

BUTTON Btn_Guardar ;
CAPTION "&Guardar";
TOOLTIP 'Guardar Datos' ;
ACTION PPrefijo_Accion("GUARDAR") ;
PICTURE "edit_save.bmp"

BUTTON Btn_Cancelar ;
CAPTION "&Cancelar";
TOOLTIP 'Cancelar' ;
ACTION PPrefijo_Accion("CANCELAR");
PICTURE "edit_cancel.bmp"

BUTTON Btn_Deshacer ;
CAPTION "&Deshacer";
TOOLTIP 'Regresa los Datos Originales' ;
ACTION PPrefijo_Accion("DESHACER") ;
PICTURE "edit_undo.bmp" ;
SEPARATOR

BUTTON Btn_Borrar ;
CAPTION "E&liminar";
TOOLTIP 'Eliminar Cuenta' ;
ACTION PPrefijo_Accion("ELIMINAR");
PICTURE "edit_delete.bmp"
END TOOLBAR

mLinea:= 50
@ mLinea , 05 FRAME Frm_Principales CAPTION "Datos Principales" WIDTH 635 HEIGHT 150
@ mLinea+=20,120 GETBOX Txt_Codigo VALUE 0 WIDTH 100 HEIGHT 20
@ mLinea+5 , 20 LABEL Lbl_Codigo VALUE "Código" WIDTH 100 HEIGHT 20
@ mLinea+=20,120 GETBOX Txt_Nombre VALUE SPACE(100) WIDTH 250 HEIGHT 20
@ mLinea+5 , 20 LABEL Lbl_Nombre VALUE "Nombre" WIDTH 100 HEIGHT 20
@ mLinea+=20,120 GETBOX Txt_Apellido VALUE SPACE(100) WIDTH 250 HEIGHT 20
@ mLinea+5 , 20 LABEL Lbl_Apellido VALUE "Apellido" WIDTH 100 HEIGHT 20
@ mLinea+=20,120 DATEPICKER Dpk_FecNac VALUE CTOD("") WIDTH 100 HEIGHT 20
@ mLinea+=20,120 CHECKBOX Ckb_Casado CAPTION "Casado" VALUE .F. WIDTH 100 HEIGHT 20
@ mLinea+5 , 20 LABEL Lbl_Casado VALUE "Estado Civil" WIDTH 100 HEIGHT 20
END WINDOW
PPrefijo_Accion(mUso)
WPrefijo_Detalles.center
WPrefijo_Detalles.activate
RETURN
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
PROCEDURE PPrefijo_Accion(mUso)
DO CASE
CASE mUso="INGRESAR"
mNuevo:= .T.
PPrefijo_Datos(mUso,.F.)

CASE mUso="EDITAR"
mNuevo:= .F.
PPrefijo_Datos(mUso,.F.)

CASE mUso="GUARDAR"
IF !PPrefijo_Guardar()
mUso:=IF(mNuevo,"INGRESAR","EDITAR")
ELSE
mNuevo:= .F.
PPrefijo_Datos(mUso,.T.)
ENDIF
CASE mUso="CANCELAR"
IF mNuevo
WPrefijo_Detalles.release
ELSE
PPrefijo_Datos(mUso,.T.)
ENDIF
CASE mUso="DESHACER"
mUso:="EDITAR"
PPrefijo_Datos(mUso,.F.)
CASE mUso="ELIMINAR"
IF test->(FLock())
test->(DBDELETE())
test->(dbUnLock())
WPrefijo_Detalles.release
ELSE
msgbox("Registro en Uso.")
ENDIF
ENDCASE
PPrefijo_SetButtons(mUso)
RETURN
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
PROCEDURE PPrefijo_SetButtons(mUso)
LOCAL mVBtnStatus:= {}
// Normalmente cuando se Ingresa o Modifica,
//es necesario desabilitar siertas opciones
DO CASE
CASE mUso="INGRESAR"
mVBtnStatus:= {.F.,.F.,.T.,.T.,.F.,.F.,.F.}
CASE mUso="EDITAR"
mVBtnStatus:= {.F.,.F.,.T.,.T.,.T.,.F.,.F.}
OTHERWISE // Modo Normal
mVBtnStatus:= {.T.,.T.,.F.,.F.,.F.,.T.,.T.}
ENDCASE
SETPROPERTY("WPrefijo_Detalles","Btn_nuevo" ,"enabled",mVBtnStatus[1])
SETPROPERTY("WPrefijo_Detalles","Btn_editar" ,"enabled",mVBtnStatus[2])
SETPROPERTY("WPrefijo_Detalles","Btn_Guardar" ,"enabled",mVBtnStatus[3])
SETPROPERTY("WPrefijo_Detalles","Btn_cancelar","enabled",mVBtnStatus[4])
SETPROPERTY("WPrefijo_Detalles","Btn_deshacer","enabled",mVBtnStatus[5])
SETPROPERTY("WPrefijo_Detalles","Btn_Borrar" ,"enabled",mVBtnStatus[6])
RETURN
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
PROCEDURE PPrefijo_Datos(mUso,mReadOnly)

IF mUso = "INGRESAR"
WPrefijo_Detalles.Txt_Codigo.VALUE:= 0
WPrefijo_Detalles.Txt_Nombre.VALUE:= SPACE(100)
WPrefijo_Detalles.Txt_Apellido.VALUE:= SPACE(100)
WPrefijo_Detalles.Dpk_FecNac.VALUE:= CTOD("")
WPrefijo_Detalles.Ckb_Casado.VALUE:= .f.

MReadOnly:= IF(MReadOnly = NIL,.F.,MReadOnly)
ELSE
WPrefijo_Detalles.Txt_Codigo.VALUE:= test->code
WPrefijo_Detalles.Txt_Nombre.VALUE:= test->First
WPrefijo_Detalles.Txt_Apellido.VALUE:= test->Last
WPrefijo_Detalles.Dpk_FecNac.VALUE:= test->birth
WPrefijo_Detalles.Ckb_Casado.VALUE:= test->Married

MReadOnly:= IF(MReadOnly = NIL,.T.,MReadOnly)
ENDIF
PPrefijo_ReadOnly(MReadOnly)
RETURN
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
PROCEDURE PPrefijo_ReadOnly(MReadOnly)
WPrefijo_Detalles.Txt_Codigo.ReadOnly:= mReadOnly
WPrefijo_Detalles.Txt_Nombre.ReadOnly:= mReadOnly
WPrefijo_Detalles.Txt_Apellido.ReadOnly:= mReadOnly
WPrefijo_Detalles.Dpk_FecNac.Enabled:= !mReadOnly
WPrefijo_Detalles.Ckb_Casado.Enabled:= !mReadOnly
RETURN
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
PROCEDURE PPrefijo_Guardar()
IF EMPTY(WPrefijo_Detalles.Txt_Codigo.VALUE)
WPrefijo_Detalles.Txt_Codigo.setfocus
RETURN(.F.)
ENDIF
IF mNuevo .AND. test->(DBSEEK(WPrefijo_Detalles.Txt_Codigo.VALUE))
WPrefijo_Detalles.Txt_Codigo.setfocus
RETURN(.F.)
ENDIF
IF EMPTY(WPrefijo_Detalles.Txt_Nombre.VALUE)
WPrefijo_Detalles.Txt_Nombre.setfocus
RETURN(.F.)
ENDIF
IF EMPTY(WPrefijo_Detalles.Txt_Apellido.value)
WPrefijo_Detalles.Txt_Apellido.setfocus
RETURN(.F.)
ENDIF

IF !Test->(FLock())
msgbox("Tabla ocupada")
RETURN
ENDIF
IF mNuevo
Test->(DBAPPEND())
REPLACE Test->Code WITH WPrefijo_Detalles.Txt_Codigo.VALUE
ENDIF
REPLACE test->First WITH WPrefijo_Detalles.Txt_Nombre.VALUE
REPLACE test->Last WITH WPrefijo_Detalles.Txt_Apellido.VALUE
REPLACE test->birth WITH WPrefijo_Detalles.Dpk_FecNac.VALUE
REPLACE test->Married WITH WPrefijo_Detalles.Ckb_Casado.VALUE
Test->(DBUnLock())
mNuevo:=.F.
RETURN(.T.)
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
Procedure CreateTable
LOCAL aDbf[6][4], i

aDbf[1][ DBS_NAME ] := "Code"
aDbf[1][ DBS_TYPE ] := "Numeric"
aDbf[1][ DBS_LEN ] := 10
aDbf[1][ DBS_DEC ] := 0
//
aDbf[2][ DBS_NAME ] := "First"
aDbf[2][ DBS_TYPE ] := "Character"
aDbf[2][ DBS_LEN ] := 25
aDbf[2][ DBS_DEC ] := 0
//
aDbf[3][ DBS_NAME ] := "Last"
aDbf[3][ DBS_TYPE ] := "Character"
aDbf[3][ DBS_LEN ] := 25
aDbf[3][ DBS_DEC ] := 0
//
aDbf[4][ DBS_NAME ] := "Married"
aDbf[4][ DBS_TYPE ] := "Logical"
aDbf[4][ DBS_LEN ] := 1
aDbf[4][ DBS_DEC ] := 0
//
aDbf[5][ DBS_NAME ] := "Birth"
aDbf[5][ DBS_TYPE ] := "Date"
aDbf[5][ DBS_LEN ] := 8
aDbf[5][ DBS_DEC ] := 0
//
aDbf[6][ DBS_NAME ] := "Bio"
aDbf[6][ DBS_TYPE ] := "Memo"
aDbf[6][ DBS_LEN ] := 10
aDbf[6][ DBS_DEC ] := 0

DBCREATE("Test", aDbf)

Use Test

For i:= 1 To 100
append blank
Replace code with i
Replace First With 'First Name '+ Ltrim(Str(i))
Replace Last With 'Last Name '+ Ltrim(Str(i))
Replace Married With ( i/2 == int(i/2) )
replace birth with date()-Max(10000, Random(20000))+Random(LastRec())
Next i
Use

Return

1 comentario: