Pasar texto a número access2003

¿Es posible convertir una cadena de texto no número en un número?

1 Respuesta

Respuesta
1

Entiendo que tienes, por ejemplo, un valor en el campo que no representa un número (por ejemplo, "veintitrés"), sino que tienes un valor del tipo "JP", y ese "JP" representaría, por ejemplo, el 5.

Si es así tienes que contemplar todas las posibilidades de qué valores tienes en el texto. Te pongo un ejemplo:
Supongamos que el campo del texto se llama [elDatoTxt] y lo quieres pasar a un nuevo campo que se llama [elDatoNum].

En ese caso podrías escribir lo siguiente, por ejemplo en el evento "Después de actualizar" de [elDatoTxt]
...

Private sub...

Dim elResultado as integer 'o, si tiene que ser muy grande, Long. Si no pasa del número 255 lo puedes declarar como Byte

If not isnull(me.elDatoTxt.value) then

Select case me.elDatoTxt.value

Case "JP"

elResultado=5

Case "KK"

elResultado=6

Case "RT"

elResultado=7

Case else

elResultado=0

End Select

me.elDatoNum.value=elResultado

End Sub

...

Si tuvieras más valores deberías escribirlos individualizadamente con más Case, y siempre antes de Case else (que debe quedar siempre el último). El case else es por si se encuentra algún valor que no hayas contemplado.

Hola Miquel.

Perdona por no contestar antes. Pero siempre me lio y empiezo haciendo pruebas para ver que todo funciona. Me ha costado un poco pero ha valido la pena. Sigo trabajando y estudiando. Muchas gracias por tu respuesta, que como siempre, son perfectas para un novato.

Un saludo

Hola Miquel

Esto es el evento que he generado

Private Sub nota_AfterUpdate()
Dim elResultado As Integer
If Not IsNull(Me.elDatoTxt.Value) Then
Select Case Me.elDatoTxt.Value
Case " SU"
elResultado = 5
Case "BI"
elResultado = 6
Case "NT"
elResultado = 7
Case "IN"
elResultado = 0
Case "SB"
elResultado = 10
Case Else
elResultado = 0
End Select
Me.elDatoNUM.Value = elResultado
End If
End Sub

En un formulario he incluido entre otros el campo " elDatoTxt" y el campo "elDatoNum" . No aparece nada en este último campo.

¿Qué estoy haciendo mal?

El código es correcto. Lo único que se me ocurre es que no estés utilizando bien los nombres de los controles.

En primer lugar, me suena muy raro que el evento esté asignado a un control llamado "nota" y que cojas el valor de un control que llamas elDatoTxt. No digo que esté mal (porque no conozco la sistemática), pero que suena raro suena muy raro.

Si en ese control "nota" es donde escribes las siglas (SU, BI, etc.) entonces las dos primeras líneas del If deberían quedarte así:

If Not IsNull(Me.nota.Value) Then
Select Case Me.nota.Value

Por otra parte comprueba que el campo destino se llama efectivamente como tú lo llamas en el código. Para ello selecciona el control elDatoNUM en el formulario en vista diseño, sacas sus propiedades y te vas a la pestaña Otras -> Nombre. El nombre que te aparezca en esa propiedad es el nombre que debes utilizar en el código. Si se llama igual, pues está bien, pero si por casualidad se llama Texto33 entonces en tu código deberías indicar la escritura del resultado así:

Me.Texto33.Value = elResultado

A ver si así te sale.

Gracias por tu pronta respuesta. He corregido lo que tenía mal pero esto sigue sin funcionar. Te envío la BD por si encuentras el fallo.

Lamento comentarte que no lo estás haciendo bien en absoluto. Me explico:

- Has creado un campo en la tabla llamado elDatoNum porque entiendo que quieres guardar ahí la nota. Ese campo no sería necesario. Pero vamos a darlo por bueno

- Los valores de tu campo elDatoTxt tienen espacios. Y para Access no es lo mismo "SU" que " SU". Los interpreta como cadenas diferentes.

- El código no te funciona porque estás utilizando una consulta que convierte el recordset en no actualizable. Eso significa que automáticamente es una consulta de sólo lectura, y que no puedes ni escribir ni cambiar ningún valor.

Intentando mantener al máximo tu estructura de la BD te digo cómo puedes solucionarlo atacando directamente a las tablas.

1.- Te creas una consulta de actualización y eliminas todos los espacios innecesarios a través del uso de la función Trim()

2.- Te creas un módulo estándar e insertas una función que te procese el código del SELECT CASE que apuntabas, evidentemente adaptado a lo que es una función pública.

3.- Te creas una segunda consulta de actualización que lo que haga es una llamada a la anterior función pública para que te realice la conversión de datos de texto a numéricos y te actualice los valores en la tabla.

El proceso siempre debería ser:

1.- Ejecutar la primera consulta

2.- Ejecutar la segunda consulta

Y siempre por este orden.

Con la tabla con los datos ya rellenos y correctos podrás operar a continuación como lo necesites.

Perdona por no haber contestado antes. Pero lo que me propones, creo, es machacar los datos de la tabla y no es lo que quiero, es por lo que está el campo elDatoNum, para guardar los datos ahí y así conservar los datos de la tabla intactos. No sé si será posible.

Es verdad que no me di cuenta de la función Trim().Un error.

El punto 2. Crear un módulo estandar? Insertar una función, te refieres a un evento dentro de ese módulo.

Perdona por la mi ignorancia, será que cada vez tengo más años. Gracias de todas formas.

No te propongo machacar los datos, exceptuando si hablamos de corregir los espacios en blanco. Tu campo con nota numérica no tiene ningún valor, y lo que hace es proceso es rellenarlo. Si no hay datos no hay machaque, salvo que entiendas que el hecho de que no haya valor y sea sustituido sea un machaque.

Te remití una BD de ejemplo. Échale un vistazo. Lo que no puedo es explicarte al detalle cómo programar en módulos estándar. Ya te hice el ejemplo utilizando consultas objeto para evitar al máximo el VBA, pero que haya algo de código es necesario.

Y, por mucho que hagamos pataletas, un recordset no actualizable de una consulta es algo que no se puede modificar ni permite la modificación de datos, y tu consulta devuelve un recordset no actualizable.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas