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:#
> No entiendo...

Ups... es un enredillo... je je!

> Entonces, ¿la forma de identificar al camión es Camión_ID? Pero si es
> autonumérico...¿cómo hacés el traslado?

Simple... inserto una nueva fila... sólo que traslado toda la
información del camión original a esta nueva fila... al trasladar esta
"misma" información es cuando tenía problemas ya que la placa va a
coincidir... y por integridad no puede ser así, La solución es modificar


el
registro original... agregarle unos parentesis "()" al número de placa y
marcar el camión como trasladado... Al final de mes traslado todos los
registros marcados a otra tabla de historicos... esto porque en un


traslado
es posible que algunos de los viajes se le tengan que pagar al dueño
original y el resto al nuevo... (Todo una desgracia pero bueno!!!)

> Si estoy entendiendo bien, yo hubiera armado esa tabla con Camion_ID y
> Cliente_ID como clave y, actualizando el campo de eliminación, podría
> mantener el histórico.
> ¿Entendí tu problema?

Sí, es otra buena solución... !!!

> Vi la respuesta de Carlos, pero ¿si el camión es trasladado más de una
vez?

Correcto, puede darse el caso que este mes se traslade el camión del
Cliente A al Cliente B... dos meses despúes Cliente B se lo pasa a cliente
C... etc!

> Saludos... Liliana.

Saludos y Muchas Gracias! :-)

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


Respuesta Responder a este mensaje
#7 José Trinidad [El Tiko]
31/07/2003 - 16:18 | Informe spam
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)



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!-

y no necesitás modificar el dato con los paréntesis (no me parece una


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
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Respuesta Responder a este mensaje
#8 Liliana Sorrentino
31/07/2003 - 17:06 | Informe spam
José:

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!-



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.
Respuesta Responder a este mensaje
#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:
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)



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!-

y no necesitás modificar el dato con los paréntesis (no me parece una


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!!!
Respuesta Responder a este mensaje
#10 Leonardo Azpurua
01/08/2003 - 02:37 | Informe spam
"José Trinidad [El Tiko]" escribió en el
mensaje news:#

Ups... es un enredillo... je je!




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]
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida