Buenos días a todos/as,
Normalmente al relacionar tablas
son cómodas las consultas de relación que podemos diseño en vista diseño de
Access pero es posible que en ocasiones lo que vale para todos tenas un caso
específico en el que no te sirva o no desees estar buscando una solución, para
eso se inventó el código VBA, en ocasiones es más fácil hacerlo tú que buscarlo
hecho.
En mi caso yo tenía un problema
para resolver en el trabajo. Tenía la tabla 1 y la tabla 2. Y necesitaba ver si
los registros de la tabla 1 se repetían en la tabla 2. Fácil no. Tan sencillo
como hacer una relación entre campos.
Lineas_DD_DP TABLA1
|
||||
IdSilvend
|
DIRECCION_ENTREGA
|
OBSERVACIONES
|
DNI
|
TELEFONO
|
S1515
|
C/ MOSTOLES ENTRADA 1, 40001 MADRID,
MADRID
|
11111111A
|
6666666661
|
|
S2525
|
AVENIDA VALENCIA PSISO 1 ESCALERA 2
40008 VALENCIA VALENCIA
|
22222222B
|
6666666662
|
|
S4569
|
CALLE EL ALFAJOR SEVILLA SEVILLA
|
35789654F
|
6666666663
|
|
S5858
|
POLIGONO LA LUNA NEGRA ENTRADA 1 SALIDA
2 3000 BARCELONA BARCELONA
|
44444444D
|
6666666664
|
|
S8787
|
ESTA ES MI CALLE 2 2 1 77788 CADIZ CADIZ
|
55555555G
|
6666666665
|
|
S8963
|
AVENIDA FELIPE EL HERMOSO 5 5 HUESCA
HUESCA
|
66666666W
|
6666666666
|
AuditoriaPedidos
TABLA2
|
||||
IdSilvend
|
Direccion_entrega
|
observaciones
|
DNI
|
TELEFONO
|
S1234
|
CALLE DE MOSTOLES 1, 40001 MADRID,
MADRID
|
A99999999V
|
7777777771
|
|
S2345
|
UNO DOS TRES 01 20 40008 VALENCIA
VALENCIA
|
W88888888W
|
7777777772
|
|
S34567
|
LUNA NEGRA ENTRADA 1 SALIDA 2 3000
BARCELONA BARCELONA
|
D777777777V
|
7777777773
|
|
S45678
|
GGGGGGGGGGG 2 8 60000 TARRAGONA
TARRAGONA
|
F666666666F
|
77777ç7774
|
|
S56789
|
DDDDDDDDD 88 99 50007 Las nulas Zaragoza
|
G555555555G
|
7777777775
|
|
S67891
|
wwwwwwwww 88 999 65555 castellon de la
plana Castellon
|
H444444444H
|
7777777776
|
|
S789123
|
eeeeee 8 1 Caceres Badajoz
|
J3333333333J
|
7777777777
|
|
Pero en este caso no era tan
sencillo como eso. Tal y como podéis ver
el registro
·
S1515 en la
tabla 1 es para la
o C/ MOSTOLES
ENTRADA 1, 40001 MADRID, MADRID
·
S1234 de la
tabla 2 es para
o CALLE DE MOSTOLES 1, 40001 MADRID, MADRID
Es una
pequeña diferencia que no nos dejaría que aparecieran los registros que
deseamos. Sé que podríamos utilizar los caracteres comodín(*,?) para evitar
esto.
Pues tenemos
otro registro en
·
tabla1
o POLIGONO LA LUNA NEGRA ENTRADA 1 SALIDA 2 3000
BARCELONA BARCELONA
·
tabla2
o
LUNA NEGRA
ENTRADA 1 SALIDA 2 3000 BARCELONA BARCELONA
Y esto en pocos registros
imaginemos en tablas que tienen 50 000 registros, Tendríamos que barajar si la
coma está pegada o no, si tiene especio o no….. Imposible de hacer sin código.
Por lo que decidí buscar la
solución por mi cuenta y hacerme el código.
1)
Para ello necesité utilizar la función Split que nos permite romper un String en
palabras e introducirlo en un array. En caso de que no le indiquemos lo
contrario, utilizara como separador de las palabras los espacios en blanco,
pero si lo deseamos puede separar por : ; , / // o
incluso por una letra, lo que nos haga falta.
String = “C/ MOSTOLES
ENTRADA 1, 40001 MADRID, MADRID”
Split(String)
Palablar(0) = “C/”
Palablar(1) = “Mostoles”
Palabra(2)= “Entrada”
Palabra(3)=”1”
Palablar(4) =”,”
Palablar(5) =”40001”
Palablar(6) =”Madrid”
Palablar(7) = “,”
Palablar(8) = “Madrid”
2)
Los datos de la tabla uno los
comparamos con la tabla dos utilizando un Like.
testCheck = AUDIR_STR_DireccionEntrega Like Direcion(N)
If testCheck = True Then
COMPARADOR =
COMPARADOR + 1
End If
3) Por otra
parte me hizo falta introducir la tabla 1 y dos en un recordset. Para
posteriormente recorrerlos.
Dim REC_Lineas_dd_DP
As Recordset
Dim REC_Auditoria
As Recordset
Set REC_Auditoria
= CurrentDb.OpenRecordset("AuditoriaPedidos",
dbOpenTable)
Set REC_Lineas_dd_DP
= CurrentDb.OpenRecordset("Lineas_DD_DP",
dbOpenTable)
4) Para
utilizar nuestro código tendremos que generar 3 bucles anidados.
a) Entraremos
en la tabla 1 uno hasta EOF (recorremos hasta el final)
b) Entraremos
en la tabla 2 hasta EOF.
c) Una vez
dentro de la tabla 2 Entraremos en el Split.
Aquí os dejo el resultado de
código:
Private Function Listado_DD_DT()
Dim REC_Lineas_dd_DP As Recordset
Dim REC_Auditoria As Recordset
Dim COMPARADOR, N, tabla1, tabla2
As Integer
Dim testCheck As Boolean
Dim Direccion() As String
Dim STR_IdSilven,
STR_DireccionEntrega, AUDIT_STR_IdSilvend, AUDIR_STR_DireccionEntrega,
AUDIT_STR_OBservaciones As Variant
'consideramos que
tabla1 es REC_Lineas_dd_DP y tabla2 es REC_Auditoria
'CONECTAMOS EL
RECORDSET
Set REC_Lineas_dd_DP =
CurrentDb.OpenRecordset("Lineas_DD_DP", dbOpenTable)
Set REC_Auditoria =
CurrentDb.OpenRecordset("AuditoriaPedidos", dbOpenTable)
'TABLA1 VA AL FINAL
DEL RECORDSET Y REGRESA AL PRINCIPIO
REC_Lineas_dd_DP.MoveLast
REC_Lineas_dd_DP.MoveFirst
'TABLA2 VA AL FINAL
DEL RECORDSET Y REGRESA AL PRINCIPIO
REC_Auditoria.MoveLast
REC_Auditoria.MoveFirst
Do While Not REC_Lineas_dd_DP.EOF 'Mientras no llegues a final de tabla 1
tabla1 = tabla1 + 1 'Lo hice para
confirmar que el bucle giraba correctamente cargando el array con los datos del
String
‘Utilizando Split y al
no indicarle ningún parámetro utilizará los espacios en blanco de delimitador
Do While Not REC_Auditoria.EOF 'Mientras no llegues al final de tabla 2
N = 0
COMPARADOR = 0
'tabla1
STR_IdSilven =
REC_Lineas_dd_DP("IdSilvend")
STR_DireccionEntrega = REC_Lineas_dd_DP("DIRECCION_ENTREGA")
'tabla2
AUDIT_STR_IdSilvend =
REC_Auditoria("IdSilvend")
AUDIR_STR_DireccionEntrega =
REC_Auditoria("Direccion_entrega")
Direccion() =
Split(STR_DireccionEntrega)
For Each STR_DireccionEntrega
In Direccion() 'Mientras tengan
registros el array haz....
Direccion(N) =
"*" & Direccion(N) & "*"
AUDIT_STR_IdSilvend =
REC_Auditoria("IdSilvend")
AUDIR_STR_DireccionEntrega
= REC_Auditoria("Direccion_entrega")
'Comparamos el registro del array en la
posición actual(N) con el de la tabla 2 en esta vuelta de bucle
testCheck =
AUDIR_STR_DireccionEntrega Like Direccion(N)
'no deseamos que valore
espacios en blanco ni comas
If testCheck = True And
Not Direccion(N) = "," And Not Direccion(N) = "**" Then
COMPARADOR =
COMPARADOR + 1
End If
N = N + 1
Next
‘En caso de existir más de 4 coincidencias carga en la casilla
observaciones de la tabla un aviso para que lo tengamos en cuenta
If COMPARADOR > 4 Then
Debug.Print STR_DireccionEntrega
& Adit_str_direcionEntraga; AUDIR_STR_DireccionEntrega
REC_Auditoria.Edit
REC_Auditoria("observaciones").Value = "EXISTE lINEAS EN
DD o DT"
REC_Auditoria.Update
End If
REC_Auditoria.MoveNext 'tabla2
Loop 'salimos de tabla2
REC_Auditoria.MoveFirst 'tabla2 pasa al
principio
REC_Lineas_dd_DP.MoveNext ' tabla1 pasa
al siguiente registro
Loop
End Function
No hay comentarios:
Publicar un comentario