Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   PHP (https://www.clubdelphi.com/foros/forumdisplay.php?f=15)
-   -   Delphi for Php (RAD PHP), valor de retorno de una QDataGrid!! (https://www.clubdelphi.com/foros/showthread.php?t=78282)

juanpy 04-04-2012 20:24:09

Delphi for Php (RAD PHP), valor de retorno de una QDataGrid!!
 
Estimados,

Una ayudita por favor, necesito saber como capturo el valor que retorna el evento OnClick o OnDBClick de una QDataGrid o DataGrid.

Muchas gracias.

juanpy 11-04-2012 00:31:08

Sigo sin resolver!!
 
Estimados,

Lo unico que he encontrado para resolver es la siguiente sentencia:

Código PHP:

$nomovim $this->QDBGrid1->DataSource->DataSet->Fields["campo_a_seleccionar"]; 

Ahora, hice una rutina JavaScripts qe me da el valor de la celda que selcciono, pero siempre del primer row.

Necesito saber como capturo el valor que retorna el evento OnClick o OnDBClick de una QDataGrid o DataGrid.

Muchas gracias.[/quote]

Casimiro Notevi 11-04-2012 00:48:29

Vaya, a ver si alguien puede ayudarte.

taqtaq 11-04-2012 04:34:39

No sé si es lo que estás necesitando, pero por las dudas, fijate en el siguiente código, tal vez te sirva:

Código PHP:

    function dbgrid1JSClick($sender, $params)
    {
        ?>
        //begin js

              var row = dbgrid1.getFocusedRow();
              var col = dbgrid1.getFocusedColumn();
              var value=dbgrid1.getTableModel().getValue(col,row);
              alert('col = '+col+' row = '+row+' cell = '+value);

        //end
        <?php
    
}

Si todo anda bien, te tiene que mostrar un alert con el nº de renglón, el nº de la columna y el valor de la celda al hacer click en el QDBgrid.

Saludos

juanpy 13-04-2012 18:25:44

Colegas, sigo sin resolver, una ayuda por favor.
 
taqtaq,

Tienes toda la razón, ese algoritmo me da el valor del contenido de la fila/columna seleccionada, pero el problema es que el algoritmo esta escrito para JavaScritp y no existe forma directa alguna de pasar este valor a una variable php.

He probado con cookies js rescatando en php, acomode un algoritmo ajax, pero nada.

Estoy explorando las opciones del dataset para ver si algo funciona, pero ya a 1 semana y media no logro resolver.

Gracias y espero sus comentarios.:mad:

taqtaq 16-04-2012 05:40:41

Hola Juampy

Creo que podrás encontrar una mejor respuesta de alguien que sepa PHP y no sea un principiante como yo,
pero aun así, te voy a comentar algunas cosas que estuve probando, que me dieron resultados y que, tal vez, te puedan servir también.

Por lo que decis, estás necesitando obtener un valor de una QDBGrid y a partir de ese valor, realizar una operación que arroje algún resultado.

Como no aclaras lo que pretendes hacer con ese valor, decidí tomar un valor de un QDBgrid para actualizar otro QDBgrid.
Creo que en base a lo que hice, tal vez, podrías adaptarlo a lo que tu necesitas.

Yo trabajo con Firebird y utilicé los componentes para firebird, si trabajas con MySQL, obviamente, tendrás que utilizar las conexiones y componentes para MySQL.

Entonces, puse:

* una conexión a la BD
* dos datasource
* dos query
* dos QDBgrid
* 1 HiddenField
* 1 Label

Enlacé a la primera dbgrid, el datasource1 con una consulta a una tabla.
A la segunda dbgrid lo enlacé al datasource2 enlazado a un query con consulta a lo que se podría llamar como el detalle de la primer dgbrid.

En el evento onclick de javascript de la primer qdbgrid, puse el siguiente código:


Código PHP:

function DBGrid1JSClick($sender, $params)
    {
        ?>
        //begin js
              var row = DBGrid1.getFocusedRow();
              var col = DBGrid1.getFocusedColumn();
//              var value=DBGrid1.getTableModel().getValue(col,row);
              var value=DBGrid1.getTableModel().getValueById('ID_PERSONA',row);
              findObj('HideField').value = value;
              findObj('Label1').innerHTML = value;
        //end
        <?php
//         echo $this->DBGrid1->ajaxCall("ActualizarGrilla",array($sender,$param),array("DBGrid2"));
         
echo $this->DBGrid1->ajaxCall("ActualizarGrilla",array(),array("DBGrid2"));
    }

¿Qué hago con esto?
El objetivo es obtener la clave primaria de la tabla que me permita obtener un detalle en la segunda Dbgrid.
Es por eso que utilizo

var value=DBGrid1.getTableModel().getValueById('ID_PERSONA',row);

(Si quieres más información acerca de las DBGRIDS, fijate en este link:
//demo.qooxdoo.org/current/apiviewer/#qx.ui.table.ITableModel )

Siguiendo lo que tu necesitas, paso ese valor a un Hidenfield que puse para tal fin. (En las demos de RADPHP hay un ejemplo del uso de los hidenfields.)

findObj('HideField').value = value;

findObj es una función que permite acceder a un objeto de php con javascript
( docwiki.embarcadero.com/RadPHP/en/RPCL_and_JavaScript )

y findObj('Label1').innerHTML = value; la uso solamente para mostrar el valor de mi clave.

Para poder actualizar la segunda DBGrid, escribí la siguiente función:

Código PHP:

  function ActualizarGrilla()
    {
      
$sql "SELECT * FROM PERSONAS WHERE ID_PERSONA = ".$this->HideField->Value;
      
$this->Query2->close();
      
$this->Query2->SQL=$sql;

      
$this->Query2->Prepare();
      
$this->Query2->close();
      
$this->Query2->open();
    } 

Esa es la función en php que me "filtra" los datos en la segunda DBGrid a partir de la clave obtenida al hacer click en la primer DBGRID
A esa función le hago una llamada ajax con "ajaxCall" y me actualiza la segunda DBGrid.

También estuve probando que si a la función "ActualizarGrilla" le hubiera declarado parametros, para llamarla tendría que usar lo siguiente:

echo $this->DBGrid1->ajaxCall("ActualizarGrilla",array($sender,$param),array("DBGrid2"));


Resumiendo:

¿Como pasé el valor de javascript a php?
Con un hidennfield utilizando findObj("").value=

¿Cuándo obtuve el valor de mi clave primaria?
En el evento onclick de javascript de la DBGRID.

¿Cuándo filtré los datos de la segunda DBGRID?
En el mismo evento onclick de la DBGRID al llamar con ajaxCall a una función que definí previamente para actualizar el DBGRID2. Lo hubiera podido hacer en otra parte.

Bueno, espero te sirva. Insisto, soy un principiante en PHP y en RADPHP así que es posible que alguien sugiera una mejor manera de la que yo te expongo y sería bueno que eso ocurra así aprendemos.

Saludos

juanpy 18-04-2012 17:23:57

Excelente, mejor que cualquier manual.
 
Taqtaq,

Amigo mio, esta realmente excelente tu presentación, clara, precisa y didactica.

Yo tengo una QDBGrid en la cual se despliega datos de los pagos realizados por los clientes. Si ellos en algun momento pagaron con cheques en la grilla aparece la información:

QDBGrid1 Cuenta Corriente:
Código:

Cuenta Descripción      Fecha        Efectivo Cheque
752900 Contrato anual  01/03/2011 120.000          0
457801 Compra articulo 13/12/2010    5.000          0
378102 Contrato anual  01/03/2010 120.000 120.000

Si yo pincho la cuenta 752900 la segunda grilla, QDBGrid2 Cheques, no debiese mostrar nada, pues yo al rescatar el valor de la columna 0 linea 1 (_vVar.), actualizo una consulta MySql con este parametro de la siguiente manera:


Código SQL [-]
SELECT numero_cheque, fecha_cheque, valor_cheque, pagado_cheque FROM cheques WHERE cuenta=_vVar


La columna Cheque se encuentra en 0, osea que el pago fue efectivo y el dinero entro a la caja.

Al pinchar la cuenta 378102, la QDBGrid2 Cheques, debiese mostrar todos los datos relacionados a los cheques emitidos para pagar el valor total del efectivo:

QDBGrid2 Cheques:
Código:

Cuenta Cheque Fecha pago Valor
378102 1234567 01/05/2010 40.000
378102 1234566 01/04/2010 40.000
378102 1234565 01/03/2010 40.000

He ahi mi problema, yo pincho QBDGrid1 y no se como aplicar la mecanica descrita.

Pero ahora luego de tu clase especifica realizare la adaptación y te cuento como me va.

Gracias amigo y estamos en contacto.

juanpy 09-05-2012 20:04:39

Genial funciono sin mayores problemas.
 
Estimado taqtaq,

La receta para actualizar la qgrilla de resultado quedo impecable, fue cosa de adaptarlo y resolvio enseguida, lo unico que deja el ultimo resultado en caso de que la qry sea igual a cero coincidecias pero es cosa de afinarlo creo.:cool:

Muchisimas gracias estimado por su gran profesionalismo y su desinteres por ayudarme.

juanpy 10-05-2012 19:22:06

No muestra todas las lineas
 
:confused:Estimado taqtaq,

Sabes pense que lo podria resolver pero no me muestra todas las lineas en la QDBGrid2, es mas, para algunos casos muestra todo pero para otros no, osea, que por ejemplo para la empresa con cod_empresa=2 (cod_empresa, integer, largo 3, QDBGrid1) no muestra ningun funcionario (cod_empresa, interger, largo 3, QDBGrid2), pero para la empresa cond cod_empresa=504 los muestra todos.

Estube viendo si es un problema de tipo de valor (integer, varchar, text, etc.) con el cual realizo el filtro (WHERE .$this->HiddenField1->value;), pero aun no puedo descubrir el dato.

Digame; usted se a topado con esto?, que cree que pueda ser?, sera problemas con las propiedades de la QDBGrid2?.

Gracias estimados.

taqtaq 15-05-2012 23:36:04

Juampy, no será problema de datos? es decir, tal vez para la empresa con cod_empresa=2 no hay funcionarios o la tabla que
contiene los funcionarios no está bien cargada, porque debería funcionar.

Dame algún otro dato a ver si podemos solucionarlos.

Saludos

juanpy 15-05-2012 23:50:48

Mas datos
 
Hola Taqtaq,

Active el depurador de ajax y en el si muestra los resultados de todas las empresas lo unico que no los vuelca a la QDBGrid, incluso probe con un ejemplo MasterDetail pero este es peor actualiza la qdbgrilla de las empresa y no la de los funcionarios.

Estoy probando los comando ajax que me enviaste, Refresh(), Open(), Close() tal vez por ahi este el problema.

Si tu quieres te me indicas como te hago llegar un set de registros y como los dispongos para que tu veas que te resuelve a ti.

Gracias por todo ahora eres tu el unico soporte que tengo.

taqtaq 16-05-2012 01:39:12

Juampy has probado tanto que una prueba más no creo que te moleste demasiado.

En este enlace: http ://rpcl.svn.sourceforge.net/viewvc/rpcl/trunk/oc/ hay una serie de componentes gratuitos para RADPHP.

Ahi podes encontrar la OpenGrid que es una DBGrid basada en JQuery, a diferencia de la QDBGrid que es Qoodoo.
Estuve viendo en el foro de embarcadero y parece que alguien más tiene un problema similar con la DBGrid, es decir, no le muestra todos los registros.

Si tenés tiempo, bajate la Opengrid, instalala y probá a ver qué pasa.

Si es un problema del QDBGrid, tal vez, la OpenGrid te lo pueda resolver y, si no, seguiremos intentando.

Saludos

juanpy 17-05-2012 19:08:24

Disculpe la ignoracia
 
Pero como instalo el la paleta de herramientas OpenGrid?
Gracias

taqtaq 18-05-2012 02:48:05

Juampy,

1º Descarga de http ://rpcl.svn.sourceforge.net/viewvc/rpcl/trunk/oc/opengrid/ el archivo ZIP

2º Luego lo descomprimes en C:\Program Files\Embarcadero\RadPHP\4.0\rpcl\opengrid
Si RADPHP está instalado en otra ruta, tenés que instalarlo en una carpeta adentro de "rpcl" que es donde están todos los componentes

3º En RADPHP ir al menú Componente y elegir la opción Instalar paquetes.

4º Click en el botón Añadir y buscar la carpeta donde descomprimiste el paquete.

5º Aceptar y seguir los pasos que te pueda indicar RADPHP.

Si todo funciona bien te agrega ese componente en la paleta automáticamente como lo hace Delphi.

Lo que tenés que tener en cuenta es que con esta opengrid vas a tener que manejar de otra forma los eventos, eso significa que lo que hiciste para determinar el ID de un registro con el QDBgrid probablemente no funcione.

Te recomiendo que para probar si se actualiza el detalle, utilices una QDBGrid como maestro de manera tal de poder capturar (como ya lo haces) el ID del registro y para el detalle uses una OpenGrid. Si la OpenGrid funciona mejor que la QDBgrid, entonces tenemos que ponernos a ver cómo hacer para leer los datos de un registro a través de algún evento javascript.


Saludos

juanpy 18-05-2012 19:32:47

Como funciona?
 
:confused:
Taqtaq,

Lo instale y genera una grilla bastante profesional.

Deje la QDBGrid1 como la principal y en el evento java OnClick asocie la funcion de actualizacion.

Al iniciarse aparecen las 2 grillas y la OpenGrid1 filtrando los empleados de la primera linea de la QDBGrid1, que es lo que debe hacer, pero al momento de pinchar otra empresa en la QDBGrid1 la OpenGrid1 desaparece de la pagina.

Se que es cosa de manejo de las propiedades y eventos de este objeto, pero para agilizar las cosas le pregunto a usted; como evito para que esta accion no suceda?, cuales son las propiedades de rigor del objeto?.

Muchas gracias estimado.

juanpy 19-05-2012 00:30:46

Como defino el valor de la celda seleccionada?
 
:confused:
Taqtaq,

Las grillas estan geniales pero el problema es que ahora la funcion java que tenia y que de echo es la que usted me envio, no resuelve el valor de la celda que necesito para generar la nueva consulta.

Usted me podria indicar la forma como definir el parametro?

Muchas gracias.

taqtaq 19-05-2012 05:50:19

Juampy, lo único que tenes que cambiar es la forma de capturar el valor de la celda que vas a utilizar para filtrar el detalle

El siguiente código te va a servir para poder obtener el valor de una celda.

La tabla con la que yo trabajé, contiene una columna "NOMBRE", en tu caso deberás poner el nombre del campo de la tabla que utilizas

Código PHP:

     function OpenGrid1JSBeforeEditCell($sender, $params)
    {
        ?>
        //begin js
          var fila =jQuery('#OpenGrid1').getGridParam('selrow'); // obtengo el valor de la fila 
          var registro = jQuery("#OpenGrid1").getRowData(fila); // obtengo el registro completo (la fila completa)
          findObj('Label1').innerHTML = registro.NOMBRE; //eso es nada más para verlo en la pantalla
          findObj('HiddenField1').value = registro.NOMBRE; (pongo en el hiddenfield el valor de la columna "NOMBRE")
        //end
        <?php
    
}

Lo demás es igual, es decir, pasas el valor al Hiddenfield y haces la llamada ajax para actualizar el detalle.

Creo que con la OpenGrid tenes la posibilidad de enlazar dos grillas a través de las propiedades para que realicen por sí mismas el filtro maestro detalle. Todavía no sé cómo se hace pero si lo investigas y te resulta, puedes compartirlo.

Otro dato interesante respecto de la OpenGrid, es que puedes cambiar la apariencia a través de la propiedad "theme". Prueba con los siguientes valores: coffee, green, sand

Si necesitas más información, visita el siguiente enlace:
http: //www.trirand.com/jqgridwiki/doku.php?id=wiki:jqgriddocs

También en http: //stackoverflow.com hay muchos temas relacionados con la jqgrid.

No te olvides que la OpenGrid es la JQGrid de JQuery, por lo que si en google buscas jqgrid ... (y lo que necesites) vas a encontrar mucha información

Por último, lo que te pasó con la QDBgrid y la OpenGrid, me refiero a que esta última desapareció, a mí me pasó algo similar al utilizar una DBGrid y una QDBGrid por lo que me di cuenta que hay que utilizar un solo tipo de DBGRid.

Espero te sirva

Saludos

juanpy 22-05-2012 19:51:22

Sobre OpenGrid
 
:confused:
Taqtaq,

Existe un boton "Reload" que al pincharlo, refresca la OpenGrid con la nueva qry, tu sabes como puedo "disparar" la función desde el codigo?.

Probe algo como:
Código PHP:

$this->OpenGrid2->trigger('ReloadGrid'

Que que deberia actualizar la OpenGrid2 pero no funciona.

Gracias.

taqtaq 23-05-2012 01:23:48

Te sirvió el código javascript que te escribí? Pudiste actualizar la grilla de esa forma o necesitas disparar el "reloadgrid" porque no te sirvió el código?

juanpy 23-05-2012 01:42:47

Si todo el codigo esta excelente!
 
Todo muy bien, lo unico que necesito ahora es "disparar" alguna función que me actualize automaticamente la OpenGrid2 (Empleados), osea que cuando pincho una linea de la OpenGrid1 (Empresas), automaticamente se muestren los "Empleados" de la "Empresa" en la OpenGrid2.

Es como una MasterDetail, las Empresas en OpenGrid1 y el detalle de los Empleados en OpenGrid2 a medida que seleccionas, pero aun no encuentro como actualizar la OpenGrid2 en tiempo de ejecucion.

Gracias.


La franja horaria es GMT +2. Ahora son las 11:23:46.

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