Ir al contenido


Foto

[RESUELTO] problemas con procedimiento


  • Por favor identifícate para responder
15 respuestas en este tema

#1 FELIX

FELIX

    Advanced Member

  • Miembros
  • PipPipPip
  • 123 mensajes

Escrito 28 septiembre 2011 - 04:39

saludos.

tengo problemas al cambiar de firebird 1.5 a 2.5 con un procedimiento alguien me puede ayudar por favor es importante  .

En firebird 1.5 funciona bien pero en 2.5 saca una falla

fmprocView_1.StoredProc:
This column cannot be update becauseit is derived from an sql fuction or expression. attempted update of read-only column.

este es el codigo del procedimiento


CREATE PROCEDURE PRO_DELACTIVIDADPYP (
    IDCAB_FAC INTEGER,
    ID_DETFAC INTEGER)
ASdeclare variable cantidad1 integer;
declare variable fecha_fac date;
declare variable idcab_fac1 integer;
declare variable maximo integer;
declare variable medida_pyp integer;
declare variable id_actxprog integer;
declare variable id_paciente integer;
declare variable cantidad integer;
declare variable id_historicopyp integer;
declare variable hayejecutadas integer;
declare variable esquemaactivo integer;
BEGIN
/*
select  distinct planeacionxesquema.id_plaxactxpro from planeacionpyp
inner join planeacionxesquema on (planeacionpyp.id_planxactxpro = planeacionxesquema.id_plaxactxpro)
where planeacionpyp.idcab_fac=:idcab_fac and
planeacionxesquema.estado='T'
into :esquemaactivo;
*/
  /* Procedure body */
if (:ID_DETFAC=0) then
BEGIN
for select HISTORICO_PYP.id_historicopyp, HISTORICO_PYP.id_paciente,
historico_pyp.id_actpyp,  historico_pyp.cant from historico_pyp
where historico_pyp.idcab_fac=:idcab_fac
into :id_historicopyp, :id_paciente, :id_actxprog, :cantidad do
  begin
    if (:cantidad>0) then
    begin
      UPDATE PERSONAS_ACTIVIDADPYP
      SET NRO_ACTIVIDADES = (NRO_ACTIVIDADES + :CANTIDAD),
          ESQUEMA_TERMINADO = 'F'
      WHERE ID_ACTIVIDADPYP = :ID_ACTXPROG AND
      ID_PACIENTE = :ID_PACIENTE;

      DELETE FROM HISTORICO_PYP
      WHERE historico_pyp.id_historicopyp=:id_historicopyp;

      --SI ES UNA VACUNA, DEBE ELIMINAR EL HISTORICO DE LA DOSIS APLICADA
      DELETE FROM VACUNASXAFILIADO
      WHERE VACUNASXAFILIADO.ID_HISTORICOPYP = :ID_HISTORICOPYP;

    /*modificacion */
      select  distinct planeacionxesquema.id_plaxactxpro from planeacionpyp
      inner join planeacionxesquema on (planeacionpyp.id_planxactxpro = planeacionxesquema.id_plaxactxpro)
      where planeacionpyp.idcab_fac=:idcab_fac and
      planeacionxesquema.estado='T' and planeacionpyp.id_actxpro=:id_actxprog
      into :esquemaactivo;

      select count(*) from planeacionpyp
      inner join planeacionxesquema on (planeacionpyp.id_planxactxpro = planeacionxesquema.id_plaxactxpro)
      where planeacionpyp.ejecutado='T' AND
            planeacionpyp.id_paciente=:id_paciente and
            planeacionpyp.id_actxpro=:id_actxprog and
            planeacionxesquema.id_plaxactxpro=:esquemaactivo
      into :hayejecutadas;

      if (:hayejecutadas=1) then
      begin
          delete from planeacionpyp where
          planeacionpyp.id_planxactxpro=:esquemaactivo;

          delete from planeacionxesquema
          where planeacionxesquema.id_actxprog=:id_actxprog
          and planeacionxesquema.id_paciente=:id_paciente and
          planeacionxesquema.estado='T';
      end
      else if (:hayejecutadas>1) then
      Begin
        /*actualizacion de actividades ejecutadas*/
        update planeacionpyp set planeacionpyp.idcab_fac=Null,
        planeacionpyp.id_contrato=Null,
        planeacionpyp.cantidad=Null,  planeacionpyp.ejecutado='F', planeacionpyp.id_detfac=Null,
        planeacionpyp.id_contratops=null
        where planeacionpyp.id_paciente=:id_paciente and
        planeacionpyp.id_actxpro=:id_actxprog and
        planeacionpyp.idcab_fac=:idcab_fac;
      end
    end
  end
END
ELSE
  BEGIN
    select HISTORICO_PYP.id_historicopyp, HISTORICO_PYP.id_paciente,
    historico_pyp.id_actpyp,  historico_pyp.cant from historico_pyp
    where historico_pyp.idcab_fac=:idcab_fac and historico_pyp.id_detfac=:id_detfac
    into :id_historicopyp, :id_paciente, :id_actxprog, :cantidad;

    if (:cantidad>0) then
      begin
      UPDATE PERSONAS_ACTIVIDADPYP
      SET NRO_ACTIVIDADES = (NRO_ACTIVIDADES + :CANTIDAD),
          ESQUEMA_TERMINADO = 'F'
      WHERE ID_ACTIVIDADPYP = :ID_ACTXPROG AND
      ID_PACIENTE = :ID_PACIENTE;

      DELETE FROM HISTORICO_PYP
      WHERE historico_pyp.id_historicopyp=:id_historicopyp;

      --SI ES UNA VACUNA, DEBE ELIMINAR EL HISTORICO DE LA DOSIS APLICADA
      DELETE FROM VACUNASXAFILIADO
      WHERE VACUNASXAFILIADO.ID_HISTORICOPYP = :ID_HISTORICOPYP;

      select  distinct planeacionxesquema.id_plaxactxpro from planeacionpyp
      inner join planeacionxesquema on (planeacionpyp.id_planxactxpro = planeacionxesquema.id_plaxactxpro)
      where planeacionpyp.idcab_fac=:idcab_fac and
      planeacionxesquema.estado='T' and planeacionpyp.id_actxpro=:id_actxprog
      into :esquemaactivo;

      select count(*) from planeacionpyp
      inner join planeacionxesquema on (planeacionpyp.id_planxactxpro = planeacionxesquema.id_plaxactxpro)
      where planeacionpyp.ejecutado='T' AND
            planeacionpyp.id_paciente=:id_paciente and
            planeacionpyp.id_actxpro=:id_actxprog and
            planeacionxesquema.id_plaxactxpro=:esquemaactivo
      into :hayejecutadas;

      if (:hayejecutadas=1) then
      begin
          delete from planeacionpyp where
          planeacionpyp.id_planxactxpro=:esquemaactivo;

          delete from planeacionxesquema
          where planeacionxesquema.id_actxprog=:id_actxprog
          and planeacionxesquema.id_paciente=:id_paciente and
          planeacionxesquema.estado='T';
      end
    --else if (:hayejecutadas>1) then
      --Begin
        /*actualizacion de actividades ejecutadas*/
      /*  update planeacionpyp set planeacionpyp.idcab_fac=Null,
        planeacionpyp.id_contrato=Null,
        planeacionpyp.cantidad=Null,  planeacionpyp.ejecutado='F', planeacionpyp.id_detfac=Null,
        planeacionpyp.id_contratops=null
        where planeacionpyp.id_paciente=:id_paciente and
        planeacionpyp.id_actxpro=:id_actxprog and
        planeacionpyp.idcab_fac=:idcab_fac;
      end*/

  end

  END
  SUSPEND;
END

  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 28 septiembre 2011 - 04:51

Me parece que es una incompatibilidad en el campo fecha_fac porque no usas TIMESTAMP

SaludOS
  • 0

#3 FELIX

FELIX

    Advanced Member

  • Miembros
  • PipPipPip
  • 123 mensajes

Escrito 28 septiembre 2011 - 05:00

Gracias egostar por responder tan pronto..

Quiero hacer el cambio, pero cada vez que comento o hago algun cambio sale un error ("error de precompilacion. ¿continuar?").
q puedo hacer para realizar los cambios?
Gracias

  • 0

#4 FELIX

FELIX

    Advanced Member

  • Miembros
  • PipPipPip
  • 123 mensajes

Escrito 28 septiembre 2011 - 05:16

ya guarde los cambio pero sale el mismo error la fecha_fac la cambie a timestamp y sigue igual 
:cry:
  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 28 septiembre 2011 - 05:18

A ver si te sirve éste artículo que encontré

http://www.firebirdfaq.org/faq331/

SaludOS
  • 0

#6 FELIX

FELIX

    Advanced Member

  • Miembros
  • PipPipPip
  • 123 mensajes

Escrito 28 septiembre 2011 - 05:28

Muchas gracias con ese documento ya tengo una luz, revisare bn el codigo y te estare comentando,
Muchas Gracias. :smiley:

  • 0

#7 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 29 septiembre 2011 - 02:47

¿Sabes en que linea salta el error? Sería importante... yo quitaria lineas de UPDATE una a una hasta que deje de dar el error, y repasaría solo la linea "mala", aparte que si nos dices cual es seguramente "alguien sepa algo".

Por cierto, supongo que los campos que les haces un UPDATE no son ninguno calculados ni nada similar, seran todos campos "normales"... si fuesen calculados digo yo que FB 1.5 ya te lo habría dicho.

Otra posibilidad es que un update haga saltar un trigger de la tabla modificada y sea ese el trigger que te de el problema... no se si en ese caso saltaria el mensaje que comentas, pero podria ser que el codigo que muestras no sea el "culpable".

  • 0

#8 FELIX

FELIX

    Advanced Member

  • Miembros
  • PipPipPip
  • 123 mensajes

Escrito 29 septiembre 2011 - 08:09

Gracias Sergio por el concejo,les comento q al ir quitando lineas encontre la falla.

DELETE FROM VACUNASXAFILIADO
WHERE VACUNASXAFILIADO.ID_HISTORICOPYP = :ID_HISTORICOPYP

pero no se porque sale la falla.
en la tabla VACUNASAFILIADO existen lo campos  ID_VACUNASXAFIL q es la pk, ID_HISTORICOPYP, DOSIS, REFUERZO
  • 0

#9 FELIX

FELIX

    Advanced Member

  • Miembros
  • PipPipPip
  • 123 mensajes

Escrito 29 septiembre 2011 - 08:20

uuuupppppssssss, verificando nuevamente sigue saliendo el error comentando esa linea.  ya quite linea x linea y sigue saliendo
el error
  • 0

#10 FELIX

FELIX

    Advanced Member

  • Miembros
  • PipPipPip
  • 123 mensajes

Escrito 29 septiembre 2011 - 08:51

ahora si es veridico el error no sale cuando comento las lineas
una esta el el if y la otra en el else

UPDATE PERSONAS_ACTIVIDADPYP
      SET NRO_ACTIVIDADES = (NRO_ACTIVIDADES + :CANTIDAD),
          ESQUEMA_TERMINADO = 'F'
      WHERE ID_ACTIVIDADPYP = :ID_ACTXPROG AND
      ID_PACIENTE = :ID_PACIENTE;


UPDATE PERSONAS_ACTIVIDADPYP
      SET NRO_ACTIVIDADES = (NRO_ACTIVIDADES + :CANTIDAD),
          ESQUEMA_TERMINADO = 'F'
      WHERE ID_ACTIVIDADPYP = :ID_ACTXPROG AND
      ID_PACIENTE = :ID_PACIENT
  • 0

#11 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 29 septiembre 2011 - 09:09

Y estas seguro que esa columna (NRO_ACTIVIDADES) pertenece a la tabla PERSONAS_ACTIVIDADPYP??? que tipo de dato es esa columna?
  • 0

#12 FELIX

FELIX

    Advanced Member

  • Miembros
  • PipPipPip
  • 123 mensajes

Escrito 29 septiembre 2011 - 09:37

esa columna trae valores enteros.
aaah esa tabla tiene un disparador  PERSONAS_ACTIVIDADPYP_BU y el codigo es

AS
DECLARE VARIABLE BIOLOGICO VARCHAR(1);
BEGIN
  Select ACTXPROG.BIOLOGICO
  from ACTXPROG
  where ACTXPROG.ID_ACTXPROG = old.ID_ACTIVIDADPYP
  into :Biologico;
 
  if (:biologico = 'T') then
    old.ESQUEMA_TERMINADO = 'T';
  /* Trigger body */
END


Cuando quiero desactivar el disparador sale el mismo error  :cry: :cry:

  • 0

#13 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 29 septiembre 2011 - 12:54

esa columna trae valores enteros.
aaah esa tabla tiene un disparador  PERSONAS_ACTIVIDADPYP_BU y el codigo es

AS
DECLARE VARIABLE BIOLOGICO VARCHAR(1);
BEGIN
  Select ACTXPROG.BIOLOGICO
  from ACTXPROG
  where ACTXPROG.ID_ACTXPROG = old.ID_ACTIVIDADPYP
  into :Biologico;
 
  if (:biologico = 'T') then
    old.ESQUEMA_TERMINADO = 'T';
  /* Trigger body */
END


Cuando quiero desactivar el disparador sale el mismo error   


¿ Pero como modificas el valor old. del campo ?. Ese valor no es modificable (no tendría ningún efecto), el valor modificable es el new.


AS
DECLARE VARIABLE BIOLOGICO VARCHAR(1);
BEGIN
  Select ACTXPROG.BIOLOGICO
  from ACTXPROG
  where ACTXPROG.ID_ACTXPROG = old.ID_ACTIVIDADPYP
  into :Biologico;
 
  if (:biologico = 'T') then
    new.ESQUEMA_TERMINADO = 'T';
  /* Trigger body */
END


Probablemente ese sea el error. En caso contrario, ¿ cual es la definición de los campos ACTIVIDADES y ESQUEMA_TERMINADO ?, parece que alguno de ellos podría ser un campo calculado (y por tanto, no modificable).

Saludos.
  • 0

#14 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 29 septiembre 2011 - 01:36

ahora si es veridico el error no sale cuando comento las lineas
una esta el el if y la otra en el else

UPDATE PERSONAS_ACTIVIDADPYP
      SET NRO_ACTIVIDADES = (NRO_ACTIVIDADES + :CANTIDAD),
          ESQUEMA_TERMINADO = 'F'
      WHERE ID_ACTIVIDADPYP = :ID_ACTXPROG AND
      ID_PACIENTE = :ID_PACIENTE;


UPDATE PERSONAS_ACTIVIDADPYP
      SET NRO_ACTIVIDADES = (NRO_ACTIVIDADES + :CANTIDAD),
          ESQUEMA_TERMINADO = 'F'
      WHERE ID_ACTIVIDADPYP = :ID_ACTXPROG AND
      ID_PACIENTE = :ID_PACIENT



...digo yo, si en este codigo solo has quitado el IF y el ELSE, el punto y coma ¿no deberia estar tras la segunda instruccion?

Quizas sea solo esa tonteria, el IF termina con el punto y coma, y lo siguiente es una linea que directamente empieza en un ELSE.
  • 0

#15 FELIX

FELIX

    Advanced Member

  • Miembros
  • PipPipPip
  • 123 mensajes

Escrito 30 septiembre 2011 - 07:19

Saludos

Gracias por las respuestas, hice el cambio q sugirio Marc y funciono perfectamente tenia toda la razon ese valor no es modificable. el documento q me envio Egostar me ayudo a entender mejor el problema y la solucion de Marc (http://www.firebirdfaq.org/faq331/)
:cheesy: :cheesy:


   
  • 0

#16 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 30 septiembre 2011 - 08:12

Entoces lo colocamos como RESUELTO :D
  • 0




IP.Board spam blocked by CleanTalk.