¿Ayuda para convertir campos de texto con valores numéricos a campo numérico, sin perder datos?

Tengo una base de datos sql a la cual genero informes por medio de access, y resulta que al momento de generar una consulta de ventas, el campo "total venta" se genera con valores numéricos pero en formato texto. Al copiarlo a excel y convertir los valores a número la sumatoria es correcta, sin embargo, al intentar convertirlos en consulta access a número, pierdo muchos registros, por ejemplo, al sumar los valores totales el resultado es 222,969.17 pero al convertirlo a número utilizando "val()" o multiplicándolos por "1" el resultado es de apenas 81,549... El problema radica que no puede hacer ningún tipo de sumatoria o fórmula para generar mi informe automático, ya que pierdo la mayor cantidad de registros al hacerlo.

1 respuesta

Respuesta
1

Se me ocurre que quizás es un problema de formato de la exportación por el tema de puntos y comas para identificar separador de miles y de decimales.

En Excel y en Calc hay opciones para importar en formato americano.

Sino, se me ocurre un programa que te exporte a CSV. Yo tenia algo hecho, si te interesa te lo busco y te lo paso. Creo recordar que tenía en cuenta esto del formato

Bueno, de hecho corroboré que el campo de la consulta estuviera formateado a moneda, sin embargo, al hacer esto también se pierden algunos datos (aunque en menor cantidad) debido a que no exporta nada después del punto decimal. Estaba leyendo al respecto y al parecer hay que hacer una serie de fórmulas para convertilo a número, pero si tienes una solución hacia ésto te lo agradecería muchísimo, ya que tengo un reporte de utilidades para la empresa de donde trabajo el cual no he logrado hacer debido a este inconveniente.

Saludos,

Te busco el código y te lo envío.

Se trata de unas funciones que realizan una exportación de un recordset dado (tabla, consulta...) sin importar el número de filas o columnas, y si mal no recuerdo hice una función para el tema de los números.

Lo dicho, esta noche lo busco y te lo paso.

Muchas gracias !!! estaré al pendiente....

Estoy en ello compañero. Creo que lo tengo en otro server.

Mañana con calma te lo busco

Perdón por el retraso. Ahí van dos funciones:

Public Function Exportador(Origen As String, fDestino As String, Optional conFiltro As String = False, Optional separador As String = ",", Optional offset As Integer = 0, Optional FechaJapones As Boolean = True, Optional FmtoNumerico As String = "US", Optional TipoFormato As String = "txt") As Boolean
Dim filename As String, qrydatos As Recordset
Dim linea As String, camp As Integer, camps As Integer, lineas As Long
Dim salida As String, dato As String
DoCmd.Hourglass True
If FileExists(fDestino) Then
Kill fDestino
End If
Set qrydatos = CurrentDb.OpenRecordset(Origen)
qrydatos.Filter = conFiltro
camps = qrydatos.Fields.Count
Open fDestino & "." & TipoFormato For Append As #1
linea = 0
lineas = qrydatos.RecordCount
While Not qrydatos.EOF
Debug.Print SysCmd(acSysCmdSetStatus, "Exportando registro " & linea & " de " & lineas & ". Por favor espere");
salida = ""
camp = offset
While camp < camps
If IsNull(qrydatos.Fields(camp)) Then
dato = ""
ElseIf IsDate(qrydatos.Fields(camp)) Then
dato = Format(qrydatos.Fields(camp), "yyyymmdd")
ElseIf IsNumeric(qrydatos.Fields(camp)) Then
dato = IIf(FmtoNumerico = "US", PuntoDecimal(qrydatos.Fields(camp)), qrydatos.Fields(camp))
Else
dato = qrydatos.Fields(camp)
End If
salida = salida & dato & separador
camp = camp + 1
Wend
qrydatos.MoveNext
salida = Left(salida, Len(salida) - 1)
Print #1, salida
linea = linea + 1
Wend
Close #1
DoCmd.Hourglass False
End Function

Private Function PuntoDecimal(cadena As String) As String
Dim salida As String, i As Integer
Dim car As String
For i = 1 To Len(cadena)
salida = salida & IIf(Mid(cadena, i, 1) = ",", ".", Mid(cadena, i, 1))
Next
PuntoDecimal = salida
End Function

Puedes usarlas tal cual. En función de tu experiencia necesitarás más o menos explicaciones. Mírate el código, si quieres pruébalo y me dices lo que no entiendes para que te lo pueda aclarar, ¿ok?

¿Lo has probado? ¿Funciona?

Perdón por tardar en responder, estuve muy ocupado esta semana..... Estoy intentando, y perdón por mi ignorancia pero ¿este código me debe crear una expresión que se llame "exportador" y otra llamada "puntodecimal"?, intenté de esta forma y al añadir la expresión a la consulta access me dice que no existe.

El resultado del código es un archivo.

Date cuenta de la cabecera de la función:

Public Function Exportador(Origen As String, fDestino As String, Optional conFiltro As String = False, Optional separador As String = ",", Optional offset As Integer = 0, Optional FechaJapones As Boolean = True, Optional FmtoNumerico As String = "US", Optional TipoFormato As String = "txt") As Boolean

- Es una función pública: esto significa que si la guardas en un módulo puedes llamarla en cualquier momento

- Cuando llames a la función hay que indicarle algunos parámetros, otros son opcionales

- Los parámetros que tienes que darle son:

+ Origen: una cadena de texto que es una consulta SQL tipo SELECT campos FROM tabla. Si tienes dudas en este punto dímelo y te lo explicaré mejor.

+ FDestino: el nombre completo del archivo a escribir, por ejemplo "C:\mis documentos\archivo.txt"

+ ConFiltro es opcional, por defecto es falso, es decir, sin filtro, e indica si vas a filtrar los datos de Origen o pasarán todos

+ Separador es opcional, por defecto es ",", e indica que separador vas a usar para las columnas

+ Offset es un número que indica cuantos caracteres hay que dejar a la izquierda, por defecto es cero.

+ FechaJapones es opcional, por defecto es verdadero. Lo que hace es escribir la fecha como YYYYMMDD, sino la escribe como DDMMYYYY

+ FmtoNumerico es opcional, e indica el formato con que se escribirán los números. Por defecto es formato US (yo le llamo así) y lo que hace es escribir un punto decimal en lugar de una coma

+ TipoFormato es opcional, por defecto es txt. Es la extensión del archivo de destino

La función PuntoDecimal es privada, sólo podrá usarla la función Exportador, pero te da igual, de hecho quien tiene que usarla es la función Exportador.

Lo que tenemos que saber ahora es a partir de qué tienes que exportar los datos, es decir, cuál es el origen de tus datos: una tabla, una consulta, los datos de un listbox de un form...

Míralo, me lo dices, y te diré como tienes que llamar a la función.

Ahhh... creí que era una expresión (como Numlet, que convierte números a letras). Verás, mi problema realmente radica en que no quiero exportar, ahora estoy exportando mi consulta a excel y ahí si puedo trabajar bien el reporte sin ningún inconveniente ya que excel tiene la opción de convertir los campos texto a numéricos según su contenido. Sin embargo, lo que estoy buscando es convertir un campo texto con valores numéricos en una consulta sql, en números para poder realizar cálculos, por ejemplo: [texto 1234], Ventas= convertir([texto 1234]).... creo que me entenderás haciendo de cuenta que utilizas el diseñador de consultas de access.

Pues no lo entiendo.

Por lo que dices necesitas un campo calculado en tu consulta, pero dices que al hacerlo convierte el resultado en un número menor.

Lo único que se me ocurre es que haya un fallo en la consulta o en la conversión de tipos.

Desconozco si tienes consultas anidadas. En tal caso yo iría una por una verificando información, a ver si alguno de los valores tiene algún problema. A veces sucede que en las consultas de agrupación surge algún fallo, sobre todo si hay anidamiento.

Ahí creo que ya haría falta verlo. Si no tienes inconveniente, puedo darte mi correo y me envías aunque sea una copia de la/las consultas implicadas y de la tabla para echarle un vistazo.

Por supuesto, te lo agradecería muchísimo.... puedo enviarte una copia de la tabla access directamente... bueno, el caso en sí, es que al hacer la consulta me genera los valores de costo y venta en campos de texto en vez de campos numéricos (a pesar de configurarlo para número), y al momento de sumarlos, o hacer cualquier tipo de cálculo, empieza a obviar muchos datos y me afecta el resultado final. Finalizaré la pregunta y te dejo mi correo para que me envíes el tuyo.

Muchas gracias !! correo: [email protected] / [email protected]

Envíamelo a [email protected]

Si no te importa oriéntame un poco acerca de lo que me envías, para que vaya más a lo seguro

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas