Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Consulta de un mismo campo (https://www.clubdelphi.com/foros/showthread.php?t=79850)

rufo 15-08-2012 20:49:59

Consulta de un mismo campo
 
Buenas tardes amigos resulta que tengo un problemilla en el cual no le hallo, lo que quiero hacer es una consulta con un mismo campo de una sola tabla, es decir tengo una tabla en access de ventas anuales y dentro de ella esta el campo MES entonces lo que quiero hacer es que en Delphi con dos combobox seleccione el mes que quiera consultar a que mes consultar, les pongo un ejemplo:

De ENERO a JULIO

y al hacer clic en un boton me muestre las ventas que hubieron desde esos meses, es ahi mi dilema que nose como hacer o como plantear la solucion, espero me ayuden y de antemano gracias.

roman 15-08-2012 21:15:36

¿Cómo está guardado el mes? Si lo tienes así tal cual, enero, febrero, etc. no sería tan fácil. Lo ideal sería que lo tuvieras numérico 1, 2, 3, etc. Así, la consulta sería algo como

Código SQL [-]
select * from ventas
where mes between 1 and 7

// Saludos

ecfisa 15-08-2012 21:45:45

Hola.

No conozco la sintáxis SQL de Access pero te pongo un ejemplo que espero te dé una idéa:
Código Delphi [-]
...
 if ComboBox1.ItemIndex <= ComboBox2.ItemIndex then
    with IBQuery do
    begin
      Close;
      SQL.Clear;
      SQL.Add('SELECT * FROM LA_TABLA ');
      SQL.Add('WHERE EXTRACT(MONTH FROM EL_CAMPO_FECHA) BETWEEN :PFECHA1 AND :PFECHA2 ');
      SQL.Add('ORDER BY CAMPO_FECHA');
      ParamByName('PFECHA1').Value := ComboBox1.ItemIndex+1; 
      ParamByName('PFECHA2').Value := ComboBox2.ItemIndex+1;
      Open;
    end;
...
Si usas ADO, mínimamente tendrías que cambiar :
Código Delphi [-]
 
  with ADOQuery do
  begin
     ...
     Parameters.ParamByname(...

Saludos.

roman 15-08-2012 21:49:13

Cita:

Empezado por rufo (Mensaje 439684)
y dentro de ella esta el campo MES

Yo entendí que tenía un campo con el mes y no con una fecha. Ya nos aclarará.

// Saludos

ecfisa 15-08-2012 21:55:11

Cita:

Yo entendí que tenía un campo con el mes y no con una fecha. Ya nos aclarará.
Si, también es probable que pueda ser así.

Lo que no pude (aunque lo intenté) fué traducir la consulta a SQL de Access :( , ví por algún lado el uso de la función MONTH, '#' FECHA '#',... pero también me mandó a pasear. :D

Saludos.:)

roman 15-08-2012 21:58:40

¿Qué es lo que no funciona? ¿El paso de parámetros? ¿La función Extract? ¿Con qué probaste? ¿Con ADO?

// Saludos

ecfisa 15-08-2012 22:43:45

Cita:

Empezado por roman (Mensaje 439693)
¿Qué es lo que no funciona? ¿El paso de parámetros? ¿La función Extract? ¿Con qué probaste? ¿Con ADO?

// Saludos

Lo que no funciona aparentemente es la sintáxis. Si, para las pruebas usé un TADOQuery y la tabla employee de dbdemos.mdb.

Asignándole esta consulta:
Código Delphi [-]
'SELECT * FROM EMPLOYEE
WHERE EXTRACT(MONTH FROM HIREDATE) BETWEEN :FECHA1 AND :FECHA2'
Me da el error: "Error no especificado" (muy orientativo) :confused:

Esta sólo funciona cuando se trata del mismo mes.
Código Delphi [-]
'SELECT * FROM EMPLOYEE
WHERE MONTH(HIREDATE) BETWEEN :FECHA1 AND :FECHA2'


Por último esta:
Código Delphi [-]
'SELECT * FROM EMPLOYEE
WHERE MONTH(''#'' HIREDATE ''#'') BETWEEN :FECHA1 AND :FECHA2'
Me da el error: " Error de sintáxis(falta operador) en la expresión de consulta 'MONTH(''#'' HIREDATE ''#'') BETWEEN ? AND ?' "

Pero es lógico ya que nunca utilizo Access y desconozco su sintáxis.

Saludos. :)

rufo 15-08-2012 22:51:34

Gracias amigos por responder, exacto como dice tengo un campo donde almaceno el mes y les pongo el codigo que he estado usando sin tener resultados.

Código Delphi [-]
if (combobox3.text<>'') and (combobox4.Text<>'') then
      begin
        with dm1.Q_Vanual do
        begin
          active:=false;
          sql.clear;
          sql.add('select * from ventas_anuales');
          sql.add('where datos_factura.mes');
          sql.Add('and datos_factura.N[mes]');
          active:=true;
          if recordcount=0 then
         messagedlg('No se encontraron ventas de los meses selecionado, intente de nuevo',mtinformation,[mbok],0);
         listbox11.Clear;
         listbox12.Clear;
         listbox13.Clear;
         listbox4.Clear;
         listbox20.Clear;
         listbox21.Clear;
         listbox22.Clear;
         listbox23.Clear;
       while not(eof) do
        begin
         listbox11.Items.add(fieldbyname('id_folio').asstring);
         listbox12.Items.add(fieldbyname('nombre').asstring);
         listbox13.Items.Add(fieldbyname('importe').AsString);
         listbox20.Items.Add(fieldbyname('dia').AsString);
         listbox21.Items.Add(fieldbyname('mes').AsString);
         listbox22.Items.Add(fieldbyname('ano').AsString);
         listbox4.Items.Add(fieldbyname('iva').AsString);
         listbox23.Items.Add(fieldbyname('total').AsString);
        next;
        end;
      end;
      end;

en la consulta de access cree un campo que se llama N[mes] para poder hacer la consulta, al ejecutar la consulta si me funciona ya que si en la consulta especifico de que Mes a que Mes me arroja los resultados, el problema es en planteamiento en delphi, al momento de ejecutar mi aplicacion y hacer click me arroja el siguiente mensaje

"Error de sintaxis (falta operador) en la expresion de consulta 'datos_factura.mes and datos_factura.N[mes]'

Espero me ayuden a que operador estara faltandome y gracias de antemano.

ecfisa 15-08-2012 23:27:26

Hola.

Bueno, al final encontré como hacerlo usando la funcion MONTH. Aparentemente hay que especificar el mismo tipo de dato que devuelve la función a los parámetros.

Código Delphi [-]
  with ADOQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT * FROM TU_TABLA ');
    SQL.Add('WHERE MONTH(TU_CAMPO_FECHA) BETWEN :DESDE AND :HASTA';
    Parameters.ParamByName('DESDE').DataType := ftInteger;
    Parameters.ParamByName('HASTA').DataType := ftInteger;
    Parameters.ParamByName('DESDE').Value := ComboBox1.ItemIndex + 1;
    Parameters.ParamByName('HASTA').Value := ComboBox2.ItemIndex + 1;
    Open;
  end;

Saludos.

rufo 16-08-2012 00:38:20

Gracias amigo Ecfisa, pero perdon mi ignorancia adecue tu ejemplo a mi codigo pero

Código Delphi [-]
Parameters.ParamByName('DESDE').DataType := ftInteger;
    Parameters.ParamByName('HASTA').DataType := ftInteger;

Esta parte de codigo me marca error se tienen que declarar "Parameters.ParamByName" y tambien este "ftInteger" disculpa mi ignorancia pero me he bloqueado por ver tanto codigo espero me auxilies y gracias.

ecfisa 16-08-2012 03:26:28

Hola rufo.

Te adjunto un ejemplo que utiliza la tabla Employee de dbdemos (que viene con Delphi) para que puedas analizarlo con tranquilidad.

Tuve dificultades con el uso de BETWEEN (como te dije no utilizo Acces :o), por lo que decidí usar el condicional de este modo:
Código SQL [-]
WHERE MONTH(HIREDATE) >=:DESDE AND MONTH(HIREDATE) <=:HASTA

Saludos.


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

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