** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Combinacion de colores (RGB)
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoCombinacion de colores (RGB)

 Responder Responder
Autor
Mensaje
Erick Gamer Ver desplegable
Habitual
Habitual
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 170
Enlace directo a este mensaje Tema: Combinacion de colores (RGB)
    Enviado: 08/Junio/2017 a las 16:12
Buenos días / tardes compañeros del foro.

Expongo el problema esperando puedan ayudarme a encontrar otras alternativas o una solucion mas corta a lo que estoy haciendo.

Tengo una tabla con 294 diferentes tipos de colores 
Colores Solidos: (Blanco, Negro, Amarillo, Rojo, Azul, Cafe etc etc)
Tonos de Colores: (Azul Claro, Azul Obscuro, Cafe Claro, Cafe Obscuro etc etc)
Colores Combinados: (Blanco/Negro, Blanco/Amarillo, Blanco/Rojo, Azul/Blanco, Azul/Amarillo, Azul Claro/Amarillo, Azul Obscuro/Amarillo etc etc) La "/" quiere decir que son dos colores Ejemplo: "Blanco con una Franja Negra"

Estos colores se asignan a un producto "X" un producto puede llevar 
 2 colores Solidos o 1 Color Solido + 1 Color Combinado o 1 Tono de Color + 1 Color Combinado etc.

Actualmente asigno los colores a el reporte mediante una tabla en la que tengo incrustada una imagen Bitmap con el o los colores y asi relaciono el color y segun el color "Texto" se muestra el Bitmap asignado:
Es decir:
Color ColorBMP
Blanco/Rojo       "BitmapImage"
Rojo                  "BitmapImage"

Como podran imaginar la base de datos esta muy pesada por los Bitmap que tiene incrustados, (Sin tomar en cuenta otros Objetos que tiene incrsutados [esto es otro tema]) ahora me solicitaron realizar varios mejoramientos a esta base de datos y pense en quitar los Bitmap y usar los codigos de colores (RGB) para asignar el color a cada producto. Lo estoy haciendo de esta forma.

En la tabla "X" ya viene que colores deben de asignarse al producto solo falta mostrar el color en el reporte, agregue al reporte 4 cajas de Texto TxtC1 y TxtC2 para mostrar los colores Solidos o Tonos de COlores y TxtLine1 y TxtLine2 para si el producto tiene un color Combinado mostrar el color (franja) en esa caja de Texto.

En el evento al dar formato estoy agregando un Sinnumero de If para lograr el objetivo pero ya me estoy arrepintiendo ya que apenas llevo 4 variantes de colores y ya llevo escritas mas de 900 lineas de codigo y me faltan por agregar otras 19 variantes de colores o sea que terminare arriba de las 1000 lineas de codigo. 

Las preguntas serian: 

Alguna otra forma de hacer esto mas simplificado, ya que a mi ver tome el camino mas largo no es asi?

Seria bueno dejar las Bitmap incrustadas en la tabla y seguir trabajando asi? (Al compactar la base de datos o al cerrarla demora una eternidad)

Cuantos IF puedo agregar en el evento al Dar Formato, porque ya me esta enviando un error en que tengo un Bloque sin IF y ya lo revise varias veces y estoy completo con Los IF y End IF.

Les comparto parte del codigo para que quede un poco mas claro el asunto, ya que con tanto royo (letra) creo los maree y no me explique correctamente.

Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)

'****************************************************************************************************
'Colores Solidos
'****************************************************************************************************

If Me.TxtC1 = "Azul" Then
Me.TxtC1.BackColor = RGB(0, 0, 255)
Me.TxtLine1.Visible = False
Else

If Me.TxtC1 = "Azul Claro" Then
Me.TxtC1.BackColor = RGB(135, 206, 250)
Me.TxtLine1.Visible = False
Else

If Me.TxtC1 = "Azul Obsc." Then
Me.TxtC1.BackColor = RGB(0, 0, 139)
Me.TxtLine1.Visible = False
Else

If Me.TxtC1 = "Beige" Then
Me.TxtC1.BackColor = RGB(245, 245, 220)
Me.TxtLine1.Visible = False
Else

If Me.TxtC1 = "Blanco" Then
Me.TxtC1.BackColor = RGB(255, 255, 255)
Me.TxtLine1.Visible = False
Else

If Me.TxtC1 = "Café" Then
Me.TxtC1.BackColor = RGB(165, 42, 42)
Me.TxtLine1.Visible = False
Else

If Me.TxtC1 = "Canela" Then
Me.TxtC1.BackColor = RGB(237, 145, 33)
Me.TxtLine1.Visible = False
Else

If Me.TxtC1 = "Crema" Then
Me.TxtC1.BackColor = RGB(255, 248, 220)
Me.TxtLine1.Visible = False
Else

If Me.TxtC1 = "Gris" Then
Me.TxtC1.BackColor = RGB(190, 190, 190)
Me.TxtLine1.Visible = False
Else

If Me.TxtC1 = "Morado" Then
Me.TxtC1.BackColor = RGB(238, 130, 238)
Me.TxtLine1.Visible = False
Else

If Me.TxtC1 = "Naranja" Then
Me.TxtC1.BackColor = RGB(255, 128, 0)
Me.TxtLine1.Visible = False
Else

If Me.TxtC1 = "Negro" Then
Me.TxtC1.BackColor = RGB(0, 0, 0)
Me.TxtLine1.Visible = False
Else

If Me.TxtC1 = "Rojo" Then
Me.TxtC1.BackColor = RGB(255, 0, 0)
Me.TxtLine1.Visible = False
Else

If Me.TxtC1 = "Rosa" Then
Me.TxtC1.BackColor = RGB(255, 192, 203)
Me.TxtLine1.Visible = False
Else

If Me.TxtC1 = "Salmon" Then
Me.TxtC1.BackColor = RGB(250, 128, 114)
Me.TxtLine1.Visible = False
Else

If Me.TxtC1 = "Verde" Then
Me.TxtC1.BackColor = RGB(0, 128, 0)
Me.TxtLine1.Visible = False
Else

If Me.TxtC1 = "Verde Claro" Then
Me.TxtC1.BackColor = RGB(0, 255, 0)
Me.TxtLine1.Visible = False
Else

If Me.TxtC1 = "Verde Obsc." Then
Me.TxtC1.BackColor = RGB(0, 139, 0)
Me.TxtLine1.Visible = False

If Me.TxtC1 = "Violeta" Then
Me.TxtC1.BackColor = RGB(238, 130, 238)
Me.TxtLine1.Visible = False

'****************************************************************************************************
'Colores Solidos Combinados
'****************************************************************************************************

If Me.TxtC1 = "Amarillo/Azul" Then
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(0, 0, 255)
Else

If Me.TxtC1 = "Amarillo/Azul Claro" Then
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(135, 206, 250)
Else

If Me.TxtC1 = "Amarillo/Azul Obsc." Then
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(0, 0, 139)
Else

If Me.TxtC1 = "Amarillo/Beige" Then
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(245, 245, 220)
Else

If Me.TxtC1 = "Amarillo/Blanco" Then
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(255, 255, 255)
Else

If Me.TxtC1 = "Amarillo/Café" Then
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(165, 42, 42)
Else

If Me.TxtC1 = "Amarillo/Canela" Then
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(237, 145, 33)
Else

If Me.TxtC1 = "Amarillo/Gris" Then
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(190, 190, 190)
Else

If Me.TxtC1 = "Amarillo/Morado" Then
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(238, 130, 238)
Else

If Me.TxtC1 = "Amarillo/Naranja" Then
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(255, 128, 0)
Else

If Me.TxtC1 = "Amarillo/Negro" Then
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(0, 0, 0)
Else

If Me.TxtC1 = "Amarillo/Rojo" Then
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(255, 0, 0)
Else

If Me.TxtC1 = "Amarillo/Rosa" Then
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(255, 192, 203)
Else

If Me.TxtC1 = "Amarillo/Verde" Then
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(0, 128, 0)
Else

If Me.TxtC1 = "Amarillo/Verde Claro" Then
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(0, 255, 0)
Else

If Me.TxtC1 = "Amarillo/Verde Obsc." Then
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(0, 139, 0)
Else

If Me.TxtC1 = "Amarillo/Violeta" Then
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(238, 130, 238)
Else

'*
If Me.TxtC1 = "Azul/Amarillo" Then
Me.TxtC1.BackColor = RGB(0, 0, 255)
Me.TxtLine1.BackColor = RGB(255, 255, 0)
Else

Codigo completo aqui:
https://onedrive.live.com/?id=C54F338ADA6102E7%21795&cid=C54F338ADA6102E7
Saludos

Erick Gamer
Aprendiz de todos, maestro de nadie.
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11055
Enlace directo a este mensaje Enviado: 08/Junio/2017 a las 16:40
Lo suyo sería que en esa tabla dónde guardas el nombre del color, también guardaras los atributos de "rojo,verde,azul" que vas a necesitar para la función RGB.
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
Erick Gamer Ver desplegable
Habitual
Habitual
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 170
Enlace directo a este mensaje Enviado: 08/Junio/2017 a las 23:18
Gracias Profe Mihura.

Si pense en grabar los atributos en la tabla, pero me detuve porque no supe y aun no se como invocar los colores en el reporte para que se visualice en el mismo.

Seria algo asi en la tabla:

Color  ColorRGB
Negro 0, 0, 0

(Profe, porque he aprendido de usted en mis preguntas que realizo)

Saludos

Erick Gamer
Aprendiz de todos, maestro de nadie.
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11055
Enlace directo a este mensaje Enviado: 08/Junio/2017 a las 23:42
Puedes guardar directamente el color, también puedes guardar el desglose de los tres colores, o incluso puedes guardarlo todo


Id Nombre Color Rojo Verde Azul
2 Rojo 255 255 0 0
3 Amarillo 65535 255 255 0
4 Gris 12500670 190 190 190


La manera de crear el color ya la has puesto tú:

Me.TxtC1.BackColor = RGB(255, 255, 0)

sería:

Me.TxtC1.BackColor = RGB(Rs!Rojo, Rs!Verde, Rs!Azul)

o:

Me.TxtC1.BackColor = Rs!Color



Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
raipon Ver desplegable
Moderador
Moderador


Unido: 10/Diciembre/2004
Localización: Desconocida
Estado: Sin conexión
Puntos: 4005
Enlace directo a este mensaje Enviado: 09/Junio/2017 a las 07:09
Hola, la mejor optimización del diseño es la que te propone Mihura. Adicionalmente y para que lo tengas presente en un futuro:

En vez de anidar If dentro de Else, utiliza ElseIf

If condición1 then
... acción1
ElseIf condición2 then
... acción2
ElseIf condición3 then
... acción3
Else
... acción 'Else'
End If

No estoy seguro de si permite mas o menos condiciones, pero indudablemente es mas facil de leer.

Otra alternativa mas eficiente es una estructura Select Case.

Saludos.
Ramon desde Terrassa.

Mi blog
Arriba
Erick Gamer Ver desplegable
Habitual
Habitual
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 170
Enlace directo a este mensaje Enviado: 10/Junio/2017 a las 02:36
Gracias por su colaboración, lo que comenta el maestro Raipon Select Case, seria algo como esto si no me equivoco?

Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)

Select Case Me.TxtC1
'Color Amarillo

Case "Amarillo"
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.Visible = False

Case "Amarillo/Azul"
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(0, 0, 255)

Case "Amarillo/Azul Claro"
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(135, 206, 250)

Case "Amarillo/Azul Obsc."
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(0, 0, 139)

Case "Amarillo/Beige"
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(245, 245, 220)

Case "Amarillo/Blanco"
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(255, 255, 255)

Case "Amarillo/Café"
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(165, 42, 42)

Case "Amarillo/Canela"
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(138, 54, 15)

Case "Amarillo/Gris"
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(190, 190, 190)

Case "Amarillo/Morado"
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(238, 130, 238)

Case "Amarillo/Naranja"
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(255, 128, 238)

Case "Amarillo/Negro"
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(0, 0, 0)

Case "Amarillo/Rojo"
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(255, 0, 0)

Case "Amarillo/Rosa"
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(255, 192, 203)

Case "Amarillo/Verde"
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(0, 128, 0)

Case "Amarillo/Verde Claro"
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(0, 255, 0)

Case "Amarillo/Verde Obsc."
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(85, 107, 47)

Case "Amarillo /Violeta"
Me.TxtC1.BackColor = RGB(255, 255, 0)
Me.TxtLine1.BackColor = RGB(238, 130, 238)

Profe, Mihura su propuesta aun no la aterrizo del todo, seria con un RecordSet correcto, asi tomaria el el control TxtC1 el valor de la tabla colores, es correcto?

Saludos Erick Gamer


Aprendiz de todos, maestro de nadie.
Arriba
jilo Ver desplegable
Colaborador
Colaborador


Unido: 19/Diciembre/2004
Localización: TAFALLA
Estado: Sin conexión
Puntos: 876
Enlace directo a este mensaje Enviado: 10/Junio/2017 a las 09:00
Hola a Todos,

Siguiendo la linea de Mhiura. Teniendo una tabla con los datos numéricos de los colores que necesitas, esto creo que funcionará. Y te ahorras un monton de lineasWink
Espero te valga

Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)

Me("TxtC1").BackColor=Buscacolor(Me("TxtC1")) 

end Sub

--------

Function BuscaColor as (Nombre as string) as long
Dim ctl As control, Rec As DAO.Recordset, Sql As String
Sql = "Select id, Nombre,Color From Colores;"
Set Rec = CurrentDb.OpenRecordset(Sql)
         Do While Not Rec.EOF
            If .Caption = Rec!Nombre Then
               BuscaColor  = Rec!Color
               Exit Do
            End If
            Rec.MoveNext
         Loop
end function

Espero te sirva !!!!!!
Iñaki
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11055
Enlace directo a este mensaje Enviado: 10/Junio/2017 a las 11:07
Jilo,

Ese es el camino, .... pero, ¿porque hacer un bucle buscando un color cuando puedes hacerlo con una sola lectura?.

Si es con un recordset, la select seria la que tú has puesto más la WHERE:

Sql = "Select id, Color FROM Colores WHERE Nombre = '" & me.TxtC1 & "'"

Aunque para un solo campo también podrías usar un DLookup.
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
jilo Ver desplegable
Colaborador
Colaborador


Unido: 19/Diciembre/2004
Localización: TAFALLA
Estado: Sin conexión
Puntos: 876
Enlace directo a este mensaje Enviado: 10/Junio/2017 a las 11:14
Mihura,

Está claro, clarito....Embarrassed
Espero te sirva !!!!!!
Iñaki
Arriba
Erick Gamer Ver desplegable
Habitual
Habitual
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 170
Enlace directo a este mensaje Enviado: 13/Junio/2017 a las 05:19
Gracias Mihura, Raipon, Jilo.

Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)

Dim rst As Recordset
Set rst = CurrentDb.OpenRecordset("SELECT * FROM [Color Cables] WHERE SPANISH='" & Me.TxtC1 & "'")
Me.TxtC1.BackColor = RGB(rst!R, rst!G, rst!B)
rst.Close
Set rst = Nothing


End Sub

Listo codigo aunque para un solo control me faltan los demás controles pero pienso seria los mismo, una pregunta mas con el Dlookup el código quedaría aun mas reducido no es así?

Erick Gamer
Aprendiz de todos, maestro de nadie.
Arriba
Erick Gamer Ver desplegable
Habitual
Habitual
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 170
Enlace directo a este mensaje Enviado: 13/Junio/2017 a las 16:08
Hola buenos dias.

Tambien quiero intentar realizarlo con Dlookup pero no me queda me echan una mano por favor:

Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)

Dim Colorin As String

Colorin = "Café" 'En esta linea que deberia de ir un Select?

V = DLookup("[Color]", "[Color Cables]", "SPANISH='" & Colorin & "'")
Me.TxtColor.BackColor = V


End Sub

Erick Gamer
Aprendiz de todos, maestro de nadie.
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11055
Enlace directo a este mensaje Enviado: 13/Junio/2017 a las 17:57
En la línea de detalle de ese informe tendrás un campo que contendrá el color a representar, ese es el campo que debes usar:

Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)

V = DLookup("[Color]", "[Color Cables]", "SPANISH='" & Me.ColorQueQuieroVer & "'")
Me.TxtColor.BackColor = V

End Sub
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
VIMIPAS Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 06/Enero/2006
Localización: ESPAÑA
Estado: Sin conexión
Puntos: 5226
Enlace directo a este mensaje Enviado: 13/Junio/2017 a las 22:06
Hola a todos.

Primeramente muchísimas gracias por la lección.

Por último y tras todas las exposiciones echas.... podría esta última resumirse en:

Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)

Me.TxtColor.BackColor = DLookup("[Color]", "[Color Cables]", "SPANISH='" & Me.ColorQueQuieroVer & "'")

End Sub

No me he parado a hacerla yo porque veo a Eric tan dispuesto a aprender que me gustaría que él mismo nos resolviera el enigma que propongo. Tan poco sé si es necesaria una variable V (del tipo variant).

Pero desde luego, muchas gracias a todos.

Saludos.

Gracias
Arriba
Erick Gamer Ver desplegable
Habitual
Habitual
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 170
Enlace directo a este mensaje Enviado: 14/Junio/2017 a las 06:28
Simplemente Fenomenal lo aprendido.

VIMIPAS, aqui el codigo y enigma descubierto no es necesario o al menos no requerí una variable de tipo Variant me funciona tal cual el codigo expuesto:

Me.TxtColor.BackColor = DLookup("[Color]", "[Color Cables]", "SPANISH='" & Me.TxtColor & "'")

Tengo tres alternativas distintas de una que buscaba y ademas reducida en lineas de código en un 100%

Alguna otra mas?

Saludos

Erick Gamer
Aprendiz de todos, maestro de nadie.
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable