Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Multiseleccion DBgrid (https://www.clubdelphi.com/foros/showthread.php?t=96206)

kainchu3102 22-04-2023 18:54:33

Multiseleccion DBgrid
 
Hola gente espero que esten bien, tengo una consulta.

Tengo dos Dbgrid, DBGrid1 cuando selecciono la fila de uno en el otro me muestro los detalles relacionados en DBGrid2, en DBGrid1 cuando hago multiseleccion, en DBGrid2 no puedo hacer que me aparezcan los detalles relacionado a cada seleccion del DBGrid1.

Tengo este codigo, por favor si me podrian ayudar.
Código Delphi [-]
procedure TFORMINGRESO.multiselect;
 var
  X: Integer;

begin
  if DBGINGRESO.SelectedRows.Count = 0 then
  begin

  MessageBox (Handle, ' DEBE SELECCION AL MENOS 1 FILA PARA ELIMINAR ', ' SISTEMA CROSSROASD ', MB_OK);
    Exit;
  end
  else
  begin
     for X := 0 to DBGINGRESO.SelectedRows.Count -1 do
     with MDBRIONES.FDQBUS_DET_ING Do


      Begin
         DBGINGRESO.DataSource.DataSet.GotoBookmark(TBookmark(DBGINGRESO.SelectedRows.Items[X]));
        SQL.Clear;
        SQL.Add ('SELECT I.*, E. nom_esp, T. nom_tip FROM det_ingreso I LEFT JOIN especie E ON E.id_esp = id_esp_deting LEFT JOIN tipo T ON T.id_tip = id_tip_deting');
        SQL.Add ('WHERE id_ing_deting = :BUS4 ORDER BY LENGTH(cod_deting)ASC');
        params.ParamByName('BUS4').AsInteger := DBGINGRESO.datasource.dataset.fieldbyname('id_ing').Asinteger;
        Open();
        DBGDET_INGRESO.DataSource := MDBRIONES.DSBUS_DET_ING;

       end;
  end;

pgranados 22-04-2023 20:04:56

¿Apoco se puede hacer un multiselect en un DBGrid? :eek:

Cuando yo te tenido que hacer lo que comentas, muestro toda la información del DBGrid en un StringGrid y dejo que el usuario final haga todos los cambios.

Ejemplo: Quiero que un usuario seleccione 5 registros al mismo tiempo y al dar clic se eliminen.

Bueno, el DBGrid1 lo muestro en un StringGrid1 y al presionar el botón llamado "Eliminar" recorro todo el StringGrid1 y voy borrando.

O si quiero mostrar datos, lo mismo: recorro todo el stringGrid1 y voy armando la sentencia con la información del stringGrid:(

Casimiro Notevi 22-04-2023 21:09:50

A ver si he entendido, quieres que cuando tengas seleccionadas varias filas en el dbgrid "maestro", se muestren en el dbgrid "cliente" todas las filas de los seleccionados en "maestro".
¿Es eso?

Casimiro Notevi 22-04-2023 21:16:36

Cita:

Empezado por pgranados (Mensaje 551248)
¿Apoco se puede hacer un multiselect en un DBGrid? :eek:

Es una propiedad del dbgrid, multiselect.
Luego tienes métodos para saber las líneas seleccionadas, recorrerlas, eliminarlas, etc.

Garada 23-04-2023 00:46:48

Date cuenta que el resultado es el detalle del último registro de la selección.

Dentro del FOR vas mostrando el detalle de cada registro seleccionado pero reinicias el query en cada bucle, borrando la información anterior.

Deberías recoger en el FOR las claves del maestro y usarla después en un solo query sustituyendo el

Código Delphi [-]
SQL.Add ('WHERE id_ing_deting = :BUS4 ORDER BY LENGTH(cod_deting)ASC');

por

Código Delphi [-]
SQL.Add ('WHERE id_ing_deting IN (' + sClaves + ') ORDER BY LENGTH(cod_deting)ASC');

Siendo sClave un string con el valor de las claves separados por comas (p.e. '5,8,45,105')

kainchu3102 23-04-2023 04:46:24

Efectivamente seria un Maestro -Detalle en este caso, Ingreso - Detalle de Ingreso

kainchu3102 23-04-2023 04:47:18

Yo hago seleccion multiples desde el DBGrid y elimino desde ahi con Multiselect si quiere te paso el codigo.

kainchu3102 23-04-2023 04:48:12

No estoy entendiendo mil disculpas, lo probe de ese modo no me sale.

Garada 23-04-2023 10:59:44

Aquí tienes el código más desarrollado, usa el debug y comprueba las variables por si hay algo que está como se esperaba.

Código Delphi [-]
procedure TFORMINGRESO.multiselect;
 var
  X: Integer;
  sClaves: string; // Variable para guardar las claves de los registros seleccionados
begin
  if DBGINGRESO.SelectedRows.Count = 0 then
  begin
    MessageBox (Handle, ' DEBE SELECCION AL MENOS 1 FILA PARA ELIMINAR ', ' SISTEMA CROSSROASD ', MB_OK);
    Exit;
  end
  else
  begin
     sClaves := ''; // Inicializas la variable
     for X := 0 to DBGINGRESO.SelectedRows.Count -1 do
     with MDBRIONES.FDQBUS_DET_ING Do
     Begin
        DBGINGRESO.DataSource.DataSet.GotoBookmark(TBookmark(DBGINGRESO.SelectedRows.Items[X]));
        sClaves :=sClaves + ',' + DBGINGRESO.datasource.dataset.fieldbyname('id_ing').AsString; // Vas asignando las claves
     end;

     Delete(sClaves, 1, 1); // Se elimina la ',' inicial que sobra
     // Debes tener en sClave algo como '2,6,34,245'

     SQL.Clear;
     SQL.Add ('SELECT I.*, E. nom_esp, T. nom_tip FROM det_ingreso I LEFT JOIN especie E ON E.id_esp = id_esp_deting LEFT JOIN tipo T ON T.id_tip = id_tip_deting');
     SQL.Add ('WHERE id_ing_deting IN (' + sClaves + ') ORDER BY LENGTH(cod_deting)ASC'); // Cambias el WHERE
     // en el SQL.Text debes tener algo como 'SELECT I.*, E. nom_esp, T. nom_tip 
     // FROM det_ingreso I LEFT JOIN especie E ON E.id_esp = id_esp_deting LEFT JOIN tipo T ON T.id_tip = id_tip_deting 
     // WHERE id_ing_deting IN (2,6,34,245) ORDER BY LENGTH(cod_deting)ASC'

     Open();
     DBGDET_INGRESO.DataSource := MDBRIONES.DSBUS_DET_ING;
  end;
end;

kainchu3102 23-04-2023 19:33:43

me estaria marcando un error en esta linea

Delete(sClaves, 1, 1); // Se elimina la ',' inicial que sobra


[dcc32 Warning] Fprecio.pas(75): W1050 WideChar reduced to byte char in set expressions. Consider using 'CharInSet' function in 'SysUtils' unit.

kainchu3102 23-04-2023 19:39:20

Esto es basicamente lo que quiero que haga las multiples selecciones y me muestre los detalle de cada seleccion





kainchu3102 23-04-2023 19:41:30


Garada 23-04-2023 20:33:21

Es un aviso, no debería impedirte compilar el programa.

También es raro el aviso en esa línea, (¿seguro que es esa?) prueba con este cambio por si no esta usando otro procedimiento que se llame igual.

Código Delphi [-]
System.Delete(sClaves, 1, 1); // Se elimina la ',' inicial que sobra

Neftali [Germán.Estévez] 24-04-2023 10:21:52

Cita:

Empezado por kainchu3102 (Mensaje 551247)
Tengo dos Dbgrid, DBGrid1 cuando selecciono la fila de uno en el otro me muestro los detalles relacionados en DBGrid2, en DBGrid1 cuando hago multiseleccion, en DBGrid2 no puedo hacer que me aparezcan los detalles relacionado a cada seleccion del DBGrid1.


Si no he entendido mal, tienes 2 grids (Datasets) como mestro-detalle y multiselección en el primero.
Cuando multiseleccionas en el DBGrid1, quieres que salgan en el DBGrid2 TODOS los detalles de los registros seleccionados en el Grid1.


Eso con los DBGrids estandard de Delphi (VCL) y utilizando las propiedades de Master/Detail (MasterSource + MasterField) no es posible. Sólo verás en el DBGrid2 los registros de detalle correspondientes al registro "activo" del DBGrid1 (que no es lo mismo que registros seleccionados).

En el DGBrid1 tendrás multiselecionados varios registros:


Usando tu imagen:


En ambos casos hay 4 SELECCIONADOS, pero sólo 1 ACTIVO (el marcado).
En el DBGrid2 de detalle sólo verás el detalle del ACTIVO no de todos los SELECCIONADOS.

Por lo que entiendo, lo que necesitas es ver en el DBGrid2 el detalle de todos los SELECCIONADOS y no sólo los del registro ACTIVO.

Si necesitas esto último debes gestionar el maestro/detalle de la multiselección de forma manual. Es decir, cuando cambia la selección del DBGrid1, deberás cambiar el origen del DBGrid2. Ya sea utilizando Filtros o consultas SQL (JOIN o SELECT..IN)


La franja horaria es GMT +2. Ahora son las 13:42:09.

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