Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

 
 
Herramientas Buscar en Tema Desplegado
  #2  
Antiguo 08-06-2005
lbuelvas lbuelvas is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 378
Poder: 24
lbuelvas Va por buen camino
Chevere el ejercicio, me puse en la tarea de hacerlo, pero en Firebird 1.5.2, espero que
te sirva.

Meta usted unos valores, por aca en Colombia se le llaman contadores a los dispositivos
que cuentan el numero de metros cubicos que consume una casa y en algunos sistemas
para servicios publicos se considera el numero de contador como identificador unico.

En Colombia se le llama la 'critica' a la informacion de consumos de los 6 meses anteriores
para cualquier recibo de servicio publicos domiciliarios, y es de obligatorio cumplimiento
que esos valores aparezcan en el recibo.

El indice sugerido es mas rapido que uno basado en (fecha + contador).

El pedacito de codigo 'and :i < 3' es una ventaja de los procedimientos almacenados, es decir,
puede introducirse dentro del for select una condicion de salida que no tiene nada que ver con
los campos de la tabla seleccionada !!!

Haste unas pruebas de rendimiento con SQLHammer, es Open SOurce y cuenta con un analizador
de consultas (bueno realmente muestra las estadisticas de la consulta pero es muy bueno).

Código SQL [-]
CREATE TABLE LECTURA (
    ID_LECTURA INTEGER NOT NULL,
    CONTADOR INTEGER NOT NULL,
    FECHA DATE NOT NULL,
    VALOR INTEGER NOT NULL);

alter table LECTURA
add constraint PK_LECTURA
primary key (ID_LECTURA);

CREATE INDEX IDX_LECTURA_CONTADORFECHA
ON LECTURA (CONTADOR,FECHA);

SET TERM ^ ;

CREATE PROCEDURE SP_CRITICA (
    CONTADOR INTEGER,
    FECHA_REFERENCIA DATE)
RETURNS (
    VALOR_1 INTEGER,
    VALOR_2 INTEGER)
AS
DECLARE VARIABLE I INTEGER;
DECLARE VARIABLE VALOR_AUXILIAR INTEGER;
begin
  /* Este procedimiento saca los valore para la critica */

  /* Inicializar los valores en null por si hay menos de dos lecturas */
  valor_1 = 0;
  valor_2 = 0;

  /* Inicializar en 0 el contador */
  i = 0;
  for select valor
      from   lectura
      where  contador = :contador
      and    fecha <= :fecha_referencia
      and    :i < 3
      order  by fecha desc
      into   :valor_auxiliar
  do begin
    if       (i = 0) then
      valor_1 = valor_auxiliar;
    else if  (i = 1) then
      valor_2 = valor_auxiliar;
    i = i + 1;
  end

  suspend;
end
^

SET TERM ; ^

GRANT SELECT ON LECTURA TO PROCEDURE SP_CRITICA;

GRANT EXECUTE ON PROCEDURE SP_CRITICA TO SYSDBA;
__________________
Luis Fernando Buelvas T.
Responder Con Cita
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 07:37:00.


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
Copyright 1996-2007 Club Delphi