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 25-04-2010 22:20:19

Correccion de Sintanxis
 
Saludos a todos

Estoy utilizando firebird 1.5 y delphi 7. Utilizo la interface ibexpert para checar las tablas, pero hice un procedimiento y despues de investigar un poco y quedo de esta manera:

Código SQL [-]
FOR SELECT codigo_suscriptor, tipo_tarifa, tipo_factura, fecha, base_imponible, excento
    FROM facturacion f
    where (f.tipo_tarifa=:x_tipo_tarifa) and (f.tipo_factura=:x_tipo_factura) and (fecha=:x_fecha)
  INTO :cod, :tip_tar, :tip_fac, :fec, :bas_imp, :exc
  DO
    update facturacion
    set base_imponible=cloaca;
  suspend;




Ahora quisiera saber si este procedimiento tiene algun error, por que no me hace lo que yo quiero, que es: cambiar el valor que tiene base_imponible por cloaca y que todos sean de tipo_tarifa='Residencial and tipo_factura='Consumo'. Ademas coloque fecha para hacer una prueba, pero en realidad el parametro es el mes y el a#o solamente. Gracias por su atencion.

sierraja 25-04-2010 22:22:15

Perdon por la etiqueta SQL. Tuve un error.

Código SQL [-]
 

 
FOR SELECT codigo_suscriptor, tipo_tarifa, tipo_factura, fecha, base_imponible, excento

 
    FROM facturacion f

 
    where (f.tipo_tarifa=:x_tipo_tarifa) and (f.tipo_factura=:x_tipo_factura) and (fecha=:x_fecha)

 
  INTO :cod, :tip_tar, :tip_fac, :fec, :bas_imp, :exc

 
  DO

 
    update facturacion

 
    set base_imponible=cloaca;

 
  suspend;

Casimiro Noteví 25-04-2010 22:44:21

¿Y qué error tiene?, ¿qué quieres que haga y no hace?, ¿qué es cloaca? (aparte de un lugar repugnante), ¿para qué haces un for select de una tabla y recabas datos que almacenas en unas variables y luego actualizas una tabla con un valor que no tiene nada que ver con la otra?, ¿por qué no pones el código completo?

sierraja 25-04-2010 23:03:38

He tratado de realizar lo siguiente:

Quiero hacer mediante un procedimiento almacenado una actualizacion. El campo base_imponible es un campo numerico y cloaca tambien lo es. Este es un sistema de facturacion por consumo de agua potable, en la cual quiero asignarle el valor que tiene el campo cloaca al campo base_imponible, para eso necesito los parametros que son tipo_tarifa (Residencial, Especial, Comercial, Industrial A) tipo_factura (Consumo o Servicio) y que sean del mes y el a#o que se suministre. Lo he intentado a traves de los componentes IBX en delphi pero no he podido hacer el cambio, de alli que me fui hacia el ibexpert para hacerlos directamente en la base y no me ha funcionado. Habia conseguido un link que me indicaba que los procedimientos almacenados se hacian de esa manera, la cual fue la que trate de modificar e hice le procedimiento presentado. Pero al fin la idea es actualizar los campos que mencione con los parametros requeridos. He realizados varios procedimientos para hacer varias cosas dentro de las tablas de la BD, pero en este caso estoy bastante desconcertado. De antemano gracias por la atencion prestada. No se si falta alguna otra informacion para tratar de resolver el asunto. Nuevamente gracias. :o

Casimiro Noteví 25-04-2010 23:15:31

Mejor pon aquí las tablas implicadas y lo que quieres conseguir.

sierraja 25-04-2010 23:53:58

Esta es la tabla:

Código:

Status-----Codigo---Cloaca---Tipo_tarifa---Fecha---Tipo---Base_Imponible
 
Por Facturar---237---0,38---Residencial---01/12/2009---Consumo
Por Facturar---237---0,07---Residencial---01/01/2010---Consumo
Facturado  ---237---0,11---Residencial---01/02/2010---Consumo
Por Facturar---500---0,33---Residencial---01/12/2009---Consumo
Por Facturar---500---0,12---Residencial---01/01/2010---Consumo---33,45
Por Facturar---500---0,01---Residencial---01/02/2010---Consumo---00,98
Por Facturar---500---0,87---Residencial---01/12/2009---Servicio--11,22
Por Facturar---500--- 1,2---Residencial---01/12/2009---Servicio
Por Facturar---700---0,38---Residencial---01/12/2009---Consumo

Quiero asignarle el valor que tiene cloaca a la base_Imponible en el mes de diciembre del 2009, tomando en cuenta los parametros de: Tarifa: Residencial, Tipo: Consumo y Mes de diciembre de 2009. Es decir los registros resaltados, pero debo hacerlo con un procedimiento almacenado.

Gracias por tu atencion...

Casimiro Noteví 26-04-2010 00:17:08

Bueno, si no te he entendido mal, sería algo más o menos así:

Código:

create procedure  nombrequequieras (
  tarifa varchar(15),  /* el tipo que tenga el  campo */ 
  tipo varchar(15),  /* el tipo que tenga el campo */   
  mes (integer)    /* supongo que el campo fecha es timestamp o date */
)
as begin 
  update tabla comosellame 
  set base_imponible = cloaca 
  where tipo_tarifa=  :tarifa 
  and tipo= :tipo 
  and extract(month from fecha)= :mes 
end


sierraja 26-04-2010 00:29:37

Esto lo he intentando varias veces pero no lo hace y este es el codigo:



Código SQL [-]
Begin
  update facturacion
  set base_imponible = cloaca   
  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

Cuando reviso la tabla de un registro en especial no hace el cambio. :(

Casimiro Noteví 26-04-2010 01:04:16

¿Y cómo ejecutas el procedimiento?, ¿desde delphi?, ¿desde otro procedimiento?...

sierraja 26-04-2010 14:01:46

Buenos dias

Lo ejecuto desde delphi y tambien lo hago desde ibexpert ejecutando el proceso directamente y no hace los cambsio, la verdad es que no se pueda estar sucediendo, tratare de buscar mas a fondo, pero tiene que haber algo que este ingterfiriendo.

guillotmarc 26-04-2010 16:40:30

Hola.

¿ Salta algún error ?, es posible que tengas triggers que te bloqueen la modificación.

¿ Confirmas la transacción implicada ?.

Sería mejor que indicaras el código Delphi con el que ejecutas el procedimiento almacenado.

Dinos también que valores pasas exactamente como parámetros del procedimiento almacenado (tu procedimiento almacenado no va a hacer lo que tu esperas con los parámetros con valor nulo).

Saludos

cloayza 26-04-2010 16:55:15

Cita:

Empezado por Casimiro Notevi (Mensaje 361872)
Bueno, si no te he entendido mal, sería algo más o menos así:

Código:

create procedure  nombrequequieras (
  tarifa varchar(15),  /* el tipo que tenga el  campo */ 
  tipo varchar(15),  /* el tipo que tenga el campo */   
  mes (integer)    /* supongo que el campo fecha es timestamp o date */
)
as begin 
  update tabla comosellame 
  set base_imponible = cloaca 
  where tipo_tarifa=  :tarifa 
  and tipo= :tipo 
  and extract(month from fecha)= :mes 
end


A este codigo le haria solo unos pequenos cambios...

Código:

create procedure  nombrequequieras (
  tarifa varchar(15),  /* el tipo que tenga el  campo */ 
  tipo varchar(15),  /* el tipo que tenga el campo */   
  mes (integer),    /* supongo que el campo fecha es timestamp o date */
  ano (Integer)      /* Año*/
)
as begin 
  update tabla comosellame 
  set base_imponible = cloaca 
  where Upper(tipo_tarifa)=  Upper(:tarifa)
  and Upper(tipo)= Upper(:tipo)
  and extract(month from fecha)= :mes
  and extract(year from fecha)= :ano 
end


sierraja 26-04-2010 17:27:12

buen dia,

El procedimiento como tal no lo estoy ejecutando desde delphi, lo hago desde ibexpert, esto lo hacia para ir filtrando posibles conflictos. Ahora bien, las sugerencias de cloayza, quedan descartadas ya que estoy incluyendo en los parametros, exactamente los campos almacenados en cuanto a las tarifas y tipo de factura. Despues de todo esto he adicionado una rutina en el momento de facturar de manera que pueda arreglar cada suscriptor, aparentemente en el grid despues de realizar la rutina, aparecen los datos correctos, pero luego de cerrar el programa y volver a entrar no aparecen, con esto da la impresion que fuera cuestion del componente transaction, aqui dejo el codigo:

========================================

Código SQL [-]
dm.ibds_facturar.DisableControls;
          dm.ibds_facturar.First;
          while not dm.ibds_facturar.Eof do
          begin
            DecodeDate(StrToDaTE(VarToStr(dm.ibds_facturar.FieldValues['fecha'])),x__year,x__month,x__day);
            if ((StrToInt(VarToStr(x__month))>=4) and (StrToInt(VarToStr(x__year))>=2009)) or ((StrToInt(VarToStr(x__month))<=2) and (StrToInt(VarToStr(x__year))>=2010)) then
            Begin
              if (dm.ibds_facturar.FieldValues['tipo_tarifa']='Residencial')then
              Begin
                dm.ibds_facturar.Edit;
                if VarToStr(dm.ibds_facturar.FieldValues['cloaca'])<>'' then dm.ibds_facturar.FieldByName('base_imponible').AsFloat:=StrToFloat(VarToStr(dm.ibds_facturar.FieldVa  lues['cloaca']));
                if VarToStr(dm.ibds_facturar.FieldValues['consumo_agua'])<>'' then dm.ibds_facturar.FieldByName('excento').AsFloat:=StrToFloat(VarToStr(dm.ibds_facturar.FieldValues['consumo_agua']));
                dm.ibds_facturar.Post;
              end;
              if (dm.ibds_facturar.FieldValues['tipo_tarifa']='Especial')then
              Begin
                dm.ibds_facturar.Edit;
                if VarToStr(dm.ibds_facturar.FieldValues['cloaca'])<>'' then dm.ibds_facturar.FieldByName('base_imponible').AsFloat:=StrToFloat(VarToStr(dm.ibds_facturar.FieldVa  lues['cloaca']));
                if VarToStr(dm.ibds_facturar.FieldValues['consumo_agua'])<>'' then dm.ibds_facturar.FieldByName('excento').AsFloat:=StrToFloat(VarToStr(dm.ibds_facturar.FieldValues['consumo_agua']));
                dm.ibds_facturar.Post;
              end;
            end;
            dm.ibds_facturar.Next;
          end;
          dm.ibds_facturar.Close;
          dm.IBTransaction1.CommitRetaining;
          dm.ibds_facturar.Open;
          dm.ibds_facturar.Last;
          dm.ibds_facturar.EnableControls;
===========================================




Nuevamente les agradezco su valioso tiempo...

sierraja 26-04-2010 17:29:16

He colocado policias en cada linea para verificar las condiciones y los datos que se comparan en ese momento y cumple con todas las codiciones y sigue muy bien la logica, pero luego de volver a entrar no aparecen los datos. Me da la impresion de una novatada me esta haciendo perder el tiempo :D pero no doy con la novatada....:confused:

Casimiro Noteví 26-04-2010 17:45:54

Creo que me he perdido :confused:

El código que has puesto no tiene nada que ver con un procedimiento almacenado, ahí lo que haces es recorrer un dataset y modificar registros según unos condicionantes.
Eso es una forma de hacer lo que quieres, que no tiene nada que ver con un procedimiento almacenado.
No sé si estará bien ese código, no lo he seguido con detalle, pero no tiene nada que ver, son dos cosas distintas.

Para ejecutar el procedimiento puedes insertar en tu formulario un componente específico para procedimientos o puedes ejecutarlo directamente desde un componente sql, en tu caso sería algo así como:
Código SQL [-]
 "execute procedure nombredelprocedure('Residencial','Consumo',Lafecha)'

sierraja 26-04-2010 17:57:44

Eso es correcto, el procedimiento almacenado que inicialmente presente lo estaba ejecutando directamente desde ibexpert y no desde delphi y cuando presente el codigo delphi, de hecho es una manera de realizar la tarea que estoy porponiendo hice la aclaratoria al que era una de las formas de resolver el planteamiento. Pero en otras palabras el procedimiento sugerido por cloayza no me ha funcionado, por lo tanto disene el codigo delphi y si muestra los resultados, pero al cerrar el formulario desaparecen las modificaciones. Pido disculpas por la confusion...

guillotmarc 26-04-2010 21:26:25

Prueba a ejecutar directamente el update en el IB-Expert, cuando consigas que funcione como esperas, entonces lo puedes empaquetar dentro del procedimiento almacenado.

De nuevo insisto en que revises las transacciones que utilizas (que se confirmen tras modificar, que abras una transacción nueva al consultar si ha hecho la modificación, etc. ...). Y para ir descartando posibles causas de que la consulta no se comporte como tu esperas, sería útil que respondieras a si pasas valores nulos como parámetro.

sierraja 26-04-2010 22:08:23

Ok:

1.- Ya probe el update directamente sobre ib-expert y no hace los cambios

2.- Estoy utilizando una sola transaccion que se confirma antes del salir del formulario, por lo tanto esta chacado.

3.- No estoy pasando valores nulos

Disculpa pero ya he realizado las pruebas que mencionads:o

Casimiro Noteví 26-04-2010 23:26:02

Cita:

Empezado por sierraja (Mensaje 361956)
Ok:
1.- Ya probe el update directamente sobre ib-expert y no hace los cambios
2.- Estoy utilizando una sola transaccion que se confirma antes del salir del formulario, por lo tanto esta chacado.
3.- No estoy pasando valores nulos
Disculpa pero ya he realizado las pruebas que mencionads:o

Bueno, amigo sierraja, da la sensación de que no quieres ayuda ;)
Lo de "Ya probe el update directamente sobre ib-expert y no hace los cambios", no nos sirve de mucho, más que nada porque TIENE que hacer los cambios, salvo que hagas algo mal, para eso te pedimos el código completo de ese procedimiento almacenado y de tu código haciendo la llamada desde el ibexpert, por ejemplo, o desde donde lo pruebes y no te funcione.

sierraja 27-04-2010 00:51:08

ok Cuando digo que no hace nada, es porque lo ejecuto y no hace los cambios necesarios. Esta es la linea que ejecuto directamente sobre ibexpert:



Y el codigo delphi es que la esta expuesto en el post anterior.

Es logico que dudes de las pruebas que me indicas, pero sencillamente nos las hace.

Ok mi pregunta es: a partir de esta linea directa debo de hacer el procedimiento almacenado y ejecutarlo directamente desde ibexpert, pero si es solamente una linea y no me funciona?, que se puede esperar de un procedimiento lamacenado, es decir, quiero decir, que la instruccion directa es sumamente sencilla y por ende el procedimiento deberia ser de la misma manera y logica, pero claro, con su sintaxis respectiva. Entonces estoy atascado en la instruccion directa y el codigo delphi, que tambien esta super sencillo y cuando se ejecuta no logra hacer los cambios. :confused:

Realmente no veo el problema para que no me de los resultados deseados, simplemente no veo el error.:(

Gracias por su atencion...

Ah y claro que necesito resolver esta situacion...:D

sierraja 27-04-2010 00:51:55

Esta es la instruccion que ejecuto directamente desde delphi:

Código SQL [-]
update facturacion f set f.base_imponible=f.cloaca  where (extract(month from f.fecha)=:x_mes) and (extract(year from f.fecha)=:x_year) and (f.tipo_factura='Consumo') and (f.tipo_tarifa='Residencial');

Casimiro Noteví 27-04-2010 00:53:30

jajaja... ahora un método nuevo, con este ya van 3 formas distintas.

sierraja 27-04-2010 00:56:33

Mas informacion:

.- Utilizo Firebird 1.5 sobre un servidor Linux Ubuntu 8.04.
.- Las estaciones de trabajo esta corriendo sobre win xp
.- EL programa esta hecho en delphi 7 con todos los componentes basicos (no tercertos).
.- Utilizo los components IBX para que trae delphi 7 para accesar la data.


Gracias.

sierraja 27-04-2010 00:57:31

ja ja ja Pido disculpas por no saber expresarme mejor, pero creeme lo intento. ja ja ja :D

Casimiro Noteví 27-04-2010 01:04:17

Es que en cada uno de las 3 formas... no nos has dado toda la información.

De todas formas lo de emplear "Consumo", "Residencial", etc. es una muy mala idea porque influyen varios factores que pueden hacer que no funcione, si pones "consumo", por ejemplo, ya no funcionará, tampoco funcionará dependiendo del tipo de dato usado en crear el campo, que tampoco nos has puesto la estructura de la tabla.
Por ejemplo, si usas un campo de cadena fija, digamos que un char(20) y almacenas el valor "Consumo" que tiene 7 caracteres, realmente no se está almacenando "Consumo" sino "Consumo ", así que cuando vas a hacer el filtro por ese campo, nunca te funcionará. Si usas varchar(20) no habrá problema porque él sólo quita los espacios... o no, depende de la versión de firebird/interbase que uses, porque en las versiones antiguas, la firebird 1.0 todavía no tenía solucionado el fallo de que los varchar se guardaban también con los espacios.
Estos son simples ejemplos de por lo qu einsistimos mucho que necesitamos mucha más información, lo más completa posible, para poder ayudar.

sierraja 27-04-2010 01:29:02

Wow, cada vez uno aprende mas:

En la captura de datos se valida la entrada de los mismo, es decir, cuando defines el tipo de factura se validan: "Consumo" y/o "Servicios" Cualquiera de los dos, el usuario no lo escribe, solo lo selecciona.

En lo que respecta a tipo de tarifa, igualemente valido que sea: "Residencial" o "Especial" o "Comercial" o "Industrial A" y "Industrial B". Igualmente como el anterior, el usuario no lo escribe, y solo lo selecciona.

De esta manera estan almacenados en la base de datos.

El tipo de datos en la base de datos para los dos campos es Varchar(10) y varchar (30) respectivamente.

El sistema consiste en un sistema de facturacion del servicio de agua potable y tiene tres years funcionando, pero cada dia se le han agregado cosas nuevas. Desde el year pasado se le agrego los impuestos cuyo desgloce consiste en base imponible y cantidad excenta, eso es lo que estamos tratando de arreglar.

Este es una peque#a explicacion de lo que hace el sistema. he realizado varias pruebas que no han resultado y solo he tenido ese problema con ella, he realizado varias pruebas con los ultimos cuatro meses y no he tenido exito. Tambien he realizado chequeos de otras transacciones de consulta que se activen fantasmalmente y no he encontrado nada. He filtrado la data con pocos registro y tampoco he tenido exito. Hast el momento se tiene 380000 registro en la tabla de facturacion que estamos manejando.

Si quieren mas informacion hasta les puedo enviar la misma base de datos, para que realicen sus prueba. :)

Casimiro Noteví 27-04-2010 01:35:05

Cita:

Empezado por sierraja (Mensaje 362003)
[..]Si quieren mas informacion hasta les puedo enviar la misma base de datos, para que realicen sus prueba. :)

No creo que sea necesario :)

Centrémonos en un método determinado, ¿te parece bien el procedimiento almacenado?, creo que es la mejor opción.

Pon aquí el código completo del mismo y haremos una prueba desde el ibexpert.
Además pon aquí el código completo de la estructura de la tabla, ok? :)

sierraja 27-04-2010 01:55:57

EL SP, me parece buenisimo:


Código SQL [-]
SET TERM ^ ;
CREATE PROCEDURE "UPDATE" (
X_TIPO_TARIFA VARCHAR(30),
X_TIPO_FACTURA VARCHAR(10),
X_MES INTEGER,
X_YEAR INTEGER)
AS
begin
update facturacion
set base_imponible = cloaca
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;
update facturacion
set excento = consumo_agua
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 "UPDATE";
GRANT EXECUTE ON PROCEDURE "UPDATE" TO SYSDBA;





========================
Código:

/******************************************************************************/
/****            Generated by IBExpert 26/04/2010 07:19:48 p.m.            ****/
/******************************************************************************/
SET SQL DIALECT 3;
SET NAMES NONE;
 
/******************************************************************************/
/****                                Tables                                ****/
/******************************************************************************/
 
CREATE TABLE FACTURACION (
    ID_SUSCRIPTOR          VARCHAR(30),
    STATUS_FACTURA          VARCHAR(15),
    RUTA                    INTEGER,
    NUMERO_FACTURA          INTEGER,
    NUMERO_FACTURA_A        VARCHAR(30),
    NUMERO_FACTURA_IMPRESA  INTEGER,
    CODIGO_SUSCRIPTOR      INTEGER,
    CODIGO_SUSCRIPTOR_A    VARCHAR(30),
    LECTURA_ANTERIOR        INTEGER,
    LECTURA_ACTUAL          INTEGER,
    CONSUMO                NUMERIC(15,2),
    FECHA_INICIO            DATE,
    FECHA_INICIO_A          VARCHAR(20),
    FECHA_FIN              DATE,
    FECHA_FIN_A            VARCHAR(20),
    FECHA_FACTURACION      DATE,
    FECHA_FACTURACION_A    VARCHAR(20),
    FECHA_VENCIMIENTO      DATE,
    FECHA_VENCIMIENTO_A    VARCHAR(20),
    MONTO_TARIFA            NUMERIC(15,2),
    MONTO_TARIFA_EXCESO    NUMERIC(15,2),
    ALICUOTA_IVA            NUMERIC(15,2),
    CARGO_FIJO              NUMERIC(15,2),
    CARGO_VARIABLE          NUMERIC(15,2),
    CARGO_EXCESO_CONSUMO    NUMERIC(15,2),
    CONSUMO_AGUA            NUMERIC(15,2),
    CLOACA                  NUMERIC(15,2),
    PORCENTAJE_CLOACA      NUMERIC(15,2),
    MONTO_CONCEPTO          NUMERIC(15,2),
    MONTO_FACTURADO        NUMERIC(15,2),
    MONTO_IVA              NUMERIC(15,2),
    DEUDA_ANTERIOR          NUMERIC(15,2),
    TIPO_TARIFA            VARCHAR(30),
    ESTADO                  VARCHAR(20),
    AVISO_CORTE            VARCHAR(2),
    FECHA_PAGO_FACTURA      DATE,
    FECHA_PAGO_FACTURA_A    VARCHAR(20),
    FORMA_PAGO              VARCHAR(20),
    PORCENTAJE_DESCUENTO    NUMERIC(15,2),
    MONTO_DESCUENTO        NUMERIC(15,2),
    DESCUENTO_AUTORIZADO    VARCHAR(30),
    NUMERO_CHEQUE          VARCHAR(30),
    CUENTA_CHEQUE          VARCHAR(30),
    NOMBRE_BANCO            VARCHAR(30),
    USUARIO                VARCHAR(10),
    FECHA                  DATE,
    FECHA_A                VARCHAR(10),
    PRECIO_UNITARIO        NUMERIC(15,2),
    SUB_TOTAL              NUMERIC(15,2),
    CONTADOR                INTEGER,
    LITERAL_EXCENTO        VARCHAR(10),
    MONTO_PAGADO            NUMERIC(15,2),
    VUELTO                  NUMERIC(15,2),
    NUMERO_TARJETA          VARCHAR(30),
    TIPO_TARJETA_CREDITO    VARCHAR(30),
    NOMBRE_BANCO_TARJETA    VARCHAR(30),
    TIPO_FACTURA            VARCHAR(10),
    RECIBO                  VARCHAR(2),
    PRECIO                  NUMERIC(15,2),
    BASE_IMPONIBLE          NUMERIC(15,2),
    FACTURAR_LOTE          VARCHAR(10),
    CODIGO_STATE_ACCOUNT    VARCHAR(10),
    EXCENTO                NUMERIC(15,2),
    STATUS_TARIFA          VARCHAR(20),
    CAMPO1                  VARCHAR(50),
    CAMPO2                  VARCHAR(100),
    STATUS_2                VARCHAR(30),
    STATUS_3                VARCHAR(30),
    STATUS                  VARCHAR(30),
    CODIGO_LECTURA          INTEGER,
    PENDIENTES              INTEGER
);
 
 
/******************************************************************************/
/****                              Indices                                ****/
/******************************************************************************/
CREATE INDEX FACTURACION_CODIGO_CLIENTE ON FACTURACION (CODIGO_SUSCRIPTOR);
CREATE INDEX FACTURACION_IDX1 ON FACTURACION (DEUDA_ANTERIOR);
 
/* Fields descriptions */
DESCRIBE FIELD STATUS_FACTURA TABLE FACTURACION
'Si indica "Si" es que esta facturado';
DESCRIBE FIELD FECHA_INICIO TABLE FACTURACION
'  fecha inicio de periodo a facturar';
DESCRIBE FIELD FECHA_FIN TABLE FACTURACION
' fecha fin de periodo a facturar';
DESCRIBE FIELD CARGO_FIJO TABLE FACTURACION
' cargo fijo para la tarifa comercial';
DESCRIBE FIELD CARGO_VARIABLE TABLE FACTURACION
'cargo variable tarifa comercial';
DESCRIBE FIELD CARGO_EXCESO_CONSUMO TABLE FACTURACION
' cargo consumo tarifa comercial';
DESCRIBE FIELD CONSUMO_AGUA TABLE FACTURACION
' consumo mas tarifa mensual';
DESCRIBE FIELD MONTO_CONCEPTO TABLE FACTURACION
' monto por concepto debito o credito de la facturacion mensual';
DESCRIBE FIELD MONTO_FACTURADO TABLE FACTURACION
'  monto facturado es la suma de agua,cloaca, exceso, cargo fijo, debido o credito';
DESCRIBE FIELD ESTADO TABLE FACTURACION
'status operacional= 1 activo, 2 cortado, 3 suspendido';
DESCRIBE FIELD AVISO_CORTE TABLE FACTURACION
'Verdadero si y falso no';
 
/******************************************************************************/
/****                              Privileges                              ****/
/******************************************************************************/


sierraja 27-04-2010 01:57:15

perdon siempre se me salta este error:


Código SQL [-]
SET TERM ^ ;
CREATE PROCEDURE "UPDATE" (
    X_TIPO_TARIFA VARCHAR(30),
    X_TIPO_FACTURA VARCHAR(10),
    X_MES INTEGER,
    X_YEAR INTEGER)
AS
begin
  update facturacion
  set base_imponible = cloaca
  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;
  update facturacion
  set excento = consumo_agua
  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 "UPDATE";
GRANT EXECUTE ON PROCEDURE "UPDATE" TO SYSDBA;

Este es el procedimiento. Lo acabo de crear.

Casimiro Noteví 27-04-2010 02:05:36

¿La tabla no tiene clave primaria?

sierraja 27-04-2010 02:10:56

Hasta ahora no!, pero si ha de tenerla seria el codigo_suscriptor+fecha. La tabla contiene una factura mensual por cada suscriptor, es decir, un mismo codigo_suscriptor va a tener doce registros por year y no su pueden repetir un mismo suscriptor tenga dos registros en el mismo mes. No se si me entiendes.:confused:

Casimiro Noteví 27-04-2010 02:54:40

Pues sí, es necesario que tenga su clave primaria.

Bueno, mira he creado la tabla a la que le he añadido una clave primaria:

Código:

CREATE TABLE FACTURACION( 
  ID Integer NOT NULL,  <--  tú le pones la clave que te venga mejor
  ID_SUSCRIPTOR Varchar(30),
  STATUS_FACTURA Varchar(15),
  RUTA Integer, 
  NUMERO_FACTURA Integer, 
  NUMERO_FACTURA_A Varchar(30), 
  NUMERO_FACTURA_IMPRESA Integer, 
  etc... 
  ...

Luego he creado el procedimiento almacenado (para simplificar he dejado la primera parte):

Código:

CREATE PROCEDURE ACTUALIZAR (
  X_TIPO_TARIFA Varchar(30),   
  X_TIPO_FACTURA Varchar(10),   
  X_MES Integer,   
  X_YEAR Integer )
AS begin 
  update facturacion 
  set base_imponible = cloaca 
  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;   

  etc...   
  /* por cierto, el "suspend" aquí no sirve para nada */ 
end

Y seguidamente lo he ejecutado desde el ibexpert... mentira, estoy usando el flamerobin, pero es lo mismo:

Código:

execute procedure ACTUALIZAR("Residencial","Consumo",1,2010)
Lo he nombrado ACTUALIZAR porque UPDATE puede malinterpretarse con la sentencia "UPDATE".

Y el resultado es, como se supone, correcto:


guillotmarc 27-04-2010 11:41:01

Cita:

Empezado por sierraja (Mensaje 361956)
3.- No estoy pasando valores nulos.

Perfecto.

Cita:

Empezado por sierraja (Mensaje 361956)
1.- Ya probe el update directamente sobre ib-expert y no hace los cambios

Como ha confirmado Casimiro, debería funcionar, hay que insistir en esta prueba hasta hacerla funcionar.

Cita:

Empezado por sierraja (Mensaje 361956)
2.- Estoy utilizando una sola transaccion que se confirma antes del salir del formulario, por lo tanto esta chacado.

Me refería a las transacciones que se utilizan en tus pruebas en IB-Expert.

Olvídate de Delphi por ahora, y céntrate en el caso más simple posible, en hacerlo funcionar como consulta en IB-Expert.

Una vez te funcione la consulta, ya lo puedes empaquetar en el procedimiento almacenado y probarlo, para finalmente ejecutarlo en Delphi.

Así pues volvamos a las transacciones en IB-Expert.

La única forma en que eso te va a funcionar es que cuando lances el Update, confirmes la transacción. Una vez confirmada la transacción del Update, ya puedes abrir una consulta nueva, con una transacción nueva, para comprobar si se han modificado los registros.

Si no sigues estos pasos (si no confirmas la transacción de modificación o si no abres la transacción de consulta después de haber confirmado la de modificación), no podrás ver los datos modificados.

Asegúrate de descartar que no tengas el problema simplemente por un mal uso de las transacciones, y una vez descartemos esa posibilidad podremos investigar otras causas.

NOTA: Si el problema no es la transacción, yo te recomiendo simplificar la consulta al máximo, hasta tener una consulta mínima que funcione (aunque evidentemente no hará todo lo que necesitas). Y una vez tengas como partida una consulta funcionando, que modifica correctamente datos, entonces le vas agregando poco a poco cláusulas SQL en el WHERE, probando su comportamiento a cada modificación, para identificar cual es la que hace que no funcione como tu esperas.

Saludos.

sierraja 27-04-2010 14:25:16

Buenos dias,

Estoy totalmente de acuerdo con guillotmarc, olvidemonos de delphi por el momento, cada vez que ejecuto un SP confirmo la transaccion y luego consulto, y no actualiza, ahora bien, he tratado de armar la consulta lo mas especificamente posible (corrigeme si es mala practica), para tratar de ir al registro especificamente y hacer el cambio respectivo y si lo ejecuta, pero, cuando intente en una de las pruebas hacerlo por lote de registro es ahi el problema que no lo hace. Inclusive he creado una tabla con menos de la cantidad de registro de la actual (380000), por decir, de los ultimos dos years y no ha funcionado.

He cambiado el nombre SP y coloque act_impuesto:

======================

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
  update facturacion
  set base_imponible = cloaca
  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;
end^
SET TERM ; ^
GRANT SELECT,UPDATE ON FACTURACION TO PROCEDURE ACT_IMPUESTO;
GRANT EXECUTE ON PROCEDURE ACT_IMPUESTO TO SYSDBA;

=========================
Como veran tambien he quitado el suspend; de la ultima linea de SP. Y no hace los cambios todavia. Segun recomienda Casimiro

Lo unico que no he hecho es hacer las pruebas en flamerobin. Y un detalle que no se si valga la pena, es que cuando ejecuto el SP lo hago desde el icono que me indica ibexpert que ejecuta el procedimiento o en su defecto F9

Casimiro Noteví 27-04-2010 14:41:43

Pero lo ejecutas así:

Código:

execute procedure COMOSELLAME("Residencial","Consumo",1,2010)
No entiendo lo de ejecutar por lotes, no tienes más que ejecutar esa línea anterior, con el mes y año que quieras.

sierraja 27-04-2010 18:54:09

Hola, claro! lo ejecuto como me indicas. Y cuando hablaba de por lotes, me referia a que utilizaba un grupo de registros mas peque#os pero sobre la misma tabla....

Casimiro Noteví 27-04-2010 19:19:28

Es igual si tienes un registro o si tienes mil millones de registros, pero si haces esto:

update facturacion
set base_imponible = cloaca
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;

estás asignando el valor que tenga el campo 'cloaca' al campo 'base_imponible', es IMPOSIBLE que no te actualice a tí, salvo que pongas unos parámetros que no existan registros con ese filtro.

Te has fijado en la imagen que puse antes, justo debajo del "execute procedure" verás que hay un select, si lo ejecutas verás los registros que te devuelve, todos esos registros son los que se actualizarán ejecutando el procedimiento almacenado.
Pruébalo y mira cuántos registros devuelve.

guillotmarc 27-04-2010 19:21:09

Hola.

En un caso tan sencillo, yo no utilizaría ningún procedimiento almacenado, ejecutaría directamente la sentencia update :

Código:

  update facturacion
  set base_imponible = cloaca
  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;

Aunque realmente empezaría con un :

Código:

  update facturacion
  set base_imponible = cloaca

Y si esta consulta funciona correctamente (no se me ocurre como podría no funcionar bien), empezaría a agregar cláusulas SQL, una a una, hasta encontrar la que ocasiona el problema.

Siguiente prueba :

Código:

  update facturacion
  set base_imponible = cloaca
  where tipo_tarifa=:x_tipo_tarifa

Siguiente :

Código:

  update facturacion
  set base_imponible = cloaca
  where tipo_tarifa=:x_tipo_tarifa and tipo_factura=:x_tipo_factura

etc. ...

NOTA: entre prueba y prueba, hazte una copia del archivo de datos, para no machacar facturas que no debiera.

Una vez sepamos cual es la cláusula que no hace lo que se espera de ella, debería ser muy fácil solucionarlo. Y es que como dice Casimiro, el problema tiene que estar en la cláusula WHERE y los parámetros que se le pasan.

Saludos.

sierraja 27-04-2010 20:14:02

Cita:

Aunque realmente empezaría con un :


Código:
update facturacion set base_imponible = cloaca
Y si esta consulta funciona correctamente (no se me ocurre como podría no funcionar bien), empezaría a agregar cláusulas SQL, una a una, hasta encontrar la que ocasiona el problema.

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 debria colocar.

Cita:

estás asignando el valor que tenga el campo 'cloaca' al campo 'base_imponible', es IMPOSIBLE que no te actualice a tí, salvo que pongas unos parámetros que no existan registros
Pensando en las lineas anteriores de lo IMPOSIBLE, revisé los campos de ese registro que no se actualiza y está dentro de las condiciones que se exigen.

Bueno de hecho lo que me queda realizar es un select con lsa condiciones y de seguro que salen los registros deseados y hacer la actualizacion a pie como se le dice en mi pais. No veo otra salida.

Hemos utilizado una simple instruccion a nivel del ibexpert sin necesidad de SP y tampoo los realiza pero con un select si aparecen pero sin los cambios.

Casimiro Noteví 27-04-2010 20:30:11

Perdona que sea un poco bruto, pero: NO ME LO PUEDO CREER :D
Ten en cuenta que estamos hablando de algo muy básico.


La franja horaria es GMT +2. Ahora son las 17:08:05.

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