Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Comparacion de Columnas

Estas en el tema de Comparacion de Columnas en el foro de Visual Basic clásico en Foros del Web. Hola gente soy yo de vuelta :D. ahora se me presento la siguiente duda: Resulta que yo tengo una tabla con productos Sillas Mesas Puertas ...
  #1 (permalink)  
Antiguo 11/03/2009, 22:21
 
Fecha de Ingreso: marzo-2009
Mensajes: 23
Antigüedad: 15 años, 1 mes
Puntos: 0
Comparacion de Columnas

Hola gente soy yo de vuelta :D. ahora se me presento la siguiente duda:

Resulta que yo tengo una tabla con productos

Sillas
Mesas
Puertas
Etc...

y para cada producto tengo los precios q me ofrecen diferentes distribuidoras:

Código:
Producto     Distribuidor1     Distribuidor2     Distribuidor3     Distribuidor4

Sillas           $5.967             $6.235               $6.2305            $6.2331
y quisiera saber que consulta puedo hacer para q me devuelva en un msgbox o algo cual de todos los distribuidores es el mas barato y que precio tiene.

supongo que debe ser algo sencillo pero la verdad que no se como hacerlo.

P.D: Estoy usando DAO 3.6+Acces 2003
Desde ya Muchas Gracias !
  #2 (permalink)  
Antiguo 12/03/2009, 06:03
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Respuesta: Comparacion de Columnas

Bueno, estando los campos a comparar en el mismo registro, no creo que sea tan sencillo ni que se pueda hacer con una consulta (¿?).

Se me ocurre que puedes hacer una selección del producto y cargar los campos en un array para después ordenarlos. Sería algo así:

Código vb:
Ver original
  1. ' hacemos una selección con el producto indicado (esta devolverá un único registro)
  2. ' se supone que anteriormentes has declarado dbs (Database) y rst (Recordset)
  3. Set rst = dbs.OpenRecordset("SELECT Distribuidor1, Distribuidor2, Distribuidor3, Distribuidor4 FROM Tabla1 Where Producto = 'Sillas'")
  4. ' creamos una matriz de dos dimensiones
  5. Dim a(3, 1) As Variant, i As Integer
  6. ' la cargamos con el nombre del campo y el precio
  7. For i = 0 To rst.Fields.Count - 1
  8.     a(i, 0) = rst.Fields(i).Name
  9.     a(i, 1) = rst.Fields(i)
  10. Next i
  11.  
  12. Dim b As Boolean, aux As Integer, s As String
  13. ' ordenamos la matriz de menor a mayor
  14. b = True
  15. While b
  16.     b = False
  17.     For i = 1 To UBound(a)
  18.         If a(i - 1, 1) > a(i, 1) Then
  19.             s = a(i - 1, 0)
  20.             aux = a(i - 1, 1)
  21.             a(i - 1, 0) = a(i, 0)
  22.             a(i - 1, 1) = a(i, 1)
  23.             a(i, 0) = s
  24.             a(i, 1) = aux
  25.             b = True
  26.         End If
  27.     Next i
  28. Wend
  29. ' el primer elemento de la matriz es el mas barato
  30. MsgBox "El distribuidor mas barato es " & a(0, 0) & vbCrLf & _
  31.     "con un precio de " & a(0, 1)

Un saludo
  #3 (permalink)  
Antiguo 12/03/2009, 06:21
 
Fecha de Ingreso: noviembre-2005
Mensajes: 751
Antigüedad: 18 años, 5 meses
Puntos: 13
Respuesta: Comparacion de Columnas

Hola

Yo creo que cambiaría el diseño de la tabla, creando una tabla para los productos con sus datos (CodPro, Descripción, ...) otra para los Distribuidores (CodDis, Nom, Direcc, Tel,...) y una tercera para relacionarlos y añadir el precio Prod-Distr(Cod, CodPro, CodDis, Precio).

Teniéndolo estructurado de esta forma las consultas son mas eficaces (aunque requiere un cambio del diseño).

--Saludos--
  #4 (permalink)  
Antiguo 12/03/2009, 08:22
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Respuesta: Comparacion de Columnas

Cita:
Iniciado por Insomnia Ver Mensaje
Hola

Yo creo que cambiaría el diseño de la tabla, creando una tabla para los productos con sus datos (CodPro, Descripción, ...) otra para los Distribuidores (CodDis, Nom, Direcc, Tel,...) y una tercera para relacionarlos y añadir el precio Prod-Distr(Cod, CodPro, CodDis, Precio).

Teniéndolo estructurado de esta forma las consultas son mas eficaces (aunque requiere un cambio del diseño).

--Saludos--
Hola

Estoy de acuerdo que es una mala gestión de la base de datos, pero en lo que no estoy de acuerdo es que se necesiten tres tablas, con dos sería mas que suficiente:

Campos tabla productos:
CodPro, nombre, ...

Campos tabla distribuidores:
NombreDistribuidor, CodPro, Precio

La relación sería por el campo marcado en negrilla.

De todas formas se trataba de contestar a lo indicado en su pregunta (igual, por alguna razón, no puede cambiar la estructura de las tablas de la BD).

  #5 (permalink)  
Antiguo 12/03/2009, 09:15
 
Fecha de Ingreso: noviembre-2005
Mensajes: 751
Antigüedad: 18 años, 5 meses
Puntos: 13
Respuesta: Comparacion de Columnas

Hola

Cita:
De todas formas se trataba de contestar a lo indicado en su pregunta (igual, por alguna razón, no puede cambiar la estructura de las tablas de la BD).
Completamente de acuerdo, simplemente trataba de dar un punto de vista distinto y sugerir otra opción por si acc008 no lo había tenido en cuenta.

Cita:
pero en lo que no estoy de acuerdo es que se necesiten tres tablas
Yo he puesto tres tablas bajo el supuesto que un proveedor nos pueda proporcionar mas de un producto.

--Saludos--
  #6 (permalink)  
Antiguo 12/03/2009, 09:27
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Respuesta: Comparacion de Columnas

Cita:
Iniciado por Insomnia Ver Mensaje
Hola



Completamente de acuerdo, simplemente trataba de dar un punto de vista distinto y sugerir otra opción por si acc008 no lo había tenido en cuenta.



Yo he puesto tres tablas bajo el supuesto que un proveedor nos pueda proporcionar mas de un producto.

--Saludos--
Hola, seguimos aportando.

Creo que aún en ese caso tampoco sería necesaria la tercera tabla.

Registros en la tabla distribuidores:
Distr - CodProd - Precio

Distpepe - 0001 - 1530.36
Distpaco - 0001 - 1530.35
Distpepe - 0002 - 1000.56


Como podrás ver, el mismo distribuidor puede tener en la misma tabla diferentes productos con diferentes precios.

Saludos
  #7 (permalink)  
Antiguo 12/03/2009, 09:42
 
Fecha de Ingreso: noviembre-2005
Mensajes: 751
Antigüedad: 18 años, 5 meses
Puntos: 13
Respuesta: Comparacion de Columnas

Es cierto

Solo lo hacia para evitar repetir datos del Distr en varias lineas en el caso de guardar mas datos del distribuidor, como podría ser el nombre, dirección, población, CP, Provincia, Teléfono, Fax, Email, Persona Contacto, CIF,...

Igual estoy inventando mas de lo que nos decía en principio acc008, y lo estoy complicando mas de lo necesario pero es lo 1º que me vino a la cabeza al leer el email

--Saludos--
  #8 (permalink)  
Antiguo 12/03/2009, 22:33
 
Fecha de Ingreso: marzo-2009
Mensajes: 23
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Comparacion de Columnas

Bueno el codigo q me paso avellaneda no me funciono y la verdad no se me ocurre como puedo separar lo q tengo en bases diferentes porque son muchos datos:

Código:
Destino	Codigo	Avangard	AT&T
Afghanistan	93	0,2210	0,1985
Afghanistan - Mobile - Areeba	9377	0,2200	0,2035
Afghanistan - Mobile - AT	9375	0,2078	0,2035
Afghanistan - Mobile - AWCC	9370	0,2045	0,2035
Afghanistan - Mobile - Etisalat	9378	0,2177	0,2035
Afghanistan - Mobile - Rosham	9379	0,2046	0,2095
Albania	355	0,0593	0,1150
Albania - Durres	35552	0,0465	
Albania - Mobile - AMC	35568	0,2683	
Albania - Mobile - Eagle	35567	0,2078	
Albania - Mobile - Vodafone	35569	0,2827	
Albania - Tirane	3554	0,0323	
Albania - Vlora	35533	0,0549	
Algeria	213	0,0809	0,1255
Algeria - Algiers	21321	0,0809	
Algeria - Mobile - Mobilis	21366	0,1172	0,1255
Algeria - Mobile - Mobilis	21369	0,1172	0,1255
Algeria - Mobile - Orascom	21377	0,1485	0,1255
Algeria - Mobile - Orascom	21379	0,1485	0,1255
Algeria - Mobile - Wataniya	21355	0,1194	0,1255
Eso q les mostre es un base de datos con 20 registros de destinos y 2 proveedores nomas. las BD completas q tengo que administrar tienen hasta 12000 registros y casi 15 proveedores y la verdad es bastante complicado ponerse a separar y relacionar bases. :S asi que si encuenttran otra solucion se los agradeceria.

Edit:
Avellaneda aqui hay una foto de lo q me hace cuando pruebo la matris:
img18 . imageshack . us/my.php?image=errorjyp.jpg (lo pongo asi porq el foro no me deja :S)
Pero solo ocurre si uso mi base de datos porq probe hacer una con los datos del codigo y me funciona bien :S

Última edición por acc008; 13/03/2009 a las 01:03
  #9 (permalink)  
Antiguo 13/03/2009, 04:41
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Respuesta: Comparacion de Columnas

Creo que deberías replantearte muy seriamente el crear una nueva tabla con los operadores y enlazarla a ésta por el campo Codigo, te vas a ahorrar muchos quebraderos de cabeza.

Si la tabla es de Access, esto no es demasiado problema, sólo tienes que duplicar las tablas y cortar campos (o crearte una pequeña función que pase los datos de una tabla a la otra).

Edit:
Ese link que me pusiste no funciona.

  #10 (permalink)  
Antiguo 13/03/2009, 15:04
 
Fecha de Ingreso: marzo-2009
Mensajes: 23
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Comparacion de Columnas

Bueno voy a tener q hacer eso nomas pero me van a tener q seguir ayudando :P. como tendria que dejar las tablas:

1) con los paises (Codpaises, paises, ....)
2) con los proveedores (CodProveedor, proveedor(precio)) ??

pense hacerlo asi pero el tema es q tengo muchos proveedores y creo q va a seguir siendo lo mismo si tengo q comparar los precios :S.
  #11 (permalink)  
Antiguo 14/03/2009, 10:09
 
Fecha de Ingreso: marzo-2009
Mensajes: 23
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Comparacion de Columnas

Bueno al final logre lo que queria.
lo que hize fue publicar una variable para cada proveedor y luego las compare en un if:

Código:
Private Sub Grilla_Click()
Precio1 = Grilla.TextMatrix(Grilla.RowSel, 3)
Precio2 = Grilla.TextMatrix(Grilla.RowSel, 4)
Txt1.Text = Grilla.TextMatrix(Grilla.RowSel, 1)
If Precio1 < Precio2 Then
Txt2.Text = "Avangard"
Txt3.Text = Grilla.TextMatrix(Grilla.RowSel, 3)
Else
Txt2.Text = "AT&T"
Txt3.Text = Grilla.TextMatrix(Grilla.RowSel, 4)
End If
eso es un ejemplo que hize para probar usando solo 2 proveedores y me funciona bien :D.
Igualmente muchas gracias por su ayuda.. seguramente voy a postear otra vez :P.
Suerte !
  #12 (permalink)  
Antiguo 14/03/2009, 11:16
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Respuesta: Comparacion de Columnas

Cita:
Iniciado por acc008 Ver Mensaje
Bueno al final logre lo que queria.
lo que hize fue publicar una variable para cada proveedor y luego las compare en un if:

Código:
Private Sub Grilla_Click()
Precio1 = Grilla.TextMatrix(Grilla.RowSel, 3)
Precio2 = Grilla.TextMatrix(Grilla.RowSel, 4)
Txt1.Text = Grilla.TextMatrix(Grilla.RowSel, 1)
If Precio1 < Precio2 Then
Txt2.Text = "Avangard"
Txt3.Text = Grilla.TextMatrix(Grilla.RowSel, 3)
Else
Txt2.Text = "AT&T"
Txt3.Text = Grilla.TextMatrix(Grilla.RowSel, 4)
End If
eso es un ejemplo que hize para probar usando solo 2 proveedores y me funciona bien :D.
Igualmente muchas gracias por su ayuda.. seguramente voy a postear otra vez :P.
Suerte !
¿Y eso así hasta 15 proveedores?, será un código enorme.

En el código que te puse anteriormente sólo tienes que dimensionar la matriz al número de proveedores y el resto del código no varía:

Dim a(NumProveedores, 1)

Por cierto, que no indicas el porqué no funciona.

  #13 (permalink)  
Antiguo 14/03/2009, 11:22
 
Fecha de Ingreso: marzo-2009
Mensajes: 23
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Comparacion de Columnas

Bueno eso fue una solucion provisoria :P.. por el tema de tu codigo no me funciona porque me devuelve el msgbox solamente con el texto.. osea es como si los valores q toma de la matriz estuvieran vacios.


EDIT: Ya Avellaneda. Me faltaba redimensionar la matriz.. ahora me funciona perfecto :D:D.. Muchisimas gracias :D

Última edición por acc008; 14/03/2009 a las 11:29
  #14 (permalink)  
Antiguo 14/03/2009, 12:12
 
Fecha de Ingreso: marzo-2009
Mensajes: 23
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Comparacion de Columnas

se me presento 1 problema mas. resulta que algunos proveedores no tienen el producto, por ende el valor de la celda es 0, y cuando la matriz ordene los resultados me va a devolver q el precio mas bajo es 0 :S:S.. ¿que coordenadas de la matriz tengo q cambiar para hacer q me muestre el segundo valor en ves del primero?:

Código:
MsgBox "El distribuidor mas barato es " & a(0, 0) & vbCrLf & _
    "con un precio de " & a(0, 1)
ya probe con (1, 0) y me devuelve bien el nombre de proveedor, pero cuando quiero el precio (1, 1) me sigue dando 0

Última edición por acc008; 14/03/2009 a las 12:18
  #15 (permalink)  
Antiguo 15/03/2009, 06:15
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Respuesta: Comparacion de Columnas

Una forma de solucionarlo es leer los campos antes de crear el array y redimensionarlo al número de campos diferentes de cero:

Modifica esta parte del código que te puse antes (a continuación de abrir el recordset):

Código vb:
Ver original
  1. Dim x As Integer, i As Integer
  2. For x = 0 To rst.Fields.Count - 1
  3.     ' si el valor del campo es mayor que , incrementamos la variable
  4.    If rst.Fields(x) > 0 Then i = i + 1
  5. Next x
  6. Dim a() As Variant
  7. ' redimensionamos la matriz bidimensional al número de campos no nulos
  8. ReDim a(i - 1, 1)
  9. ' el primer índice de la matriz es 0
  10. x = -1
  11. For i = 0 To rst.Fields.Count - 1
  12.     If rst.Fields(i) > 0 Then
  13.         ' el valor del campo es mayor que cero, lo cargamos en la matriz
  14.        x = x + 1
  15.         a(x, 0) = rst.Fields(i).Name
  16.         a(x, 1) = rst.Fields(i)
  17.     End If
  18. Next i
.. y a continuación haces la ordenación del array

  #16 (permalink)  
Antiguo 15/03/2009, 17:28
 
Fecha de Ingreso: marzo-2009
Mensajes: 23
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Comparacion de Columnas

mmm no me funciona bien :S... el codigo me quedo asi:

Código:
' hacemos una selección con el producto indicado (esta devolverá un único registro)
' se supone que anteriormentes has declarado dbs (Database) y rst (Recordset)
Set DATOS = DB.OpenRecordset("SELECT Avangard, ATT FROM DATOS Where DESTINO = '" & Txt1.Text & "'")
' creamos una matriz de dos dimensiones
Dim x As Integer, i As Integer
For x = 0 To DATOS.Fields.Count - 1
    ' si el valor del campo es mayor que , incrementamos la variable
    If DATOS.Fields(x) > 0 Then i = i + 1
Next x
Dim a() As Variant
' redimensionamos la matriz bidimensional al número de campos no nulos
ReDim a(i - 1, 1)
' el primer índice de la matriz es 0
x = -1
For i = 0 To DATOS.Fields.Count - 1
    If DATOS.Fields(i) > 0 Then
        ' el valor del campo es mayor que cero, lo cargamos en la matriz
        x = x + 1
        a(x, 0) = DATOS.Fields(i).Name
        a(x, 1) = DATOS.Fields(i)
    End If
Next i
 
Dim b As Boolean, aux As Integer, s As String
' ordenamos la matriz de menor a mayor
b = True
While b
    b = False
    For i = 1 To UBound(a)
        If a(i - 1, 1) > a(i, 1) Then
            s = a(i - 1, 0)
            aux = a(i - 1, 1)
            a(i - 1, 0) = a(i, 0)
            a(i - 1, 1) = a(i, 1)
            a(i, 0) = s
            a(i, 1) = aux
            b = True
        End If
    Next i
Wend
' el primer elemento de la matriz es el mas barato
MsgBox "El distribuidor mas barato es " & a(0, 0) & vbCrLf & _
    "con un precio de " & a(0, 1)
no se si lo puse mal o que pero cuando uno de los 2 proveedores tiene un valor en 0 funciona bien.. pero si los 2 tienen algun precio me devuelve el nombre del que esta primero (avangard) y el precio q me da es 0 :S..

posiblemente hize algo mal yo pero no se :S..


EDIT:

Bueno ya se me ocurrio otra forma para hacerlo y no es tan complicada como la q pense primero xD. lo que hago es lo siguiente:

Código:
Private Sub Grilla_Click()
'Declaro variables para cada proveedor
Precio1 = Grilla.TextMatrix(Grilla.RowSel, 3) 
Precio2 = Grilla.TextMatrix(Grilla.RowSel, 4)
Txt1.Text = Grilla.TextMatrix(Grilla.RowSel, 1)

'Si la variable es mayor a 0 las agrego a un listbox q esta oculto en el formulario (por cuestiones esteticas :P)
'El formulario tiene la opcion Sorted = True para que me ordene de menor a mayor los valores
If Precio1 > 0 Then
List1.AddItem Precio1
End If
If Precio2 > 0 Then
List1.AddItem Precio2
End If

'Selecciono el primer registro del list y comparo el valor con la primer variable
If List1.List(0) = Precio1 Then
'si los valores son iguales me va a mostrar en un textbox el nombre de proveedor al que corresponde la variable
'en este caso Precio1 = Avangard
Txt2.Text = "Avangard"
Txt3.Text = List1.List(0)
'dsp de imprimir los valores le hago un .clear al listbox para poder fijarme 
'en otros regristros sin tener q cerrar y volver a abrir el form
List1.Clear
Else
'Si la primer comparacion es falsa paso a comparar la siguiente variable:
'en este caso la variable Precio2 = AT&T
If List1.List(0) = Precio2 Then
Txt2.Text = "AT&T"
Txt3.Text = List1.List(0)
List1.Clear
'Para cuando quiera agregar mas proveedores lo unico q voy a tener q hacer es asignar mas variables 
'y anidar otro if dsp de un else y listo
End If
End If
Bueno.. esa es la forma que se me ocurrio. capaz que haga esto nomas porque no entiendo nada de matrices y si se me presenta algun problema con el codigo voy a tener que estar pendiente del foro siempre :S..
pero seguramente voy a volver con otra duda :D....

Y como siempre Gracias a todos!

P.D: Fijense si les gusta mi idea y me lo dicen :P

Última edición por acc008; 15/03/2009 a las 22:27
  #17 (permalink)  
Antiguo 16/03/2009, 03:13
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Respuesta: Comparacion de Columnas

A ver, no entiendo bien ¿son 15 proveedores o solamente dos?

Si la comparación es unicamente entre dos proveedores, no hay que complicarse tanto la vida:

Código vb:
Ver original
  1. Dim sMsg As String
  2. If DATOS(0) > DATOS(1) Then
  3.     sMsg = "El mas barato es ATT, con un precio de " & DATOS(1)
  4. Else
  5.     sMsg = "El mas barato es Avangard, con un precio de " & DATOS(0)
  6. End If
  7. If DATOS(0) = 0 Then sMsg = "El mas barato es ATT, con un precio de " & DATOS(1)
  8. If DATOS(1) = 0 Then sMsg = "El mas barato es Avangard, con un precio de " & DATOS(0)
  9. MsgBox sMsg

Para que funcione el código que puse antes con decimales, sólo cambia la asignación de la variable aux de Integer a Double.


Última edición por Avellaneda; 16/03/2009 a las 04:12 Razón: Amplío el código para el caso de que sea cero.
  #18 (permalink)  
Antiguo 16/03/2009, 05:05
 
Fecha de Ingreso: marzo-2009
Mensajes: 23
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Comparacion de Columnas

El tema es q no son 2 solame. Por el momento estoy usando esa BD para y probando nomas.. dsp voy a usar la BD completa, pero ya lo tengo solucionado por ahora. si me sale otro problema hago otro post.
  #19 (permalink)  
Antiguo 16/03/2009, 05:09
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Respuesta: Comparacion de Columnas

Cita:
Iniciado por acc008 Ver Mensaje
El tema es q no son 2 solame. Por el momento estoy usando esa BD para y probando nomas.. dsp voy a usar la BD completa, pero ya lo tengo solucionado por ahora. si me sale otro problema hago otro post.
Y cómo vas a hacer la comparación de 15 columnas?

Prueba con el código que te puse antes, modificando la variable aux a Double.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:25.