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

Convertir lineas de campo memo en nuevos campos texto

431 views
Skip to first unread message

jaguga

unread,
Feb 1, 2012, 5:18:27 PM2/1/12
to
Hola a todos; tengo una tabla Access en la que el campo ‘Domicilio’
es un campo memo, de forma que en líneas diferentes se colocan los
domicilios que pueda tener una persona, quedando, a modo de ejemplo, de esta
forma (cada línea comienza con dos guiones):
-- Paseo Calatrava, nº 57 <GETAFE>
-- Plaza España, nº 2-4 <MADRID>
-- Sol, nº 2- 9 <GETAFE>

Me interesa que cada linea que contiene un domicilio pasarla a un campo texto,
acompañado de otro campo que recoja el campo ID (es un
autonumérico) del correspondiente registro pero no se cómo
(supongo que tendrá que realizarse mediante código, algo en lo que
no estoy muy puesto), de modo que quedase de la siguiente manera:

Campo ID NuevoCampo Domicilio

1234 Paseo Calatrava, nº 57 <GETAFE>
1234 Plaza España, nº 2-4 <MADRID>
1234 Sol, nº 2- 9 <GETAFE>

Gracias anticipadas.

José Mª Fueyo

unread,
Feb 2, 2012, 4:34:55 AM2/2/12
to
Hola
No nos comentas que versión de Access utilizas.
El resultado de la disdegración ¿se guardaría en una tabla? por qué
sería algo tan sencillo como montar un procedimiento que separe las
direcciones mediante un split
Por ejemplo, creo un formulario continuo que tiene un cuadro de texto,
txtTexto, vinculado al campo memo. Este código te separa las
direcciones en una matriz de string, buscando como separador "-- ", y
luego las muestra en la ventana de inmediado mediante un ciclo FOR,
recorriendo el índice.
En cada iteración, compruebo sí la variable tiene una longitud
superior a 0 (al haber un salto de linea, me generaría una cadana
vacía). Luego compruebo sí los dos últimos caracteres son un salto de
linea y un retorno de carro (vbCrLf). Sí lo son, los elimino. Y
muestro la variable en la ventana de inmediato

<pego>

Private Sub Form_Current()
Dim sCampos() As String
sCampos = Split(Me.txtTexto.Value, "-- ")
Dim i As Integer
For i = 0 To UBound(sCampos)
If Len(sCampos(i)) > 0 Then
If Right(sCampos(i), 2) = vbCrLf Then
sCampos(i) = Left(sCampos(i), Len(sCampos(i)) - 2)
Debug.Print sCampos(i)
Else
Debug.Print sCampos(i)
End If
End If
Next
End Sub
</pego>

Espero te sirva como orientación.

Salu2
--
José Mª Fueyo
[MS MVP Access]

jaguga

unread,
Feb 2, 2012, 5:10:31 PM2/2/12
to
Hola Jose Mª; gracias por tu respuesta pero al hacer lo que me dices (creo
que lo estoy haciendo bien), al abrir ese formulario me sale el siguiente
error:
"Hay un uso no válido de un punto, de una expresion ! o de
paréntesis ()" y al depurar el código se queda resaltado en
amarillo la línea
sCampos = Split(Me.txtTexto.Value, "-- ")

Me intentaré explicar mejor sobre lo que pretendo. Para empezar, uso
Access 2007 aunque la base de datos en cuestión está en formato de
2002-2003 (mdb).
Lo que pretendo es crear, a partir de los campos ID (autonumérico y clave
principal) y Domicilios (el campo memo en cuestión) de la tabla actual
una nueva base de datos con esos dos campos pero separando cada línea del
campo memo en tantos campos texto como líneas tenga, es decir, cada
registro de esta nueva base estaría formado por el ID correspondiente y
por un campo texto formado a partir de cada línea del campo memo. De esta
forma podría posteriormente relacionar la tabla principal con esta nueva
tabla a través del campo ID (relación uno a varios).
Un saludo.

José Mª Fueyo

unread,
Feb 3, 2012, 4:50:32 AM2/3/12
to
Hola
El código que te puse servía un poco de ejemplo.
Este código lo he creado en un módulo fuera de un formulario. Uso dos
tablas, la que contiene el campo memo y el ID (tblPRUEBA_MEMO) y la de
destino con un ID autonumérico (ID, clave primaria), un campo entero
largo para guardar el ID de origen (ID_PREV) y el valor del campo memo
que toque (Valor)
Uso como separador en el split, dos "-" y un espacio (tal como copié
de tu ejemplo).

<pego>
Public Sub DividirMemo()
Dim db As DAO.Database, rs As DAO.Recordset
Dim sSQL1 As String, sSQL2 As String
sSQL1 = "INSERT INTO tblMEMO_DISGREGADO(ID_PREV,Valor) VALUES("
Set db = CurrentDb
Set rs = db.OpenRecordset("tblPRUEBA_MEMO", dbOpenForwardOnly)
DoCmd.SetWarnings False
Do Until rs.EOF
Dim sCampos() As String
sCampos = Split(rs.Fields("Texto"), "-- ")
Dim i As Integer
For i = 0 To UBound(sCampos)
If Len(sCampos(i)) > 0 Then
sSQL2 = sSQL1 & CStr(rs.Fields("ID")) & ","
If Right(sCampos(i), 2) = vbCrLf Then
sSQL2 = sSQL2 & "'" & Left(sCampos(i),
Len(sCampos(i)) - 2) & "')"
Else
sSQL2 = sSQL2 & "'" & sCampos(i) & "')"
End If
DoCmd.RunSQL sSQL2
End If

Next

rs.MoveNext
Loop
rs.Close
Set rs = Nothing
db.Close
Set db = Nothing
DoCmd.SetWarnings True
Debug.Print "TERMINADO"
End Sub
</pego>

Adáptalo a tu situación.

Salu2
--
José Mª Fuey
[MS MVP Access]
0 new messages