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

#11 Alioscha Debali
18/03/2005 - 21:15 | Informe spam
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. \

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.

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 .


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
> > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > > >
> > >
> > >
> > >
>
>
>
Respuesta Responder a este mensaje
#12 Alejandro Mesa
18/03/2005 - 22:29 | Informe spam
Alioscha Debali,

Tomemos como ejemplo un remito con 300 items cargados para el analisis.



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



Me hablas de auditoria y secuencia de actualizacion, pero por otra parte me
dices:

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 .



Acaso la auditoria no contempla borrar e insertar filas. Otra cosa,
suponinedo que el usuario quiere un nuevo Item, te inmaginas borrar 300 para
insertar 301. No te parece que estas haciendo trabajar a la maquina de sql
server demasiado. Si lo ves desde el punto de vista de un solo usuario no hay
problema, pero inmaginate una compania como Amazon.com o EBay.com, donde
miles o millones de usuarios agregan o modifican un item a la misma vez, te
inmaginas borrar 1 million de items para insertar 2 millones. Otro ejemplo
seria si quiero aumentar la cantidad de items en 1 para un item especifico,
te inmaginas borrar 300 items para insertar 300 items nuevos. No veo la
logica.

Mientras mas filas esten involucradas en una transaccion, mas se demorara
esta y lo que se busca en las aplicaciones OLTP (procesamineto de
transacciones en linea) es que las las transacciones duren lo menos posible.


AMB

"Alioscha Debali" wrote:

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. \

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.

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


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



Respuesta Responder a este mensaje
#13 Miguel Egea
18/03/2005 - 23:14 | Informe spam
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
> > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > > >
> > >
> > >
> > >
>
>
>





Respuesta Responder a este mensaje
#14 Alioscha Debali
19/03/2005 - 00:24 | Informe spam
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
>> > > > > > > > >
>> > > > > > > > >
>> > > > > > > >
>> > > > > > > >
>> > > > > > >
>> > > > > > >
>> > > > > >
>> > > > > >
>> > > > > >
>> > > >
>> > > >
>> > > >
>> >
>> >
>> >
>
>
>



Respuesta Responder a este mensaje
#15 Miguel Egea
19/03/2005 - 11:46 | Informe spam
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
>> > > > > > > > >
>> > > > > > > > >
>> > > > > > > >
>> > > > > > > >
>> > > > > > >
>> > > > > > >
>> > > > > >
>> > > > > >
>> > > > > >
>> > > >
>> > > >
>> > > >
>> >
>> >
>> >
>
>
>








Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida