Catálogos cascada en Delphi
Hola Bienvenidos otra semana a nuestro blog de programación, esta semana para darle continuidad al primer post del año acerca de comparar propuestas salariales, les quiero platicar acerca de los diferentes puestos de trabajo en el área de sistemas y como siempre haciendo un ejemplo de esto.
Al hacer este post pensé en las siguientes preguntas:
Al hacer este post pensé en las siguientes preguntas:
- ¿Como sub-dividirías los puestos de Trabajo en TI?
- ¿Qué área es la que tiene más demanda de Staff?
- ¿Que áreas crees que tengan más desarrollo?
- ¿Les recomendarías a las personas aprender a programar?
Las 10 carreras y áreas mejor pagadas para el 2020 en México y entre ellas esta sistemas,software y programación con sueldos promedio de $30,000.00 MXN
Ojala si algún consultor de RH o reclutador lee este post nos ayude con sus comentarios de estas preguntas.
Ahora entrando a materia en el ejemplo de este Post:
Objetivo del Programa en Delphi 7.0
Cuando nos piden ingresar una dirección, normalmente hacemos uso de una lista y otros campos se habilitan en dependencia del primer valor esto son son los Combobox o Listas desplegable en cascada, esto es para cuando queremos llenar un formulario y queremos que el usuario solo seleccione un dato de las lista que ya tenemos, esto para evitar que los datos ingresados puedan estar mal escritos o tengan espacios.
Para hacer este ejemplo, vamos a programar en Delphi y vamos utilizar una base de datos para poder leer la información.
Necesitamos 3 tablas
- Área
- Subarea
- Puestos
Vamos a crear las tablas en Microsoft Access
CREATE TABLE "Area" (
"Area_id" INTEGER,
"Area_name" TEXT,
PRIMARY KEY("Area_id")
);
CREATE TABLE "Subarea" (
"Subarea_id" INTEGER,
"Area_id" INTEGER,
"Subarea_name" TEXT,
PRIMARY KEY("Subarea_id")
);
CREATE TABLE "Puesto" (
"Puesto_id" INTEGER,
"Subarea_id" INTEGER,
"Puestoname" LONGTEXT,
"Puestodesc" TEXT
);
CREATE TABLE "Area" (
"Area_id" INTEGER,
"Area_name" TEXT,
PRIMARY KEY("Area_id")
);
CREATE TABLE "Subarea" (
"Subarea_id" INTEGER,
"Area_id" INTEGER,
"Subarea_name" TEXT,
PRIMARY KEY("Subarea_id")
);
CREATE TABLE "Puesto" (
"Puesto_id" INTEGER,
"Subarea_id" INTEGER,
"Puestoname" LONGTEXT,
"Puestodesc" TEXT
);
Diagrama Entidad Relación
Datos en Base de datos
Tabla de Puestos
El código
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DBCtrls, DB, ADODB, StdCtrls;
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ComboBox1: TComboBox;
Label1: TLabel;
Label2: TLabel;
ADOQuery1: TADOQuery;
DataSource2: TDataSource;
DataSource1: TDataSource;
ADOQuery2: TADOQuery;
ComboBox2: TComboBox;
Label3: TLabel;
Label4: TLabel;
ComboBox3: TComboBox;
ADOQuery3: TADOQuery;
DataSource3: TDataSource;
Label5: TLabel;
Label6: TLabel;
ADOQuery4: TADOQuery;
DataSource4: TDataSource;
Label7: TLabel;
Label8: TLabel;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure ComboBox2Change(Sender: TObject);
procedure ComboBox3Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
id_area:String;
id_subarea:String;
id_puesto: String;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
ADOQuery1.Active := False;
ADOQuery1.Active := True;
While not ADOQuery1.Eof do
begin
Combobox1.Items.Add(ADOQuery1.Fields[1].Text);
ADOQuery1.Next;
end;
ADOQuery1.Active := False;
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
id_area :=Combobox1.Text;
// showmessage('Hola ' + id_area);
ADOQuery2.Active := False;
ADOQuery2.SQL.Text := 'Select subarea_name FROM subarea INNER JOIN area ON area.id = subarea.area_id WHERE area_name ='+ Char(39) + id_area + Char(39);
ADOQuery2.Active := True;
Combobox2.Items.Clear;
While not ADOQuery2.Eof do
begin
Combobox2.Items.Add(ADOQuery2.Fields[0].Text);
ADOQuery2.Next;
end;
ADOQuery2.Active := False;
end;
procedure TForm1.ComboBox2Change(Sender: TObject);
begin
id_subarea :=Combobox2.Text;
// showmessage('Holasub ' + id_subarea);
ADOQuery3.Active := False;
ADOQuery3.SQL.Text := 'Select puesto_name FROM puesto INNER JOIN subarea ON subarea.id = puesto.subarea_id WHERE subarea_name ='+ Char(39) + id_subarea + Char(39);
ADOQuery3.Active := True;
Combobox3.Items.Clear;
While not ADOQuery3.Eof do
begin
Combobox3.Items.Add(ADOQuery3.Fields[0].Text);
ADOQuery3.Next;
end;
ADOQuery3.Active := False;
end;
procedure TForm1.ComboBox3Change(Sender: TObject);
begin
id_puesto :=Combobox3.Text;
// showmessage('Hola puesto ' + id_puesto);
ADOQuery4.Active := False;
ADOQuery4.SQL.Text := 'Select Puesto_descripcion FROM puesto INNER JOIN subarea ON subarea.id = puesto.subarea_id WHERE subarea_name ='+ Char(39) + id_subarea + Char(39) + ' AND puesto_name =' + Char(39) + id_puesto + Char(39);
ADOQuery4.Active := True;
// showmessage(ADOQuery4.SQL.Text);
Memo1.Clear;
Memo1.Lines.add(ADOQuery4.Fields[0].Value);
end;
end.
Explicación del programa en Delphi 7.0
- Para este programa utilice la conexión a la base de datos con el objeto TADOConnection para configurar la base de datos de Access
- El objeto TADOQuery para poder configurar un query a la base de datos, fue un objeto por cada combox y el Memo. Cada query se configura en la propiedad ADOQuery2.SQL.Text
- Utilice el objeto TDataSource para ligar cada Query
Otra opción pudo haber sido utilizar TDBMemo, TDBLookupComboBox
La ejecución del programa
Espero les sea de utilidad todo lo plasmado en este post, no olviden dejar sus comentarios y compartir nuestro blog, saludos!!!
Otro post relacionado a Delphi que pueden encontrar aquí es para hacer una calculadora https://www.programacionparatodos.com/2019/07/como-programarpascal-o-delphi.html
Pueden seguirnos también en nuestra página de Facebook
Comentarios
Publicar un comentario