Foros aprenderaprogramar.com
		Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: JValero en 26 de Abril 2014, 13:43
		
			
			- 
				Buenos días,
 
 Haciendo el ejercicio 7 correspondiente a la semana 8 me encuentro con el siguiente problema. El programa me entra en un bucle a la hora de ejecutar el Msgbox y de ahí no sale. El código utilizado es el siguiente:
 
 Option Explicit
 
 Dim TotalCemento As Integer
 Dim CemEntregado As Integer
 
 Private Sub Form_load()
 Form1.Caption = "Control de cemento en almacén"
 Label1.Alignment = 2
 Label1.Caption = "Por favor, introduzca el total de kilos de cemento a retirar:"
 Command1.Caption = "Retirar cemento"
 TotalCemento = 25000
 End Sub
 
 Private Sub Command1_Click()
 Text1 = CemEntregado
 Do While TotalCemento >= 6000
 CemEntregado = MsgBox("Cemento retirado de almacén")
 TotalCemento = TotalCemento - CemEntregado
 Loop
 Label2.Alignment = 2
 Label2.FontBold = True
 Label2 = "El inventario ha bajado de 6000 kilos de cemento. Por favor, comuníquelo al almacén"
 End Sub
 
 Entiendo perfectamente el porqué entra en el bucle y de ahí no sale. Le estoy diciendo que mientras el TotalCemento sea mayor o igual de 6.000 que muestre el mensaje de "Cemento retirado de almacén" en un msgbox.
 
 Lo que me gustaría saber es cómo solucionar este problema, es decir, como meter la cantidad de kilos a retirar en el TextBox, pulsar sobre el command button, que me muestre el mensaje en el msgbox y acto seguido vuelva a la pantalla principal a poner una nueva cantidad de cemento a retirar hasta que llegue a los 6000 kilos en el almacén y muestre el mensaje final en Label2.
 
 Cualquier ayuda será bienvenida y muy agradecida. Si no queda clara mi explicación, por favor, indicármelo y trataré de aportar nuevos datos.
 
 Muchas gracias de antemano.
- 
				Hola, te comento las cuestiones a tener en cuenta:
 
 Para insertar código usa el botón # que aparece en el editor del foro, así el código saldrá como código, de otra forma puede aparecer distorsionado. Para ello pulsa el botón # y escribe el código entre las etiquetas [ code ] ... [ / code] que aparecerán.
 
 Text1 = CemEntregado se lee "Text1 toma el valor que tenga CemEntregado"
 
 Esto es incorrecto, tú quieres que CemEntregado tome el valor de Text1, por tanto habría que escribir:
 
 CemEntregado = Text1
 
 Recordar siempre que a = b se lee como "a toma el valor que tenga b", o en el caso de
 
 a = a * a se lee "a toma el valor que tenía a previmente multiplicado por el valor que tenía a previamente"
 
 Por ejemplo a = 6
 
 a = a * a
 
 Supone que a ahora tiene el valor 6*6, es decir, a = 36
 
 
 
 La siguiente cuestión:
 
 CemEntregado = MsgBox("Cemento retirado de almacén") se lee de la siguiente manera "CemEntregado vale <<mostrar por pantalla Cemento retirado de almacén>>". Esto no es una sintaxis válida. ¿Qué necesitamos? Que en cada pasada del bucle se pida el dato de cemento entregado, esa es la condición que permite la evolución del bucle hasta llegar a poder salir de él. Si no hay evolución, el bucle se repite indefinidamente (bucle infinito) La sintaxis a emplear para realizar esta operación es:
 
 CemEntregado = Val(InputBox("Introduzca cantidad de cemento entregado", "Entrega"))
 
 Esto se lee: "La variable CemEntregado toma el valor numérico (Val) introducido por el usuario en una ventana de petición de datos (inputbox) donde el mensaje que se muestra al usuario es "Introduzca cantidad de cemento entregado" y el titulillo de la ventana es "Entrega".
 
 El código nos quedaría entonces así (eliminamos el text1, puesto que no vamos a hacer uso del textbox, sino que la petición de datos se hará a través del inputbox, que es otra forma de pedir datos al usuario:
 
 Option Explicit
 Dim TotalCemento As Integer
 Dim CemEntregado As Integer
 
 Private Sub Form_load()
 Form1.Caption = "Control de cemento en almacén"
 Label1.Alignment = 2
 Label1.Caption = "Por favor, introduzca el total de kilos de cemento a retirar:"
 Command1.Caption = "Retirar cemento"
 TotalCemento = 25000
 End Sub
 
 Private Sub Command1_Click()
 Do While TotalCemento >= 6000
 CemEntregado = Val(InputBox("Introduzca cantidad de cemento entregado", "Entrega"))
 TotalCemento = TotalCemento - CemEntregado
 Loop
 Label2.Alignment = 2
 Label2.FontBold = True
 Label2 = "El inventario ha bajado de 6000 kilos de cemento. Por favor, comuníquelo al almacén"
 End Sub
 
 También nos podemos plantear la opción de hacerlo a través del textBox. Pero en ese caso no podríamos usar un bucle do while, porque no tendríamos forma de salir de él, la repetición se produciría porque el usuario iría haciendo click muchas veces en el commandbutton hasta llegar a cumplirse la condición de terminación. En este momento mostraríamos un mensaje indicando que ya no se puede retirar más cemento:
 
 Option Explicit
 Dim TotalCemento As Integer
 Dim CemEntregado As Integer
 
 Private Sub Form_load()
 Text1 = "" 'Limpiamos el text1
 Label2 = "" 'Limpiamos el text2
 Form1.Caption = "Control de cemento en almacén"
 Label1.Alignment = 2
 Label1.Caption = "Por favor, introduzca el total de kilos de cemento a retirar:"
 Command1.Caption = "Retirar cemento"
 TotalCemento = 25000
 End Sub
 
 Private Sub Command1_Click()
 If TotalCemento >= 6000 Then
 CemEntregado = Text1
 TotalCemento = TotalCemento - CemEntregado
 MsgBox ("Se han retirado " & CemEntregado & " kilos de cemento y quedan " & TotalCemento & " kgs")
 Text1 = "" 'Limpiamos el text1
 Else
 MsgBox ("El inventario ha bajado de 6000 kilos de cemento. Por favor, comuníquelo al almacén")
 End If
 End Sub
 
 ¿Es mejor hacerlo con un bucle do while o mediante el commandbutton? Depende de lo que se pretenda. A veces hay múltiples maneras de hacer las cosas y ninguna de ellas puede decirse que sea mejor que otra, simplemente serían distintas alternativas. Posiblemente este problema se pueda resolver de más maneras, muchas veces hay múltiples alternativas. En este caso al ser un ejercicio fíjate en lo que pida el enunciado y hazlo de la forma que se adapte mejor a lo que indique el enunciado.
 
 Quizás me he alargado demasiado, si hay algo que no se entienda dímelo. Saludos.
- 
				Hola Alex,
 
 Te agradezco muchísimo tu respuesta. Todas las dudas aclaradas. Sobre todo te agradezco los dos ejemplos que me has puesto, tanto mediante el uso de Do..While y de cómo realizar el ejercicio mediante el uso de un TextBox.
 
 Repito, muchísimas gracias.
 
 Saludos.