Obtener un Numero Secuencial

18/03/2005 - 14:59 por Alioscha Debali | Informe spam
Tengo el siquiente problema y no me doy cuenta como solucionarlo.

tengo una tabla en la cual inserto registros, de los cuales uno es un campo
indent (nId_SuAnti bigint) y tengo otro campo que es nNumero (int).
la idea es que el campo nNumero sea secuancial y consecutivo pero que se
asigne en el momento de dar de los registros (mediante un triger insert)
no uso el indent porque cuando hago acutlizacion borro y vuelvo a agregar el
mismo registro (por haberse modificado) pero el campo nNumero debe quedar
igual.
FormÉ un funcion donde me devuele el valor maximo de nNumero y lo actuliza
sumando 1, esto esta bien si inserto un registro pero cuando insert varios
registros en una transaccion me asgine el mismo numero en todos. Me parece
rezonable porque la tabla todavia no esta actualizada.

Me imagino que esto es algo que se usa muy amenudo (emision de facturas,
recibos, etc).

Espero haber sido claro

cualquier ayuda sera bien

Preguntas similare

Leer las respuestas

#16 Alioscha Debali
19/03/2005 - 23:17 | Informe spam
Ok, Miguel pero la idea es no tocar el sp, sino manejarlo como triger.
Cuando inserto una sola fila esta todo bien obtengo el numero de una tabla
de numeraciones (como tu comentas) pero cuando inserta varios registros y
quiero insertar en una misma transaccion un numero diferente para cada uno
me encuentro que el triger me devuelve el mismo numero para todos, estaba
con la idea de implementar un cursor y recorrer los registros nuevos (sin
numeracion y pedir uno para cada uno), pero los libros que he leido dicen
que hay que dejar el uso de cursores como ultima insatacia ya que los
cursores no son el fuerte de SQL.
En cuanto al XML no veo la relacion. su podes comentar tu dia te lo
agradeceria.

saludos.



"Miguel Egea" escribió en el mensaje
news:
Yo las numeraciones las implemento muchas veces con una tabla de control.
En la tabla puedes poner el nombre de la tabla (pedidos por ejemplo) y el
contador.
Mis inserciones siempre comienzan con algo así
begin tran
update tablacontrol set @variable=contador=contador+1 where
tabla='pedidos'
después uso @variable para insertar 1 pedido
así me aseguro que he establecido zona crítica.
En un trigger podria solucionarse tu problema si usas XMLs si no ves como
comentanos y te lo escribimos.

Saludos
Miguel egea

"Alioscha Debali" escribió en el mensaje
news:
> Gracias por vuestros comentarios, y los voy a tener en cuenta para el
> futuro. Pero Volviedo al problema que dio origen al post. todavia no
> encuentro solucion.
> Implematando dataset solucionaría el problema de actualizar la


numeracion
> desde el servidor ??
>
>
>
>
>
>
> "Miguel Egea" escribió en el mensaje
> news:
>> Hola, si no te molesta te voy a dar mi opinión. (en línea)
>> "Alioscha Debali" escribió en el mensaje
>> news:OwI2uc$
>> > te agredesco el comentario, siempre de estas discuciones surgen ideas
>> > positvas.
>> >
>> > Tomemos como ejemplo un remito con 300 items cargados para el


analisis.
>>
>> > El propósito de esto no es pensar en forma dbase. sino es tener un id
> del
>> > registro para toder invocarlo en forma directa, Si por algun motivo
> tengo
>> > que modificar un fila de un remito (por ej) donde hay 300 items
> cargados,
>> > accedo en forma directa al registro mediante un update set wher
>> > nid_nro
>> > = @numero_burscado. Pero tengo en claro en SQL no es Dbase. Si hay
> alguna
>> > manera mas al estilo SQL de acceder a una fila deteminada de una


tabla
>> > será
>> > bien benida. \
>>
>> ¡Claro! por su clave primaria, sea esta la que sea. Estamos en un


sistema
>> SQL que está basado en la teoría de conjuntos, aquí no hay primero ni
> último
>> si no es bajo un orden que hayamos decidido, el orden en que se
>> 'grabaron'
>> no existe, y además no tiene sentido.
>>
>> > Otro proposito de esto es tener una idea de la secuencia de
> actualizacion
>> > para fines de auditoria. De esta forma tengo alguna idea del orden en
> que
>> > se
>> > ingresaron los datos.
>>
>> Si quieres esto tienes que añadirle la fecha, no podrás de otra forma.
>>
>> >> Pudieras decirnos cuales son las razones para no hacer updates?
>> >
>> >
>> > Siguiendo con el caso del remito. EL usuario confirma el remito y


luego
>> > quiere agregar un item mas o modificar uno existe o borrar otro.
>> > tendria que hacer un seguimento de lo ocurrido y actualizar lo que
> cambia.
>> > De esta forma elimino todos los items y vuelvo a generar los nuevos .
>>
>> Añadete un campo de tipo timestamp, estos campos cambian cuando se hace
>> un
>> update, recorre la lista y haz solo la operación que necesites.
>>
>> Por otra parte en tu código estás pasando XML a Sql para que un
>> procedimiento genérico en SQL interprete tus sqls, no me parece buena
>> idea
>> en absoluto. Usa Datasets en la parte cliente y manda las sentencias
>> necesarias. El método update del SQLDataAdapter hace esto por tí y de
> forma
>> bastante eficaz.
>>
>> Los datasets, tienen control de los cambios que has hecho en las


tablas,
>> saben cuales registros son nuevos, actualizados o borrados y no hacen
>> operaciones inútiles en la BBDD, esto te garantizará no solo un diseño
> mucho
>> más elegante (al fin y al cabo la elegancia y la belleza son cosas
>> subjetivas si no mi mujer jamás se habría casado conmigo), sino el
>> rendimiento y la escalabilidad, y eso no es subjetivo sino objetivo y
>> medible.
>>
>> Si no llevas mucho hecho yo creo que deberías replantearte toda la
>> estrategia, creo que si al final accedes a grandes volumenes de datos


no
>> tendrás mas que problemas tal y como nos lo describes.
>>
>> No dudes en apoyarte en nosotros, en este grupo si crees que podemos
>> aportarte algo de ayuda.
>>
>>
>>
>> -
>> Miguel Egea Gómez
>> Microsoft SQL-Server MVP, MCSD, MCAD,MCT
>> Webmaster de PortalSql.Com
>> ¿Te interesa participar en las reuniones
>> del grupo de Usuarios de SQL-Server y .NET
>> Se harán en levante de España, (Alicante o Murcia)?
>>
>>
>>
>>
>> >
>> >> Por que no hacer uso de la integridad referencial por medio de
>> >> declaracion
>> > y
>> >> no de codigo?
>> > Podrías explayar la idea ?
>> >
>> > Aguardo tus comentarios
>> >
>> >
>> > saludos
>> >
>> >
>> >
>> >
>> > "Alejandro Mesa" escribió


en
> el
>> > mensaje news:
>> >> Alioscha Debali,
>> >>
>> >> Esto es solo un comentario, mi intencion no es criticar.
>> >>
>> >> > reservo como para tener un id de cada registro el viejo estilo
>> >> > dbase.
>> >>
>> >> Si no te dehaces de este principio, entonces nunca haras buen uso de
> las
>> >> bases de datos relacionales. No trates las tablas como si fuesen
> archivos
>> >> secuenciales.
>> >>
>> >> > ya sea uno o varios registros y el sp hace todo. Para facilitar el
> tema
>> > arme
>> >> > un framework en el cliente y cuando decido acutalizar los datos
>> >> > desde
>> >> > el
>> >> > cliente primero ejeuta un delete y luego un insert no hayo update


a
> no
>> > ser
>> >> > que los pide en forma expresa que es muy ocacional.
>> >>
>> >> Al parecer la facilidad no es tan obvia.
>> >>
>> >>
>> >> Pudieras decirnos cuales son las razones para no hacer updates?
>> >>
>> >> Por que no hacer uso de la integridad referencial por medio de
>> >> declaracion
>> > y
>> >> no de codigo?
>> >>
>> >>
>> >> AMB
>> >>
>> >> "Alioscha Debali" wrote:
>> >>
>> >> > El tema es asi.
>> >> >
>> >> > Tengo armado un sp para cada accion en el servidor por cada
>> >> > table
>> >> > (insert, update, delete) donde el cliente le manda como parametro


un
>> > @xml
>> >> > con le contenido de la ltabla hace los siguiente
>> >> >
>> >> > CREATE PROCEDURE [dbo].[Csts_Insert]
>> >> > @XML TEXT
>> >> > AS
>> >> > Set NoCount On
>> >> > Declare @iDoc int
>> >> > Declare @path varchar(50)
>> >> > SET @path = 'VFPData/row'
>> >> > SET TEXTSIZE 2147483647 /**Seteo del OLE DB Provider para SQL **/
>> >> > EXEC sp_xml_preparedocument @iDoc OUTPUT, @xml , '<Root
>> >> > xmlns:updg="urn:schemas-microsoft-com:xml-updategram"></Root>'
>> >> > INSERT INTO [dbo].[Csts](ccodcsts,cnomcsts,les_plta,les_camara)
>> >> > SELECT * FROM OPENXML(@iDOc, @PATH,1)
>> >> > WITH (
>> >> > ccodcsts char (4),
>> >> > cnomcsts char (30),
>> >> > les_plta tinyint,
>> >> > les_camara tinyint
>> >> > )
>> >> > EXEC sp_xml_removedocument @iDoc
>> >> > IF (@@ERROR<>0 OR @@ROWCOUNT=0) RETURN -1
>> >> > ELSE RETURN 0
>> >> >
>> >> >
>> >> > como verán el procedimiento hace la actaulizacion solito, como
>> > imaginarán
>> >> > los sp los genero en forma automatica dando como parametro el


nombre
> de
>> > la
>> >> > tabla y me hace este sp y los otros. Un detalle es que los campo


de
>> >> > tipo
>> >> > auto icrementales no se incluyen dentro de los datos a actualizar,
> porq
>> > los
>> >> > reservo como para tener un id de cada registro el viejo estilo
>> >> > dbase.
>> > Desde
>> >> > la aplicacion cliente le mando un parametro @XML con los datos a
>> > actualizar
>> >> > ya sea uno o varios registros y el sp hace todo. Para facilitar el
> tema
>> > arme
>> >> > un framework en el cliente y cuando decido acutalizar los datos
>> >> > desde
>> >> > el
>> >> > cliente primero ejeuta un delete y luego un insert no hayo update


a
> no
>> > ser
>> >> > que los pide en forma expresa que es muy ocacional. Si la


operacion
>> >> > involucra varias tablas, inicio una transaccion y luego voy
> executando
>> > cada
>> >> > sp (caso factura - items). En general si quiero modificar algun
>> >> > dato
> o
>> >> > compratamiento del sp lo hago desde los trigers de cada tabla.
>> >> > Pos eso quiero asignar un numero desde un triger y no meterme en


el
> sp.
>> >> >
>> >> > la solcusion que tuve que implemntar es desde el cliente asignar


el
>> > numero
>> >> > pero esto puede generar serios problemas ya que puede generar el
> mismo
>> >> > numero para diferentes conexiones.
>> >> >
>> >> > Espero haber sido claro con el modelo que tengo aplicado.
>> >> >
>> >> > saludos
>> >> >
>> >> >
>> >> >
>> >> > "Alejandro Mesa"


escribió
> en
>> > el
>> >> > mensaje news:
>> >> > > No se si leistes mi mensaje previo. Una pregunta, por que borras
> para
>> >> > despues
>> >> > > insertear nuevamente?, por que no nos cuentas un poquito de lo
> tratas
>> > de
>> >> > > hacer.
>> >> > >
>> >> > >
>> >> > > AMB
>> >> > >
>> >> > > "Alioscha Debali" wrote:
>> >> > >
>> >> > > > Sí, es lo que interpreto del mensaje de error. Alguna idea


para
>> >> > > > hace
>> >> > esto
>> >> > > > sin SP por que generar un extended me parece miy complicado


como
>> >> > solución .
>> >> > > >
>> >> > > > saludos
>> >> > > >
>> >> > > >
>> >> > > > "Alejandro Mesa"
> escribió
>> > en
>> >> > el
>> >> > > > mensaje
> news:
>> >> > > > > Alioscha Debali,
>> >> > > > >
>> >> > > > > No puedes llamar un procedimiento almacenado desde una


funcion
> de
>> >> > usuario,
>> >> > > > > al menos que este sea extendido. Para mas informacion lee
> "CREATE
>> >> > > > FUNCTION"
>> >> > > > > en los libros en linea.
>> >> > > > >
>> >> > > > >
>> >> > > > > AMB
>> >> > > > >
>> >> > > > >
>> >> > > > > "Alioscha Debali" wrote:
>> >> > > > >
>> >> > > > > > armé esta funcion
>> >> > > > > >
>> >> > > > > > CREATE FUNCTION [Dbo].[Fn_CbteNro_GetNro] (@cCodCbte
>> > varchar(30) )
>> >> > > > > > RETURNS BigInt
>> >> > > > > > AS
>> >> > > > > > BEGIN
>> >> > > > > >
>> >> > > > > > DECLARE @nNumero as BIGINT
>> >> > > > > > EXECUTE @nNumero ÛO.CbteNro_GetNro 'ANTICIPO'
>> >> > > > > > RETURN(@nNumero)
>> >> > > > > >
>> >> > > > > > END
>> >> > > > > >
>> >> > > > > >
>> >> > > > > > e hice esto en el triger
>> >> > > > > >
>> >> > > > > > UPDATE dbo.SuAntiItem set nNumero > >> >> > dbo.Fn_CbteNro_GetNro('ANTICIPO')
>> >> > > > where
>> >> > > > > > nNumero = 0
>> >> > > > > >
>> >> > > > > >
>> >> > > > > > PERO ME DA ESTE ERROR
>> >> > > > > >
>> >> > > > > > [CD] Error en Servidor:557
>> >> > > > > > [CD] Only functions and extended stored procedures can be
>> > executed
>> >> > from
>> >> > > > > > within a function.
>> >> > > > > > [CD] [Ejecuta] Transaccion descartada
>> >> > > > > >
>> >> > > > > >
>> >> > > > > > CAMINO SIN SALIDA ???
>> >> > > > > >
>> >> > > > > >
>> >> > > > > >
>> >> > > > > > "Alioscha Debali" escribió en el
>> > mensaje
>> >> > > > > > news:
>> >> > > > > > > maxi, el articulo es muy interesante y yo encare el
> problema
>> > de la
>> >> > > > mism
>> >> > > > > > > manera, pero mi intensión es que el numero se asigne
> mediante
>> > un
>> >> > > > > > > desencadenante.
>> >> > > > > > > no queriero tocar los sp sino definir desde la tabla que
>> >> > > > > > > si
>> >> > > > > > > el
>> >> > campo
>> >> > > > > > nnumero
>> >> > > > > > > esta en cero el sistema le asigne uno secuencial, Hice
>> > exacamente
>> >> > el
>> >> > > > mismo
>> >> > > > > > > SP que desribis en el artículo. pero no sé como hacer


para
>> >> > > > > > > que
>> > el
>> >> > Sp
>> >> > > > el
>> >> > > > > > pase
>> >> > > > > > > el numero nuevo a la tabla que estoy acutalizando
>> >> > > > > > >
>> >> > > > > > >
>> >> > > > > > >
>> >> > > > > > > /* sp donde obtengo el numero de una tabla con las
>> > numeraciones de
>> >> > los
>> >> > > > > > cbtes
>> >> > > > > > > pasando como parametro el cbte obtengo el nuevo numero


del
>> > mismo
>> >> > > > > > > CREATE PROCEDURE [dbo].[CbteNro_GetNro]
>> >> > > > > > > @cCodCbteNro varchar(20),
>> >> > > > > > > @nNumero int =0 output
>> >> > > > > > > AS
>> >> > > > > > > SET NOCOUNT ON
>> >> > > > > > > BEGIN TRAN
>> >> > > > > > > UPDATE dbo.CbteNro SET
>> >> > > > > > > nNumero = nNumero + 1, @nNumero =nNumero + 1
>> >> > > > > > > WHERE cCodCbteNro LIKE @cCodCbteNro
>> > @cCodCbteNro
>> >> > > > > > > COMMIT
>> >> > > > > > >
>> >> > > > > > > RETURN @nNumero
>> >> > > > > > >
>> >> > > > > > >
>> >> > > > > > > saludos
>> >> > > > > > >
>> >> > > > > > >
>> >> > > > > > > "Maxi" escribió en el
> mensaje
>> >> > > > > > > news:ugE%
>> >> > > > > > > > Hola, hace un tiempo escribi un articulo sobre este
>> >> > > > > > > > tema,
>> >> > > > > > > > te
>> >> > paso el
>> >> > > > > > link
>> >> > > > > > > >
>> >> > > > > > > >
>> >> > > > > >
>> >> > > >
>> >> >
>> >
>


http://www.microsoft.com/spanish/ms...art187.asp
>> >> > > > > > > >
>> >> > > > > > > >
>> >> > > > > > > > Salu2
>> >> > > > > > > > Maxi
>> >> > > > > > > >
>> >> > > > > > > >
>> >> > > > > > > > "Alioscha Debali" escribió en
>> >> > > > > > > > el
>> >> > mensaje
>> >> > > > > > > > news:%
>> >> > > > > > > > > Tengo el siquiente problema y no me doy cuenta como
>> >> > solucionarlo.
>> >> > > > > > > > >
>> >> > > > > > > > > tengo una tabla en la cual inserto registros, de los
>> > cuales
>> >> > uno es
>> >> > > > un
>> >> > > > > > > > > campo
>> >> > > > > > > > > indent (nId_SuAnti bigint) y tengo otro campo que es
>> > nNumero
>> >> > > > (int).
>> >> > > > > > > > > la idea es que el campo nNumero sea secuancial y
>> > consecutivo
>> >> > pero
>> >> > > > que
>> >> > > > > > se
>> >> > > > > > > > > asigne en el momento de dar de los registros


(mediante
> un
>> >> > triger
>> >> > > > > > insert)
>> >> > > > > > > > > no uso el indent porque cuando hago acutlizacion


borro
> y
>> >> > vuelvo a
>> >> > > > > > > agregar
>> >> > > > > > > > > el
>> >> > > > > > > > > mismo registro (por haberse modificado) pero el


campo
>> > nNumero
>> >> > debe
>> >> > > > > > > quedar
>> >> > > > > > > > > igual.
>> >> > > > > > > > > FormÉ un funcion donde me devuele el valor maximo de
>> > nNumero y
>> >> > lo
>> >> > > > > > > actuliza
>> >> > > > > > > > > sumando 1, esto esta bien si inserto un registro


pero
>> > cuando
>> >> > > > insert
>> >> > > > > > > varios
>> >> > > > > > > > > registros en una transaccion me asgine el mismo


numero
> en
>> >> > todos.
>> >> > > > Me
>> >> > > > > > > parece
>> >> > > > > > > > > rezonable porque la tabla todavia no esta


actualizada.
>> >> > > > > > > > >
>> >> > > > > > > > > Me imagino que esto es algo que se usa muy amenudo
>> > (emision de
>> >> > > > > > facturas,
>> >> > > > > > > > > recibos, etc).
>> >> > > > > > > > >
>> >> > > > > > > > > Espero haber sido claro
>> >> > > > > > > > >
>> >> > > > > > > > > cualquier ayuda sera bien
>> >> > > > > > > > >
>> >> > > > > > > > >
>> >> > > > > > > >
>> >> > > > > > > >
>> >> > > > > > >
>> >> > > > > > >
>> >> > > > > >
>> >> > > > > >
>> >> > > > > >
>> >> > > >
>> >> > > >
>> >> > > >
>> >> >
>> >> >
>> >> >
>> >
>> >
>> >
>>
>>
>>
>
>
>



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