Foros del Web » Programando para Internet » ASP Clásico »

Recorrido de matriz recordset desbordado (Corte de control)

Estas en el tema de Recorrido de matriz recordset desbordado (Corte de control) en el foro de ASP Clásico en Foros del Web. Hola Foreros! Tanto tiempo sin preguntar... Les comento el problema que me está rompiendo la cabeza a ver qué se les ocurre. Tengo un recordset ...
  #1 (permalink)  
Antiguo 06/09/2010, 10:44
Avatar de verinchi  
Fecha de Ingreso: septiembre-2004
Ubicación: Buenos Aires
Mensajes: 647
Antigüedad: 20 años, 2 meses
Puntos: 2
Recorrido de matriz recordset desbordado (Corte de control)

Hola Foreros! Tanto tiempo sin preguntar...

Les comento el problema que me está rompiendo la cabeza a ver qué se les ocurre.
Tengo un recordset que almaceno en una matriz con la función GetRows de ASP y lo que quiero es, mediante la identificación del cambio de un dato, hacer un listado subtotalizado del contenido.

La idea general es esta:
En el recordset llamo: Mandante, Cliente, Credito, Monto
Esto lo coloco en la variable vecrs de tipo matriz con GetRows.
Los punteros se llaman igual que las columnas por una cuestión memotécnica

Abro el recordset
Código:
If not Rs.bof then
vercrs=Rs.GetRows()
Else
Nodata=1 'Para mensaje si no hay datos
End if
Esto va bien.
Luego, en la página, dado que los datos vienen ordenados por la columna mandante hago lo siguiente (No pongo el htm para que se vea más claro)
Código:
'Con i seteado a 0 al inicio
Manterior=vecrs(Mandante,i)
While i<Ubound(vecrs,2)
    Mandante: vecrs(Mandante,i)
    while i<Ubound(vecrs,2 and Manterior=vecrs(Mandante,i)
      Imprimir datos
      Sumar acumulador
     i=i+1
     Wend
     Acumular total general
     acumulador a cero
 wend
Imprimir total general
Esto es a grandes rasgos. Obviamente, acumulo con variable=variable+valor
Hago conversiones de tipos de datos en los enteros, formateos de números... cosas que no vienen al caso.

El asunto es que, colocando i<ubound(vecrs,2) me lista solo un dato de los dos que se que devuelve la consulta

Si coloco i<=ubound(vecrs,2) me da subíndice fuera de intervalo en la línea while i<Ubound(vecrs,2 and Manterior=vecrs(Mandante,i)

Alguien sabe de qué forma puedo resolverlo? Porque la idea en general, y en otros lenguajes, es muy simple. Un corte de control sobre un elemento, recorriendo una matriz con un bucle combinado.
La "Lectura" de la matriz se realiza en el punto más interno de los cortes (el i=i+1) y debería hacerlo.

Sin pasar el recordset a matriz es peor, directamente da exepción en la línea donde tengo el while con doble condición y ni caso...

Es urgente, cualquier sugerencia será bienvenida y debidamente probada. Gracias!
__________________
Why can't we not be sober?
www.partitorium.com.ar
  #2 (permalink)  
Antiguo 06/09/2010, 11:23
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 9 meses
Puntos: 146
Respuesta: Recorrido de matriz recordset desbordado (Corte de control)

Te esforzaste tanto en ser clara que no te entendí

Ese código esta muy raro y no entiendo lo que qiueres que haga, ¿qué te parece si lo cambiamos?, necesitas recorrer una matriz acumulando y cuando algo
cambie quieres imprimir ¿cierto?
  #3 (permalink)  
Antiguo 06/09/2010, 11:50
Avatar de verinchi  
Fecha de Ingreso: septiembre-2004
Ubicación: Buenos Aires
Mensajes: 647
Antigüedad: 20 años, 2 meses
Puntos: 2
Respuesta: Recorrido de matriz recordset desbordado (Corte de control)

Jajaja bueno, ya puse las lineas htm en subrutinas para limpiar el código, así que puedo copiarlo...

Código:
Topvec=Ubound(vecrs,2)
    while (i< Topvec)
        Call ImprimirCabecera(Manant)
        Curman=vecrs(Nroman,i)
        While  ((i< Topvec) AND (Manant=Curman))
            Call ImprimirLinea(vecrs(NroCte,i), vecrs(NroCredito,i), vecrs(DebitoMandan,i))
            AcumMan=Ccur(AcumMan)+Ccur(vecrs(DebitoMandan,i))
             i=i+1
            Curman=vecrs(Nroman,i)
         wend
         If vecrs(NroMan,i)<>"" Then
            Manant=Cint(vecrs(NroMan,i))
        Else
            Manant=""
        End if
         Call ImprimirSubtotal (AcumMan)
        AcumGen=Ccur(AcumGen)+Ccur(AcumMan)
         AcumMan=0
     Wend
     Call ImprimirTotal(AcumGen)
Y el resultado que espero es este:

Mandante 1 - Nombre
Cliente | Credito | Monto
Cliente | Credito | Monto
Subtotal | Acumulados
Mandante 2 - Nombre
Cliente | Credito | Monto
Cliente | Credito | Monto
Subtotal | Acumulados
Total General: Total Acumulados

Y por las dudas, la tabla trae:

Mandante, Cliente, Credito, Monto
Mandante, Cliente, Credito, Monto
Mandante, Cliente, Credito, Monto
Mandante, Cliente, Credito, Monto
Mandante, Cliente, Credito, Monto
Mandante, Cliente, Credito, Monto...

Ordenado por Mandante :)
__________________
Why can't we not be sober?
www.partitorium.com.ar
  #4 (permalink)  
Antiguo 06/09/2010, 13:01
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 9 meses
Puntos: 146
Respuesta: Recorrido de matriz recordset desbordado (Corte de control)

mmmmm

a ver ...

UBound te regresa el número de elementos de la dimensión que indicas, por ejemplo 2, y tienes un ciclo mientras i sea menor a 2, pero en el ciclo interno, cuando esa condición se cumpla de todas formas incrementas i en uno y haces una asignación, supongo que por eso te truena.
  #5 (permalink)  
Antiguo 22/09/2010, 20:25
Avatar de verinchi  
Fecha de Ingreso: septiembre-2004
Ubicación: Buenos Aires
Mensajes: 647
Antigüedad: 20 años, 2 meses
Puntos: 2
Respuesta: Recorrido de matriz recordset desbordado (Corte de control)

Aquí voy de nuevo... me ausenté del tema pero el problema continúa.

El hecho es este (por lo menos así lo supongo)

En mi código tengo, en forma resumida:

Código:
i=0
Manterior=vec(mandante)
While i<= ubound (vec)
  imprime titulo 
   while (i<=ubound(vec) and vec(mandante)=Manterior)
     Imprimir datos
     Acumular
     i=i+1
   wend
   acumularGeneral
wend
Y el asunto es la condición.
Cuando coloco
while i<ubound(vec)
lista todo bien pero falta un dato

cuando pongo i<=ubound(vec) el error lo da en la línea que combina ambas condiciones

while (i<=ubound(vec) and vec(mandante)=Manterior)
Supongo que esto es porque no rebota con que la primer condición no se cumpla, sino que quiere comparar igual el elemento siguiente con la variable...

Lo que se me ocurre, pero no consigo implementar, es colocar un "on error resume next" pero el hecho es... ¿Dónde?

El ejemplo simplificado tiene dos niveles para hacerlo más simple a la vista, el real tiene uno más, pero ese creo que no sería el problema, el tema es que una vez que uso este manejador de error, no se donde colocar la verificación del estado de error, vacía porque no me interesa registrar este suceso, sino que muestre del primero al ultimo elemento con todas las condiciones que quiero...

Se hizo larga la explicación, pero espero que se entienda.

Obviamente, terminado el rollo de los bucles hay una impresión de totales, y supuse que poniendo el manejador de error antes de la línea de totales (de ultima que ponga los totales en caso de error, total se que siempre va a suceder) pero se me quemó el coco y no queda. No se que sigue buscando pero supera el tiempo de espera del server y nada... muestra el listado y el error de tiempo de espera :S
__________________
Why can't we not be sober?
www.partitorium.com.ar
  #6 (permalink)  
Antiguo 27/09/2010, 19:17
Avatar de verinchi  
Fecha de Ingreso: septiembre-2004
Ubicación: Buenos Aires
Mensajes: 647
Antigüedad: 20 años, 2 meses
Puntos: 2
Respuesta: Recorrido de matriz recordset desbordado (Corte de control)

Ay porfis!
Se que estoy muy embolada pero no logro resolverlo... a alguien le pasó algo parecido? No sale y no sale!
__________________
Why can't we not be sober?
www.partitorium.com.ar
  #7 (permalink)  
Antiguo 27/09/2010, 22:31
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 10 meses
Puntos: 98
Respuesta: Recorrido de matriz recordset desbordado (Corte de control)

Bueno, este es el típico caso en que a menos de que no hagamos una prueba de escritorio no vamos a atinarle pues tiene demasiadas condiciones.

A simple golpe de vista y congruente con la pregunta del manejador de errores, quizás debas ponerlo justo arriba del ciclo interior:

Código:
i=0
Manterior=vec(mandante)
While i<= ubound (vec)
  imprime titulo 
   on error resume next
   while (i<=ubound(vec) and vec(mandante)=Manterior)
     Imprimir datos
     Acumular
     i=i+1
   wend
   acumularGeneral
wend
Pregunta: ¿Es posible aislar tu código para poder ayudarte a depurarlo?


Saludos
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #8 (permalink)  
Antiguo 28/09/2010, 06:59
Avatar de verinchi  
Fecha de Ingreso: septiembre-2004
Ubicación: Buenos Aires
Mensajes: 647
Antigüedad: 20 años, 2 meses
Puntos: 2
Respuesta: Recorrido de matriz recordset desbordado (Corte de control)

Hola U_G! Gracias por tu respuesta.

Bien, el hecho es que... intenté aislarlo lo más que pude. Incluso cada impresión de texto en htm quedó en distintas funciones como imprimeCabecera, ImprimeLinea, ImprimeSubtotales, imprimeTotales.

Esto para que, no solo quede aislado acá, sino quede lo más parecido en la realidad al ejemplo que pongo.

El hecho sería, que hasta ahora no me funciona
Código:
 
 
do while (condición por vector solamente)
  ImpresiónTitulos
  on error resume next
  do While (condicion vector y variable anterior)
    Acumula
    on error resume next
    do while (Condicion vector, varAnterior1, varAnterior2)
       Acumula2, Imprime Linea
     loop
  loop
AcumulaSubtot
Variables a cero
loop
Imprime Totales
Esto lista todos los resultados, pero.... queda colgado con algo y da el error al final de tiempo de espera agotado para una petición.

Lo que supongo es que al final debería colocar un if(errNumber) algo, pero no se donde ponerlo para que salga definitivamente del bucle.

Lo que yo supongo es que hace problema el hecho que el error se da en el circuito más interno, salta al siguiente y se encuentra con el error del segundo nivel, salta al siguiente y encuentra el corte por el primer do while, y debería simplemente salir del bucle, pero no lo hace.

Si tan solo pudiera usar un exit1... o break.... algo! jaja
En fin, también debo tener la cabeza enredada de tanto darle vueltas al asunto que no le encuentro la solución.
Seguramente vos tendrás mejor idea que yo de lo que estoy haciendo mal.
__________________
Why can't we not be sober?
www.partitorium.com.ar
  #9 (permalink)  
Antiguo 28/09/2010, 10:03
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 10 meses
Puntos: 98
Respuesta: Recorrido de matriz recordset desbordado (Corte de control)

Hola...a lo mejor no estoy entendiendo bien el problema pero me parece que te estás complicando mucho, cuando revisé el post original vi la muestra de tus datos y básicamente solo es cambiar la cabecera en base al mandante y controlar los acumuladores cierto?

Quizás trataía cambiando un poco la aproximación:

Código:
'Obtener arreglo
ds = rs.getRows()
mandante = ""
total = 0

'iterar arreglo
for i = 0 to uBound(ds,2)
        'si el mandante es distinto al anterior
	if ds(0,i) <> mandante
		ImprimeCabecera
                'reasigna valor a mandante
		mandante = ds(0,i)
	end if
        'acumula
	total = total + ds(3,i)

        'imprime registro
	Imprime(ds(1,i)'cliente, ds(2,i)'credito, ds(3,i)'monto)
next

Ahora, para contestar lo del manejador de errores, quizas tengas que ponerlo inmediatamente despues de la linea donde se origina el error:

Código:
do while (condición por vector solamente)
  ImpresiónTitulos
  on error resume next
  do While (condicion vector y variable anterior)
    Acumula
    on error resume next
    do while (Condicion vector, varAnterior1, varAnterior2)
       if err.number <> 0 then
          exit do
       end if
       Acumula2, Imprime Linea
     loop
  loop
AcumulaSubtot
Variables a cero
loop
Imprime Totales

Ya nos diras mas cosas.


Saludos
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #10 (permalink)  
Antiguo 28/09/2010, 10:17
Avatar de verinchi  
Fecha de Ingreso: septiembre-2004
Ubicación: Buenos Aires
Mensajes: 647
Antigüedad: 20 años, 2 meses
Puntos: 2
Respuesta: Recorrido de matriz recordset desbordado (Corte de control)

Cita:
Iniciado por u_goldman Ver Mensaje
Hola...a lo mejor no estoy entendiendo bien el problema pero me parece que te estás complicando mucho, cuando revisé el post original vi la muestra de tus datos y básicamente solo es cambiar la cabecera en base al mandante y controlar los acumuladores cierto?

Quizás trataía cambiando un poco la aproximación:

Código:
'Obtener arreglo
ds = rs.getRows()
mandante = ""
total = 0
 
'iterar arreglo
for i = 0 to uBound(ds,2)
        'si el mandante es distinto al anterior
    if ds(0,i) <> mandante
        ImprimeCabecera
                'reasigna valor a mandante
        mandante = ds(0,i)
    end if
        'acumula
    total = total + ds(3,i)
 
        'imprime registro
    Imprime(ds(1,i)'cliente, ds(2,i)'credito, ds(3,i)'monto)
next

Ahora, para contestar lo del manejador de errores, quizas tengas que ponerlo inmediatamente despues de la linea donde se origina el error:

Código:
 
do while (condición por vector solamente)
  ImpresiónTitulos
  on error resume next
  do While (condicion vector y variable anterior)
    Acumula
    on error resume next
    do while (Condicion vector, varAnterior1, varAnterior2)
      if err.number <> 0 then
         exit do
      end if
       Acumula2, Imprime Linea
     loop
  loop
AcumulaSubtot
Variables a cero
loop
Imprime Totales

Ya nos diras mas cosas.


Saludos

Hola de nuevo U_G!
voy a probar lo que me decís de cambiar el while por for, aunque con poca fe. Esta noche estaré con eso de nuevo y te cuento.

El hecho es que necesito los bucles internos, no puedo manejarlo con condicionales porque en el ejemplo que puse aquí no quise embolar pero mi informe debe ser

Primer Nivel: Mandante
Segundo Nivel: Acumulado por Cliente
Tercer nivel: Acumulado por fecha
Subtotal por cliente
Subtotal por Mandante

Total General

Aclaro que obviamente, hay varios movimientos por mandante, a la vez que varios movimientos por cliente e incluso varios movimientos para el mismo cliente y la misma fecha. Lo más recomendable en estos casos es anidar bucles con varios niveles de condición para informar en cada break del bucle, el resultado de los acumuladores.

Con condicionales dentro del bucle lo probaré de todas maneras, ya a esta altura con que muestre el informe me conformo. Ya veré luego el tema con los manejadores de error... vos decís que justo debajo de la instrucción, antes incluso de acumular o mandar a imprimir....

ya te cuento que resulta de eso.

Mil gracias y bueno, en cuanto logre estandarizar una función para este tipo de listados que realmente utilizo con demasiada frecuencia y siempre tengo que darle vueltas para hacer andar... ya estaré compartiendola por aquí.
__________________
Why can't we not be sober?
www.partitorium.com.ar

Etiquetas: control, matriz, recordset, recorrido
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 09:13.