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

Ayuda!!Espacio de pila insuficiente

Estas en el tema de Ayuda!!Espacio de pila insuficiente en el foro de Visual Basic clásico en Foros del Web. Buenas tardes compañeros! Tengo un problema que no soy capaz de solucionar, y lo que es más, no me lo explico. Bien, estoy haciendo un ...
  #1 (permalink)  
Antiguo 31/01/2011, 14:31
Avatar de pacoelherrero  
Fecha de Ingreso: enero-2011
Mensajes: 5
Antigüedad: 13 años, 9 meses
Puntos: 0
Pregunta Ayuda!!Espacio de pila insuficiente

Buenas tardes compañeros!
Tengo un problema que no soy capaz de solucionar, y lo que es más, no me lo explico.
Bien, estoy haciendo un formulario que me calcule los años de trabajo que llevan los operarios en la empresa mediante una base de datos access ligada a VB 6.
Bueno, tengo un textbox con la fecha actual, otro textbox con la fecha en el que el operario ingresó en la empresa y otro que me dice los años que lleva trabajando.
Pongo un ejemplo para que me entendais mejor.
Text1=31/01/2011 ' fecha actual
Text2=01/03/2000 'fecha en la que ingresó un operario
Text3=11 'Años que llevará el operario una vez acabado el año

Bien, lo que quiero solucionar es que el text3 me calcule los años de trabajo que lleva a día de hoy. Es decir, como la fecha actual es 31/01/2011 y él ingresó el 01/03/2000 todavía no ha hecho los 11 años, pero el text3 pone 11.

Lo intente solucionar con dos códigos distintos pero los dos arrojaron idéntico resultado: "Error '28' en tiempo de ejecución: Espacio de pila insuficiente".

Os pongo uno de los códigos por si el error estuviera en él.

Private Sub TextAñosServicio_Change()
Dim variable As Integer
If CDate(Form3.TextDiaHoy.Text) < CDate(Form3.TextNuevoAñoServicio.Text) Then
Data1.Recordset.Edit
variable = Form3.TextAñosServicio.Text
Form3.TextAñosServicio.Text = variable - 1
Data1.Recordset.Update
End If
End Sub

Cuando se aborta la ejecución del programa y le das al boton "depurar" sale sombreado en amarillo la línea que he resaltado con color azul.

Espero que haya sido claro, y que alguien sea capaz de solucionarme este dilema.

Gracias adelantadas!
  #2 (permalink)  
Antiguo 31/01/2011, 16:27
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años
Puntos: 53
Respuesta: Ayuda!!Espacio de pila insuficiente

Hola, este error según creo, se te produce porque estas metiendo el programa en un bucle interminable:

Private Sub TextAñosServicio_Change()
Dim variable As Integer
If CDate(Form3.TextDiaHoy.Text) < CDate(Form3.TextNuevoAñoServicio.Text) Then
Data1.Recordset.Edit
variable = Form3.TextAñosServicio.Text
Form3.TextAñosServicio.Text = variable - 1
Data1.Recordset.Update
End If
End Sub

Dentro del evento Change, estas cambiando la misma variable que produce el evento, son lo cual se convierte en un cambio continuo que agota el espacio de pila.

El calculo deberías efectuarlo en otro evento o pulsando un boton.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #3 (permalink)  
Antiguo 01/02/2011, 00:37
Avatar de pacoelherrero  
Fecha de Ingreso: enero-2011
Mensajes: 5
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Ayuda!!Espacio de pila insuficiente

Muchas Gracias erbuson!
Puede que ese sea el problema. Intentaré lo que dices.

Pero antes, una ultima cosa. Lo que intento es que al cambiar de operario salga automáticamente los años trabajados a día de hoy. ¿Sabes si se puede ejecutar un botón mediante código?
Así podría solucionar el problema, ya que insertaría el codigo en el boton "Siguiente","Anterior", y "Entrar".
O bien, a ver si me podías echar una manilla y decirme que evento es el más apropiado.

Otra vez muchas gracias!
  #4 (permalink)  
Antiguo 01/02/2011, 03:07
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 9 meses
Puntos: 89
Respuesta: Ayuda!!Espacio de pila insuficiente

Como te han dicho, el error que te da es porque entra en una serie de llamadas recursivas infinitas.

Para el otro problema, ¿Por qué no usas la función DateDiff? ¿Por qué recalculas los años de servicio cuando se cambian los años de servicio? ¿No habría que calcularlos cuando se cambie la fecha de hoy o la fecha de entrada a la empresa?
  #5 (permalink)  
Antiguo 01/02/2011, 06:21
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años
Puntos: 53
Respuesta: Ayuda!!Espacio de pila insuficiente

Hola, un evento apropiado sería el LostFocus que se produce cuando el campo pierde el foco de entrada, o sea, cuando sales de el, ya sea pulsando tabulación, o un botón.

De todos modos en este caso deberías comprobar si el campo está vació ya que puede que no siempre abandones el campo para efectuar el cálculo, por ejemplo seguro que abandonas el campo cuando pulsas el botón de SALIR y entonces es evidente que no debe efectuar la operativa.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #6 (permalink)  
Antiguo 02/02/2011, 09:47
Avatar de pacoelherrero  
Fecha de Ingreso: enero-2011
Mensajes: 5
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Ayuda!!Espacio de pila insuficiente

Cita:
Iniciado por Heimish2000 Ver Mensaje
Como te han dicho, el error que te da es porque entra en una serie de llamadas recursivas infinitas.

Para el otro problema, ¿Por qué no usas la función DateDiff? ¿Por qué recalculas los años de servicio cuando se cambian los años de servicio? ¿No habría que calcularlos cuando se cambie la fecha de hoy o la fecha de entrada a la empresa?
Bueno, perdón por contestar tan tarde. Primero contestare a Heimish.

Bien, en cuanto a las preguntas que me haces, no utilizo DateDiff porque no tiene en cuenta los dias y los meses en las fechas. Para fechas menores a un año, siempre devuelve 1. Y eso es precisamente lo que pretendo evitar.
Ej:
Fecha1= #01/12/2002#
Fecha2= #04/02/2003#
La diferencia en años es 0, ya que la diferencia son realmente 3 días y dos meses. Sin embargo poniendo Diferencia: DifFecha("yyyy";[fecha1];[fecha2]) sale 1.
Es por eso por lo que intento recalcular los años de trabajo de los operarios, para cuando ocurra un caso como el anterior el valor que me devuelva sea 0. Evidentemente con el Evento Change() no me ha ido bien, pero pense en él porque quería que al pasar de un operario al siguiente, mediante un control data, me recalculara los años trabajados restándole 1 cuando la diferencia entre las fechas no fueran exactamente de un año.

Espero me hayas comprendido bien. De todas formas muchas gracias por tu aportación!
  #7 (permalink)  
Antiguo 02/02/2011, 09:55
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 9 meses
Puntos: 89
Respuesta: Ayuda!!Espacio de pila insuficiente

Puedes usar DateDiff en dias y dividirlo por 365, así obtendras el resultado en años

Con respecto a lo otro, puedes usar el Change, pero no del Text3, si no de Fecha1 y Fecha2, de tal manera que al pasar de un operario a otro, cambiará la Fecha1 y/o la Fecha2 (si no cambia ninguno, no pasa nada, la diferencia seguirá siendo la misma y por tanto no hay nada que recalcular) y por tanto se recalculará tu resultado.

No se si me he explicado bien en el segundo párrafo, pero vamos, la idea es que cuando cambie una de las dos fechas que quieres restar, es cuando tienes que hacer la resta.
  #8 (permalink)  
Antiguo 02/02/2011, 13:31
Avatar de pacoelherrero  
Fecha de Ingreso: enero-2011
Mensajes: 5
Antigüedad: 13 años, 9 meses
Puntos: 0
De acuerdo Respuesta: Ayuda!!Espacio de pila insuficiente

Gracias a los dos! Tanto a Erbuson como a Heimish2000, pero ya di con la solución.
Gracias por responder y darme ideas, así me habeis hecho recapacitar.

Al final lo solucione en la base de datos access, creando nuevos campos en una consulta con los códigos que siguen. Cada punto es un nuevo campo, y el código que utilicé lo plasmo por si alguien lo necesita alguna vez.

1. AÑO_HOY: ParcFecha("yyyy";Fecha())
2. AÑOS_SERVICIO: ([AÑO_HOY]-[AÑO_INGRESO]) ' AÑO_INGRESO es un dato que proviene de una tabla access.
3. NUEVO_AÑO_SERVICIO: AgregFecha("yyyy";[AÑOS_SERVICIO];[INGRESO_TRIENIOS]) 'Al igual que AÑO_INGRESO, INGRESO_TRIENIOS proviene de una tabla access.
4. AÑOS_SERVICIO_REAL: SiInm([NUEVO_AÑO_SERVICIO]>Fecha();[AÑOS_SERVICIO]-1;[AÑOS_SERVICIO])

Y funciona perfectamente!!!

Eso si, antes de dar el tema por cerrado quería agradecer a Erbuson y a Heimish2000 su interés y sus respuestas, si bien lo que necesitaba era que una vez se pasara de un operario a otro mediante los botones "siguiente", "anterior", "último" y "primero", la base datos conectada a un control data se actualizara. Mostrando así, los distintos años trabajados de cada uno. De la forma que tenía montado el programa fue la mejor solución, o por lo menos, la que me funcionó. JAJAJAJAJA! Vuestras respuestas fueron muy buenas y me ayudaron a formarme un poco más en este mundillo, pero en fin, a mi me dió resultado con el código mostrado.

De nuevo, Gracias!!!
  #9 (permalink)  
Antiguo 02/02/2011, 16:43
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 18 años, 3 meses
Puntos: 29
Respuesta: Ayuda!!Espacio de pila insuficiente

El modo de solucionar el que se hagan las llamadas redundantes a la sub del evento Change sería p.ej. crear una variable que le avise de que ya se está ejecutando esa sub y no entre hasta que no termine la primera ejecución:

Código vb:
Ver original
  1. Private Sub Text_Change()
  2.   Static EstoyEnUso As Boolean
  3.   If EstoyEnUso = True Then Exit Sub
  4.   EstoyEnUso = True
  5.  
  6.  
  7. .....tu codigo
  8. ...
  9.  
  10.   EstoyEnUso = False
  11. End Sub
Saludos

PD: Puede parecer un "parche", y lo es , ya que permite no tener que modificar lo que tienes o buscar otros métodos.
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!
  #10 (permalink)  
Antiguo 08/02/2011, 00:17
Avatar de pacoelherrero  
Fecha de Ingreso: enero-2011
Mensajes: 5
Antigüedad: 13 años, 9 meses
Puntos: 0
De acuerdo Respuesta: Ayuda!!Espacio de pila insuficiente

Gracias PKJ!! Me parece una muy buena idea!!
Para la próxima vez utilizaré tu código.

Etiquetas: Ninguno
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 11:48.