Sql para pasar un campo % a una tabla

Tengo una Tabla de nombre "TImpComisiones" y que entre sus campos está ImpComis, (entiendo que no puede ser texto porque lo necesito para multiplicarlo por otro campo y saber el resultado). Por otro lado, en el formulario tengo entre otros campos "CboTipComis", en donde debo selecionar el tipo de comisión y dependiendo de selección el siguiente campo del formulario, "TxtImpComis" se convierte en un número entero o en porcentaje que después hay que pasar a la tabla.

Aquí van las intrucciones que he generado para que se vea en el formulario:

Private Sub TxtImpComis_AfterUpdate()
'
If TxtTipComis.Value <> "CANON DE MERCADO" Then

Me.TxtImpComis.Value = Format(CDbl(Nz(TxtImpComis / 100, 0)), "#0.00 %")

Else

Me.TxtImpComis.Value = Format(CDbl(Nz(TxtImpComis, "#0.00")))

End If
End Sub

y después la SQL para trasladar los datos a la tabla y que es :

miSQL = "INSERT INTO TImpComisiones(FechaOper,TipoComision,ImportComis)" & _
" VALUES(#" & Format(Me.TxtFechOper.Value, "dd/mm/yyyy") & "#,'" & TxtTipComis.Value & "', '" & _
TxtImpComis.Value & "')"

Unas veces por una cuestión de formato de número o texto y otras por otras siempre da error.

Por último decir que en la ventana inmediato se representa correctamente por ejemplo: INSERT INTO TImpComisiones(FechaOper, TipoComision, ImportComis) VALUES(#03/04/2025#,'CORRETAJES', '0,20 %') pero en la tabla o no aparece dato alguno o solamente parcialmente.

2 Respuestas

Respuesta
1

Te mando un ejemplo a tu email

Respuesta
1

El problema principal es que TxtImpComis.Value está formateado como texto con un símbolo de porcentaje (%), lo que impide que Access lo reconozca como un número válido al insertarlo en la tabla.

Solución

Debe asegurarte de que el campo ImportComis en la tabla TImpComisiones sea un campo numérico (Double) y que el valor insertado en la SQL sea un número sin formato de porcentaje.

Corrección del código VBA

Modifique el evento AfterUpdate para que el valor de TxtImpComis sea numérico internamente, sin formatearlo con %, pero manteniendo el formato en la pantalla del usuario:

Private Sub TxtImpComis_AfterUpdate()
    If TxtTipComis.Value <> "CANON DE MERCADO" Then
        ' Guarda el valor como número, no como texto con "%"
        Me.TxtImpComis.Tag = CDbl(Nz(Me.TxtImpComis.Value, 0)) / 100
        ' Muestra el valor formateado con porcentaje en pantalla
        Me.TxtImpComis.Value = Format(Me.TxtImpComis.Tag, "0.00%")
    Else
        ' Guarda el valor como número sin formateo
        Me.TxtImpComis.Tag = CDbl(Nz(Me.TxtImpComis.Value, 0))
        ' Muestra el número sin porcentaje en pantalla
        Me.TxtImpComis.Value = Format(Me.TxtImpComis.Tag, "0.00")
    End If
End Sub

Explicación:

Usamos Me. TxtImpComis. Tag para almacenar el valor numérico real sin formateo.

Me. TxtImpComis.Value solo se usa para mostrar el dato con formato en la pantalla.

CDbl(Nz(Me. TxtImpComis.Value, 0)) / 100 convierte correctamente el porcentaje en decimal.

Para "CANON DE MERCADO", el valor se deja como número sin dividir entre 100.

Corrección de la SQL

Ahora, en la SQL de inserción, use Me. TxtImpComis. Tag en lugar de Me. TxtImpComis.Value para asegurarse de que el dato sea numérico:

miSQL = "INSERT INTO TImpComisiones(FechaOper, TipoComision, ImportComis) " & _
        "VALUES(#" & Format(Me.TxtFechOper.Value, "yyyy/mm/dd") & "#, '" & TxtTipComis.Value & "', " & _
        Replace(Me. TxtImpComis.Tag, ",", ".") & ")"

Ahora:

Se almacena en la tabla un número correcto (ej. 0.20 en vez de '0,20 %').
Se evita el error de tipo de dato en SQL.
Se mantiene el formato visual en el formulario sin alterar el valor real.

Muchas gracias Eduardo

Con gusto

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas