Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

 
 
Herramientas Buscar en Tema Desplegado
  #5  
Antiguo Hace 3 Días
emailx45 emailx45 is offline
Miembro
 
Registrado: abr 2025
Posts: 13
Poder: 0
emailx45 Va por buen camino
Thumbs up

Aquí tienes un ejemplo muy sencillo para comprender su uso:
- ¡Todo es rápido y no hay necesidad de guardar datos en otra tabla!


Si utiliza Firebird, podría crear un "Procedimiento almacenado" parametrizado para poder cambiar los nombres de las tablas y los campos y adaptarlos a diferentes años...

Código SQL [-]
SET TERM ^ ;

CREATE OR ALTER PROCEDURE GetTableDataCombined (
    ATableNameA VARCHAR(31),
    ATableNameB VARCHAR(31),
    AFieldTableName VARCHAR(31),
    AFieldInputDate VARCHAR(31),
    AFieldIDRecord VARCHAR(31),
    AFieldValue VARCHAR(31),
    AStartDate DATE,
    AEndDate DATE
)
RETURNS (
    OutSourceTable VARCHAR(31),
    OutTableName VARCHAR(100),
    OutInputDate DATE,
    OutIDRecord INT64,
    OutValue NUMERIC(18,4),
    OutErrorMessage VARCHAR(255)
)
AS
DECLARE VARIABLE VSqlStatement VARCHAR(4000);
BEGIN
  OutErrorMessage = '';

  -- Crea una única consulta uniendo las dos tablas mediante UNION ALL.
  VSqlStatement = 'SELECT ''' || :ATableNameA || ''', ' || :AFieldTableName || ', ' || :AFieldInputDate || ', ' || :AFieldIDRecord || ', ' || :AFieldValue || ' ' ||
                  'FROM ' || :ATableNameA || ' ' ||
                  'WHERE ' || :AFieldInputDate || ' BETWEEN :PStart AND :PEnd ' ||
                  'UNION ALL ' ||
                  'SELECT ''' || :ATableNameB || ''', ' || :AFieldTableName || ', ' || :AFieldInputDate || ', ' || :AFieldIDRecord || ', ' || :AFieldValue || ' ' ||
                  'FROM ' || :ATableNameB || ' ' ||
                  'WHERE ' || :AFieldInputDate || ' BETWEEN :PStart AND :PEnd';

  -- El bucle FOR ejecuta la instrucción unificada de una sola vez.
  FOR EXECUTE STATEMENT :VSqlStatement (PStart := :AStartDate, PEnd := :AEndDate)
  INTO :OutSourceTable, :OutTableName, :OutInputDate, :OutIDRecord, :OutValue
  DO
  BEGIN
    SUSPEND;
  End

  -- Manejo estructurado de excepciones
  WHEN ANY DO
  BEGIN
    OutSourceTable = 'ERROR';
    OutTableName   = '';
    OutInputDate   = NULL;
    OutIDRecord    = 0;
    OutValue       = 0;
    OutErrorMessage = 'Error al ejecutar la consulta unificada con UNION ALL.';
    SUSPEND;
  END
END^

SET TERM ; ^

Ejemplo de uso en Delphi, utilizando TFDQuery o cualquier consulta similar.

Código Delphi [-]
Procedure TFormMain.FetchDataForComparison;
Begin
  FDQueryCompare.Close;
  FDQueryCompare.SQL.Text := 'SELECT * FROM GetTableDataForCompare(:TabA, :TabB, :FldTabName, :FldDate, :FldID, :FldVal, tStart, tEnd)';
  
  // Definir los parámetros de forma dinámica
  FDQueryCompare.ParamByName('TabA').AsString         := 'TableA';
  FDQueryCompare.ParamByName('TabB').AsString         := 'TableB';
  FDQueryCompare.ParamByName('FldTabName').AsString    := 'TableName';
  FDQueryCompare.ParamByName('FldDate').AsString       := 'InputDate';
  FDQueryCompare.ParamByName('FldID').AsString          := 'IDRecord';
  FDQueryCompare.ParamByName('FldVal').AsString         := 'Value';
  FDQueryCompare.ParamByName('DtStart').AsDateTime     := DateTimePickerStart.Date;
  FDQueryCompare.ParamByName('DtEnd').AsDateTime       := DateTimePickerEnd.Date;
  
  FDQueryCompare.Open;

  // Verificación de errores devuelta por el procedimiento
  If Not FDQueryCompare.FieldByName('OutErrorMessage').AsString.IsEmpty Then
  Begin
    FDQueryCompare.Close;
    //
    ShowMessage('ERROR: ' + FDQueryCompare.FieldByName('OutErrorMessage').AsString);
    //
    Exit;
  End;

  //Aquí puede iterar sobre la consulta FDQuery o usar una consulta SQL local de FireDAC para hacer referencia cruzada a los datos en memoria.
End;

Última edición por emailx45 fecha: Hace 3 Días a las 01:21:13.
Responder Con Cita
 


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Grabacion de Registros en una tabla. GINMARMENOR Conexión con bases de datos 8 17-05-2026 20:54:05
consulta dos campañas GINMARMENOR SQL 4 03-09-2024 21:10:39
firebird en varias campañas GINMARMENOR Firebird e Interbase 9 24-06-2019 23:43:28
Actualizar campos de una Tabla cuando se actualize otra tabla RedVenom Varios 28 11-05-2011 18:19:38
Aplicacion campañas de cereales analia1979 Varios 5 19-07-2007 09:46:29


La franja horaria es GMT +2. Ahora son las 18:07:17.


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