• Domingo 22 de Diciembre de 2024, 18:57

Autor Tema:  Re: Consulta SQL  (Leído 2781 veces)

MiguelPG

  • Miembro activo
  • **
  • Mensajes: 93
    • Ver Perfil
Re: Consulta SQL
« en: Domingo 18 de Mayo de 2003, 21:14 »
0
Hola a todos.
Tengo un problema en la apertura de un recordset mediante una consulta SQL que no acabo de entender.
Lo que ocurre es lo siguiente:
Hago la consulta cuyo código reproduzco abajo y todo va muy bien, menos al intentar actualizar o añadir nuevos registros ya que incomporensiblemente, al menos para mi, me dice que NO SE PUEDE ACTUALIZAR PORQUE EL OBJETO ES DE SOLO LECTURA.

    cSQl = "SELECT Volumenes.idVolumen, Volumenes.Titulo, Volumenes.idAutor, Volumenes.idDirector, Volumenes.idInterprete, "
    cSQl = cSQl + "Volumenes.idTipoMusica , Volumenes.Anyo, Volumenes.Soporte, Volumenes.Caratula, Volumenes.Prestado, "
    cSQl = cSQl + "Volumenes.Dejado, Volumenes.Devuelto, Volumenes.Telefono, Volumenes.Movil, Volumenes.Notas, "
    cSQl = cSQl + "Autores.Nombre, Autores.Apellidos, "
    cSQl = cSQl + "Directores.Nombre , Directores.Apellidos, "
    cSQl = cSQl + "Interpretes.Nombre, Interpretes.Apellidos, "
    cSQl = cSQl + "TipoMusica.TipoMusica "
    cSQl = cSQl + "FROM ((Directores INNER JOIN (Autores INNER JOIN Volumenes ON Autores.idAutor = Volumenes.idAutor) "
    cSQl = cSQl + "ON Directores.idDirector = Volumenes.idDirector) INNER JOIN Interpretes "
    cSQl = cSQl + "ON Volumenes.idInterprete = Interpretes.idInterprete) INNER JOIN TipoMusica "
    cSQl = cSQl + "ON Volumenes.idTipoMusica = TipoMusica.idTipoMusica"
       
    Set rstVolumen = dbMusica.OpenRecordset(cSQl & " ORDER BY format(idvolumen,'0000')", dbOpenDynaset)

Por favor, si alguien ve la causa le agradeceré que me lo haga saber. Me trae loco.
:devil:

JKim

  • Miembro activo
  • **
  • Mensajes: 66
    • Ver Perfil
Re: Consulta SQL
« Respuesta #1 en: Miércoles 21 de Mayo de 2003, 19:27 »
0
Hola MiguelPG!

Yo apuntaría más al tipo de recordset que a la SQL. Compruebalo. Te paso una pág de ayuda de VB por si no la tuvieras.

Saludos y suerte

OpenRecordset (Método)
   

Crea un nuevo objeto Recordset y lo añade a la colección Recordsets.

Sintaxis

Para los objetos Connection y Database:

Set variable = objeto.OpenRecordset (origen, tipo, opciones, bloquearmodificaciones)

Para los objetos QueryDef, Recordset y TableDef:

Set variable = objeto.OpenRecordset (tipo, opciones, bloquearmodificaciones)

La sintaxis del método OpenRecordset consta de las siguientes partes.

Argumento Descripción
variable Una variable de objeto que representa el objeto Recordset que desea abrir.
objeto Una variable de objeto que representa un objeto existente desde el que desea crear el objeto Recordset nuevo.
origen Un tipo de datos String que especifica el origen de los registros para el nuevo Recordset. El origen puede ser un nombre de tabla, un nombre de consulta o una instrucción SQL que devuelve registros. Para objetos Recordset de tipo bases de datos Microsoft Jet, el origen sólo puede ser un nombre de tabla.
tipo Opcional. Una constante que indica el tipo de objeto Recordset a abrir, como se especifica en Valores.  
opciones Opcional. Una combinación de constantes que especifican las características del objeto Recordset nuevo, como se especifica en Valores.
bloquearmodificaciones Opcional. Una constante que determina el bloqueo para el objeto Recordset, como se especifica en Valores.  


Valores

Puede utilizar una de las siguientes constantes para el argumento tipo.

Constante Descripción
dbOpenTable Abre un objeto Recordset de tipo Table (sólo espacios de trabajo Microsoft Jet).
DbOpenDynamic Abre un objeto Recordset de tipo Dynamic, que es parecido a un cursor dinámico ODBC (sólo espacios de trabajo ODBCDirect)
dbOpenDynaset Abre un objeto Recordset de tipo Dynaset, que es parecido a un cursor de conjunto de claves ODBC.
dbOpenSnapshot Abre un objeto Recordset de tipo Snapshot, que es parecido a un cursor estático ODBC.
dbOpenForwardOnly  Abre un objeto Recordset de tipo Forward-only.  


Nota Si abre un objeto Recordset en un espacio de trabajo Microsoft Jet y no especifica un tipo, el método OpenRecordset crea una objeto Recordset de tipo Table, si es posible. Si especifica una tabla vinculada o una consulta, el método OpenRecordset crea un objeto Recordset.de tipo Dynaset. En un espacio de trabajo ODBCDirect, el valor predeterminado es dbOpenForwardOnly.

Puede utilizar una combinación de las siguientes constantes para el argumento opciones:

Constante Descripción
dbAppendOnly  Permite al usuario anexar registros nuevos al objeto Recordset, pero impide la creación o eliminación de registros existentes (sólo objetos Recordset de tipo Dynaset de Microsoft Jet).
DbSQLPassThrough  Transfiere una instrucción SQL a un origen de datos ODBC conectado a Microsoft Jet para procesar (sólo un objeto Recordset de tipo Snapshot de Microsoft Jet).
DbSeeChanges Genera un error en tiempo de ejecución si otro usuario está cambiando los datos que usted está modificando.(Sólo en objetos Recordset de tipo Snapshot de Microsoft Jet). Esto es útil en aplicaciones donde varios usuarios tiene acceso de lectura/escritura simultáneo a los mismos datos.  
dbDenyWrite  Previene que otros usuarios puedan modificar o agregar registros (sólo objetos Recordset de Microsoft Jet).
dbDenyRead  Previene que otros usuarios puedan leer datos de una tabla (sólo objetos Recordset de tipo Table de Microsoft Jet).
dbForwardOnly  Crea un objeto Recordset de tipo Forward-only (sólo objetos Recordset de tipo Snapshot de Microsoft Jet). Se proporciona sólo para compatibilidad con versiones anteriores y debe utilizar la constante dbOpenForwardOnly en el argumento tipo en vez de utilizar esta opción.  
dbReadOnly  Previene que otros usuarios puedan hacer cambios el objeto Recordset (sólo Microsoft Jet). La constante dbReadOnly en el argumento bloquearmodificaciones reemplaza esta opción, la cual se proporciona para compatibilidad con versiones anteriores.
DbRunAsync Ejecuta una consulta asíncrona (sólo espacios de trabajo ODBCDirect).  
dbExecDirect  Ejecuta una consulta saltando el método SQLPrepare y llamando directamente al método SQLExecDirect (sólo espacios de trabajo ODBCDirect). Utilice esta opción sólo cuando no se abra un objeto Recordset basándose en una consulta de parámetros. Para obtener más información, consulte la "Referencia del programador de Microsoft ODBC 3.0."
dbInconsistent  Permite actualizaciones inconsistentes (sólo objetos Recordset de tipo Dynaset de Microsoft Jet).
dbConsistent  Permite sólo actualizaciones consistentes (sólo objetos Recordset de tipo Dynaset de Microsoft Jet).


Nota Las constantes dbConsistent y dbInconsistent se excluyen mutuamente y el uso de ambos produce un error. Proporcionar un argumento bloquearmodificaciones cuando el argumento opciones utiliza la constante dbReadOnly también produce un error.

Puede utilizar las siguientes constantes para el argumento bloquearmodificaciones:.

Constante Descripción
dbReadOnly Previene que los usuarios hagan cambios al Recordset (predeterminado en espacios de trabajo ODBCDirect). Puede utilizar dbReadOnly en el argumento opciones o en el argumento bloquearmodificaciones, pero nunca en ambos. Si lo utiliza en ambos argumentos, se produce un error en tiempo de ejecución.
dbPessimistic  Utiliza el bloqueo pesimista para determinar cómo se pueden hacer cambios al objeto Recordset en un entorno multiusuario. La página que contiene el registro que está modificando está bloqueada mientras utiliza el método Edit (predeterminado en espacios de trabajo Microsoft Jet).
dbOptimistic  Utiliza el bloqueo optimista para determinar cómo se pueden hacer cambios al objeto Recordset en un entorno multiusuario. La página que contiene el registro que está modificando está bloqueada mientras se ejecuta el método Update.
dbOptimisticValue  Utiliza la concurrencia optimista basándose en valores de fila (sólo espacios de trabajo ODBCDirect).
dbOptimisticBatch  Activa la actualización optimista por lotes (sólo espacios de trabajo ODBCDirect).


Comentarios

En un espacio de trabajo Microsoft Jet, si objeto hace referencia a un objeto QueryDef o Recordset de tipo Dynaset o Snapshot o si origen hace referencia a una instrucción SQL o un TableDef que representa una tabla adjunta, no podrá utilizar dbOpenTable para el argumento tipo y si lo hace, se producirá un error interceptable. Si desea utilizar una consulta de paso a través de SQL en una tabla adjunta origen de datos ODBC conectado a Microsoft Jet, debe establecer primero la propiedad Connect de la base de datos de la tabla adjunta a una cadena de conexión ODBC válida. Si sólo necesita hacer una única pasada a un Recordset abierto desde un origen de datos ODBC conectado a Microsoft Jet, puede mejorar el rendimiento utilizando dbOpenForwardOnly para el argumento tipo.

Si objeto hace referencia a un Recordset de tipo Dynaset o Snapshot, el Recordset nuevo es del mismo tipo objeto. Si objeto hace referencia a un objeto Recordset de tipo Table, el tipo del objeto nuevo es un objeto Recordset de tipo Dynaset. No puede abrir objetos Recordset nuevos desde objetos Recordset de tipo Forward-only u ODBCDirect.

En un espacio de trabajo ODBCDirect, puede abrir un objeto Recordset que contiene más de una consulta de selección en el argumento origen, como

"SELECT Apellido, Nombre FROM Autores
WHERE Apellidos = 'García';
SELECT Título, Código FROM Títulos
WHERE Código Like '1-55615-*'"

El objeto Recordset devuelto se abrirá con el resultado de la primera consulta. Para obtener el conjunto de registros de resultado de consultas subsiguientes, utilice el método NextRecordset.

Nota Puede enviar consultas DAO a una gran variedad de servidores de bases de datos con ODBCDirect, diferentes servidores reorganizarán ligeramente los diferentes dialectos de SQL. Por esto, la Ayuda sensible al contexto de SQL de Microsoft Jet no es muy extensa, aunque la Ayuda en pantalla de SQL de Microsoft Jet esté todavía incluida en el menú Ayuda. Compruebe que la documentación de referencia para el dialecto SQL de su base de datos del servidor es la apropiada cuando utilice cualquier conexión ODBCDirect, o consultas de paso a través, en aplicaciones cliente/servidor conectadas a Microsoft Jet.

Utilice la constante dbSeeChanges en espacio de trabajo Microsoft Jet si desea captar los cambios realizados mientras dos o más usuarios están modificando o eliminando el mismo registro. Por ejemplo, si dos usuarios empiezan a modificar el mismo registro, el primer usuario que ejecute el método Update consigue realizar la operación. Cuando el segundo usuario ejecute el método Update ocurre un error de tiempo de ejecución. Del mismo modo, si el segundo usuario intenta utilizar el método Delete para eliminar un registro y el primer usuario ha cambiado ya el mismo, se produce un error de tiempo de ejecución.

En general, si al usuario se le presenta este error mientras está actualizando, su código debe actualizar el contenido de los campos y leer los valores recientemente modificados. Si se produce el error durante el proceso de eliminación, el código puede mostrar al usuario los nuevos datos del registro junto con un mensaje que indica que se han modificado recientemente los datos. En este momento, el código puede solicitar una confirmación de que el usuario desea aún eliminar el registro.

También podría utilizar la constante dbSeeChanges si abre un objeto Recordset en un espacio de trabajo ODBC conectado a Microsoft Jet contra una tabla de Microsoft SQL Server 6.0 (o posterior) que tiene una columna IDENTITY, en caso contrario se puede producir un error.

En un espacio de trabajo ODBCDirect, puede ejecutar consultas asíncronas estableciendo la constante dbRunAsync en el argumento opciones. Esto permite a su aplicación seguir procesando otras instrucciones mientras se ejecuta la consulta en segundo plano. Pero, no puede tener acceso a los datos del objeto Recordset hasta que se haya completado la consulta. Para determinar si la consulta a terminado, compruebe la propiedad StillExecuting del objeto Recordset nuevo. Si la consulta tarda más tiempo en acabar del esperado, puede terminar la ejecución de la consulta con el método Cancel.

Abrir más de un objeto Recordset en un origen de datos ODBC puede fallar porque las conexiones están ocupadas con una llamada al método OpenRecordset. prioritaria. Una alternativa a esto es utilizar un cursor del lado del servidor y ODBCDirect, si el servidor lo admite. Otra solución es llenar completamente objeto Recordset utilizando el método MoveLast en cuanto se abre el Recordset.

Si abre un objeto Connection con DefaultCursorDriver establecido a dbUseClientBatchCursor, puede abrir un objeto Recordset para hacer cambios a los datos en la memoria caché (conocido como actualización por lotes) en un espacio de trabajo ODBCDirect. Incluya dbOptimisticBatch en el argumento bloquearmodificaciones para activar la actualización en la memoria caché. Consulte el tema del método Update para obtener más detalles acerca de cómo grabar los cambios en el disco inmediatamente o hacer cambios en la memoria caché y grabarlos en disco como un proceso por lotes.

Al cerrar un Recordset utilizando el método Close, se eliminará automáticamente de la colección Recordsets.

Nota Si origen hace referencia a una instrucción SQL compuesta por una cadena concatenada con valores no enteros y los parámetros del sistema especifican un signo decimal no de EE.UU. como una coma (por ejemplo, strSQL = "PRECIO > " & lngPrecio y lngPrecio = 125,50), se produce un error cuando intenta abrir el objeto Recordset. Esto es debido a que durante la concatenación, el número se convertirá en una cadena utilizando su signo decimal predeterminado del sistema y SQL sólo acepta signos decimales de EE.UU.
:suerte:

MiguelPG

  • Miembro activo
  • **
  • Mensajes: 93
    • Ver Perfil
Re: Consulta SQL
« Respuesta #2 en: Miércoles 21 de Mayo de 2003, 21:58 »
0
Hola JKim.
Muchas gracias por tu respuesta.
Encontré la solución.
El error estaba en que en algunas de las tablas que componen la SQL no había definido un campo clave principal y, por lo tanto, la SQL no "sabía" como relacionar adecuadamente las tablas.
En cualquier caso, te agradezco mucho tu información y el extracto de la ayuda que me has enviado.
Sakudos

:beer:

JKim

  • Miembro activo
  • **
  • Mensajes: 66
    • Ver Perfil
Consulta SQL
« Respuesta #3 en: Jueves 22 de Mayo de 2003, 17:42 »
0
Gracias a ti por contestar con la respuesta correcta. Enhorabuena!