none
Consulta UPDATE en SqlCompact no me funciona RRS feed

  • Pregunta

  • Hola a todos:

    Estoy intentando adaptar una consulta que funciona perfectamente en sql server o en Access, pero en SqlCompact no funciona al parecer porque la palabra Left no es correcta o no existe.

    La consulta en Access por ejemplo es la siguiente:

     cmd.CommandText = "UPDATE BALANCES SET " & ejer & " = 0" &
                                            " WHERE IdEmpresa = @empresa AND PlanConta = 'PLAN 2007'" &
                                            " AND Cód_GC IN " &
                                            "(SELECT left(Cód_GC,3) FROM BALANCES " &
                                            " WHERE IdEmpresa = @empresa AND PlanConta = 'PLAN 2007'" &
                                            " AND Len(Cód_GC)=4 GROUP BY left(Cód_GC,3) " &
                                            " HAVING SUM(" & ejer & ") <> 0)"

    Y la trato de montar para SqlCompact de la siguiente manera, sustituyendo Left por SubsString pero no funciona.

     cmd.CommandText = "UPDATE BALANCES SET " & ejer & " = 0" &
                                            " WHERE IdEmpresa = @empresa AND PlanConta = 'PLAN 2007'" &
                                            " AND Cód_GC IN " &
                                            "(SELECT Substring(Cód_GC,3) FROM BALANCES " &
                                            " WHERE IdEmpresa = @empresa AND PlanConta = 'PLAN 2007'" &
                                            " AND Len(Cód_GC)=4 GROUP BY Substring(Cód_GC,3) " &
                                            " HAVING SUM(" & ejer & ") <> 0)"

    Bueno, gracias a todos.

    Gemma

    jueves, 25 de febrero de 2016 9:44

Respuestas

  • "gemma_campillo" escribió:

    > Estoy intentando adaptar una consulta que funciona perfectamente en sql
    > server o en Access, pero en SqlCompact no funciona al parecer porque la
    > palabra Left no es correcta o no existe.

    Ese es otro problema que se te va a presentar con la "multitud" de motores de bases de datos con los que deseas hacer compatible tu aplicación, y es que cada motor de datos digamos que tiene su "propio lenguaje SQL" que en algunos casos no es compatible con el estándar SQL.

    En estos momentos ignoro si el lenguaje SQL de SQLCompact admite o no la palabra Left, aunque si obtienes algún mensaje de error que así lo indique, será porque no la admite.

    Fíjate en la concatenación de valores que efectúas en la sintaxis de la consulta UPDATE que deseas ejecutar:

    > cmd.CommandText = "UPDATE BALANCES SET " & ejer & " = 0" &

    ¿Ves la concatenación para añadir a la consulta el valor de la variable "ejer"? Pues donde aparece "left(Cód_GC,3)", concatena el valor que deseas que tenga el nombre del campo que deseas seleccionar.

    ¡Venga! Prueba a ver si eres capaz de concatenar el valor por ti misma, y si haces la concatenación con el método String.Format, pues muchísimo mejor. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    • Marcado como respuesta gemma_campillo jueves, 25 de febrero de 2016 11:17
    jueves, 25 de febrero de 2016 10:45
    Moderador

Todas las respuestas

  • "gemma_campillo" escribió:

    > Estoy intentando adaptar una consulta que funciona perfectamente en sql
    > server o en Access, pero en SqlCompact no funciona al parecer porque la
    > palabra Left no es correcta o no existe.

    Ese es otro problema que se te va a presentar con la "multitud" de motores de bases de datos con los que deseas hacer compatible tu aplicación, y es que cada motor de datos digamos que tiene su "propio lenguaje SQL" que en algunos casos no es compatible con el estándar SQL.

    En estos momentos ignoro si el lenguaje SQL de SQLCompact admite o no la palabra Left, aunque si obtienes algún mensaje de error que así lo indique, será porque no la admite.

    Fíjate en la concatenación de valores que efectúas en la sintaxis de la consulta UPDATE que deseas ejecutar:

    > cmd.CommandText = "UPDATE BALANCES SET " & ejer & " = 0" &

    ¿Ves la concatenación para añadir a la consulta el valor de la variable "ejer"? Pues donde aparece "left(Cód_GC,3)", concatena el valor que deseas que tenga el nombre del campo que deseas seleccionar.

    ¡Venga! Prueba a ver si eres capaz de concatenar el valor por ti misma, y si haces la concatenación con el método String.Format, pues muchísimo mejor. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    • Marcado como respuesta gemma_campillo jueves, 25 de febrero de 2016 11:17
    jueves, 25 de febrero de 2016 10:45
    Moderador
  • Hola maestro:

    Voy a intentarlo. A ver si lo logro entender bien con el stringFormat y lo hago.

    Un abrazo.

    Gemma

    jueves, 25 de febrero de 2016 11:18
  • "gemma_campillo" escribió:

    > Voy a intentarlo. A ver si lo logro entender bien con el stringFormat y lo hago.

    Es muy sencillo. En vez que el Left lo haga el motor de datos, dárselo tú ya hecho. ;-)

    Y si en tu aplicación tienes más consultas SQL donde te aprovechas de las funciones propias del lenguaje SQL de Access, revísalas porque lo más seguro es que tengas problemas cuando desees ejecutar dichas consultas en SQLCompact, SQLite, el propio SQL Server, Oracle u otro motor de datos diferente.

    Ten en cuenta que cuando se trabaja con diferentes motores de datos, la sintaxis de las consultas SQL que se ejecute tienes que procurar que sean compatibles entre todos ellos, utilizando para ello el SQL estándar. Pero si utilizar un SQL particular de éste o aquel motor, lo más seguro es que tengas problemas como el que ahora estás teniendo.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    jueves, 25 de febrero de 2016 11:34
    Moderador
  • Hola Enrique:

    Si, las consultas están hechas para Access principalmente y en su momento las adapté para que también funcionaran con Sql Express, pero no me he parado nunca a hacerlo con el Sql estándar que me lo voy a mirar.

    Las hago por inercia y después como es este caso no me funciona. Como me de muchos problemas, voy a dejar solo el Access y el sql express que funcionan perfectamente. Estoy ya muy cansada de tantos cambios y añadidos para los dichosos motores.

    Todos los procesos almacenados están bien para los motores que los llevan, pero el problema se plantea en este tipo de sql que aunque no hay muchas, cada una que te encuentras te complica la vida.

    Bueno mi querido amigo, voy a seguir y a mirar los del Sql estándar.

    Un fuerte abrazo querido Enrique.

    Gemma

    jueves, 25 de febrero de 2016 11:44