Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   combo box -> campo calculado (https://www.clubdelphi.com/foros/showthread.php?t=53920)

peccatum 04-03-2008 21:04:39

combo box -> campo calculado
 
Hola, yo como siempre con mis preguntas de primer grado :sonrojado:

Tengo un campo calculado que lo unico que hace es mostrar dos campos concatenados con una coma (Nombre y apellido, el valor del campo calculado resultante seria "PEREZ, JUAN" , por ejemplo).

Un combobox que permite seleccionar la ordenación, entre ellas ordenar por Nombre o Apellido...

Lo que yo quiero es que si ordena por apellido ponga primero el apellido, y si ordena por nombre ponga primero el nombre.... (si ordena por nombre que aparezca "JUAN, PEREZ").

Lo que se me ocurrió es que en el evento onCalcFields del componente Dataset poner un condicional que se fije el valor text del combo, pero no funciona... el combo al realizar la ordenación cierra y abre el dataSet, pensé que al reabrirse el evento se recalcularía como yo quiero pero nada...

en teoría cual sería la forma correcta de lograrlo? al parecer no me toma el valor del combobox.

la otra que me queda es usar dos campos calculados y setear a visible el que sea pertinente, pero esa forma como que no me agrada mucho...

saludos!

Caral 04-03-2008 23:15:45

Hola
La verdad no entiendo.
Supongo que tendras una tabla en la que esten los campos nombre y apellido.
Si es asi, para que hacer un campo calculado, si se puede hacer con una sentencia sql y un if then.
Lo que haces en el campo calculado es una concatenacion, por que no directa?.
Saludos

peccatum 05-03-2008 01:24:00

la sentencia sql del dataset es un simple 'select * from personas'

en el evento onCalcFields del campo calculado del dataset tengo una asignación como esta:

'Dataset1['cldNOMBRE_COMPLETO']:= Dataset1['APELLIDOS']+', '+Dataset1['NOMBRES'] ;'

En el combo box tengo los criterios de ordenación, cuando cambia su texto a "Nombre" yo quiero que lo asignado al campo 'cldNOMBRE_COMPLETO' sea primero el nombre, después el apellido(dar vuelta la parte derecha de la asignación).

Lo que hice es, dentro del evento onCalcFields un if then else que se fija el valor del combobox, pero de esta forma no funciona....


lo que dices supongo que es un select condicional en vez de el 'select * from personas' que tengo en el dataset? si es así, como sería la sintáxis de eso?

gracias

eduarcol 05-03-2008 01:37:49

utiliza un dblookupcpmbobox, conectado a un dataset que tenga el campo que tu dices, puedes separar el nombre de los campos con punto y coma ";"

peccatum 05-03-2008 01:46:44

hola eduarcol

en el combobox solamente aparecen los criterios de ordenamiento: "nombre" ... "apellido"... etc , una lista estática me basta, ese no es mi problema =(

saludos

Caral 05-03-2008 02:07:12

Hola
Veamos si logro entender esto.
Tienes una tabla en la que hay dos campos, nombre y apellido.
Tienes un combobox en el que tienes una serie de items para elegir, entre ellos Nombre y apellido.
Este combobox es el que genera el filtro.
Si estoy bien hasta aqui me dices.
Ahora pregunto: donde vas a presentar ese filtro?.
Saludos

peccatum 05-03-2008 02:35:55

Cita:

Empezado por Caral (Mensaje 270712)
Este combobox es el que genera el filtro.

no es un filtro...

Tengo un grid donde tengo los datos de las personas. Esta tiene varios campos: nombre, apellido, dni, etcétera (los campos de la tabla en la base de datos)... solo que al usuario no le muestro los campos 'reales' sino campos calculados. En el evento 'onCalcFields' del dataset tengo la asignación que puse mas arriba.

Lo que hace el combo es controlar el ordenamiento, en el evento 'onChange' lo que hace es agregar la linea 'order by <itemdelcombo.text> asc' al dataset. Esto funciona bien si no pongo el condicional en el evento onCalcFields que hace una comprobación como la siguiente:

if combobox.text = nombres then
dataset1[calcfield] := dataset1 [nombre] + dataset1[apellido]
else dataset1[calcfield] := dataset1[APELLIDO] + dataset1[nombre];

se entiende?

gracias :)

edit: calcfield es lo que le presento al usuario las otras columnas tienen la propiedad Visible a false ...

keyboy 05-03-2008 02:40:51

Quizá debas detallar más tu código. A mi me funciona bien usando MySQL y componentes MyDAC:

Código Delphi [-]
procedure TForm1.MyQuery1CalcFields(DataSet: TDataSet);
begin
  if ComboBox1.ItemIndex = 0 then
    DataSet['nombre_completo'] := DataSet['apellido'] + ', ' + DataSet['nombre']
  else
    DataSet['nombre_completo'] := DataSet['nombre'] + ', ' + DataSet['apellido']
end;

Y en el evento OnChange del combo:

Código Delphi [-]
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  if ComboBox1.ItemIndex = 0 then
    MyQuery1.IndexFieldNames := 'apellido'
  else
    MyQuery1.IndexFieldNames := 'nombre';
end;

Con esto, se ordena y el campo calculado cambia como se espera.

Bye

Caral 05-03-2008 02:44:55

Hola
Mas que claro keyboy.
Gracias por la explicacion, creo que no debe haber mas dudas.
El concepto del combobox es lo que pretendía hacer, pero te salio mejor a ti, maestro al fin.
Saludos

peccatum 05-03-2008 03:55:00

Grande KeyBoy siguiendo tu ejemplo funcionó...

Lo que si, no uso la parte de codigo que pusiste en combobox.onchange, para especificar el ordenamiento ahí dentro yo agrego una linea al SelectSQL del DataSet:

Dataset1.SelectSQL.Strings[2]:='Order by '+ Combobox1.Text + ' asc';

¿Es indiferente hacerlo de cualquiera de las dos formas?

Mil gracias a todos y saludos....

peccatum 05-03-2008 20:15:12

cosa
 
en un principio no me funcionó por que al cerrar y abrir el dataset para agregar la linea 'order by...' se pierden los parámetros (por lo menos en los componentes que utilizo Mercury Data Objets)

ese era el problema jeje, hoy me dí cuenta de ello :rolleyes:

edit: ya se... me pasa por no mostrar adecuadamente el código :sonrojado2:


La franja horaria es GMT +2. Ahora son las 03:20:13.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi