• Lunes 23 de Diciembre de 2024, 04:58

Autor Tema:  Duda filtro y cambiar de fila  (Leído 2695 veces)

alex1510

  • Miembro activo
  • **
  • Mensajes: 35
    • Ver Perfil
Duda filtro y cambiar de fila
« en: Martes 13 de Octubre de 2009, 18:57 »
0
Hola buenas:
Tengo el siguiente archivo que va generando una maquina continuamente y necesito filtrar algunas instrucciones y pasarlas a otra hoja. Ya he conseguido que se actualice con aplication ontime cada 30 segundos y lo he programado para que se sobreescriba. Mi problema es que solo quiero leer a partir de donde lo dejo la ultima vez, es decir, hacer un filtro a partir de ahí. Les agradecería mucho que me dijeran como se le pone a cada instrucción un número, es decir, en la columna A un número que identifique esa instrucción, pero que solamente llege asta el final del texto, no como yo tengo ahora hasta la fila 65500.jjj.que le di a rellenar con una serie.
Miren, para hacerse a la idea:
Tengo esto:
520   04/05/2009   17:45:59   ALERT   2903 90 Cycle Start Pressed         2   42
521   04/05/2009   17:46:00   ALERT   1900 90 Automatic Cycle Started         2   42
522   04/05/2009   17:46:01   DATAPOINT   FEED_RATE_OVERRIDE=100            
523   04/05/2009   17:46:03   MESSAGE   PLY NAME ======> P1-61   3   0      
524   04/05/2009   17:46:03   MESSAGE   PLY CREATED ===> 2006/01/17 12:16:55   3   0      
525   04/05/2009   17:46:03   MESSAGE   BNDLNAM=YF00D TRAMPA WING PRAL.IZQ.   3   0      
526   04/05/2009   17:46:03   MESSAGE   PROGNAM=NC0003   3   0      
527   04/05/2009   17:46:06   MESSAGE   PLYNAME=P1-61          / STARTED   3   1      
528   04/05/2009   17:46:06   MESSAGE   COURSE=0001            / STARTED   3   1      
529   04/05/2009   17:46:16   MESSAGE   COURSE=0001            / ENDED   3   1      
530   04/05/2009   17:46:20   MESSAGE   COURSE=0002            / STARTED   3   2      
531   04/05/2009   17:46:30   MESSAGE   COURSE=0002            / ENDED   3   2      
532   04/05/2009   17:46:30   MESSAGE   PLYNAME=P1-61          / ENDED   3   2      
533   04/05/2009   17:46:30   MESSAGE   EST-CYCLE-TIME=    0.41 MINUTES   3   2      
534   04/05/2009   17:46:30   MESSAGE   EST-TOW-LENGTH=    59238.27 MMS   3   2      
535   04/05/2009   17:46:34   MESSAGE   VERIFICAR CAPA   3   2      
536   04/05/2009   17:46:34   ALERT   2907 90 M00-Executed         3   2
537   04/05/2009   17:46:35   ALERT   1902 90 Automatic Cycle Stopped         3   2
538   04/05/2009   17:46:35   ALERT   2903 90 Cycle Start Pressed         3   2
539   04/05/2009   17:46:37   ALERT   1900 90 Automatic Cycle Started         3   2

y quiero algo como esto:

5571   2009-06-22 19:46:02.000   2009-06-22 19:47:16.000   74   Parada   PARADA   Fiber1   NULL
5572   2009-06-22 19:47:16.000   2009-06-22 19:47:36.000   20   Velocidad Reducida   VELOCIDAD REDUCIDA   Fiber1   NULL
5573   2009-06-22 19:47:36.000   2009-06-22 19:52:28.000   292   Parada   PARADA   Fiber1   NULL
5574   2009-06-22 19:52:28.000   2009-06-22 19:52:30.000   2   Velocidad Reducida   VELOCIDAD REDUCIDA   Fiber1   NULL
5575   2009-06-22 19:52:30.000   2009-06-22 19:52:32.000   2   Entrada   ENTRADA   Fiber1   NULL
5576   2009-06-22 19:52:32.000   2009-06-22 19:53:02.000   30   En Marcha   EN MARCHA   Fiber1   NULL
5577   2009-06-22 19:53:02.000   2009-06-22 19:53:06.000   4   Entrada   ENTRADA   Fiber1   NULL
5578   2009-06-22 19:53:06.000   2009-06-22 19:56:10.000   184   Velocidad Reducida   VELOCIDAD REDUCIDA   Fiber1    Velocidad Reducida                              
5579   2009-06-22 19:56:10.000   2009-06-22 19:56:56.000   46   Parada   PARADA   Fiber1   NULL
5580   2009-06-22 19:56:56.000   2009-06-22 19:56:58.000   2   Velocidad Reducida   VELOCIDAD REDUCIDA   Fiber1   NULL
5581   2009-06-22 19:56:58.000   2009-06-22 19:57:28.000   30   Entrada   ENTRADA   Fiber1   NULL
5582   2009-06-22 19:57:28.000   2009-06-22 19:57:30.000   2   Parada   PARADA   Fiber1   NULL
5583   2009-06-22 19:57:30.000   2009-06-22 19:57:34.000   4   Entrada   ENTRADA   Fiber1   NULL
5584   2009-06-22 19:57:34.000   2009-06-22 20:20:58.000   1404   Velocidad Reducida   VELOCIDAD REDUCIDA   Fiber1    Velocidad Reducida                              
5585   2009-06-22 20:20:58.000   2009-06-22 20:35:10.000   852   En Marcha   EN MARCHA   Fiber1   NULL
5586   2009-06-22 20:35:10.000   2009-06-22 20:35:42.000   32   Parada   PARADA   Fiber1   NULL
5587   2009-06-22 20:35:42.000   2009-06-22 20:36:30.000   48   En Marcha   EN MARCHA   Fiber1   NULL
5588   2009-06-22 20:36:30.000   2009-06-22 20:37:00.000   30   Parada   PARADA   Fiber1   NULL
5589   2009-06-22 20:37:00.000   2009-06-22 20:41:22.000   262   En Marcha   EN MARCHA   Fiber1   NULL
5590   2009-06-22 20:41:22.000   2009-06-22 20:41:40.000   18   Parada   PARADA   Fiber1   NULL
5591   2009-06-22 20:41:40.000   2009-06-22 20:42:20.000   40   En Marcha   EN MARCHA   Fiber1   NULL
5592   2009-06-22 20:42:20.000   2009-06-22 20:42:40.000   20   Parada   PARADA   Fiber1   NULL
5593   2009-06-22 20:42:40.000   2009-06-22 20:42:42.000   2   Velocidad Reducida   VELOCIDAD REDUCIDA   Fiber1   NULL
5594   2009-06-22 20:42:42.000   2009-06-22 20:42:44.000   2   Entrada   ENTRADA   Fiber1   NULL
5595   2009-06-22 20:42:44.000   2009-06-22 20:44:58.000   134   Parada   PARADA   Fiber1   NULL
5596   2009-06-22 20:44:58.000   2009-06-22 20:45:00.000   2   Velocidad Reducida   VELOCIDAD REDUCIDA   Fiber1   NULL

Se que es complicado, pero me ayudarian mucho diciendome lo del indice de la columna A y como grabar el indice de la ultima instruccion y sumarle uno para así, en el proximo ciclo solamente partir desde esa instrucción para filtrar.
Gracias

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Duda filtro y cambiar de fila
« Respuesta #1 en: Miércoles 14 de Octubre de 2009, 17:20 »
0
Te he leído 3 veces y no acabo de terminar de entenderte del todo.... tu te explicas como dando por hecho que conocemos la 'máquina' esa y que estamos familiarizados con lo que hace...

Supongo que a instruccción te refieres a cada línea ahí escrita, y supongo (por que no lo indicas) que dichas líneas proceden de un archivo de texto ¿...?, luego hablas de columnas que yo no veo, por lo que asumo (ya me dirás si acierto) que cada columna debe ser el texto definido entre 2 espacios. Para terminar, en el texto encabezado indicas: (solo quiero leer a partir de donde lo dejó la ultima vez) pero luego previo al último párrafo dices (y quiero algo como esto)... entonces cuál de las 2 cosas quieres ?... nuevamente asumo (no se si acierto) que esta 2ª idea nace como una posible respuesta a la 1ª...

Entonces para poder ayudarte de la forma más óptima dime exactamente cual es el problema raíz, deja aparte de momento las posibles soluciones, dime si lo que haces es:
a -  leer el contenido de un fichero, trabajas en el y si
b -  lo modificas o no, y si luego
c -  más tarde ese mismo fichero ha sido escrito añadiendo contenido al final,

...y es por eso que quieres 'revisar' desde la vez anterior... porque si esto es así, la solución sería bastante más fácil de loque te puedas imaginar.

Si en cambio lo quieres es
d - alterar un texto para que tenga otro 'aspecto' pués acláralo,

si esto 2º es resultado para solucionar lo 1º es trabajo inútil,ahora si
e-  es obligatorio hacer esa cambio, entonces es un nuevo y  2º problema.

Defínelo claramente... plis. al menos confirmando a,b,c,d,e...
«Ma non troppo»
----> ModoVacaciones = False<----

alex1510

  • Miembro activo
  • **
  • Mensajes: 35
    • Ver Perfil
Re: Duda filtro y cambiar de fila
« Respuesta #2 en: Miércoles 14 de Octubre de 2009, 17:36 »
0
Lo siento, me explico fatal:

Mire, el archivo es el siguiente: gigasize.com/get.php?d=7ssdn54nl8f

Este es el archivo final de la pieza terminada, yo lo tengo que ir leyendo en tiempo real que eso ya lo tengo (cada 30 seg) y ir elaborando la información para al final obtener algo asi:

gigasize.com/get.php?d=nn6ql3qo77b

Tambien por si le sirve le pongo lo que llevo hecho, (no se ria mucho):

gigasize.com/get.php?d=83cw6007ngd

Espero que nos hayamos aclarado.

Gracias

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Duda filtro y cambiar de fila
« Respuesta #3 en: Jueves 15 de Octubre de 2009, 17:05 »
0
Bueno, hay cosas que sigo sin entender, son detalles que sólo tu sabes.

No obstante eso no quita para te pueda indicar una línea de trabajo....

Yo te expongo un código que luego debes completar y adaptar a tus necesidades. Como no he podido descargar hasta hoy los otros 2 ficheros (tras descargar el fichero *.plf el 'gigasize' me indicó que alcancé el límite),  ... pués no he visto que lo trabajas todo en excel.

Hay partes que está comentada y parte que tiene código, te lo meto todo en un archivo rar, lo abres y lo miras detenidamente, para hacerc cambios hazlos sobre una copia,a así quedando este intacto, podrás volver a ver el original cuando lo necesites. Obviamente tendrás que modificarlo bastante para adaptarlo a excel.... Sin embargo está bastante comentado, como para que puedas hacer un seguimiento casi completo  sin perderte.

De todas formas te lo voy comentando por encima...

Tenemos un formulario, tiene 3 botoners, uno de iniciar y otro de detener, el tercero sólo aparece si ocurre aalgún error inesperado, el resto de la interfaz sólo tiene propósitos de aclarar el estado del proceso.

Los estados posibles son EnEspera de iniciarse(a fin de cuentas parado) , petición de inicio, inicio, petición de parada, parado.
Cuando el estado es petición de inicio, el timer se pone en marcha e invoca un método de una clase que es quien realiza todo el trabajo. Si tiene éxito dispara un evento 'procesando', entonces el estado pasa a ser iniciado. si ocurre un error el estado pasa a ser parado.
Cuando se pulsa el botón de parar, el estado se establece en petición de parada, la parada sólo ocurre cuando se termine de procesar los datos actuales. cuando esto ocurre se dispara un evento de terminado.

Estos botones 'fluctuan' ,  con el disparo de dichos eventos (procesando y terminado) habilitándose/desahbilitándose y cambio el color de fondo de los mismos, lo cual está controlado de modo general por el timer...

Cuando se inicia la aplicación se crea una instancia de la clse 'Trnsformar'  y se invoca una función de ésta, la idea es que en esa función busquees el fichero inicial de entrada, debes también asignar las rutas a las variables de dichos archivos (entrada y salida)

El resto de la interfaz son el propio timer y 2 shapes, para indicar estados... adicional al estado que marcan los botones, para distinguir la fluctuación de los botones del estado global.

Como el código del formulario es bastante 'sencillo', creo que no necesita más comentario
El código del formulario  es éste:
Código: Visual Basic
  1.  
  2. Private Procesando As Boolean
  3. Private WithEvents Transforma As Transformar
  4. Private Reintentos As Byte
  5.  
  6. Private Const Carmin As Long = &HE0E0F0
  7. Private Const Verdin As Long = &HE0F0E0
  8.  
  9. ' inicia un intento de paro o puesta en marcha del proceso
  10. ' la notificación de paro sólo sucederá cuando se termine el actual
  11. ' bloque de operaciones en curso.
  12. Private Sub ComProceso_Click(Index As Integer)
  13.     ' color de transición, tras un evento de transforma ya se cambiarán a su color adecuado
  14.     If Index = 0 Then
  15.         ComProceso(0).BackColor = Verdin
  16.         ComProceso(0).Enabled = False
  17.     ElseIf Index = 1 Then
  18.         ComProceso(1).BackColor = Carmin
  19.         ComProceso(1).Enabled = False
  20.     End If
  21.    
  22.     Timer1.Enabled = (Index = 0)
  23.     ShaEnMarcha.Visible = Timer1.Enabled
  24. End Sub
  25.  
  26. ' regresa los cambios operados ante error al modo operativo normal
  27. Private Sub ComResetError_Click()
  28.     ComResetError.Enabled = False
  29.     ComResetError.Visible = False
  30.     ShaError.Visible = False
  31.     ComProceso(0).Enabled = True
  32.    
  33.     ShaEnMarcha.Visible = True
  34.     Timer1.Enabled = True
  35. End Sub
  36.  
  37.  
  38.  
  39. ' esto es lo primero que se va a ejecutar cuando se inicie la aplicación.
  40. ' prepara los controles y valores....
  41. Private Sub Form_Initialize()
  42.     Set Transforma = New Transformar
  43.     Reintentos = 0
  44. End Sub
  45.  
  46.  
  47. ' realiza hasta 12 intentos
  48. Private Sub Form_Load()
  49.     Dim Ok As Boolean
  50.    
  51.     Timer1.Enabled = False
  52.     Timer1.Interval = 30000
  53.     Do While Reintentos < 12
  54.         If Not (Transforma Is Nothing) Then
  55.             If Transforma.InicializarProceso = True Then
  56.                 Ok = True
  57.                 Exit Do
  58.             Else
  59.                 ' avisar, algo no está conforme a lo que necesitamos
  60.                 ' ver descripción de InicializarProceso
  61.             End If
  62.         Else
  63.             Reintentos = Reintentos + 1
  64.             ' pausa de 3 segundos y reintentamos
  65.             Call Pausa(3)
  66.            
  67.             Set Transforma = New Transformar
  68.         End If
  69.     Loop
  70.    
  71.    
  72.     Reintentos = 0
  73.     If Ok = False Then
  74.         MsgBox "Ocurrió un error, no se consiguió inicializar el proceso..."
  75.         Unload Me
  76.     Else
  77.         ' el sistema está listo para comenzar.... sin embargo espera a que se pulse  el botón de comienzo.
  78.         ComProceso(0).Enabled = True
  79.         ComProceso(1).Enabled = False
  80.         ComResetError.Enabled = False
  81.         ComResetError.Visible = False
  82.         ShaError.Visible = False
  83.     End If
  84. End Sub
  85.  
  86. ' antes de cerrar intentamos ver si es posible terminar el proceso actual (si estaba en marcha)
  87. Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  88.     If Timer1.Enabled = True Then
  89.         ' petición de terminar
  90.         Call ComProceso_Click(1)
  91.        
  92.         MsgBox "Hay una operación en curso intentaremos esperar a que termine... antes decerrar."
  93.         Me.Hide  ' lo ocultamos para evitar que insista y al final recurra a medidas drásticas sin darle tiempo a terminar y guardar el resultado.
  94.         Do
  95.             DoEvents
  96.         Loop While Procesando = True
  97.     End If
  98.     Set Transforma = Nothing
  99. End Sub
  100.  
  101. Private Sub Form_Terminate()
  102.     Timer1.Enabled = False
  103.     Set Transforma = Nothing
  104. End Sub
  105.  
  106.  
  107. Private Sub Timer1_Timer()
  108.     If Procesando = False Then
  109.         Procesando = True
  110.         Transforma.Procesar
  111.     End If
  112. End Sub
  113.  
  114.  
  115. '================================================
  116. '======== eventos de el objeto Transforma =======
  117.  
  118. Private Sub Transforma_Procesando()
  119.     ComProceso(0).Enabled = False
  120.     ComProceso(0).BackColor = vbGreen
  121.     ComProceso(1).Enabled = True
  122.     ComProceso(1).BackColor = Carmin
  123.     Beep
  124.     Call Pausa(1)
  125.     Beep
  126. End Sub
  127.  
  128. Private Sub Transforma_Terminado()
  129.     Procesando = False
  130.     ComProceso(1).Enabled = False
  131.     ComProceso(1).BackColor = vbRed
  132.     ComProceso(0).Enabled = True
  133.     ComProceso(0).BackColor = Verdin
  134.     Beep
  135.     Call Pausa(1)
  136.     Beep
  137. End Sub
  138.  
  139. Private Sub Transforma_ParoError()
  140.     Timer1.Enabled = False
  141.     ShaEnMarcha.Visible = False
  142.     ShaError.Visible = True
  143.     ComResetError.Enabled = True
  144.     ComResetError.Visible = True
  145.    
  146.     Call Transforma_Terminado
  147.     ComProceso(1).Enabled = False
  148.    
  149.     MsgBox "Ha ocurrido un error inesperado..."
  150.     ' otras acciones posibles
  151.     '  acciones...
  152. End Sub
  153.  
  154.  
  155. ' realiza una pausa con los segundos especificados antes de continuar
  156. '  esto es aproximado... no es un tiempo exacto. puede fluctuar 200 milisegundos
  157. Private Sub Pausa(ByVal Segundos As Byte)
  158.     Dim t As Single
  159.    
  160.     t = Timer
  161.     Do
  162.         DoEvents
  163.     Loop While Timer - t < Segundos
  164. End Sub
  165.  
  166.  

La clase se compone de algunas enumeraciones, yo sólo he puesto la de 'eventos', que parece la más obvia y una matriz que se correponde indice a indice con esta enumeración. el resto de enumeraciones que precisares podrías tratarlas del mismo modo.

He tratado cada 'linea' como una estructura, supuse que tu idea inicial era guardarlo como fichero, te texto plano... Cyuando el timer entra en marcha, invoca una función de la clase que se dedica a procesar, hay bastante descripción detallada que señala los pasos que se deben seguir, naturalmente ni está completo ni es obligatorio, deberás añadir, quitar y modificar de acuerdo a tus necesidades, yo sólo te proveo una orientación...

Esa función determina si el fichero en seguimiento ha variado de tamaño, a fin de determinar si se debe seguir leyendo del mismo, intuyo que algo al final de  un archivo debe ser indicador de que el archivo está completo, a falta de ello verificar el tamaño es una opción (más pobre pero que sirve). Si el fichero estuviera completo, se debe localizar el siguiente, se llama a una función que realiza esa labor.

Una vez localizado el fichero (si es otro distinto del anterior) se llama a una función que lee el contenido del actual archivo de entrada. Lo leemos todo de una vez (vb6 puede leer perfectamente incluso 10Mb. en menos de 1 sg.) y lo troceamos en líneas, asumimos que cada línea está separada de la siguiente por un retorno de carro y avande de línes (CR= CarryReturn , LF= Line Feed) ó vbCrlf en vb6. Esta función devuelve por referencia el número de líneas contenidas. Si el fichero no está al inicio se posiciona el cursor en la posición actual de lectura, antes de leerlo, lógicamente y guardamos el cursor de lectura tras tomar los datos, luego se cierra el archivo y se devuelve la matriz de líneas

Tras tomar la matriz de líneas si lineas -1 (error ocurruid) ó 0 (no hay texto ???) dispara un evento de error y sale de la función, en otro caso se invoca a otra función, la que va a realizar la transformación de estas líneas en las que tu quieres.

La función que formatea las líneas, está a medio codificar, hay datos que yo no tengo y lógicamente no se en base a que han detomar una u otra constante, a mi la línea, por ejemplo: '2009.05.04 15:42:28 MESSAGE    PLY0023,23,3,~CM100GEN', no me dice gran cosa, es de asumir que el código de mensaje responde a un manual de operativa de la máquina , yo he tratado las fechas (sesupone que la fecha de inicio de una operación es la fecha de finalización de la anterior), y  he calculado  la duración usando una funcion de fecha, para totalizar segundos. El resto de esta función son sugerencias, por ejemplo verás un bloque 'select case', donde debes procesar la parte de 'mensaje', imagino que el resto de texto a la derecha se interpreta de modo uniforme de acuerdo a ese 'mensaje'.

finalmente en la misma función indicada anteriormente, te ofrezco 2 funciones de salida a fichero (es loque creía que tenías que hacen antes de descargar estos ficheros de excel). Nota que la salida en binario siempre será más rápida y cómoda pero ofrece un fichero ilegible a la vista si lo abres con el 'bloc de notas' (igual que sucede si abres un archivo excel con el mismo 'bloc de notas'), un 2º método te ofrece guardarlo en formato de cadena, es siempre más lento, porque  tiene que hacerse a través de un bucle línea a línea.

No obstante esta (última) salida es aceptable para excel... excel permite importar ficheros de texto, interpretando como fila de excel cada línea de fichero e interpretando como columna cada dato separado de otro. con esto tienes pués 2 caminos a seguir para crear tus archivos excel, tomar todo el código y adaptarlo, completarlo a tu proyecto actual o crear un nuevo proyecto, completar este que ten envío y luego importar a excel el fichero ya elaborado, las 'fórmulas'  que tengas en excel, te siguen valiendo... Sólo cambia el método de adquisición de datos.

El código de la clase es éste:
Código: Visual Basic
  1.  
  2. Private Enum EventosMaquinaIn
  3.     EVENTO_AVERIA = -1
  4.     EVENTO_ENTRADA = 0
  5.     EVENTO_PARADA = 1
  6.     EVENTO_MARCHA = 2
  7.     EVENTO_REDUCE_VELOCIDAD = 3
  8. End Enum
  9.  
  10.  
  11. Private Type LineaSalida
  12.     id As Long
  13.     Inicio As Date
  14.     Fin As Date
  15.     Duracion As Integer
  16.     ' eventoEspecificado as string
  17.     Evento As String  ' se toman de la  matriz EventosMaquinaOut
  18.     Maquina As String
  19.     Motivo As String
  20. End Type
  21.  
  22. ' nótese que las cadenas se hacen coincidir en índices con EventosMaquinaIn
  23. '  los valores se generan al crear la clase: ver Class_Initialize
  24. Private EventosMaquinaOut(-1 To 3) As String
  25.  
  26. Private s_LinAnterior As LineaSalida
  27. Private p_FicheroEntrada As String
  28. Private p_FicheroSalida As String
  29.  
  30. Private s_cursorEntrada As Long
  31. Private s_CursorSalida As Long
  32.  
  33. Private s_TamañoEntrada As Long
  34. Private s_Id As Long
  35. Private s_Maquina As String
  36.  
  37.  
  38. Public Event Procesando()
  39. Public Event Terminado()
  40. Public Event ParoError()
  41.  
  42.  
  43. Public Property Get FicheroSalida() As String
  44.     FicheroSalida = p_FicheroSalida
  45. End Property
  46.  
  47. Public Property Get FicheroEntrada() As String
  48.     FicheroEntrada = p_FicheroEntrada
  49. End Property
  50.  
  51.  
  52. ' esto debería invocarse cuando se arranca el programa antes de ejecutarse nada
  53. '  para hacer esas cosas que sólo ocurrirán una única vez al principio.
  54. Public Function InicializarProceso() As Boolean
  55.     ' leemos de un fichero estado.txt
  56.     '   si no existe se crea.
  57.     '  pero si ya existe leemos
  58.     '   donde quedamos la vez anterior, esto es si quedó un fichero sin terminar (suponiendo que esto interese)
  59.    
  60.     ' si estamos interesados en devolver algún estado devolvemos true, o false según convenga o cambiamos el tipo de devolución
  61.     '  si queremos devolver otro tipo de dato.
  62.    
  63.     ' si deseamos decidir si empezar, o resetear el archivo de estado previo, deberíamos establecer un parámetro a la función.
  64.    
  65.     ' antes de devolver nos aseguramos de ver y asignar laos valores para las variables:
  66.     '  p_ficheroentrada y p_ficherosalida
  67.    
  68.     InicializarProceso = True
  69. End Function
  70.  
  71. Public Function Procesar()
  72.     Dim Texto() As String
  73.     Dim Lineas As Long
  74.    
  75.     ' si existe p_ficheroEntrada luego
  76.          s_TamañoEntrada = FileLen(p_FicheroEntrada)
  77.     '     si tamaño del fichero es mayor que p_cursorentrada luego (se ha escrito nuevo contenido)
  78.     '
  79.     '       (continuamos con la lectura, esto es en el siguiente apartado)
  80.     '     el tamaño es el mismo  ' nada que procesar, se está esperando a que la máquina realice operaciones o  está terminado ?
  81.     '         (necesitamos saber cuando un fichero está terminado: ¿ obbsstop indica esto ?)
  82.     '         si sabemos que está terminado luego (debemos buscar el siguiente fichero)
  83.     '             localizado = llamar a función: BuscarSiguienteEntrada
  84.     '             si localizado False luego  (  no hay ficheros de entrada pendientes)
  85.     '                 raiseevent Terminado
  86.     '                 exit function
  87.     '             fin condición: localizar siguiente fichero
  88.     '         si sabemos que no está  terminado (debemos esperar)
  89.     '             raiseevent Terminado
  90.     '             exit function
  91.     '         fin condicion: de lo que sabemos
  92.     '     fin condicion: Tamaño no varía
  93.     ' no existe fichero entrada
  94.     '     localizado = llamar a función: BuscarSiguienteEntrada
  95.     '     si localizado False luego  (  no hay ficheros de entrada pendientes)
  96.     '           raiseevent Terminado
  97.     '           exit function
  98.     '     fin condición: localizar siguiente fichero
  99.     ' fin condicion: existe fichero entrada
  100.    
  101.    
  102.      Texto = TomarContenidoFicheroEntrada(Lineas) ' ( llamar a función tomar contenido de fichero de entrada)
  103.      If Lineas < 1 Then ' -1= (ocurrió un error), 0=  se leyó el fichero pero parece que no contiene texto  ????
  104.         RaiseEvent Terminado
  105.         Exit Function
  106.     Else     ' lineas es mayor que (hay líneas que procesar)
  107.         Call ConvertirLineas(Texto) '    llamamos a otra función para tratar las líneas (sólo por claridad y sencillez de modificar las funciones)
  108.         RaiseEvent Terminado
  109.     End If ' fin condición hay líneas de texto leídas
  110. End Function
  111.  
  112.  
  113. ' localiza el siguiente fichero que genera la máquina para ser procesado
  114. Private Function BuscarSiguienteEntrada() As Boolean
  115.     ' si localiza un ficheo
  116.     '    p_ficheroentrada= ElficheroEncontrado
  117.     '    s_cursorentrada= 1
  118.     '    cerramos ficherosalida
  119.     '    s_cursorSalida=1
  120.     '    creamos y abrimos nuevoFichero de salida
  121.     '    p_Ficherosalida = ElNuevoficherosalida ' elegir el nombre y la ruta, supuestamente basado en el nombre y ruta del de entrada
  122.     '
  123.     '    s_Maquina= "fiber-1" ' se supone que tú debes saber como obtener este dato.
  124.     '
  125.     '    devuelve True
  126.     ' no localiza un nuevo fichero (quizás la máquina esté parada, o está en medio  de un largo proceso y no escribe hasta el ´termino)
  127.     '    Devolver false
  128.     ' fin condicion: localizar fichero
  129. End Function
  130.  
  131. Private Function TomarContenidoFicheroEntrada(ByRef Lineas As Long) As String()
  132.  
  133.     ' abrimos el fichero
  134.     ' posicionamos el crusor
  135.     ' leemos hasta el final del archivo
  136.     ' Troceamos el texto en líneas
  137.     ' Devolvemos el texto
  138.    
  139.     Dim ff As Integer
  140.     Dim Texto As String
  141.     Dim txt() As String
  142.    
  143.     On Local Error GoTo ErrorTomar
  144.    
  145.     Texto = String(s_TamañoEntrada - p_cursorentrada + 1, " ")
  146.     ff = FreeFile
  147.     Open p_FicheroEntrada For Binary As #ff
  148.         Get #ff, p_cursorentrada, Texto
  149.     Close #ff
  150.    
  151.     Texto = Trim$(Texto)
  152.     If Texto <> "" Then
  153.         If InStr(1, Texto, vbCrLf) > 0 Then
  154.             txt = Split(Texto, vbCrLf)
  155.             Texto = ""  ' liberamos memoria
  156.             Lineas = UBound(txt) + 1
  157.             TomarContenidoFicheroEntrada = txt
  158.             Erase txt  ' liberamos memoria
  159.         Else
  160.             Lineas = 1
  161.             redim txt(0 to 0)
  162.             Txt(0)=texto
  163.            TomarContenidoFicheroEntrada = txt
  164.             Texto=""
  165.             erase txt
  166.         End If
  167.     Else
  168.         Lineas = 0
  169.     End If
  170.     Exit Function
  171.    
  172. ErrorTomar:
  173.     Close #ff
  174.     RaiseEvent ParoError
  175.     'MsgBox "Error al leer fichero de entrada: " & vbCrLf & _
  176.     'Err.Number & "  " & Err.Description, vbCritical
  177.    
  178.     Lineas = -1
  179. End Function
  180.  
  181.  
  182.  
  183. Private Sub ConvertirLineas(ByRef Lineas() As String)
  184.     ' iniciamos bucle
  185.     '     procesamos línea a línea
  186.     '     eventuualmente según la cantidad de parámetros de cada línea debe procesarse aparte
  187.     ' terminamos bucle
  188.    
  189.     ' abrimos fichero de salida
  190.     '     posicionamos el cursor de salida
  191.     '     escribimos contenido
  192.     ' cerramos fichero de salida
  193.    
  194.     Dim k As Long, n As Long
  195.     Dim Salida() As LineaSalida
  196.     Dim Linea() As String
  197.     Dim txt As String
  198.    
  199.     ReDim Salida(-1 To UBound(Lineas))  ' ojo: insertamos la línea usada la última vez del proceso anterior como la línea -1
  200.     Salida(-1) = s_LinAnterior
  201.    
  202.     For k = 0 To UBound(Lineas)
  203.         Linea = Split(Lineas(k), " ") ' el divisor es un espacio
  204.        
  205.         Salida(k).Maquina = s_Maquina ' se supone que al cargar el fichero siguiente se obtiene ese valor que presumiblemente es constante para el mismo fichero.
  206.        
  207.         Salida(k).id = Salida(k - 1).id + 1
  208.         Salida(k).Fin = Replace(Linea(0), ".", "-") & " " & Linea(1) '
  209.         Salida(k).Inicio = Salida(k - 1).Fin
  210.         Salida(k).Duracion = DateDiff("s", Salida(k).Fin, Salida(k).Inicio)
  211.        
  212.         ' importante: al guardar el fichero en modo binario, resulta ilegible si abrimos luego el archivo para leerlo, si queremos
  213.         '  que sea legible (a la vista) debemos hacerque todos los campos de la estructura sean cadenas de texto
  214.         ' entonces deberíamos declarar al menos 2 datos de fecha a nivel de la función
  215.        
  216.         ' por ejemplo:
  217.         ' estas 3 líneas iría antes del bucle
  218.         '   Dim Ini As Date, Fin As Date, id As Long
  219.         '   id = Val(Salida(-1).id)
  220.         '   fin= salida(-1).Fin
  221.         ' estas líneas irían dentro del bucle sustituyendo a las previas
  222.         '   Ini = Fin
  223.         '   Fin = Replace(Linea(0), ".", "-") & " " & Linea(1)
  224.         '   Salida(k).Duracion = CStr(DateDiff("s", Fin, Ini))
  225.         '   Salida(k).Fin = CStr(Fin)
  226.         '   Salida(k).Inicio = CStr(Ini)
  227.         '   id = id + 1
  228.         '   Salida(k).id = CStr(id)
  229.        
  230.        
  231.         ' estos datos se supone que tienes que interpretar las constantes que aparecen en las líneas
  232.         '  podrían meterse enuna enumeración o no con y una matriz asociada con ello nos podríamos ahorramos el select case en algunos casos
  233.         Select Case Trim$(Linea(2))
  234.             Case "MESSAGE"
  235.                 Salida(k).Evento = "?"
  236.                 Salida(k).Motivo = "?"
  237.             Case "COMMENT"
  238.                 Salida(k).Evento = "?"
  239.                 Salida(k).Motivo = "?"
  240.             Case "MATERIALFP"
  241.                 Salida(k).Evento = "?"
  242.                 Salida(k).Motivo = "?"
  243.             ' más casos
  244.                 'Salida(k).Evento = "?"
  245.                 'Salida(k).Motivo = "?"
  246.             ' ................
  247.         End Select
  248.     Next
  249.     s_LinAnterior = Lineas(UBound(Lineas))
  250.    
  251.     Erase Lineas ' liberamos memoria
  252.    redim preserve Salida(0 to ubound(salida)) ' eliminamos la línea previa -1 que añadimosprevio al bucle.   
  253.  
  254.     ' qué queremos hacer con las salida ???.
  255.     ' si sólo lo queremos escribir a fichero
  256.        
  257.     ' escribiendo en modo binario (ilegible a la vista).
  258.     Open p_FicheroSalida For Binary As #ff
  259.         'Loc(ff) = s_CursorSalida
  260.         'Put #ff, , Salida
  261.         Put #ff, s_CursorSalida, Salida  ' tiene la ventaja de que escribe estructuras, matrices y matrices de estructura con 1 sola línea.
  262.         s_CursorSalida = Seek(ff)
  263.     Close #ff
  264.    
  265.     ' alternativamente puedes escribirlo como texto y usando un bucle (es totalmente legible a la vista)
  266.     Open p_FicheroSalida For Output As #ff
  267.         Loc(ff) = s_CursorSalida
  268.         With Salida(k)
  269.             For k = 0 To UBound(Salida)
  270.                 Print #ff, .id, .Inicio, .Fin, .Duracion, .Evento, .Maquina, .Motivo
  271.             Next
  272.         End With
  273.         s_CursorSalida = Seek(ff)
  274.     Close #ff
  275.     Erase Salida ' liberamos memoria
  276. End Sub
  277.  
  278.  
  279. Private Sub Class_Initialize()
  280.     EventosMaquinaOut(-1) = "AVERIA"
  281.     EventosMaquinaOut(0) = "ENTRADA"
  282.     EventosMaquinaOut(1) = "PARADA"
  283.     EventosMaquinaOut(2) = "MARCHA"
  284.     EventosMaquinaOut(3) = "VELOCIDAD REDUCIDA"
  285. End Sub
  286.  
  287.  
  288.  

Considero que tienes bastante materia como para poder completar tu proyecto.  :beer:  Si tienes alguna duda, consulta, pero sé explícito y no des por hecho que la ¿ troqueladora ? , ¿ torno ? , la hemos fabricado nosotros ni tampoco el programa que la maneja  :ph34r:  ?. Mejor si son preguntas concretas, las preguntas genéricas dispersan mucho la respuesta...

envío y luego edito para adjuntar el fichero:
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.
«Ma non troppo»
----> ModoVacaciones = False<----

alex1510

  • Miembro activo
  • **
  • Mensajes: 35
    • Ver Perfil
Re: Duda filtro y cambiar de fila
« Respuesta #4 en: Jueves 15 de Octubre de 2009, 19:12 »
0
Gracias de nuevo Nebire. Lo siento por lo de gigasize, es que no encontre otra forma de colgarlo en internet.
Me ha servido de mucho lo que me has dicho, ademas de que te curras mucho las respuestas. Por mi parte yo voy a currarme las mias. Te lo explico todo desde el comienzo:

Tenemos una máquina que va poniendo capas de fibra de carbono para las alas del avión.
Esta máquina va generando de forma continua el archivo que te he enviado y que nos interesa (.txt). Lo que queremos obtener es cuando esta parada (stop cycle), cuando esta funcionando (start cycle), cuando esta en avería y por la capa que va, para poder hacer una barra de progreso que indique el tiempo aproximado de finalización de la pieza. Todo esto lo quiero hacer mediante un scada (wincc v7), por lo que necesito mandarle al scada variables con las que jugar, luego ya este se encargara de hacer graficos e historiales con la información recibida.
Hasta ahi creo que me he explicado:
Localizar el archivo dentro del directorio es el primer problema, el cual te pregunte al comienzo. Tenemos que saber cual es el ultimo archivo que se esta modificando, y una vez localizado, leerlo. Se genera un archivo por pieza construida.
Dentro del tiempo de construccion de la pieza, se incluyen los tiempos de poner y quitar el útil. Para controlar este tiempo voy a poner un pulsador para que el operador al pulsar sobre él, indique Cambio de Pieza, es decir, cuando he sacado la pieza elaborada, pulso y le indico que voy a comenzar a introducir los utiles para la nueva pieza.

Mi idea es conseguir lo que se observa en la presentación de power point, si no igual, parecido.
De esta forma puedo llevar la cuenta del tiempo que lleva parada la maquina y el por qué, para elaborar graficos y un pareto.
Por tanto, mi duda se resume en conseguir leer de ese archivo las varibles que indiquen el estado del sistema (parado, marcha, averia, velocidad reducida(feed_rate<70), nombre de pieza y plano por el que va la construccion de la pieza.

Por ultimo quiero decirte que el archivo ese de la maquina se va generando en el ordenador de control de la maquina, y yo voy a utilizar otro. La solución ideal sería crear una intranet entre ambos,  conectarlos mediante ethernet y poner el directorio de almacenamiento de historiales a compartir no??

Te pongo el link del archivo y siento no poder adjuntarlo aqui en el mensaje, pero es que ocupa mas de 2MB.
Archivo rapidshare.de/files/48526391/Captura_Datos_Airbus_v4_ivan.rar.html

Un saludo y mil gracias por la atención que me estas prestando.