Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-07-2024
GINMARMENOR GINMARMENOR is offline
Miembro
 
Registrado: feb 2016
Posts: 71
Poder: 10
GINMARMENOR Va por buen camino
En relación a:

Cita:
Hola...una observación: En la propiedad TEXT del "ibQuery", no te hace falta "FROM" en la sentencia SELECT??... "select * FROM
motivos..." y otra obervación, el campo AÑO te permite la "Ñ"??...la verdad nunca he usado la Ñ en los campos que creo en
Firebird, no sé si lo permita. En realidad los declaro -en el caso del año- como ANIO.
Tienes razón FROM lo olvidé en la sintaxis en el foro, pero está escrito en el código, y tambén la 'Ñ' no la permite, uso N
era por usar un lenguaje natural.

Lo cierto es que como he dicho funciona:

Código SQL [-]
                          ibQueryMotivos.close;
                          IbQueryMotivos.Clear;
                          IbQueryMotivos.add('select * from motivos where anio IN (1925,1955,1920)';
                          IbQueryMotivos.open;

y no

Código SQL [-]
                        var
                            anios:string;

                        begin
                          anios:=(1925,1955,1920);
                        
                          IBQueryMotivos.SQL.Clear;
                          IBQueryMotivos.SQL.Add('select * from motivos where año in '+ANIOS);
                          IBQueryMotivos.Open;

He intentando 200 maneras pero no lo consigo,

He intentando el procedimiento que me pones:


Código SQL [-]
procedure OnClick(Sender: TObject);
var
    cAnios : String;
begin
      cAnios:=cAnios+Edit1.Text+',';
end;


procedure EjecutarProc(Sender: TObject);
var
    cAnios2 : String;
begin
       
       cAnios2:='('+cAnios+')'
       spEjecutar.Prepared;
       spEjecutar.ParamByName('ANIOS').AsString:=cAnios2
       spEjecutar.ExecProc;
end;

Pero no sé ejecutarlo, Gracias, mañana intentaré con la mente más fresca pasar una variable a parámetro a ver.
Responder Con Cita
  #2  
Antiguo 25-07-2024
marco3k marco3k is offline
Miembro
 
Registrado: feb 2015
Posts: 94
Poder: 11
marco3k Va por buen camino
Código Delphi [-]
var
    anios:string;

begin
  anios:=(1925,1955,1920);

  IBQueryMotivos.SQL.Clear;
  IBQueryMotivos.SQL.Add('select * from motivos where año in '+ANIOS);
  IBQueryMotivos.Open;

Eso de arriba debe ser así y me comentas como te fue:
Código Delphi [-]
var
    anios:string;

begin
  anios:='1925,1955,1920';

  IBQueryMotivos.SQL.Clear;
  IBQueryMotivos.SQL.Add('select * from motivos where año in ('+anios+')');
  IBQueryMotivos.Open;

Lo demás es hacer un bucle para coger los años, Roman ya te dio un ejemplo.

Última edición por marco3k fecha: 25-07-2024 a las 20:53:22.
Responder Con Cita
  #3  
Antiguo 25-07-2024
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: nov 2003
Posts: 638
Poder: 22
mRoman Va por buen camino
Cita:
Empezado por GINMARMENOR Ver Mensaje
En relación a:



Tienes razón FROM lo olvidé en la sintaxis en el foro, pero está escrito en el código, y tambén la 'Ñ' no la permite, uso N
era por usar un lenguaje natural.

Lo cierto es que como he dicho funciona:

Código SQL [-]
                          ibQueryMotivos.close;
                          IbQueryMotivos.Clear;
                          IbQueryMotivos.add('select * from motivos where anio IN (1925,1955,1920)';
                          IbQueryMotivos.open;

y no

Código SQL [-]
                        var
                            anios:string;

                        begin
                          anios:=(1925,1955,1920);
                        
                          IBQueryMotivos.SQL.Clear;
                          IBQueryMotivos.SQL.Add('select * from motivos where año in '+ANIOS);
                          IBQueryMotivos.Open;

He intentando 200 maneras pero no lo consigo,

He intentando el procedimiento que me pones:


Código SQL [-]
procedure OnClick(Sender: TObject);
var
    cAnios : String;
begin
      cAnios:=cAnios+Edit1.Text+',';
end;


procedure EjecutarProc(Sender: TObject);
var
    cAnios2 : String;
begin
       
       cAnios2:='('+cAnios+')'
       spEjecutar.Prepared;
       spEjecutar.ParamByName('ANIOS').AsString:=cAnios2
       spEjecutar.ExecProc;
end;

Pero no sé ejecutarlo, Gracias, mañana intentaré con la mente más fresca pasar una variable a parámetro a ver.
Bueno...en vez de "ExecProc", usa "Open", ademas de que este ejemplo no estaba seguro de q funcionara, mejor usa el ejemplo mas amplio q te envié....ese ya esta probado q funciona!.

Saludos.
__________________
Miguel Román

Afectuoso saludo desde tierras mexicanas....un aguachile?, con unas "cetaseas" bien "muertas"?, VENTE PUES !!
Responder Con Cita
  #4  
Antiguo 25-07-2024
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: nov 2003
Posts: 638
Poder: 22
mRoman Va por buen camino
En este código deberás hacer un cambio:

Código Delphi [-]
var
                            anios:string;

                        begin
                          anios:=(1925,1955,1920); // asi no debería funcionarte
                          anios:='(1925,1955,1920)';  //haz este cambio, deberán estar, toda la cadena con los paréntesis también, encerrado en comillas simples.
                        
                          IBQueryMotivos.SQL.Clear;
                          IBQueryMotivos.SQL.Add('select * from motivos where año in '+ANIOS);
                          IBQueryMotivos.Open;

Y otra cosa, mejor mandános tu código para ver como le estas haciendo...y aqui entre todos te ayudamos a resolverlo de la mejor manera.

Saludos.
__________________
Miguel Román

Afectuoso saludo desde tierras mexicanas....un aguachile?, con unas "cetaseas" bien "muertas"?, VENTE PUES !!
Responder Con Cita
  #5  
Antiguo 26-07-2024
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.757
Poder: 21
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Yo lo que veo mal es el procedimiento que utilizas para concatenar los valores.

Código Delphi [-]
procedure OnClick(Sender: TObject);
var
    cAnios : String;
begin
   cAnios := cAnios + Edit1.Text + ',';
end;
Esto trabaja sobre una variable local, la cual se pierde después de terminar el procedimiento.
Incluso si fuera una variable global "," te dejaría una coma al final.

Deberías hacerlo así:

Código Delphi [-]
// cAnios debe ser global a la unidad para poder compartirla entre los diferentes procedimientos
var 
  cAnios : string;

procedure OnClick(Sender: TObject);
begin
   // Solo agrego la "," si no es el primer elemento
   if (cAnios = '') then
      cAnios := cAnios + Edit1.Text + ','
   else
      cAnios := cAnios + ',' + Edit1.Text;
end;

procedure BotonInicializarOnClick(Sender: TObject);
begin
   // Inicializo cAnios para volver a empezar con proceso de selección 
   cAnios := '';
end;

procedure EjecutarProc(Sender: TObject);
begin
   // cAnios debería tener valores separados por coma.

   if (cAnios > '') then
   begin
      IBQueryMotivos.SQL.Clear;
      IBQueryMotivos.SQL.Add('select * from motivos where año in (' + cAnios + ')');
      IBQueryMotivos.Open;
   end
   else
      ShowMessage('No se han seleccionado años');
end;

begin
   // Inicializo cAnios
   cAnios := '';
   [...]
end;

Última edición por duilioisola fecha: 26-07-2024 a las 08:26:28.
Responder Con Cita
  #6  
Antiguo 26-07-2024
GINMARMENOR GINMARMENOR is offline
Miembro
 
Registrado: feb 2016
Posts: 71
Poder: 10
GINMARMENOR Va por buen camino
Perdonar la tardanza, pero estaba saturado ayer.

He probado las soluciones que me mandáis y FUNCIONAN, BIENNNNNNNN.


Código SQL [-]
                         var
                              anios:string;


                        Begin
                          anios:='(1925,1955,1920)';  
                       
                          IBQueryMotivos.SQL.Clear;
                          IBQueryMotivos.SQL.Add('select * from motivos where año in '+ANIOS);
                          IBQueryMotivos.Open;
                        end;

y Lógicamente también así:


Código SQL [-]

procedure Button1click(Sender: TObject);

var
    cAnios : String;

begin
   cAnios := cAnios + Edit1.Text + ',';

 // cAnios debería tener valores separados por coma.

   
   begin

      IBQueryMotivos.SQL.Clear;
      IBQueryMotivos.SQL.Add('select * from motivos where año in (' + cAnios + ')');
      IBQueryMotivos.Open;

   end
   else
      ShowMessage('No se han seleccionado años');
end;


Como me has pedido MRoman, mi código era meter en un StringGrid ó en un QuickReport, Rave Report, etc etc, sólo aquellos años que yo eligiera aleatoriamente, sin tener que ser todos los que son menores ó mayores que tal año, que eso sería más fácil.

Por lo que mi código quedaría así:


Código SQL [-]

procedure tform1.Button1Click (sender:tobjet);

var
      anios1,anios2,anios3:string;
      x,c:Integer;

begin
       c:=1
       for x:=1 to Memo1.Lines.Count - 1 do
            begin
              anios1:=Memo1.Lines[x];
              anios2:=anios2+anios1+ ',';
              anios3:=anios2+'0';
       end;

       with tqueryMotivos do
       close;
       sql.clear;
       sql.add('select anio,Motivo from Motivos where Motivo in '(' + anios3 + ')';
       open;

       while not IbQueryMotivo.eof do
                begin
                   Stringgrid1.cells[c]:=IbQueryMotivo.FieldByname(anio).AsString;
                   StringGrid1.Cells[c]:=IbQueryMotivo.FieldByname(Motivo).AsString;
                   inc(c);
                   IbQueryMotivo.next;
                 end;

Bueno esto sería acabado el código entero simplificado a lo máximo, he utilizado para rellenar y sacar los datos finales un striggrid
He utilizado un Memo1, en vez de Edit, por comodidad y el Memo me deja introducir los años más cómodamente,
He utilizado tres Anios1,Anios2,Anios3,
donde el primero cojo, la primera línea del Memo
el Segundo cojo Anios1 + el Acumulado del Anios2, (1925,1955,1920,) y se quedaría así con una coma inoportuna ahí.
y Tercero cojo el Anios 2 entero, y como el Anios2 siempre acababa en ',' o siempre empezaba ',' no había forma de quitarla pues
le añadido en el anios3 un '0' y quedaría así (1925,1955,1920,0) el 0 nunca va representar ningún año y no me altera en nada el
resultado y así no me da error.

Lo mismo se puede hacer más simple, estoy abierto a aprender, y reducirlo al máximo, vosotros sois mucho mas expertos que yo.

Así que no me queda más que agredecer, el interés y las soluciones que me habéis dado, con esto se me ha abierto un abanico
muy grande para escoger dentro de un campo de forma aleatoria. Muchísimas Gracias.
Responder Con Cita
  #7  
Antiguo 26-07-2024
cloayza cloayza is offline
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 937
Poder: 24
cloayza Tiene un aura espectacularcloayza Tiene un aura espectacular
Estimado Colega, si está utilizando un TMemo, le sugiero el siguiente cambio...

Código Delphi [-]
procedure tform1.Button1Click (sender:tobjet);

var
      anios1,anios2,anios3:string;
      x,c:Integer;

begin
       c:=1
       {for x:=1 to Memo1.Lines.Count - 1 do
            begin
              anios1:=Memo1.Lines[x];
              anios2:=anios2+anios1+ ',';
              anios3:=anios2+'0';
       end;
       }
       Memo1.Lines.Delimiter:=',';
       anios3:=Memo1.Lines.DelimitedText;

       with tqueryMotivos do
       close;
       sql.clear;
       sql.add('select anio,Motivo from Motivos where Motivo in '(' + anios3 + ')';
       open;

       while not IbQueryMotivo.eof do
                begin
                   Stringgrid1.cells[c]:=IbQueryMotivo.FieldByname(anio).AsString;
                   StringGrid1.Cells[c]:=IbQueryMotivo.FieldByname(Motivo).AsString;
                   inc(c);
                   IbQueryMotivo.next;
                 end;

Saludos cordiales
Responder Con Cita
  #8  
Antiguo 27-07-2024
GINMARMENOR GINMARMENOR is offline
Miembro
 
Registrado: feb 2016
Posts: 71
Poder: 10
GINMARMENOR Va por buen camino
Ok, va cojonudo, ahorramos bucle y dos variables.

Ok, He utilizado Memo1, por rapidez y sencillez, no sé si habrá otro componente más apropiado.

Gracias.
Responder Con Cita
Respuesta


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
SELECT para encontrar registros con diferentes valores en el mismo campo gustavosv SQL 12 17-10-2014 22:34:35
Consulta de un mismo campo rufo Varios 10 16-08-2012 03:26:28
Consulta de valores consecutivos Guillermosalva SQL 5 27-07-2007 08:49:15
Pasar un campo calculado a un campo del mismo DbGrid maravert Conexión con bases de datos 3 12-05-2006 00:31:30
Campo de tabla con valores con un mismo nombre kakesoft Conexión con bases de datos 14 28-11-2005 14:40:46


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


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