Constraints!!!

30/07/2003 - 23:45 por José Trinidad [El Tiko] | Informe spam
Salu2!

Soy relativamente nuevo en esto del SQL-Server... y necesito una
ayudita! :-)

Tengo una tabla donde existe un campo que en teoría debería ser único...
pero en ciertas circunstancias debe permitir el ingreso del mismo dato...
entro en detalle! :-)


Tabla ->Camiones
Cliente_ID ->Código del Cliente
Camion_ID ->Autonumerico
Camion_Placa ->Este campo se supone debe ser nulo
UE ->Usuario eliminación (Es nulo hasta que no se
"elimine") :No se borra fisicamente, solo los marco como eliminados.

Lo que sucede es que tengo que implementar un proceso de Traslado de
Camiones, pense en solamente modificar el código del Cliente, pero para
efectos de historicos no me funciona...! :-(, lo que este proceso debe hacer
es Insertar una nueva Fila e ingresar los datos del camión que estoy
traspasando... el problemita es que tengo definido el indice como único...
:-S

Entonces señores, espero me ayuden con alguna sugerencia porque cuando
el camión ingresa nuevo a la Tabla no puede chocar con algún número de
Placa... pero cuando es traspasado si debe permitir esta "duplicación" en
las filas...

Muchas Gracias de Antemano!!

Att.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
José Trinidad García M. <El Tiko>
(Guía de buen uso del foro)
http://perso.wanadoo.es/rubenvigon/foro
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Preguntas similare

Leer las respuestas

#6 Liliana Sorrentino
31/07/2003 - 15:59 | Informe spam
José:
Creo que lo que me confundió fue en tu primer posta:

Camion_Placa ->Este campo se supone debe ser nulo

Quiero hacer una corrección en lo que escribí anteriormente: la clave sería
Camion_Placa (porque no debe permitir nulos si es tu PK) + Cliente_ID. De
esta manera te asegurás no tener claves repetidas (aunque sí la placa) y no
necesitás modificar el dato con los paréntesis (no me parece una salida
elegante).

Saludos... Liliana.

"José Trinidad [El Tiko]" escribió en el
mensaje news:#
Mostrar la cita
el
Mostrar la cita
traslado
Mostrar la cita
#7 José Trinidad [El Tiko]
31/07/2003 - 16:18 | Informe spam
Mostrar la cita
sería
Mostrar la cita
Hum... no me sirve de mucho... Para que tengas una idea clara de lo que
quiero es esto:

NO Permitir ingresar 2 placas Iguales... Solo en caso de Traslados
porque el nuevo camión va a tener la misma información -Lo otro sería
evitar que la gente venda los camiones... je je je!-

Mostrar la cita
salida elegante).
Tampoco lo veo elegante... más bien lo considero una "chapuza" pero
considerando el hecho de que innegablemente tendré que llegar a actualizar
el campo "TRASLADADO", no veo porque no aprovechar "el viaje a la Tabla" y
actualizar el campo Placa también! ;-)

De cualquier manera te agradezco tu tiempo!

Un Saludo!!!

Att.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
José Trinidad García M. <El Tiko>
(Guía de buen uso del foro VB)
http://perso.wanadoo.es/rubenvigon/foro
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#8 Liliana Sorrentino
31/07/2003 - 17:06 | Informe spam
José:

Mostrar la cita
que
Mostrar la cita
Exactamente es eso lo que te soluciona la concatenación de Camion_Placa +
Cliente_ID. Cuando te decía que "te asegurás no tener claves repetidas
(aunque sí la placa)" quería decir que vas a tener más de una vez la misma
placa, los traslados y la última activa pero sin inconvenientes de claves
duplicadas.
En cuanto al ingreso de datos por parte del usuario del sistema, tendrás que
controlar la posibilidad de la existencia de la placa para otro cliente y
que esté activo, de eso creo que no te salvás, pero es simple de verificar.
Además me parece que vale la pena teniendo en cuenta la consistencia del
resto de la aplicación y la utilidad y seguridad de tener una clave
compuesta para tu situación.

Espero que te sirva. Liliana.
#9 Javier Loria\(MVP\)
31/07/2003 - 17:06 | Informe spam
Hola Jose:
Hasta ahora con las preguntas de Lilliana creo entender el problema, te
propongo que dividas tu tabla de Camiones en 2:
Camiones (Ya existe):
Llave Primaria: PLACA.
Atributos: ????
Clientes (Ya Existe):
Llave Primaria: ClienteID?
Atributos: ????
Clientes_Camiones (Nueva)
Llave Primaria: ClienteID-Placa-FechaInicio(Fecha de Inicio de
Propiedad).
Atributos: Fecha Final de Propiedad).

Cuando un Cliente Traspasa un Camion a otro se actualiza la fila de
Clientes_Camiones se pone la Fecha Final (que antes estaba en Nullo y se
ingresa el nuevo camion.
Un ejemplo:
Estado Inicial:
Tabla
Camiones=>Placa: 123456
Clientes ==>ClienteID 83
ClienteCamion ==> Placa: 123456, CienteID,ƒ '2003-01-01',
FechaFinal=NULL
Trapaso:
Actualizar:
ClienteCamion ==> Placa: 123456, CienteIDƒ, '2003-01-01',
FechaFinal='2003-07-31'
Ingresar:
ClienteCamion ==> Placa: 123456, CienteID5, '2003-07-31',
FechaFinal=NULL

Con este esquema deberia ser facil:
a) Obtener la propiedad actual de los camiones: WHERE FechaFinal IS
NULL.
b) Obtener el propietario en cualquier parte del tiempo: WHERE
FechaInicial>=@Fecha AND FechaFinal<@Fecha.

Lo que requiere un ezfuerzo adicional es el mantener la Integridad para
asegurar que en un momento determinado no haya mas de 2 propietarios de
camion, o sea que FechaFinal propietario anterior sea mayor que FechaInicial
del siguiente. Pero eso lo puedes manejar en el procedimiento de Insercion
(si tienes uno) o en un Trigger. Si te gusta esta opcion podemos explorar el
codigo que se requeriria.

Saludos,


Javier Loria
Costa Rica (MVP)
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.

José Trinidad [El Tiko] wrote:
Mostrar la cita
#10 Leonardo Azpurua
01/08/2003 - 02:37 | Informe spam
"José Trinidad [El Tiko]" escribió en el
mensaje news:#

Mostrar la cita
Hola, Tiko:

Todo ese invento tuyo tiene un marcado olor a chapuza (con perdón). Por qué
tienes que utilizar una clave única que no es única? Lo normal, cuando uno
se da cuenta de que una restricción no puede ser satisfecha por la
naturaleza de los datos o de los procesos a ejecutarse sobre ellos, es
levantar la restricción: lo otro, eso de andar inventando paréntesis, es un
truco MUY sucio; de entrada, todas las consultas deberán ser WHERE Placa @paramPlaca@ Or Placa = '(' + @paramPlaca@ + ')' (guácala!).

Por lo que veo tienes Camiones y transacciones que afectan esos camiones
(una o más). Simplemente coloca los camiones (o el estado actual de los
camiones, con su clave primaria) en una tabla, y colocas las transacciones
en otra, utilizando como clave la placa mas el número de transacción
(contemplando la posibilidad de que un mismo camión se asocie con un cliente
más de una vez). Es probable que el estado actual del camión pueda estar
junto con el resto de los datos descriptivos en el maestro de Camiones.

Los "enredillos" sólo existen en nuestras cabezas.

Salud!

Leonardo
[MS MVP - VB]
Ads by Google
Search Busqueda sugerida