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

Modo normal y paso a paso, con diferentes resultados

Estas en el tema de Modo normal y paso a paso, con diferentes resultados en el foro de Visual Basic clásico en Foros del Web. No les ha pasado que cuando corren un programa que estan haciendo y notan que algo no les produce el resultado esperado y luego, corren ...
  #1 (permalink)  
Antiguo 13/05/2005, 19:09
 
Fecha de Ingreso: junio-2004
Mensajes: 392
Antigüedad: 19 años, 10 meses
Puntos: 0
Modo normal y paso a paso, con diferentes resultados

No les ha pasado que cuando corren un programa que estan haciendo y notan que algo no les produce el resultado esperado y luego, corren el programa paso a paso para averiguar cual es el error, todo sale como se supone que tiene que hacerse y el resultado es el correcto, sin haberle hecho ningun cambio?

Eso me ha pasado muchas veces y sobre todo cuando trabajo con ADODC, a veces parece que a la base de datos no le da tiempo a hacer algunas cosas a menos que lo haga paso a paso. En realidad no entiendo muy bien lo que pasa en esos casos.

Algun comentario?
  #2 (permalink)  
Antiguo 13/05/2005, 21:22
 
Fecha de Ingreso: mayo-2005
Mensajes: 2
Antigüedad: 19 años
Puntos: 0
Efectivamente me ha pasado. Ignoro si hay alguna solución modificando las propiedades de la conexión. Debe haberla. En ocaciónes, cuando busco un remedio rápido recurro al truco de detener la ejecución del programa justo donde la conexión parace fallar; poniendo por ejemplo un msgbox con algún comentario. Lo cual obliga al programa a detenerse al esperar la respuesta del usuario, y al continuar la ejecución parece darle tiempo a la conexión de 'hacer lo suyo'.

Pero claro esto es solo un truco medio sucio. Aunque funciona siempre. De todos modos, debe haber una solución mas digna de un buen programador. Si alguien la sabe, hágala saber.
  #3 (permalink)  
Antiguo 14/05/2005, 02:14
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
¿¿ Eso ocurre de verdad ??

La de cosas que hay que oir ...

¿Solución? Pues para seguir usando ese sistema, solo se me ocurre que te curres una cola de operaciones. Una manera de hacerlo es: un temporizador "salta" cada X tiempo (el suficiente para que una operación se realice) y realiza la acción que se sitúa en el principio de la "cola". Cada vez que quieras hacer algo en la BD deberás llamar a una función que cree una nueva "operación" y que lo ponga en el final de la cola. Así todos las operaciones se efectuarán y por orden.

Si no sabes como hacer colas avisa.

Última edición por MaxExtreme; 14/05/2005 a las 03:26
  #4 (permalink)  
Antiguo 14/05/2005, 05:55
 
Fecha de Ingreso: junio-2004
Mensajes: 392
Antigüedad: 19 años, 10 meses
Puntos: 0
Exactamente a eso es que me refiero rigobertsong, tiene que haber una forma mas elegante de solucionar estos problemas. No habia pensado en eso de poner un mensaje, y creo que esa va a ser mi solucion preferida por ahora. El ultimo problema que tuve, lo tuve que solucinar con una serie de Requerys, Updates y Closes sin sentido.

Como comente con MaxExtreme en otro post, para este tipo de cosas necesito saber exactamente como funciona la base de datos, no un conocimiento superficial como el que tengo ahora (por cierto, lei el tutorial Max, pero todavia sigo teniendo problemas, y otra cosa es que ellos usan variables que crean para manejar la base de datos, yo uso el control ADODC).

En cuanto a lo de hacer colas, no entiendo ni papa de lo que me quieres decir.
  #5 (permalink)  
Antiguo 14/05/2005, 12:56
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Te explico brevemente lo que es una cola... (Pero lo que deberías de hacer como siempre recomiendo es aprender a programar cosas como éstas antes de hacer aplicaciones finales).

Una cola es una manera de almacenar los datos, de tal manera que el primero que entra es el primero que sale.

Ahora tenemos una cola vacía
_________
|_______|
|_______|
|_______|
|_______|
|. . . . . .|
|. . . . . .|


Insertamos un elemento X
_________
|XXXXXX| <------ Aquí
|_______|
|_______|
|_______|
|. . . . . .|
|. . . . . .|

Insertamos un elemento Y, va después del X
_________
|XXXXXX|
|YYYYYY| <------ Aquí
|_______|
|_______|
|. . . . . .|
|. . . . . .|

Ahora sacamos un elemento, como "el primero en entrar es el primero en salir", se saca el primero, o sea XXXXXX, y por tanto, la cola queda así:
_________
|YYYYYY| <------ Ahora es Y el siguiente que saldrá
|_______|
|_______|
|_______|
|. . . . . .|
|. . . . . .|




Es el funcionamiento básico. Si por elemento llamamos "operación", tú vas mandando la operación que necesitas a la cola. Cada X tiempo (un Timer hará esa función) sacas la operación y la procesas. Así las operaciones se hacen con un margen de tiempo suficiente y en el orden que las has mandado.


Ahora el problema es decidir a qué llamarás "operación" para que represente una acción por ADO en la BD, además de implementar la cola...


¿Entiendes mejor a qué me refiero?
  #6 (permalink)  
Antiguo 14/05/2005, 19:39
 
Fecha de Ingreso: junio-2004
Mensajes: 392
Antigüedad: 19 años, 10 meses
Puntos: 0
Entiendo lo que dices, pero en cuanto a la forma de hacerlo la forma que estoy pensando es demasiado larga y complicada en algunos casos y ademas de resultar poco estetica (en cuando a forma de programacion).

Quiza es mucho pedir (y si asi es olvidalo), pero podrias darnos un pequeño ejemplo?
  #7 (permalink)  
Antiguo 15/05/2005, 04:26
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
¿Estética? Si programas una cola te queda muy elegante y profesional (si es que no hay otra solución más evidente claro), en vez de poner un MsgBox para darle tiempo.

En VB cómo hacerlo... Bueno te voy a poner un ejemplo de una cola sencilla para que te fijes, pero después debes usar "el esquema" para hacer la tuya que contenga "operaciones" o como te lo quieras montar...

Código:
Option Explicit


' --------------
' COLA
' --------------
Dim nElementos As Integer
Dim Elementos() As String


Private Sub Form_Load()
    nElementos = 0
    ReDim Elementos(nElementos)
End Sub


Private Function ColaMeter(Nuevo_Elemento As String)
    nElementos = nElementos + 1
    ReDim Preserve Elementos(nElementos)
    Elementos(nElementos) = Nuevo_Elemento
End Function


Private Function ColaSacar() As String
    Dim i As Integer
    Dim tmp() As String
    
    If nElementos > 0 Then
        ColaSacar = Elementos(1)
        nElementos = nElementos - 1
        ReDim tmp(nElementos)
        For i = 1 To nElementos
            tmp(i) = Elementos(i + 1)
        Next
        ReDim Elementos(nElementos)
        For i = 1 To nElementos
            Elementos(i) = tmp(i)
        Next
    End If
    
End Function






' --------------
' EJEMPLO DE USO
' --------------
Private Function CopiarElementos()
    Dim i As Integer
    Label.Caption = ""
    For i = 1 To nElementos
        Label.Caption = Label.Caption & Elementos(i) & vbCrLf
    Next
End Function


Private Sub Meter_Click()
    ColaMeter InputBox("Elemento a meter", "Meter elemento")
    CopiarElementos
End Sub


Private Sub Sacar_Click()
    MsgBox "Hemos sacado: " & ColaSacar()
    CopiarElementos
End Sub
Controles:
- CommandButton Meter
- CommandButton Sacar
- Label Label

Para tu aplicación simplemente en vez de sacarlo con un botón, lo haces con un timer. Si no hay más operaciones, no ocurre nada ni genera error.

Ahora el problema es cómo hacer que cada elemento (yo lo he hecho con String) represente una operación. Pero por ejemplo si es SQL, puedes meter en la string cada sentencia SQL. Simplemente la metes con la función ColaMeter y el timer la sacará a su debido tiempo. En el timer debes usar ColaSacar para obtener la operación a realizar, y mandarla a la BD.

Esas funciones las puedes generalizar con Any y valores pasados por referencia y las tienes para usar donde quieras y cuantas veces quieras, o crearte una clase "cola" que lo haga por ti todo (C++ lleva estas clases ya hechas para cualquier tipo de dato )

¿Más elegante que eso? Creo que no ha quedado como una mala "programación".

Lo único que me sorprende es que la base de datos no lleve su propia cola de operaciones para que no ocurran cosas como que no le de tiempo.

PD: ¿Esta solución es digna de un buen programador?

Última edición por MaxExtreme; 15/05/2005 a las 04:42
  #8 (permalink)  
Antiguo 15/05/2005, 05:38
 
Fecha de Ingreso: junio-2004
Mensajes: 392
Antigüedad: 19 años, 10 meses
Puntos: 0
Cita:
PD: ¿Esta solución es digna de un buen programador?
Todavia esta enredada para mi gusto, pero en realidad es una solucion genial, muy ingeniosa. La culpa la tiene microsoft, porque deberia hacer que no ocurra este tipo de error en la base de datos o facilitar un metodo que evite esto (claro que todavia queda por ver si en lo que aprendo mas de base de datos no descubro que en realidad ya lo han hecho, o que en realidad estoy programando mal porque no tomo en consideracion algo que debo).

Gracias MaxExtreme, creo que con esto puedo resolver por ahora.
  #9 (permalink)  
Antiguo 15/05/2005, 06:53
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Microsoft tiene la culpa de todo ...
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #10 (permalink)  
Antiguo 15/05/2005, 07:17
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por Iodem Asakura
Todavia esta enredada para mi gusto, pero en realidad es una solucion genial, muy ingeniosa. La culpa la tiene microsoft, porque deberia hacer que no ocurra este tipo de error en la base de datos o facilitar un metodo que evite esto (claro que todavia queda por ver si en lo que aprendo mas de base de datos no descubro que en realidad ya lo han hecho, o que en realidad estoy programando mal porque no tomo en consideracion algo que debo).

Gracias MaxExtreme, creo que con esto puedo resolver por ahora.
Teóricamente la cola que te he propuesto la debe de llevar la BD, no la aplicación cliente, es algo que se ve a simple vista y no creo que sea realmente por falta de tiempo para procesar las peticiones. Tal vez lo que ocurra es que mandas hacer 10 cosas, las pone en la cola la BD, inmediatamente consultas un dato de la BD relacionado con eso, y la BD te lo devuelve pero aún no lo había modificado, aunque después lo haga.

Si es así podrías usar la cola como remedio o poner un timer y consultar la BD cada X tiempo para que en tu programa aparezcan los datos actualizados, aunque no aparezcan inmediatamente después de la orden.

En cualquier caso la manera de programar con la cola es buena y evita cualquier tipo de problema si es por tiempo de procesado... Y si te parece "enredado" deberías practicar antes más a programar cosas de esas... En cualquier caso ya sólo tienes que usar ColaMeter y ColaSacar, así que...

De nada por la solución Úsala y me cuentas si funciona 0=)

PD: Estas cosas y otras son las que suelen diferenciar quien sabe C y quien no... Por eso mismo recomendamos aprenderlo.
  #11 (permalink)  
Antiguo 15/05/2005, 10:56
 
Fecha de Ingreso: junio-2004
Mensajes: 392
Antigüedad: 19 años, 10 meses
Puntos: 0
Es increible lo que nos hacen hacer, yo supongo que lo que tienen que hacer es que la base de datos no te permita hacer las peticiones si tiene trabajo de actualizacion pendiente por realizar, de esta manera nos ahorramos todo este lio. Si le haces una consulta, mientras esta actualizando, que te arroje el resultado despues de actualizar, aunque se tarde 10 años.

De todas formas gracias por tu ayuda, supongo que tendre que hacerlo asi desde ahora.

Otra cosa, yo se programar en C, pero aparentemente no tan profundamente como tu. Crees que me podrias recomendar algun tutorial que me ayude a adquirir el conocimiento que crees que necesito? (No creas que soy muy vago para ponerme a buscar un tutorial, lo que pasa es que, como sabras, abran muchisimos que son muy basicos, o que llegan hasta donde yo se, ademas no se que tipo de conocimiento sugieres que aprenda. Asi que seria genial si tu tuvieras algo que me pueda ayudar en esto.)

P.D.: Disculpa las molestias
  #12 (permalink)  
Antiguo 15/05/2005, 13:16
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Pues de C coméntame qué sabes...

Lo que debes de hacer es aprender toda su sintaxis (que es muy pequeña), y a partir de ahí "jugar" con la memoria dinámica: Crear listas simples, dobles, circulares, colas, pilas...

Así hasta aprender cómo funciona el rollo...
  #13 (permalink)  
Antiguo 16/05/2005, 04:39
 
Fecha de Ingreso: junio-2004
Mensajes: 392
Antigüedad: 19 años, 10 meses
Puntos: 0
Creo que se mucho de la sintaxis de C, es dificil decir lo que uno sabe de un lenguaje de programacion. Asi que si necesitas que te diga lo que se de C para ayudarme, lo veo un poco dificil. Pero gracias de todas formas.
  #14 (permalink)  
Antiguo 16/05/2005, 06:17
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Pues es que de C saber la sintaxis no tiene mucha complicación, dado que es muy pequeña comparada con otros lenguajes.

Lo que te preguntaba era si manejabas punteros, arrays, funciones, etc etc... Supongo que la sintaxis la sabes (si no, coge un tutorial).
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 10:54.