Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Suma de campos tipo time (https://www.clubdelphi.com/foros/showthread.php?t=10504)

jzginez 20-05-2004 22:08:47

Suma de campos tipo time
 
Hola a todos estoy trabajando con firrbird 1.5 y tengo el siguiente problema:

estoy haciendo un sistema para producción de una empresa textil, tengo una tabla (TEstilo) que es un catálogo de los tipos de ropa
clave - descripcion
1 - camisa
2 - pantalon

Una tabla (TOperaciones) donde tengo las operaciones que se necesitan para hacer un estilo especifico y el tiempo que se tarda cada una de ellas, por ejemplo tengo las siguientes operaciones:
clave-descripcion-minutaje
1 - pegar manga - 00:00:30
2 - pegar cuello - 00:00:15
3 - coser bolsa - 00:00:25
4 - cerrar costados - 00:00:45
5 - cerra dobladillos - 00:00:10
6 - pegar botones - 00:01:00

Una tercera tabla (TOperEstilo) donde relaciono el estilo con las operaciones

estilo - operación
1 - 1
1 - 2
1 - 3
1 - 4
1 - 5
1 - 6
2 - 4
2 - 3
2 - 6

Necesito saber el tiempo que se tarda en producir un estilo es decir la suma de los tiempos de las operaciones que se usan en cada estilo, para empesar no podia sumar mis campos tipo time hasta que encontre el hilo de Campos tipo time El problema que tengo es que como resultado me esta dando cero, el triger que uso es el siguiente:

CREATE TRIGGER TOPERESTILO_AI FOR TOPERESTILO
ACTIVE AFTER INSERT POSITION 0
AS
declare variable tiempoOper time;
declare variable TiempoEstilo time;
declare variable tiempoTotal Integer;
begin
/* Trigger text */
if (new.id_oper is not null)
Then begin
select minutaje from toperaciones where id = new.id_oper into :TiempoOper;
select minutaje from testilo where id = new.id_estilo into TiempoEstilo;
tiempoTotal = extract(hour from TiempoEstilo)*3600 + extract(minute from TiempoEstilo)*60 + extract(second from TiempoEstilo);
tiempototal = TiempoTotal + extract(hour from TiempoOper)*3600 + extract(minute from TiempoOper)*60 + extract(second from TiempoOper);
update testilo set minutaje = :tiempoTotal where id = new.id_estilo;
end
end


Gracias

jachguate 21-05-2004 08:10:00

Hola jzguines.

Ya que habitualmente estas posteando mensajes en los foros, creo que es tiempo de aprender a usar las etiquetas [ code ], [ delphi ] y [ sql ] para publicar trozos de código correctamente indentados y con la sintaxis resaltada, que son mucho mas legibles. Al Inicio de cada foro tenes un mensaje que te ayudará a aprender a usarlas, y un vínculo en mi firma a la ayuda de la etiqueta [ code ]. El uso de las otras dos es exactamente el mismo.

Hasta luego.

;)

jzginez 21-05-2004 14:24:52

gracias por lo del uso de etiquetas pero como hago mi suma

jzginez 01-06-2004 19:07:29

Hola a todos esperando que la falta de respuesta sea porque no escribi el codigo dentro de las etiquetas correspondientes reescribo el codigo
Código SQL [-]
CREATE TRIGGER TOPERESTILO_AI FOR TOPERESTILO
ACTIVE AFTER INSERT POSITION 0
AS
declare variable tiempoOper time;
declare variable TiempoEstilo time;
declare variable tiempoTotal Integer;
begin
/* Trigger text */
if (new.id_oper is not null)
  Then begin
    select minutaje from toperaciones where id = new.id_oper into :TiempoOper;
    select minutaje from testilo where id = new.id_estilo into TiempoEstilo;
    tiempoTotal = extract(hour from TiempoEstilo)*3600 + extract(minute from TiempoEstilo)*60 + extract(second from TiempoEstilo);
    tiempototal = TiempoTotal + extract(hour from TiempoOper)*3600 + extract(minute from TiempoOper)*60 + extract(second from TiempoOper);  
    update testilo set minutaje = :tiempoTotal where id = new.id_estilo;
   end
end

lo último que he intentado es

Código SQL [-]
CREATE TRIGGER TOPERESTILO_AI FOR TOPERESTILO
ACTIVE AFTER INSERT POSITION 0
AS
declare variable preciotemp float;
declare variable tiempo1 time;
declare variable tiempo2 time;
begin
  /* Trigger text */
  if (new.id_oper is not null)
   Then begin
  select pagooper, minutaje from toperaciones where id = new.id_oper into :preciotemp, :tiempo1;
  update testilo set precio = precio + :preciotemp where id = new.id_estilo;
  select minutaje from testilo where id = new.id_estilo into :tiempo2;
  if (tiempo2 is null)
   then update testilo set minutaje = :tiempo1 where id = new.id_estilo;
  else update testilo set minutaje = minutaje + :tiempo1 where id = new.id_estilo;
  end
end


pero me indica el siguiente error que segun yo es en el if
Código PHP:

Unsuccessful execution caused by a system error that precludes
successful execution of subsequent statements
.
Dynamic SQL Error.
expression evaluation not supported

espero me puedan ayudar gracias

guillotmarc 01-06-2004 21:08:05

Hola.

Hay muchas razones por las que puede ser que nadie te responda. Porqué no se conoce la respuesta, no se entiende la pregunta, a uno no le gusta como se ha planteado, nadie ha tenido tiempo de mirarselo aún, ...

Imagino que el campo minutaje de testilo será de tipo integer, puesto que este es el tipo del valor calculado.

Prueba a depurar el código, es decir escribe este código en un procedimiento almacenado, y siguelo línea a línea. De esta forma verás en que línea no se comporta como lo esperas.

Ciertamente en el if tienes un problema if (tiempo2 is null). Más bien debería ser if (:tiempo2 is null). (Esto no implica que no haya otros problemas).

Saludos.

jzginez 02-06-2004 05:50:45

Hola guillotmarc lo de la falta de respuestas fue puro sarcasmo debido a que si no mal recuerdo es la primera vez que escribo un hilo en interbase y ni tu u otro master me habian ayudado con la solución ( :( siempre ay una primera vez), en caunto al tipo del campo en TEstilo perdon di por acentado que se entendia el tipo ( :D como dicen en las reglas del foro no hay que dar nada por entendido) su tipo es timer.

Ahora bien estoy usando IBExpert y no le he encontrado donde estan las herramientas de depuración si me puedes dar una ayuda te lo agradecere.

guillotmarc 02-06-2004 11:54:57

Hola.

Mi respuesta también fué irónica (aunque gracias por lo de master), personalmente dejo pasar un cierto tiempo antes de participar en un hilo, para dar ocasión a que participe más gente.

Respecto al tipo del campo TEstilo, realmente se ve a venir que es de tipo Time, por eso lo he resaltado, tiene que ser de tipo Integer (que es el tipo del valor que has calculado).

Lo que no entiendo es que te deje el valor a cero, en lugar de saltar un error. Estas haciendo una conversión a lo bestia de tipos, que no son convertibles entre ellos. Compruebalo con la siguiente consulta :

select cast(100 as time) from rdb$database

Prueba a construir una cadena 'hh:mm:ss', esto si que es convertible al tipo time.

Respecto a la depuración, la versión Personal (gratuita) de IB-Expert no tiene herramientas de depuración, solo están disponibles en las versiones comerciales (de pago). Puedes adquirir una versión comercial de IB-Expert, o utilizar alguna de las otras herramientas de Administración para IB/FB.

Saludos.


La franja horaria es GMT +2. Ahora son las 23:09:57.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi