SQL Consecutivos !!!

18/08/2003 - 17:01 por Edmundo J. Davila | Informe spam
Hola amigos,

Necesito su valiosa colaboracion en el siguiente problema. Debo hacer una
vista o una consulta SQL (SELECT) que
me extraiga el numero de documento de un campo varchar de SQL 2000 de la
forma XX-999999, tres caracteres y seis
numeros y que me ponga una marca cuando se pierda el consecutivo, por
ejemplo:

P10-00001
P10-00002
P10-00003
**P10-00005
P10-00006
P10-00007
**P10-00009
**P10-00011
P10-00012
P10-00013

De antemano agradezco cualquier ayuda que puedan darme.

Atentamente,

Edmundo J. Davila

Preguntas similare

Leer las respuestas

#6 Miguel Egea
19/08/2003 - 18:44 | Informe spam
Entoces en cualquier caso son al menos los últimos cuatro ¿verdad?


=SALVA A SQL,
MATA UN CURSOR

Miguel Egea
http://www.portalsql.com
Microsoft SQL-SERVER MVP.
Brigada Anti-Cursores
==
"Edmundo J. Davila" escribió en el mensaje
news:
Ya los revice y generalmente las letras van al inicio, los ultimos digitos
siempre son numeros, pero no necesariamente los ultimos cuatro, puede ser


en
algunos casos los ultimos 4, los ultimos 5, 6, hasta 7 segun lo que estuve
viendo en la BD.

Saludos,

Edmundo

"Miguel Egea" escribió en el mensaje
news:#
> ¿Los últimos cuatro son siempre números?, por que si es así, puedes
adaptar
> la solución que te propone javier.
>
>
> => > SALVA A SQL,
> MATA UN CURSOR
>
> Miguel Egea
> http://www.portalsql.com
> Microsoft SQL-SERVER MVP.
> Brigada Anti-Cursores
> ==> >
> "Edmundo J. Davila" escribió en el mensaje
> news:%
> > Miguel,
> >
> > Lo que sucede es que se usan talonarios de facturas o series por
vendedor,
> > por ejemplo, puede haber un vendedor que usa el
> >
> > AB00025
> > AB00026
> > AB00027
> > AB00028
> >
> > como puedes ver aqui no hay guiones, puede haber otro que use 01A0001,
> > 01A0002, 01A000n... este sistema de papeleria y control ya estaba
> > establecido en la empresa, ahora se pretende estandarizar y una de las
> > formas es la que envie anteriormente XX-999999, dos letras con un


guion
y
> > seis numeros. Sin embargo, por el momento desean poder controlar los
> > consecutivos de la documentacion que ya existe. Este es el problema.
> >
> > Si el campo fuera numerico, la solucion seria muy simple, ya que solo
> > bastaria comprobar si el registro n+1 es igual al registro al registro


n
> mas
> > una unidad { (n)+1 }, si esto es falso, entonces en la vista (o algun
> > SELECT) podria indicarle que al campo le agregue algun caracter que
> permita
> > a las personas que revisan, percatarse de que hubo un salto en el
> > consecutivo. Es algo asi como un algoritmo generico para controlar
saltos
> > de consecutivos en campos alfanumericos (yo se que no es nada


sencillo).
> >
> > Agradezco mucho sus comentarios e interes sobre el asunto.
> >
> > Atentamente,
> >
> > Edmundo J. Davila
> >
> >
> > "Miguel Egea" escribió en el mensaje
> > news:
> > > Edmunto, el principal problema de lo que planteas es que no sabemos
cual
> > > sería el siguiente de
> > > 'ABCJ2323A32', si tienes una regla para esto, quizá podamos hacer
algo.
> > >
> > > Saludos
> > > Miguel Egea
> > > "Edmundo J. Davila" escribió en el mensaje
> > > news:
> > > > Javier,
> > > >
> > > > Muchas gracias por tu ayuda. Que pasaria si quisiera hacer el
control
> > del
> > > > consecutivo de un campo varchar cualquier, que no necesariamente
fuera
> > de
> > > la
> > > > forma XX-999999 sino que llevara letras y numeros en cualquier
lugar.
> > > >
> > > > Saludos y muchas gracias por tu ayuda.
> > > >
> > > > Edmundo J. Davila
> > > >
> > > > "Javier Loria(MVP)" escribió en el mensaje
> > > > news:#
> > > > > Hola:
> > > > > No te sirvio el codigo que te envie anteriormente?
> > > > > > > > > > > Hola Edmundo:
> > > > > Es mas facil si pones el codigo de creacion de las Tablas,
pero
> > debe
> > > > ser
> > > > > algo como:
> > > > > /* Codigo de Creacion de Tablas */
> > > > > CREATE TABLE Documentos (
> > > > > NumeroDocumento VARCHAR(9) NOT NULL PRIMARY KEY,
> > > > > CONSTRAINT CK_NumDocumento
> > > > > CHECK (NumeroDocumento LIKE
> > > '[A-Z][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9]')
> > > > > )
> > > > > /* Insert de Ejemplo */
> > > > > INSERT Documentos
> > > > > VALUES('P10-00001')
> > > > > INSERT Documentos
> > > > > VALUES('P10-00002')
> > > > > INSERT Documentos
> > > > > VALUES('P10-00003')
> > > > > INSERT Documentos
> > > > > VALUES('P10-00005')
> > > > > INSERT Documentos
> > > > > VALUES('P10-00006')
> > > > > INSERT Documentos
> > > > > VALUES('P10-00007')
> > > > > INSERT Documentos
> > > > > VALUES('P10-00009')
> > > > > INSERT Documentos
> > > > > VALUES('P10-00011')
> > > > > INSERT Documentos
> > > > > VALUES('P10-00012')
> > > > > INSERT Documentos
> > > > > VALUES('P10-00013')
> > > > >
> > > > > /* Consulta */
> > > > > SELECT CASE
> > > > > WHEN (A.NumDoc<>1) AND
> > > > > (B.NumDoc IS NULL) THEN '**'
> > > > > ELSE ''
> > > > > END+NumeroDocumento as Documento
> > > > > FROM (SELECT CONVERT(INT,RIGHT(NumeroDocumento,5))
> > > > > AS NumDoc,
> > > > > NumeroDocumento
> > > > > FROM DOCUMENTOS ) AS A
> > > > > LEFT JOIN (SELECT CONVERT(INT,RIGHT(NumeroDocumento,5))
> > > > > AS NumDoc,
> > > > > FROM DOCUMENTOS) AS B
> > > > > ON
> > > > > A.NumDoc=B.NumDoc+1
> > > > > /* Fin de Consulta */
> > > > >
> > > > > Espero que te sirva. Una nota adicional es que probablemente
quieres
> > > > cambiar
> > > > > el VARCHAR(9) por un CHAR(9) que es mas eficiente.
> > > > > ==> > > > > >
> > > > >
> > > > > 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.
> > > > >
> > > > > Edmundo J. Davila escribio:
> > > > > > Hola amigos,
> > > > > >
> > > > > > Necesito su valiosa colaboracion en el siguiente problema.


Debo
> > > > > > hacer una vista o una consulta SQL (SELECT) que
> > > > > > me extraiga el numero de documento de un campo varchar de SQL
2000
> > de
> > > > > > la forma XX-999999, tres caracteres y seis
> > > > > > numeros y que me ponga una marca cuando se pierda el
consecutivo,
> > por
> > > > > > ejemplo:
> > > > > >
> > > > > > P10-00001
> > > > > > P10-00002
> > > > > > P10-00003
> > > > > > **P10-00005
> > > > > > P10-00006
> > > > > > P10-00007
> > > > > > **P10-00009
> > > > > > **P10-00011
> > > > > > P10-00012
> > > > > > P10-00013
> > > > > >
> > > > > > De antemano agradezco cualquier ayuda que puedan darme.
> > > > > >
> > > > > > Atentamente,
> > > > > >
> > > > > > Edmundo J. Davila
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>


Respuesta Responder a este mensaje
#7 Javier Loria\(MVP\)
19/08/2003 - 20:02 | Informe spam
Hola Edmundo:
Entonces reemplaza el 5 de los RIGHT por un 4, y deberia servirte el
codigo.
Saludos,


=SALVA A SQL,
MATA UN CURSOR

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.
=
Edmundo J. Davila escribio:
Asi es...

"Miguel Egea" escribió en el mensaje
news:
Entoces en cualquier caso son al menos los últimos cuatro ¿verdad?


=>> SALVA A SQL,
MATA UN CURSOR

Miguel Egea
http://www.portalsql.com
Microsoft SQL-SERVER MVP.
Brigada Anti-Cursores
==>>
"Edmundo J. Davila" escribió en el mensaje
news:
Ya los revice y generalmente las letras van al inicio, los ultimos
digitos siempre son numeros, pero no necesariamente los ultimos
cuatro, puede ser en algunos casos los ultimos 4, los ultimos 5, 6,
hasta 7 segun lo que estuve viendo en la BD.

Saludos,

Edmundo

"Miguel Egea" escribió en el mensaje
news:#
¿Los últimos cuatro son siempre números?, por que si es así,
puedes adaptar la solución que te propone javier.


=>>>> SALVA A SQL,
MATA UN CURSOR

Miguel Egea
http://www.portalsql.com
Microsoft SQL-SERVER MVP.
Brigada Anti-Cursores
==>>>>
"Edmundo J. Davila" escribió en el mensaje
news:%
Miguel,

Lo que sucede es que se usan talonarios de facturas o series por
vendedor, por ejemplo, puede haber un vendedor que usa el

AB00025
AB00026
AB00027
AB00028

como puedes ver aqui no hay guiones, puede haber otro que use
01A0001, 01A0002, 01A000n... este sistema de papeleria y
control ya estaba establecido en la empresa, ahora se pretende
estandarizar y una de las formas es la que envie anteriormente
XX-999999, dos letras con un guion y seis numeros. Sin embargo,
por el momento desean poder controlar los consecutivos de la
documentacion que ya existe. Este es el problema.

Si el campo fuera numerico, la solucion seria muy simple, ya que
solo bastaria comprobar si el registro n+1 es igual al registro al








registro
n
mas
una unidad { (n)+1 }, si esto es falso, entonces en la vista (o
algun SELECT) podria indicarle que al campo le agregue algun
caracter que permita a las personas que revisan, percatarse de
que hubo un salto en el consecutivo. Es algo asi como un
algoritmo generico para controlar saltos de consecutivos en
campos alfanumericos (yo se que no es nada sencillo).

Agradezco mucho sus comentarios e interes sobre el asunto.

Atentamente,

Edmundo J. Davila


"Miguel Egea" escribió en el mensaje
news:
Edmunto, el principal problema de lo que planteas es que no
sabemos cual sería el siguiente de
'ABCJ2323A32', si tienes una regla para esto, quizá podamos
hacer algo.

Saludos
Miguel Egea
"Edmundo J. Davila" escribió en el mensaje
news:
Javier,

Muchas gracias por tu ayuda. Que pasaria si quisiera hacer el
control del consecutivo de un campo varchar cualquier, que no
necesariamente








fuera
de
la
forma XX-999999 sino que llevara letras y numeros en cualquier
lugar.

Saludos y muchas gracias por tu ayuda.

Edmundo J. Davila

"Javier Loria(MVP)" escribió en el mensaje
news:#
Hola:
No te sirvio el codigo que te envie anteriormente?
>>>>>>>> Hola Edmundo:
Es mas facil si pones el codigo de creacion de las Tablas,










pero
debe
ser
algo como:
/* Codigo de Creacion de Tablas */
CREATE TABLE Documentos (
NumeroDocumento VARCHAR(9) NOT NULL PRIMARY KEY,
CONSTRAINT CK_NumDocumento
CHECK (NumeroDocumento LIKE
'[A-Z][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9]') )
/* Insert de Ejemplo */
INSERT Documentos
VALUES('P10-00001')
INSERT Documentos
VALUES('P10-00002')
INSERT Documentos
VALUES('P10-00003')
INSERT Documentos
VALUES('P10-00005')
INSERT Documentos
VALUES('P10-00006')
INSERT Documentos
VALUES('P10-00007')
INSERT Documentos
VALUES('P10-00009')
INSERT Documentos
VALUES('P10-00011')
INSERT Documentos
VALUES('P10-00012')
INSERT Documentos
VALUES('P10-00013')

/* Consulta */
SELECT CASE
WHEN (A.NumDoc<>1) AND
(B.NumDoc IS NULL) THEN '**'
ELSE ''
END+NumeroDocumento as Documento
FROM (SELECT CONVERT(INT,RIGHT(NumeroDocumento,5))
AS NumDoc,
NumeroDocumento
FROM DOCUMENTOS ) AS A
LEFT JOIN (SELECT CONVERT(INT,RIGHT(NumeroDocumento,5))
AS NumDoc,
FROM DOCUMENTOS) AS B
ON
A.NumDoc=B.NumDoc+1
/* Fin de Consulta */

Espero que te sirva. Una nota adicional es que probablemente
quieres cambiar el VARCHAR(9) por un CHAR(9) que es mas
eficiente. ==>>>>>>>>

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.

Edmundo J. Davila escribio:
Hola amigos,

Necesito su valiosa colaboracion en el siguiente problema.
Debo hacer una vista o una consulta SQL (SELECT) que
me extraiga el numero de documento de un campo varchar de
















SQL
2000
de
la forma XX-999999, tres caracteres y seis
numeros y que me ponga una marca cuando se pierda el
consecutivo, por ejemplo:

P10-00001
P10-00002
P10-00003
**P10-00005
P10-00006
P10-00007
**P10-00009
**P10-00011
P10-00012
P10-00013

De antemano agradezco cualquier ayuda que puedan darme.

Atentamente,

Edmundo J. Davila
Respuesta Responder a este mensaje
#8 Edmundo J. Davila
19/08/2003 - 20:16 | Informe spam
Javier,

Ok. Lo probare. Muchas gracias por tu ayuda.


"Javier Loria(MVP)" escribió en el mensaje
news:#
Hola Edmundo:
Entonces reemplaza el 5 de los RIGHT por un 4, y deberia servirte el
codigo.
Saludos,


=> SALVA A SQL,
MATA UN CURSOR

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.
=>
Edmundo J. Davila escribio:
> Asi es...
>
> "Miguel Egea" escribió en el mensaje
> news:
>> Entoces en cualquier caso son al menos los últimos cuatro ¿verdad?
>>
>>
>> => >> SALVA A SQL,
>> MATA UN CURSOR
>>
>> Miguel Egea
>> http://www.portalsql.com
>> Microsoft SQL-SERVER MVP.
>> Brigada Anti-Cursores
>> ==> >>
>> "Edmundo J. Davila" escribió en el mensaje
>> news:
>>> Ya los revice y generalmente las letras van al inicio, los ultimos
>>> digitos siempre son numeros, pero no necesariamente los ultimos
>>> cuatro, puede ser en algunos casos los ultimos 4, los ultimos 5, 6,
>>> hasta 7 segun lo que estuve viendo en la BD.
>>>
>>> Saludos,
>>>
>>> Edmundo
>>>
>>> "Miguel Egea" escribió en el mensaje
>>> news:#
>>>> ¿Los últimos cuatro son siempre números?, por que si es así,
>>>> puedes adaptar la solución que te propone javier.
>>>>
>>>>
>>>> => >>>> SALVA A SQL,
>>>> MATA UN CURSOR
>>>>
>>>> Miguel Egea
>>>> http://www.portalsql.com
>>>> Microsoft SQL-SERVER MVP.
>>>> Brigada Anti-Cursores
>>>> ==> >>>>
>>>> "Edmundo J. Davila" escribió en el mensaje
>>>> news:%
>>>>> Miguel,
>>>>>
>>>>> Lo que sucede es que se usan talonarios de facturas o series por
>>>>> vendedor, por ejemplo, puede haber un vendedor que usa el
>>>>>
>>>>> AB00025
>>>>> AB00026
>>>>> AB00027
>>>>> AB00028
>>>>>
>>>>> como puedes ver aqui no hay guiones, puede haber otro que use
>>>>> 01A0001, 01A0002, 01A000n... este sistema de papeleria y
>>>>> control ya estaba establecido en la empresa, ahora se pretende
>>>>> estandarizar y una de las formas es la que envie anteriormente
>>>>> XX-999999, dos letras con un guion y seis numeros. Sin embargo,
>>>>> por el momento desean poder controlar los consecutivos de la
>>>>> documentacion que ya existe. Este es el problema.
>>>>>
>>>>> Si el campo fuera numerico, la solucion seria muy simple, ya que
>>>>> solo bastaria comprobar si el registro n+1 es igual al registro al
> registro
>> n
>>>> mas
>>>>> una unidad { (n)+1 }, si esto es falso, entonces en la vista (o
>>>>> algun SELECT) podria indicarle que al campo le agregue algun
>>>>> caracter que permita a las personas que revisan, percatarse de
>>>>> que hubo un salto en el consecutivo. Es algo asi como un
>>>>> algoritmo generico para controlar saltos de consecutivos en
>>>>> campos alfanumericos (yo se que no es nada sencillo).
>>>>>
>>>>> Agradezco mucho sus comentarios e interes sobre el asunto.
>>>>>
>>>>> Atentamente,
>>>>>
>>>>> Edmundo J. Davila
>>>>>
>>>>>
>>>>> "Miguel Egea" escribió en el mensaje
>>>>> news:
>>>>>> Edmunto, el principal problema de lo que planteas es que no
>>>>>> sabemos cual sería el siguiente de
>>>>>> 'ABCJ2323A32', si tienes una regla para esto, quizá podamos
>>>>>> hacer algo.
>>>>>>
>>>>>> Saludos
>>>>>> Miguel Egea
>>>>>> "Edmundo J. Davila" escribió en el mensaje
>>>>>> news:
>>>>>>> Javier,
>>>>>>>
>>>>>>> Muchas gracias por tu ayuda. Que pasaria si quisiera hacer el
>>>>>>> control del consecutivo de un campo varchar cualquier, que no
>>>>>>> necesariamente
>>> fuera
>>>>> de
>>>>>> la
>>>>>>> forma XX-999999 sino que llevara letras y numeros en cualquier
>>>>>>> lugar.
>>>>>>>
>>>>>>> Saludos y muchas gracias por tu ayuda.
>>>>>>>
>>>>>>> Edmundo J. Davila
>>>>>>>
>>>>>>> "Javier Loria(MVP)" escribió en el mensaje
>>>>>>> news:#
>>>>>>>> Hola:
>>>>>>>> No te sirvio el codigo que te envie anteriormente?
>>>>>>>> > >>>>>>>> Hola Edmundo:
>>>>>>>> Es mas facil si pones el codigo de creacion de las Tablas,
>>> pero
>>>>> debe
>>>>>>> ser
>>>>>>>> algo como:
>>>>>>>> /* Codigo de Creacion de Tablas */
>>>>>>>> CREATE TABLE Documentos (
>>>>>>>> NumeroDocumento VARCHAR(9) NOT NULL PRIMARY KEY,
>>>>>>>> CONSTRAINT CK_NumDocumento
>>>>>>>> CHECK (NumeroDocumento LIKE
>>>>>>>> '[A-Z][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9]') )
>>>>>>>> /* Insert de Ejemplo */
>>>>>>>> INSERT Documentos
>>>>>>>> VALUES('P10-00001')
>>>>>>>> INSERT Documentos
>>>>>>>> VALUES('P10-00002')
>>>>>>>> INSERT Documentos
>>>>>>>> VALUES('P10-00003')
>>>>>>>> INSERT Documentos
>>>>>>>> VALUES('P10-00005')
>>>>>>>> INSERT Documentos
>>>>>>>> VALUES('P10-00006')
>>>>>>>> INSERT Documentos
>>>>>>>> VALUES('P10-00007')
>>>>>>>> INSERT Documentos
>>>>>>>> VALUES('P10-00009')
>>>>>>>> INSERT Documentos
>>>>>>>> VALUES('P10-00011')
>>>>>>>> INSERT Documentos
>>>>>>>> VALUES('P10-00012')
>>>>>>>> INSERT Documentos
>>>>>>>> VALUES('P10-00013')
>>>>>>>>
>>>>>>>> /* Consulta */
>>>>>>>> SELECT CASE
>>>>>>>> WHEN (A.NumDoc<>1) AND
>>>>>>>> (B.NumDoc IS NULL) THEN '**'
>>>>>>>> ELSE ''
>>>>>>>> END+NumeroDocumento as Documento
>>>>>>>> FROM (SELECT CONVERT(INT,RIGHT(NumeroDocumento,5))
>>>>>>>> AS NumDoc,
>>>>>>>> NumeroDocumento
>>>>>>>> FROM DOCUMENTOS ) AS A
>>>>>>>> LEFT JOIN (SELECT CONVERT(INT,RIGHT(NumeroDocumento,5))
>>>>>>>> AS NumDoc,
>>>>>>>> FROM DOCUMENTOS) AS B
>>>>>>>> ON
>>>>>>>> A.NumDoc=B.NumDoc+1
>>>>>>>> /* Fin de Consulta */
>>>>>>>>
>>>>>>>> Espero que te sirva. Una nota adicional es que probablemente
>>>>>>>> quieres cambiar el VARCHAR(9) por un CHAR(9) que es mas
>>>>>>>> eficiente. ==> >>>>>>>>
>>>>>>>>
>>>>>>>> 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.
>>>>>>>>
>>>>>>>> Edmundo J. Davila escribio:
>>>>>>>>> Hola amigos,
>>>>>>>>>
>>>>>>>>> Necesito su valiosa colaboracion en el siguiente problema.
>>>>>>>>> Debo hacer una vista o una consulta SQL (SELECT) que
>>>>>>>>> me extraiga el numero de documento de un campo varchar de
> SQL
>>> 2000
>>>>> de
>>>>>>>>> la forma XX-999999, tres caracteres y seis
>>>>>>>>> numeros y que me ponga una marca cuando se pierda el
>>>>>>>>> consecutivo, por ejemplo:
>>>>>>>>>
>>>>>>>>> P10-00001
>>>>>>>>> P10-00002
>>>>>>>>> P10-00003
>>>>>>>>> **P10-00005
>>>>>>>>> P10-00006
>>>>>>>>> P10-00007
>>>>>>>>> **P10-00009
>>>>>>>>> **P10-00011
>>>>>>>>> P10-00012
>>>>>>>>> P10-00013
>>>>>>>>>
>>>>>>>>> De antemano agradezco cualquier ayuda que puedan darme.
>>>>>>>>>
>>>>>>>>> Atentamente,
>>>>>>>>>
>>>>>>>>> Edmundo J. Davila


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