Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Ficheros dBase en Access: set de caracteres

498 views
Skip to first unread message

El Guerrero del Interfaz

unread,
Oct 10, 2002, 12:23:03 PM10/10/02
to
Hola,

Mi problema es el siguiente. Tengo que crear una base de datos en
Access 2000 que acceda a y visualize unos ficheros dBase de otra
aplicación (FacturaPlus). Resulta que cuando enlazo las tablas dBase
con una base de datos de Access, Access me representa los caracteres
accentuados, eñes y similares con caracteres raros. Supongo que será
porque los ficheros dBase todavía usan la codificación usada en MS-DOS
mientras que Access usa la de Windows. Así que mi pregunta es la
siguiente: ¿hay alguna manera de configurar Access para que pueda
visualizar en él los caracteres acentuados de las tablas de dBase como
se ven en el FacturaPlus? Y por supuesto ¿como se hace?

Saludos y gracias.


--
El Guerrero del Interfaz

Victor Delgadillo

unread,
Oct 10, 2002, 1:27:30 PM10/10/02
to
Podrias crearte una funcion que convierta los caracteres ascii a windows.
Por ejemplo, la ñ es 164 ascii, y 0241 en Windows.
Lo que no entiendo es que Windows tambien usa la nomenclatura ASCII... Sera
que dBase usa una clave diferente?
En todo caso, puedes determinar que caracteres tienen para á,é,í,ó,ú,ñ y
luego cambiarlos en una funcion usando InStr (Cuerda, Muestra) y
substituyendo usando la funcion MID(cuerda, posicion, cantidad_caracteres)
Algo asi: (en un Modulo:)
Public Funcion CambioAWindows(Cuerda As String) As String
Const strAacento = 160
Const strEacento = 130
Const strIacento = 161
Const strOacento = 162
Const strUacento = 163
Const strEnnie = 164
' aqui defines las constantes con los valores de las mismas letras en
MsDos:
Const strA = "á" o valor ascii
Const strE = etc.
'luego comparas:
If InStr(Cuerda,strA)>0 then
Mid(Cuerda,InStr(Cuerda,strA),1) = strAacento
End If
If InStr(Cuerda,strE)>0 then
Mid(Cuerda,InStr(Cuerda,strE),1) = strEacento
End If
If InStr(Cuerda,strI)>0 then
Mid(Cuerda,InStr(Cuerda,strI),1) = strIacento
End If
(haces lo mismo para el resto...)
CambioAWindows = Cuerda
End Function

Esto debe servirte... al menos como base para preparar la funcion. Luego
usas esa funcion en una consulta y repones el nombre original por la
funcion.

--
Victor Delgadillo [MS-MVP]
Miami, Florida


"El Guerrero del Interfaz" <inte...@guay.com> wrote in message
news:a9420016.02101...@posting.google.com...

Eduardo Olaz

unread,
Oct 10, 2002, 7:50:51 PM10/10/02
to
Estas funciones las mandé a este foro a finales del año 99.
Te pueden servir para pasar de Windows a DBF y a la inversa.
Tienes el


Public Function ConvertirATextoDOS(ByVal Cadena As String) As String

'************************************************************************
' ConvertirATextoDOS(Texto) --> Texto
' Función desarrollada por Eduardo Olaz
' Primera versión 26/12/99
' Última revisión 26/12/99

'************************************************************************
' parámetros: Texto (por valor, string) Texto en formato Windows
' Valor devuelto (String) Texto convertido a formato MSDOS

Dim strSubCadena As String
Dim lngCadena As Long
Dim lngContador As Long
Dim strCaracter As String * 1

lngCadena = Len(Cadena)

If lngCadena > 0 Then
For lngContador = 1 To lngCadena
strCaracter = Mid$(Cadena, lngContador, 1)
Select Case Asc(strCaracter)
Case 170 ' ª
strCaracter = Chr$(166)
Case 186 ' º
strCaracter = Chr$(167)
Case 225 ' á
strCaracter = Chr$(160)
Case 193 ' Á
strCaracter = Chr$(181)
Case 233 ' é
strCaracter = Chr$(130)
Case 201 ' É
strCaracter = Chr$(144)
Case 237 ' í
strCaracter = Chr$(161)
Case 205 ' Í
strCaracter = Chr$(214)
Case 243 ' ó
strCaracter = Chr$(162)
Case 211 ' Ó
strCaracter = Chr$(224)
Case 250 ' ú
strCaracter = Chr$(163)
Case 218 ' Ú
strCaracter = Chr$(233)
Case 252 ' ü
strCaracter = Chr$(129)
Case 220 ' Ü
strCaracter = Chr$(154)
Case 241 ' ñ
strCaracter = Chr$(164)
Case 209 ' Ñ
strCaracter = Chr$(165)
Case 231 ' ç
strCaracter = Chr$(135)
Case 199 ' Ç
strCaracter = Chr$(128)
End Select
strSubCadena = strSubCadena & strCaracter
Next lngContador
End If
ConvertirATextoDOS = strSubCadena
End Function

Public Function ConvertirATextoWindows(ByVal Cadena As String) As String


'************************************************************************
' ConvertirATextoWindows(Texto) --> Texto
' Función desarrollada por Eduardo Olaz
' Primera versión 26/12/99
' Última revisión 26/12/99

'************************************************************************
' parámetros: Texto (por valor, string) Texto en formato DOS
' Valor devuelto (String) Texto convertido a formato Windows

Dim strSubCadena As String
Dim lngCadena As Long
Dim lngContador As Long
Dim strCaracter As String * 1

lngCadena = Len(Cadena)

If lngCadena > 0 Then
For lngContador = 1 To lngCadena
strCaracter = Mid$(Cadena, lngContador, 1)
Select Case Asc(strCaracter)
Case 166 ' ª
strCaracter = Chr$(170)
Case 167 ' º
strCaracter = Chr$(186)
Case 160 ' á
strCaracter = Chr$(225)
Case 181 ' Á
strCaracter = Chr$(193)
Case 130 ' é
strCaracter = Chr$(233)
Case 144 ' É
strCaracter = Chr$(201)
Case 161 ' í
strCaracter = Chr$(237)
Case 214 ' Í
strCaracter = Chr$(205)
Case 162 ' ó
strCaracter = Chr$(243)
Case 224 ' Ó
strCaracter = Chr$(211)
Case 163 ' ú
strCaracter = Chr$(250)
Case 233 ' Ú
strCaracter = Chr$(218)
Case 129 ' ü
strCaracter = Chr$(252)
Case 154 ' Ü
strCaracter = Chr$(220)
Case 164 ' ñ
strCaracter = Chr$(241)
Case 165 ' Ñ
strCaracter = Chr$(209)
Case 135 ' ç
strCaracter = Chr$(231)
Case 128 ' Ç
strCaracter = Chr$(199)
End Select
strSubCadena = strSubCadena & strCaracter
Next lngContador
End If
ConvertirATextoWindows = strSubCadena
End Function

Saludos desde la calle Estafeta de Pamplona

Eduardo Olaz
Microsoft [MVP] Access
edu...@olaz.net

Eduardo Olaz

unread,
Oct 10, 2002, 8:12:17 PM10/10/02
to
Aquí tienes las funciones equivalentes

TextoWindowsADos
TextoDosAWindows

Realizadas con las funciones API

CharToOem
OemToChar
____________________________________

Option Explicit

Declare Function CharToOem _
Lib "user32" _
Alias "CharToOemA" ( _
ByVal CadenaAConvertir As String, _
ByVal CadenaConvertida As String) _
As Long
Declare Function OemToChar _
Lib "user32" _
Alias "OemToCharA" ( _
ByVal CadenaAConvertir As String, _
ByVal CadenaConvertida As String) _
As Long

Public Function TextoWindowsADos( _
ByVal Cadena As String) _
As String
Dim strBuffer As String
Dim Resultado As Long
strBuffer = String(Len(Cadena), " ")
Resultado = CharToOem(Cadena, strBuffer)
TextoWindowsADos = strBuffer
End Function

Public Function TextoDosAWindows( _
ByVal Cadena As String) _
As String
Dim strBuffer As String
Dim Resultado As Long
strBuffer = String(Len(Cadena), " ")
Resultado = OemToChar(Cadena, strBuffer)
TextoDosAWindows = strBuffer
End Function

____________________________________

El Guerrero del Interfaz

unread,
Oct 11, 2002, 4:15:25 AM10/11/02
to
"Victor Delgadillo" <victo...@NOSPAMYahoo.com> wrote in message news:<uv1FxHIcCHA.2420@tkmsftngp09>...

> Podrias crearte una funcion que convierta los caracteres ascii a windows.
> Por ejemplo, la ñ es 164 ascii, y 0241 en Windows.

Ya, pero ¿es posible que la función se aplique automaticamente a
todos los registros que se visualizen sin modificar su contenido? No
quiero modificar los caracteres usados porque sino ya no se verían
correctamente en la aplicación de gestión. Sólo quiero que se puedan
ver correctamente en Access.

> Lo que no entiendo es que Windows tambien usa la nomenclatura ASCII... Sera
> que dBase usa una clave diferente?

No tengo mucha idea de esto pero a continuación te pongo un
ejemplo:
Esto es como aparece un campo en la aplicación FacturaPlus que usa
los ficheros dBase:
EL CORTE INGLÉS, S.A.
Y esto es como aparece el mismo campo cuando se visualiza la tabla
de dBase con Access:
EL CORTE INGL&#9556;S, S.A.
(tampoco se ve el carácter aquí, es como la esquina superior izquierda
de un cuadro de doble borde como los que se usaban para pintar cuadros
en pantalla en la época del MS-DOS en modo carácter y tal)

> [snip]


> Esto debe servirte... al menos como base para preparar la funcion. Luego
> usas esa funcion en una consulta y repones el nombre original por la
> funcion.
>

Gracias mil por tu información pero no quiero modificar los datos,
sólo visualizar correctamente en Access.

> --
> Victor Delgadillo [MS-MVP]
> Miami, Florida

Vaya, esto está lejos...

Chea

unread,
Oct 11, 2002, 9:40:42 AM10/11/02
to
En el otro grupo de news sobre Access en español, Alejandro Bibiano
respondía lo siguiente a una pregunta similar:

Si no recuerdo mal, lo que debes hacer es editar el registro de Windows y
dentro de Mi_Pc\\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Xbase
modificar la clave DataCodePage.
Esta clave puede ser OEM (realiza la conversión OEM a ANSI y al revés) o
ANSI (no realiza la conversión).


--
Saludos.
J.Bengoechea
http://usuarios.tripod.es/jbchea/
"El Guerrero del Interfaz" <inte...@guay.com> escribió en el mensaje
news:a9420016.02101...@posting.google.com...

El Guerrero del Interfaz

unread,
Oct 17, 2002, 7:25:41 AM10/17/02
to
"Chea" <j.b...@wanadoo.es> wrote in message news:<utt47LTcCHA.2476@tkmsftngp10>...

> En el otro grupo de news sobre Access en español, Alejandro Bibiano
> respondía lo siguiente a una pregunta similar:
>
> Si no recuerdo mal, lo que debes hacer es editar el registro de Windows y
> dentro de Mi_Pc\\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Xbase
> modificar la clave DataCodePage.
> Esta clave puede ser OEM (realiza la conversión OEM a ANSI y al revés) o
> ANSI (no realiza la conversión).
>
Éste era el problema. Los datos estaban correctamente codificados
en el fichero dbf pero por defecto Access realizaba una conversión
inecesaria y errónea. Gracias mil por la información.
>
> --
> Saludos.

Saludos y gracias otra vez.

0 new messages