Hola nuestros usuarios detectaron un problema en la operacion exa00003 para la creación de mesas de examen. Si crean mas de una mesa por materia, confirman los datos, luego vuelven a entrar y borran todas, al confirmar, sale el siguiente error:
No puede borrar el registro, ya que el mismo está siendo utilizado en otra tabla. Referencia: "pk_prestamos".
El problema está en la ‘w_mesas_examen’, método ue_confirmar(), línea 60:
...
FOR li_fila =1 to ll_llamados_a_borrar
ds_llamados_a_borrar.uof_getclaves(ls_clave_llamado[],li_fila)
ds_llamados.Reset()
li60: ll_llamados_a_borrar = ds_llamados.Retrieve(ls_clave_llamado[1],ls_clave_llamado[3],ls_clave_llamado[2],ls_clave_llamado[5],ls_clave_llamado[4],ls_clave_llamado[6])
ds_llamados.DeleteRow(1)
// borro los llamados
IF ds_llamados.Update(True, False) <> 1 THEN
ib_grabar = False
destroy ds_llamados
THIS.SetReDraw(TRUE)
Return
END IF
NEXT
...
Cuando se ejecuta el retrieve, se sobreescribe ll_llamados_a_borrar (en este caso en 1, ya que devuelve una fila) y el for siempre termina en 1. Para solucionarlo, habría que sacar esa asignación (marcada en li60). Podría quedar:
...
FOR li_fila =1 to ll_llamados_a_borrar
ds_llamados_a_borrar.uof_getclaves(ls_clave_llamado[],li_fila)
ds_llamados.Reset()
li60: ds_llamados.Retrieve(ls_clave_llamado[1],ls_clave_llamado[3],ls_clave_llamado[2],ls_clave_llamado[5],ls_clave_llamado[4],ls_clave_llamado[6])
ds_llamados.DeleteRow(1)
// borro los llamados
IF ds_llamados.Update(True, False) <> 1 THEN
ib_grabar = False
destroy ds_llamados
THIS.SetReDraw(TRUE)
Return
END IF
NEXT
...
Después también en el método ue_borrar_mesa(), línea 68:
// paso los llamados a borrar al ds que los acumula
dw_2.Rowscopy (1, dw_2.deletedCount(), Delete!, ds_llamados_a_borrar, 1, Primary!)
Habría que cambiar el 1 de la posición del target DW, por la cantidad de filas + 1, ya que si no en varios borrados las sobreescribiría al empezar siempre de la posición 1. Podría reemplazarse por:
dw_2.Rowscopy (1, dw_2.deletedCount(), Delete!, ds_llamados_a_borrar, ds_llamados_a_borrar.rowCount() + 1, Primary!)
Nosotros hicimos esas modificaciones, probamos, y funcionó borrar varias mesas.
Saludos!
Luciano