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

Ayuda por favor

Estas en el tema de Ayuda por favor en el foro de Visual Basic clásico en Foros del Web. Hola a todos! Estoy intentado trabajar con un array pero debido a mi desconocimiento no se si la he declarado bien o es otro error. ...

  #1 (permalink)  
Antiguo 27/04/2010, 02:02
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años, 8 meses
Puntos: 0
Ayuda por favor

Hola a todos!

Estoy intentado trabajar con un array pero debido a mi desconocimiento no se si la he declarado bien o es otro error.

Código vb:
Ver original
  1. ' --------------------------------------------------------------------------
  2. ' \\ -- Subrutina para verificar que cantidad de semanas hay en Horas.dat.
  3. ' --------------------------------------------------------------------------
  4.  
  5. Public Sub ContadorSemanas()
  6.  
  7.  
  8. Dim Nsemana As Integer
  9. Dim NRegistro As Integer
  10. Dim i As Integer
  11.  
  12. 'Declaracion array Csemanas
  13. Dim CSemanas() As Variant
  14. D = LOF(Numero) / 94
  15. RegUltimo = LOF(Numero) / 94
  16.  
  17. ReDim CSemanas(D, 1)
  18.  
  19. For i = 1 To D
  20.     With Horas
  21.     Get #Numero, RegUltimo, Horas
  22.     Nsemana = .semana
  23.     NRegistro = RegUltimo
  24.     RegUltimo = RegUltimo - 1
  25.     End With
  26.         MsgBox Nsemana & " , " & NRegistro & " , " & i
  27.         If i > 0 Then
  28.             If CSemanas(i, 1) <> CSemanas(i - 1, 1) Then
  29.             CSemanas(i, 0) = NRegistro
  30.             CSemanas(i, 1) = Nsemana
  31.         End If
  32.     End If
  33.     MsgBox CSemanas(i, 1) & " , " & CSemanas(i - 1, 1)
  34. Next i
  35.  
  36. MsgBox UBound(CSemanas, 1) & "  " & LBound(CSemanas, 2)
  37.  
  38. NrSemanas = UBound(CSemanas, 1)
  39.  
  40. End Sub


Mi intención hasta aqui es saber si me funciona y como prueba le pido al final que me visualice el tamaño de la misma, si el tamaño de la matriz es igual a 12,0 no me ha hecho nada, por otro lado el 2º MsgBox me deberia dar o es lo que pretendo lo que hay en la matriz en la entrada actual y la anterior pero el resultado es blanco, blanco y en el primero visualizo los datos que he de guardar en la matriz¿Donde tengo el error?

Como dato a añadir los datos que lee y corresponden a Nsemana son : 19,19,18,18,18,18,18,18,17,17,17,17 y naturalmente el registro es 12,11,10,9 . . . 3,2,1 si la sentencia se me ejecutara perfectamente el MsgBox UBound(CSemanas, 1) & " " & LBound(CSemanas, 2) me deberia visualizar 3,0 y es lo que no me hace ademas de los valores blanco, blanco, le he dado 1000 vueltas y no veo el error, no se lo que hago mal o si no hay nada bien.

Ayuda por favor.

Un saludo y 1000 gracias

Última edición por XYON126; 28/04/2010 a las 00:42
  #2 (permalink)  
Antiguo 27/04/2010, 03:05
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: Problemas con Arrays y vectores.

.........................................

Última edición por XYON126; 27/04/2010 a las 05:21
  #3 (permalink)  
Antiguo 28/04/2010, 01:08
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años, 1 mes
Puntos: 53
Respuesta: Ayuda por favor

Hola amigo Xyon veo que andas liado con el asunto, y por mucho que miro el código no consigo saber que pretendes hacer. Si lo explicas un poco te echo un cabo.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #4 (permalink)  
Antiguo 28/04/2010, 01:56
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: Ayuda por favor

Cita:
Iniciado por erbuson Ver Mensaje
Hola amigo Xyon veo que andas liado con el asunto, y por mucho que miro el código no consigo saber que pretendes hacer. Si lo explicas un poco te echo un cabo.

Saludos
Hola compañero!

Muy, muy buenos dias eres el mejor socio, sin tu ayuda ya hubiese abandonado.Mira te cuento, el codigo de arriba lo que pretendo y que ya eres conocedor casi del resto pues tu y pkj sois los que me habeis echado una mano hasta ahora, es para lo siguiente.:

Del archivo Horas.dat que puede tener mil registros, varios por decirlo de alguna manera, grupos que los identifico con Nrpedido, un Nrpedido puede tener 200 registros o mas entre varios meses, años y semanas para poderlo visualizar en el MSflexgrid que ya conoces pues los dos exitentes uno es mensual y el otro semanal, para poder por un lado saber cuantas y que semanas(Nr. de semana) tiene cada pedido y/o mes, mi idea es con una matriz verificar todos los registros e irlos clasificando por Nrpedido, mes y semana.

En este codigo, he empezado con lo mas basico las semanas, de ahi que tenga como prueba 12 registros y en realidad solo tres semanas la 17,18 y 19, en el pretendo leer los 12 registros y guardar unicamente el 1er registro de cada semana y su Nr. de registro para posteriormente y ya conocedor de que registro corresponde el inicio de cada semana, con un Loop leo los registros del Horas.dat y lo inserto en el MsFlexgrid pero esto ya es otro tema y que ya hemos solucionado o eso creo.

Espero haberme explicado.

Un saludo y muchas gracias.
  #5 (permalink)  
Antiguo 28/04/2010, 02:38
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años, 1 mes
Puntos: 53
Respuesta: Ayuda por favor

Bueno, pues vamos allá, aunque lo primero que quisiera saber ya que tu comentario me confunde un poco es ¿ Todos los registros son del mismo año ? porque de no ser así estas mezclando semanas de un año y de otro.
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #6 (permalink)  
Antiguo 28/04/2010, 02:50
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: Ayuda por favor

Cita:
Iniciado por erbuson Ver Mensaje
Bueno, pues vamos allá, aunque lo primero que quisiera saber ya que tu comentario me confunde un poco es ¿ Todos los registros son del mismo año ? porque de no ser así estas mezclando semanas de un año y de otro.
Hola erbunson!

No, no, todos son del mismo año y pedido incluso en la prueba, por eso voy por los cimientos, despues ya me peleare con el tejado. De echo y es lo que me mosquea, es que en teoria a menos que no haya entendido nada sobre matrices, el codigo que escrito deberia funcionar y lo estraño es que la Matriz me dice que es de 12,0 que quiere decir que habra escrito algo pero cuando le pido la comparacion ..


If CSemanas(i, 1) <> CSemanas(i - 1, 1) Then . . .

tanto CSemanas(i, 1) como CSemanas(i - 1, 1) en el MsgBox me sale en blanco como si no hubiese nada en ninguno de los dos registro de la matriz.
o es que no se pueden comparar?

Un saludo
  #7 (permalink)  
Antiguo 28/04/2010, 03:02
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: Ayuda por favor

Hola erbunson!

Aqui pongo el codigo con mis pretensiones para poder aclarar y que se sepa my idea.

Código vb:
Ver original
  1. ' --------------------------------------------------------------------------
  2. ' \\ -- Subrutina para verificar que cantidad de semanas hay en Horas.dat.
  3. ' --------------------------------------------------------------------------
  4.  
  5.  
  6. Public Sub ContadorSemanas()
  7.  
  8.  
  9. Dim Nsemana As Integer
  10. Dim NRegistro As Integer
  11. Dim i As Integer
  12.  
  13. 'Declaracion array Csemanas
  14. Dim CSemanas() As Variant
  15. D = LOF(Numero) / 94
  16. RegUltimo = LOF(Numero) / 94
  17.  
  18. ReDim CSemanas(D, 1)
  19.  
  20. For i = 1 To D 'En este bucle pretendo leer todos los registros _
  21. 'solicitandole solo 2 datos .semana y el nr.de registro.
  22.    With Horas
  23.     Get #Numero, RegUltimo, Horas
  24.     Nsemana = .semana
  25.     NRegistro = RegUltimo
  26.     RegUltimo = RegUltimo - 1
  27.     End With
  28.         MsgBox Nsemana & " , " & NRegistro & " , " & i 'Me visualiza los datos a grabar.
  29.        If i > 0 Then 'Aqui pretendo comparar el ultimo registro guardado _
  30.         'con el actual y si es la misma semana lo omito y voy al siguiente.
  31.            If CSemanas(i, 1) <> CSemanas(i - 1, 1) Then
  32.             CSemanas(i, 0) = NRegistro
  33.             CSemanas(i, 1) = Nsemana
  34.         End If
  35.     End If
  36.     MsgBox CSemanas(i, 1) & " , " & CSemanas(i - 1, 1) 'Me deberia visualizar lo que _
  37.     'hay en esas partes de la Matriz.
  38. Next i
  39.  
  40. MsgBox UBound(CSemanas, 1) & "  " & LBound(CSemanas, 2) 'Me deberia informar del tamaño final de la Matriz _
  41. 'en mi caso 2,0 pues solo hay tres semanas en 12 registros la 17,18 y 19
  42.  
  43. NrSemanas = UBound(CSemanas, 1) ' Esto es para un contador externo.
  44.  
  45. End Sub

Un saludo

Última edición por XYON126; 28/04/2010 a las 03:17
  #8 (permalink)  
Antiguo 28/04/2010, 03:59
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años, 1 mes
Puntos: 53
Respuesta: Ayuda por favor

Hola:

A ver que te parece este código, que pretende hacer lo que tu quieres pero como ves de una manera mucho mas simple.

La Matriz Semanas(55) está definida fuera de la función para que puedas utilizarla posteriomente desde otra con los datos obtenidos.

Mi idea para no complicarnos la vida es crear una Matriz que como mucho podrá contener 52 o 53 semanas dependiendo del año pero nunca 55 y por otra parte la Semana 0 no se utilizará.

De este modo en cualquier punto del programa puedes preguntar:

If Semanas(5)=0 Then
' No tiene movimientos relacionados
Else
' Mostrar sus movimientos que empiezan en el Registro Semanas(5)
End If

Es una idea

Código vb:
Ver original
  1. Dim Semanas(55) As Single
  2.  
  3. Private Sub IndicesSemanas()
  4.   Dim Registro As Single
  5.   For Registro = 1 To LOF(Numero) / 94
  6.     Get #Numero, Registro, Horas
  7.     ' Si Semanas(x) tiene valor ya he leido el primer registro de esta semana
  8.    ' por lo tanto no le signo el valor del actual. Solo el Primero como quieres tu
  9.    If Semanas(Horas.Semana) = 0 Then Semanas(Horas.Semana) = Registro
  10.   Next
  11.   ' En un bucle posterior sabemos que si Semanas(1) o Semanas(5) o Semanas(x) son = 0 No tienen Registros
  12.  ' Si son distintos de cero empieza en ese registro
  13. End Sub
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #9 (permalink)  
Antiguo 28/04/2010, 04:26
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: Ayuda por favor

Hola erbunson!

No acabo de entender tu codigo, mejor dicho lo que quieres hacer.Aclarame si es esto.: Tu lees todos los registros de un archivo .dat y le consultas el número de semana a que corresponde cada registro, despues le consultas a la matriz si la semana es 0 "cero" o no, ¿Pero donde cargamos los valores de la matriz? no lo veo, perdon si los guardas aqui .:

If Semanas(Horas.Semana) = 0 Then Semanas(Horas.Semana) = Registro pero solo el Nr. de registro ¿Como puedo saber donde enpiezan los registros de la semana 27? Es un ejemplo.

pues si he entendido bien, tu solo guardas el 1er registro de cada semana y solo su número, hasta aqui igual a mi idea pero como puedo asociarlo despues con su semana.

Entiendes a lo que me refiero, ya que la Matriz es un Vector o de una sola dimension.

Un saludo

Última edición por XYON126; 28/04/2010 a las 04:51
  #10 (permalink)  
Antiguo 28/04/2010, 04:50
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años, 1 mes
Puntos: 53
Respuesta: Ayuda por favor

Hola, lo has entendido bien lo que no entiendes es porque no utilizo el número de Semana, veras, el 'truco' consiste en utilizar TODA la Matriz tenga o no tenga registros, como ves yo defino una matriz Semanas(55) o sea que tenemos

Semana(0)
Semana(1)
Semana(2)
Semana(3)
Semana(4)
....
Semana(54)
Semana(55)

Entonces el proceso lo que hace es utilizar el valor de Horas.Semana que puede variar desde 1 hasta 53 para saber el indice de la semana que estamos utilizando, suponte que el valor leido es Semana 15

Entonces comprueba si Semana(15) ya tiene un valor distinto de Cero, si es así significa ineludiblemente que previamente ha leido ya un registro para esta semana y que sabe en que registro empieza la semana 15. Si su Valor es 0 significa que es el primer registro que ha leido conteniendo la semana 15 y entonces asigna a Semana(15) = Registro para saber donde empieza la semana 15.

Cuando vayas ha hacer un proceso posterior tu indicas que semana quieres cargar por lo que sólo comprobando Semana(LaQueQuieras) ya sabes donde empieza.

Si no lo ves claro comenta, ya sabes que no es vencer sino convencer.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #11 (permalink)  
Antiguo 28/04/2010, 05:06
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: Ayuda por favor

Hola compañero!

Vale!!!! ya he pillado tu idea o asi creo, tu quieres jugar con bucles de consulta posteriores independientemente de si existe o no la semana en cuestión, eso con el bucle lo defino y con un bucle o select case, defino una vez localizada la semana lo que necesite hacer de ella.
Ahora va mi consulta, en mi codigo ¿Que es lo que esta mal para que no me ejecute el filtro realmente? Es mas por saber de donde fallo.

Un saludo
  #12 (permalink)  
Antiguo 28/04/2010, 05:28
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años, 1 mes
Puntos: 53
Respuesta: Ayuda por favor

Intentare sobre el mismo código ir comentando por partes:

Lo primero que me llama la atención es que empiezas por el final, aunque supongo que realmente lo que así consigues es que el último que habrás leido es es primero que entraste, cuando en mi sistema lo que hago es que cuando ya tengo un registro de esta semana, me olvido de los demás.

Utilizas el With Horas cuando realmente vas a usar sólo un campo entonces no tienes por que complicarte ya que la posterior lectura es mas facil.

* * Get #Numero, RegUltimo, Horas
* * Nsemana = Horas.semana

e incluso como ves en mi código usarlo directamente sin pasar por otra variable aunque sea poco seguro que algo lentifica el proceso

Defines Semanas con el número máximo de registros que tiene el fichero con lo cual cuando pasas de 53 estás desperdiciando memoria.

En la siguiente instrucción comparas innecesariamente si i > 0 porque si miras el For Next puedes comprobar que i nunca valdrá cero.

If i > 0 Then 'Aqui pretendo comparar el ultimo registro guardado _

La intención de guardar en Semanas(i) cuando i valdra de 1 a UltimoRegistro no la veo nada clara puesto que entonces tendrás registros intermedios sin datos, distinto sería que cuando encuentras una semana diferente aumentaras un contador aparte. Sin embargo piensa que estas comparando i con i-1 lo cual da por supuesto que los registros del fichero están ordenados por semanas no se si ello es cierto o no.

Respecto al tema de ORDENADOS piensa que si los registros del fichero pueden estar desordenados por semanas aunque no es lógico si siempre los vas añadiendo al final y son movimientos que se producen automáticos, si los grabas a partir de unos o documentos auxiliares entonces la cosa cambia porque podrían estar desordenados.

Si tu lo que quieres realmente es crear un Indice en memoria para posterior lectura entonces deberías actuar de otra manera que a la vez es muy sencilla.

Dimensionas como bien has hecho Semanas(D) con el número de Registros

Efectuas un Bucle

For i = 1 to D
Get #Numero, i, Horas
Semanas(i)=Horas.Semana
Next

De este modo consigues en la Matriz Semana tener en cada "Registro" su semana.

Si tu quieres después cargar los registros de una semana sin leer todo el fichero deberás:

For i = 1 To D
IF Semanas(i) = LaSemanaQueBuscas THEN
Get #Numero, i, Horas
' Procesar como quieras
End if
Next

Perdona por el rollo, hablamos ...
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #13 (permalink)  
Antiguo 28/04/2010, 05:29
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: Ayuda por favor

Hola erbunson!

Ya he encontrado un error de mi codigo "El porque del tamaño de la Matriz de 2,0 a 12,0" uno que es borrico, si la redefino antes del bucle siempre tendra un tamaño fijo, elemental. Pero una pregunta ¿Se puede redefinir el tamaño de una matriz sin que se modifiquen los datos existentes en esta? me explico. supongamos que tenemos una Matriz de 1x1 dentro de un bucle y al inicio le voy aumentando un parametro ejemplo 1x1, 2x1, 3x1, ..... 12x1 etc. a medida que se va aumentando el tamaño de esta ¿Se pierden sus datos o se mantienen en la posición en que se han introducido, naturalmente esta permitido lo acepta VB?

Un saludo
  #14 (permalink)  
Antiguo 28/04/2010, 05:50
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años, 1 mes
Puntos: 53
Respuesta: Ayuda por favor

Supongo que estas digeriendo mi mensaje anterior, pero sin embargo te contesto existe la funcion ReDim Preserve que permite hacer esto aunque SOLAMENTE se puede variar digamos el numero de Filas:

Puedes tener una Matriz(15,4) y puesdes hacer el Reim Preserve Matriz(20,4) pero nunca puedes Redim Preserve (15,5) por ejemplo.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #15 (permalink)  
Antiguo 28/04/2010, 05:51
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: Ayuda por favor

Hola erbunson!

El anterior post se ha adelantado a tu respuesta. Si! es cierto lo que comentas que empiezo desde arriba y la razón es que el Loop que tengo para rellenar el MsFlexgrid me empieza a leer de Domingo a Lunes, simplemente por esto ya que si lo hacia al reves me cargaba cosas de la semana siguiente y no entendi el porque.
Lo del Whit me he dado cuenta en tu codigo y ahora tenia intención de preguntartelo pero ya has respondido antes de mi consulta, ahora ya se que no es necesario siempre, que puedo hacer consultas directas sin el Whit.
Comentas lo del tamaño de la matriz, como en el anterior post y como bien comentastes tú el otro dia, todos somos humanos y la cagamos y eso es una Krosen cagaden mia, pues si yo pretendia tener una matriz del tamaño justo de registros habiles no debia redimensionarla al maximo antes del bucle, sino siempre tiene el maximo tamaño y no lo que yo necesito.
Y finalmente en el tema de ORDENADOS, dices que no siempre estan en orden, ¿Cuando ocurre esto o es aleatorio? dime si en mi caso es posible ahora te defino el proceso de creación del archivo.dat, Apertura del archivo: arranque del programa por 1ª vez., a partir de aqui cada vez que se arranca el programa siempre es secuencial con la unica diferencia que un dia se trabaje en tres pedidos con lo que puedan haber un maximo de 6 entradas de datos (entrada-salida) 3 veces y en los tres pedidos, pero los registros siempre en mi teoria deberian estar salteados pero ordenados de menor a mayor. ¿Es asi?

Un saludo
  #16 (permalink)  
Antiguo 28/04/2010, 05:53
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: Ayuda por favor

Cita:
Iniciado por erbuson Ver Mensaje
Supongo que estas digeriendo mi mensaje anterior, pero sin embargo te contesto existe la funcion ReDim Preserve que permite hacer esto aunque SOLAMENTE se puede variar digamos el numero de Filas:

Puedes tener una Matriz(15,4) y puesdes hacer el Reim Preserve Matriz(20,4) pero nunca puedes Redim Preserve (15,5) por ejemplo.

Saludos
Tienes razón estaba con el otro!

Si, si en mi caso solo es de Filas jamas de Columnas, con lo que me comentas entonces si es posible, ¿Tiene alguna limitación a mas a mas de la comentada?

Un saludo
  #17 (permalink)  
Antiguo 28/04/2010, 06:02
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años, 1 mes
Puntos: 53
Respuesta: Ayuda por favor

Efectivamente, si es como dices los registros estan ordenados por semanas ya que SUPONIENDO que la fecha del sistema esté correctamente los datos siempre se graban al final del archivo por lo tanto aunque sea un archivo RANDOM que tu puedes leer y modificar como te convenga, la entrada es Secuencial.

Como has visto he hecho un poco de énfasis en el suponiendo porque en informática normalmente TODA SUPOSICION es una cagada ya que los programadores por mucho que lo intentemos NUNCA conseguimos generar los errores que consiguen generar los usuarios finales y tanto nos sacan de quicio por lo que, no podemos dar por hecho que lo que pensamos así sucederá y toda previsión es poca.

De la manera que yo te indico en el ejemplo, SIEMPRE procesarás todos los registros que se hallen incluidos en una semana.

Piensa también que de igual manera pero con una matriz multidimensional puedes de una sóla lectura crearte una matriz de indices para buscar rapidamente cualquier dato del fichero sin releerlo, por ejemplo

DIM Indices(D,2)

Indices(D, 0) = Horas.Semana
Indices(D, 1) = Horas.Pedido
Indices(D, 2) = Horas.Cliente

En un Bucle puedes facilmente buscar por un dato u otro

For Indice = 1 to D
IF Indices(Indice, 0) = SemanaBuscada ......
IF Indices(Indice, 1) = PedidoBuscado ....
IF Indices(Indice, 2) = ClienteBuscado ....
Next

Se que te estoy machacando pero es para que te hagas una idea de las infinitas posibilidades y de que es mejor antes de embestir directamente al problema hacerse una idea de lo que se va a necesitar.

Saludos. Me voy a comer. Hablamos mas tarde.
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #18 (permalink)  
Antiguo 28/04/2010, 06:22
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: Ayuda por favor

Hola erbunson!

1º Que te aproveche, yo voy hacer lo mismo. Desde luego en este ultimo post y el anterior tuyo me has dado dos ideas bestiales y esta ultima me va a ir de perlas, pues era un asunto pendiente y ahora ya se como plantearlo.
Referente al ReDim Preserve ¿Lo que te permite variar en número que son las filas o las columnas? pues mirando en la ayuda de VB me da esta opcion .;

ReDim Preserve Matriz(10, UBound(Matriz, 2) + 1)

y me prohibe esta .:

ReDim Preserve Matriz(UBound(Matriz, 1) + 1, 10)

¿No se especifican siempre como (Fila, Columna) o es al contrario.

Un saludo
  #19 (permalink)  
Antiguo 28/04/2010, 07:26
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años, 1 mes
Puntos: 53
Respuesta: Ayuda por favor

Hola:

Tienes razón, he contestado de memoria y he contestado al reves, la única que se puede cambiar es la última.

Lo he utilizado bastante pero siempre con matrices de una dimensión ya que generalmente si debo utilizar filas y columnas acostumbro a utilizar directamente el MsFlexGrid

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #20 (permalink)  
Antiguo 29/04/2010, 01:08
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: Ayuda por favor

Cita:
Iniciado por erbuson Ver Mensaje
Lo he utilizado bastante pero siempre con matrices de una dimensión ya que generalmente si debo utilizar filas y columnas acostumbro a utilizar directamente el MsFlexGrid

Saludos
Hola erbunson!

Comentas que cuando te encuentras que debes usar filas y columnas usas directamente el MsFlexgrid, en mi caso ¿Como lo harias? una explicación, no codigo.
Ya que conoces exactamente los datos a procesar y las variantes que tengo.

Un saludo
  #21 (permalink)  
Antiguo 29/04/2010, 03:39
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años, 1 mes
Puntos: 53
Respuesta: Ayuda por favor

Hola Xyon:

Por ejemplo supongamos que tienes GridTrabajos con los datos cargados y que has reservado la columna 0 (cero) para el número de Registro, en la columna 3 tienes la semana y en la columna 5 tienes el pedido.

En este momento sabemos pues que GridPedidos.Rows-1 es el número d Registros que tenemos cargados.

Suponte que buscamos la semana 22

For Fila = 1 TO GridPedidos.Rows - 1
' Ejemplo 1
' Si quieres Buscar un Pedido la comparación sería ...
IF GridPedidos.TextMatrix(Fila, 5) = PedidoBuscado Then
' Si tenemos coindidencia
Registro = GridPedidos.TextMatrix(Fila, 0)
' Procesamos Registro
End If

' Ejemplo 2
' Si quieres Buscar una Semana la comparación sería ...
IF GridPedidos.TextMatrix(Fila, 3) = SemanaBuscada Then
' Si tenemos coindidencia
Registro = GridPedidos.TextMatrix(Fila, 0)
' Procesamos Registro
End If

Next


Ventajas, en todo momento y sin tener que mostrar Arrays ni hacer pruebas raras tu puedes ver en el Grid lo que te ha cargado y puedes decidir como utilizarlo.

Puedes tener un Grid auxiliar en tu programa que lo mantienes oculto y sólo lo verás tu cuando te convenga.

De este modo vas 'previsualizando' tu trabajo y vas haciendote mas a la idea de los resultados.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #22 (permalink)  
Antiguo 29/04/2010, 03:48
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: Ayuda por favor

Hola erbunson!

Una consulta sobre matrices y modulos, si yo quisiera crear la matriz de indices en un modulo, este ¿deberia ser en un .bas?, ¿VB que ejecuta primero el "Private Sub Form_Load()" o los Modulos, o es independiente?. ¿Las consultas a la matriz se la puedo hacer en cualquier parte del programa e incluso en algun otro formulario o no? (La declararia como " Public matriz(n,m) as Variant o Integer".


Sobre lo que comentas que "De este modo vas 'previsualizando' tu trabajo y vas haciendote mas a la idea de los resultados. el MsFlexgrid oculto" ¿Como lo ocultas como un formulario show True o False? aqui me has dejado fuera de juego.

Un saludo
  #23 (permalink)  
Antiguo 29/04/2010, 05:16
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años, 1 mes
Puntos: 53
Respuesta: Ayuda por favor

Respuesta a la primera pregunta: El contenido dle módulo BAS se ejecuta cuando tu lo llamas, nunca se ejecuta inicialmente a no ser un modulo Main o algo así. De momento no te preocupes.

La respuesta es correcta si tu le das la Propiedad Public la pudes llamar desde otro formulario, módulo, etc. Lo importante es logicamente que antes desde uno de los Load o donde mejor te convenga la hayas cargado de Datos.

El Grid simplemente con poderle la Propiedad Visible = False ya no lo verá nadie en pantalla y puedes tenerlo en cualquier sitio que te convenga ya que aunque esté oculto puedes acceder a sus datos. Cuando quieras verlo le pones la propiedad Visible en True y ya está

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #24 (permalink)  
Antiguo 29/04/2010, 06:07
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: Ayuda por favor

Hola erbunson!


Cita:
Iniciado por erbuson Ver Mensaje
El Grid simplemente con poderle la Propiedad Visible = False ya no lo verá nadie en pantalla y puedes tenerlo en cualquier sitio que te convenga ya que aunque esté oculto puedes acceder a sus datos. Cuando quieras verlo le pones la propiedad Visible en True y ya está
Dicho de otra manera, si en un formulario le meto un dibujito y a este le meto un comando para abrir otro formulario fantasma con el Msflexgrid, yo puedo ver los datos sin tener que cambiarle la Propiedad Visible cuando quiera. ¿Es asi?, Me gusta la idea.

Sobre el otro tema .:
DIM Indices(D,2)

Indices(D, 0) = Horas.Semana
Indices(D, 1) = Horas.Pedido
Indices(D, 2) = Horas.Cliente

Lo estoy digiriendo y supongo que aqui lo que haces es lo mismo que en la matriz(55) elementos pero multidimensional, pero que es mejor tenerlas dentro del Option explicit o en Modulos o es a gusto del programador.

Un saludo
  #25 (permalink)  
Antiguo 29/04/2010, 06:58
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años, 1 mes
Puntos: 53
Respuesta: Ayuda por favor

Respecto a la primera pregunta la respuesta es si, pero debes tener en cuenta que si lo colocas en un formulario diferente tienes que cargar primero el formulario y acordarte de descargarlo después. Se puede hacer, de hecho yo lo hago con una tabla de clientes por ejemplo que la tengo cargada en un formulario que muestro cuando me conviene.

Para el tema que te comentaba te cuento otra cosa que puedes hacer, suponte que tienes un formulario de 9000 de Ancho por 6000 de Alto, durante el diseño la utilizas a 9000 x 9000 por ejemplo y en la zona de abajo tienes el Grid que te comentaba, de este modo cuando quieras puedes ajustar el alto para ver u ocultar el Grid, puedes incluso hacerlo a través de un Command.

Para entender mejor la idea, crea un Proyecto en Blanco, inserta un Command1 y un MsFlexgrid1 y pega este código

Private Sub Command1_Click()
If Me.Height = 6000 Then
Me.Height = 9000
MSFlexGrid1.Visible = True
Command1.Caption = "Ocultar"
Else
Me.Height = 6000
MSFlexGrid1.Visible = False
Command1.Caption = "Mostrar"
End If
End Sub

Private Sub Form_Load()
Form1.Width = 9000
Form1.Height = 6000
MSFlexGrid1.Move 0, 6200
MSFlexGrid1.Visible = False
Command1.Move 0, 0
Command1.Caption = "Mostrar"
End Sub


Pruébalo y entenderás a que me refiero.
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #26 (permalink)  
Antiguo 29/04/2010, 07:27
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: Ayuda por favor

Hola compañero!

Ya lo he probado y veo que eso es mas practico que un formulario aparte pues es casi lo mismo a que se desplegue o alarge como en tu caso, pero este ultimo te ahorras problemas posteriores de Show y otras mandangas.

Sobre el tema de datos de matrices tengo ahora una consulta pues todo lo que me estas enseñando lo voy digiriendo poco a poco pero estoy ahora en una fase como cuando una serpiente Piton se come una vaca que necesita 2 meses para digerirla y y otro para poderse mover, el caso es que lo voy aplicando poco a poco todo, mas mis ideas y me salen estas tonterias, resulta que manteniendo mi codigo antiguo pero teniendo tu puntos verifico la entrada de datos a la matriz y no me guarda absolutamente nada pero en cambio en otros elementos si, ¿Porque? me esta volviendo loco, puedes mirartelo porfa.
Código vb:
Ver original
  1. ' --------------------------------------------------------------------------
  2. ' \\ -- Subrutina para verificar que cantidad de semanas hay en Horas.dat.
  3. ' --------------------------------------------------------------------------
  4.  
  5. Public Sub ContadorSemanas()
  6.  
  7. Dim Control As Integer
  8. Dim NRegistro As Integer
  9. Dim i As Integer
  10.  
  11. D = LOF(Numero) / 94
  12. RegUltimo = LOF(Numero) / 94
  13. Control = 0
  14.  
  15. ReDim CSemanas(1, 1)
  16.  
  17. For i = 1 To D
  18.  
  19.     Get #Numero, RegUltimo, Horas
  20.     NRegistro = RegUltimo
  21.     RegUltimo = RegUltimo - 1
  22.    
  23.      If Horas.npedido = npedido_C Then
  24.             If Control <> Horas.semana Then
  25.                 ReDim Preserve CSemanas(1, UBound(CSemanas, 1) + 1)
  26.                 CSemanas(0, UBound(CSemanas, 1) + 1) = NRegistro
  27.                 CSemanas(1, UBound(CSemanas, 1) + 1) = Horas.semana
  28.                 Control = Horas.semana
  29.                 cbo_semanas.AddItem Horas.semana
  30.             End If
  31.      End If
  32.  
  33. Next i
  34.  
  35. NrSemanas = UBound(CSemanas, 2) + 1
  36.  
  37. MsgBox CSemanas(0, 0) & " ; " & CSemanas(0, 1) & vbCrLf & _
  38.        CSemanas(1, 0) & " ; " & CSemanas(1, 1) & vbCrLf
  39.  
  40. End Sub

La matriz la he declarado como publica en un modulo.bas para poder acceder a sus datos desde otras partes y funciones del programa, esta asi declarada.:

Código vb:
Ver original
  1. ' ---------------------------------------------------------------------------
  2. ' \\ -- Descripción : Matrices para control semanas, pedidos, etc.
  3. ' ---------------------------------------------------------------------------
  4.  
  5. 'Matriz de control de semanas
  6. Public CSemanas() As Integer

sin mas, pues mas adelante quiero declarar en el mismo modulo otras de indices,etc..

Un saludo

Última edición por XYON126; 29/04/2010 a las 11:03
  #27 (permalink)  
Antiguo 29/04/2010, 13:27
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años, 1 mes
Puntos: 53
Respuesta: Ayuda por favor

Hola de nuevo:

El problema es que no acabo de entender tu código, en primer lugar creo que deberías simplificarlo un poco y comentarlo entre lineas ya que las variables que para ti significan algo, para mi no me dicen nada, de todos modos aprovecho para enseñarte una cosa mas muy buena en el bucle For Next y comentar algo que no termina de encajarme en lo que veo:

Supongamos:
Dim Registro As Integer
Dim RegistrosFichero As Integer

Registros = LOF(Numero) / 94

Si quieres Leer el Fichero desde el Principio hasta el Final

For Registro = 1 To RegistrosFichero ' Pero esto ya lo sabías

Si quieres Leer el Fichero desde el Final hasta el Principio

For Registro = RegistrosFichero To 1 Step -1 ' No es magia, es VB

de este modo te evitas tener que ir descontando a la variable que estas utilizando.

Lo que me llama la atencion es lo siguiente tal vez porque yo no le utilizado nunca y esto me confunde:

ReDim Preserve CSemanas(1, UBound(CSemanas, 1) + 1)

CSemanas(0, UBound(CSemanas, 1) + 1) = NRegistro
CSemanas(1, UBound(CSemanas, 1) + 1) = Horas.semana

En la primera linea, estas añadiendo a la segunda dimension el número de elementos de la primera dimension + 1 ¿ Que sentido tiene ?

Despues pasas el dato a Ubound(CSemanas) sin tener en cuenta que Ubound ha aumentado por razon de la linea anterior.

Lo siento pero no acabo de encajar la idea.

Mejor explícame que pretendes y vemos como hacerlo.
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #28 (permalink)  
Antiguo 29/04/2010, 16:16
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años, 1 mes
Puntos: 53
Respuesta: Ayuda por favor

Bueno amigo Xyon, creo que lo mejor es que pruebes este código y después me cuentas:

Crea un Proyecto nuevo, debes añadirle los siguientes controles:
MsFlexGrid1, Combo1, Combo2, Command1

Copias el siguiente código en el Código del Formulario

Código:
Option Explicit

Private Sub Combo1_Click()
  ' Carga en Combo2 las posibles elementos de la columna
  Dim Fila As Single, Columna As Single
  ' Buscamos el numero de Columna que contiene la cabecera seleccionada
  For Columna = 0 To MSFlexGrid1.Cols - 1
    ' Si coincide Nombre de la columna con el Combo, salimos del bucle
    If MSFlexGrid1.TextMatrix(0, Columna) = Combo1.Text Then Exit For
  Next
  ' Borramos posibles valores del Combo2
  Combo2.Clear
  ' Recorremos los elementos de la columna escogida en el Grid para 'cargar' sus valores
  For Fila = 1 To MSFlexGrid1.Rows - 1
    ' Utilizamos la rutina ComboAdd que evita añadir datos duplicados al Combo
    ComboAdd Combo2, MSFlexGrid1.TextMatrix(Fila, Columna)
  Next
  ' Forzamos que no haya ningun elemento seleccionado con el -1
  Combo2.ListIndex = -1
End Sub

Private Sub Combo2_Click()
  ' Recorre las Filas del Grid, ocultando las NO COINCIDENTES y mostrando las coincidentes
  Dim Fila As Single, Columna As Single
  ' Buscamos el numero de Columna que contiene la cabecera seleccionada
  For Columna = 0 To MSFlexGrid1.Cols - 1
    ' Si coincide Nombre de la columna con el Combo, salimos del bucle
    If MSFlexGrid1.TextMatrix(0, Columna) = Combo1.Text Then Exit For
  Next
  ' Evitamos el parpadeo del Grid
  MSFlexGrid1.Redraw = False
  ' Recorremos el Grid
  For Fila = 1 To MSFlexGrid.Rows - 1
    If MSFlexGrid1.TextMatrix(Fila, Columna) = Combo2.Text Then
      ' Restaura el Alto de Fila a -1 (Alto por omision)
      MSFlexGrid1.RowHeight(Fila) = -1
    Else
      ' Asigna a Alto Fila 0 (Oculta la Fila)
      MSFlexGrid1.RowHeight(Fila) = 0
    End If
  Next
  ' Restauramos redibujado del Grid
  MSFlexGrid1.Redraw = True
End Sub

Private Sub Command1_Click()
  Dim Numero As Integer, Fichero As String, Longitud As Integer, Registro As Single
  Numero = FreeFile
  Longitud = Len(RegistroHoras)
  Fichero = ""  ' Debe indicarse aquí el nombre y path completo del Fichero de Horas
  If Fichero = "" Then Stop  ' Este Stop es por si no se ha indicado el nombre del Fichero
  Open Fichero For Random As Numero Len = Longitud
  For Registro = 1 To LOF(Numero) / Longitud
    Get #Numero, Registro, RegistroHoras
    ' Añadimos una Fila al Grid
    MSFlexGrid1.Rows = Registro + 1
    With RegistroHoras
       GridPonerDato MSFlexGrid1, Registro, 0, .inicio1    ' Date
       GridPonerDato MSFlexGrid1, Registro, 1, .fin1       ' Date
       GridPonerDato MSFlexGrid1, Registro, 2, .inicio2    ' Date
       GridPonerDato MSFlexGrid1, Registro, 3, .fin2       ' Date
       GridPonerDato MSFlexGrid1, Registro, 4, .inicio3    ' Date
       GridPonerDato MSFlexGrid1, Registro, 5, .fin3       ' Date
       GridPonerDato MSFlexGrid1, Registro, 6, .tiempo     ' Date
       GridPonerDato MSFlexGrid1, Registro, 7, .dia        ' String * 8   ' Lunes, Martes, ...
       GridPonerDato MSFlexGrid1, Registro, 8, .fecha      ' Integer
       GridPonerDato MSFlexGrid1, Registro, 9, .semana     ' Integer      ' 1, 2, 3 ...
      GridPonerDato MSFlexGrid1, Registro, 10, .mes        ' String * 10  ' Enero, Febrero, ...
      GridPonerDato MSFlexGrid1, Registro, 11, .año        ' Integer
      GridPonerDato MSFlexGrid1, Registro, 12, .npedido    ' Long
      GridPonerDato MSFlexGrid1, Registro, 13, .Totalhoras ' Integer
    End With
  Next
  Close #Numero
End Sub

Private Sub Form_Load()
  '
  ' Ajustamos Posiciones de los controles de modo provisional
  MSFlexGrid1.Move 0, 0, 12000, 6000
  Combo1.Move 0, 6120, 1800
  Combo2.Move 2000, 6120, 1800
  Command1.Move MSFlexGrid1.Width - 1800, 6120, 1800
  Command1.Caption = "Cargar"
  Me.Width = MSFlexGrid1.Width + 120
  Me.Height = 7000
  ' Los datos anteriores deberan borrarse cuando se Ajusten los controles en el diseño
  '
  
  ' Dimensionamos el Grid adecuadamente
  ' No tendrá Columnas Fijas
  MSFlexGrid1.FixedCols = 0
  ' Le ponemos titulos a las cabeceras
   GridCabecera MSFlexGrid1, 0, 1200, "Inicio1", "C"
   GridCabecera MSFlexGrid1, 1, 1200, "Fin1", "C"
   GridCabecera MSFlexGrid1, 2, 1200, "Inicio2", "C"
   GridCabecera MSFlexGrid1, 3, 1200, "Fin2", "C"
   GridCabecera MSFlexGrid1, 4, 1200, "Inicio3", "C"
   GridCabecera MSFlexGrid1, 5, 1200, "Fin3", "C"
   GridCabecera MSFlexGrid1, 6, 1200, "Tiempo", "C"
   GridCabecera MSFlexGrid1, 7, 1200, "Dia", "C"
   GridCabecera MSFlexGrid1, 8, 1200, "Fecha", "C"
   GridCabecera MSFlexGrid1, 9, 1200, "Semana", "C"
  GridCabecera MSFlexGrid1, 10, 1200, "Mes", "C"
  GridCabecera MSFlexGrid1, 11, 1200, "Año", "C"
  GridCabecera MSFlexGrid1, 12, 1200, "Pedido", "C"
  GridCabecera MSFlexGrid1, 13, 1200, "Horas", "C"
  ' Añadimos a Combo1 las posibles columnas por las que podremos seleccionar
  ' Las columnas deben tener el mismo nombre que la columna del Grid (ver arriba)
  ' Seleccionar la propiedad Style del Combo1 y Combo2 a modo 2 Lista desplegable
  Combo1.AddItem "Dia"
  Combo1.AddItem "Semana"
  Combo1.AddItem "Mes"
  Combo1.AddItem "Año"
  Combo1.AddItem "Pedido"
  ' Forzamos que no haya ningun elemento seleccionado con el -1
  Combo1.ListIndex = -1
End Sub
Este otro código lo copias en un Modulo

Código:
Option Explicit

Public Type Horas_T
  inicio1 As Date
  fin1 As Date
  inicio2 As Date
  fin2 As Date
  inicio3 As Date
  fin3 As Date
  tiempo As Date
  dia As String * 8        ' Lunes, Martes, ...
  fecha As Integer
  semana As Integer        ' 1, 2, 3 ...
  mes As String * 10       ' Enero, Febrero, ...
  año As Integer
  npedido As Long
  Totalhoras As Integer
End Type
Public RegistroHoras As Horas_T

Public Sub GridCabecera(Grid As MSFlexGrid, Columna As Single, AnchoTwips As Single, Titulo As String, Ajuste As String)
' Si la Columna no existe, la añadimos ya que de lo contrario se produciría un error
  If Grid.Cols - 1 < Columna Then Grid.Cols = Columna + 1
  Grid.ColWidth(Columna) = AnchoTwips
  Select Case UCase(Ajuste)
    Case "I": Grid.ColAlignment(Columna) = 1 ' Izquierda
    Case "D": Grid.ColAlignment(Columna) = 7 ' Derecha
    Case "C": Grid.ColAlignment(Columna) = 4 ' Centro
  End Select
  Grid.Row = 0
  Grid.Col = Columna
  Grid.CellAlignment = 4                     ' Título siempre Centrado
  Grid.Text = Titulo
End Sub

Public Sub GridPonerDato(Grid As MSFlexGrid, Fila As Single, Columna As Single, Dato As Variant)
* ' Si la fila no existe, la añadimos. La columna es de suponer que ya le hemos puesto cabecera
  If Grid.Rows - 1 < Fila Then Grid.Rows = Fila + 1
* Grid.TextMatrix(Fila, Columna) = Dato
End Sub

Public Sub ComboAdd(Combo As ComboBox, Item As String)
  ' Añade Item al combo indicado si no está en el
  Dim Indice As Single
  For Indice = 0 To Combo.ListCount - 1
    ' Si lo encuentra simplemente salimos
    If Combo.List(Indice) = Item Then Exit Sub
  Next
  ' Si no hemos salido, debemos añadirlo
  Combo.AddItem Item
End Sub
Lo pruebas, lo analizas (está bastante comentado) y hablamos (es una primera idea)
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #29 (permalink)  
Antiguo 30/04/2010, 00:31
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: Ayuda por favor

Hola erbunson!

Buenos dias, primero sobre tu consulta de esto .:

ReDim Preserve CSemanas(1, UBound(CSemanas, 1) + 1)
CSemanas(0, UBound(CSemanas, 1) + 1) = NRegistro
CSemanas(1, UBound(CSemanas, 1) + 1) = Horas.semana

mi intención es, en la primera linea ampliar en una columna (ya que filas no es posible) la matriz existente. Y en la segunda y tercera linea introducirle los datos de Nr. de registro y Nr. de semana a la nueva columna creada; me comentas que machacan los datos y en eso estoy de acuerdo, ya que a mi tambien me parecio extraño pero cuando busque en la ayuda de VB fue alli, a menos de no ser un error de Microsoft, donde explicaba como hacer la orden que comentastes de REDIM PRESERVE y aprovechar la fuerza del UBound para situarte en la ultima columna generada, para mi esas tres lineas deberian ser asi .:

ReDim Preserve CSemanas(1, UBound(CSemanas, 2) + 1)
CSemanas(0, UBound(CSemanas, 2) + 1) = NRegistro
CSemanas(1, UBound(CSemanas, 2) + 1) = Horas.semana

ya que según lei, en el caso de UBound y LBound no era 0 para filas y 1 para columnas sino 1 y 2 incluso si escribo el codigo de la 2 ª manera me da error "El subindice esta fuera del intervalo" por lo que me extraña mas aún y encima no me rellena nada.

Por eso cada vez que doy un paso alante parece que de dos hacia atras y me encuentre mas perdido. Lo peor de todo es que lo que me vas enseñando lo pongo en practica con programillas que me hago de apoyo y sin duda me van de perlas pero
por desgracia para poderlo aplicar al principal debo hacer muchos pasos intermedios o sino todo el codigo que tengo echo no me servive de nada y mi intención como te comente, es primeramente finalizar mi programa (posiblemente con codigo escesivamente complicado y largo) y una vez ya funcione ir utilizandolo y paralelamente y como decis los informaticos mientras preparo la 2ª Release o version, analizo el primero para mejorarlo y simplificarlo e ir poniendo en practica todo lo aprendido por ti. Creo que es lo mas logico para aprender y si lo necesito poderlo utilizar de momento.
Despues cuando me sorprendes, como por ejemplo lo del codigo de arriba, lo hago funcionar y FLASHHHHHHHH!!!! haces lo que mas o menos necesito pero desde otro punto de mira, en el cual obtienes casi y mas resultados pero con un planteamiento totalmente diferente y que para aplicarlo deberia eliminar todo lo creado y hacerlo de nuevo, de ahi me plantee el estudiarlo mas a fondo, comprender el que y porque y plantearmelo para la nueva versión pues Release suele mantener el entorno igual y solo mejora o añade nuevas funciones y Version es cuando incluso la presentación es diferente o asi creo que es.

Referente al codigo nuevo tuyo, veo que se abre una Grilla con un monton de campos, un combovox con selector de campos, otro vacio y un comando llamado cargar, lo que necesitaria saber cual es la idea de funcion global y que debe hacer cada comando, me refiero al Boton cargar, el selector y el combo vacio cuando ya funciona el programa y no como codigo, pues lo he probado con el archivo Horas.dat y en esta parte de codigo del modulo .:

Código vb:
Ver original
  1. Public Sub GridPonerDato(Grid As MSFlexGrid, Fila As Single, Columna As Single, Dato As Variant)
  2. * ' Si la fila no existe, la añadimos. La columna es de suponer que ya le hemos puesto cabecera
  3.  If Grid.Rows - 1 < Fila Then Grid.Rows = Fila + 1
  4. * Grid.TextMatrix(Fila, Columna) = Dato
  5. End Sub

me da error en la linea de "Grid.TextMatrix(Fila, Columna) = Dato" con el error :

Error 5
Llamada a procedimiento o argumento no validos.

ya se que me diras si les habia quitado los asteriscos, pues si, si se los he quitado la 1ª vez que me dio error y los vi, aunque este error es uno que me persigue desde hace dias por todas partes, debe estar enamorado de mi y no hay manera de olvidarme de el; de todas maneras lo estoy mirando muy minuciosamente pues como dices esta muy, muy comentado.


Un saludo

Última edición por XYON126; 30/04/2010 a las 01:45
  #30 (permalink)  
Antiguo 30/04/2010, 03:08
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años, 1 mes
Puntos: 53
Respuesta: Ayuda por favor

Hola:

El mayor de los problemas para hacer pruebas es no tener datos con los que trabajar, si quieres y puedes podrías mandarme al correo el archivo de datos y así aunque a mi no me diga nada veré los datos en el programa y podré detectar porque se produce el error.

Mi correo es [email protected] (cuidado que es erbuson y no erbunson)

Respecto a que no puedes incluir este sistema sobre el que tienes actualmente simplemente comentarte que SI puedes hacerlo, no tienes porque modificar para nada lo que tienes hecho.

Si me mandas el fichero, lo pruebo y te adjunto unas instrucciones y ya verás que creando un Formulario aparte para visualizar la información, no te afecta a lo demás y si puedes usarlo perfectamente.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...

Etiquetas: favor
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 13:36.