Saber si existe un dato en la base y que muestre un error

Resulta que tengo una pequeña aplicación que inactiva una cantidad de datos... Lo hace basado en este código..

UPDATE obligaciones
SET vigencia='INACTIVA'
WHERE obligación = :obligacion_a_inactivar
AND vigencia = 'ACTIVA'
AND contrato= :contrato
USING DBoracle;

El problema es que siguiente a eso llamo al siguiente código y pueden haber datos que ya están inactivados y sigue corriendo,, sigue inactivando todo le he cambiado el numero (<0) por el (=0) y hay si entra en el error pero no es lógico porque se dice que (0) es que todo esta ok...

if DBoracle.SQLCode < 0 then
MessageBox('Database Error', DBoracle.SQLErrText, StopSign!)
MessageBox('Erro|r del Sistema','Error al INACTIVAR OBLIGACIONES ... Avisar a Sistemas')
Rollback USING DBoracle;
MessageBox("Resultado",'El proceso fue Reversado', StopSign!);
else
commit USING DBoracle;
n_contador = n_contador + 1
end if

1 respuesta

Respuesta
1

Estimada, entiendo que el problema es el messagebox y su respectivo rollback, de no ser así corrígeme.

Por lo pronto, seria bueno saber que valor asume el sqlcode, quizás con un messagebox se pueda visualizar ficho valor:

Integer intSqlcode

UPDATE obligaciones
SET vigencia='INACTIVA'
WHERE obligación = :obligacion_a_inactivar
AND vigencia = 'ACTIVA'
AND contrato= :contrato
USING DBoracle;

intSqlcode = DBoracle.SQLCode

Messagebox("SQLcode", strign(intsqlcode))

Me comentas

El sqlcode me arroja 0, y si el problema es con el mensaje ...esta haciendo cosas ilogicas

Te agradecería que me ayudaras lo mas antes posible es urgente... :D

Si pruebas

if DBoracle.SQLCode <> 0 then

hace el mismo proceso..inactiva lo que ya esta inactivado..

creo que hay algo mal el ese IF como el rollback que decías o los mensajes es que no se

mmm.. ya me confundistes,

Plantea nuevamente tu problema, ya que cuando dices que inactiva lo que ya esta inactvo, me generas confusión.

es que ese es el problema debería mostrar error si ya están inactivadas, pero carga todo de igual forma así este activo o inactivo, y lo otro es que se requiere que muestre cuales convirtió a inactivos y cuantos ya lo estaban.....es para que no se repita ese proceso

a ver.. vamos por pasos

En tu query, en el update, tienes especificado en el where que afecte solo a aquello registros que están ACTIVOS, si fuese el caso que no ahí registros activos, y solo existan INACTIVOS, entonces el update se ejecutara pero no afectara ningún registro, pero el sqlcode seguirá con 0, ya que no ahí error, y sige el flujo por el commit y todo lo demás.

Si tu necesidad es validar que antes del update existan registros que actualizar, entonces antepón un select con un counbt, y evalúa si ahí data antes del update, con la misma clausula where, y evalúa ese resultado en un if, y de acuerdo a ello que se ejecute tu update.

Ahora también menciona mostrar, hasta donde veo tu query hace update, ningún select y tampoco veo dw. A que te refieres cuando dices muestra, mostrar, etc.

Lo de mostrar es que en un mensaje o en un sle me diga cuantas inactivo ya que pueden haber registros que ya estén inactivos entonces estos registros no los tiene que contar.....yo ya tengo un contador pero cuenta todo lo que muestra en el dw y necesito otro que muestre cuantas inactivo sin tener en cuenta las que ya se encontraban inactivas....

Tu primer párrafo es claro., pero cuando dices que si mi necesidad es validar antes del update no entendí...eso no necesito hacerlo creo.

Como dije al principio el problema es que me esta permitiendo cargar los datos al dw sin mostrar el error (que ya se encuentran inactivas) y no se cambiarle es eso...necesitas el código del dw o de alguna otra cosa para aclarar?

 

Estoy haciendo un select antes del update y me genera error con un insert que esta en la parte de abajo..

Muéstrame tu código completo, de dicho evento o función.

long fila,n, cod_razon, n_contador//,intSqlcode
String INACTIVAR
longcontrato_a_inactivar
integer Net;
string obligacion_a_inactivar
datetime fec_actual,fec_final;
Net = MessageBox("Resultado",'Esta seguro de Inactivar las obligaciones', Exclamation!, OKCancel!,1);
if Net = 1 then
pointer viejo_pointer
viejo_pointer=setpointer(Hourglass!)
fec_actual=f_fecha_actual();
n_contador = 0
DECLARE OBLIG_CURSOR CURSOR FOR
select contrato, obligación, vigencia
from obligaciones
where vigencia = 'ACTIVA'
AND contrato
in
(
select
contrato
from inactiva_obligaciones
where contrato = :contrato_a_inactivar)
USING DBORACLE;
OPEN OBLIG_CURSOR;
if DBoracle.sqlcode < 0 then
MessageBox("Error al realizar la inactivación", DBoracle.sqlerrtext)
end if
dw_inactivacion_masiva.SetRedraw(false)
dw_inactivacion_masiva.Reset( )
Do While DBoracle.sqlcode = 0
Fetch OBLIG_CURSOR into :INACTIVAR ;
//if DBoracle.sqlcode = 0 then
//dw_inactivacion_masiva.AddItem(INACTIVAR)
//elseif DBoracle.sqlcode < 0 then
// MessageBox("Error al realizar la inactivación", DBoracle.sqlerrtext)
//else
// exit
//end if
Loop
dw_inactivacion_masiva.SetRedraw(true)
Close OBLIG_CURSOR;
//dw_inactivacion_masiva.SelectItem(1)
fila = dw_inactivacion_masiva.RowCount ( )
if fila > 0 then
OpenWithParm(w_razones, "INACTIVACION")
cod_razon = long(Message.DoubleParm)
for n=1 to fila
obligacion_a_inactivar = dw_inactivacion_masiva.GetItemString(n,"obligación")
contrato_a_inactivar = dw_inactivacion_masiva.GetItemNumber(n,"contrato")
//if contrato <> contrato_a_inactivar then
//MessageBox("Resultado",'CONTRATO Seleccionado es diferente al Archivo CARGADO', StopSign!)
//MessageBox("Error",'NO SE PUDO realizar la INACTIVACION', StopSign!)
//Return
//else
//
UPDATE obligaciones
SET vigencia ='INACTIVA'
WHERE obligación = :obligacion_a_inactivar
AND vigencia = 'ACTIVA'
AND contrato= :contrato
USING DBoracle;
MessageBox('mensaje jesi', DBoracle.SQLCode)
//
//intSqlcode = DBoracle.SQLCode
//messagebox("SQLcode",string(intsqlcode))
//
if DBoracle.SQLCode < 0 then
MessageBox('Database Error', DBoracle.SQLErrText, StopSign!)
MessageBox('Erro|r del Sistema','Error al INACTIVAR OBLIGACIONES ... Avisar a Sistemas')
Rollback USING DBoracle;
MessageBox("Resultado",'El proceso fue Reversado', StopSign!);
else
commit USING DBoracle;
n_contador = n_contador + 1
end if
//end if
next
if n_contador = 0 then
MessageBox("Resultado",'No INACTIVO Obligaciones', Exclamation!);
else
fec_final=f_fecha_actual();
insert into actualizacion_bd
values('INACTIVACION',:contrato,'OBLIGACION',0,:n_contador,:cod_razon,
:fec_actual,:fec_final,:usuario)
USING DBoracle;
if DBoracle.SQLCode < 0 then
MessageBox('Database Error', DBoracle.SQLErrText, StopSign!)
MessageBox('Error del Sistema', 'Error al Actualizar ACTUALIZACION_BD ... Avisar a Sistemas')
Rollback USING DBoracle;
MessageBox("Resultado",'El proceso fue Reversado', StopSign!);
else
commit USING DBoracle;
MessageBox("Resultado",'proceso terminado correctamente', Exclamation!);
MessageBox("Resultado",'Se han INACTIVADO ' + string(n_contador) + ' Obligaciones', Exclamation!);
end if
end if
ELSE
MessageBox("Resultado",'No hay obligaciones para inactivar', Exclamation!);
end if
wf_limpiar()
setpointer(viejo_pointer)
end if

......................................................................................................

Como puedes ver agregue un cursor pero tampoco me funciona se va directamente al ultimo mensaje.....MessageBox("Resultado",'No hay obligaciones para inactivar', Exclamation!); o técnicamente debería hacerlo? no se bien

Cuando te sugería agregar un select para poder ver si habían registros aptos para actualizar acorde al where, pensaba algo como esto

integer liContador = 0
select count(*) into :liContador
from obligaciones
where vigencia = 'ACTIVA'
AND contrato in ( select contrato
from inactiva_obligaciones
where contrato = :contrato_a_inactivar)
USING DBORACLE;
if isnull(liContador) then liContador = 0
if liContador < 1 then
messagebox("Mensaje","No ahí datos para actualizar.")
return
end if

No le veo utilidad al cursor ya que almacenas la data en un string, pero de ahí no hace mas.

Una obs. Noto que después de tus mensajes, ya sea de error y/o advertencia, lo lógico es que si la idea es que no siga el flujo, le corresponde un return. Así como en el código que te comparto.

Al aplicar el select me manda al mensaje de que no hay datos para actualizar

o quizás esta mal ubicado en que parte tu crees que debe estar esa consulta que me mandaste

Mmmm..

Hasta ahora entiendo que la idea es evitar que siga el flujo, si es que no ahí data que actualizar, corrígeme si me equivoco.

Tengo una media hora de descanso...

Ponte las pilas y damos vuelta a tu dificultad ahora mismo.

pues no evitarlo...solo en caso de que no deba seguir osea cuando las obligaciones estén ya desactivadas de lo contrario si debe hacer todo normal....(a eso tu le llamas actualizar? o a que te refieres)

mejor dicho si cumplía el update que haga todo si no que se detenga...pero así lo incumpliera o no el me estaba haciendo todo el proceso; no se si tiene influencia pero esto es lo que tengo en el Open del Dw

Delete from obligaciones
WHERE obligación = :obligacion_a_inactivar
AND vigencia = 'INACTIVA'
USING DBoracle;

Mmmmmm..

Con el select obtengo el nro. de registros aptos para actualizar (Activos).

Si el contador es mayor a cero, entonces se debe de ejecutar la sentencia UPDATE, que tienes mas abajo, de lo contrario, si no ahí data se lanza el mensaje y un return para abandonar el flujo.

¿Esto es correcto?

de ser así continua contándome..

no depende solo de que el contador sea mayor a cero.,,,,,recuerdas lo de que podían ya estar inactivas pero de todas maneras seguía el proceso..es eso

Si ahí registros que ya están inactivos, ¿también se deben actualizar y/o inactivar nuevamente =?

En la primera consulta, en tu clausula where esta explicito que solo tome aquellos que están activos... por ello entiendo que solo interesan registros que aun estén activos.

Solo se debe reemplazar en la base de datos de las obligaciones que estén activas por inactivas, si algunas ya están inactivas que no haga nada mas...en el contador solo deben aparecer cuantas cambio..cuantas reemplazo por inactivas, las otras no las debería tener en cuenta

Si me hago entender?

Fíjate que intente con un registro que estaba ACTIVO y apareció el mensaje de que no hay datos por actualizar :(

Mmmm...¿?

Eso no debería ser posible.

¿Estas completamente segura?

Sabes usar Teamviewer, si es así, hacemos un remoto rapido, mientras nadie me vea xD!

mira lo que acabo de hacer el sistema....

Yo cambie el registro para que estuviera ACTIVOy así poder ver algo de diferencia en la ejecución y me apareció el error que te dije....

y acabe de ver en la base que ya esta de nuevo INACTIVO...osea no hizo el proceso pero si la inactiva

Mmmm...

Si salio el mensaje de que no existe datos para actualizar, y si esta con su respectivo return.

El update que se supone pone como INACTIVA dicha data, no debería de ejecutarse.

Prueba de nuevo, y checa que este el return correspondiente, o si deseas pon un messagebox antes del update, solo para ver si llega hasta ahí.

yo creo que algo mas allá de ese código esta afectando eso...como el evento open de la ventana o el insert no sera? te mando los codigos'

mejor dame un remoto...

Así lo veo todo.. y te pregunto y me respondes de una..

De no ser posible, adjunta tu código de manera secuencial, osea que se ejecuta primero y el nombre de los respectivos eventos.

no, no llega hasta allá....yo creo que esta mal ubicado

mira que lo cambie de lugar y si llego hasta allá.....el sqlcode me devolvio 0

No sale de la consulta que me pasaste ahora.....carga como si fuera a inactivar todo y habiendo un registro ACTIVO no lo cambia y muestra el error de que no hay datos para actualizar

Pues..

Si el select que cuenta los registros, lo pones después del update, lo único que hará es validar después de haber ejecutado.

Pero aun así, de acuerdo al where, tu update no debe de actualizar nada, a excepción de los registro que ya están inactivos y cumplan el resto de la condición where.

El sqlcode, mientras no tenga error de sintaxis te devolverá 0.

yo te mando códigos porque no puedo usar ese programa

En el OPEN de la ventana:

string obligacion_a_inactivar
Delete from obligaciones
WHERE obligación = :obligacion_a_inactivar
AND vigencia = 'INACTIVA'
USING DBoracle;

disable(m_radicacion.m_archivo.m_buscar)
disable(m_radicacion.m_edicion.m_borrar)
disable(m_radicacion.m_edicion.m_actualizar)
enable(m_radicacion.m_edicion.m_insertar)
dw_inactivacion_masiva.SetTransobject(DBoracle)

En el insert de la ventana:

integer seguro
long contador_fila
seguro = MessageBox("Subir Tabla", "Esta seguro de Importar a la TABLA para inactivar obligaciones ?", &
Exclamation!, OKCancel!, 1)
IF seguro = 1 THEN
DELETE FROM INACTIVA_OBLIGACIONES
commit USING DBoracle;
dw_inactivacion_masiva.ImportFile("c:\planos\inactivacion_archivo.txt")
dw_inactivacion_masiva.UPDATE ();
commit using DBoracle;
dw_inactivacion_masiva.retrieve()
contador_fila= dw_inactivacion_masiva.RowCount ( )
sle_obligaciones.text = string (contador_fila)
END IF

En el botón inactivar, clicked:


long fila,n, cod_razon, n_contador
String INACTIVAR
long contrato_a_inactivar
integer Net;
string obligacion_a_inactivar

datetime fec_actual,fec_final;


Net = MessageBox("Resultado",'Esta seguro de Inactivar las obligaciones', Exclamation!, OKCancel!,1);
if Net = 1 then
pointer viejo_pointer
viejo_pointer=setpointer(Hourglass!)
fec_actual=f_fecha_actual();
n_contador = 0

fila = dw_inactivacion_masiva.RowCount ( )
if fila > 0 then
OpenWithParm(w_razones, "INACTIVACION")
cod_razon = long(Message.DoubleParm)
for n=1 to fila
obligacion_a_inactivar = dw_inactivacion_masiva.GetItemString(n,"obligación")
contrato_a_inactivar = dw_inactivacion_masiva.GetItemNumber(n,"contrato")

integer liContador = 0
select count(*) into :liContador
from obligaciones
where vigencia = 'ACTIVA'
AND contrato in ( select contrato
from inactiva_obligaciones
where contrato = :contrato)
USING DBORACLE;
if isnull(liContador) then liContador = 0
if liContador < 1 then
messagebox("Mensaje","No hay datos para actualizar.")
return
end if

UPDATE obligaciones
SET vigencia ='INACTIVA'
WHERE obligación = :obligacion_a_inactivar
AND vigencia = 'ACTIVA'
AND contrato= :contrato
USING DBoracle;

if DBoracle.SQLCode < 0 then
MessageBox('Database Error', DBoracle.SQLErrText, StopSign!)
MessageBox('Erro|r del Sistema','Error al INACTIVAR OBLIGACIONES ... Avisar a Sistemas')
Rollback USING DBoracle;
MessageBox("Resultado",'El proceso fue Reversado', StopSign!);
else
commit USING DBoracle;
n_contador = n_contador + 1
end if

next
if n_contador = 0 then
MessageBox("Resultado",'No INACTIVO Obligaciones', Exclamation!);
else
fec_final=f_fecha_actual();
insert into actualizacion_bd
values('INACTIVACION',:contrato,'OBLIGACIÓN',0,:n_contador,:cod_razon,
:fec_actual,:fec_final,:usuario)
USING DBoracle;
if DBoracle.SQLCode < 0 then
MessageBox('Database Error', DBoracle.SQLErrText, StopSign!)
MessageBox('Error del Sistema', 'Error al Actualizar ACTUALIZACION_BD ... Avisar a Sistemas')
Rollback USING DBoracle;
MessageBox("Resultado",'El proceso fue Reversado', StopSign!);
else
commit USING DBoracle;
MessageBox("Resultado",'proceso terminado correctamente', Exclamation!);
MessageBox("Resultado",'Se han INACTIVADO ' + string(n_contador) + ' Obligaciones', Exclamation!);
end if
end if
ELSE
MessageBox("Resultado",'No hay obligaciones para inactivar', Exclamation!);
end if
wf_limpiar()
setpointer(viejo_pointer)
end if

si te das cuenta que tengo dos contadores el primero muestra la cantidad de registro que cargo del archivo...y el otro el que tu me pasaste como hago para que se muestren después de haber hecho el proceso que se supone que mostrara la cantidad de los nuevos inactivos

es como si algo fallara porque arreglo cosas para que me salga todo bn y sigue ese mensaje...sabiendo que si hay datos por actualizar

dame chance...

Entiendo que deseas saber cuantos registro fueron actualizados.. o inactivados..

cuando dices insert de las ventana, ¿Es un evento de usuario?

si, es un evento creado

Esto de aquí

obligacion_a_inactivar = dw_inactivacion_masiva.GetItemString(n,"obligación")
contrato_a_inactivar = dw_inactivacion_masiva.GetItemNumber(n,"contrato")

¿Estos dos datos son lo mismo para todos los registros por cada archivo que subes?

¿O evalúas por cada registro?

Con eso si no estoy mal hace el evalúo por registro , es que una parte de este código no la desarrollé

Mmm

Pregunta,

en esta variable "contrato_a_inactivar" lees el contrato,

pero mas abajo en el select y el update ahí otra variable "contrato" que no recibe ninguna valor, ¿Esto es correcto?

es que antes de enviártelo lo cambie, que pena , esa sigue siendo contrato_a_inactivar

claro no se como no lo vi....y mira que lo ejecute con el cambio por la variable correcta, y me sale que inactivo 3894 obligaciones sabiendo que solo cargo 1161.....sera que falta otro filtro tu que piensas?

Debo entender que a "contrato" lo cambiaste por "contrato_a_inactivar", luego ahí otra cosa,

Este query

AND contrato in ( select contrato
from inactiva_obligaciones
where contrato = :contrato_a_inactivar)

Que esta en el where del update y del select, me da la sensación que da lo mismo que pongas directamente:

AND contrato = :contrato_a_inactivar

¿

?

Y mira que le doy aceptar y se reduce el numero de obligaciones que inactivo salen como 2144 y después solo 5...eso esta raro

si es cierto hice algo obvio

Je je, mandame tu nuevo query, si fueras amiga mía, ya irías debiendo un almuerzo, :D

Solo el del evento donde actualizas.

Una cosa aparte, en el tu evento open.. la variable "obligacion_a_inactivar", recién se carga en el botón que usas para inactivar, el evento open se lanza antes de todo, antes que tu otro evento de insertar, por ende esa variable no tiene valor alguno, presiento que ese delete no hace nada.

long fila,n, cod_razon, n_contador
String INACTIVAR
longcontrato_a_inactivar
integer Net;
string obligacion_a_inactivar
datetime fec_actual,fec_final;
Net = MessageBox("Resultado",'Esta seguro de Inactivar las obligaciones', Exclamation!, OKCancel!,1);
if Net = 1 then
pointer viejo_pointer
viejo_pointer=setpointer(Hourglass!)
fec_actual=f_fecha_actual();
n_contador = 0

fila = dw_inactivacion_masiva.RowCount ( )
if fila > 0 then
OpenWithParm(w_razones, "INACTIVACION")
cod_razon = long(Message.DoubleParm)
for n=1 to fila
obligacion_a_inactivar = dw_inactivacion_masiva.GetItemString(n,"obligacion")
contrato_a_inactivar = dw_inactivacion_masiva.GetItemNumber(n,"contrato")

integer liContador = 0
select count(*) into :liContador
from obligaciones
where vigencia = 'INACTIVA'
AND contrato = :contrato_a_inactivar
USING DBORACLE;
if isnull(liContador) then liContador = 0
if liContador < 1 then
messagebox("Mensaje","No hay datos para actualizar.")
return
else
MessageBox('Cantidad de inactivaciones','Se han INACTIVADO ' + string(liContador) + ' Obligaciones', Exclamation!);
end if
UPDATE obligaciones
SET vigencia ='INACTIVA'
WHERE obligacion = :obligacion_a_inactivar
AND vigencia = 'ACTIVA'
AND contrato= :contrato
USING DBoracle;

if DBoracle.SQLCode < 0 then
MessageBox('Database Error', DBoracle.SQLErrText, StopSign!)
MessageBox('Erro|r del Sistema','Error al INACTIVAR OBLIGACIONES ... Avisar a Sistemas')
Rollback USING DBoracle;
MessageBox("Resultado",'El proceso fue Reversado', StopSign!);
else
commit USING DBoracle;
n_contador = n_contador + 1
end if

next
if n_contador = 0 then
MessageBox("Resultado",'No INACTIVO Obligaciones', Exclamation!);
else
fec_final=f_fecha_actual();
insert into actualizacion_bd
values('INACTIVACION',:contrato,'OBLIGACION',0,:n_contador,:cod_razon,
:fec_actual,:fec_final,:usuario)
USING DBoracle;
if DBoracle.SQLCode < 0 then
MessageBox('Database Error', DBoracle.SQLErrText, StopSign!)
MessageBox('Error del Sistema', 'Error al Actualizar ACTUALIZACION_BD ... Avisar a Sistemas')
Rollback USING DBoracle;
MessageBox("Resultado",'El proceso fue Reversado', StopSign!);
else
commit USING DBoracle;
MessageBox("Resultado",'proceso terminado correctamente', Exclamation!);
MessageBox("Resultado",'Se han INACTIVADO ' + string(n_contador) + ' Obligaciones', Exclamation!);
end if
end if
ELSE
MessageBox("Resultado",'No hay obligaciones para inactivar', Exclamation!);
end if
wf_limpiar()
setpointer(viejo_pointer)
end if

Eres el experto jajaja y si otra cosa que es lógica, pero mira que si hace hace ese proceso borrar datos de la tabla temporal y cargarlos con el archivo subido

y si te das cuenta del menssaje que tengo de la cantidad de inactivaciones....cada vez que le doy aceptar disminuye el numero que muestra

Pregunta:

Tienes un for que recorre todo el dw, leyendo el valor de obligación y contrato,

Entonces valida tanto el select y el update para que inactive los registro correspondientes a dichos datos, y entiendo que si o si debería de recorrer todo el dw, y mostrarte cuantos registros se inactivaron, eso entiendo con el contador que tienes debajo, y luego mandas un messagebox con el nro de registros INACTIVADOS..

¿Esto es todo lo que debe hacer tu flujo?

si eso es lo que vez..si porque pues el cambio es lo otro de que inactive solo las activas...y todo ese rollo

Que opinas de este código,

long fila,n, cod_razon, n_contador
String INACTIVAR
longcontrato_a_inactivar
integer Net;
string obligacion_a_inactivar
datetime fec_actual,fec_final;
Net = MessageBox("Resultado",'Esta seguro de Inactivar las obligaciones', Exclamation!, OKCancel!,1);
if Net = 1 then
pointer viejo_pointer
viejo_pointer=setpointer(Hourglass!)
n_contador = 0
fila = dw_inactivacion_masiva.RowCount ( )
if fila > 0 then
OpenWithParm(w_razones, "INACTIVACION")
cod_razon = long(Message.DoubleParm)
for n=1 to fila
fec_actual=f_fecha_actual();
obligacion_a_inactivar = dw_inactivacion_masiva.GetItemString(n,"obligacion")
contrato_a_inactivar = dw_inactivacion_masiva.GetItemNumber(n,"contrato")
integer liContador = 0
//Averiguamos si ahi data ACTIVA para inactivarla
select count(*) into :liContador
from obligaciones
WHERE obligacion = :obligacion_a_inactivar
AND vigencia = 'ACTIVA'
AND contrato= :contrato_a_inactivar
USING DBORACLE;
if isnull(liContador) then liContador = 0
//Si es mayor a cero, si ahi data, entonces se actualiza para inactivarla
if liContador > 0 then
UPDATE obligaciones
SET vigencia ='INACTIVA'
WHERE obligacion = :obligacion_a_inactivar
AND vigencia = 'ACTIVA'
AND contrato= :contrato_a_inactivar
USING DBoracle;
if DBoracle.SQLCode <> 0 then
MessageBox('Database Error', DBoracle.SQLErrText, StopSign!)
MessageBox('Erro|r del Sistema','Error al INACTIVAR OBLIGACIONES ... Avisar a Sistemas')
Rollback USING DBoracle;
MessageBox("Resultado",'El proceso fue Reversado', StopSign!);
return //Abandonamos todo
exit
else
commit USING DBoracle;
//liContador ya tiene el nro de registros que seran afectador por el update, asi que se re-utiliza
n_contador = n_contador + liContador
end if
fec_final=f_fecha_actual();
//Aqui sugiero que tb ingreses que obligacion se inactivo
insert into actualizacion_bd
values('INACTIVACION',:contrato_a_inactivar,'OBLIGACION',0,:n_contador,:cod_razon,
:fec_actual,:fec_final,:usuario)
USING DBoracle;
if DBoracle.SQLCode < 0 then
MessageBox('Database Error', DBoracle.SQLErrText, StopSign!)
MessageBox('Error del Sistema', 'Error al Actualizar ACTUALIZACION_BD ... Avisar a Sistemas')
Rollback USING DBoracle;
MessageBox("Resultado",'El proceso fue Reversado', StopSign!);
else
commit USING DBoracle;
MessageBox("Resultado",'proceso terminado correctamente', Exclamation!);
MessageBox("Resultado",'Se han INACTIVADO ' + string(n_contador) + ' Obligaciones', Exclamation!);
end if
next
if n_contador = 0 then
MessageBox("Resultado",'No INACTIVO Obligaciones', Exclamation!);
else
MessageBox("Resultado",'Se inactivaron ' + string(n_contador) + " registros!", information!);
end if
wf_limpiar()
setpointer(viejo_pointer)
end if

Ahora ahí cosas que mejorar, por ejemplo, el manejo de commit y rollback, creo que este proceso iría mejor en un procedimiento almacenado, donde tienes mayor control de estas funciones.

También muchos messagebox, es un proceso masivo, entonces tiene que ser lo mas limpio y rapido posible. Y cada messagebox es una interrupción donde necesita la intervención del usuario, para darle aceptar.

Consulta, cuantos registros ahí como mínimo en uno de esos archivos que importar al dw, y 2do, me copias el contenido o adjuntas un archivo para darme una idea...

Y corrige estas lineas

if DBoracle.SQLCode <> 0 then
MessageBox('Database Error', DBoracle. SQLErrText, StopSign!)
MessageBox('Error del Sistema', 'Error al Actualizar ACTUALIZACION_BD ... Avisar a Sistemas')
Rollback USING DBoracle;
else
commit USING DBoracle;
MessageBox("Resultado",'proceso terminado correctamente', Exclamation!);
end if

estoy en ese proceso yo te aviso como me va

De haber solucionado tu dificultad, Solicitaría que cierres y califiques la pregunta.

Caso contrario se esta abierto a aclaraciones!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas