Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-12-2016
Belen12 Belen12 is offline
Miembro
NULL
 
Registrado: may 2016
Posts: 29
Poder: 0
Belen12 Va por buen camino
Mira

Cita:
Empezado por Neftali Ver Mensaje
Si lanzas la consulta que estás lanzando para rellenar los puestos directamente contra la Base de Datos, ¿Te salen duplicados?
mira a ver si me doy a entender. la primera consulta usandola solo me trae todos los puestos. por otro lado la segunda consulta me trae los puestos con el check en true. Ambas consulta lanzadas por si solas no me dan duplicado me andan bien ya lo comprobe.El tema es que al unir las 2 en ves de traerme todos(que haria la primera) y y poner solo en true los que le corresponde al seleccionado(esto en teoria deberia hacer la segunda) la segunda consulta me llena un nuevo puesto y este lo deja en check y aqui es donde se me produce el duplicado. Intente sacando la siguiente linea
Código Delphi [-]
 fempleados.CheckListBox1.Items.AddObject( fmodulo.qPuestos.FieldByName('nombrepuesto').AsString,         TObject(fmodulo.qPuestos.FieldByName('idpuesto').AsInteger));
que es la que me llena el duplicado pero al hacerlo me deja en true solo el ultimo registro :/ gracias por responder
Responder Con Cita
  #2  
Antiguo 13-12-2016
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Si te entendí bien podrías hacer algo similar a esto:
Código Delphi [-]
...
procedure TForm1.FormCreate(Sender: TObject);
begin
  // Cargar en el CheckListBox los cargos de la tabla PUESTO
  unQuery.Close;
  unQuery.SQL.Text := 'SELECT ID, NOMBREPUESTO FROM PUESTO';
  unQuery.Open;
  while not unQuery.Eof do
  begin
    CheckListBox1.AddItem( unQuery.FieldByName( 'NOMBREPUESTO' ).AsString,
      TObject(unQuery.FieldByName ( 'ID' ).AsInteger ) );
    unQuery.Next;
  end;
  unQuery.Close;
end;

procedure TForm1.ActualizarPuestos( const EmpID: Integer );
var
  i : Integer;
begin
  // Quitar tildes a los items del CheckListBox 
  for i := 0 to CheckListBox1.Items.Count - 1 do
    CheckListBox1.Checked[i] := False;

  // Seleccionar los puestos asignados al empleado EmpID
  unQuery.Close;
  unQuery.SQL.Clear;
  unQuery.SQL.Add( 'SELECT P.ID AS PUESTOID FROM EMPLEADOS E' );
  unQuery.SQL.Add( 'INNER JOIN ASIGNADOS A ON E.ID = A.EMPLEADO_ID' );
  unQuery.SQL.Add( 'INNER JOIN PUESTOS P ON P.ID = A.PUESTO_ID' );
  unQuery.SQL.Add( 'AND E.ID = :EMPID' );
  unQuery.ParamByName( 'EMPID' ).AsInteger := EmpID;
  unQuery.Open;

  // Poner tildes en aquellos cargos que EmpID tenga asignados
  while not unQuery.Eof do
  begin
    i := CheckListBox1.Items.IndexOfObject(
      TObject( unQuery.FieldByName( 'PUESTOID' ).AsInteger ) );
    if i <> -1 then
      CheckListBox1.Checked[i] := True;
    unQuery.Next;
  end;
end;
...

Llamada ejemplo:
Código Delphi [-]
begin
  ActualizarPuestos( SpinEdit1.Value );
  ...
De ese modo se carga una sola vez la totalidad de puestos en el CheckListBox y se marcan con un tilde los puestos que tiene asignados el empleado cuyo ID se le envía al procedimiento ActualizarPuestos.

Espero haberte interpretado bien...

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 14-12-2016
Belen12 Belen12 is offline
Miembro
NULL
 
Registrado: may 2016
Posts: 29
Poder: 0
Belen12 Va por buen camino
gracias

Cita:
Empezado por ecfisa Ver Mensaje
Hola.

Si te entendí bien podrías hacer algo similar a esto:
Código Delphi [-]
...
procedure TForm1.FormCreate(Sender: TObject);
begin
  // Cargar en el CheckListBox los cargos de la tabla PUESTO
  unQuery.Close;
  unQuery.SQL.Text := 'SELECT ID, NOMBREPUESTO FROM PUESTO';
  unQuery.Open;
  while not unQuery.Eof do
  begin
    CheckListBox1.AddItem( unQuery.FieldByName( 'NOMBREPUESTO' ).AsString,
      TObject(unQuery.FieldByName ( 'ID' ).AsInteger ) );
    unQuery.Next;
  end;
  unQuery.Close;
end;

procedure TForm1.ActualizarPuestos( const EmpID: Integer );
var
  i : Integer;
begin
  // Quitar tildes a los items del CheckListBox 
  for i := 0 to CheckListBox1.Items.Count - 1 do
    CheckListBox1.Checked[i] := False;

  // Seleccionar los puestos asignados al empleado EmpID
  unQuery.Close;
  unQuery.SQL.Clear;
  unQuery.SQL.Add( 'SELECT P.ID AS PUESTOID FROM EMPLEADOS E' );
  unQuery.SQL.Add( 'INNER JOIN ASIGNADOS A ON E.ID = A.EMPLEADO_ID' );
  unQuery.SQL.Add( 'INNER JOIN PUESTOS P ON P.ID = A.PUESTO_ID' );
  unQuery.SQL.Add( 'AND E.ID = :EMPID' );
  unQuery.ParamByName( 'EMPID' ).AsInteger := EmpID;
  unQuery.Open;

  // Poner tildes en aquellos cargos que EmpID tenga asignados
  while not unQuery.Eof do
  begin
    i := CheckListBox1.Items.IndexOfObject(
      TObject( unQuery.FieldByName( 'PUESTOID' ).AsInteger ) );
    if i <> -1 then
      CheckListBox1.Checked[i] := True;
    unQuery.Next;
  end;
end;
...

Llamada ejemplo:
Código Delphi [-]
begin
  ActualizarPuestos( SpinEdit1.Value );
  ...
De ese modo se carga una sola vez la totalidad de puestos en el CheckListBox y se marcan con un tilde los puestos que tiene asignados el empleado cuyo ID se le envía al procedimiento ActualizarPuestos.

Espero haberte interpretado bien...

Saludos
gracias me sirvio de mucho ya me funciona como quiero. Mira una ultima cosa ahora ya que tengo esto procedo a realizar el post de la modificacion. y cuando hacia el insert primero usaba el siguiente codigo en el boton aceptar
Código Delphi [-]
qEmpleados['fechanacimiento']:=dtFecha.Date
qEmpleados.Post
for i:= 0 to CheckListBox1.Items.Count-1 do
 begin
   if CheckListBox1.Checked[i] then
     begin
      tAsignados.Insert;
      tAsignado.FielbyName('idempleado').AsInteger:= qEmpleados.FielbyName('idempleado').AsInteger; 
      tAsignado.FielbyName('idpuesto').AsInteger:= Integer(CheckListBox1.Items.Objects[i]) ;
      tAsignados.Post;
end;
end;
y al realizar la modificacion cambio tAsignados.Insert lo cambio a Edit y uso el mismo codigo lo que sucede es que no me modifica nada y solo me inserta dos veces el mismo valor por ejemplo si marco 2 puestos nuevos(cajeros por ej) y este ya es vendedor se me carga 3 puestos de vendedores alguna idea por que sucede esto ? ya revice el codigo de pie a cabeza y no tengo ningun insert en ningun lado para que me genere este problema. sera problema en el codigo que postie ?
gracias por toda la ayuda de verdad
Responder Con Cita
  #4  
Antiguo 14-12-2016
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Como lo estas trabajando, me parece que tendrás que "limpiar" todos los puestos anteriores de un empleado y luego agregar los nuevos cargos, algo parecido a esto:
Código Delphi [-]
procedure TForm1.ModificarPuestos(const EmpID: Integer);
var
  i,Pid: Integer;
begin
  // Borrar los puestos anteriores de un empleado
  unQuery.Close;
  unQuery.SQL.Text := 'DELETE FROM ASIGNADO WHERE EMPLEADO_ID = :EID';
  unQuery.ParamByName('EID').AsInteger := EmpID;
  unQuery.ExecSQL;

  // Agregar los nuevos valores del CheckListBox
  unQuery.Close;
  unQuery.SQL.Clear;
  unQuery.SQL.Add('INSERT INTO ASIGNADO( EMPLEADO_ID, PUESTO_ID )');
  unQuery.SQL.Add('VALUES( :EID, :PID )');
  unQuery.Prepare;
  try
    for i := 0 to CheckListBox1.Items.Count - 1 do
      if CheckListBox1.Checked[i] then
      begin
        Pid := Integer(CheckListBox1.Items.Objects[i]);
        unQuery.ParamByName('EID').AsInteger := EmpID;
        unQuery.ParamByName('PID').AsInteger := Pid;
        unQuery.ExecSQL;
      end;
  finally
    unQuery.UnPrepare;
  end;
end;
Llamada ejemplo:
Código Delphi [-]
begin
  ModificarPuestos( SpinEdit1.Value );
...

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 15-12-2016
Belen12 Belen12 is offline
Miembro
NULL
 
Registrado: may 2016
Posts: 29
Poder: 0
Belen12 Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
Hola.

Como lo estas trabajando, me parece que tendrás que "limpiar" todos los puestos anteriores de un empleado y luego agregar los nuevos cargos, algo parecido a esto:
Código Delphi [-]
procedure TForm1.ModificarPuestos(const EmpID: Integer);
var
  i,Pid: Integer;
begin
  // Borrar los puestos anteriores de un empleado
  unQuery.Close;
  unQuery.SQL.Text := 'DELETE FROM ASIGNADO WHERE EMPLEADO_ID = :EID';
  unQuery.ParamByName('EID').AsInteger := EmpID;
  unQuery.ExecSQL;

  // Agregar los nuevos valores del CheckListBox
  unQuery.Close;
  unQuery.SQL.Clear;
  unQuery.SQL.Add('INSERT INTO ASIGNADO( EMPLEADO_ID, PUESTO_ID )');
  unQuery.SQL.Add('VALUES( :EID, :PID )');
  unQuery.Prepare;
  try
    for i := 0 to CheckListBox1.Items.Count - 1 do
      if CheckListBox1.Checked[i] then
      begin
        Pid := Integer(CheckListBox1.Items.Objects[i]);
        unQuery.ParamByName('EID').AsInteger := EmpID;
        unQuery.ParamByName('PID').AsInteger := Pid;
        unQuery.ExecSQL;
      end;
  finally
    unQuery.UnPrepare;
  end;
end;
Llamada ejemplo:
Código Delphi [-]
begin
  ModificarPuestos( SpinEdit1.Value );
...

Saludos
muchas gracias me sirvio de mucho anda perfecto, muchas gracias por tomarte el tiempo y ayudarme.
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
Duda con CheckListBox johan Varios 4 20-09-2007 20:28:22
De CheckListBox tabla Camilo Varios 3 14-07-2007 03:53:18
CheckListBox JAI_ME Varios 3 24-01-2007 17:19:30
checklistbox argel OOP 4 16-06-2006 23:14:50
CheckListBox camelumi Varios 4 26-10-2004 21:11:33


La franja horaria es GMT +2. Ahora son las 23:47:48.


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