Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   funcion recursiva para este codigo (https://www.clubdelphi.com/foros/showthread.php?t=74429)

ingabraham 19-06-2011 21:19:36

funcion recursiva para este codigo
 
necesito reducir este codigo. con una funcion.
el sgt codigo agrupa datos para cargarlos en combobox. para muchos combox con caracteristicas similares.

si alguien me puede ayudar

Código Delphi [-]


procedure TEstadistica.CargarDatosCombox;
begin

 CBDpto.Clear;
 CBDpto.Items.Add('TODOS');
 With DMDatos.IBConsultaSql do Begin
   close;
   Sql.Clear;
   Sql.Add('Select DEPARTAMENTO as Dato From NACIMIENTOS Group By DEPARTAMENTO ');
   Open;
   If RecordCount <> 0 Then Begin
     First;
     While not eof do Begin
       CBDpto.Items.Add(fieldbyname('Dato').AsString);
       Next;
     End;
  End;
 End;
  CBDpto.Text  :='TODOS' ;


//==============================================================================

 CBMunicipio.Clear;
 CBMunicipio.Items.Add('TODOS');
 With DMDatos.IBConsultaSql do Begin
   close;
   Sql.Clear;
   Sql.Add('Select MUNICIPIO as Dato From NACIMIENTOS Group By MUNICIPIO ');
   Open;
   If RecordCount <> 0 Then Begin
     First;
     While not eof do Begin
       CBMunicipio.Items.Add(fieldbyname('Dato').AsString);
       Next;
     End;
  End;
 End;
  CBMunicipio.Text  :='TODOS' ;

//==============================================================================

 CBAreaNacimiento.Clear;
 CBAreaNacimiento.Items.Add('TODOS');
 With DMDatos.IBConsultaSql do Begin
   close;
   Sql.Clear;
   Sql.Add('Select AREA_NACIMIENTO as Dato From NACIMIENTOS Group By AREA_NACIMIENTO ');
   Open;
   If RecordCount <> 0 Then Begin
     First;
     While not eof do Begin
       CBAreaNacimiento.Items.Add(fieldbyname('Dato').AsString);
       Next;
     End;
  End;
 End;
  CBAreaNacimiento.Text  :='TODOS' ;


//============================================================================== y siguen con otros mismos dif campos
end;

Casimiro Notevi 19-06-2011 21:37:00

Tengo un procedure para rellenar combobox, mira si te sirve:

Código Delphi [-]
type TiposCampo = set of TFieldType;

procedure RellenarCombo( DS:TDataSet; tcTiposCampo:TiposCampo; var cbCombo:TComboBox);
Código Delphi [-]
procedure RellenarCombo( DS:TDataSet; tcTiposCampo:TiposCampo; var cbCombo:TComboBox);
(* Rellena los elementos de un combobox con los campos de un dataset cuyos
   tipos estén en la lista que se le pasa *)
var
  iX : integer;
begin
  cbCombo.Items.Clear;
  for iX := 0 to DS.FieldCount - 1 do
    with DS.Fields[iX] do
      if (FieldKind = fkData) and (DataType in tcTiposCampo) then
        cbCombo.Items.AddObject(DisplayLabel, DS.Fields[iX]);
    cbCombo.ItemIndex := 0;
end;

Caral 20-06-2011 01:38:36

Hola
Código Delphi [-]
procedure TEstadistica.CargarDatosCombox;
begin
 CBDpto.Clear;
 CBDpto.Items.Add('TODOS');
 CBMunicipio.Clear;
 CBMunicipio.Items.Add('TODOS');
 CBAreaNacimiento.Clear;
 CBAreaNacimiento.Items.Add('TODOS');
 With DMDatos.IBConsultaSql do Begin
   close;
   Sql.Text:= 'Select DEPARTAMENTO, MUNICIPIO, AREA_NACIMIENTO '+
              ' From NACIMIENTOS Group By DEPARTAMENTO, MUNICIPIO, AREA_NACIMIENTO ';
   Open;
   If RecordCount <> 0 Then Begin
   While not eof do Begin
   CBDpto.Items.Add(fieldbyname('DEPARTAMENTO').AsString);
   CBMunicipio.Items.Add(fieldbyname('MUNICIPIO').AsString);
   CBAreaNacimiento.Items.Add(fieldbyname('AREA_NACIMIENTO').AsString);
   Next;
   End;
   End;
  End;
  CBDpto.Text  :='TODOS' ;
  CBMunicipio.Text  :='TODOS' ;
  CBAreaNacimiento.Text  :='TODOS' ;
end;
Saludos

ingabraham 20-06-2011 15:29:00

gracias Novato Premium
pero ese codigo tambien se me extenderia mucho,. por que son casi 50 combo.
una funcion recursiva si me ayudaria.

ingabraham 20-06-2011 16:38:34

Cita:

Empezado por Casimiro Notevi (Mensaje 404226)
Tengo un procedure para rellenar combobox, mira si te sirve:

Código Delphi [-]
type TiposCampo = set of TFieldType;

procedure RellenarCombo( DS:TDataSet; tcTiposCampo:TiposCampo; var cbCombo:TComboBox);
Código Delphi [-]
procedure RellenarCombo( DS:TDataSet; tcTiposCampo:TiposCampo; var cbCombo:TComboBox);
(* Rellena los elementos de un combobox con los campos de un dataset cuyos
   tipos estén en la lista que se le pasa *)
var
  iX : integer;
begin
  cbCombo.Items.Clear;
  for iX := 0 to DS.FieldCount - 1 do
    with DS.Fields[iX] do
      if (FieldKind = fkData) and (DataType in tcTiposCampo) then
        cbCombo.Items.AddObject(DisplayLabel, DS.Fields[iX]);
    cbCombo.ItemIndex := 0;
end;

unideclrade identifiquer TFieldType y DisplayLabel.
me sale este error

ingabraham 20-06-2011 16:58:54

Código Delphi [-]

use  IBQuery;



procedure RellenarCombo( DS:TIBQuery; var cbCombo:TComboBox);
var
  iX : integer;
begin
 cbCombo.Items.Clear;
 cbCombo.Items.Add('TODOS');
 If DS.Recordcount <> 0 then
  begin
      DS.First;
      While not DS.eof do
      Begin
        cbCombo.Items.Add(DS.Fields[iX].AsString);
        DS.Next;
       end;
  end;

    cbCombo.ItemIndex := 0;
end;



   DMDatos.ConsultaSql('Select DEPARTAMENTO as Dato From NACIMIENTOS Group By DEPARTAMENTO ');
   RellenarCombo(DMDatos.IBConsultaSql,CBDpto);

listo, pal k le sirva

ecfisa 20-06-2011 16:59:31

Cita:

unideclrade identifiquer TFieldType y DisplayLabel.
me sale este error
Hola.

En este hilo tuviste la misma duda. Nuevamente tenes que incluir la unit DB. ;)


Saludos.

Casimiro Notevi 20-06-2011 17:37:13

Cita:

Empezado por ecfisa (Mensaje 404261)
Hola.
En este hilo tuviste la misma duda. Nuevamente tenes que incluir la unit DB. ;)
Saludos.

Pues sí, a veces se olvidan esos detalles, son tantas cosas :)

cloayza 21-06-2011 03:21:44

Dandole una vuelta el tema podria ser así.. :D

Consulta

[delphi]
Código Delphi [-]
procedure RellenarCombo( DS:TIBQuery; AFieldname:String; var cbCombo:TComboBox);
var
  iX : integer;
begin
     cbCombo.Items.Clear;
     cbCombo.Items.Text:= DS.FieldByName(AFieldName).AsString;

    cbCombo.ItemIndex := 0;
end;


   DMDatos.ConsultaSql('SELECT ''TODOS''||ASCII_CHAR(13)||LIST(DEPARTAMENTO,ASCII_CHAR(13)) as DATO FROM (SELECT DISTINCT DEPARTAMENTO FROM NACIMIENTOS))');

   RellenarCombo(DMDatos.IBConsultaSql,'DATO',CBDpto);

Pues eso nada mas...

Este codigo hace uso de la funccion LIST que es de Firebird... Si es otro DBMS creo que no serviria...:)

ingabraham 21-06-2011 17:31:13

k barbaridad de codigo, nunk habia visto esto. gracias cuando pueda lo probare y analizare. me interesa sabes este tipo de comandos.

Chris 21-06-2011 17:55:32

Que componentes utilizas para hacer la conexión a Firebird? Si utilizas FIBPlus hay una función en los componentes que te puede ayudar mucho en la tarea. Pero además necesitarás utilizar la función LIST incluida en Firebird 2.1 o superior.

Saludos,
Chris

ingabraham 21-06-2011 18:01:07

ib, ibdatabase y ibtransaction. fb 2.0


La franja horaria es GMT +2. Ahora son las 18:42:22.

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