Seguidores

MIS WEBS



sábado, 27 de enero de 2018

VBA ACCESS CASOS PRACTICOS

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

Buscar este blog

Sandisk y Western Digital