Existe Bloque de Registros en SQL Server como el de VFP?

360 views
Skip to first unread message

Ing.Daniel Bojorge

unread,
Dec 14, 2010, 3:59:03 PM12/14/10
to publice...@googlegroups.com
Hola a todos, tengo un problemita, espero alguien me pueda ayudar.   Tengo un sistema de facturación (desde ya hace varios años) funcionando, hay un punto de acceso crítico, que es el control de los números de factura, para eso, en su momento, creé una tabla con un único registro, en el cual tenía el número del próximo número de factura a tomar, para evitar que más de un cajero (estoy en un supermercado) tomara el mismo número, lo que hice fue que el primero que llegue bloquea el registro (o la tabla, igual sólo hay un registro), toma el número que ahí hay lo incrementa en uno y luego desbloquea la tabla.  A como lo pueden ver en el código siguiente.

SELECT ArSyst
LOCAL vlBloqueo
vlBloqueo = lock([ArSyst])

DO while !vlBloqueo
WAIT windows WAITDESBLOQUEANDO NOWAIT NOCLEAR
MESSAGEBOX(WAITDESBLOQUEANDO,ICON_STOP,_Screen.Caption)
vlBloqueo = lock([ArSyst])
ENDDO

WAIT CLEAR

this.NoRecibo = crcptno
REPLACE crcptno with allt(str(val(crcptno)+1))
UNLOCK IN ArSyst


Por cuestión de mejora y para evitar los problemas de trabajar con tablas VFP, estoy haciendo un sistema siempre en VFP, pero con la base de datos en SQL Server, tratando de hacer casi todo con procedimientos almacenados o funciones.  Pero tengo un problema, no sé cómo hacer en SQL Server para tratar de "emular" esa parte que tengo en Visual FoxPro (lo del bloqueo).

No me gustaría dejar todo en SQL Server y una pequeña tabla en VFP donde tenga el consecutivo, me gustaría que todo quede en SQL Server.

¿Alguien me podría ayudar?  Y no está viable la idea de un número de factura por cada caja, sino un único número de factura para todas las cajas.  Bueno, espero puedan ayudarme, yo por mi parte he estado investigando, pero si alguien puede dar una muy buena piedra, le estaré muy agradecido.



Dios L@s Bendiga

Saludos,

Daniel (Con 1 Estrella DCE de Microsoft)
Nicaragua

"Si ustedes permanecen unidos a mí, y si permanecen fieles a mis enseñanzas, pidan lo que quieran y se les dará.
(Juan 15:7 DHH)
Bendito el varón que se fía en el SEÑOR, y cuya confianza es el SEÑOR.
(Jeremías 17:7 RV2000)

Miguel Antúnez

unread,
Dec 14, 2010, 4:01:57 PM12/14/10
to publice...@googlegroups.com
en tu SP, trabaja con Transacciones
Begin Transaction
esto bloquea los registros
osea en un update a tu tabla de correlativos factura lo bloquea hats aun commit o un rollback

Saludos..

--
Miguel Angel Antúnez Camones
Especialista en SQL Server

mant...@frenosa.com.pe
mant...@gmail.com
miguel_...@msn.com
Cel. 997914428

Microsoft Active Professional
Membresía FY10-04-0745

Armando Rodríguez

unread,
Dec 14, 2010, 4:11:35 PM12/14/10
to publice...@googlegroups.com

Como yo lo he solucionado es haciendo un select max(folio) from encabezadofacturas antes de grabar la factura.  Y ese folio se le asigna solo hasta ese momento, no al momento de ingresar a facturar.  Es decir que al momento de ingresar a facturar desconoces el folio, hasta que lo grabas.

 

Saludos

Armando Rodríguez

Armando Rodríguez

unread,
Dec 14, 2010, 4:14:41 PM12/14/10
to publice...@googlegroups.com

El select es select max(folio)+1 as nuevofolio

Ing.Daniel Bojorge

unread,
Dec 14, 2010, 4:21:16 PM12/14/10
to publice...@googlegroups.com
YO sé que con esa forma se puede resolver, obviamente la idea es asignar el número al final de la transacción, pero (ya lo he probado) que al mismo tiempo dos usuarios de clic en el botón guardar (por así decirlo) y ambos tomen el mismo valor, la idea del lock es esa.

Yo también uso transacciones, pero no sé si al usar una transacción sobre una tabla, ésta se bloquee, si es así EXCELENTE.  Disculpen mi ignorancia en esta parte.  


Dios L@s Bendiga

Saludos,

Daniel (Con 1 Estrella DCE de Microsoft)
Nicaragua

"Si ustedes permanecen unidos a mí, y si permanecen fieles a mis enseñanzas, pidan lo que quieran y se les dará.
(Juan 15:7 DHH)
Bendito el varón que se fía en el SEÑOR, y cuya confianza es el SEÑOR.
(Jeremías 17:7 RV2000)



2010/12/14 Armando Rodríguez <armandor...@hotmail.com>

Miguel Antúnez

unread,
Dec 14, 2010, 4:23:57 PM12/14/10
to publice...@googlegroups.com
si así es la transacción, lo bloquea automáticamente.

Ing.Daniel Bojorge

unread,
Dec 14, 2010, 4:32:26 PM12/14/10
to publice...@googlegroups.com
Pues voy a implementarlo, espero no exista problemas, porque la prueba final sería ya en funcionamiento (con las 10 cajas online).

Lo que haré es una función que me devuelva el número a asignar, obviamente esta función deberá hacer la transacción (espero que no me salga con que en función NO SE PUEDE UTILIZAR LA TRANSACCIÓN).

Muchas gracias por todo.


Dios L@s Bendiga

Saludos,

Daniel (Con 1 Estrella DCE de Microsoft)
Nicaragua

"Si ustedes permanecen unidos a mí, y si permanecen fieles a mis enseñanzas, pidan lo que quieran y se les dará.
(Juan 15:7 DHH)
Bendito el varón que se fía en el SEÑOR, y cuya confianza es el SEÑOR.
(Jeremías 17:7 RV2000)



Geovanny Quirós C.

unread,
Dec 14, 2010, 4:35:21 PM12/14/10
to publice...@googlegroups.com
Lo mas sencillo es definir el número de factura como autonumerico y el SQL hara todo el trabajo por ti.
Saludos

Miguel Antúnez

unread,
Dec 14, 2010, 4:40:18 PM12/14/10
to publice...@googlegroups.com
Para un primary key acepto esa propuesta, pero para el nro de factura es algo especial, ya que puedes manejar + de un tipo de documento de venta factura o boleta, ademas + de un punto de venta.


2010/12/14 Geovanny Quirós C. <geovann...@gmail.com>

Jairo Miranda

unread,
Dec 14, 2010, 4:40:03 PM12/14/10
to publice...@googlegroups.com

Alguien me puede ayudar , con Windows 2003 server?

 

Tengo una maquina con win 7 que trabaja mi programa en  vfp6, desde ayer se le bloqueo el equipo al usuario y lo apago directamente . ahora que trata de entrar nuevamente a logearse con son su usuario el sistema le devuelve el mensaje  ‘ usuario o contraseña desconocida’, sin embargo puede entrar desde otra máquina con su usuario y contraseña y  el server lo deja pasar.

 

Es decir desde esa maquina no ha podido ingresar ningún  usuario al server , sin embargo puedo ver toda la red y entrar en aquellos que tiene otros sistemas como windoows xp .

 

Ya borre el usuario del server y cree otro, ya cree otra cuenta desde el win 7 y nada.

 

Cualquier idea??

 

Jairo

 

Ing.Daniel Bojorge

unread,
Dec 14, 2010, 4:43:15 PM12/14/10
to publice...@googlegroups.com
Así es.

Es complicado tener como autonumérico este campo, porque luego viene el caso de preguntar qué número se asigno para que el detalle lleve también ese número.

Ya haré las pruebas con la transacción.

MUY AMABLES con sus gentiles respuestas.


Dios L@s Bendiga

Saludos,

Daniel (Con 1 Estrella DCE de Microsoft)
Nicaragua

"Si ustedes permanecen unidos a mí, y si permanecen fieles a mis enseñanzas, pidan lo que quieran y se les dará.
(Juan 15:7 DHH)
Bendito el varón que se fía en el SEÑOR, y cuya confianza es el SEÑOR.
(Jeremías 17:7 RV2000)



Yvan GMAIL

unread,
Dec 14, 2010, 4:44:05 PM12/14/10
to publice...@googlegroups.com

No trabajo mucho en esto, pero si no hay acceso por ningún lado.. ingrese como usuario de la PC (sin dominio), desligar del dominio y volver a unir.

 

 

De: publice...@googlegroups.com [mailto:publice...@googlegroups.com] En nombre de Jairo Miranda


Enviado el: Martes, 14 de Diciembre de 2010 04:40 p.m.
Para: publice...@googlegroups.com

Miguel Antúnez

unread,
Dec 14, 2010, 4:47:08 PM12/14/10
to publice...@googlegroups.com
En ese aspecto si diría que no manejes le nro de documento como primary key pero si no como indice unique y tengas un autoincremental como prymay key, y ese sea el que grabes en el detalle.

Saludos.

Jairo Miranda

unread,
Dec 14, 2010, 5:11:01 PM12/14/10
to publice...@googlegroups.com

Amigo no esta configurado con active directory , esta con wordgroup.

Geovanny Quirós C.

unread,
Dec 14, 2010, 5:20:54 PM12/14/10
to publice...@googlegroups.com
Igual podrias trabajar con un autoincremental y por otro lado el número de tienda y los dejas en un campo calculado .

Geovanny Quirós C.

unread,
Dec 14, 2010, 5:24:47 PM12/14/10
to publice...@googlegroups.com
Si pones el código dentro de un procedimiento almacenado dentro de una transacción  lo puedes lograr sin ningún problema:
Haces el insert en el encabezado
con un select max() obtienes el número insertado y lo pones en una variable.
Por último insertas las filas de detalle.
 
Todo dentro de una transaccion.
 
Saludos
 

Sent: Tuesday, December 14, 2010 3:43 PM

Ing.Daniel Bojorge

unread,
Dec 14, 2010, 5:37:04 PM12/14/10
to publice...@googlegroups.com
Gracias por tu sugerencia, todas las tendré en mente, entre más aportes EXCELENTE.  Así tengo más opciones, por si alguna no funciona.

Gracias por responder.


Dios L@s Bendiga

Saludos,

Daniel (Con 1 Estrella DCE de Microsoft)
Nicaragua

"Si ustedes permanecen unidos a mí, y si permanecen fieles a mis enseñanzas, pidan lo que quieran y se les dará.
(Juan 15:7 DHH)
Bendito el varón que se fía en el SEÑOR, y cuya confianza es el SEÑOR.
(Jeremías 17:7 RV2000)



ricardo peña

unread,
Dec 14, 2010, 11:07:49 PM12/14/10
to publice...@googlegroups.com
Hola a todos.
 
Disculpen que llegue tarde a responder este hilo pero.........
 
La posibilidad de definir un campo autonumérico ( en VFP ) se llama IDENTITY en SQL ( pido disculpas por las mayúsculas ).
 
No es de buenas prácticas definir un campo numerador IDENTITY debido a las anulaciones ( que cualquier sistema lo debe permitir ).
 
El Store Procedure de una tabla numeradora en sql debe ser escrita ( tal como figura en cualquier foro de sql ) así:
 
--
--    DEVUELVE EL PROXIMO NRO DE FC
--
CREATE PROCEDURE dbo.traenfca 
AS
SET NOCOUNT ON
DECLARE @nr int
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
BEGIN TRAN
UPDATE MyBase.dbo.numerofc SET @nr=p_fc=p_fc+1            && esta sentencia es válida en sql
COMMIT TRAN
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SELECT @nr AS nfc
GO
 
Ricardo Luis Peña
Analista de Sistemas
BA - Argentina
 

From: debs....@gmail.com
Date: Tue, 14 Dec 2010 14:59:03 -0600

Subject: [vfp] Existe Bloque de Registros en SQL Server como el de VFP?

Victor Espina

unread,
Dec 15, 2010, 8:23:33 AM12/15/10
to Comunidad de Visual Foxpro en Español
Excelente Ricardo; no dudo que haya otras maneras de resolver el
problema, pero esa que senalas es con mucho la mas simple y efectiva
que he visto hasta ahora.

Saludos

Victor Espina


On 15 dic, 01:07, ricardo peña <r...@hotmail.com> wrote:
> Hola a todos.
>
> Disculpen que llegue tarde a responder este hilo pero.........
>
> La posibilidad de definir un campo autonumérico ( en VFP ) se llama IDENTITY en SQL ( pido disculpas por las mayúsculas ).
>
> No es de buenas prácticas definir un campo numerador IDENTITY debido a las anulaciones ( que cualquier sistema lo debe permitir ).
>
> El Store Procedure de una tabla numeradora en sql debe ser escrita ( tal como figura en cualquier foro de sql ) así:
>
> --
> --    DEVUELVE EL PROXIMO NRO DE FC
> --
> CREATE PROCEDURE dbo.traenfca
> AS
> SET NOCOUNT ON
> DECLARE @nr int
> SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
> BEGIN TRAN
> UPDATE MyBase.dbo.numerofc SET @nr=p_fc=p_fc+1            && esta sentencia es válida en sql
> COMMIT TRAN
> SET TRANSACTION ISOLATION LEVEL READ COMMITTED
> SELECT @nr AS nfc
> GO
>
> Ricardo Luis Peña
> Analista de Sistemas
> BA - Argentina
>

Ing.Daniel Bojorge

unread,
Dec 15, 2010, 9:50:57 AM12/15/10
to publice...@googlegroups.com
Gracias por tu respuesta y mejor aún con un ejemplo muy práctico.  Yo estuve investigando del ISOLATION LEVEL y claro va ligado a la transacción.

Lo pondré en una función y lo trabajaré ahí. Muchísimas gracias, sin tantas vueltas, creo que es bastante sencillo y muy práctico.




Dios L@s Bendiga

Saludos,

Daniel (Con 1 Estrella DCE de Microsoft)
Nicaragua

"Si ustedes permanecen unidos a mí, y si permanecen fieles a mis enseñanzas, pidan lo que quieran y se les dará.
(Juan 15:7 DHH)
Bendito el varón que se fía en el SEÑOR, y cuya confianza es el SEÑOR.
(Jeremías 17:7 RV2000)



2010/12/14 ricardo peña <rl...@hotmail.com>

Geovanny Quirós C.

unread,
Dec 16, 2010, 11:06:07 AM12/16/10
to publice...@googlegroups.com
Eso es lo bueno de esta profesión; siempre existen soluciones diferentes a un mismo problema.
Aunque sigo pensando que el identity es la opción mas facil.
 
Que un documento se anule no quiere decir que se tenga que eliminar.
 
Saludos a todos.

Ing.Daniel Bojorge

unread,
Dec 16, 2010, 11:08:49 AM12/16/10
to publice...@googlegroups.com
Muchas gracias por tu aporte.  Claro por anulado no quiere decir que deba eliminarse el registro.


Dios L@s Bendiga

Saludos,

Daniel (Con 1 Estrella DCE de Microsoft)
Nicaragua

"Si ustedes permanecen unidos a mí, y si permanecen fieles a mis enseñanzas, pidan lo que quieran y se les dará.
(Juan 15:7 DHH)
Bendito el varón que se fía en el SEÑOR, y cuya confianza es el SEÑOR.
(Jeremías 17:7 RV2000)



2010/12/16 Geovanny Quirós C. <geovann...@gmail.com>

Walter R. Ojeda Valiente

unread,
Dec 16, 2010, 3:19:45 PM12/16/10
to publice...@googlegroups.com
Contablemente al menos los documentos anulados NUNCA deben ser eliminados, deben quedarse archivados durante el tiempo que normalmente tienen de vigencia. En Paraguay ese lapso es de 5 años, eso quiere decir que nadie (ni un particular ni el Estado) puede reclamarte por algo que tenga más de 5 años de antigüedad.

Pero hasta que no se cumplan esos 5 años debes tener todos tus documentos archivados, estén anulados o no.

Saludos.

Walter.

Ing.Daniel Bojorge

unread,
Dec 16, 2010, 3:21:47 PM12/16/10
to publice...@googlegroups.com
Tenés toda la razón.  Por eso no es una opción viable eliminar los registros.

Dios L@s Bendiga

Saludos,

Daniel (Con 1 Estrella DCE de Microsoft)
Nicaragua

"Si ustedes permanecen unidos a mí, y si permanecen fieles a mis enseñanzas, pidan lo que quieran y se les dará.
(Juan 15:7 DHH)
Bendito el varón que se fía en el SEÑOR, y cuya confianza es el SEÑOR.
(Jeremías 17:7 RV2000)



Reply all
Reply to author
Forward
0 new messages