Ver Mensaje Individual
  #6
Antiguo 7 de agosto de 2016, 19:17
Josber
Moderador Global
Activista del Foro: Activista del Foro - Issue reason: Por aportar manuales y enriquecer  Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Issue reason: Por muchos agradecimientos 
Última Actividad 21.09.2026 07:20
Posts Posts: 883
Likes enviados Enviados: 418
Likes recibidos Recibidos: 492

Matias, Te he borrado el último post porque estaba duplicado, procura no duplicar los post, por favor, no te he contestado antes porque he tenido el ordenador estropeado unos días.

A ver, el código es muy sencillo, te explico:

El apartado INICIO:

Aquí abro el fichero de origen en modo lectura, y el fichero de destino en modo escritura, puesto que uno sólo lo voy a leer y el otro, sólo lo voy a grabar (escribir).

El apartado POSICIONAR:

Como el fichero de origen, vamos a leerlo desde principio a fin, necesitamos posicionarnos en el primer registro que haya, por eso movemos 0 a NUMERO, ya que no habrá un registro más bajo que ese. (El mover 0 a CONTA, es para "inicializar" el contador de registros pasados, para saber el número de registros que hemos traspasado).
Como segundo paso, nos posicionamos en el fichero de origen (instrucción START) y le decimos que no sea menor del valor de NUMERO, (KEY NOT LESS NUMERO), que en este caso es 0 (cero), y que si hay un error (INVALID KEY), nos muestre un mensaje diciendo "*Error, el fichero está vacío ..." y que cierre el programa (INVOKE POW-SELF "CloseForm" EXIT PROGRAM)

El apartado LEER:

Una vez posicionados en el fichero, tenemos que "crear" un bucle que lo lea de principio a fin, eso es lo que hacemos en esta parte.
Leemos el fichero y lo "preparamos" para leer el siguiente registro, (READ ORIGEN NEXT RECORD), y comprobamos si hemos llegado al final del fichero (AT END), si es así, lo "mandamos" al apartado FIN-LEER, (GO FIN-LEER), si no es así, lo enviamos a MONTAR-LINEA, que es donde generamos el fichero de texto que quieres, la diferencia entre GO y PERFORM, explicado así a lo bruto, es que GO, te envía a un sitio y alli te quedas, y PERFORM, te envía a un sitio, pero cuando termina, vuelves al punto de origen, en éste caso se termina en FIN-MONTAR.
Después de MONTAR-LINEA y, como te he dicho anteriormente, al ser un bucle para leer todo el fichero, volvemos al apartado LEER, (así estaremos hasta que se cumpla la condición AT END, fin-de-fichero).

El apartado FIN-LEER:

Cuando hemos terminado de leer y traspasar todo el fichero, sólo nos queda informar al usuario del número total de registros que se han pasado, como el número queremos mostrarlo en modo "bonito", con su separador de millares, movemos el contador de registros a un editado, (MOVE CONTA TO CINCO-EDI).
El siguiente paso es montar el texto de información, (STRING "Fin del traspaso. Se han pasado " CINCO-EDI " Registros." DELIMITED BY SIZE INTO LINEA END-STRING) y mostrar una ventana informativa con el texto, (INVOKE POW-SELF "DisplayMessage" USING LINEA ...), y por último, cerramos los ficheros abiertos, (CLOSE ORIGEN DESTINO) y cerramos el programa (INVOKE POW-SELF "CloseForm".).

El apartado MONTAR-LINEA:

En esta parte es donde montamos la linea de texto con todos los datos de la ficha del cliente, hay que tener en cuenta que, cuando pasamos datos numéricos, sean del tamaño que sean, a texto plano, el último número no lo pondrá en HEXADECIMAL, por lo que antes de pasarlo, lo movemos a un "editado" para evitar esto. (MOVE NUMERO TO CINCO-EDI.), y, para que no nos meta "basura", lo primero es "inicializar" las variables que vamos a utilizar. (MOVE 0 TO CINCO-EDI NUEVE-EDI P MOVE SPACES TO LINEA.)
El como se monta la linea, ya está explicado en el propio código. Una vez montada la LINEA con el texto, sólo nos queda grabarla en el fichero de destino. (WRITE DESTINO).
Por último, añadimos 1 al contador de registros grabados. (ADD 1 TO CONTA)

El apartado FIN-MONTAR:

Aquí es donde le indicamos al PERFORM que hicimos antes, que se ha acabado el código y que vuelva (EXIT.).


Con ésto está todo explicado, si aún tienes alguna duda, pregunta sin problemas.

Un saludo.-
Josber is offline   Responder Con Cita