Estimado Rolando.
Nuestros conocimientos y experiencia son lo mejor que tenemos, ! , Nunca sera una polemica, es un regalo que damos todos.
Por ello este Foro es tan especial !
Gracias
Lubin
ACC69 wrote:Marcelo Via Giglio wrote:Estimado Rolando,
que gusto saber de ti, como andas espero algún día podamos tomar un cafe.
Sobre el tema de validación, como dice Rolando es menos dolor de cabeza hacerlo en bloque, pero puedes validar algún tipo de dato como por ejemplo un código para no introducir uno repetido, y colocas la clausa CANCEL en el BUTTON (de cancelar o salir) o si no esta disponible utilizar oBtn:lCancel := .T. eso te permite no trancarte en una validacion de un GET.
Yo utilizo un validador basico
- Code: Select all Expand view RUN
//------------------------------------------------------------------------------
FUNCTION validador ( oDbf, aParam )
// aParam { bloque de verificación, Campo de la tabla, mensaje }
//------------------------------------------------------------------------------
LOCAL i
FOR i := 1 TO LEN( aParam )
IF VALTYPE( aParam[i,1] ) = "B"
IF ! EVAL( aParam[i,1], oDbf )
RETURN .F.
ENDIF
ELSE
IF EVAL( aParam[i,2], oDbf:fieldGet( oDbf:FIELDPOS( aParam[i,1] ) ), oDbf:RECNO(), oDbf )
MSGALERT( aParam[i,3] )
RETURN .F.
ENDIF
ENDIF
NEXT
RETURN .T.
y lo defines
- Code: Select all Expand view RUN
::aValids := {{ "almacen", {|c| EMPTY(c) }, "Se debe definir un almacen" },;
{ "item", {|c| EMPTY(c) }, "Se debe definir un código de item" },;
{ IF( job $ "NEW,DUPLI", {| oDbf | valid_item( oDbf ) }, {|| .T. } ) },;
{ "descripcion", {|c| EMPTY(c) }, "Se debe definir una descripción" },;
{ "aplicacion", {|c| EMPTY(c) }, "Se debe definir la aplicación" };
}
y lo llamas antes de cualquier operación, funciona en base a la clase tDataBase para los campos de validación
- Code: Select all Expand view RUN
validador( ::oDbf, ::aValids )
Son solo ideas pero espero ayuden
Saludos
Marcelo
Hola buenos dias de antemano les envio cordial saludos.
Aqui pongo mi forma de validar mis gets antes de grabar el registro,segun sea la condicion ...
- Code: Select all Expand view RUN
REDEFINE GET oG_IVA[03] VAR nIVA_1 ID 103 OF oDlgIVA PICT "99,999,999.99" VALID V_IVA(1)
//------------------------------------------------------------------------------
STATIC FUNCTION V_IVA(nOp) // Function para validar el get
//Esta parte de aqui te permite regresar al get anterior en caso que tecleaste mal el dato\\
IF !GetKeyState( VK_RETURN ) .and. !GetKeyState( VK_DOWN ) .and. !GetKeyState( VK_TAB )
RETURN( .T. )
ENDIF
DO CASE
CASE noP = 1 .AND. nIVA_1 <> 0 .AND. !nImpBs1 <> 0 .AND. !nTasa1 <> 0
MsgAlert('Error: No puede capturar importe IVA,si base y tasa IVA,se encuentra vacío',"Confirma")
RETURN .F.
CASE noP = 2 .AND. nIVA_2 <> 0 .AND. !nImpBs2 <> 0 .AND. !nTasa2 <> 0
MsgAlert('Error: No puede capturar importe IVA,si base y tasa IVA,se encuentra vacío',"Confirma")
RETURN .F.
ENDCASE
RETURN (.T.)
//------------------------------------------------------------------------------
STATIC FUNCTION Reg_Cap()
Local nNumMov,cCtaSN
oG_D[06]:SetColor()
oG_D[06]:Refresh()
oG_D[07]:SetColor()
oG_D[07]:Refresh()
cCtaSN := SUBS(cCta,1,4) + SUBS(cCta,6,4) + SUBS(cCta,11,4) + SUBS(cCta,16,4)
cCta2 := FORMATO1("cCta",cCta, .F.) // No Permite separar guiones
//Aqui antes de registrar el dato al dbf...te valida cada campo si esta vacio o no...\\
// Aqui te valida cada get despues del boton de agregar nuevo registro...yo creo que es lo mas fiable y seguro...
DO CASE
CASE !(S09)->( DbSeek(STR(nSegNg,4)) ) .AND. lAP_SN
MsgInfo("Error: No existe Segmento de Negocio","Confirme")
oG_D[02]:SetFocus()
oG_D[02]:Refresh()
RETURN.F.
CASE EMPTY(cCta)
MsgInfo("Error: Favor de teclear subcuenta")
oG_D[01]:SetFocus()
oG_D[01]:Refresh()
RETURN .F.
CASE (S08)->( DbSeek(cCta2) )
IF (S08)->TIPONAT = "A"
MsgInfo("Error: La cuenta debe ser de detalle!","Confirme")
cCta := SPACE(19)
oG_D[01]:SetFocus()
oG_D[01]:Refresh()
RETURN .F.
ENDIF
CASE !(S08)->( DbSeek(cCta2) )
MsgInfo("Error: La cuenta no existe!","Confirme")
cCta := SPACE(19)
oG_D[01]:SetFocus()
oG_D[01]:Refresh()
RETURN .F.
ENDCASE
// Aqui se añade nuevo registro en caso que todos los gets hayan cumplido la validacion ...\\
//* Paso 1 ----- Agrega datos a S12:= Abre_Dbf(12,12) // Abre: POLZxMxA.DBF -----*\\
IF lAdd // Agrega nuevo registro
(S12)->( DbSeek(cID_AMMov+cTipo+STR(nNumPol,5)) )
IF (S12)->(!FOUND()) // Si agrega nuevo resistro en la base de datos
(S12)->(DbAppend())
(S12)->FECALTA := DATE()
(S12)->REGHORA := AMPM(TIME())
(S12)->NICKUSUA:= cNombUsua
(S12)->NOMBUSUA:= cNombre
ENDIF
*?"Regisro nuevo dado de alta"
IF nCarg <> 0
aSum[1, 2] += nCarg
aSum[1, 3] += nAbon
aSum[1, 4] += nImpBs1
ENDIF
...Mas intrucciones
Return nil..
Y creo que es la forma correcta ,que muchas veces no siempre se podra validar en cada get, porque el usuario siempre tendra acceso usando el mouse..es mejor validar al darle click de grabar y ahi que se haga toda la validacion correcta y segura...
Saludos cordiales .
Atte: Adrian C. C.
Maggiro wrote:RSalazarU:
Respecto a tu comentario:
NO colocar VALIDADORES en los Gets y ningun otro control de captura de datos.
Cuando colocas un validador a un GET, NO puedes salir de el mientras no se cumpla la
condicion,
lo cual te impide presionar en el boton CANCEL o CLOSE del dialogo, la unica forma de salir del
dialogo es presionando la tecla ESC.
A veces se da el caso, de que tienes que anular la tecla ESC; si de da el caso no podras cerrar
el DIALOGO a menos que se cumpla la condicion.
Esto me ocurrio, sobre todo, cuando hacia: VALID !Empty(cDato)
Toma ésta apreciación:
01. En un formato con cualesquier campos de llenado, las opciones proporcionadas
por Windows a travéz de FWH y Xharbour son muy ricas en opciones y nos permiten
el pasearnos por todo el dialogo GET como queramos.
02. El entrampamiento VALID si te permite salir si lo programas para todos los actos del
usuario, por ejemplo
- Tienes un campo GET que te pide un código de tabla.
- Tu VALID podría considerar hasta cuatro opciones
FUNCTION ValidaGETdeTabla()
LOCAL uvf:=.F.
IF GETKEYSTATE(VK_UP) // al pulsar tecla flecha arriba
uvf=.T. //te permite salir del GET para regresar al campo GET anterior.
ELSEIF EMPTY(CampoGetConTabla) .AND. GETKEYSTATE(VK_RETURN)
uvf=.T. //si quieres pasar sin llenar, puedes hacerlo
ELSEIF EMPTY(CampoGetConTabla) .AND. GETKEYSTATE(VK_F2)
//despliegas la tabla para que el usuario elija su clasificacion y le retornas
//los datos complementarios en los campos necesarios.
Eligió los datos de un registro en la tabla sin pulsar ESC ??
uvf=.T.
No eligió, la tabla esta vacia ??
sigue uvf en .F.
ENDI
ELSEIF LEN(CampoGetConTabla)=6
//usuario conoce el codigo de la tabla ... realizas la busqueda y le retornas
//los datos complementarios en los campos necesarios.
Encontró los datos del codigo ingresado en un registro de la tabla ??
uvf=.T.
No eligió, la tabla esta vacia ??
sigue uvf en .F.
ENDI
ENDI
RETU uvf
03. La pos validación en el boton ACEPTAR es obligada antes de grabar.
Para Lubin:
El desorden con el que el usuario registre una forma no tiene que ser un problema para
encasillarlo a pasar los gets uno por uno en orden riguroso. Puede que el usuario NO tenga
en determinado momento el dato para llenar el GET tres, pero pero en ese mismo momento
SI tiene los datos para llenar los GETS seis, ocho y once.
Saludos
Julio César Gómez Cortéz
Godryc Experiencias
Lima Perú
//Esta parte de aqui te permite regresar al get anterior en caso que tecleaste mal el dato\\
IF !GetKeyState( VK_RETURN ) .and. !GetKeyState( VK_DOWN ) .and. !GetKeyState( VK_TAB )
RETURN( .T. )
ENDIF
Maggiro wrote: NO colocar VALIDADORES en los Gets y ningun otro control de captura de datos.
Cuando colocas un validador a un GET, NO puedes salir de el mientras no se cumpla la
condicion,
lo cual te impide presionar en el boton CANCEL o CLOSE del dialogo, la unica forma de salir del
dialogo es presionando la tecla ESC.
Return to FiveWin para Harbour/xHarbour
Users browsing this forum: Google [Bot] and 23 guests