RE:SE ME BORRAN LOS DATOS DE LA MATRIZ
Vale, lo pongo todo y así salimos de dudas.
Option Compare Database
Dim CampMatrix(3) As String 'matriz que contendrá los nombres de los campos
Dim CopiaMatrix(3) As Integer 'matriz que contendrá el índice de los campos de texto
Dim TxtMatrix(3) As String 'matriz que almacenará los nombres de los campos de texto
Dim I As Integer
Dim StrSentencia As String 'variable que contendrá la sentencia SQL
Dim DestFinal As Integer 'variable que contendrá al destinatario seleccionado para poder modificar sus datos
Option Explicit
Private Sub Carga_Matriz()
'rellenamos los valores de las matrices
CampMatrix(0) = "[CP]"
CampMatrix(1) = "[POBLACION]"
CampMatrix(2) = "[TIPO_PERFIL]"
CampMatrix(3) = "[PUESTO" 'A este elemento de búsqueda habrá que añadirle el numero de puesto y el fin de corchete
CopiaMatrix(0) = "0"
CopiaMatrix(1) = "0"
CopiaMatrix(2) = "0"
CopiaMatrix(3) = "0"
TxtMatrix(0) = "CP"
TxtMatrix(0) = "POBLACION"
TxtMatrix(0) = "TIPO_PERFIL"
TxtMatrix(0) = "PUESTO"
End Sub
Private Sub BUSCAR_Click()
Dim Z As Integer
Dim COnt As Integer
Dim ValorCampo As String
ValorCampo = ""
StrSentencia = "SELECT [PERFILES DE CADA DESTINATARIO].[Tratamiento], [PERFILES DE CADA DESTINATARIO].[Nombre], [PERFILES DE CADA DESTINATARIO].[Apellido_1], [PERFILES DE CADA DESTINATARIO].[Apellido_2], [PERFILES DE CADA DESTINATARIO].[Dirección], [PERFILES DE CADA DESTINATARIO].[CP], [PERFILES DE CADA DESTINATARIO].[Poblacion], [PERFILES DE CADA DESTINATARIO].[Isla], [PERFILES DE CADA DESTINATARIO].[puesto_1], [PERFILES DE CADA DESTINATARIO].[puesto_2], [PERFILES DE CADA DESTINATARIO].[puesto_3], [PERFILES DE CADA DESTINATARIO].[TIPO_PERFIL] FROM [PERFILES DE CADA DESTINATARIO]"
COnt = 0
'Call Carga_Matriz
Me.CP.SetFocus
If Me.CP.Text <> "" Then 'si el primero no está vacío
CopiaMatrix(0) = 1
COnt = 1 'significa que hay un dato que buscar
Me.POBLACION.SetFocus
If Me.POBLACION.Text <> "" Then
CopiaMatrix(1) = 1
Me.TIPO_PERFIL.SetFocus
If Me.TIPO_PERFIL.Text <> "" Then
CopiaMatrix(2) = 1
Me.PUESTO.SetFocus
If Me.PUESTO.Text <> "" Then
CopiaMatrix(3) = 1
Else
CopiaMatrix(3) = 0
End If
Else
CopiaMatrix(2) = 0
End If
Else
CopiaMatrix(1) = 0
Me.TIPO_PERFIL.SetFocus
If Me.TIPO_PERFIL.Text <> "" Then
CopiaMatrix(2) = 1
Me.PUESTO.SetFocus
If Me.PUESTO.Text <> "" Then
CopiaMatrix(3) = 1
Else
CopiaMatrix(3) = 0
End If
Else
CopiaMatrix(2) = 0
Me.PUESTO.SetFocus
If Me.PUESTO.Text <> "" Then
CopiaMatrix(3) = 1
Else
CopiaMatrix(3) = 0
End If
End If
End If
Else
CopiaMatrix(0) = 0
COnt = 0
Me.POBLACION.SetFocus
If Me.POBLACION.Text <> "" Then
CopiaMatrix(1) = 1
COnt = 1
Me.TIPO_PERFIL.SetFocus
If Me.TIPO_PERFIL.Text <> "" Then
CopiaMatrix(2) = 1
Me.PUESTO.SetFocus
If Me.PUESTO.Text <> "" Then
CopiaMatrix(3) = 1
Else
CopiaMatrix(3) = 0
End If
Else
CopiaMatrix(2) = 0
End If
Else
CopiaMatrix(1) = 0
COnt = 0
Me.TIPO_PERFIL.SetFocus
If Me.TIPO_PERFIL.Text <> "" Then
CopiaMatrix(2) = 1
COnt = 1
Me.PUESTO.SetFocus
If Me.PUESTO.Text <> "" Then
CopiaMatrix(3) = 1
Else
CopiaMatrix(3) = 0
End If
Else
CopiaMatrix(2) = 0
COnt = 0
Me.PUESTO.SetFocus
If Me.PUESTO.Text <> "" Then
CopiaMatrix(3) = 1
COnt = 1
Else
CopiaMatrix(3) = 0
End If
End If
End If
End If
'recorremos el array y en función del índice que nos encontremos, añadiremos criterios a la cadena de búsqueda
If COnt = 1 Then 'si hay algún dato en algún campo de texto
For Z = 0 To 3
If Z = 0 Then 'si es el primer registro tendrá que asignarle la cláusula WHERE
If CopiaMatrix(Z) = 1 Then
Me.CP.SetFocus
ValorCampo = Me.CP.Text
StrSentencia = StrSentencia & " WHERE " & "[PERFILES DE CADA DESTINATARIO]." & CampMatrix(Z) & "=" & ValorCampo
If CopiaMatrix(Z + 1) = 1 Then
StrSentencia = StrSentencia & " AND "
End If
Else
StrSentencia = StrSentencia & " WHERE "
End If
Else 'No es el primer registro
If CopiaMatrix(Z) = 1 Then
If TxtMatrix(Z) = "POBLACION" Then
Me.POBLACION.SetFocus
ValorCampo = Me.POBLACION.Text
End If
If TxtMatrix(Z) = "TIPO_PERFIL" Then
Me.TIPO_PERFIL.SetFocus
ValorCampo = Me.TIPO_PERFIL.Text
End If
If TxtMatrix(Z) = "PUESTO" Then
Me.PUESTO.SetFocus
ValorCampo = Me.PUESTO.Text
'aki hacer una funcion para añadirle los tres campos de puestos
Call Carga_Puestos(ValorCampo)
End If
If TxtMatrix(Z) <> "PUESTO" Then 'porque ya hemos cargado los puestos previamente
StrSentencia = StrSentencia & "[PERFILES DE CADA DESTINATARIO]." & CampMatrix(Z) & "='" & ValorCampo & "'"
End If
End If
If Z < 3 Then 'solo entrará mientras no sea el último registro
If CopiaMatrix(Z + 1) = 1 Then
StrSentencia = StrSentencia & " AND "
End If
End If
End If
Next Z
Else
Call TODOS_Click 'que los muestre todos de nuevo
Exit Sub
End If
StrSentencia = StrSentencia & ";"
MsgBox StrSentencia
Me.DATOSDESTINATARIOS.SetFocus
Me.DATOSDESTINATARIOS.RowSource = StrSentencia
Me.DATOSDESTINATARIOS.Requery
End Sub
Private Sub Form_Load()
'inicializamos la matriz y mostramos todos los datos
Call Carga_Matriz
Call TODOS_Click
DestFinal = 0
End Sub
Private Sub salir_Click() 'boton para salir del formulario
On Error GoTo Err_salir_Click
DoCmd.Close
Exit_salir_Click:
Exit Sub
Err_salir_Click:
MsgBox Err.Description
Resume Exit_salir_Click
End Sub
Private Function Carga_Puestos(StrPuesto As String)
'como hay tres campos en la tabla que son puestos desempeñados por la persona, debemos buscar en los 3.
StrSentencia = StrSentencia & "[PERFILES DE CADA DESTINATARIO].[Puesto_1]= '" & StrPuesto & "' OR [PERFILES DE CADA DESTINATARIO].[Puesto_2]='" & StrPuesto & "' OR [PERFILES DE CADA DESTINATARIO].[Puesto_3]='" & StrPuesto & "'"
End Function
Private Sub TODOS_Click()
StrSentencia = "SELECT [PERFILES DE CADA DESTINATARIO].[Tratamiento], [PERFILES DE CADA DESTINATARIO].[Nombre], [PERFILES DE CADA DESTINATARIO].[Apellido_1], [PERFILES DE CADA DESTINATARIO].[Apellido_2], [PERFILES DE CADA DESTINATARIO].[Dirección], [PERFILES DE CADA DESTINATARIO].[CP], [PERFILES DE CADA DESTINATARIO].[Poblacion], [PERFILES DE CADA DESTINATARIO].[Isla], [PERFILES DE CADA DESTINATARIO].[puesto_1], [PERFILES DE CADA DESTINATARIO].[puesto_2], [PERFILES DE CADA DESTINATARIO].[puesto_3], [PERFILES DE CADA DESTINATARIO].[TIPO_PERFIL] FROM [PERFILES DE CADA DESTINATARIO];"
'StrSentencia = "SELECT [PERFILES DE CADA DESTINATARIO].[Tratamiento], [PERFILES DE CADA DESTINATARIO].[Nombre], [PERFILES DE CADA DESTINATARIO].[Apellido_1], [PERFILES DE CADA DESTINATARIO].[Apellido_2], [PERFILES DE CADA DESTINATARIO].[Dirección], [PERFILES DE CADA DESTINATARIO].[CP], [PERFILES DE CADA DESTINATARIO].[Poblacion], [PERFILES DE CADA DESTINATARIO].[Isla], [PERFILES DE CADA DESTINATARIO].[puesto_1], [PERFILES DE CADA DESTINATARIO].[puesto_2], [PERFILES DE CADA DESTINATARIO].[puesto_3], [PERFILES DE CADA DESTINATARIO].[TIPO_PERFIL] FROM [PERFILES DE CADA DESTINATARIO] WHERE [PERFILES DE CADA DESTINATARIO].[CP]=38003 AND [PERFILES DE CADA DESTINATARIO].[TIPO_PERFIL] = 'FILMOTECA';"
Me.DATOSDESTINATARIOS.SetFocus
Me.DATOSDESTINATARIOS.RowSource = StrSentencia
Me.DATOSDESTINATARIOS.Requery
End Sub
la movida es que al entrar en el bucle FOR, todos los datos de las matrices declaradas arriba se borran, o vamos como si no las hubiese inicializado. Seguro que es una chorrada pero no consigo verlo.