PDA

Ver la Versión Completa : Columna lookupcombobox cxGrid Delphi7


Saul Rivera
13-05-2019, 02:22:16
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
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

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:


http://tinyurl.com/bvzsyhb

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í:

qry.close;
qry.param.... := valordelcombobox;
qry.open;

mRoman
13-05-2019, 16:26:58
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
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

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:
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
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 [-] (http://www.clubdelphi.com/foros/#)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

[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


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



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.

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:

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
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 [-] (http://www.clubdelphi.com/foros/#)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 [-] (http://www.clubdelphi.com/foros/#)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


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


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.



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
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 [-] (http://www.clubdelphi.com/foros/#) 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


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


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?

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
Hola...Saúl, exactamente esto que hace?
Código Delphi [-] (http://www.clubdelphi.com/foros/#)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

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

dmMain2.qryProyectos.ParamByName('ID_PROYECTO').AsInteger := cblProyectos.EditValue;


en lugar de


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!