** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Función para dar de baja registros
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoFunción para dar de baja registros

 Responder Responder
Autor
Mensaje
deprofundis Ver desplegable
Habitual
Habitual
Avatar

Unido: 18/Noviembre/2015
Localización: Madrid
Estado: Sin conexión
Puntos: 62
Enlace directo a este mensaje Tema: Función para dar de baja registros
    Enviado: 18/Enero/2016 a las 17:44
Hola a todos

Querría usar una función para dar de baja registros, sin eliminarlos de la Bd, mediante los valores si/no de un campo de nombre “EXISTEN” en el Formulario "FormLibros".
Si se da de baja (valor "NO" en campo "EXISTEN") el registro, deben aparecer en color rojo, solo los controles cuyo origen es un campo de la tabla, y si está el registro activo (valor "SI" en campo "EXISTEN")se deja en blanco.

Me gustaría hacerlo esto con VBA sin usar el formato condicional y se aplicaría a la vista "Un único formulario", usando una función que llamaría desde un botón.


Había pensado llamar a una función del tipo:
Public Function RegistrosBaja (Frm as form, cancel as integer) as boolean
For each Ctrl in Frm.Controls
if Typeof Ctrl is textbox or Typeof Ctrl is ComboBox then

IF Ctrl.Controlsource = "Select * From Libros Then

Ctrl.BackColor =vbRed

En la claúsula IF... (la que me da problemas)
Me gustaría indicar que no se ponen en rojo todos los controles tipo textbox o combobox sino solo aquellos controles que tengan como origen del control el campo de la tabla.
Ésta sería la clave que solo se coloren en rojo los controles, que sean los campos de la tabla.


Se quiere realizar una acción x en controles de tipo textbox o combobox pero solo en aquéllos que tengan como origen del control el campo de la tabla, origen del formualrio. Claro... Esto pasado a VBA que es lo que no me sale.
Tendría que cambiar la línea del IF para conseguirlo pero no acierto:
IF Ctrl.Controlsource = "Select * From Libros Then

Si alguien pudiera ayudarme, gracias de antemano
deprofundis
Arriba
MexMan70 Ver desplegable
Colaborador
Colaborador


Unido: 17/Julio/2007
Localización: DarkSide
Estado: Sin conexión
Puntos: 9233
Enlace directo a este mensaje Enviado: 18/Enero/2016 a las 22:08
Para empezar, deberías cerrar la comilla que abre: 
   ... = "Select * FROM Libros" Then

Respecto a tu código, prueba asi:


...
For each Ctrl in Frm.Controls
   Select Case Ctrl.ControlType
   Case acTextBox, acComboBox
      If Ctrl.Controlsource = "Select * From Libros" Then
         Ctrl.BackColor = vbRed
      Else
        Ctrl.BackColor = vbWhite
      End If
   End Case
Next
...

OneDrive: http://sdrv.ms/Vk6eJd
Arriba
deprofundis Ver desplegable
Habitual
Habitual
Avatar

Unido: 18/Noviembre/2015
Localización: Madrid
Estado: Sin conexión
Puntos: 62
Enlace directo a este mensaje Enviado: 18/Enero/2016 a las 23:12
Hola MexMan70

Lo de cerrar las comillas lo tenía bien en la Bd, ha sido un error al escribirlo aquí, lo de no cerrarlas.

Lo que me indicas no me funciona,creo que falta el "End Select" en vez de "End Case"... En todo caso aunque se corrigiera eso, no colorea los controles que tienen como origen un campo de la tabla:

   If Ctrl.Controlsource = "Select * From Libros" Then

En esta línea está el principal problema creo. Necesitaría que colorease solo los controles cuyo origen es un campo de la tabla LIBROS. y no todos los controles, textbox, combos que hay en el form y que algunos no tienen como origen esos campos.

Un saludo y gracias por la ayuda
deprofundis
Arriba
MexMan70 Ver desplegable
Colaborador
Colaborador


Unido: 17/Julio/2007
Localización: DarkSide
Estado: Sin conexión
Puntos: 9233
Enlace directo a este mensaje Enviado: 18/Enero/2016 a las 23:43
Efectivamente, es culpa mia por escribir al "vuelo". Corrige lo de End Case por End Select. Tambien corrige lo del ControlSource por RowSource. Wink

Tambien cambiaría un poco mas en la coincidencia así:
   If Ctrl.RowSource Like "*From Libros*" Then


Editado por MexMan70 - 18/Enero/2016 a las 23:43
OneDrive: http://sdrv.ms/Vk6eJd
Arriba
deprofundis Ver desplegable
Habitual
Habitual
Avatar

Unido: 18/Noviembre/2015
Localización: Madrid
Estado: Sin conexión
Puntos: 62
Enlace directo a este mensaje Enviado: 19/Enero/2016 a las 01:48
Hola MexMan70
Gracias por la ayuda

No se trata solo de combos... por eso no vale Rowsource.
Se trata de textbox y combos por eso pongo Ctrl.Controlsource.
De todas formas sigue sin funcionar lo que me propones de:

... Like "* From LIBROS *" Then

Un saludo y ya me cuentas
deprofundis
Arriba
E. Feijoo Ver desplegable
Moderador
Moderador


Unido: 16/Abril/2004
Localización: España
Estado: Sin conexión
Puntos: 19948
Enlace directo a este mensaje Enviado: 19/Enero/2016 a las 09:22
Curioso mensaje, lo anoto como del tipo "yo propongo una 'idea', el resto las soluciones" .....

Lo que se me antoja mas curioso es el planteamiento, hay un campo 'Existen' que parece ser de texto (no booleano como correspondería a una programación ética)y que debería ser el marcador adecuado para indicar si ese 'registro único en pantalla' cumple unas determinadas condiciones ....
Si le añadimos a eso la pretensión de que 'un cuadro de texto' tenga como origen de datos una expresión SQL (Select * From ....) me hace pensar que algo no cumple las reglas de programación eficiente y .....
Arriba
jilo Ver desplegable
Colaborador
Colaborador


Unido: 19/Diciembre/2004
Localización: TAFALLA
Estado: Sin conexión
Puntos: 900
Enlace directo a este mensaje Enviado: 19/Enero/2016 a las 12:12
Hola,
Segun entiendo, lo que quieres es que los controles (todos los textBox y comboBox)de un formulario que no sean independientes, osea que el origen del control dependa de un campo del origen de datos del formulario. Esto quiere decir que cualquier control del formulario que no dependa de un campo del origen de datos del formulario, en su propiedad 'Origen del control' estará vacio. Entonces ....
Esto te deberia funcionar. Ya comentaras.

Sub PonerFondoRojo()

   '109=TextBox '111=ComboBox
   For Each ctl In Me.Controls
      If ctl.ControlType = 109 Or ctl.ControlType = 111 Then
         If Len(ctl.ControlSource) > 0 Then
            ctl.BackColor = vbRed
         End If
      End If
   Next
End sub



Editado por jilo - 19/Enero/2016 a las 12:13
Espero te sirva !!!!!!
Iñaki
Arriba
deprofundis Ver desplegable
Habitual
Habitual
Avatar

Unido: 18/Noviembre/2015
Localización: Madrid
Estado: Sin conexión
Puntos: 62
Enlace directo a este mensaje Enviado: 20/Enero/2016 a las 19:16
Hola
Lo que propongo no es una "idea" sino una duda que comparto con el resto de usuarios para ver si pueden ayudarme a solucionarla.
Evidentemente si tengo una duda que no sé resolver no puedo dar la solución...

Gracias Jilo
Funciona correctamente tu respuesta poniendo "ctrl" para los controles:

Sub PonerFondoRojo()

   '109=TextBox '111=ComboBox
   For Each ctl In Me.Controls
      If ctrl.ControlType = 109 Or ctrl.ControlType = 111 Then
        If Len(ctrl.ControlSource) > 0 Then
            ctrl.BackColor = vbRed
        End If
      End If
   Next
End Sub

Se puede cerrar el hilo
deprofundis
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable