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 26-03-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola Maestros
No hay manera, me genera errores, lo tengo asi:
Os muestro el codigo completo para que lo veais mejor:
El combobox1, muestra las tablas.(bien)
El combobox2, muestra los campos.(bien)
El edit1 (en el evento onchange) hace el filtro.(Mal).
Código Delphi [-]
unit UFManTablas;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DBCtrls, DB, ADODB, Grids, DBGrids, ExtCtrls;

type
  TFManTablas = class(TForm)
    Panel1: TPanel;
    Label2: TLabel;
    ComboBox1: TComboBox;
    DBGrid1: TDBGrid;
    ADOQuery1: TADOQuery;
    DataSource1: TDataSource;
    DBNavigator1: TDBNavigator;
    Button1: TButton;
    ComboBox2: TComboBox;
    Label1: TLabel;
    Label3: TLabel;
    Edit1: TEdit;
    Button2: TButton;
    Button3: TButton;
    procedure ComboBox1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FManTablas: TFManTablas;

implementation

uses UDM1;

{$R *.dfm}

procedure TFManTablas.ComboBox1Change(Sender: TObject);
begin
    ComboBox2.Clear;
    ADOQuery1.Close;
    ADOQuery1.SQL.Text:= 'Select * from '+ComboBox1.Text;
    ADOQuery1.Open;
    DBGrid1.Columns.Clear;
    DBGrid1.Columns.State := csCustomized;
    DBGrid1.Columns[0].Width := 64;
    // con esto veo el nombre de los campos de la tabla gracias a Roman.
    DataModule1.AC1.GetFieldNames(ComboBox1.Text, ComboBox2.Items);
    
end;

procedure TFManTablas.Button1Click(Sender: TObject);
begin
  Close;
end;

procedure TFManTablas.FormCreate(Sender: TObject);
begin
   // con esto veo el nombre de las tablas garcias a Roman
   DataModule1.AC1.GetTableNames(ComboBox1.Items);
end;

procedure TFManTablas.Edit1Change(Sender: TObject);
var
//   Filtro : String;
idx :integer;
begin
//   idx := AdoQuery1.Fields.indexof(ComboBox2.items[ComboBox2.itemindex]);
/    idx := ComboBox2.ItemIndex;
     AdoQuery1.Close;
  case AdoQuery1.Fields[idx].Datatype of
     ftString   : AdoQuery1.Filter := ComboBox2.Text+ ' = '''+Edit1.Text+ '*''';
     ftInteger  : AdoQuery1.Filter := ComboBox2.Text+ ' = '+Edit1.Text;
     ftFloat,
     ftCurrency : AdoQuery1.Filter := ComboBox2.Text+ ' >= '+Edit1.Text;
     ftDate,
     ftTime     : AdoQuery1.Filter := ComboBox2.Text+ ' = '''+Edit1.Text+ '''';
  end;
  AdoQuery1.Filtered := True;
  AdoQuery1.Open;


 {  // esta opcion da un error en tiempo de diseño no en ejecucion
   // esto es por la rutina try except, que lo produce
   // no afecta el programa, filtra bien
   If (Edit1.Text <> '') then
   begin
   AdoQuery1.Filtered := false;
   try
   Filtro := ComboBox2.Text+ ' Like '''+Edit1.Text+ '*''';
   ADOQuery1.Filter := Filtro;
   ADOQuery1.Filtered := True;
  // showmessage(Filtro + '1');
   except
         Filtro := ComboBox2.Text+ ' = '+Edit1.Text;
         ADOQuery1.Filter := Filtro;
         ADOQuery1.Filtered := True;
   //       showmessage(Filtro + '2');
   end
    end
   else ADOQuery1.Filtered := False; }
 end;

procedure TFManTablas.Button2Click(Sender: TObject);
begin
  //  ADOQuery1.Close;
    Edit1.Text:= '';
end;

end.
A ver si se os ocurre algo.
Gracias
Saludos
Responder Con Cita
  #2  
Antiguo 26-03-2007
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.561
Poder: 25
egostar Va camino a la fama
Hola Caral

Veo dos cosas,

1. El idx yo lo pondría en el evento onchange del combobox de los campos.

2. en el Edit1.Change veo que hay una inconsistencia que te da error cuando inicializas a '';

Código Delphi [-]
procedure TFManTablas.Edit1Change(Sender: TObject);
begin
    if Edit1.Text <> '' then begin // Solo si hay un campo a filtrar se realiza la operación.
      AdoQuery1.Close;
      case AdoQuery1.Fields[idx].Datatype of
          ftString   : AdoQuery1.Filter := ComboBox2.Text+ ' = '''+Edit1.Text+  '*''';
          ftInteger  : AdoQuery1.Filter := ComboBox2.Text+ ' = '+Edit1.Text;
          ftFloat,
          ftCurrency : AdoQuery1.Filter := ComboBox2.Text+ ' >= '+Edit1.Text;
          ftDate,
          ftTime     : AdoQuery1.Filter := ComboBox2.Text+ ' = '''+Edit1.Text+ '''';
     end;
     AdoQuery1.Filtered := True;
     AdoQuery1.Open;
  end;
end;

Salud OS.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney

Última edición por egostar fecha: 26-03-2007 a las 21:28:27.
Responder Con Cita
  #3  
Antiguo 26-03-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola egostar
No hay manera, segui tus explicaciones, colocando el idx en el combobox2 y me sale este error:
Cita:
List index out of bounds(441846) (
Lo curioso es que me sale un numero en un campo string, no se no me aclaro.
Saludos
Responder Con Cita
  #4  
Antiguo 26-03-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Hola,

Algunas cosas que he observado:
  • El orden en que GetFieldNames regresa los campos no necesariamente coincide con el orden natural en Fields. Por tanto, no se puede tomar tal cual el índice del combo de campos como había propuesto inicialmente. En su lugar puede hacerse:

    Código Delphi [-]
    var
      FieldName: String;
      Field: TField;
      Filter: String;
    
    begin
      FieldName := cboFieldNames.Text; // tomo el nombre del campo
      Field := AdoTable.Fields.FieldByName(FieldName); // buscamos el campo por nombre
    
      case Field.Datatype of
        ..
      end;
  • Al menos en mi caso, el tipo de datos que regresa Access para un campo Texto es ftWideString y no ftString, así que hay que considerar esto en el case:

    Código Delphi [-]
      case Field.Datatype of
        ftString, ftWideString: ....
      end;
  • Luego de algunas pruebas llego al conclusión de que el #$%&@ Access (¿o será el ADO?) no acepta el '=' en la comparación de cadenas con comodín *. Debe ser como decía Caral desde un principio: like.

// Saludos
Responder Con Cita
  #5  
Antiguo 28-03-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Perdonen Maestros por no contestar antes, pero estuve sin conexion a internet, fallas tipicas del pais.
Primero comentarles que funciono a la perfeccion y agradecer toda vuestra ayuda, asi quedo para que otras personas lo puedan ver.
Código Delphi [-]
// En Este form me ayudaron:
// Roman, Egostar, Lepe, ArdiIIa
// Un agradecimiento especial a ellos.

unit UFManTablas;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DBCtrls, DB, ADODB, Grids, DBGrids, ExtCtrls, ComCtrls;

type
  TFManTablas = class(TForm)
    Panel1: TPanel;
    Label2: TLabel;
    ComboBox1: TComboBox;
    DBGrid1: TDBGrid;
    ADOQuery1: TADOQuery;
    DataSource1: TDataSource;
    DBNavigator1: TDBNavigator;
    Button1: TButton;
    Label3: TLabel;
    Edit1: TEdit;
    Label1: TLabel;
    ComboBox2: TComboBox;
    Label4: TLabel;
    DateTimePicker1: TDateTimePicker;
    procedure ComboBox1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure DateTimePicker1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FManTablas: TFManTablas;

implementation

uses UDM1;

{$R *.dfm}

procedure TFManTablas.ComboBox1Change(Sender: TObject);
begin
    AdoQuery1.Filtered := False;
    Edit1.Text:= '';
    ComboBox2.Clear;
    DateTimePicker1.CleanupInstance;
    ADOQuery1.Close;
    ADOQuery1.SQL.Text:= 'Select * from '+ComboBox1.Text;
    ADOQuery1.Open;
    DBGrid1.Columns.Clear;
    DBGrid1.Columns.State := csCustomized;
    DBGrid1.Columns[0].Width := 64;
    // con esto veo el nombre de los campos de la tabla.
    DataModule1.AC1.GetFieldNames(ComboBox1.Text, ComboBox2.Items);
    
end;

procedure TFManTablas.Button1Click(Sender: TObject);
begin
  Close;
end;

procedure TFManTablas.FormCreate(Sender: TObject);
begin
   // con esto veo el nombre de las tablas
   DataModule1.AC1.GetTableNames(ComboBox1.Items);
   DateTimePicker1.DateTime:= now;
end;

procedure TFManTablas.Edit1Change(Sender: TObject);
var
  FieldName: String;
  Field: TField;
//  Filter: String;
begin
   If (Edit1.Text <> '') then
   begin
  FieldName := ComboBox2.Text; // tomo el nombre del campo
  Field := AdoQuery1.Fields.FieldByName(FieldName); // buscamos el campo por nombre
  AdoQuery1.Close;
  case Field.Datatype of
      ftString, ftWideString:  ADOQuery1.Filter := ComboBox2.Text+ ' Like '''+Edit1.Text+ '*''';
      ftInteger : ADOQuery1.Filter := ComboBox2.Text+ ' = '+Edit1.Text;
     ftFloat : ADOQuery1.Filter := ComboBox2.Text+ ' = '+Edit1.Text;
     end;
     AdoQuery1.Filtered := True;
     AdoQuery1.Open;
  end;
   end;

procedure TFManTablas.DateTimePicker1Change(Sender: TObject);
var
  FieldName: String;
  Field: TField;
 // Filter: String;
begin
  FieldName := ComboBox2.Text; // tomo el nombre del campo
  Field := AdoQuery1.Fields.FieldByName(FieldName); // buscamos el campo por nombre
  AdoQuery1.Close;
  case Field.Datatype of
     ftDateTime : AdoQuery1.Filter := ComboBox2.Text+ ' = '+DateToStr(DateTimePicker1.DateTime);
      end;
     AdoQuery1.Filtered := True;
     AdoQuery1.Open;
end;
end.
Reitero Muchisimas gracias Maestros.
Saludos
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
Llenar un combobox con los campos de una tabla enecumene Conexión con bases de datos 6 07-03-2007 21:42:28
Deshabilitar items de un ComboBox vejerf Varios 0 06-02-2007 19:50:33
Codigo en los Items de un Combobox juanjoassenza OOP 3 20-07-2006 10:19:03
eliminar items combobox emiliu Varios 5 20-12-2005 08:12:13
Lista de items combobox Carlos Arevalo OOP 1 16-08-2003 07:10:48


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


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