PDA

Ver la Versión Completa : Pasar Datos de un query a un listbox


Belen12
22-06-2016, 06:05:20
Hola Buenas Noches. Estoy trabajando con un formulario de alta de empleados los cuales algunos tienen muchos puestos de trabajos.Para esto uso una tabla intermedia denominada Asignado que contiene las clave primaria de ambas tablas (puesto,empleados). Tengo un formulario de alta de empleados los cuales estoy cargando los datos de los mismo como dni,apellido,dirección,etc y luego tengo un boton que lo llamo "agregar" me abre otro listado llamado "Listado de puestos laborales" el cual tiene los puestos (id,descripción) en lo cual atravez de un boton llamado "seleccionar" quiero llevarme por así decirlo la "descripción" y se guarde en el ListBox del formulario empleados.

Bien aqui dejo el codigo que estube trabajando lo cual me tira error

del boton agregar que llama al formulario "listado de puestos laborales"

procedure TfEmpleados.AgregarClick(Sender: TObject);
begin
qPuestos.Active:=true;
qPuestos.Insert;
qPuestos.Refresh;
fListadoPuestos:=TfListadoPuestos.Create(self);
fListadoPuestos.ShowModal
end;


y del boton seleccionar que se encuentra en el formulario listado

procedure TfListadoPuestos.bSeleccionarClick(Sender: TObject);
begin
qAsignado.Active:=true;
qAsignado.Insert;
qAsignados['idpuesto']:=qPuestos['idpuesto']; // aqui intento guardar la clave primaria de la tabla idpuesto en la tabla dereferencia Asginados
qAsignados['idempleado'] := qEmpleados['idempleado'] ;
fEmpleados.ListBox1.Items.Add(qPuestos.['descripcion']); // guardar el campo en el listbox
end;

Es hasta donde llegue pero no me carga nada en el listbox y tampoco las clave se cargan en la tabla "Asignado" espero que puedan guiarme en el tema
Estoy trabajando con delphi 2010,Componentes zeos y mysql-5.Dejo de paso las tablas sql por si no quedo claro la relacion

empleados
idempleado
dni
direccion


asignados
idpuesto
idempleado


puestos
idpuesto
descripsion



desde ya muchas gracias

AgustinOrtu
22-06-2016, 07:27:45
Es que no me queda del todo claro. Si te queres llevar la descripcion, porque estas dando de alta un nuevo registro?

Ademas no es sano que los form se entre conozcan entre si. Es mucho mejor hacer algo como esto:

Agrega esta propiedad en tu TfListadoPuestos:


type
TfListadoPuestos = class(TForm)
private
FDescripcionPuesto: string;
public
function Execute: Boolean;
property DescripcionPuesto: string read FDescripcionPuesto;
end;

implementation

function TfListadoPuestos.Execute: Boolean;
begin
if ShowModal = mrOk then
begin
Result := True;
FDescripcionPuesto := // aca pones el valor del puesto seleccionado
end
else
Result := False;
end;


Y luego podes invocar a este form asi:


var
FListadoPuestos: TfListadoPuestos;
begin
FListadoPuestos := TfListadoPuestos.Create(Self)
if FListadoPuestos.Execute then
FListadoPuestos.DescripcionPuesto // valor que tienes que agregar al listbox
end;


--

Esto es ya mas consejo: Por que accedes a los valores de los campos como Variants?

TDataSet tiene una propiedad indizada y por defecto que devuelve el Variant del campo que pasas por indice. Pero he tenido malas experiencias con esta propiedad.

Te aconsejo usar DataSet.FieldByName('Campo').AsString/AsInteger, etc

A mi tambien me parece espantosamente larga la sintaxis, pero ya que llevas Delphi 2010, lo podes solucionar con una clase de extension:

interface

uses
DB;

type
TDataSetHelper = class helper for TDataSet
private
function GetFieldObject(Index: string): TField; inline;
public
property FieldObject[Index: string]: TField read GetFieldObject;
end;

implementation

function TDataSetHelper.GetFieldObject(Index: string): TField;
begin
Result := FieldByName(Index);
end;

Y ahora podrias escribir:


DataSet['NombreCampo'].AsInteger;

ecfisa
22-06-2016, 19:05:53
Hola Belen12.

A mi tampoco me queda clara la forma en que deseas implementar la solución. Entiendo que tenes tres tablas,

Empleados
---------
ID
...

Puestos
-------
ID
...

Asignado
--------
Empleados_ID,
Puestos_ID

donde la tabla PUESTOS ya tiene cargado los cargos disponibles y la tabla ASIGNADO se encarga de almacenar las distintas relaciones: empleado_N -> cargo_1, cargo_2, ..., cargo_N.

Pero, ¿ Por que hacer la elección del puesto desde otro formulario ? Podrías hacerlo todo desde el formulario de ingreso de empleado, una imágen de ejemplo a lo que me refiero:
https://s31.postimg.org/yum7g21nf/Belen12.jpg

Si no entendí mal tu planteo, podría resultarte una opción mas sencilla de mantener y el código tampoco es muy complejo:

// Cargar cargo/ID en el TCheckListBox
procedure TForm1.FormCreate(Sender: TObject);
begin
qyPuesto.Open;
qyPuesto.DisableControls;
qyPuesto.First;
try
while not qyPuesto.Eof do
begin
CheckListBox1.Items.AddObject(
qyPuesto.FieldByName('CARGO').AsString,
TObject(qyPuesto.FieldByName('ID').AsInteger));
qyPuesto.Next;
end;
qyPuesto.First;
finally
qyPuesto.EnableControls;
end;
...
end;

procedure TForm1.btnSaveClick(Sender: TObject);
var
i: Integer;
begin
...
... ( guardar datos del empleado )
...

for i := 0 to CheckListBox1.Items.Count -1 do
begin
if CheckListBox1.Checked[i] then
begin
tbAsignado.Insert;

tbAsignado.FieldByName('ID_EMPLEADO').AsInteger :=
tbEmpleado.FieldByName('ID').AsInteger;

tbAsignado.FieldByName('ID_PUESTO').AsInteger :=
Integer(CheckListBox1.Items.Objects[i]);

tbAsignado.Post;
end;
end;
end;


Saludos :)

Belen12
22-06-2016, 19:19:22
muchas gracias por responder es muy bueno el codigo funciona sin prolema. Si basicamente queria haceder a otro formulario y traerme la descripsion de los puestos a un listbox

Belen12
22-06-2016, 19:22:03
Muchas gracias funciona perfecto el codigo y tienes razon es mas tedioso ir de un formulario a otro no lo habia pensado con un checklistbox me fue de mucha ayuda