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
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
//------------------------------------------------------------------------------ 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
::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
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 ...
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.
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:
El entrampamiento VALID si te permite salir si lo programas para todos los actos del
usuario, por ejemplo
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煤
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. )
ENDIFEsa es la idea ACCE69, nosotros hacemos que el usuario posea una buena herramienta
de trabajo operativo-productivo, bien por ser previsivo !!
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.
Carlos Mora :
La referencia corresponde a lo descrito por nuestro amigo RSalazarU:
Podrias escribir un ejemplo de lo que indicas?
<< cl谩usula CANCEL que permite que se ejecute con el get inv谩lido >>
Saludos
Julio C茅sar G贸mez Cort茅z
Godryc Experiencias
Lima Per煤