2011-02-07 26 views
7

Hola a todos, tengo una montaña de un problema aquí. He completado un programa que tenía que hacer para la tarea universitaria, pero cuando lo ejecuto, la salida muestra casi nada, se supone que debe hacerlo. Esto solo ocurre cuando lo EJECUTO. Si mantengo F11 en STEP durante todo, muestra los resultados tal como se supone que debe ser. Normalmente no preguntaría por algo tan grande, pero estoy perplejo. Aquí está mi código:Un error extraño (COBOL)

ENVIRONMENT DIVISION. 
    INPUT-OUTPUT SECTION. 
    FILE-CONTROL. 

     SELECT SALESAMT-FILE-IN 
      ASSIGN TO 'SALESAMT.SEQ' 
      ORGANIZATION IS LINE SEQUENTIAL. 

     SELECT SALESMAN-FILE-IN 
      ASSIGN TO 'SALESMAN.SEQ' 
      ORGANIZATION IS LINE SEQUENTIAL. 

     SELECT SALESQTR-FILE-IN 
      ASSIGN TO 'SALESQTR.SEQ' 
      ORGANIZATION IS LINE SEQUENTIAL. 

     SELECT SALESAMT-FILE-OUT 
      ASSIGN TO 'SALESAMT.RPT' 
      ORGANIZATION IS LINE SEQUENTIAL. 

    DATA DIVISION. 
    FILE SECTION. 

    FD SALESMAN-FILE-IN. 
    01 SALESMAN-RECORD-IN. 
     05 SM-NUMBER-IN     PIC 99. 
     05 SM-NAME-IN      PIC X(20). 

    FD SALESQTR-FILE-IN. 
    01 SALESQTR-RECORD-IN. 
     05 QUARTER-YEAR     PIC X. 

    FD SALESAMT-FILE-IN. 
    01 SALESAMT-RECORD-IN. 
     05 SM-NUMBER      PIC 99. 
     05         PIC X. 
     05 MONTH-NUMBER     PIC 9. 
     05         PIC X. 
     05 SALES-AMOUNT     PIC 9(5). 

    FD SALESAMT-FILE-OUT. 
    01 SALESAMT-RECORD-OUT     PIC X(80). 

    WORKING-STORAGE SECTION. 
    01 ARE-THERE-MORE-RECORDS    PIC X(3) VALUE 'YES'. 

    01 REPORT-START      PIC X  VALUE 'Y'. 

    01 LINE-COUNT       PIC 99 VALUE ZEROS. 

    01 LINE-JUMP       PIC X  VALUE 'Y'. 

    01 PAGE-NUMBER       PIC 99 VALUE ZEROS. 

    01 QUARTER-CHECK      PIC X. 

    01 ROUTINE-CHECK      PIC 99 VALUE ZEROS. 

    01 SALESMAN-MATH      PIC 9(5) VALUE ZEROS. 

    01 SALESMAN-TOTAL      PIC 9(6) VALUE ZEROS. 

    01 FINAL-M-TOTAL-1      PIC 9(7) VALUE ZEROS. 

    01 FINAL-M-TOTAL-3      PIC 9(7) VALUE ZEROS. 

    01 FINAL-M-TOTAL-2      PIC 9(7) VALUE ZEROS. 

    01 FINAL-TOTAL       PIC 9(7) VALUE ZEROS. 

    01 SM-NUM-M       PIC 99 VALUE ZEROS. 

    01 MORE-TABLE-RECS      PIC X  VALUE 'Y'. 

    01 SPACE-LINE       PIC X  VALUE SPACE. 

    01 MONTH-NAMES 
      VALUE 'JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'. 
     05 MONTH-TITLES OCCURS 12 TIMES PIC X(3). 

    01 MONTH-ARRAY. 
     05 THREE-MONTHS OCCURS 3 TIMES. 
      10 MONTH-TOTAL OCCURS 99 TIMES PIC 9(7) VALUE ZEROS. 

    01 SALESMAN-TABLE. 
     05 TABLE-ENTRIES OCCURS 99 TIMES 
       INDEXED BY IND-TABLE-ENTRIES. 
      10 SALESMAN-NUMBER    PIC 99 VALUE ZEROS. 
      10 SALESMAN-NAME    PIC X(20) VALUE SPACES. 
    01 SALESMAN-COUNT      PIC 9(3) VALUE ZEROS. 

    01 WS-DATE. 
     05 RUN-YEAR      PIC XX. 
     05 RUN-MONTH      PIC XX. 
     05 RUN-DAY       PIC XX. 

    01 HEADING-LINE-1. 
     05         PIC X(17) VALUE SPACES. 
     05         PIC X(35) 
      VALUE 'SALES AMOUNTS BY SALESMAN AND MONTH'. 
     05         PIC X(10) VALUE SPACES. 
     05 HL-1-DATE. 
      10 MONTH-2      PIC XX. 
      10        PIC X  VALUE '/'. 
      10 DAY-2      PIC XX. 
      10        PIC X  VALUE '/'. 
      10 YEAR-2      PIC XX. 
     05         PIC X(3) VALUE SPACES. 
     05 PAGE-1       PIC X(4) VALUE 'PAGE'. 
     05         PIC X(1) VALUE SPACES. 
     05 NUMBER-PAGE      PIC Z9. 

    01 HEADING-LINE-2. 
     05 HL-NUM       PIC X(3) VALUE 'NUM'. 
     05 HL-BLANK-A      PIC XX  VALUE SPACES. 
     05 HL-NAME       PIC X(4) VALUE 'NAME'. 
     05 HL-BLANK-B      PIC X(20) VALUE SPACES. 
     05 HL-MONTH-1      PIC X(3) VALUE SPACES. 
     05 HL-BLANK-C      PIC X(8) VALUE SPACES. 
     05 HL-MONTH-2      PIC X(3) VALUE SPACES. 
     05 HL-BLANK-D      PIC X(8) VALUE SPACES. 
     05 HL-MONTH-3      PIC X(3) VALUE SPACES. 
     05 HL-BLANK-E      PIC X(10) VALUE SPACES. 
     05 HL-TOTAL      PIC X(5) VALUE 'TOTAL'. 

    01 DETAIL-LINE. 
     05 DL-BLANK-A      PIC X  VALUE SPACES. 
     05 DL-NUM-COLUMN     PIC 99. 
     05 DL-BLANK-B      PIC XX  VALUE SPACES. 
     05 DL-NAME-COLUMN     PIC X(17). 
     05 DL-BLANK-C      PIC X(4) VALUE SPACES. 
     05 DL-MONTH-1      PIC ZZ,Z(3). 
     05 DL-BLANK-D      PIC X(5) VALUE SPACES. 
     05 DL-MONTH-2      PIC ZZ,Z(3). 
     05 DL-BLANK-E      PIC X(5) VALUE SPACES. 
     05 DL-MONTH-3      PIC ZZ,Z(3). 
     05 DL-BLANK-F      PIC X(8) VALUE SPACES. 
     05 DL-TOTAL      PIC Z(3),Z(3). 

    01 TOTALS-LINE. 
     05 TL-WORDS      PIC X(12) 
      VALUE 'Final Totals'. 
     05 TL-BLANK-A      PIC X(12) VALUE SPACES. 
     05 MONTH-1-TOTAL     PIC Z,Z(3),Z(3). 
     05 TL-BLANK-A      PIC X(2) VALUE SPACES. 
     05 MONTH-2-TOTAL     PIC Z,Z(3),Z(3). 
     05 TL-BLANK-A      PIC X(2) VALUE SPACES. 
     05 MONTH-3-TOTAL     PIC Z,Z(3),Z(3). 
     05 TL-BLANK-A      PIC X(5) VALUE SPACES. 
     05 MONTH-FINAL-TOTAL    PIC Z,Z(3),Z(3). 

    PROCEDURE DIVISION. 
    100-MAIN. 
     OPEN INPUT SALESAMT-FILE-IN, SALESMAN-FILE-IN, 
      SALESQTR-FILE-IN 
     OPEN OUTPUT SALESAMT-FILE-OUT 

     ACCEPT WS-DATE FROM DATE 
     MOVE RUN-MONTH TO MONTH-2 
     MOVE RUN-DAY TO DAY-2 
     MOVE RUN-YEAR TO YEAR-2 

     PERFORM 200-NEXT-PAGE 

     PERFORM 300-SALES-ARRAY 

     PERFORM 400-SALESMAN-NAME 

     PERFORM 500-PROCESS-FILE 

     PERFORM 600-FINAL-TOTALS 

     CLOSE SALESAMT-FILE-IN, SALESMAN-FILE-IN, SALESQTR-FILE-IN 
     CLOSE SALESAMT-FILE-OUT 
     STOP RUN. 

    200-NEXT-PAGE. 
     ADD 1 TO PAGE-NUMBER 
     MOVE PAGE-NUMBER TO NUMBER-PAGE 
     MOVE HEADING-LINE-1 TO SALESAMT-RECORD-OUT 
     IF REPORT-START = 'N' 
      WRITE SALESAMT-RECORD-OUT 
       AFTER ADVANCING PAGE 
     ELSE 
      MOVE 'N' TO REPORT-START 
      WRITE SALESAMT-RECORD-OUT 
       AFTER ADVANCING 1 LINE 
      PERFORM 210-MONTH-CHECK 
     END-IF. 
     MOVE HEADING-LINE-2 TO SALESAMT-RECORD-OUT 
     WRITE SALESAMT-RECORD-OUT 
      AFTER ADVANCING 2 LINES 
     MOVE ZEROS TO LINE-COUNT. 

    210-MONTH-CHECK. 
     READ SALESQTR-FILE-IN 
      AT END 
       CONTINUE 
      NOT AT END 
       PERFORM 220-MONTH-NAME 
     END-READ. 

    220-MONTH-NAME. 
      EVALUATE QUARTER-YEAR 
       WHEN = 1  MOVE MONTH-TITLES(1) TO HL-MONTH-1 
           MOVE MONTH-TITLES(2) TO HL-MONTH-2 
           MOVE MONTH-TITLES(3) TO HL-MONTH-3 

       WHEN = 2  MOVE MONTH-TITLES(4) TO HL-MONTH-1 
           MOVE MONTH-TITLES(5) TO HL-MONTH-2 
           MOVE MONTH-TITLES(6) TO HL-MONTH-3 

       WHEN = 3  MOVE MONTH-TITLES(7) TO HL-MONTH-1 
           MOVE MONTH-TITLES(8) TO HL-MONTH-2 
           MOVE MONTH-TITLES(9) TO HL-MONTH-3 

       WHEN = 4  MOVE MONTH-TITLES(10) TO HL-MONTH-1 
           MOVE MONTH-TITLES(11) TO HL-MONTH-2 
           MOVE MONTH-TITLES(12) TO HL-MONTH-3 
      END-EVALUATE. 


    300-SALES-ARRAY. 
     PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'NO ' 
      READ SALESAMT-FILE-IN 
       AT END 
        MOVE 'NO ' TO ARE-THERE-MORE-RECORDS 
       NOT AT END 
        PERFORM 310-STORE-DATA 
      END-READ 
     END-PERFORM. 

    310-STORE-DATA. 
     MOVE SM-NUMBER TO SM-NUM-M 
     EVALUATE MONTH-NUMBER 
      WHEN 1     PERFORM 320-FIRST-MONTH 

      WHEN 2     PERFORM 330-SECOND-MONTH 

      WHEN 3     PERFORM 340-THIRD-MONTH 

     END-EVALUATE. 

    320-FIRST-MONTH. 
     ADD SALES-AMOUNT TO 
      MONTH-TOTAL OF MONTH-ARRAY (1, SM-NUM-M). 

    330-SECOND-MONTH. 
     ADD SALES-AMOUNT TO 
      MONTH-TOTAL OF MONTH-ARRAY (2, SM-NUM-M). 

    340-THIRD-MONTH. 
     ADD SALES-AMOUNT TO 
      MONTH-TOTAL OF MONTH-ARRAY (3, SM-NUM-M). 

    400-SALESMAN-NAME. 
     PERFORM UNTIL MORE-TABLE-RECS = 'N' 
      READ SALESMAN-FILE-IN 
       AT END 
        MOVE 'N' TO MORE-TABLE-RECS 
       NOT AT END 
        PERFORM 450-TABLE-LOAD 
      END-READ 
     END-PERFORM. 

    450-TABLE-LOAD. 
     MOVE SM-NUMBER-IN TO SALESMAN-COUNT 
     MOVE SM-NUMBER-IN TO SALESMAN-NUMBER (SALESMAN-COUNT) 
     MOVE SM-NAME-IN TO SALESMAN-NAME (SALESMAN-COUNT). 

    500-PROCESS-FILE. 
     PERFORM UNTIL ROUTINE-CHECK = 99 
      ADD 1 TO ROUTINE-CHECK 
      PERFORM 510-TABLE-SEARCH 
     END-PERFORM. 

    510-TABLE-SEARCH. 
     SEARCH TABLE-ENTRIES 
      WHEN SALESMAN-NUMBER (ROUTINE-CHECK) = ROUTINE-CHECK 
       PERFORM 520-WRITE-FILE 
      WHEN SALESMAN-NUMBER (ROUTINE-CHECK) = 0 
       CONTINUE 
     END-SEARCH. 

    520-WRITE-FILE. 
     MOVE SALESMAN-NAME (ROUTINE-CHECK) TO DL-NAME-COLUMN 
     IF DL-NAME-COLUMN = SPACES 
      MOVE '*** Not Found ***' TO DL-NAME-COLUMN 
     END-IF 
     MOVE ROUTINE-CHECK TO DL-NUM-COLUMN 
     MOVE ROUTINE-CHECK TO SM-NUM-M 
     MOVE MONTH-TOTAL (1, SM-NUM-M) TO DL-MONTH-1 
     MOVE DL-MONTH-1 TO SALESMAN-MATH 
     ADD SALESMAN-MATH TO SALESMAN-TOTAL 
     ADD SALESMAN-MATH TO FINAL-M-TOTAL-1 
     ADD SALESMAN-MATH TO FINAL-TOTAL 
     MOVE MONTH-TOTAL (2, SM-NUM-M) TO DL-MONTH-2 
     MOVE DL-MONTH-2 TO SALESMAN-MATH 
     ADD SALESMAN-MATH TO SALESMAN-TOTAL 
     ADD SALESMAN-MATH TO FINAL-M-TOTAL-2 
     ADD SALESMAN-MATH TO FINAL-TOTAL 
     MOVE MONTH-TOTAL (3, SM-NUM-M) TO DL-MONTH-3 
     MOVE DL-MONTH-3 TO SALESMAN-MATH 
     ADD SALESMAN-MATH TO SALESMAN-TOTAL 
     ADD SALESMAN-MATH TO FINAL-M-TOTAL-3 
     ADD SALESMAN-MATH TO FINAL-TOTAL 
     IF SALESMAN-TOTAL > 0 
      MOVE SALESMAN-TOTAL TO DL-TOTAL 
      MOVE DETAIL-LINE TO SALESAMT-RECORD-OUT 
      WRITE SALESAMT-RECORD-OUT 
       AFTER ADVANCING 2 LINES 
     END-IF 
     MOVE ZEROS TO SALESMAN-TOTAL. 

    600-FINAL-TOTALS. 
     MOVE FINAL-M-TOTAL-1 TO MONTH-1-TOTAL 
     MOVE FINAL-M-TOTAL-2 TO MONTH-2-TOTAL 
     MOVE FINAL-M-TOTAL-3 TO MONTH-3-TOTAL 
     MOVE FINAL-TOTAL TO MONTH-FINAL-TOTAL 
     MOVE TOTALS-LINE TO SALESAMT-RECORD-OUT 
     WRITE SALESAMT-RECORD-OUT 
      AFTER ADVANCING 3 LINES. 

A mí me parece que la lógica es correcta, ya que funciona, pero por alguna razón (en mi mente cuando veo los resultados) salta completamente sobre 520-escritura-archivo cuando corre. Con esto dejo algunas notas.

  1. sé 510-TABLE-BUSQUEDA tiene poco sentido y tengo la intención de cambiar más adelante, pero tengo que arreglar esta primera y funciona por el momento. A menos que sea el problema principal, por favor no me molestes por ello.

  2. Estaré dispuesto a agregar los datos en los archivos SEQ si alguien me lo pide.

  3. Mi código puede ser un poco complejo y lo admito, pero estoy haciendo lo mejor que puedo con el profesor que tengo (la mayoría tengo que aprender esto por mi cuenta).

Agradezco cualquier ayuda que reciba y agradezco a cualquiera que intente ayudar con anticipación.

editar: Estoy usando un compilador llamado Micro Focus, Net Express 5.1 Academic Edition y mi sistema operativo es Windows Vista. En cuanto a lo que el programa muestra cuando lo ejecuto, simplemente muestra mis dos líneas de encabezado y luego mi línea de totales sin mostrar nada más que el primer campo. Espero que eso ayude.

+0

Debería decirnos qué muestra su informe actualmente, para que podamos entender el error. –

+3

En una nota seria, parece poco probable que alguien pueda ayudarlo sin especificar qué implementación de COBOL (ya que está preguntando sobre la diferencia entre correr y llegar a F11, es probable que dependa en gran medida de la implementación). También el código es masivo. Puede tratar de sacar partes sin importancia mientras se asegura de que pueda reproducir el error. – mgiuca

+0

@ Kimmy1235 ~ Seriamente, haría lo que sugiere @mgiuca. Además, @mgiuca tomé COBOL para mi título de AAS en la última década. – jcolebrand

Respuesta

4

No sé a ciencia cierta si este es el problema, pero puedo ver un flujo lógico que no va a funcionar muy bien ...

Primero: 400-SALESMAN-NAME lee vendedores registros de un archivo en mesa de almacenamiento de trabajo SALESMAN-TABLE.

El archivo probablemente se ve algo como:

01Sales Guy One 
02Lance Winslow 
03Scott Peterson 
04Willy Loman 

Cuando se hace el bucle de lectura, SALESMAN-NUMBER será igual al índice de la tabla debido a la manera de cargar la tabla (utilizando SM-NUMBER-IN para establecer el subíndice tabla). No hay problema en lo que va ...

siguiente: 500-PROCESS-FILE bucles a través de todas las filas de la SALESMAN-TABLE ejecutando subíndice ROUTINE-CHECK de 1 a 99 y la realización de 510-TABLE-SEARCH para escribir el informe para el vendedor donde el subíndice es igual SALESMAN-NUMBER ...

Siguiente: La declaración SEARCH. Aquí es donde todo se vuelve extraño y nunca realiza 520-WRITE-FILE. Esta es la razón.

La instrucción SEARCH implementa una búsqueda lineal (SEARCH ALL es una búsqueda binaria). SEARCH simplemente incrementa el índice asociado con la tabla buscada y luego ejecuta un conjunto de pruebas WHEN hasta que una de ellas "se dispara" o el índice se ejecuta al final de la tabla. El índice para su tabla TABLE-ENTRIES es IND-TABLE-ENTRIES. Pero nunca lo configura ni lo referencia (esta es la raíz del problema). Explicaré en un momento ...

Observe que la parte WHEN de su SEARCH está utilizando el subíndice ROUTINE-CHECK. ROUTINE-CHECK se estableció en 500-PROCESS-FILE. También tenga en cuenta que solo obtiene 520-WRITE-FILE si el SALESMAN-NUMBER coincide con el valor de ROUTINE-CHECK, lo que hará si un vendedor con ese número se leyó en el archivo de entrada. Esto podría funcionar porque cargó la tabla de modo que el número de fila sea igual al número de vendedor en 450-TABLE-LOAD.

Ahora, ¿qué sucede si el archivo de entrada no contiene un vendedor donde SM-NUMBER-IN es igual a 01?

Deja para ir a través de él, golpe a golpe ...

ROUTINE-CHECK se establece en 1, SEARCH se invoca y porque el índice IND-TABLE-ENTRIES asociado a la tabla buscado es menor que el número de ocurre en la tabla (se se inicializó a cero en la carga del programa), se ejecutan las cláusulas WHEN.

La primera prueba es WHEN SALESMAN-NUMBER (ROUTINE-CHECK) = ROUTINE-CHECK. Como Salesman 1 no existe, el SALESMAN-NUMBER será cero y la prueba falla (0 <> 1).

Se prueba la siguiente cláusula WHEN y tiene éxito porque (0 = 0); pero esta es una opción de 'no hacer nada', por lo que se ingresa otro ciclo de SEARCH después de que IND-TABLE-ENTRIES se incrementa.

Los mismos resultados en esta y todas las iteraciones subsiguientes a través de la lista SEARCH ed WHEN (ninguna de las cláusulas coinciden) ... Repita este ciclo hasta que IND-TABLE-ENTRIES se incremente más allá del final de la tabla.

En este punto, el SEARCH finaliza y el control vuelve al siguiente ciclo en 500-PROCESS-FILE. Nada ha sido impreso.

500-PROCESS-FILE luego incrementa ROUTINE-CHECK en 1 (ahora es 2). Tenemos un vendedor con un SALESMAN-NUMBER de 02, así que deberíamos obtener algunos resultados, ¿no? ¡Incorrecto! ¿Pero por qué?

Si lee en el verbo SEARCH, encontrará que no restablece el índice de la tabla (en este caso: IND-TABLE-ENTRIES). Comienza a usar cualquier valor que tenga cuando se ingrese la BÚSQUEDA. Nunca lo restablece, por lo que ya está establecido más allá del final de la tabla. La BÚSQUEDA simplemente termina y nada se imprime, nunca más.

Arreglar el problema

Dado que ha cargado TABLE-ENTRIES por número de vendedor en primer lugar, no veo el propósito de utilizar BUSCAR. Sólo hacer algo como:

500-PROCESS-FILE. 
    PERFORM VARYING ROUTINE-CHECK FROM 1 BY 1 
       UNTIL ROUTINE-CHECK > 99 
     IF SALESMAN-NUMBER (ROUTINE-CHECK) = ZERO 
      CONTINUE 
     ELSE 
      PERFORM 520-WRITE-FILE 
     END-IF 
    END-PERFORM.  

Podría también ser una buena idea tener un bucle de inicialización de la mesa para que cada vendedor de número se establece de manera explícita a cero antes de leer el archivo de vendedor.

Si debe utilizar SEARCH en este programa, no olvide configurar y utilizar la variable de índice de tabla asociada al hacer referencia a la tabla que se busca.

+0

Buen análisis. Me salté porque el OP escribió que el programa se está ejecutando bien en modo de depuración. ¿Cómo puede ser? –

+0

Esto lo hace funcionar, pero ahora algunos de los campos que estaban leyendo en la versión anterior no son ahora. Al menos está leyendo ahora. Lo resolveré desde aquí, ¡gracias! – Kimmy1235

+0

@belisarius. Creo que el OP pudo haber estado recogiendo un archivo diferente bajo el depurador, uno con números que iban desde 1 hasta todos los registros que tenía, lo que haría que el programa "funcionara" como se esperaba. Siempre es mejor leer el código. – NealB

0

Pls. Cambiar a esto:

SELECT SALESAMT-FILE-OUT 
     ASSIGN TO 'SALESAMT.RPT' 
     ORGANIZATION IS LINE SEQUENTIAL 
     File Status is FILESTATUS. 

y añadir:

01 FILESTATUS.

02 FILESTATUS-1     Pic 9. 
    88 SUCCESSFULL     Value 0. 
    88 END-OF-FILE     Value 1. 
    88 INVALID-KEY     Value 2. 
    88 PERMANENT-ERROR    Value 3, 9. 
02 FILESTATUS-2     Pic 9. 
    88 DUPLICATE-KEY    Value 2. 
    88 NO-RECORD-FOUND    Value 3. 
    88 FILE-IS-FULL     Value 4. 

Comprobar FILESTATUS cada vez que haces algo con SALESAMT-ARCHIVO-OUT. (También puede hacerlo con los otros archivos). Con la ayuda de esta modificación, podrá ver si hay algún error al hacer una IO.

Este es el primer paso, por lo que este no es el final para Answare pregunta Ure ..

+0

Si bien esto podría funcionar, no he aprendido sobre "El estado del archivo es ..." en clase y mi docente es muy reacio a cosas como esa. Aunque esto me dará algo con lo que trabajar mientras tanto. – Kimmy1235

0

"sólo muestra mis dos líneas de partida y luego mis totales de línea"

En el párrafo 520- ESCRITURA ARCHIVO, tiene el siguiente código

IF SALESMAN-TOTAL > 0 
      MOVE SALESMAN-TOTAL TO DL-TOTAL 
      MOVE DETAIL-LINE TO SALESAMT-RECORD-OUT 
      WRITE SALESAMT-RECORD-OUT 
       AFTER ADVANCING 2 LINES 
     END-IF 

Si VENDEDOR-total es cero, su programa no imprime líneas de detalle. Parece que tiene un error de datos o de lógica en su total de SALESMAN-TOTAL.

+0

Pero eso no explica por qué funciona en modo de depuración :( –

+0

@belisarius - ahhhh - Estaba trabajando hacia atrás, pero debería haber trabajado todo el camino de regreso a la pregunta inicial :-) Tengo otra teoría, pero yo ' ¡Lo probaré antes de publicarlo! – colemanj

+0

Creo que puede estar relacionado con la cláusula ADVANCING utilizada en algo que no es una impresora. Debería funcionar, pero ... Tal vez mientras se depura, el OP es solo mirar los registros antes de que se escriban, y no revisar el archivo resultante. De todos modos, llenaría el procedimiento con DISPLAYS y dejaría que la maldita cosa se ejecute con solo dos registros de entrada. Estoy seguro de que detectará el error. –

1

He agregado esto como una segunda respuesta, ¡lo cual creo que es correcto!

520-WRITE-FILE no se está realizando porque la búsqueda para llamar está fallando.

En 510-TABLE-SEARCH, creo que debe buscar en el índice declarado para la tabla, IND-TABLE-ENTRIES. Probablemente necesite volver a codificar 500-PROCESS-FILE y 510-TABLE-SEARCH.

En otra pregunta, ha preguntado sobre el verbo SEARCH. fmartin dio un enlace que describe cómo funciona, con ejemplos.

+0

Entonces ... funciona en modo de depuración, ¿no? : D –

+0

@belisarius - Creo que su comentario de que "el OP es solo mirar los registros antes de que se escriban" es probablemente correcto. El ESCRIBIR para la línea de detalle nunca sucede. Como viste, la respuesta de NealB da todos los detalles. – colemanj

0

Creo que tiene un problema bastante simple, que tiene que ver con su directorio de trabajo actual.

En la división de entorno, declara los identificadores de archivo y asígnelos a los nombres de archivo.

Cuando depura el programa, los archivos de entrada están en su directorio de trabajo actual y, por lo tanto, se resuelven correctamente.

Cuando ejecuta el programa, supongo que lo está ejecutando desde un directorio diferente, por lo que los archivos de entrada no se resuelven y, por lo tanto, el archivo de salida contiene solo una línea de encabezado.