• Viernes 8 de Noviembre de 2024, 15:52

Autor Tema:  Problema con un problema  (Leído 1997 veces)

Programming C++

  • Miembro activo
  • **
  • Mensajes: 31
    • Ver Perfil
Problema con un problema
« en: Viernes 7 de Mayo de 2010, 08:59 »
0
bueno mi problema es con el codigo me complica no se que hacer la verdad. mejor les explico.

el problema se trata de un almacen q tiene los siguientes puntos:

a- si compra 4 de los 5 articulos se lleva el quinto gratis.
b-si compra 4 de los 5 articulos, iguales se llevara 1 adicional
c-si compra 4 y su compra sobrepas de 150 dolares tiene un descuento de 8%

Pues lo que quiero es cumplir esos 3 puntos pero no se como hacerlo. ya hasta me da dolor de cabeza :S. Ya lo he intentado varias veces. me podrian ofrecer alguna ayuda porfavor  :(

le dejo una imagen



El codigo
Código: Text
  1.  
  2. Dim PrecioTotal As Double
  3. Dim var As Double
  4. Dim Conexion As New ADODB.Connection
  5. Dim RsArtilculos As New ADODB.Recordset
  6.  
  7. Private Sub Command1_Click()
  8.  
  9. Conexion.Execute "update Artilculos set Total = " & Val(TxtTotal.Text) & " WHERE ID=1"
  10. MsgBox "El dato ha sido guardado", vbExclamation
  11.  
  12.  
  13. End Sub
  14.  
  15. Private Sub cmd_borrar_Click()
  16. txt_za.Text = ""
  17. txt_t.Text = ""
  18. txt_pan.Text = ""
  19. txt_zap.Text = ""
  20. txt_go.Text = ""
  21. txtto.Text = ""
  22.  
  23.  
  24. End Sub
  25.  
  26. Private Sub cmd_salir_Click()
  27. End
  28. End Sub
  29.  
  30. Private Sub Cmd_to_Click()
  31. var = 0
  32. If Chk_za.Value Then
  33.     var = Val(txt_pr1.Text) * Val(txt_za.Text)
  34. End If
  35. If Chk_za.Value Then
  36.  
  37. txtto.Text = var
  38. End Sub
  39.  
  40. Private Sub Form_Load()
  41. txt_pr1.Text = ""
  42. txt_pr2.Text = ""
  43. txt_pr3.Text = ""
  44. txt_pr4.Text = ""
  45. txt_pr5.Text = ""
  46.  
  47.  
  48. Conexion.ConnectionString = _
  49. "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "DataAlmacen.mdb;Persist Security Info=False;Jet OLEDB:Database;"
  50. Conexion.Open
  51.  
  52. RsArtilculos.Open "select * from Artilculos ", Conexion
  53.    
  54. MostrarPrecios
  55.  
  56. End Sub
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63. Function MostrarPrecios() As Integer
  64.  
  65. txt_pr1.Text = RsArtilculos.Fields("Zapatillas").Value
  66. txt_pr2.Text = RsArtilculos.Fields("T-Shirts").Value
  67. txt_pr3.Text = RsArtilculos.Fields("Pantalones").Value
  68. txt_pr4.Text = RsArtilculos.Fields("Zapatos").Value
  69. txt_pr5.Text = RsArtilculos.Fields("Gorras").Value
  70.  
  71.  
  72. End Function
  73.  
  74.  
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Problema con un problema
« Respuesta #1 en: Viernes 7 de Mayo de 2010, 19:12 »
0
Bueno, la cosa es bastante sencilla.

Cuando hay varias reglas,  hay que verificarlas antes de totalizar y las que se verifican justo al totalizar deben anotarse, para ello pueden establecerse variables que determina  si una regla se usa o no y en consecuencia después tenerlas en cuenta. Otras reglas como esa que permite regalar el 5º artículo si se llevan 4, puede tratarse al instante, o justo antes de totalizar, yo te he puesto un ejemplo donde esta regla se lleva a cabo (el valor que lo determina) sobre la marcha y al totalizar se verifica dicho valor, las otras reglas se verifican justo al totalizar...

Hay cierta ambigüedad en el enunciado de las reglas, por ejemplo 2 o más reglas son acumulables ? yo he supuesto que si, porque nada dice lo contrario y en cuento a la regla de que si comprar 4 artículos se regala 1 adicional yo lo he interpretado como que compras 4 unidades del mismo artículo... estas ambigüedades tu las puedes conocer con exactitud, pero nadie más, de modo que tal vez tengas que corregir parte del código para que se ajuste a lo que quieres. Tampoc has determinado que hacer cuando alguien compra los 5 artículos, yo he optado por regalar 1 unidad (descontar el valor de su precio) de aquel de menor precio_unitario de los 5 artículos

El caso debe servirte como ejemplo para cualquier número de reglas, por complejas que estas sean, basta definirlas correcta y completamente y aplicarlas ordenadamente. No se debe tener prisas en obtener un total, este vendrá al final sólo cuando se hayan verificado todas las reglas...

He cambiado los nombres de los controles, porque en muchos casos ( y este es uno de ellos) meterlos en una matrizo colección simplifica y aclara  elcódigo.

Los artículos forman una matriz de nombre 'CheArticulos(n)' donde n es el índice del artículo de 0 a 4 verticalmente, del mismo modo para el texto de precios se le ha llamado a la matriz de esos textos 'txtPrecioUnidad(n), ídem para los contrles de texto de las cantidades. txtCantidades(n).

Los textos de precios y el de total están bloqueados, se supone que ese valor se modifica por otro lado, aquí son de sólo lectura, para bloquearlos se utiliza la propiedad locked=true de dichos controles, para esclarecer que no cambiables se les cambió el color de fondo a un amarillo tenúe. Las cantidades sempre valen 0, están desactivados, sólo seactivan cuando su checkox de artículo corresopondiente es activado, cuando se desactiva su valor se pone a 0. El frame que contiene todo estos controles de texto se ha renombrado a: 'FraAdquirir'

Se ha añadido un frame, que detalla las promociones que se aplican, yaunque no se ve, cuando se aplica un descuento, aparece un label reflejando cuanto es la cantidad del descuento...
finalmente se han reordenado los contrles para tener mejor presencia.  Este frame está desactivado (es de sólo lectura) .
El aspecto final se puede observar en la imagen.



el código (está comentado, pero...) se describe someramente en los siguientes bloques:

Declaraciones...
Código: Visual Basic
  1.  
  2.        Dim Conexion As New ADODB.Connection
  3.       Dim RsArticulos As New ADODB.Recordset
  4.  
  5. Private Totales As Single
  6. Private ArtiElegidos As Byte                 ' mantiene una cuenta de los diferentes artículos elegidos.
  7.    Private ArtiNocomputar As Boolean        ' al activarse no debe ejecutarse  elcódigo asociado...
  8. Private RegaloVariedad  As Boolean           ' se aplica regalo del 5º ?
  9.    Private RegalarArticuloX As single                  ' señala que artículo se regala gratis (su precio). este valor se descuenta del total a pagar.
  10. Private RegaloFidelidad(0 To 4) As Boolean   ' se aplica regalo 1 adicional del artículo de al menos 4 ?
  11. Private AplicarDescuento As Boolean                 ' se aplica un descuento ?
  12.    Private DescuentoPorcentaje As Single     ' porcentaje de descuento que se aplica, se supone que esto se establece desde un panel de administración, aquí se  especifica en el load.
  13.    Private VolumenParaDescuento As Single   ' cantidad que determina que una vez alcanzada se aplica el descuento.
  14.  
  15.  

Código para los controles checkbox.... debe notarse que forman una matriz, véase el parámetro index, que se usa tanto para los checkbox como para los textos de precio y  cantidad
Cada índice de la matriz  checkbox cocunerda con la matriz de textbox de precios y de cantidades... obviamente.
Código: Visual Basic
  1.  
  2. ' contabiliza cuantos diferentes artículos se adquieren, además
  3. Private Sub CheArticulos_Click(Index As Integer)
  4.     Dim uso As Boolean
  5.    
  6.     ' sólo se ejecuta el código cuando no se está totalizando
  7.     If ArtiNocomputar = False Then
  8.         uso = (CheArticulos(Index).Value = 1)
  9.         txtPrecioUnidad(Index).Enabled = uso
  10.         txtCantidades(Index).Enabled = uso
  11.        
  12.        
  13.         If uso = True Then
  14.             ArtiElegidos = ArtiElegidos + (2 ^ Index) ' se recuerda que: 2 ^0= 1
  15.             txtCantidades(Index).BackColor = vbWhite
  16.         Else
  17.             ArtiElegidos = ArtiElegidos - (2 ^ Index)
  18.             txtCantidades(Index).Text = "0" ' DEBE BORRARSE para no alterar la suma al totalizar, por supuesto podría no borrarse si al totalizarse se verifica si el artículo está activado, pero es hacerlo más complicado y se presta a confusión.
  19.             txtCantidades(Index).BackColor = 14737632 'gris, desactivado
  20.         End If
  21.     End If
  22. End Sub
  23.  
  24.  

Código del botón borrar, el botón se ha renombrado
Código: Visual Basic
  1.  
  2. ' borra todo lo necesario, equivale a resetear
  3. Private Sub cmdBorrar_Click()
  4.     Dim k As Byte
  5.    
  6.     ' borramos cantidades y desactivamos artículos elegidos
  7.     For k = 0 To 4
  8.         CheArticulos(k).Value = 0
  9.         txtCantidades(k).Text = "0"
  10.         txtCantidades(k).Enabled = False  ' desactivado
  11.         txtCantidades(Index).BackColor = 14737632 'gris
  12.     Next
  13.     ArtiElegidos = 0
  14.    
  15.     ' borramos totales y descuento
  16.     TxtTotales.Text = "0.00"
  17.     Totales = 0
  18.     LabDescuento.Caption = ""  ' este lab está en el frame de gratificaciones...
  19.    
  20.     ' borramos todas las promociones
  21.     For k = 0 To 2
  22.         ChePromociones(k).Value = 0
  23.     Next
  24.    For k = 0 To 4
  25.            RegaloFidelidad(k) = False
  26.     Next
  27.  
  28.     RegaloVariedad = False
  29.     AplicarDescuento = False
  30.     RegalarArticuloX = 0
  31.    
  32.     ' se activa de nuevo la seleccion de adquisiciones.
  33.     FraAdquirir.Enabled = True
  34.     ' se activa de nuevo computar cuando se marquen artículos.
  35.     ArtiNocomputar = False
  36. End Sub
  37.  
  38.  

Codigo del boton total...  se ha renombrado el botón
Aquí se realiza casi todo el código de cálculo...
Los controles chePromociones(n) ... están el frame gratiificaciones... junto  con un label (labDescuento)
Código: Visual Basic
  1.  
  2. ' aquí primero se verifican si se cumple alguna de las reglas.
  3. ' hay una 4ª regla deducible que señala si las promociones son adicionales o no. Es decir si puede darse más de 1 a la vez o no.
  4. '    como no se indica nada en contra se supone que sí.
  5. Private Sub CmdTotalizar_Click()
  6.     Dim k As Byte, cantidad As Integer, precio As Single, Descuento As Single
  7.    
  8.     ' desactivamos posibilidades de cambios antes de empezar a calcular... Se activa de nuevo al borrar.
  9.     FraAdquirir.Enabled = False
  10.     ArtiNocomputar = True ' los cambios aplicados ahora al marcar artículos no ejecutan el código asociado en los checkbox...
  11.    
  12.     ' 1º determinar si se aplica regalo del 5º (regalo por variedad).
  13.     '   1 + 2 + 4 + 8 + 16 =31, el regalo se aplica cuando:  ArtiElegidos = 31 - sólo 1 de esos sumandos
  14.     '      Casos posibles para 5 artículos:  31-16=15 ;; 31-8=23 ;; 31-4=27 ;; 31-2=29 ;; 31-1=30
  15.     '   y también si se eligió los 5 en cuyo caso se regala el de menor cuantía ? 31-0=31
  16.     Select Case ArtiElegidos
  17.         Case 0 ' no hay adquisiciones
  18.             Call cmdBorrar_Click
  19.             Exit Sub
  20.         Case 15, 23, 27, 29, 30, 31  ' se eligieron 4 artículos (o 5)
  21.             RegaloVariedad = True
  22.             ChePromociones(1).Value = 1
  23.            
  24.             If ArtiElegidos < 31 Then ' si se eleigieron 4 artículos, regalar el 5º
  25.                 Select Case ArtiElegidos
  26.                     Case 15: k = 4 ' activamos el artículo 4 que es el que falta
  27.                     Case 23: k = 3
  28.                     Case 27: k = 2
  29.                     Case 29: k = 1
  30.                     Case 30: k = 0
  31.                 End Select
  32.                 ' se regala este artículo. el 'K' avo de la matrizde artículos.
  33.                 CheArticulos(k).Value = 1  'lo marcamos,
  34.                 txtCantidades(k) = "1"     ' señalamos en cantidad 1
  35.                 RegalarArticuloX = Val(txtPrecioUnidad(k).Text)  ' tomamos el valor que al totalizar se cuenta, pero al final se debe descontar.
  36.             Else ' el que adquiere compra todos los artículos (al menos 1 cantidad), se regala el de menor cuantía de los existentes...
  37.                 ' buscamos el precio de menor cuantía de los 5 artículos.
  38.                 RegalarArticuloX = Val(txtPrecioUnidad(0).Text)
  39.                 For k = 1 To 4
  40.                     If Val(txtPrecioUnidad(k).Text) < RegalarArticuloX Then
  41.                         RegalarArticuloX = Val(txtPrecioUnidad(k).Text)
  42.                     End If
  43.                 Next
  44.             End If
  45.         Case Else  ' no hay promoción de regalar un 5º por tener 4 artículos.
  46.             RegaloVariedad = False
  47.             ChePromociones(1).Value = 0
  48.             RegalarArticuloX = 0
  49.     End Select
  50.    
  51.     ' 2º Determinar si se puede hacer un regalo por fidelidad
  52.     '  esto se mira revisando la cantidad para cada artículo si tiene al menos 4 se le regala 1 más (se supone que por cada artículo que cumpla dicho requisito)
  53.     For k = 0 To 4
  54.         If Val(txtCantidades(k).Text) > 3 Then
  55.             RegaloFidelidad(k) = True             ' activamos para tenerlo en cuenta al totalizar,
  56.             ChePromociones(2).Value = 1           ' marcamos la promoción
  57.             txtCantidades(k).Text = Val(txtCantidades(k).Text) + 1  ' sumamos 1 para asegurarse que sea entregado...
  58.         End If
  59.     Next
  60.    
  61.     ' 3º Descuento por volumen: (se suponen que las promociones son acumulables), este paso serealiza en 2
  62.     '   en el primero se tiene calcula el total adquirido originalmente por el comprador + el regalo del 5º (si existe se desceunta al final).
  63.     '   en el segundo se comprueba si se aplica el descuento por volummmmen de compra.
  64.    
  65.     ' 3ºA) totaliza las cantidades, descontando regalos_por_Fidelidad (la cantidad ya se sumó pero es gratis).
  66.     For k = 0 To 4
  67.         cantidad = Val(txtCantidades(k).Text)
  68.         precio = Val(txtPrecioUnidad(k).Text)
  69.        
  70.         If RegaloFidelidad(k) = True Then  ' aquí hay un regalo por variedad, se descuenta una unidad.
  71.             cantidad = cantidad - 1
  72.         End If
  73.         If cantidad > 0 Then
  74.             ' total = total + (precio_1 * cantidad_del_Artículo)
  75.             Totales = Totales + (precio * cantidad)
  76.         End If
  77.     Next
  78.    
  79.     ' 1ºB, aplicar el descuento del 5º artículo, sino existe este valor es 0 y por tanto no cambia.
  80.     '   NOTA: este regalo no puede constar como 'factura total', porque es regalado, no entra en factura ni en totales, y por tanto su valor no entra en desceuntos.
  81.     Totales = Totales - RegalarArticuloX
  82.    
  83.     ' se supone que las promociones son acumulables.
  84.     ' 3ºB se verifica si se cumple la 3ª promoción
  85.     If Totales > VolumenParaDescuento Then
  86.         Descuento = ((Totales / 100) * DescuentoPorcentaje)
  87.         Totales = Totales - Descuento
  88.         AplicarDescuento = True
  89.         ChePromociones(0).Value = 1
  90.     Else
  91.         AplicarDescuento = False
  92.         ChePromociones(0).Value = 0
  93.     End If
  94.    
  95.    
  96.     ' marcamos el valor total, las promociones aplicadas quedan reflejadas en el frame gratificaciones...
  97.     TxtTotales.Text = Totales
  98.     LabDescuento.Caption = "Descontado: " & CStr(Descuento)
  99. End Sub
  100.  
  101.  

Finalmente el código de carga y fin del formulario (esta parte está sin terminar, te lo señalo con comentarios).
Código: Visual Basic
  1.  
  2. Private Sub Form_Load()
  3.     Conexion.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "DataAlmacen.mdb;Persist Security Info=False;Jet OLEDB:Database;"
  4.     Conexion.Open
  5.     RsArticulos.Open "select * from Artilculos ", Conexion
  6.     Call MostrarPrecios
  7.    
  8.     DescuentoPorcentaje = 8 ' 8% es el valor de descuento.
  9.     VolumenParaDescuento = 150 ' es el valor que si se alcanza al totalizar, determina que se aplica el descuento.
  10. End Sub
  11.  
  12.  
  13. ' los precios de los artículos están bloqueados, porque deben ser de sólo lectura.
  14. '  propiedad locked =true
  15. ' también está bloqueado preciototal
  16. '  los bloqueados se les cambió el color defondo, para expresar su valor no alterable desde interfaz de usuario.
  17. Private Sub MostrarPrecios()
  18.     txtPrecioUnidad(0).Text = RsArticulos.Fields("Zapatillas").Value
  19.     txtPrecioUnidad(1).Text = RsArticulos.Fields("T-Shirts").Value
  20.     txtPrecioUnidad(2).Text = RsArticulos.Fields("Pantalones").Value
  21.     txtPrecioUnidad(3).Text = RsArticulos.Fields("Zapatos").Value
  22.     txtPrecioUnidad(4).Text = RsArticulos.Fields("Gorras").Value
  23. End Sub
  24.  
  25.  
  26. Private Sub cmdSalir_Click()
  27.     ' pedir confirmación
  28.     ' cerrar la base de datos antes de salir
  29.     End  ' end no dispara el evento  queryunload
  30. End Sub
  31. Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  32.     ' confirmar si se desea salir...
  33.     ' confirmar si se descartan cambios y cerrar base de datos
  34.    
  35. End Sub
  36.  
  37.  

No hay código para el botón guardar.

Debes revisar el código, ya que sólo lo he probado por encima y quizás necesite algún ajuste o haya tenido algún despiste...
Si algo no te queda claro, pregunta.
«Ma non troppo»
----> ModoVacaciones = False<----

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Problema con un problema
« Respuesta #2 en: Miércoles 12 de Mayo de 2010, 16:41 »
0
Resulta conveniente cuando responden a una cuestión planteada, comentar como te fue:  me fue bien. no lo entendí, gracias, o lo que sea.

No por ego, sino por saber si uno simplemente está perdiendo el tiempo o no. Cuando no se responde uno entiende que su mensaje no ha sido mirado y consecuentemente piensa que ha perdido media hora para nada... entonces para la próxima... abstenerse de responder a las cuestiones de quien te parece que no consulta tu mensaje y que por ello piensas que pierdes el tiempo es la solución adecuada.

A falta de otra cosa, una impresión es la que se obtiene de la ausencia de respuestas.
«Ma non troppo»
----> ModoVacaciones = False<----