Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-09-2015
Kenobi Kenobi is offline
Miembro
 
Registrado: mar 2007
Posts: 191
Poder: 18
Kenobi Va por buen camino
buena esa

Cita:
Empezado por Casimiro Notevi Ver Mensaje
-Señor policía, ¿puede ayudarme?
+Sí, dígame lo que le ocurre.
-No puedo, es secreto.

, ojo no es por mezquinar el codigo es simplemente respetar la confidencialidad de la organización ya que mis tablas tienen nombres muy elocuentes....

me disculpo por eso.
Responder Con Cita
  #2  
Antiguo 27-09-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Creo que la mejor forma de independizar del motor es usando interfaces:

Código Delphi [-]
unit SQLFunctions;

interface

uses
  Data.DB;

type
  ISQLFunctions = interface
    ['{CD84579F-2EE3-4842-BCF3-F8B5A2B7C50B}']
    function NullFx(const ParamName, FieldName: string): string;
  end;

  TExtendedSQLConnection = class abstract(TInterfacedObject, ISQLFunctions)
  protected
    FConnection: TCustomConnection;
    function NullFx(const ParamName, FieldName: string): string; virtual; abstract;
  public
    constructor Create(const AConnection: TCustomConnection); virtual;
  end;

implementation

uses
  System.SysUtils;

{ TExtendedSQLConnection }

constructor TExtendedSQLConnection.Create(const AConnection: TCustomConnection);
begin
  if not Assigned(AConnection) then
    raise Exception.Create('TExtendedSQLConnection.Create :: AConnection is not Assigned');

  inherited Create;
  FConnection := AConnection;
end;

end.

Código Delphi [-]
unit MySQLFunctions;

interface

uses
  SQLFunctions;

type
   TMySQLExtendedConnection = class(TExtendedSQLConnection)
   protected
    function NullFx(const ParamName, FieldName: string): string; override;
   end;

implementation

uses
  System.SysUtils;

{ TMySQLExtendedConnection }

function TMySQLExtendedConnection.NullFx(const ParamName, FieldName: string): string;
begin
  Result := Format('IfNull(:%s, %s)', [ParamName, FieldName]);
end;

end.

Código Delphi [-]
unit MSSQLFunctions;

interface

uses
  SQLFunctions;

type
   TMSSQLExtendedConnection = class(TExtendedSQLConnection)
   protected
    function NullFx(const ParamName, FieldName: string): string; override;
   end;

implementation

uses
  System.SysUtils;

{ TMSSQLExtendedConnection }

function TMSSQLExtendedConnection.NullFx(const ParamName, FieldName: string): string;
begin
  Result := Format('IsNull(:%s, %s)', [ParamName, FieldName]);
end;

end.

Última edición por AgustinOrtu fecha: 27-09-2015 a las 21:57:18.
Responder Con Cita
  #3  
Antiguo 27-09-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Ejemplo de uso:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  ADOQuery1.Close;
  if Edit1.Text = EmptyStr then
    ADOQuery1.Parameters.ParamByName('Param').Value := NULL
  else
    ADOQuery1.Parameters.ParamByName('Param').Value := Edit1.Text;
  ADOQuery1.Open;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FSQLFunctions := TMSSQLExtendedConnection.Create(ADOConnection1);
  ADOQuery1.SQL.Text := 'SELECT * FROM Productos WHERE Id = ' + FSQLFunctions.NullFx('Param', 'Id');
  ADOQuery1.Prepared := True;
end;

Edito:

Si las funciones para comprobar si es Null o no comprometen la eficiencia, la unica manera es usando dos componentes Query.

Última edición por AgustinOrtu fecha: 27-09-2015 a las 22:01:13.
Responder Con Cita
  #4  
Antiguo 28-09-2015
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 11
bucanero Va camino a la fama
Una alternativa usando solamente parámetros es utilizar dos parámetros, uno que indica que muestre todos y otro para filtrar directamente los datos que queremos

Código SQL [-]
select proyectos, categorias, count(categorias)
from proyectos
where :todos or proyectos=:miParametro
group by proyectos, categorias

y en el codigo de busqueda:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  ADOQuery1.Close;
  if Edit1.Text = EmptyStr then
    //se le indica que muestre todos
    ADOQuery1.Parameters.ParamByName('todos').Value := 1
  else begin
    //se obliga a filtra por el dato necesario
    ADOQuery1.Parameters.ParamByName('todos').Value := 0
    ADOQuery1.Parameters.ParamByName('miParametro').Value := Edit1.Text;
  end;
  ADOQuery1.Open;
end;
Responder Con Cita
Respuesta



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
Realizar un Update en delphi con un query concondicion desde otro query!!! rotsen26 SQL 9 09-03-2013 22:17:47
Pasar un array como parámetro a una Query pape19 Varios 7 10-10-2011 22:53:40
Saber si un parametro de un Query ha sido asignado sinalocarlos Varios 1 26-03-2008 02:44:38
Desactivar Evento en un Query MaMu Conexión con bases de datos 4 27-06-2007 00:46:01
Como hacer referencia a un query dentro de otro query? JuanBCT SQL 2 05-09-2006 18:35:25


La franja horaria es GMT +2. Ahora son las 10:10:06.


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