Indices - Contadores

08/09/2003 - 10:16 por Daniel Álvarez | Informe spam
Hola,

Hasta ahora en mis tablas habia definido siempre un campo como clave
principal para que me hiciera un autonumerico simple. Ahora se me plantea
que tengo dos campos el Campo CodigoPrincial Y CodigoSecundario, el
CodigoPrincial puede repetirse y el CodigoSecundario deberia de ser un
autonumerico pero que depende del CodigoPrincipal para volver a incializarse
a 1

Lo entendereís con este ejemplo:

CodigoPrincipal CodigoSecundario
-
1 1
1 2
1 3
2 1 (Al cambiar el codigo principal el
codigosecundario vuelve a inicializarse)
2 2
3 1

Y asi sucesivamente.

Bueno el caso es que no se como hacer esto para que la tabla se comporte
así automaticamente. ¿se puede hacer?. supongo que sí pero no doy con la
manera por que nunca consigo que el autonumerico se ponga a valor 1 segun
el valor del otro campo, sino que va sumando y sumando.

Gracias por vuestra atención.



Daniel Álvarez

Por favor, deja todos tus mensajes en
el foro, no uses el correo electrónico.

Si quieres contactar, no olvides quitar NOSPAM

Preguntas similare

Leer las respuestas

#1 Mariano Alvarez
08/09/2003 - 17:41 | Informe spam
No conozco otra manera de resolverlo mas que con triggers y esto te obliga a
que tengas definidos los campos como que aceptan valores nulos en ambas
columnas. Sin embargo eso te impediria definir una clave primaria sobre esos
campos.

Yo te sugeriria que veas si puedes utilizar procedimientos almacenados o en
su defecto funciones. Debes cuidar que no se te produzcan condiciones de
carrera bloqueando la tabla si primero haces un SELECT para determinar el
numero siguiente antes de hacer el INSERT..

Jose Mariano Alvarez
Comunidad de base de datos
Grupo de Usuarios Microsoft
www.mug.org.ar



"Daniel Álvarez" wrote in message
news:
Hola,

Hasta ahora en mis tablas habia definido siempre un campo como clave
principal para que me hiciera un autonumerico simple. Ahora se me plantea
que tengo dos campos el Campo CodigoPrincial Y CodigoSecundario, el
CodigoPrincial puede repetirse y el CodigoSecundario deberia de ser un
autonumerico pero que depende del CodigoPrincipal para volver a


incializarse
a 1

Lo entendereís con este ejemplo:

CodigoPrincipal CodigoSecundario
-
1 1
1 2
1 3
2 1 (Al cambiar el codigo principal el
codigosecundario vuelve a inicializarse)
2 2
3 1

Y asi sucesivamente.

Bueno el caso es que no se como hacer esto para que la tabla se


comporte
así automaticamente. ¿se puede hacer?. supongo que sí pero no doy con la
manera por que nunca consigo que el autonumerico se ponga a valor 1 segun
el valor del otro campo, sino que va sumando y sumando.

Gracias por vuestra atención.



Daniel Álvarez

Por favor, deja todos tus mensajes en
el foro, no uses el correo electrónico.

Si quieres contactar, no olvides quitar NOSPAM




Respuesta Responder a este mensaje
#2 Anibal Marcano
08/09/2003 - 18:03 | Informe spam
Realmente si se puede solucionar con Triggers, solo que en lugar de los
triggers normales se debe utilizar un trigger Instead Of a fin de que se
ejecute "Antes" de la operación de Inserción. lo que se debe hacer es
verificar si el número que se inserta existe ya o no (con If Exists ) Si
existe se hace un segundo Select con la función MAX para generar el
siguiente numero. Si el registro a insertar en el principal es nuevo
entonces en el secundario se coloca 1.

Saludos,

Anibal Marcano
Visualven Sistemas C.A.

"Mariano Alvarez" escribió en el mensaje
news:
No conozco otra manera de resolverlo mas que con triggers y esto te obliga


a
que tengas definidos los campos como que aceptan valores nulos en ambas
columnas. Sin embargo eso te impediria definir una clave primaria sobre


esos
campos.

Yo te sugeriria que veas si puedes utilizar procedimientos almacenados o


en
su defecto funciones. Debes cuidar que no se te produzcan condiciones de
carrera bloqueando la tabla si primero haces un SELECT para determinar el
numero siguiente antes de hacer el INSERT..

Jose Mariano Alvarez
Comunidad de base de datos
Grupo de Usuarios Microsoft
www.mug.org.ar



"Daniel Álvarez" wrote in message
news:
> Hola,
>
> Hasta ahora en mis tablas habia definido siempre un campo como clave
> principal para que me hiciera un autonumerico simple. Ahora se me


plantea
> que tengo dos campos el Campo CodigoPrincial Y CodigoSecundario, el
> CodigoPrincial puede repetirse y el CodigoSecundario deberia de ser un
> autonumerico pero que depende del CodigoPrincipal para volver a
incializarse
> a 1
>
> Lo entendereís con este ejemplo:
>
> CodigoPrincipal CodigoSecundario
> -
> 1 1
> 1 2
> 1 3
> 2 1 (Al cambiar el codigo principal


el
> codigosecundario vuelve a inicializarse)
> 2 2
> 3 1
>
> Y asi sucesivamente.
>
> Bueno el caso es que no se como hacer esto para que la tabla se
comporte
> así automaticamente. ¿se puede hacer?. supongo que sí pero no doy con la
> manera por que nunca consigo que el autonumerico se ponga a valor 1


segun
> el valor del otro campo, sino que va sumando y sumando.
>
> Gracias por vuestra atención.
>
>
>
> Daniel Álvarez
>
> Por favor, deja todos tus mensajes en
> el foro, no uses el correo electrónico.
>
> Si quieres contactar, no olvides quitar NOSPAM
>
>
>
>


Respuesta Responder a este mensaje
#3 Javier Loria
09/09/2003 - 05:38 | Informe spam
Hola:
No son muy amigo de las llaves no naturales, pero una alternativa si
usas SQL 2000, seria usar una funcion escalar:
/* Inicio de Codigo de Funcion */
CREATE FUNCTION SiguienteCodigoSecundario(@CodigoPrincipal int)
RETURNS INT
AS
BEGIN
RETURN (SELECT COALESCE(MAX(CodigoSecundario),1)
FROM Tabla
WHERE CodigoPrincipal=@CodigoPrincipal)
END
/* Fin de Codigo de Funcion */
Y luego cuando haces los INSERTS usas:
/* Uso de Funcion */
INSERT Tabla
VALUES (4,
dbo.SiguienteCodigoSecundario(4),

)
/* Fin de uso de Funcion */

Espero te sirva,



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.
Anibal Marcano escribio:
Realmente si se puede solucionar con Triggers, solo que en lugar de
los triggers normales se debe utilizar un trigger Instead Of a fin de
que se ejecute "Antes" de la operación de Inserción. lo que se debe
hacer es verificar si el número que se inserta existe ya o no (con If
Exists ) Si existe se hace un segundo Select con la función MAX para
generar el siguiente numero. Si el registro a insertar en el
principal es nuevo entonces en el secundario se coloca 1.

Saludos,

Anibal Marcano
Visualven Sistemas C.A.

"Mariano Alvarez" escribió en el mensaje
news:
No conozco otra manera de resolverlo mas que con triggers y esto te
obliga a que tengas definidos los campos como que aceptan valores
nulos en ambas columnas. Sin embargo eso te impediria definir una
clave primaria sobre esos campos.

Yo te sugeriria que veas si puedes utilizar procedimientos
almacenados o en su defecto funciones. Debes cuidar que no se te
produzcan condiciones de carrera bloqueando la tabla si primero
haces un SELECT para determinar el numero siguiente antes de hacer
el INSERT..

Jose Mariano Alvarez
Comunidad de base de datos
Grupo de Usuarios Microsoft
www.mug.org.ar



"Daniel Álvarez" wrote in message
news:
Hola,

Hasta ahora en mis tablas habia definido siempre un campo como
clave principal para que me hiciera un autonumerico simple. Ahora
se me plantea que tengo dos campos el Campo CodigoPrincial Y
CodigoSecundario, el CodigoPrincial puede repetirse y el
CodigoSecundario deberia de ser un autonumerico pero que depende
del CodigoPrincipal para volver a incializarse a 1

Lo entendereís con este ejemplo:

CodigoPrincipal CodigoSecundario
-
1 1
1 2
1 3
2 1 (Al cambiar el codigo
principal el codigosecundario vuelve a inicializarse)
2 2
3 1

Y asi sucesivamente.

Bueno el caso es que no se como hacer esto para que la tabla se
comporte así automaticamente. ¿se puede hacer?. supongo que sí pero
no doy con la manera por que nunca consigo que el autonumerico se
ponga a valor 1 segun el valor del otro campo, sino que va sumando
y sumando.

Gracias por vuestra atención.



Daniel Álvarez

Por favor, deja todos tus mensajes en
el foro, no uses el correo electrónico.

Si quieres contactar, no olvides quitar NOSPAM
Respuesta Responder a este mensaje
#4 Daniel Álvarez
10/09/2003 - 08:01 | Informe spam
Gracias a todos chicos.

Daniel Álvarez

Por favor, deja todos tus mensajes en
el foro, no uses el correo electrónico.

Si quieres contactar, no olvides quitar NOSPAM



"Javier Loria" escribió en el mensaje
news:
Hola:
No son muy amigo de las llaves no naturales, pero una alternativa si
usas SQL 2000, seria usar una funcion escalar:
/* Inicio de Codigo de Funcion */
CREATE FUNCTION SiguienteCodigoSecundario(@CodigoPrincipal int)
RETURNS INT
AS
BEGIN
RETURN (SELECT COALESCE(MAX(CodigoSecundario),1)
FROM Tabla
WHERE CodigoPrincipal=@CodigoPrincipal)
END
/* Fin de Codigo de Funcion */
Y luego cuando haces los INSERTS usas:
/* Uso de Funcion */
INSERT Tabla
VALUES (4,
dbo.SiguienteCodigoSecundario(4),

)
/* Fin de uso de Funcion */

Espero te sirva,



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.
Anibal Marcano escribio:
> Realmente si se puede solucionar con Triggers, solo que en lugar de
> los triggers normales se debe utilizar un trigger Instead Of a fin de
> que se ejecute "Antes" de la operación de Inserción. lo que se debe
> hacer es verificar si el número que se inserta existe ya o no (con If
> Exists ) Si existe se hace un segundo Select con la función MAX para
> generar el siguiente numero. Si el registro a insertar en el
> principal es nuevo entonces en el secundario se coloca 1.
>
> Saludos,
>
> Anibal Marcano
> Visualven Sistemas C.A.
>
> "Mariano Alvarez" escribió en el mensaje
> news:
>> No conozco otra manera de resolverlo mas que con triggers y esto te
>> obliga a que tengas definidos los campos como que aceptan valores
>> nulos en ambas columnas. Sin embargo eso te impediria definir una
>> clave primaria sobre esos campos.
>>
>> Yo te sugeriria que veas si puedes utilizar procedimientos
>> almacenados o en su defecto funciones. Debes cuidar que no se te
>> produzcan condiciones de carrera bloqueando la tabla si primero
>> haces un SELECT para determinar el numero siguiente antes de hacer
>> el INSERT..
>>
>> Jose Mariano Alvarez
>> Comunidad de base de datos
>> Grupo de Usuarios Microsoft
>> www.mug.org.ar
>>
>>
>>
>> "Daniel Álvarez" wrote in message
>> news:
>>> Hola,
>>>
>>> Hasta ahora en mis tablas habia definido siempre un campo como
>>> clave principal para que me hiciera un autonumerico simple. Ahora
>>> se me plantea que tengo dos campos el Campo CodigoPrincial Y
>>> CodigoSecundario, el CodigoPrincial puede repetirse y el
>>> CodigoSecundario deberia de ser un autonumerico pero que depende
>>> del CodigoPrincipal para volver a incializarse a 1
>>>
>>> Lo entendereís con este ejemplo:
>>>
>>> CodigoPrincipal CodigoSecundario
>>> -
>>> 1 1
>>> 1 2
>>> 1 3
>>> 2 1 (Al cambiar el codigo
>>> principal el codigosecundario vuelve a inicializarse)
>>> 2 2
>>> 3 1
>>>
>>> Y asi sucesivamente.
>>>
>>> Bueno el caso es que no se como hacer esto para que la tabla se
>>> comporte así automaticamente. ¿se puede hacer?. supongo que sí pero
>>> no doy con la manera por que nunca consigo que el autonumerico se
>>> ponga a valor 1 segun el valor del otro campo, sino que va sumando
>>> y sumando.
>>>
>>> Gracias por vuestra atención.
>>>
>>>
>>>
>>> Daniel Álvarez
>>>
>>> Por favor, deja todos tus mensajes en
>>> el foro, no uses el correo electrónico.
>>>
>>> Si quieres contactar, no olvides quitar NOSPAM


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida