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)
-   -   Correccion de Sintanxis (https://www.clubdelphi.com/foros/showthread.php?t=67601)

sierraja 27-04-2010 20:45:03

Es tan sencillo esta instruccion que no se cree, pero tengo varios meses y cuando digo varios meses, es en serio, (son varios meses :D ) he realizado bastantes pruebas buscando una justificacion para esto y no la encuentro, pero debe ser algun contenido que no entra en el filtro, tal y cual como lo dice el amigo Casimiro. Solo me falta eliminar dicho registro y volverlo a crear (no se si teine sentido o no :confused:). Tambien aclaro que la inclusion de los nuevos meses ya viene con los datos de base imponible y excento con su justo valor. :D

Casimiro Noteví 27-04-2010 22:55:08

Veamos, amigo, esto es fácil, ejecuta este select:

Código:

select count(*)
from facturacion
where tipo_tarifa= "Residencial"
and tipo_factura= "Consumo"
and extract(month from fecha)= 1 
and extract(year from fecha)= 2010

¿Cuntos registros dice que devuelve?.


Pues toda esa cantidad de registros son los que se modificarán si ejecutas el procedimiento almacenado con los mismos valores:

Código:

execute procedure COMOSELLAME("Residencial","Consumo",1,2010)
Si en el select te dijo que '0' (cero), quiere decir que el select no trae nada con esos parámetros, así que tendrás que probar quitando parámetros, ejemplo, para empezar, quita el año:

Código:

select count(*)
from facturacion
where tipo_tarifa= "Residencial"
and tipo_factura= "Consumo"
and extract(month from fecha)= 1

Si te dice que 0 (cero), entonces quita el mes:

Código:

select count(*)
from facturacion
where tipo_tarifa= "Residencial"
and tipo_factura= "Consumo"

Si te dice que 0 (cero), entonces quita tipo_factura:

Código:

select count(*)
from facturacion
where tipo_tarifa= "Residencial"

Si te dice que 0 (cero), entonces quita tipo_tarifa:

Código:

select count(*)
from facturacion

Si te dice que 0 (cero), entonces es que !!!no tienes ningún registro!!! :D:D:D

Haz estas pruebas y nos cuentas, pero tal y como te lo he puesto, ok?

sierraja 27-04-2010 23:39:18

Ok si va...

Casimiro Noteví 27-04-2010 23:58:37

¡Qué bien!, entonces ¿cual era el problema?.

guillotmarc 28-04-2010 12:10:08

Cita:

Empezado por sierraja (Mensaje 362091)
Ok de hecho una de mis pruebas fue asi de sencilla y lo hizo muy bien, pero el problema consiste en que antes del year 2009 no se tenia impuesto en esas facturas y por lo tanto se deberia colocar.

El truco está en meter las condiciones del WHERE (como la del año 2009), una a una, así llegas a saber sin la menor duda cual es la cláusula que ocasiona el conflicto, y con ello es muchísimo más fácil de solucionar.

Aunque Casimiro tiene toda la razón en que va a ser mucho más rápido detectar el conflicto dentro de la cláusula WHERE utilizando sentencias SELECT y no UPDATES.

Saludos.

sierraja 28-04-2010 19:36:03

Buen dia a todos, efectivamente a medida que vamos cerrando las condiciones del WHERE vamos determinando cual de los filtros tiene el problema (estoy utilizando select en vez de update). En las diferentes pruebas me he dado cuenta que los registros con tarifas "Especial" salen en el select pero no se actualizan en el update, la prueba estuvo centrada en el year 2009 mes diciembre y tarifa "Especial". Tambien les informo, que por casualidad el registro que siempre verificaba es el de tarifa "Especial" y es el que no entra en el filtro. Ahora bien, el contenido del registro cumple con lsa condiciones del filtro, pero no hace caso al mismo. Inclusive lo he eliminado y vuelto a crear pero persiste. :confused:

Casimiro Noteví 28-04-2010 19:39:14

Vas a tener que pasarnos la base de datos :D

guillotmarc 29-04-2010 10:04:26

¿ Como está de triggers esa tabla ?, ¿ seguro que no tienes un trigger que le vuelve a poner su valor actual ?.

sierraja 30-04-2010 14:29:37

Buenos dias,

Revise los triggers y no encontre nada que me diera indicios de lo que comenta guillotmarc, pero de todas maneras le hice un seguimiento a cada evento relacionado. Luego de realizar las pruebas con condiciones del where, hizo la actualizacion pero solamente filtrando la data unicamente con tarifas, mes y year a la vez y ejecutando el proceso directamente desde ib-expert:

Lo ejecute varias veces para las demas tarifas y los demas meses:


Código SQL [-]
execute procedure act_impuesto_1("Residencial","Consumo",9,2009)
execute procedure act_impuesto_1("Residencial","Consumo",1,2010)
execute procedure act_impuesto_1("Residencial","Consumo",2,2010)
execute procedure act_impuesto_1("Especial","Consumo",9,2009)
execute procedure act_impuesto_1("Especiall","Consumo",1,2010)
execute procedure act_impuesto_1("Especial","Consumo",2,2010)


El procedimiento ejecutado es:

Código SQL [-]
SET TERM ^ ;
CREATE PROCEDURE ACT_IMPUESTO_1 (
    X_TIPO_TARIFA VARCHAR(30),
    X_TIPO_FACTURA VARCHAR(10),
    X_MES INTEGER,
    X_YEAR INTEGER)
AS
begin
  update facturacion
  set base_imponible = cloaca, excento=0
  where tipo_tarifa=:x_tipo_tarifa and tipo_factura=:x_tipo_factura and extract(month from fecha)=:x_mes and extract(year from fecha)=:x_year;
  suspend;
end^
SET TERM ; ^
GRANT SELECT,UPDATE ON FACTURACION TO PROCEDURE ACT_IMPUESTO_1;
GRANT EXECUTE ON PROCEDURE ACT_IMPUESTO_1 TO SYSDBA;

Y para el resto de las tarifas se aplico lo siguiente:


[sql]execute procedure act_impuesto_2("Comercial","Consumo",9,2009)
execute procedure act_impuesto_2("Comercial","Consumo",1,2010)
execute procedure act_impuesto_2("Comercial","Consumo",2,2010)
execute procedure act_impuesto_2("Industrial A","Consumo",9,2009)
execute procedure act_impuesto_2("Industrial A","Consumo",1,2010)
execute procedure act_impuesto_2("Industrial A","Consumo",2,2010)
/SQL El procedimiento ejecutado es:
Código SQL [-]
SET TERM ^ ;
CREATE PROCEDURE ACT_IMPUESTO_2 (
    X_TIPO_TARIFA VARCHAR(30),
    X_TIPO_FACTURA VARCHAR(10),
    X_MES INTEGER,
    X_YEAR INTEGER)
AS
begin
  update facturacion
  set base_imponible = cargo_fijo + cargo_exceso_consumo + cargo_variable + cloaca, excento=0
  where tipo_tarifa=:x_tipo_tarifa and tipo_factura=:x_tipo_factura and extract(month from fecha)=:x_mes and extract(year from fecha)=:x_year;
  suspend;
end^
SET TERM ; ^
GRANT SELECT,UPDATE ON FACTURACION TO PROCEDURE ACT_IMPUESTO_2;
GRANT EXECUTE ON PROCEDURE ACT_IMPUESTO_2 TO SYSDBA;





Hasta llegar con todas las tarifas y en los ultimos tres meses. De esta manera fue que pude actualziar. Se ve ilogico, pero trate de hacer un solo SP pero no realizaba nada pero de todas maneras expogo el SP:


Código SQL [-]
SET TERM ^ ;
CREATE PROCEDURE ACT_IMPUESTO (
    X_TIPO_TARIFA VARCHAR(30),
    X_TIPO_FACTURA VARCHAR(10),
    X_MES INTEGER,
    X_YEAR INTEGER)
AS
begin
  if (x_tipo_tarifa='Residencial') then
    update facturacion
    set base_imponible = cloaca, excento=0
    where tipo_factura=:x_tipo_factura and extract(month from fecha)=:x_mes and extract(year from fecha)=:x_year;
  if (x_tipo_tarifa='Especial') then
    update facturacion
    set base_imponible = cloaca, excento=0
    where tipo_factura=:x_tipo_factura and extract(month from fecha)=:x_mes and extract(year from fecha)=:x_year;
  if (x_tipo_tarifa='Comercial') then
    update facturacion
    set base_imponible = cargo_fijo + cargo_exceso_consumo + cargo_variable + cloaca, excento=0
    where tipo_factura=:x_tipo_factura and extract(month from fecha)=:x_mes and extract(year from fecha)=:x_year;
  if (x_tipo_tarifa='Industrial A') then
    update facturacion
    set base_imponible = cargo_fijo + cargo_exceso_consumo + cargo_variable + cloaca, excento=0
    where tipo_factura=:x_tipo_factura and extract(month from fecha)=:x_mes and extract(year from fecha)=:x_year;
  if (x_tipo_tarifa='Industrial B') then
    update facturacion
    set base_imponible = cargo_fijo + cargo_exceso_consumo + cargo_variable + cloaca, excento=0
    where tipo_factura=:x_tipo_factura and extract(month from fecha)=:x_mes and extract(year from fecha)=:x_year;
end^
SET TERM ; ^
GRANT SELECT,UPDATE ON FACTURACION TO PROCEDURE ACT_IMPUESTO;
GRANT EXECUTE ON PROCEDURE ACT_IMPUESTO TO SYSDBA;



Este procedimiento no funcionada. Pero como dije antes realizaba prueba modificando el filtro del where y por separado funcionaba y fue de esta manera que pude resolver la situacion. En el futuro no vamos a tener este problema, ya que al crear el registro vamos a tener en cuenta todos los campos y no va a ser necesario actualizarlos luego.

De todas maneras seria bueno las observaciones para con los SP para en un futuro no volver a caer en estos detalles.

Caballeros muchas gracias por su colaboracion y por el aporte de sus valiosisimos conocimientos. Muchas gracias ;)


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

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