como crear transacciones para guardar folios en un sistema mutiusuario.

620 views
Skip to first unread message

Lorenzo Lazos M

unread,
Nov 14, 2017, 1:39:17 PM11/14/17
to Comunidad de Visual Foxpro en Español
Hola buen dia, soy nuevo en firebird y despues de tanto buscar no logro comprender como iniciar una transaccion para evitar folios dulicados en firebird.
alguien podra guiarme sobre como comenzar y donde?.
trabajo con firebird y visual studio.

Geovanny Quirós Castillo

unread,
Nov 14, 2017, 1:45:48 PM11/14/17
to publice...@googlegroups.com
Buenas tardes Lorenzo,
A qué se refiere con folios?
 
Si un folio es toda la información que se guarda en un registro de una tabla, no veo porque se pueda duplicar al momento de guardar, esto es independiente de cualquier motor de base de datos que se esté utilizando.
 
Puede poner el trozo de código con el que envía a guardar la información?
 
Saludos,

Esteban H.

unread,
Nov 14, 2017, 2:54:11 PM11/14/17
to publice...@googlegroups.com

Hola Lorenzo.

No entiendo q son los folios.

Este es un foro de VFP, supongo q debería tener un OT el asunto.

Con respecto a las transacciones, el llamado de las mismas es diferente desde VFP, q de cualquier otro lenguaje, Visual Studio en tu caso. Yo divido las transacciones de 2 formas, si la operación va a ser de Lectura o Escritura, de acuerdo a esta situación envío los parámetros correspondientes antes del Select, Update, Insert, etc. El manejo de Transacciones es fundamental p la salud de tu motor SQL y p evitarte dolores de cabeza futuros.

 

Saludos

 

Esteban.

Antonio Meza

unread,
Nov 14, 2017, 3:11:40 PM11/14/17
to Comunidad de Visual Foxpro en Español
https://firebird21.wordpress.com/

ahí puedes buscar sobre lo que necesitas

saludos
Antonio Meza

Lorenzo Lazos M

unread,
Nov 14, 2017, 3:50:57 PM11/14/17
to Comunidad de Visual Foxpro en Español
de echo ya revise esa pagina (muy buena por cierto pero no encontre un ejemplo claro como para mi que soy novato en esto) y de ahi me estoy enfocando para relizar mi proyecto, a lo que me refiero es que tengo que crear facturas pero por ser un sistema multiusuario loq ue quiero es realizar unn procedimiento almacenado o una transaccion para relizar este paso y asi evitar guardar datos duplicados.
ejemplo.
caja 1 y caja dos hacen una factura y en la bd el ultimo folio es 10, entonces a caja 1 y caja dos al empezar una nueva factura les aparece folio 2 a ambas y he ahi el conflicto al momento de pagar, que se revuelven los datos de dos folios iguales pero de diferente factura.
espero haberme explicado y si alguien tiene una manera de empezar a manejar esto ya que no se ni por donde empezar y me encuento truncado en este paso.

mapner

unread,
Nov 14, 2017, 3:58:59 PM11/14/17
to Comunidad de Visual Foxpro en Español
Una forma fácil es crear un INDEX con la clausula UNIQUE

CREATE UNIQUE INDEX IDX_FATURAS1 ON FACTURAS (FOLIO)

(suponemos que el campo FOLIO no es la PK) 

Al intentar grabar un valor repetido de folio, Firebird emitirá un error que tendrás que capturar.

Simple como eso.

Saludos

Lorenzo Lazos M

unread,
Nov 14, 2017, 4:11:17 PM11/14/17
to Comunidad de Visual Foxpro en Español
pero me estaria generando un error muy seguido ya que se estaria trabajando conjuntamente 4 computadoras, ahora imaginense la cantidad de veces que esto me pasaria. (seria muy tedioso estar viendo ese error cada dos o tres compras).
se podra crear una transaccion que me permita tomar el ultimo folio y guardar los datos y dejar en espera a las otras solicitudes para guardar los folios, asi tomaran el ultimo folio el que dejo la primera solitud.
o alguna otra sugerencia de verdad que estoy echo un lio con esto.
les agradezco las respuestas.


El martes, 14 de noviembre de 2017, 11:39:17 (UTC-7), Lorenzo Lazos M escribió:

mapner

unread,
Nov 14, 2017, 4:50:54 PM11/14/17
to Comunidad de Visual Foxpro en Español
Lo que está queriendo hacer no es controlar valor repetido sino generar un secuenciador donde cada nueva FACTURA grabe el próximo Nº de FOLIO disponible.
Es se hace un campo autonumerador, en Firebird eso se logra con un GENERETOR y un TRIGGER.

Carlos Miguel FARIAS

unread,
Nov 14, 2017, 4:53:02 PM11/14/17
to Grupo Fox
Eso en el formato de facturación de Argentina se resuelve con un punto de venta diferente.
En Argentina el id de la factura es Tipo-9999-99999999 donde tipo es una letra y los 9 son dígitos. Los 4 primeros dígitos corresponden a un punto de venta.
A cada caja le asignas un punto de venta, no se repite en otras cajas, la numeración (los últimos dígitos) pueden repetirse pero para distintos punto de venta.
Saludos: Miguel

Carlos Miguel FARIAS

unread,
Nov 14, 2017, 4:54:46 PM11/14/17
to Grupo Fox
Los números de factura no pueden saltearse (al menos cuando leí) lo de la afip, porque número salteado es factura anulada.
Hay que tener en cuenta que alguien puede estar haciendo una factura y por cualquier cosa cancelar y te quedarían huecos.
Saludos: Miguel

Carlos Alfaro

unread,
Nov 14, 2017, 5:12:19 PM11/14/17
to publice...@googlegroups.com

En qué momento determinas el numero de folio a asignar a la factura, al iniciar la factura o al grabarla?

mapner

unread,
Nov 14, 2017, 5:14:41 PM11/14/17
to Comunidad de Visual Foxpro en Español
Miguel,

En ARG hasta en el mismo PV puede haber carga multi-usuario, no en atención al público pero si en facturación back-office, o sea más de un usuario compitiendo para ver quien obtiene el próximo nro del PV asignado.

A su vez, en ARG ya no se puede saltear numeración de comprobante de ninguna manera ya que la registración debe realizarse a través del Web Service de la AFIP de Factura Electrónica para obtener el CAE y ese WS impide transaccionar número salteado.

Saludos

Lorenzo Lazos M

unread,
Nov 14, 2017, 5:16:24 PM11/14/17
to Comunidad de Visual Foxpro en Español
al iniciar la factura obtengo el numero por medio de un select, pero de ihual manera pense hacerlo dentro de la misma transaccion para asi me devolviera el folio cuando ya este guardada la factura.
alguna idea de como puedo empezar eso??


El martes, 14 de noviembre de 2017, 11:39:17 (UTC-7), Lorenzo Lazos M escribió:

mapner

unread,
Nov 14, 2017, 5:22:49 PM11/14/17
to Comunidad de Visual Foxpro en Español
En ambientes multiusuarios los números secuenciales se generan al grabar, no al inicio de la carga.
Nuevamente, lee el artículo en como anejar campos auto-incrementales con un GENERATOR y un TIGGER

Geovanny Quirós Castillo

unread,
Nov 14, 2017, 5:35:43 PM11/14/17
to publice...@googlegroups.com
Lo mejor es ir a lo simple y básico, esta imagen servirá solamente para efectos ilustrativos:
 
1. Se captura toda la información de la factura.
2. Se envia todo (cabecera y detalle) a guardar dentro de una sola transacción (eso es muy simple manejarlo con VS y VF)
        Primero se guarda la info de la cabecera y se obtiene el identificador (eso se hace recuperando el identity que le quedó a ese registro.)
        Luego se guarda el detalle de la factura, cada uno de los registros deberá llevar el mismo valor del identity.
 
Si el número de factura es diferente al valor del identity, entonces debe estar almacenado en una tercera tabla como un parametro que almacena ese consecutivo, para ese caso se debe incluir dentro del procedimiento almacenado la recuperación del último número de factura y la actualización del mismo al final del proceso de guardado.
 
Si se presenta un error durante el proceso, se cumple el principio de las transacciones: “Se hace todo o no se hace nada”
 
Pero insisto, todo debe estar dentro de una sola transacción.
 
 
 
 
image
 
Sent: Tuesday, November 14, 2017 4:16 PM
Subject: [vfp] Re: como crear transacciones para guardar folios en un sistema mutiusuario.
 
image[1].png

Carlos Miguel FARIAS

unread,
Nov 15, 2017, 5:45:57 AM11/15/17
to Grupo Fox
Mapner, con un Tigger (tigre gangoso) puede ser peligroso, sobre todo los viernes. Mejor un trigger que un tiger
Saludos: Miguel, La Pampa (RA)
Larga Vida y Prosperidad
Que la Fuerza los acompañe

mapner

unread,
Nov 15, 2017, 7:40:52 AM11/15/17
to Comunidad de Visual Foxpro en Español
Gracias por la corrección Miguel, tu aporte resolvió la consulta técnica :)
A todo esto, ya compraste tu licencia Servoy o todavía estás negociando el porcentaje?

Gregori Arjona Toledo

unread,
Nov 15, 2017, 8:11:42 AM11/15/17
to Comunidad de Visual Foxpro en Español
Utiliza una tabla donde quieras guardar el valor del numero de factura:


CREATE TABLE NUMEROS_FACTURA (
   ID  INTEGER
);



Cuando quieras recuperar este valor de manera segura y evitar que nadie pueda recuperar el mismo utiliza la siguiente instruccion:



UPDATE NUMEROS_FACTURA SET ID=ID+1 RETURNING NEW.ID

Carlos Miguel FARIAS

unread,
Nov 15, 2017, 8:20:35 AM11/15/17
to Grupo Fox
mapner. No. Pan para Servoy, hambre para mañana.

Estoy trabajando en python-tkinter (escritorio) o python-flask (web), tkinter porque es simple y alcanza (wxpython recién ahora esta versionando para python3, pyside crea exes muy grandes); django es muy grande para la web que tengo que armar.

Saludos: Miguel

Antonio Meza

unread,
Nov 15, 2017, 1:51:14 PM11/15/17
to Comunidad de Visual Foxpro en Español
No uso VS pero he usado FIreBird.

Necesitas una tabla adicional para obtener los correlativos (folios únicos) en mi caso personal uso una tabla de correlativo por folio único que necesite, ejemplo Facturas_folios, Tickets_Folios, Bancos_Folios, etc, etc.

Facturas_Folios
id       - Campo Autoincrementable
idSucursal   - ID de sucursal (PrimaryKey)
Serie           - Serie de Factura (caracter)
Folio            - Campo para llevar el consecutivo único (numérico)

Dependiendo la necesidad, capturo los valores en esta tabla auxiliar de folios únicos de factura, si el cliente maneja sucursal pues debo capturar el idSucursal, si no va en CERO!!! si requiero de serie pues la capturo si no va vació, lo importante aquí es que debes preparar el Select para que localice el registro que vas a bloquear e incrementar si es que tienes varios así que OJO!!!

Facturas_Folios
id   idSucursal   Serie     Folio
1    0                  F           10

Lo que tienes que hacer es bloquear el registro de la tabla Facturas_Folios, para poder obtener un consecutivo único, es decir bloqueas el registro, lo incrementas y lo guardas en la cabecera de factura convertido en carácter "000010" no en numérico, si todo salio bien finalizas la transacción y se desbloquea el registro, si algo salio mal cancelas la transacción y se desbloquea el registro y el consecutivo queda como estaba.

Todo lo debes hacer en un solo paso, es decir al momento de guardar la factura, debes primero obtener el Folio, reemplazarlo en la tabla de Facturas, luego mandar a guardar la tabla facturas y obtener su ID, reemplazas el ID de factura en la tabla de Facturas_Detalles y mandas a guardar la tabla de detalles, si todo salio bien finalizas la transacción con su respectivo Commit, si salio mal pues aplicas el Rollback!!!

Por eso es super importante que sea todo en un solo paso, donde ya no haya mensajes intermedios, es decir una vez que empieza a guardar si pasa algo se cancela la transacción y se avisa, no que muchos por error primero avisan al usuario y dejan la transacción pendiente hasta que le den aceptar al mensaje.

Si 2 usuarios guardan una factura al mismo tiempo el primero que gane a bloquear el folio de facturas, obtendrá su folio, el segundo esperara a que se finalice la primera transacción, si finaliza con folio 10 pues el segundo recibe la factura 11, si el primero por algún detalle se cancelo entonces el segundo recibe el folio 10, y de esta forma se controlan los correlativos, hay otras formas con el uso de generadores de FireBird que guardas toda la factura y si todo salio bien entonces llamas al generador y aplicas el consecutivo a la factura, pero en mi caso prefiero bloqueo y una sola transacción, ya es cuestión de gustos.

Te paso el código SQL de FireBird que uso para todo este Show!!!! jajajaja

* Preparar la Transacción
     SET TRANSACTION READ WRITE READ COMMITTED WAIT

* Bloquear Registro de Facturas_Folio
     
Select * From facturas_folios WITH LOCK

* Ya localizado el registro lo incrementas, si no lo agregas con insert y ya inicia en 1
     
Update facturas_folios set folio = folio + 1

De forma local conviertes el valor del folio en carácter, en el ejemplo es el folio 10 y lo guardas en la factura

* Ahora envías a guardar la factura y obtienes el ultimo ID
     
Insert Into Facturas (serie, folio, ...) values ("F", "000010", ....) RETURNING facturas.id

* Debes actualizar el UltimoID en la tabla de detalles de forma local para luego mandar a guardar la tabla de detalles
    insert
into ..... etc etc
    insert
into ..... etc etc

* Si todo salio bien
     
Commit
* Si algo salio mal
     
Rollback

Ahí tienes el esqueleto para armar a tu necesidad y adaptar a tu lenguaje VS, si fuera VFP con FoxyDB eso es muy sencillo sin preocuparte de las transacciones, del bloqueo, id, del folio, todo eso se hace con funciones sencillas, algo así

* Obtener consecutivo
    odb
.Code("facturas_folios", "folio", "Serie", "'F'")
* Reemplazar en el folio de la factura
     replace facturas
.folio ......
* Guardar factura y obtener ultimoId
    odb
.Update("facturas", .t.)
* Reemplazar ultimo id en detalles
     replace facturas_detalles
.idfactura with ....... all
* Guardar Detalles
    odb
.Update("detalles")
* Finalizar transaccion
   
if odb.Commit()
       
* Listo
   
else
      odb
.Rollback()
     
* Hay un error
   endif


NOTA: Puede tener errores pues lo escribí al vuelo del pájaro loco jajajajajaja y en el caso de Firebird te puede ahorrar mas codigo pues hay funciones combinadas como Update Insert, que si el registro existe lo actualiza y si no lo crea.

saludos
Antonio Meza

Antonio Meza

unread,
Nov 15, 2017, 2:05:16 PM11/15/17
to Comunidad de Visual Foxpro en Español
un error !! debe ser asi

Facturas_Folios
id       - Campo Autoincrementable (PrimaryKey)
idSucursal   - ID de sucursal 
Serie           - Serie de Factura (carácter)
Folio            - Campo para llevar el consecutivo único (numérico)

saludos

Carlos Miguel FARIAS

unread,
Nov 15, 2017, 3:39:17 PM11/15/17
to Grupo Fox
Si fuera viernes comentaría acerca de las claves primarias naturales y sus ventajas. 🤔😀🙊🙉🙈

Lorenzo Lazos M

unread,
Nov 15, 2017, 3:48:25 PM11/15/17
to Comunidad de Visual Foxpro en Español
esta forma creo comprenderla mejor, pero una pregunta para esto del codigo lo agrego en un procedimiento almacenado verdad? y les agradezco a todos por ayudarme a comprender el funcionamiento de transacciones para sistemas multiusuario.

Lorenzo Lazos M

unread,
Nov 15, 2017, 4:41:37 PM11/15/17
to Comunidad de Visual Foxpro en Español
entonces ese codigo lo agregaria en un procedimiento almacenado o e donde?


El martes, 14 de noviembre de 2017, 11:39:17 (UTC-7), Lorenzo Lazos M escribió:

Luis Gerardo

unread,
Nov 16, 2017, 2:44:03 PM11/16/17
to Comunidad de Visual Foxpro en Español
Te comparto un codigo que yo utilizo para hacer lo que tu necesitas, aunque no es para facturas el escenario es el mismo, una tabla maestra de COMITES y una tabla de detalle del COMITE, la tabla esta asi:

ID_FOLIO_CONTROL de tipo INTEGER
...
ID_COMITE de tipo INTEGER

********************************************** TRIGGER **********************************************
Este es el codigo del Trigger que genera un ID unico para el comite
*********************************************************************************************************
CREATE TRIGGER BI_ID_FOLIO_CONTROL FOR COMITE_MASTER
ACTIVE BEFORE INSERT
POSITION 0
AS
DECLARE VARIABLE lcField_Name VARCHAR(25);
BEGIN
  /* ESTA ES LA PRIMARY KEY DE LA TABLA, Y SE DISPARA AL AGREGAR UN REGISTRO NUEVO, AQUI NO IMPORTA SI NO ES CONSECUTIVO, PERO SI DEBE SER UNICO */
  IF (NEW.ID_FOLIO_CONTROL IS NULL) THEN
      NEW.ID_FOLIO_CONTROL = GEN_ID(CM_ID_FOLIO_CONTROL_GEN, 1);

  /* OBTENER EL FOLIO DEL NUEVO COMITE (SERIA EL EQUIVALENTE AL FOLIO DE LA FACTURA) DE LA TABLA FOLIOS Y AQUI SI LOS FOLIOS SON UNICOS Y CONSECUTIVOS */
  IF (NEW.ID_COMITE = 0 OR NEW.ID_COMITE IS NULL) THEN
    BEGIN
        /* LLAMO AL PROCEDIMIENTO PARA RECUPERAR UN FOLIO UNICO Y SE REGRESA EN NEW.ID_COMITE */
EXECUTE PROCEDURE PROC_NEXT_ID('COMITE_MASTER','ID_FOLIO') RETURNING_VALUES NEW.ID_COMITE;
       
    END

************************* CODIGO DEL PROCEDIMIENTO ************************************
CREATE PROCEDURE PROC_NEXT_ID(
  TCTABLE_NAME VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ISO8859_1,
  TCFIELD_NAME VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ISO8859_1)
RETURNS(
  /* Siguiente folio */
  TNNEXT_ID INTEGER,
  TCSERIE_ID VARCHAR(3) CHARACTER SET ISO8859_1 COLLATE ISO8859_1)
AS
BEGIN
  /* BUSCAR EN LA TABLA CAT_FOLIOS EL SIGUIENTE FOLIO A ASIGNAR */
  SELECT CF.NEXT_ID, CF.SERIE_ID
   FROM CAT_FOLIOS CF
   WHERE
     CF.TABLE_NAME = :tcTable_Name AND
     CF.FIELD_NAME = :tcField_Name
   INTO :tnNext_Id, tcSerie_Id;
  
  IF (tnNext_Id > 0 OR tnNext_Id IS NOT NULL) THEN 
     /* SI SE RECUPERO UN VALOR DISTINTO DE CERO O NULL, ACTUALIZAR EL FOLIO */
     UPDATE CAT_FOLIOS CF
        SET CF.NEXT_ID = CF.NEXT_ID + 1
        WHERE
          CF.TABLE_NAME = :tcTable_Name AND
          CF.FIELD_NAME = :tcField_Name;
  ELSE
     EXCEPTION EXC_FOLIO_NO_ENCONTRADO;
  SUSPEND;
END;
*****************************************************************************************************

********************************** TABLA DE FOLIOS ******************************************
En esta tabla puedes manejar distintos folios y todos se recuperan con el procedimiento PROC_NEXT_ID
*****************************************************************************************************
CREATE TABLE CAT_FOLIOS (
  TABLE_NAME DOM_VARCHAR_25 NOT NULL,  /* Nombre de la Tabla que contiene el folio unico */
  FIELD_NAME DOM_VARCHAR_35 NOT NULL, /* Nombre del Campo del folio */
  NEXT_ID DOM_ID_ENTERO NOT NULL);  /* Folio que sigue */


ALTER TABLE CAT_FOLIOS ADD CONSTRAINT PK_CAT_FOLIOS PRIMARY KEY (TABLE_NAME,FIELD_NAME);


CREATE INDEX IDX_FIELD_NAME ON CAT_FOLIOS(FIELD_NAME);
*****************************************************************************************************

Espero y te sirva la informacion

Eric Natareno Guerra

unread,
Nov 16, 2017, 6:00:02 PM11/16/17
to publicesvfoxpro
Hablando de transacciones: al iniciar la transaccion es posible que otros usuarios inicien su transaccion tomando en cuenta que una de las tablas a actualizar es la de los folios o deben esperar el commit de la transaccion que inicio primero. Espero haberme dado a entender. 

Yo utilizo un SP donde al grabar el encabezado actualizo la tabla correlativos en la fila de factura y tambien al insertar se dispara un trigger el cual me genera el id de la fila insertada, estara bien asi o si o si se debe bloquear esa tabla de correlativos en mi caso. Saludos amigos

Luis Gerardo

unread,
Nov 16, 2017, 6:53:19 PM11/16/17
to Comunidad de Visual Foxpro en Español
En cuestion de correlativos, el enfoque a utilizar (segun mi experiencia) va en funcion de la cantidad de usuarios que accederan en cierto momento a tomar un folio, la forma en que yo lo hice con el ejemplo que comparto, era para un sistema con 20 capturistas simultaneos, y jamas tuve ningun problema de folios duplicados ni nada por el estilo, aqui lo que yo aseguraba era el folio unico para la tabla maestra y ya con ese folio en otro proceso se hacia el detalle, pero aclaro, asi tenia que ser en este sistema en particular.

Nosotros como programadores tenemos que analizar el entorno en el que operará el sistema, para asi diseñar la mejor opcion.

Espero haberte aclarado la duda,

Saludos
Message has been deleted
Message has been deleted
Message has been deleted
Message has been deleted

Carlos Miguel FARIAS

unread,
Nov 17, 2017, 7:32:55 PM11/17/17
to Grupo Fox
Primero: Este es un foro en español, no tengo porque saber alemán.

Y mi respuesta (siendo viernes) fue una observación sobre lo que escribe Melanie (sea quien sea), que para mi es desconocido.

Por lo tanto no fue mi intención ofenderte. Además en tu código, no veo que estés manejando transacciones de firebird, solo un trigger que detecta la validez de la clave primaria que está insertando, pero lo que se dice transacción no explicas nada, que fue lo que el colega solicitó inicialmente. Y si estas manejando transacciones de firebird, no se ve ningún comando asociado.
Saludos: Miguel, La Pampa (RA)



El 17 de noviembre de 2017, 14:06, Luis Gerardo <lg.ca...@gmail.com> escribió:
Gracias por el "cumplido" Miguel y te digo lo mismo que a Melanie, si no entiendes es porque seguramente tambien tienes "scheiße" en vez de cerebro.

Que tengas un buen dia.

El viernes, 17 de noviembre de 2017, 5:21:02 (UTC-6), Miguel escribió:
Luis: Si no es por la aclaración de Melanie, lo tuyo no se entiende nada.

El 16 de noviembre de 2017, 23:32, Melanie Arndt <ivoa...@gmail.com> escribió:
Ihr seid scheiße.

Luis Gerardo

unread,
Nov 18, 2017, 7:26:00 PM11/18/17
to Comunidad de Visual Foxpro en Español
Miguel si la memoria no me falla, firebird maneja las transacciones en forma automatica cuando hay un Insert, Update o Delete y solo las cierras con Commit o Rollbak

Saludos

Carlos Miguel FARIAS

unread,
Nov 19, 2017, 8:56:51 AM11/19/17
to Grupo Fox
Una transacción en bd es un conjunto de operaciones interrelacionadas que abarcan mas de  un registro y/o tabla y que, de fallar, las tablas (registros, etc.) deben quedar en el estado anterior al de la operación.
Para ello, el motor de bd debe enterarse del comienzo de la transacción y al completarse la misma debe hacer un commit (o rollback en caso de falla).
Una operación individual sobre una bd (un simple insert, update o delet) no puede ser por si sola una transacción. Si falla, es lógico que no afecte a la bd, pero eso hasta un buen sistema de archivos tradicionales lo maneja.
Si realizas dos operaciones contra bd y alguna falla, pero no "envolviste" a las operaciones como si fuera una transacción, el SGBD no las va a considerar como transacción y solo recuperara el estado de la transacción fallada, no del conjunto.
Hasta es cuestionable si un indice primario autoincremental (PKAI) involucrado en una transacción realmente puede ROLLBACKearse completamente, porque si dos transacciones por separado deben generar una PKAI, y si la transacción que primero accede al generador, luego cancela, el número no se recupera. O sea que la BD no vuelve al estado exactamente anterior.
La salvedad del PKAI es que estas son claves de uso interno, no son datos, solo son una facilidad para tablas que no cuentan con claves naturales, y en principio, el usuario no debería conocer su existencia.
Saludos: Miguel, La Pampa (RA)

mapner

unread,
Nov 19, 2017, 11:21:51 AM11/19/17
to Comunidad de Visual Foxpro en Español
Si quieren leer un poco sobre arquitectura de transacciones vean:


MVCC es un mecanismo de control de transacciones que no tiene la necesidad de bloquear registros o tablas, sino que lo que hace dentro de la transacción es generar una nueva versión del dato, para que cuando se confirme, deje como record activo esta nueva versión e inactive la versión anterior.  Uno de los primeros motores de BD que adoptaron esta metodología fue Interbase  (Firebird es un fork de Interbase 6.0) y hoy en día esta adaptado por varios otros como PosgreSQL, MS-SQL, MySQL, etc

Carlos Miguel FARIAS

unread,
Nov 19, 2017, 4:29:15 PM11/19/17
to Grupo Fox
Ese mecanismo es muy interesante, y requiere que las bd efectúen un proceso de limpieza para recuperar el espacio no utilizado.

Lorenzo Lazos M

unread,
Nov 25, 2017, 12:33:49 PM11/25/17
to Comunidad de Visual Foxpro en Español
Hola aun sigo sin poder crear la transaccion he intentado como me recomendaron pero me marca errores al momento de escribir la transaccion en firebird. podran ayudarme con lo mas sencillo que se pueda solo para probar que funcione y de ahi partir  para anexar los demas datos.
he dejado solo enviar a guardar dos campos cantidad y clave de producto y que me regrese el folio que se le asigno.
me podran ayudar con eso, es que de plano no le entiendo a la sintaxis del firebird.
posdata la transaccion se crea en nuevo procedimiento almacenado??
me podran poner un ejemplo asi como lo debo poner al omento de crear un nuevo procedimiento almacenado porfavor.

Esteban H.

unread,
Nov 25, 2017, 1:20:58 PM11/25/17
to publice...@googlegroups.com

Acá tenes resuelto en forma muy simple el tema de las transacciones desde VFP a Firebird.

https://firebird21.wordpress.com/2014/03/31/parametros-de-las-transacciones-usando-visual-foxpro/

 

Saludos

Lorenzo Lazos M

unread,
Nov 30, 2017, 4:20:44 PM11/30/17
to Comunidad de Visual Foxpro en Español
alguien sabe como recuperar los datos devueltos por unprocedimiento almacenado en visual basic? y como mandarlo llamar? 

Carlos Miguel FARIAS

unread,
Dec 1, 2017, 6:27:35 AM12/1/17
to Grupo Fox
Y hoy es viernes: No se responde sobre temas OT, pero sugiero que sobre VB consultes en un foro de VB.
Reply all
Reply to author
Forward
0 new messages