Problema con sentencia SQL

Problema con sentencia SQL

de Jesús Mª Serrano -
Número de respuestas: 11
Estoy desarrollando un bloque y estoy un poco verde en la manera que tiene Moodle para mostrar el resultado de las consultas SQL. Mi bloque debe mostrar los nombres de los alumnos y estos asociados ala nota de una tarea, ¿cúal es el código para mostrar el resultado de la consulta?çç

PD: La consulta está creada y si la pongo en PhpmyAdmin funciona, sólo necesito la explicación de cómo poder mostrarla.

Gracias y un saludo.

Jesús Serrano
Promedio de valoraciones: -
En respuesta a Jesús Mª Serrano

Re: Problema con sentencia SQL

de Xavier Paz -
Puedes usar la función get_records_sql() que recibe como parámetro una consulta SQL y devuelve el resultado. Esta función es útil cuando tienes consultas complejas que implican varias tablas.

Después, tambien tienes get_records que sirve para obtener los registros de una tabla que cumplan unas determinadas condiciones especificadas mediante parámetros, por ejemplo registros de la tabla user cuyo nombre de usuario sea moodle.

En cualquier caso, antes de usar consultas complejas que puede depender de como estén estructuradas las tablas, investigaría si existen funciones de Moodle que hagan esa tarea o parte de ella. Así obtienes independencia y modularidad, y la complejidad se reduce mucho.
En respuesta a Xavier Paz

Re: Problema con sentencia SQL

de Alejandro Michavila Pallarés -
No entiendo por qué cuando quiero borrar una instancia de un módulo, me salta el siguiente error:

Fatal error: Call to a member function get_record() on a non-object in /var/www/moodle/mod/newmodule/lib.php on line 112

Simplemente compruebo que exista un registro con el id pasado a la función delete_instance llamada cuando se pulsa la "X" para borrar la instancia.

if (! $newmodule = $DB->get_record('newmodule', array('id' => $id))) {
return false;
}

Y después procedo a borrar el registro:

$DB->delete_records('newmodule', array('id' => $newmodule->id));

Pero no alcanza esta linea y por lo tanto no lo borra. He mirado el código de otros módulos y hacen exáctamente lo mismo.
En respuesta a Alejandro Michavila Pallarés

Re: Problema con sentencia SQL

de Xavier Paz -
¿Ese código es parte de una función? ¿has exportado la variable global $DB para que pueda ser usada dentro de la función?

En cualquier caso, $DB no es un objeto, sino una variable global, no tiene métodos, por tanto no puedes invocar el método get_record()
En respuesta a Xavier Paz

Re: Problema con sentencia SQL

de Iñaki Arenaza -
Imagen de Desarrolladores Imagen de Desarrolladores de plugins Imagen de Documentadores Imagen de Moderadores Imagen de Moodlers de gran ayuda

En realidad en Moodle 2.0 si es un objeto y tiene métodos, y es la forma adecuada de usarla.

Pero si el código es para 1.9, la variable $DB no existe y hay que llamar a las funciones de acceso a base de datos directamente. Asimismo el paso de parámetros de la consulta no se hace por medio de un array, sino usando parámetros posicionales. Por tanto el código sería así:

if (!$newmodule = get_record('newmodule', 'id', $id)) {
   return false;
}

y así:

delete_records('newmodule', 'id', $newmodule->id);

Saludos. Iñaki.

En respuesta a Iñaki Arenaza

Re: Problema con sentencia SQL

de Alejandro Michavila Pallarés -
Hola Iñaki,

Muchísimas gracias por tu respuesta.

Es cierto que para desarrollar mi módulo uso la versión estable 1.9.9 (Build: 20100609).

He hecho los cambios que me has dicho en mi código y el error desaparece, así como el registro es eliminado correctamente, por lo tanto funciona.

Me gustaría que mi módulo fuera compatible para la versión 2.0, y no sé si el cambio que me has dicho implica que en la versión 2.0 es necesario usar el objeto $DB para hacer uso de los métodos get_record() y delete_record() o que será complatible sin $DB.

En caso de que fuera necesario o recomendable utilizar el objeto $DB para la versión 2.0, me gustaría saber de qué forma puedo en función de la versión Moodle, usar una forma u otra.

Un saludo.
En respuesta a Alejandro Michavila Pallarés

Re: Problema con sentencia SQL

de Iñaki Arenaza -
Imagen de Desarrolladores Imagen de Desarrolladores de plugins Imagen de Documentadores Imagen de Moderadores Imagen de Moodlers de gran ayuda

Me temo que la cosa no es sencilla. En el caso de la versión 2.0 es obligatorio usar el objeto $DB y sus métodos para acceder a la base de datos y en 1.9 justo lo contrario.

Además de eso, como he comentado, en las funciones "sencillas" (get_record, get_field, etc.) el paso de parámetros pasa de ser posicional a pasarse en un array asociativo. En el caso de las funciones "genericas" (get_records_sql, etc.) donde se puede construir SQL arbitrario, la forma de nombras las tablas y la forma de indicar los valores a utilizar en la consulta han cambiado también sustancialmente. Y de igual manera han cambiado la gestión de los 'recordset' que devuelven este tipo de funciones.

Por tanto tratar de soportar ambas versiones en un único código va a ser complicado. Probablemente más complicado que tener dos versiones del módulo: una para 1.9 y otra para 2.0.

Si usas un buen sistema de gestión de código fuente que permita trabajar de forma eficiente y cómoda con ramas, el mantener las dos ramas en paralelo puede ser bastante manejable (yo personalmente uso git, pero mercurial es igual de bueno; si no te queda más remedio puede user subversion, pero es más limitado en este caso).

Saludos. Iñaki.

En respuesta a Iñaki Arenaza

Re: Problema con sentencia SQL

de Alejandro Michavila Pallarés -
Muchas gracias Iñaki, me has ahorrado mucho trabajo.

Lo más probable es que eliga entre desarrollar para 1.9 o para 2.0, sin llevar las dos ramas en paralelo, no porque no quiera, sino por falta de tiempo.

Tendré que tomar una decisión, pero lo más seguro es que sea un módulo para la versión 2.0, ya que parece que la fecha de la última release será para el mes que viene:

http://docs.moodle.org/en/Moodle_2.0_release_notes


Un saludo.


En respuesta a Alejandro Michavila Pallarés

Re: Problema con sentencia SQL

de Alejandro Michavila Pallarés -
Hola,

¿Podríais confirmarme si el siguiente uso de get_record() es correcto para 2.0?:

$DB->get_record('newmodule_table1', array('field1' => $field1, 'field2' => $field2, 'field3' => $field3));

Lo que quiero es obtener un registro de la tabla newmodule_table1 en la que 3 de sus campos coincidan con 3 variables.

Gracias.
En respuesta a Jesús Mª Serrano

Re: Problema con sentencia SQL

de Francy Julieth Moreno Vela -
Hola mas que responderte necesito una yuda me gustaria saber donde encuentro una guia para construir sentencias de sql a lla base de datos de moodle para saber datos como numero de clics quienes vieron la plataforma, y exportarlo a excel, sihay algun programa que se puedda instalar gracias mi email es francy.morenov@hotmail.com