[SOLUCIONADO] Objeto w_modificar_datos_personales

Buenos dias, estoy modificando la ventana de datos personales del alumno (mat00019), agregue un nuevo campo que indica si el alumno trabaja o no. Cree una tabla en la BD sga_alumno_trabaja y dos SP para insertar y borrar el legajo en dicha tabla.


CREATE TABLE sga_alumno_trabaja (legajo VARCHAR(15) NOT NULL) ; ALTER TABLE sga_alumno_trabaja ADD CONSTRAINT ( PRIMARY KEY ( legajo ) CONSTRAINT PK_sga_alumno_trabaja ) ;

sp_insert_alumno_trabaja(plegajo LIKE sga_alumno_trabaja.legajo) returning varchar(15);

sp_delete_alumno_trabaja(plegajo LIKE sga_alumno_trabaja.legajo) ;


En el PW, modifique el objeto w_modificar_datos_personales con el siguiente codigo:

DECLARE sp_insertalumnotrabaja PROCEDURE FOR sp_insert_alumno_trabaja (:ls_nro_inscripcion);

/* Ejecuta el Stored Procedure */
EXECUTE sp_insertalumnotrabaja;

/* Si tuvo un error /
If SQLCA.SqlCode = -1 Then
guo_app.msg.uof_SetdbError(SQLCA.SQLDBCode, SQLCA.SQLErrText)
CLOSE sp_insertalumnotrabaja;
ib_grabar = False
Return
Else
If SQLCA.SqlCode = 0 Then
/
Cierra el SP. Si SqlCode = 100, el cursor se cierra solo */
CLOSE sp_insertalumnotrabaja;
End If
End If

Lo estoy depurando con el debugger, pero no me tira ningun error en el codigo y tampoco esta grabando el registro en la BD.
¿Alguna sugerencia u orientacion de donde puede estar el problema?
Muchas Gracias

Hola

La condicion de actividad de una persona (no un alumno) se encuentra en las tablas de datos censales con lo cual yo te diría que la uses.

Por otro lado. Vos estás creando una tabla solo con el legajo del alumno pero al sp le estas pasando el nro_inscripcion, el cual puede involucrar a mas de un alumno.
Además habría que ver donde pusistes ese código y que hace el sp.

Emilio

Hola Emilio, el control de datos censales lo carga el alumno, este campo nuevo seria para ser cargado en division alumnos con certificado de trabajo. En cuanto a la tabla se usa indistitnto el legajo y nro_inscripcion porque es el mismo. Por eso queria agregar el codigo que te pase, en el Power Builder en el objeto w_modificar_datos_censales en ue_confirmar() y no me tira ningun error. No se como hacerlo funcionar, pareciera que lo ignora el codigo porque no inserta ni tira error.

Saludos

Hay dos puntos.
Vos modificastes la ventana y la grabastes en la misma libreria?
Podés pasarme el código del sp_insert_alumno_trabaja?

Emilio

Pablo:

En la Facultad de Odontología de la UBA hicimos una personalización justamente para eso que ustedes quieren, pero la independizamos completamente de la carga de los datos de inscripción del alumno, ya que la presentación del certificado la tienen que hacer cada año o cada inscripcion.

Se registra que alumno dice que trabaja, y por separado si presentó o no el certificado en ese período lectivo.

Me parece que no te conviene personalizar eso y eventualmente tomar esa personalización y modificarla de acuerdo a tus necesidades.

Actualmente no trabajamos más en esa institución, pero pienso que la podés obtener a través del SIU que siguen en contacto con la facultad. Si no es así, avisame y veo de conseguirla de alguna manera.

Saludos

Gustavo

Hola Emilio, estoy haciendo una prueba modificando directamente sobre la ventana w_modificar_datos_personales en la funcion ue_modificar() con el codigo que puse en el mensaje anterior.
Aca te paso el codigo de sp:

CREATE PROCEDURE “dba”.sp_insert_alumno_trabaja(plegajo LIKE sga_alumno_trabaja.legajo) returning varchar(15);
DEFINE total INTEGER;

DEFINE SQLErr integer ;
DEFINE ISAMError integer ;
DEFINE errorInfo varchar(76) ;

– si hay algun error
ON EXCEPTION SET SQLErr, ISAMError, errorInfo
RAISE EXCEPTION SQLErr, ISAMError, errorInfo ;
END EXCEPTION;
BEGIN
INSERT INTO sga_alumno_trabaja VALUES(plegajo);

Return plegajo;

END;
END PROCEDURE

Saludos
Pablo

Hola

Tendría que ir en ue_confirmar dentro de un

if ib_grabar then
… tu código
end if

Emilio

Te paso el codigo de la ventana w_modificar_datos_personales con las modificaciones que le hice.

Saludos
Pablo


ese es el evento ue_confirmar?
de que versión?

te faltaría el

if ib_grabar then

end if

de manera que si falla la grabación de lo anterior no grabe eso.
La mas aconsejable es generar una herencia de la ventana, poner en ue_confirmar el codigo tuyo y luego modificar el dca de la operación.

Emilio

Si el codigo es de la funcion ue_confirmar(), no entiendo en que parte tengo que agregar el codigo (if ib_grabar then end if) ?
porque esta al final de la funcion, mi idea es probar que ande primero asi, y despues si lo logro lo hago mas personalizado.

Pablo

la idea es que el codigo tuyo se ejecute si la grabación anterior fue correcta.
despues del primer modificacion mar del plata pones
if ib_grabar then

y antes del último el

end if

El flag ib_grabar te marca si una grabacion fue correcta o no. Si lo anterior no se grabó correctamente no debería seguir grabando nada.

if ib_grabar then
DECLARE sp_insertalumnotrabaja PROCEDURE FOR sp_insert_alumno_trabaja (:ls_nro_inscripcion);

/* Ejecuta el Stored Procedure */
EXECUTE sp_insertalumnotrabaja;

/* Si tuvo un error /
If SQLCA.SqlCode = -1 Then
guo_app.msg.uof_SetdbError(SQLCA.SQLDBCode, SQLCA.SQLErrText)
CLOSE sp_insertalumnotrabaja;
ib_grabar = False
Return
Else
If SQLCA.SqlCode = 0 Then
/
Cierra el SP. Si SqlCode = 100, el cursor se cierra solo */
CLOSE sp_insertalumnotrabaja;
End If
End If

END IF

Ya se lo agregue al codigo el if, pero sigue sin pasar nada. No se donde estara el problema pero me preocupa que no tira ningun error cuando lo depuro.

cuando lo depures fijate en el objeto SQLCA a ver si te dá mas información.

Precisamente no detecto nada al depurar, te envio una imagen con las variables del sqlca


ahi le agregué un fetch (y una variable) para que recupere lo que esta devolviendo el procedure. fijate que pasa.

string ls_nro_inscripcion_devuelto
if ib_grabar then
DECLARE sp_insertalumnotrabaja PROCEDURE FOR sp_insert_alumno_trabaja (:ls_nro_inscripcion);

/* Ejecuta el Stored Procedure */
EXECUTE sp_insertalumnotrabaja;

/* Si tuvo un error /
If SQLCA.SqlCode = -1 Then
guo_app.msg.uof_SetdbError(SQLCA.SQLDBCode, SQLCA.SQLErrText)
CLOSE sp_insertalumnotrabaja;
ib_grabar = False
Return
Else
FETCH sp_insertalumnotrabaja INTO :ls_nro_inscripcion_devuelto ;
If SQLCA.SqlCode = -1 THEN
guo_app.msg.uof_SetdbError(SQLCA.SQLDBCode, SQLCA.SQLErrText)
ib_grabar = FALSE
Return
End If
If SQLCA.SqlCode = 0 Then
/
Cierra el SP. Si SqlCode = 100, el cursor se cierra solo */
CLOSE sp_insertalumnotrabaja;
End If
End If

END IF

Hola Emilio, ahi probe el codigo que mandaste y lo inserta perfectamente el registro, con el FETCH la variable recibe el numero de legajo que es lo que devolvia el Store, mi duda es la siguiente yo le saco el FETCH al codigo y deja de insertar. Me podrias decir que es lo que lo modifica tanto para que de una manera graba y de la otra no?

Muchas Gracias

Pablo

segun dice powerbuilder trae el codigo de retorno del procedure y el resultset.
pero para mi, recien se ejecuta el procedure cuando haces el fetch.
lo que no estoy muy seguro es los procedures que no retornan nada.

Muchas gracias Emilio, ya sabemos para la proxima.

Saludos

pd. Tema cerrado :slight_smile: