grabar factura por transacciones

944 views
Skip to first unread message

Percy Villano Fuentes

unread,
Oct 14, 2013, 1:03:20 PM10/14/13
to publice...@googlegroups.com
Hola a todos quisiera saber si es posible grabar de un solo golpe una factura ( cabecera y detalle) pero que ademas actualice stock y actualice el numero de boleta.
**
hasta ahora he programado desde el aplicativo es decir los siguientes pasos en el evento click del boton boletear.
paso 1.- bloquea tabla donde esta el numero de boleta, extrae numero y aumenta mas 1.
paso 2.- graba cabecera
paso 3.- graba detalle
paso 4.- actualiza stock.
**
repito que todo esto lo hago desde el mismo ejecutable
pero quisiera saber si es posible hacer esto desde una transaccion en la BD., ya que ahi ya no seria necesario bloquear las tabla de númeracion de boleta, entendiendo que se realiza todos los pasos o ninguno de ellos en caso algo anduviera mal.

la dificultad encuentro en el detalle ya que no es solo un registro el que se graba, sino varios que pueden variar desde 1 hasta n registros por boleta.

quisiera que me ayuden para poder modificar jmi codigo y mandar solo parametros a la BD.

Espero se me haya comprendido.

Ricardo Pina

unread,
Oct 14, 2013, 1:46:05 PM10/14/13
to Grupo VFP
Hola Percy
 
Si fuera viernes te diría que depende la lo fuerte que golpees.
Pero como no es viernes, no termino de entender
La funcion de las transacciones es mandar todo o nada si no puede para evitar datos incongruentes.
 no entiendo que quieres decir mandar solo parametros a la DB
 
Saludos
--
            

                   Ricardo Pina

Desarrollo y Servicios Informáticos

                  Profesionales
               www.dsip.com.ar

 

 

Fernando D. Bozzo

unread,
Oct 14, 2013, 2:01:17 PM10/14/13
to publice...@googlegroups.com
Hola Percy:

Lo que se suele hacer es grabar al revés, o sea, primero el detalle y luego la cabecera, ya que si ocurriera un fallo durante la grabación, al ser solo el detalle lo afectado, cuando busques la cabecera no la vas a encontrar, y por consiguiente volverás a grabar nuevamente comenzando por el detalle (borrando el detalle anterior si hubiera, o usando una numeración distinta).
Como la cabecera es un registro, al grabarlo podés estar seguro de que todo el resto ya está guardado, ya que la cabecera es la que se usa para buscar, y no el detalle.

Espero hayas entendido la idea.

Saludos.-

Luis Mata

unread,
Oct 14, 2013, 4:05:10 PM10/14/13
to publice...@googlegroups.com
Si las tablas son relacionales, entonces no podrás hacer lo que planteas....

Fernando D. Bozzo

unread,
Oct 14, 2013, 4:17:11 PM10/14/13
to publice...@googlegroups.com, Luis Mata
Si se crearon los triggers en la BDD no, pero si no se crearon entonces no hay problema.

Saludos.-

Víctor Hugo Espínola Domínguez

unread,
Oct 14, 2013, 4:56:34 PM10/14/13
to publicesvfoxpro
Hola Percy

Entiendo que lo que deseas es usar procedimientos almacenados para grabar la factura, puedes ver un ejemplo para Firebird en: http://firebird21.wordpress.com/2013/06/20/maestrodetalle-en-visual-foxpro-y-firebird/

El bloqueo de la tabla de numeración es un asunto de lógica y no de técnica, y no hace falta bloquear la tabla, sólo el registro.

Saludos,
Víctor.
Lambaré - Paraguay.



El 14 de octubre de 2013 14:03, Percy Villano Fuentes <percyv...@gmail.com> escribió:

José Luis Carranza

unread,
Oct 19, 2013, 10:50:49 AM10/19/13
to publice...@googlegroups.com

Hola Percy,  adjunto el SP que utilizo para grabar toda la operación de ventas en una sola transacción en SQL la tengo implementada desde el 2011.

 

Analízala y te dará una idea como lo puedes trabajar.

 

Saludos

 

José Luis Carranza

Lima-Perú

GrabaVenta.sql

HernanCano

unread,
Oct 19, 2013, 1:55:13 PM10/19/13
to publice...@googlegroups.com
Hola.
Mis compañeros te han dado alternativas.

Mi propuesta es: agregar un paso 0 (cero) y un paso 5  alo que estás haciendo actualmente, más o menos así:

paso 0.- abrir una transacción.

paso 1.- bloquea tabla donde esta el numero de boleta, extrae numero y aumenta mas 1.
paso 2.- graba cabecera
paso 3.- graba detalle
paso 4.- actualiza stock.
paso 5.- cerrar la transacción.
**

De esta forma aseguras que lo que se haga en uno se haya terminado de hacer en todos los archivos involucrados: si hay un fallo en alguna parte intermedia (DENTRO DE LA TRANSACCION) lo que se haya hecho se devolverá y no quedará en los datos definitivos.

Esto es lo que significa la frase "...realiza todos los pasos o ninguno de ellos..." que seguro leíste por ahí.....

MALKASOFT ADPI: http://www.developervfp.blogspot.com/

unread,
Oct 19, 2013, 2:52:21 PM10/19/13
to publice...@googlegroups.com
Hola amigo, felicitaciones por el código José Luis Carranza  pero creo que es demasiado código no critico solo doy mi punto de vista, ahora con lo que necesitas Percy Villano Fuentes.  tienes que iniciar una transacción desde VFP de la siguiente manera.

Botón guardar

= SQLSETPROP(cn, 'Transactions', 2)
nError = -1
------Aqui insertas el la cabecera
nError = SQLExec("código para que ingreses cliente")

if nError > 0
      significa que se ingreso correctamente el cliente 
     nError=SQLExec(CN,"TucodigoSQL")
endif 

if nError>0
    significa que hizo bien la inserción
    ahora vamos al detalle
      nError=SQLExec(CN,"TucodigoSQLDE de detalle")
    dentro del detalle puedes crear un trigger que agrega los artículos al kardex, actualiza tus existencia porque estarías aprovechando todo los datos
endif 

if nError>0
    si todo va muy bien terminas la tracción
    SQLCOMMIT(cn)
    = SQLSETPROP(cn, 'Transactions', 1)
else
   si la variable nError < 0 significa que en alguna de los insert into y incluso en el trigger haya fallado revierte la transacción y ninguna tabla queda afectado.
    SQLROLLBACK(cn)
   = SQLSETPROP(cn, 'Transactions', 1)
endif 

Se puede hacer muchas cosas utilizando el trigger te ahorras código y ademas pienso yo que es mas transparente el código.


Pd.: Descargate mi grilla que tiene multiples funciones como filtrar, multiseleccion, búsqueda, etc del siguiente link http://www.developervfp.blogspot.com/p/gridlibre-v35.html. Ahora también puedes bajarte mi ultima herramienta Busqueda Incremental con un TEXTBOX http://developervfp.blogspot.mx/p/busqueda-incremental-con-un-textbox.html  las herramientas viene con código fuente, ojo no hacer mal uso por favor. 


Saludos; 


Ing. Russvell Jesus Soto Gamarra 
Framework Multi-conexion version 6.0 (nueva)

HernanCano

unread,
Oct 20, 2013, 3:25:03 PM10/20/13
to publice...@googlegroups.com
Cuéntame, Russvel:

Las funciones SQLCOMMIT(), SQLROLLBACK() y SQLSETPROP(.., 'Transactions',..) ¿funcionan para cualq motor? He entendido que sólo funcionan para M$ SQL Server.

Gracias.

Fernando D. Bozzo

unread,
Oct 20, 2013, 6:31:05 PM10/20/13
to publice...@googlegroups.com
Hola Hernán:

Sí, funcionan con cualquier BDD en general que tenga soporte ODBC.

Saludos.-
 

Oscar Quiros Coto

unread,
Oct 21, 2013, 11:29:12 AM10/21/13
to publice...@googlegroups.com
Si me funcionan en mysql y Oracle.
 
También utilizo, sqlexec(Icon,"start transaction"), sqlexec(lcon,"commit"), sqlexec(lcon,"rollback").
El start transaction es en mysql, en sqlserver es begin transaction, y en Oracle no existe.
 
Saludos.

Fernando D. Bozzo

unread,
Oct 21, 2013, 12:02:05 PM10/21/13
to publice...@googlegroups.com
Te dejo algunos links que encontré de cómo se usa sqlcommit, pero el paso fundamental es definir las transacciones de la bdd cómo manuales para poder usar sqlcommit y sqlrollback.

http://microsoft.public.es.vfoxpro.narkive.com/iXdWNVJw/sql-commit-y-rollback-vs-tableupdate-y-tablerevert

Fernando D. Bozzo

unread,
Oct 21, 2013, 12:07:03 PM10/21/13
to publice...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages