Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Columna lookupcombobox cxGrid Delphi7 (https://www.clubdelphi.com/foros/showthread.php?t=93930)

Saul Rivera 13-05-2019 02:22:16

Columna lookupcombobox cxGrid Delphi7
 
Hola tengo un cxgrid con una columa llamada producto que se llena con dataset el proble es que ahora ocupo que se llene mediante un parametro que se asigna en tiempo de ejecucion de la siguiente manera
yo tengo un lookupcombobox que muestra el nombre de proyecto y necesito que en el grid se sargue un query que tiene como parametro en el where el id del proyecto, entonces al momento de seleccionar el nombre del proyecto deb capturar el id de ese proyecto y mandarlo como parametro el query para que me muestre los productos que estan asignados a ese proyecto

este es mi query
Código SQL [-]
SELECT P1.ID_PROYECTO,
P1.NOMBRE,
I1.COD_PRODUCTO,
NOMBRE = case 
    WHEN dbo.ObtenerDeConfiguracion(216) = '0' then
        I1.nombre
    else 
        I1.COD_UPC_PROPIO + ' - ' + I1.nombre
    end, 
I2.CANTIDAD_STOCK
FROM PR_PROYECTOS P1
    INNER JOIN PR_FICHA_HDR F1
          ON F1.ID_PROYECTO = P1.ID_PROYECTO
    INNER JOIN PR_FICHA_DTL_MAT F2
          ON F1.ID_FICHA = F2.ID_FICHA
    INNER JOIN INV_PRODUCTOS I1
          ON F2.COD_PRODUCTO = I1.COD_PRODUCTO
    INNER JOIN INV_EXISTENCIAS I2
          ON I1.COD_PRODUCTO = I2.COD_PRODUCTO
    LEFT JOIN OT_ORDEN_TRABAJO_PROYECTO_HDR T1
          ON P1.ID_PROYECTO = T1.ID_PROYECTO
WHERE P1.ID_PROYECTO = :ID_PROYECTO
con esto lleno el cxgrid pero me tira este error "invalid imput parameter values. check the status values for detail"

esto supongo es porque no le mando el id del proyecto para que busque la informacion y no se como hacerlo
Intente esto y no me funciono

Código Delphi [-]
procedure TfrmRequisicion.gvDataDBTableView1COD_PRODUCTOCompareValuesForCellMerging(
  Sender: TcxGridColumn; AProperties1: TcxCustomEditProperties;
  const AValue1: Variant; AProperties2: TcxCustomEditProperties;
  const AValue2: Variant; var AAreEqual: Boolean);
begin
  dmMain.qryAProductos.ParamByName('ID_PROYECTO').AsInteger := dmMain2.qryProyectos.FieldByName('ID_PROYECTO').AsInteger
end;
Espero puedan ayudarme Soy muy nuevo en delphi

Casimiro Notevi 13-05-2019 09:55:21

Hola, recuerda usar las etiquetas para código, ejemplo:



Saul Rivera 13-05-2019 14:09:56

ohhh ok muchas gracias

Casimiro Notevi 13-05-2019 14:54:05

Por lo que me ha parecido entender, cuando cambies el combobox deberías hacer algo así:
Código Delphi [-]
qry.close;
qry.param.... := valordelcombobox;
qry.open;

mRoman 13-05-2019 16:26:58

Cita:

Empezado por Saul Rivera (Mensaje 531973)
Hola tengo un cxgrid con una columa llamada producto que se llena con dataset el proble es que ahora ocupo que se llene mediante un parametro que se asigna en tiempo de ejecucion de la siguiente manera
yo tengo un lookupcombobox que muestra el nombre de proyecto y necesito que en el grid se sargue un query que tiene como parametro en el where el id del proyecto, entonces al momento de seleccionar el nombre del proyecto deb capturar el id de ese proyecto y mandarlo como parametro el query para que me muestre los productos que estan asignados a ese proyecto

este es mi query
Código SQL [-]
SELECT P1.ID_PROYECTO,
P1.NOMBRE,
I1.COD_PRODUCTO,
NOMBRE = case 
    WHEN dbo.ObtenerDeConfiguracion(216) = '0' then
        I1.nombre
    else 
        I1.COD_UPC_PROPIO + ' - ' + I1.nombre
    end, 
I2.CANTIDAD_STOCK
FROM PR_PROYECTOS P1
    INNER JOIN PR_FICHA_HDR F1
          ON F1.ID_PROYECTO = P1.ID_PROYECTO
    INNER JOIN PR_FICHA_DTL_MAT F2
          ON F1.ID_FICHA = F2.ID_FICHA
    INNER JOIN INV_PRODUCTOS I1
          ON F2.COD_PRODUCTO = I1.COD_PRODUCTO
    INNER JOIN INV_EXISTENCIAS I2
          ON I1.COD_PRODUCTO = I2.COD_PRODUCTO
    LEFT JOIN OT_ORDEN_TRABAJO_PROYECTO_HDR T1
          ON P1.ID_PROYECTO = T1.ID_PROYECTO
WHERE P1.ID_PROYECTO = :ID_PROYECTO
con esto lleno el cxgrid pero me tira este error "invalid imput parameter values. check the status values for detail"

esto supongo es porque no le mando el id del proyecto para que busque la informacion y no se como hacerlo
Intente esto y no me funciono

Código Delphi [-]
procedure TfrmRequisicion.gvDataDBTableView1COD_PRODUCTOCompareValuesForCellMerging(
  Sender: TcxGridColumn; AProperties1: TcxCustomEditProperties;
  const AValue1: Variant; AProperties2: TcxCustomEditProperties;
  const AValue2: Variant; var AAreEqual: Boolean);
begin
  dmMain.qryAProductos.ParamByName('ID_PROYECTO').AsInteger := dmMain2.qryProyectos.FieldByName('ID_PROYECTO').AsInteger
end;
Espero puedan ayudarme Soy muy nuevo en delphi

Hola Saúl:

Existe una propiedad del LookUpComboBox, que se llama ".KeyValue", esta propiedad almacena el valor del campo asociado al DataSet que le hayas configurado, en su propiedad "KeyField".

De tal manera que tu código quedaría asi:
Código Delphi [-]
procedure TfrmRequisicion.gvDataDBTableView1COD_PRODUCTOCompareValuesForCellMerging(
  Sender: TcxGridColumn; AProperties1: TcxCustomEditProperties;
  const AValue1: Variant; AProperties2: TcxCustomEditProperties;
  const AValue2: Variant; var AAreEqual: Boolean);
begin
  dmMain.qryAProductos.ParamByName('ID_PROYECTO').AsInteger := cbxProyecto.KeyValue;
end;


Espero te sirva....
SALUDOS!

Saul Rivera 13-05-2019 16:58:42

Cita:

Empezado por mRoman (Mensaje 531986)
Hola Saúl:

Existe una propiedad del LookUpComboBox, que se llama ".KeyValue", esta propiedad almacena el valor del campo asociado al DataSet que le hayas configurado, en su propiedad "KeyField".

De tal manera que tu código quedaría asi:
Código Delphi [-]procedure TfrmRequisicion.gvDataDBTableView1COD_PRODUCTOCompareValuesForCellMerging( Sender: TcxGridColumn; AProperties1: TcxCustomEditProperties; const AValue1: Variant; AProperties2: TcxCustomEditProperties; const AValue2: Variant; var AAreEqual: Boolean); begin dmMain.qryAProductos.ParamByName('ID_PROYECTO').AsInteger := cbxProyecto.KeyValue; end;



Espero te sirva....
SALUDOS!






Hola mRoman Gracias por responder

Al probar el codigo me saliio este error
Código Delphi [-]
[Error] uRequisicion.pas(514): Undeclared identifier: 'KeyValue'


pense que era porque lo habia introducido en el metodo de la columna del cxgrid que se llama

Código Delphi [-]
procedure TfrmRequisicion.gvDataDBTableView1COD_PRODUCTOCompareValuesForCellMerging(
  Sender: TcxGridColumn; AProperties1: TcxCustomEditProperties;
  const AValue1: Variant; AProperties2: TcxCustomEditProperties;
  const AValue2: Variant; var AAreEqual: Boolean);
begin
  dmMain.qryAProductos.ParamByName('ID_PROYECTO').AsInteger := cblProyectos.KeyValue;
  end;


que este es el que mande de ejemplo entonces lo introduje en el metodo del lookupcombobox

Código Delphi [-]
 

procedure TfrmRequisicion.cblProyectosPropertiesChange(Sender: TObject);
begin
  dmMain2.qryProductosProyecto.ParamByName('ID_PROYECTO').AsInteger := cblProyectos.KeyValue;
  end;


pero me sgue dando ese problema y es que cuando escriboen mi lookupcombobox --> cblProyectos. "se despliegan todas las funciones no me sale KeyValue"

mRoman 13-05-2019 18:31:37

Entonces ese objeto no tiene esa propiedad. En realidad desconozco el objeto que usas, pensé que era algo similar al TDBLookUpComboBox, (que si lo tiene)...Independientemente de eso, el objeto que estas usando debe tener alguna otra propiedad donde puedas obtener el valor del campo del ID del proyecto y si no pues, del DataSet asociado, que debería funcionar también.

Pero bueno, entonces, creo q necesitamos mas referencias para poder ayudar. Veo que tienes 2 DataModulos....porque?.
En que momento abres el otro Query, del DataModulo2 (dmMain2)? o que es dmMain?

Asumo que "dm" = DataModulo, o estoy equivocado?.

Envía mejor todo el código donde se ejecuta -lo que ya enviaste- para ver con mas claridad que es lo que hace y como lo hace.

Realice una prueba y en ambos casos, me da el resultado que quiero, el ID de un Estatus en especifico.
Código Delphi [-]
ShowMessage( Variant(cbxEstatus.KeyValue) );
ShowMessage( qryEstatus.FieldByName('id_estatus_posible').AsString );

cbxEstatus lo tengo asociado a una DataSource, el cual a su vez lo tengo asociado a un TIBQuery, donde en su propiedad "SQL", tengo esta consulta:
Código SQL [-]
select ep.id_estatus_posible,
         e.descripcion
from estatus_posible ep,
        estatus_pedido e
where ep.id_estatus_posible=e.id_estatus
   and ep.habilitado='S'

Saludos.

Saul Rivera 13-05-2019 19:33:54

Cita:

Empezado por mRoman (Mensaje 531991)
Entonces ese objeto no tiene esa propiedad. En realidad desconozco el objeto que usas, pensé que era algo similar al TDBLookUpComboBox, (que si lo tiene)...Independientemente de eso, el objeto que estas usando debe tener alguna otra propiedad donde puedas obtener el valor del campo del ID del proyecto y si no pues, del DataSet asociado, que debería funcionar también.

Pero bueno, entonces, creo q necesitamos mas referencias para poder ayudar. Veo que tienes 2 DataModulos....porque?.
En que momento abres el otro Query, del DataModulo2 (dmMain2)? o que es dmMain?

Asumo que "dm" = DataModulo, o estoy equivocado?.

Envía mejor todo el código donde se ejecuta -lo que ya enviaste- para ver con mas claridad que es lo que hace y como lo hace.

Realice una prueba y en ambos casos, me da el resultado que quiero, el ID de un Estatus en especifico.
Código Delphi [-]ShowMessage( Variant(cbxEstatus.KeyValue) ); ShowMessage( qryEstatus.FieldByName('id_estatus_posible').AsString );


cbxEstatus lo tengo asociado a una DataSource, el cual a su vez lo tengo asociado a un TIBQuery, donde en su propiedad "SQL", tengo esta consulta:
Código SQL [-]select ep.id_estatus_posible, e.descripcion from estatus_posible ep, estatus_pedido e where ep.id_estatus_posible=e.id_estatus and ep.habilitado='S'


Saludos.


hola, si tengo dos data mudule pero fui yo el que escribio mal solo uso el dmMain2 que es donde esta mi query para llenar los productos del grid
DataModule = dmMain2
TMSquery = qryProductosProyecto
TdataSourse = dsProductosProyecto
TcxLookupComboBox = cblProyectos


este es el inicio del form

Código Delphi [-]
procedure TfrmRequisicion.FormCreate(Sender: TObject);
begin
  dmMain2.tblRequisicionHdr.Filtered := False;
  ActNewExecute(nil);
  dmMain2.qryRequisicionDtl.OnNewRecord := qryRequisicionDtlNewRecord;
  dmMain2.qryProductosProyecto.Close;
  dmMain2.qryProductosProyecto.Open;
  Rows := 0;
  Cliente := dmMain.tblClientes.FieldByName('COD_CLIENTE').AsString;
end;


lo demas seria en el combobox a mi parecer para capturar el id y mandarlo como parametroal query

Código Delphi [-]
SELECT --P1.ID_PROYECTO,
--P1.NOMBRE,
I1.COD_PRODUCTO,
NOMBRE = case 
    WHEN dbo.ObtenerDeConfiguracion(216) = '0' then
        I1.nombre
    else 
        I1.COD_UPC_PROPIO + ' - ' + I1.nombre
    end, 
I2.CANTIDAD_STOCK
FROM PR_PROYECTOS P1
    INNER JOIN PR_FICHA_HDR F1
          ON F1.ID_PROYECTO = P1.ID_PROYECTO
    INNER JOIN PR_FICHA_DTL_MAT F2
          ON F1.ID_FICHA = F2.ID_FICHA
    INNER JOIN INV_PRODUCTOS I1
          ON F2.COD_PRODUCTO = I1.COD_PRODUCTO
    INNER JOIN INV_EXISTENCIAS I2
          ON I1.COD_PRODUCTO = I2.COD_PRODUCTO
    LEFT JOIN OT_ORDEN_TRABAJO_PROYECTO_HDR T1
          ON P1.ID_PROYECTO = T1.ID_PROYECTO
    INNER JOIN PR_TIPOPROYECTO P2
          ON P1.ID_TIPO_PROYECTO = P2.ID_TIPO_PROYECTO
WHERE I1.STATUS = '1' AND P2.REQUISA_SIN_ORDEN_TRABAJO = 1 AND
ID_PROYECTO = :ID_PROYECTO
que al query le doy click derecho, field editor en el cual añado un new field para agregar el id_proyecto de tipo integer


espero sirva mas esta informacion

mRoman 14-05-2019 17:40:35

Escríbenos el código donde abres el Query de los proyectos y el cual debe estar enlazado a tu objecto ComboBox.
Como tienes configurado/enlazado el Objeto Combobox...o como lo llenas??

El LookUpCombobox no tiene la propiedad "KeyValue", entonces debe tener otra que haga referencia al campo llave, por eso dinos como tienes configruado/Enlazado tu LookUpComboBox a los proyectos...como obtienes los proyectos, como llenas el combo.

Código Delphi [-]

procedure TfrmRequisicion.cblProyectosPropertiesChange(Sender: TObject);
begin
  dmMain2.qryProductosProyecto.ParamByName('ID_PROYECTO').AsInteger := cblProyectos.KeyValue;
end;

Aqui por ejemplo, ya debiste de haber abierto el Query que llena o que esta enlazado a "cblProyectos", como lo haces y en donde lo haces (en que parte del código lo haces)?

Saul Rivera 14-05-2019 18:02:48

1 Archivos Adjunto(s)
Cita:

Empezado por mRoman (Mensaje 532005)
Escríbenos el código donde abres el Query de los proyectos y el cual debe estar enlazado a tu objecto ComboBox.
Como tienes configurado/enlazado el Objeto Combobox...o como lo llenas??

El LookUpCombobox no tiene la propiedad "KeyValue", entonces debe tener otra que haga referencia al campo llave, por eso dinos como tienes configruado/Enlazado tu LookUpComboBox a los proyectos...como obtienes los proyectos, como llenas el combo.

Código Delphi [-] procedure TfrmRequisicion.cblProyectosPropertiesChange(Sender: TObject); begin dmMain2.qryProductosProyecto.ParamByName('ID_PROYECTO').AsInteger := cblProyectos.KeyValue; end;


Aqui por ejemplo, ya debiste de haber abierto el Query que llena o que esta enlazado a "cblProyectos", como lo haces y en donde lo haces (en que parte del código lo haces)?






Hola



el query de proyectos solo lo habro y cierro en el boton de nuevo despues de almacenar la informacion

emm no lo habro en ningun otro lado

mi forma de llenar el combobox es asociado aun dataset que contiene mi query de "proyectos" ya en las propiedades del loopcombobox mi list field es el nombre del proyecto, mi keyvalue es el "ID_PROYECTO" el que le debo de mandar de parametro a mi query de "productosproyecto" que solo me muestra los productos de un proyecto en especifico



adjunte en un .zip el codigo de mi form por si es de tu utilidad

Saul Rivera 14-05-2019 18:40:43

Hola mRoman hice algo referente a lo que me dijiste de abrir y cerrar el query y es lo siguiente

cerre el query

Código Delphi [-]
procedure TfrmRequisicion.FormCreate(Sender: TObject);
begin
  dmMain2.tblRequisicionHdr.Filtered := False;
  ActNewExecute(nil);
  dmMain2.qryRequisicionDtl.OnNewRecord := qryRequisicionDtlNewRecord;
  dmMain.qryAProductos.Close;
  dmMain.qryAProductos.Open;
  dmMain2.qryProductosProyecto.Close;
  //mMain.qryAProductos.ParamByName('ID_PROYECTO').AsInteger := 0;
  Rows := 0;
  Cliente := dmMain.tblClientes.FieldByName('COD_CLIENTE').AsString;
end;


luego en mi combobox lo tengo asi

Código Delphi [-]
procedure TfrmRequisicion.cblProyectosPropertiesChange(Sender: TObject);
begin

  //dmMain2.qryProductosProyecto.ParamByName('ID_PROYECTO').AsInteger := cblProyectos.KeyValue;

  dmMain2.qryProyectos.ParamByName('ID_PROYECTO').AsInteger := cblProyectos.EditValue;
  dmMain2.qryProductosProyecto.Open;
  dmMain2.qryProductosProyecto.Close;
  end;


solo que pues el EditValue no seria la propiedad correcta, ahi si me bloqueeo porque no conosco las propiedades de estos objetos

mRoman 15-05-2019 04:38:05

Hola...Saúl, exactamente esto que hace?
Código Delphi [-]
procedure TfrmRequisicion.cblProyectosPropertiesChange(Sender: TObject);
begin

  //dmMain2.qryProductosProyecto.ParamByName('ID_PROYECTO').AsInteger := cblProyectos.KeyValue;

  dmMain2.qryProyectos.ParamByName('ID_PROYECTO').AsInteger := cblProyectos.EditValue;
  dmMain2.qryProductosProyecto.Open;
  dmMain2.qryProductosProyecto.Close;
  end;

Me refiero a "cblProyectosPropertiesChange"....

p.d. Talvez la pregunte que haré debí hacerla desde el inicio...pero que Componentes estas usando para los objetos (cblProyectos)?.

Saul Rivera 15-05-2019 04:57:23

Cita:

Empezado por mRoman (Mensaje 532022)
Hola...Saúl, exactamente esto que hace?
Código Delphi [-]procedure TfrmRequisicion.cblProyectosPropertiesChange(Sender: TObject); begin //dmMain2.qryProductosProyecto.ParamByName('ID_PROYECTO').AsInteger := cblProyectos.KeyValue; dmMain2.qryProyectos.ParamByName('ID_PROYECTO').AsInteger := cblProyectos.EditValue; dmMain2.qryProductosProyecto.Open; dmMain2.qryProductosProyecto.Close; end;


Me refiero a "cblProyectosPropertiesChange"....

p.d. Talvez la pregunte que haré debí hacerla desde el inicio...pero que Componentes estas usando para los objetos (cblProyectos)?.




Hola

este es el evento del cxlookupcombobox -->cblproyectos

Código Delphi [-]
procedure TfrmRequisicion.cblProyectosPropertiesChange(Sender: TObject);
que pense que ahi podia capturar el ID de mi proyecto para mandarlo a mi query de qryProductosProyecto
pero aqui lo tengo mal porque puse

Código Delphi [-]
dmMain2.qryProyectos.ParamByName('ID_PROYECTO').AsInteger := cblProyectos.EditValue;


en lugar de

Código Delphi [-]
dmMain2.qryProductosProyecto.ParamByName('ID_PROYECTO').AsInteger := cblProyectos.EditValue;


mi idea es esta es como yo pienso que es:
al llenar la informacion de la requisicion yo le debo asignar un proyecto por eso el cxlookupCombobox para que el usuario pueda elegir el proyecto que desee,

una ves eligio el proyecto capturar el id para que cuando vaya a elegir los materiales que ocupara esa requisicion

yo le muestre en la columna de mi cxgrid solo los materiales que tiene asignado ese proyecto



para llenar cblproyectos uso un tDataset llamado dsProyectos
que esta asociado al query de mi datamodule dmMain2.qryProyectos con este query lleno mi cxlookupcombobox y me tira el listado de proyectos



ahora lo que ocupo es capturar el id de ese proyecto elegido mandarlo como parametro al query que tengo para productos de proyecto dmMain2.qryProductosProyecto que es uno que mande mas arriba, en mi cxgrid yo a la columna de productos le hago un field por el id_proyecto y despliego los productos en un cxlookupcombox que seria la columna del grid



cualquier otra cosa que necesites me dices Saludos y muchas gracias!


La franja horaria es GMT +2. Ahora son las 19:00:56.

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