Donde validar (Capa de datos - Reglas de negocio)

25/09/2004 - 19:53 por El principiante | Informe spam
Como ya he dicho estoy aprendiendo SQL Server (usando Visual Foxpro como
interfaz) especificamente para el desarrollo de un sistema nuevo para
entorno Windows. Hice hace poco una pregunta relacionada pero aquella era
menos especifica.

Resulta que siguiendo normas leidas en los BOL's estoy tratando de indicar
la mayor cantidad de validaciones en la propia base de datos, como
restricciones por ejemplo. Es decir las reglas del negocio en la propia
base de datos.

Como es normal al registrar datos en un form, las validaciones se verifican
al momento de salvar los datos a sql server. El asunto es que en una
determinada pantalla de registro que contiene muchos campos divididos en
varios bloques (pageframes) el cliente me dice que prefiere que al usuario
se le vaya informando sobre datos incorrectos a medida que vaya avanzando de
campo a campo(porque como dije son muchos) y no esperar a que le de a Salvar
pues asi es mas lento el proceso. Ademas aunque no fuese asi, cuando el
insert produce un error de validacion se requiere que en la aplicacion se
posicione en el campo correspondiente a la primera columna con un valor
erroneo.

El asunto es que veo que eso implicaria incluir las mismas validaciones que
ya tengo definidas en la base de datos (sea en restricciones o store
procedures) tendria que repetirlas a nivel de la capa de la interfaz, lo
cual como que no me parece adecuado pues seria como duplicacion de codigo y
no estarian separadas las capas.

Lo que quiero es:
Hay alguna forma de indicar restricciones para una columna especifica de
una tabla de SQL Server de modo que yo pueda detectar desde una aplicacion
cual columna fue que produjo el error y poder posicionarme en la aplicacion
en esta columna ?
De haberlo, hay forma de yo extraer el codigo de validacion desde el
servidor para poder utilizarlo directamente en la aplicacion en la copia
local de datos en edicion, sin tener que repetir esta logica a nivel de la
interfaz ?

Aunque me resultaria mas sencillo que me contaran sus experiencias de como
se suelen manejar estas cosas pues me tienen un poco confundido. Lo que
necesito es alguna idea practica.

Muchas gracias por su valiosa ayuda

Preguntas similare

Leer las respuestas

#1 MAXI
26/09/2004 - 04:45 | Informe spam
Hola, bueno es un tema muy discutible por lo cual mi opinion puede diferir
mucho del resto.

Yo veo muy bien hacer la doble validacion, uno de los grandes motivos es que
estoy validando antes de conectarme al motor, con lo cual estoy trabajando
bien desconectado!!! yo para ello estuve estudiando y no he encontrado mejor
opcion que usar en la capa de negocios un Dataset con Tipo!! esto te
permitira hacer validaciones en la capa sin necesidad de conectarte a la
BDD.

Eso si, es escribir mas, pero no lo veo del todo mal como expresas tu :-)




Maxi

Buenos Aires - Argentina
Desarrollador .NET 3 Estrellas
Microsoft User Group (MUG)
Mail: Maxi_accotto[arroba]speedy.com.ar

Msn Messager:

"El principiante" escribió en el mensaje
news:
Como ya he dicho estoy aprendiendo SQL Server (usando Visual Foxpro como
interfaz) especificamente para el desarrollo de un sistema nuevo para
entorno Windows. Hice hace poco una pregunta relacionada pero aquella era
menos especifica.

Resulta que siguiendo normas leidas en los BOL's estoy tratando de indicar
la mayor cantidad de validaciones en la propia base de datos, como
restricciones por ejemplo. Es decir las reglas del negocio en la propia
base de datos.

Como es normal al registrar datos en un form, las validaciones se
verifican
al momento de salvar los datos a sql server. El asunto es que en una
determinada pantalla de registro que contiene muchos campos divididos en
varios bloques (pageframes) el cliente me dice que prefiere que al usuario
se le vaya informando sobre datos incorrectos a medida que vaya avanzando
de
campo a campo(porque como dije son muchos) y no esperar a que le de a
Salvar
pues asi es mas lento el proceso. Ademas aunque no fuese asi, cuando el
insert produce un error de validacion se requiere que en la aplicacion se
posicione en el campo correspondiente a la primera columna con un valor
erroneo.

El asunto es que veo que eso implicaria incluir las mismas validaciones
que
ya tengo definidas en la base de datos (sea en restricciones o store
procedures) tendria que repetirlas a nivel de la capa de la interfaz, lo
cual como que no me parece adecuado pues seria como duplicacion de codigo
y
no estarian separadas las capas.

Lo que quiero es:
Hay alguna forma de indicar restricciones para una columna especifica de
una tabla de SQL Server de modo que yo pueda detectar desde una aplicacion
cual columna fue que produjo el error y poder posicionarme en la
aplicacion
en esta columna ?
De haberlo, hay forma de yo extraer el codigo de validacion desde el
servidor para poder utilizarlo directamente en la aplicacion en la copia
local de datos en edicion, sin tener que repetir esta logica a nivel de la
interfaz ?

Aunque me resultaria mas sencillo que me contaran sus experiencias de como
se suelen manejar estas cosas pues me tienen un poco confundido. Lo que
necesito es alguna idea practica.

Muchas gracias por su valiosa ayuda



Respuesta Responder a este mensaje
#2 Jorge
26/09/2004 - 05:03 | Informe spam
bueno, desde mi punto de vista y de mi experiencia son de varios tipos:

1.- tipo de datos, formato, longitud: esto lo controlo en los text, check,
combos, etc, de la interfaz, por ejemplo en un identificador de documento
(en Ecuador) solo son10 digitos, hago que el text de ingreso no permita
poner mas de 10 digitos, en formatos de fecha en los valid de cada text
llamo una funcion que me valide el formato y rango de fecha permitido, por
ejemplo que no permita ingresar fechas 2190/01/01, es valido como fecha pero
es ilogico para ciertas aplicaciones.

2.- para la integridad de datos, no dejo que el usuario ingrese el dato sino
que uso lista de valores o listas desplegables (combos), por ejemplos en una
aplicacion de facturaciòn no permito que ingrese el codigo de un producto
sino que lo seleccione de una lista de valores.

De este tipo de validaciones creo que no podras saltarte sea cual fuere el
leguaje de programaciòn que utilices, ahora si con todo esto siguen los
errores en las sentencias SQL, el error es en la sintaxis y esos es còdigo
mal escrito.

espero que te sea util mi punto de vista
saludos
jorge


"El principiante" escribió en el mensaje
news:
Como ya he dicho estoy aprendiendo SQL Server (usando Visual Foxpro como
interfaz) especificamente para el desarrollo de un sistema nuevo para
entorno Windows. Hice hace poco una pregunta relacionada pero aquella era
menos especifica.

Resulta que siguiendo normas leidas en los BOL's estoy tratando de indicar
la mayor cantidad de validaciones en la propia base de datos, como
restricciones por ejemplo. Es decir las reglas del negocio en la propia
base de datos.

Como es normal al registrar datos en un form, las validaciones se


verifican
al momento de salvar los datos a sql server. El asunto es que en una
determinada pantalla de registro que contiene muchos campos divididos en
varios bloques (pageframes) el cliente me dice que prefiere que al usuario
se le vaya informando sobre datos incorrectos a medida que vaya avanzando


de
campo a campo(porque como dije son muchos) y no esperar a que le de a


Salvar
pues asi es mas lento el proceso. Ademas aunque no fuese asi, cuando el
insert produce un error de validacion se requiere que en la aplicacion se
posicione en el campo correspondiente a la primera columna con un valor
erroneo.

El asunto es que veo que eso implicaria incluir las mismas validaciones


que
ya tengo definidas en la base de datos (sea en restricciones o store
procedures) tendria que repetirlas a nivel de la capa de la interfaz, lo
cual como que no me parece adecuado pues seria como duplicacion de codigo


y
no estarian separadas las capas.

Lo que quiero es:
Hay alguna forma de indicar restricciones para una columna especifica de
una tabla de SQL Server de modo que yo pueda detectar desde una aplicacion
cual columna fue que produjo el error y poder posicionarme en la


aplicacion
en esta columna ?
De haberlo, hay forma de yo extraer el codigo de validacion desde el
servidor para poder utilizarlo directamente en la aplicacion en la copia
local de datos en edicion, sin tener que repetir esta logica a nivel de la
interfaz ?

Aunque me resultaria mas sencillo que me contaran sus experiencias de como
se suelen manejar estas cosas pues me tienen un poco confundido. Lo que
necesito es alguna idea practica.

Muchas gracias por su valiosa ayuda



Respuesta Responder a este mensaje
#3 Javier Loria
26/09/2004 - 22:25 | Informe spam
Hola:
Mi opinion: Depende de los objetivos de diseno. Mis reglas sin mucha
"academia".
a) La calidad de los datos es importante o muy importante
i )Regla es sencilla/basica en 3 lugares:
UI: Interfase de Usuarios: para dar respuesta rapida al
usuario y "guiarlo" en el proceso.
CN: capa de negocios (forma parte de las reglas de negocios)
y es su responsabilidad, no "confia" en UI.
BD: Lo hace bien, lo hace rapido, es la unica "garantizada".
ii) Si la regla es complicada/elaborada: en la capa de Negocios
(CN)
b) Calidad de los datos no es tan importante y es mas importante el
diseno rapido.
i) Regla Sencilla/Basica: BD: Rapido, lo hace bien, garantizada.
ii) Regla Compleja/Elaborada: CN.
Hay formas de extraer "MetaData" de la BD, lo mas sencillo, tipos,
largo, etc. viene incluido en el esquema de OLE/DB. Lo mas complejo tienes
que obternerlo de las vistas de INFORMATION_SCHEMA o incluso de tablas de
sistema. Mi experiencia no ha sido tan buena extrayendo esta informacion, en
la actualiada lo que mas uso es unas tablas de MetaData "personalizadas".
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda

"El principiante" wrote in message
news:
Como ya he dicho estoy aprendiendo SQL Server (usando Visual Foxpro como
interfaz) especificamente para el desarrollo de un sistema nuevo para
entorno Windows. Hice hace poco una pregunta relacionada pero aquella era
menos especifica.

Resulta que siguiendo normas leidas en los BOL's estoy tratando de indicar
la mayor cantidad de validaciones en la propia base de datos, como
restricciones por ejemplo. Es decir las reglas del negocio en la propia
base de datos.

Como es normal al registrar datos en un form, las validaciones se


verifican
al momento de salvar los datos a sql server. El asunto es que en una
determinada pantalla de registro que contiene muchos campos divididos en
varios bloques (pageframes) el cliente me dice que prefiere que al usuario
se le vaya informando sobre datos incorrectos a medida que vaya avanzando


de
campo a campo(porque como dije son muchos) y no esperar a que le de a


Salvar
pues asi es mas lento el proceso. Ademas aunque no fuese asi, cuando el
insert produce un error de validacion se requiere que en la aplicacion se
posicione en el campo correspondiente a la primera columna con un valor
erroneo.

El asunto es que veo que eso implicaria incluir las mismas validaciones


que
ya tengo definidas en la base de datos (sea en restricciones o store
procedures) tendria que repetirlas a nivel de la capa de la interfaz, lo
cual como que no me parece adecuado pues seria como duplicacion de codigo


y
no estarian separadas las capas.

Lo que quiero es:
Hay alguna forma de indicar restricciones para una columna especifica de
una tabla de SQL Server de modo que yo pueda detectar desde una aplicacion
cual columna fue que produjo el error y poder posicionarme en la


aplicacion
en esta columna ?
De haberlo, hay forma de yo extraer el codigo de validacion desde el
servidor para poder utilizarlo directamente en la aplicacion en la copia
local de datos en edicion, sin tener que repetir esta logica a nivel de la
interfaz ?

Aunque me resultaria mas sencillo que me contaran sus experiencias de como
se suelen manejar estas cosas pues me tienen un poco confundido. Lo que
necesito es alguna idea practica.

Muchas gracias por su valiosa ayuda



Respuesta Responder a este mensaje
#4 Adrian D. Garcia
27/09/2004 - 06:14 | Informe spam
Lo que yo hago al respecto es:
1) Especificar todas las validaciones y restricciones de datos en el motor.
A mi aprecer estas no son reglas de negocio o logica del negocio sino
logica/reglas de datos y el motor debe asegurarnos que las mismas se
cumplen.
2) Crear objetos de negocio que realicen las validaciones de los datos
emitiendo mensajes entendibles al usuario. Para evitar duplicacion de
trabajo puedo generar algun tipo de asistente que lea los checks y las
restricciones de la base de datos y genere el codigo (mas estatico a los
cambios pero buena performance) o que lea las mismas en tiempo de ejecucion
(mas dinamico a los cambios pero no tan buena performance).

3) Dependiendo de la arquitectura que definas y utilices podrias crear
objetos de negocio desde tu capa de presentacion (forms) e ir realizando las
validaciones a medida que el usuario va ingresando los datos. Tambien
podrias agregar validaciones de logica de negocio (Ej: Tiene el cliente
saldo para realizar la compra?, esta ese porcentaje de descuento permitido
para ese tipo de producto? Se puede aplicar determinado plan de pago al
monto de la compra? etc, etc) en ese objeto de forma tal que las mismas se
realizen siempre que se asigna algun valor a una propieda, etc.


Saludos
Adrian D. Garcia
MCSD
NDSoft Consultoria y Desarrollo

"El principiante" wrote in message
news:
Como ya he dicho estoy aprendiendo SQL Server (usando Visual Foxpro como
interfaz) especificamente para el desarrollo de un sistema nuevo para
entorno Windows. Hice hace poco una pregunta relacionada pero aquella era
menos especifica.

Resulta que siguiendo normas leidas en los BOL's estoy tratando de indicar
la mayor cantidad de validaciones en la propia base de datos, como
restricciones por ejemplo. Es decir las reglas del negocio en la propia
base de datos.

Como es normal al registrar datos en un form, las validaciones se


verifican
al momento de salvar los datos a sql server. El asunto es que en una
determinada pantalla de registro que contiene muchos campos divididos en
varios bloques (pageframes) el cliente me dice que prefiere que al usuario
se le vaya informando sobre datos incorrectos a medida que vaya avanzando


de
campo a campo(porque como dije son muchos) y no esperar a que le de a


Salvar
pues asi es mas lento el proceso. Ademas aunque no fuese asi, cuando el
insert produce un error de validacion se requiere que en la aplicacion se
posicione en el campo correspondiente a la primera columna con un valor
erroneo.

El asunto es que veo que eso implicaria incluir las mismas validaciones


que
ya tengo definidas en la base de datos (sea en restricciones o store
procedures) tendria que repetirlas a nivel de la capa de la interfaz, lo
cual como que no me parece adecuado pues seria como duplicacion de codigo


y
no estarian separadas las capas.

Lo que quiero es:
Hay alguna forma de indicar restricciones para una columna especifica de
una tabla de SQL Server de modo que yo pueda detectar desde una aplicacion
cual columna fue que produjo el error y poder posicionarme en la


aplicacion
en esta columna ?
De haberlo, hay forma de yo extraer el codigo de validacion desde el
servidor para poder utilizarlo directamente en la aplicacion en la copia
local de datos en edicion, sin tener que repetir esta logica a nivel de la
interfaz ?

Aunque me resultaria mas sencillo que me contaran sus experiencias de como
se suelen manejar estas cosas pues me tienen un poco confundido. Lo que
necesito es alguna idea practica.

Muchas gracias por su valiosa ayuda



Respuesta Responder a este mensaje
#5 El principiante
27/09/2004 - 13:35 | Informe spam
Gracias por sus opiniones tan interesantes.

De ellas me arriesgo a concluir que en terminos practicos lo que me conviene
es:

1) Tener en la base de datos las restricciones CHECK, valores por defecto,
claves primarias y similares que le den
una integridad de datos (como dice el compañero de arriba).

2) Tener una capa de validacion de datos llamada desde la interfaz pero NO
que resida en la base de datos (pues no seria necesario). Algo asi como el
ejemplo de controlar el limite de credito de un cliente al hacer una nueva
factura. Esta capa de datos se auxiliaría de uno que otro procedimiento
almacenado que se defina para agilizar procesos que lo requieran pero
conceptualmente la validacion la haria la aplicacion.

3) Lo que habria que limitar es el acceso a los datos desde fuera de la
aplicacion para evitar que se violen las reglas de negocio que se hayan
definido en la capa intermedia, salvo que sea el administrador de la BD





Andres Ledesma







"El principiante" wrote in message
news:
Como ya he dicho estoy aprendiendo SQL Server (usando Visual Foxpro como
interfaz) especificamente para el desarrollo de un sistema nuevo para
entorno Windows. Hice hace poco una pregunta relacionada pero aquella era
menos especifica.

Resulta que siguiendo normas leidas en los BOL's estoy tratando de indicar
la mayor cantidad de validaciones en la propia base de datos, como
restricciones por ejemplo. Es decir las reglas del negocio en la propia
base de datos.

Como es normal al registrar datos en un form, las validaciones se


verifican
al momento de salvar los datos a sql server. El asunto es que en una
determinada pantalla de registro que contiene muchos campos divididos en
varios bloques (pageframes) el cliente me dice que prefiere que al usuario
se le vaya informando sobre datos incorrectos a medida que vaya avanzando


de
campo a campo(porque como dije son muchos) y no esperar a que le de a


Salvar
pues asi es mas lento el proceso. Ademas aunque no fuese asi, cuando el
insert produce un error de validacion se requiere que en la aplicacion se
posicione en el campo correspondiente a la primera columna con un valor
erroneo.

El asunto es que veo que eso implicaria incluir las mismas validaciones


que
ya tengo definidas en la base de datos (sea en restricciones o store
procedures) tendria que repetirlas a nivel de la capa de la interfaz, lo
cual como que no me parece adecuado pues seria como duplicacion de codigo


y
no estarian separadas las capas.

Lo que quiero es:
Hay alguna forma de indicar restricciones para una columna especifica de
una tabla de SQL Server de modo que yo pueda detectar desde una aplicacion
cual columna fue que produjo el error y poder posicionarme en la


aplicacion
en esta columna ?
De haberlo, hay forma de yo extraer el codigo de validacion desde el
servidor para poder utilizarlo directamente en la aplicacion en la copia
local de datos en edicion, sin tener que repetir esta logica a nivel de la
interfaz ?

Aunque me resultaria mas sencillo que me contaran sus experiencias de como
se suelen manejar estas cosas pues me tienen un poco confundido. Lo que
necesito es alguna idea practica.

Muchas gracias por su valiosa ayuda



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida