Problema al obtener id_last en FoxyDB 2.5 con Firebird 3.0

70 views
Skip to first unread message

mbanco

unread,
Aug 19, 2016, 10:39:39 AM8/19/16
to Comunidad de Visual Foxpro en Español
Buenas,
Tengo un problema con el FoxyDB 2.5 al insertar un nuevo registro en Firebird 3.0, ya que siempre devuelve la propiedad id_last igual a cero, después de ejecutar la función commit. Será un problema de la versión del Firebird?

Gracias  

Antonio Meza

unread,
Aug 19, 2016, 10:52:13 AM8/19/16
to Comunidad de Visual Foxpro en Español
Cuando haces odb.Update("tabla", .t.) si estas indicando el .t. para indicar que quieres obtener el ultimo ID ? 

saludos
Antonio Meza

mbanco

unread,
Aug 19, 2016, 11:08:36 AM8/19/16
to Comunidad de Visual Foxpro en Español
El update los ejecuto como update(tabla, campo_id, .T.) , pero sigue entregando un cero en la propiedad id_last.

Saludos

Mauricio

Antonio Meza

unread,
Aug 19, 2016, 11:13:35 AM8/19/16
to Comunidad de Visual Foxpro en Español
No lo he probado con firebird 3, no se si algo cambio.

Pero si tienes bien configurado tu campo autoincrementable?

mbanco

unread,
Aug 19, 2016, 11:23:21 AM8/19/16
to Comunidad de Visual Foxpro en Español
Si, así está configurado. Además cuando consulto la tabla después del commit, se verifica que el campo id está correctamente actualizado.

Antonio Meza

unread,
Aug 19, 2016, 11:35:35 AM8/19/16
to Comunidad de Visual Foxpro en Español
Puedes poner el codigo donde haces el update y commit

mbanco

unread,
Aug 19, 2016, 11:43:56 AM8/19/16
to Comunidad de Visual Foxpro en Español
PROCEDURE grabar_cursor(m_conex, m_tabla, m_clave, m_error_msg)

IF m_conex.CursorChanges(m_tabla)

IF m_conex.UPDATE(m_tabla, m_clave, .T.)

IF !m_conex.Commit()

m_error = m_conex.error_array[5]

m_error_msg = m_conex.error_array[2]

m_conex.UNDO()

RETURN m_error

ELSE

m_error_msg = ""

RETURN 0

ENDIF

ELSE

m_error = m_conex.error_array[5]

m_error_msg = m_conex.error_array[2]

m_conex.UNDO()

RETURN m_error

ENDIF

ELSE

m_error_msg = ""

m_conex.UNDO()

RETURN 0

ENDIF


ENDPROC

Antonio Meza

unread,
Aug 19, 2016, 11:57:34 AM8/19/16
to Comunidad de Visual Foxpro en Español
Pero donde estas consultado el valor del ultimo id? deberías de verificarlo después del update para ver si lo obtuvo,

IF m_conex.CursorChanges(m_tabla)

 IF m_conex
.UPDATE(m_tabla, m_clave, .T.)

       
messagebox(m_conex.id_last, "ultimo Id")
 IF
!m_conex.Commit()

saludos

mbanco

unread,
Aug 19, 2016, 12:02:25 PM8/19/16
to Comunidad de Visual Foxpro en Español
Sigue devolviendo cero.

mbanco

unread,
Aug 22, 2016, 8:26:54 AM8/22/16
to Comunidad de Visual Foxpro en Español
Hola Antonio,
Pudiste detectar donde está el problema con la obtención del último ID?

Gracias.

Antonio Meza

unread,
Aug 22, 2016, 11:00:28 AM8/22/16
to Comunidad de Visual Foxpro en Español
Hola, no tengo firebird 3, para poder hacer la prueba.

Has revisado la ayuda de firebird 3 de como se obtiene el ultimo id para ver si no cambio?

saludos

mbanco

unread,
Aug 22, 2016, 1:30:00 PM8/22/16
to Comunidad de Visual Foxpro en Español
Antonio, efectué la siguiente corrección y funcionó:

PROCEDURE Id
LOCAL __idNotReturned, __notAvailable, __idReturned, __commandSql
* Id
* Obtener el Ultimo ID al insertar un Registro Nuevo, el valor se obtiene en la propiedad .id_Last
* Parámetros
* No Requiere
* Valor devuelto
* true Ultimo ID obtenido
* false No se pudo obtener el Ultimo ID
* Error Devuelto
__idNotReturned = -1 && ID no obtenido
__notAvailable = 0 && No disponible
__idReturned = 1 && ID Obtenido
__commandSql = "" && Comando SQL según el motor de base de datos
this.Id_last = 0 && Iniciar valor de Ultimo ID Insertando en Cero
* Generar Comando Sql
DO CASE
CASE this.engine = this.mySql
__commandSql = "SELECT LAST_INSERT_ID() as id"
CASE this.engine = this.mariaDb
__commandSql = "SELECT LAST_INSERT_ID() as id"
CASE this.engine = this.fireBird
IF USED("foxydb_last_id")
*!* this.id_last = foxydb_last_id.id
__id_name = this.id_name
this.id_last = foxydb_last_id.&__id_name
USE IN foxydb_last_id
RETURN this.Post(Program(),__idReturned,true)
ELSE
RETURN this.Post(Program(),__idNotReturned,false)
ENDIF
CASE this.engine = this.postgreSql
RETURN this.Post(Program(),__notAvailable,false)
CASE this.engine = this.sqlServer
RETURN this.Post(Program(),__notAvailable,false)
ENDCASE
* Obtener Ultimo Id
IF this.Sql(__commandSql,"foxydb_last_id")
this.id_last = INT(VAL(foxydb_last_id.id))
USE IN foxydb_last_id
RETURN this.Post(Program(),__idReturned,true)
ELSE
RETURN this.Post(Program(),__idNotReturned,false)
ENDIF
ENDPROC
Reply all
Reply to author
Forward
0 new messages