none
Instrucción UPDATE (Access y VB.NET) RRS feed

  • Pregunta

  • Hola:

    estoy intentando ejecutar esta consulta en Access pero me salta el error: la operación debe usar una consulta actualizable

    EJEMPLO

    UPDATE productos SET precio = (SELECT sum(productos.precio*compuestos.cant) as sumaImportes FROM productos INNER JOIN compuestos ON productos.idProd = compuestos.idProdHijo WHERE compuestos.idProdPadre=4)
    WHERE productos.idProd=4

    ¿esto no es posible en Access? En caso que no ¿hay alguna alternativa para ese UPDATE en una sóla query?

    Como alternativa final, si no encuentro nada pues tendré que hacerla en 2 idas: primero obtener el importe de "sumaImportes" y luego hacer el UPDATE. Pero lo suyo sería hacerlo en 1 sola instrucción.

     


    Regards, manolitos
    miércoles, 14 de abril de 2010 10:35

Respuestas

  • hola

    la verdad no estoy seguro, pro no me suena que en Access peudas usa consultas anidadas, por ahi lo que podrias ahcer es ejeutar primerola consulta SELECT

    SELECT sum(productos.precio*compuestos.cant) as sumaImportes
    FROM productos INNER JOIN compuestos ON productos.idProd = compuestos.idProdHijo
    WHERE compuestos.idProdPadre=4

     

    recuperar el valor en una variable, y pasarla a la segunda consulta en un parametro

    UPDATE productos SET precio = @precio WHERE productos.idProd=4

     

    podria ser algo como esto:

     

    Using conn As New AoleDbConenction("connectionstring")
        conn.Open()
       
        Dim queryselect As String = "SELECT sum(productos.precio*compuestos.cant) as sumaImportes " & _
                            "FROM productos INNER JOIN compuestos ON productos.idProd = compuestos.idProdHijo " & _
                            "WHERE compuestos.idProdPadre=@idprod"

        Dim importe As Double = 0
        Using cmd As New OleDbCommand(queryselect, conn)
            cmd.Parameters.AddWithValue("idprod", 4)
            importe = CDbl(cmd.ExecuteScalar())
        End Using
       
        Dim queryupdate As String = "UPDATE productos SET precio = @precio " & _
                                    "WHERE productos.idProd=@idprod"
                                   
        Using cmd As New OleDbCommand(queryselect, conn)
            cmd.Parameters.AddWithValue("precio", importe)
            cmd.Parameters.AddWithValue("idprod", 4)
            cmd.ExecuteNonQuery()
        End Using

    End Using

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta yaeko.m miércoles, 14 de abril de 2010 15:24
    miércoles, 14 de abril de 2010 12:12

Todas las respuestas

  • hola

    la verdad no estoy seguro, pro no me suena que en Access peudas usa consultas anidadas, por ahi lo que podrias ahcer es ejeutar primerola consulta SELECT

    SELECT sum(productos.precio*compuestos.cant) as sumaImportes
    FROM productos INNER JOIN compuestos ON productos.idProd = compuestos.idProdHijo
    WHERE compuestos.idProdPadre=4

     

    recuperar el valor en una variable, y pasarla a la segunda consulta en un parametro

    UPDATE productos SET precio = @precio WHERE productos.idProd=4

     

    podria ser algo como esto:

     

    Using conn As New AoleDbConenction("connectionstring")
        conn.Open()
       
        Dim queryselect As String = "SELECT sum(productos.precio*compuestos.cant) as sumaImportes " & _
                            "FROM productos INNER JOIN compuestos ON productos.idProd = compuestos.idProdHijo " & _
                            "WHERE compuestos.idProdPadre=@idprod"

        Dim importe As Double = 0
        Using cmd As New OleDbCommand(queryselect, conn)
            cmd.Parameters.AddWithValue("idprod", 4)
            importe = CDbl(cmd.ExecuteScalar())
        End Using
       
        Dim queryupdate As String = "UPDATE productos SET precio = @precio " & _
                                    "WHERE productos.idProd=@idprod"
                                   
        Using cmd As New OleDbCommand(queryselect, conn)
            cmd.Parameters.AddWithValue("precio", importe)
            cmd.Parameters.AddWithValue("idprod", 4)
            cmd.ExecuteNonQuery()
        End Using

    End Using

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta yaeko.m miércoles, 14 de abril de 2010 15:24
    miércoles, 14 de abril de 2010 12:12
  • Gracias por tu respuesta.

     

    Si, hacerlo en 2  consultas era la alternativa final que tenía, pero esperaba poder hacerlo con 1. Pero también he visto en un foro dónde se comentaba lo mismo, que no es posible ese UPDATE con Access. Pues una pena  la verdad.

     

    Pues ná, al final lo voy a hacer en 2 consultas.

     

    un saludo


    Regards, manolitos
    miércoles, 14 de abril de 2010 15:24