[ Foro de Pascal ]

Ayuda por favor¡¡¡¡

16-Dec-2011 01:14
Lucas Matias Guardón
11 Respuestas

Compañeros de la comunidad, hice este programita sencillo para practicar el uso de funciones y procedimientos, pero me tira error y ya depure la mayoria y sigue sin andar, asique acudo a ustedes para que lo vean y sepan darme una mono, que les va el codigo...saludos...


PROGRAM STOCKADM2 (INPUT,OUTPUT);
USES CRT;
TYPE
 A=ARRAY[1..6]OF INTEGER;
VAR
 MAT:A;
 RTA,RTA1,RTA2:CHAR;
PROCEDURE ENTRADA (VAR RTA1:CHAR; VAR MAT:A);
  VAR
   OPC,CANTI:INTEGER;
  BEGIN
   WHILE RTA1='s' DO
    BEGIN
     WRITELN('ELIJA EL MODELO DE ADM A CARGAR STOCK: ');
     WRITELN('1_ADM66  2_ADM92  3_ADM125  4_ADM150  5_ADM180  6_ADM240');
     REPEAT
      READLN(OPC)
     UNTIL (OPC>=1) AND (OPC<=6);
     WRITELN('INGRESE LA CANTIDAD DE MATERIAL: ');
     READLN(CANTI);
     CASE OPC OF
      1:MAT[1]:=MAT[1]+CANTI;
      2:MAT[2]:=MAT[2]+CANTI;
      3:MAT[3]:=MAT[3]+CANTI;
      4:MAT[4]:=MAT[4]+CANTI;
      5:MAT[5]:=MAT[5]+CANTI;
      6:MAT[6]:=MAT[6]+CANTI;
     END;
     WRITELN('CONTINUA CARGANDO MATERIALES?¨');
     READLN(RTA1);
    END;
   END;
 PROCEDURE SALIDA (VAR RTA2:CHAR; VAR MAT:A);
  VAR
   OPC, CANTI: INTEGER;
  BEGIN
   WHILE RTA='s' DO
    BEGIN
     WRITELN('ELIJA EL MODELO DE ADM: ');
     WRITELN('1_ADM66  2_ADM92  3_ADM125  4_ADM150  5_ADM180  6_ADM240');
     REPEAT
      READLN(OPC)
     UNTIL (OPC>=1) AND (OPC<=6);
     WRITELN('INGRESE LA CANTIDAD A ENTREGAR: ');
     READLN(CANTI);
     CASE OPC OF
      1:MAT[1]:=MAT[1]-CANTI;
      2:MAT[2]:=MAT[2]-CANTI;
      3:MAT[3]:=MAT[3]-CANTI;
      4:MAT[4]:=MAT[4]-CANTI;
      5:MAT[5]:=MAT[5]-CANTI;
      6:MAT[6]:=MAT[6]-CANTI;
     END;
     WRITELN('DESEA CONTINUAR ENTREGANDO ALGUN OTRO MATERIAL?¨');
     READLN(RTA);
    END;
  END;
PROCEDURE SALUDO();
 BEGIN
  CLRSCR;
  WRITELN('BIENVENIDOS AL CONTROL DE SCTOCK DE ADMïS DE NILSO TORRE S.A.');
  WRITELN('PRECIONE UN TECLA PARA CONTINUAR');
  READLN();
 END;
PROCEDURE INICIA (VAR RTA,RTA1,RTA2:CHAR; VAR MAT:A);
 VAR
  I:INTEGER;
 BEGIN
  FOR I:=1 TO 6 DO
   BEGIN
    MAT[I]:=0;
   END;
  RTA:='n'; RTA1:='s'; RTA2:='s';
 END;
PROCEDURE MENUPPAL ();
 VAR
  OP:INTEGER;
 BEGIN
  WRITELN('ELIJA UNA OPCION DE MENé: ');
  WRITELN('1_ENTRADA DE MATERIA       2_SALIDA DE MATERIAL');
  REPEAT
   READLN(OP)
  UNTIL (OP=1) OR (OP=2);
  CLRSCR;
  IF OP=1 THEN
   BEGIN
    ENTRADA (RTA1, MAT);
   END;
  END
  ELSE
   BEGIN
    IF OP=2 THEN
     BEGIN
      SALIDA (RTA2, MAT);
     END;
    END
   END;
  WRITELN('LISTADO DE STOCK: ');
  WRITELN('ADM66  ADM92  ADM125  ADM150  ADM180  ADM240');
  WRITELN(MAT[1], MAT[2], MAT[3], MAT[4], MAT[5], MAT[6]);
  WRITELN('DESEA SALIR DEL PROGRAMA?¨');
  READLN(RTA);
 END;
PROCEDURE LISTA(MAT:A);
 BEGIN
  WRITELN('LISTA DE STOCK ACTUALIZADA: ');
  WRITELN('ADM66  ADM92  ADM125  ADM150  ADM180  ADM240');
  WRITELN(MAT[1], MAT[2], MAT[3], MAT[4], MAT[5], MAT[6]);
 END;
BEGIN
  SALUDO();
  INICIA(RTA,RTA1,RTA2,MAT);
  WHILE RTA='n' DO
   BEGIN
    MENUPPAL(RTA1,RTA2,MAT);
    WRITELN('DESEA SALIR DEL PROGRAMA?');
    READLN(RTA);
   END;
   LISTA(MAT);
 END.


17-Dec-2011 23:19
Luis Torres (+18)

En primer lugar, antes de colocar el código, deberías explicar en palabras lo que esperas haga tu programa, eso facilita mucho el entendimiento del mismo y tendrías más personas dispuestas a ayudarte. En segundo lugar podrías especificar si usas Turbo Pascal o FreePascal.
Yo uso Turbo Pascal y, compilé tu trabajo en ese compilador. En cuanto al código en sí, encontré varios errores:
1) Los procedimientos Readln, cuando no tienen argumentos debes colocarlos sin el paréntesis. De la misma forma para cualquier procedimiento. En varios colocaste los paréntesis y no habían argumentos dentro, así que deberías eliminar todos los paréntesis en cada procedimiento creado por tí y, en los predefinidos como es el caso del Readln.
2) No debes borrar los paréntesis del procedimiento MENUPPL, porque allí más bien lo que olvidastes es colocar los argumentos. Fíjate que en la llamada que haces a ese procedimiento (en el bloque principal de tu código), le pasas tres argumentos (RTA1,RTA2,MAT), pero en la definición del procedimiento éstos parámetros no aparecen, debes colocarlos.
3) Encontré unos End demás. En el procedimiento MENUPPL, en cada if hay un End demás, bórralos.
4) Una vez hecho esta depuración tu programa debería compilar y por ende correr. Yo hice las correcciones y me atreví a borrar parte del código que considero de sobra. Por ejemplo, cuando terminas el programa, en la parte en la que te preguntan sobre si quieres salirte, debes indicar dos veces s para que efectivamente puedas salir. Allí tienes que borrar código.
5) Otro comentario que quisiera hacerte es que en el MENUPPL realiza dos tareas: presentar el menú y listar los datos. Podrías sustituir la parte de listar los datos por el procedimiento LISTA. No te olvides de formatear los datos que presentes, porque aparecen todos juntos.
6) Hicistes algo muy bueno digno de aplaudir, y es que colocaste el código bien con sangrías, eso ayuda mucho a comprenderlo.
AQUÍ te dejo el código que yo corregí con algunas de las modificaciones extras que te señalé anteriormente, no están todas  las correcciones, pero el programa compila, corre y presenta los resultados de manera que se pueden leer:
PROGRAM STOCKADM2 (INPUT,OUTPUT);
USES CRT;
TYPE
 A=ARRAY[1..6]OF INTEGER;
VAR
 MAT:A;
 RTA,RTA1,RTA2:CHAR;
PROCEDURE ENTRADA (VAR RTA1:CHAR; VAR MAT:A);
 VAR
   OPC,CANTI:INTEGER;
 BEGIN
   WHILE RTA1='s' DO
   BEGIN
     WRITELN('ELIJA EL MODELO DE ADM A CARGAR STOCK: ');
     WRITELN('1_ADM66  2_ADM92  3_ADM125  4_ADM150  5_ADM180  6_ADM240');
     REPEAT
     READLN(OPC)
     UNTIL (OPC>=1) AND (OPC<=6);
     WRITELN('INGRESE LA CANTIDAD DE MATERIAL: ');
     READLN(CANTI);
     CASE OPC OF
     1:MAT[1]:=MAT[1]+CANTI;
     2:MAT[2]:=MAT[2]+CANTI;
     3:MAT[3]:=MAT[3]+CANTI;
     4:MAT[4]:=MAT[4]+CANTI;
     5:MAT[5]:=MAT[5]+CANTI;
     6:MAT[6]:=MAT[6]+CANTI;
     END;
     WRITELN('CONTINUA CARGANDO MATERIALES?¨');
     READLN(RTA1);
   END;
   END;
 PROCEDURE SALIDA (VAR RTA2:CHAR; VAR MAT:A);
 VAR
   OPC, CANTI: INTEGER;
 BEGIN
   WHILE RTA='s' DO
   BEGIN
     WRITELN('ELIJA EL MODELO DE ADM: ');
     WRITELN('1_ADM66  2_ADM92  3_ADM125  4_ADM150  5_ADM180  6_ADM240');
     REPEAT
     READLN(OPC)
     UNTIL (OPC>=1) AND (OPC<=6);
     WRITELN('INGRESE LA CANTIDAD A ENTREGAR: ');
     READLN(CANTI);
     CASE OPC OF
     1:MAT[1]:=MAT[1]-CANTI;
     2:MAT[2]:=MAT[2]-CANTI;
     3:MAT[3]:=MAT[3]-CANTI;
     4:MAT[4]:=MAT[4]-CANTI;
     5:MAT[5]:=MAT[5]-CANTI;
     6:MAT[6]:=MAT[6]-CANTI;
     END;
     WRITELN('DESEA CONTINUAR ENTREGANDO ALGUN OTRO MATERIAL?¨');
     READLN(RTA);
   END;
 END;
PROCEDURE SALUDO;
 BEGIN
 CLRSCR;
 WRITELN('BIENVENIDOS AL CONTROL DE SCTOCK DE ADMïS DE NILSO TORRE S.A.');
 WRITELN('PRECIONE UN TECLA PARA CONTINUAR');
 READLN;
 END;
PROCEDURE INICIA (VAR RTA,RTA1,RTA2:CHAR; VAR MAT:A);
 VAR
 I:INTEGER;
 BEGIN
 FOR I:=1 TO 6 DO
   BEGIN
   MAT[I]:=0;
   END;
 RTA:='n'; RTA1:='s'; RTA2:='s';
 END;
PROCEDURE MENUPPAL (VAR RTA1,RTA2:CHAR; VAR MAT:A);
 VAR
 OP:INTEGER;
 BEGIN
 WRITELN('ELIJA UNA OPCION DE MENU: ');
 WRITELN('1_ENTRADA DE MATERIAL      2_SALIDA DE MATERIAL');
 REPEAT
   READLN(OP)
 UNTIL (OP=1) OR (OP=2);
 CLRSCR;
 IF OP=1 THEN
   BEGIN
   ENTRADA (RTA1, MAT);
   END
 ELSE
   BEGIN
   IF OP=2 THEN
     BEGIN
     SALIDA (RTA2, MAT);
     END;
   END;
 WRITELN('LISTADO DE STOCK: ');
 WRITELN('ADM66  ADM92  ADM125  ADM150  ADM180  ADM240');
 WRITELN(MAT[1]:4, MAT[2]:7, MAT[3]:7, MAT[4]:8, MAT[5]:8, MAT[6]:8);
 WRITELN('DESEA SALIR DEL PROGRAMA?¨');
 READLN(RTA);
 END;
PROCEDURE LISTA(MAT:A);
 BEGIN
 WRITELN('LISTA DE STOCK ACTUALIZADA: ');
 WRITELN('ADM66  ADM92  ADM125  ADM150  ADM180  ADM240');
 WRITELN(MAT[1], MAT[2], MAT[3], MAT[4], MAT[5], MAT[6]);
 END;
BEGIN
 SALUDO;
 INICIA(RTA,RTA1,RTA2,MAT);
 WHILE RTA='n' DO
   BEGIN
   MENUPPAL(RTA1,RTA2,MAT);
   END;
   LISTA(MAT);
 END.


19-Dec-2011 13:40
Lucas Matias Guardón

Luis; gracias nuevamente por tu ayuda, perdona que tarde en contestar pero no me pude poner mucho con la PC estos días; te comento que ya arregle algunas cosas que me señalaste, menos los de los paréntesis en el readln ya que estoy usando Free Pascal y si no los pongo me tira error, no se porque.
Ahora lo que estoy asiendo es tratar de agregar un registro y archivos al programita, voy a poner los comentarios para que entiendan lo que quiero hacer y lo subo.
Nuevamente, gracias.


19-Dec-2011 14:48
Lucas Matias Guardón

Estimados Compañeros; subo la codificación del programa con el archivo y el registro agregado...me tira error, esta marcado en donde en lo que voy a subir, espero sepan darme una mano como siempre, gracias...


PROGRAM STOCKADM2 (INPUT,OUTPUT);
USES CRT;
TYPE
 STOCK=RECORD  {Registro que va a guarad el modelo del ADM; una breve descripcion y la cantidad en stock}
        MODE:INTEGER;
        DES:STRING[20];
        CANT:INTEGER;
       END;
 A=ARRAY[1..6]OF STOCK;
 MATE= FILE OF A;
VAR
 MAT:A;
 stoc:MATE;
 RTA,RTA1,RTA2:CHAR;
 OP:INTEGER;
PROCEDURE NILSO (); {Es para indentificar la empresa en todo momento del uso del programa}
 BEGIN
  gotoxy(33,1);textcolor(8);write('~~~~~~~~~~~~~~~~~~~~');
  gotoxy(33,2);textcolor(8);write('~');
  gotoxy(33,3);textcolor(8);write('~');
  gotoxy(33,4);textcolor(8);write('~');
  gotoxy(33,5);textcolor(8);write('~');
  gotoxy(33,5);textcolor(8);write('~~~~~~~~~~~~~~~~~~~');
  gotoxy(52,2);textcolor(8);write('~');
  gotoxy(52,3);textcolor(8);write('~');
  gotoxy(52,4);textcolor(8);write('~');
  gotoxy(52,5);textcolor(8);write('~');
  gotoxy(35,3);textcolor(1);
  WRITELN('NILSO TORRE S.A.');
  gotoxy(29,7);textcolor(10);write('+++++++++++++++++++++++++++');
  gotoxy(29,9);textcolor(10);write('+++++++++++++++++++++++++++');
  gotoxy(29,8);textcolor(10);write('+');
  gotoxy(55,8);textcolor(10);write('+');
  gotoxy(30,8);textcolor(13);
  WRITELN('CONTROL DE STOCK DE ADMïS');
 END;
PROCEDURE ENTRADA (VAR RTA1:CHAR; VAR MAT:A); {Realiza la carga de stock, cantidad de material comprado}
  VAR
   OPC,CANTI:INTEGER;
  BEGIN
   CLRSCR;
   NILSO();
   WHILE RTA1='s' DO
    BEGIN
     GOTOXY(25,11);TEXTCOLOR(1);
     WRITELN('ELIJA EL MODELO DE ADM A CARGAR STOCK: ');
     GOTOXY(15,13);
     WRITELN('1_ADM66  2_ADM92  3_ADM125  4_ADM150  5_ADM180  6_ADM240');
     GOTOXY(40,14);
     REPEAT
      READLN(OPC)
     UNTIL (OPC>=1) AND (OPC<=6);
     GOTOXY(1,14);DELLINE();GOTOXY(2,15);
     WRITE('INGRESE LA CANTIDAD DE MATERIAL:  ');
     READLN(CANTI);
     CASE OPC OF
      1:MAT[1].CANT:=MAT[1].CANT+CANTI;
      2:MAT[2].CANT:=MAT[2].CANT+CANTI;
      3:MAT[3].CANT:=MAT[3].CANT+CANTI;
      4:MAT[4].CANT:=MAT[4].CANT+CANTI;
      5:MAT[5].CANT:=MAT[5].CANT+CANTI;
      6:MAT[6].CANT:=MAT[6].CANT+CANTI;
     END;
     WRITE(stoc,MAT);
     CLRSCR;
     NILSO();
     GOTOXY(25,12);TEXTCOLOR(4);
     WRITELN('CONTINUA CARGANDO MATERIALES?¨');
     GOTOXY(35,14);
     WRITELN('s=SI   n=NO');
     GOTOXY(40,15);
     READLN(RTA1);
     CLRSCR;
     NILSO();
    END;
   END;
 PROCEDURE SALIDA (VAR RTA2:CHAR; VAR MAT:A); {Modifica el stock con la entrega de los materiales}
  VAR
   OPC,CANTI: INTEGER;
  BEGIN
   CLRSCR;
   NILSO();
   WHILE RTA2='s' DO
    BEGIN
     GOTOXY(25,11);TEXTCOLOR(1);
     WRITELN('ELIJA EL MODELO DE ADM: ');
     GOTOXY(10,13);
     WRITELN('1_ADM66  2_ADM92  3_ADM125  4_ADM150  5_ADM180  6_ADM240');
     GOTOXY(40,14);
     REPEAT
      READLN(OPC)
     UNTIL (OPC>=1) AND (OPC<=6);
     GOTOXY(1,14);DELLINE();GOTOXY(2,15);
     WRITE('INGRESE LA CANTIDAD A ENTREGAR:  ');
     READLN(CANTI);
     CASE OPC OF
      1:MAT[1].CANT:=MAT[1].CANT-CANTI;
      2:MAT[2].CANT:=MAT[2].CANT-CANTI;
      3:MAT[3].CANT:=MAT[3].CANT-CANTI;
      4:MAT[4].CANT:=MAT[4].CANT-CANTI;
      5:MAT[5].CANT:=MAT[5].CANT-CANTI;
      6:MAT[6].CANT:=MAT[6].CANT-CANTI;
     END;
     WRITE(stoc,MAT);
     CLRSCR;
     NILSO();
     GOTOXY(15,12);TEXTCOLOR(4);
     WRITELN('DESEA CONTINUAR ENTREGANDO ALGUN OTRO MATERIAL?¨');
     GOTOXY(30,14);
     WRITELN('s=SI   n=NO');
     GOTOXY(35,15);
     READLN(RTA2);
     CLRSCR;
     NILSO();
    END;
  END;
PROCEDURE SALUDO(); {Saludo inicial al abrir el programa}
 BEGIN
  CLRSCR;NILSO();
  GOTOXY(10,11);TEXTCOLOR(1);
  WRITELN('BIENVENIDOS AL CONTROL DE SCTOCK DE ADMïS DE NILSO TORRE S.A.');
  GOTOXY(24,13);TEXTCOLOR(15);
  WRITELN('PRECIONE UN TECLA PARA CONTINUAR');
  GOTOXY(1,14);DELLINE();GOTOXY(40,15);
  READLN();
 END;
PROCEDURE INICIA (VAR RTA,RTA1,RTA2:CHAR; VAR MAT:A); {Inicializa todas la variables}
 VAR
  I:INTEGER;
 BEGIN
  FOR I:=1 TO 6 DO
   BEGIN
    MAT[I].CANT:=0;
   END;
  MAT[1].MODE:=66;MAT[2].MODE:=92;MAT[3].MODE:=125;MAT[4].MODE:=150;MAT[5].MODE:=180;MAT[6].MODE:=240;
  RTA:='n'; RTA1:='s'; RTA2:='s';
  WRITE(stoc,MAT);
 END;
PROCEDURE MENUPPAL (VAR OP:INTEGER); {Menu principal, elijo entre cargar el stock o entregar el mismo}
 BEGIN
  CLRSCR;
  NILSO();
  GOTOXY(30,11);TEXTCOLOR(1);
  WRITELN('ELIJA UNA OPCION DE MENé: ');
  GOTOXY(20,13);
  WRITELN('1_ENTRADA DE MATERIA       2_SALIDA DE MATERIAL');
  GOTOXY(43,15);
  REPEAT
   READLN(OP)
  UNTIL (OP=1) OR (OP=2);
  GOTOXY(1,14);DELLINE();
  CLRSCR;
  NILSO();
  IF OP=1
  THEN BEGIN
    ENTRADA (RTA1, MAT);
   END
  ELSE
   BEGIN
    IF OP=2
    THEN BEGIN
      SALIDA (RTA2, MAT);
     END
   END;
  CLRSCR;
  NILSO();
  GOTOXY(15,10);TEXTCOLOR(1);
  WRITELN('LISTADO DE STOCK: ');
  READ(stoc,MAT);
  gotoxy(15,11);textcolor(7);write('================');
  gotoxy(18,13);textcolor(14);write('************************************************');
  GOTOXY(20,14);TEXTCOLOR(3);
  WRITE(MAT[1].MODE,MAT[2].MODE,MAT[3].MODE,MAT[4].MODE,MAT(5).MODE,MAT[6].MAT); {Me tira el error "Unknow record field identifier "MAT"}
  GOTOXY(21,16);WRITE(MAT[1].CANT);GOTOXY(28,16);WRITE(MAT[2].CANT);
  GOTOXY(35,16);WRITE(MAT[3].CANT);GOTOXY(43,16);WRITE(MAT[4].CANT);
  GOTOXY(51,16);WRITE(MAT[5].CANT);GOTOXY(59,16);WRITE(MAT[6].CANT);
  gotoxy(18,17);textcolor(14);write('************************************************');
 END;
PROCEDURE LISTA(MAT:A);{Al terminar todas las tareas me muestra el stock actualizado al cerrar el programa}
 BEGIN
  CLRSCR;
  NILSO();
  GOTOXY(15,10);TEXTCOLOR(1);
  WRITELN('LISTA DE STOCK ACTUALIZADA: ');
  READ(stoc,MAT);
  gotoxy(15,11);textcolor(7);write('==========================');
  gotoxy(18,13);textcolor(14);write('************************************************');
  GOTOXY(20,14);TEXTCOLOR(3);
  WRITE(MAT(1).MODE,MAT(2).MODE,MAT(3).MODE,MAT(4).MODE,MAT(5).MODE,MAT(6).MODE);
  GOTOXY(21,16);WRITE(MAT[1].CANT);GOTOXY(28,16);WRITE(MAT[2].CANT);
  GOTOXY(35,16);WRITE(MAT[3].CANT);GOTOXY(43,16);WRITE(MAT[4].CANT);
  GOTOXY(51,16);WRITE(MAT[5].CANT);GOTOXY(59,16);WRITE(MAT[6].CANT);
  gotoxy(18,17);textcolor(14);write('************************************************');
  GOTOXY(13,22);TEXTCOLOR(2);
  CLOSE(stoc);
  WRITELN('PARA CONTINUAR CON EL CIERRE DEL PROGRAMA OPRIMA UNA TECLA');
  READLN();
 END;
BEGIN {Cuerpo del programa principla}
  assign(stoc,'C:\Nilso Torre\Stock.txt'); {Asingno la variable al archivo Fisico, creado manualmente en el S.O.}
  RESET(stoc);
  SALUDO();
  INICIA(RTA,RTA1,RTA2,MAT);
  WHILE RTA='n' DO
   BEGIN
    CLRSCR;
    NILSO();
    MENUPPAL(OP);
    GOTOXY(30,22);TEXTCOLOR(4);
    WRITELN('DESEA SALIR DEL PROGRAMA?');
    GOTOXY(40,23);
    READLN(RTA);
   END;
   LISTA(MAT);
 END.


19-Dec-2011 18:56
Lucas Matias Guardón

Estimados; estuve dándole vuelta al programita y logre depurar todos los errores y funciono, pero me hace algo raro...lo ejecuto y funciona todo bien, pero cuando realizo la carga de un material, ingreso la cantidad y me sale del programa, termina repentinamente y no se porque, ya lo di vuelta y no encuentro que es, seguro algo de los archivos porque no la tengo muy clara con eso, es el primer programa que hago con archivos, les dejo el codigo a ver si me pueden ayudar...


PROGRAM STOCKADM2 (INPUT,OUTPUT);
USES CRT;
TYPE
 STOCK=RECORD  {Registro que va a guarad el modelo del ADM; una breve descripcion y la cantidad en stock}
        MODE:INTEGER;
        DES:STRING[20];
        CANT:INTEGER;
       END;
 A=ARRAY[1..6]OF STOCK;
 MATE= FILE OF A;
VAR
 MAT:A;
 stoc:MATE;
 RTA,RTA1,RTA2:CHAR;
 OP:INTEGER;
PROCEDURE NILSO (); {Es para indentificar la empresa en todo momento del uso del programa}
 BEGIN
  gotoxy(33,1);textcolor(8);write('~~~~~~~~~~~~~~~~~~~~');
  gotoxy(33,2);textcolor(8);write('~');
  gotoxy(33,3);textcolor(8);write('~');
  gotoxy(33,4);textcolor(8);write('~');
  gotoxy(33,5);textcolor(8);write('~');
  gotoxy(33,5);textcolor(8);write('~~~~~~~~~~~~~~~~~~~');
  gotoxy(52,2);textcolor(8);write('~');
  gotoxy(52,3);textcolor(8);write('~');
  gotoxy(52,4);textcolor(8);write('~');
  gotoxy(52,5);textcolor(8);write('~');
  gotoxy(35,3);textcolor(1);
  WRITELN('NILSO TORRE S.A.');
  gotoxy(29,7);textcolor(10);write('+++++++++++++++++++++++++++');
  gotoxy(29,9);textcolor(10);write('+++++++++++++++++++++++++++');
  gotoxy(29,8);textcolor(10);write('+');
  gotoxy(55,8);textcolor(10);write('+');
  gotoxy(30,8);textcolor(13);
  WRITELN('CONTROL DE STOCK DE ADMïS');
 END;
PROCEDURE ENTRADA (VAR RTA1:CHAR; VAR MAT:A); {Realiza la carga de stock, cantidad de material comprado}
  VAR
   OPC,CANTI:INTEGER;
  BEGIN
   CLRSCR;
   NILSO();
   WHILE RTA1='s' DO
    BEGIN
     GOTOXY(25,11);TEXTCOLOR(1);
     WRITELN('ELIJA EL MODELO DE ADM A CARGAR STOCK: ');
     GOTOXY(15,13);
     WRITELN('1_ADM66  2_ADM92  3_ADM125  4_ADM150  5_ADM180  6_ADM240');
     GOTOXY(40,14);
     REPEAT
      READLN(OPC)
     UNTIL (OPC>=1) AND (OPC<=6);
     GOTOXY(1,14);DELLINE();GOTOXY(2,15);
     WRITE('INGRESE LA CANTIDAD DE MATERIAL:  ');
     READLN(CANTI);
     READ(stoc,MAT);
     CASE OPC OF
      1:MAT[1].CANT:=MAT[1].CANT+CANTI;
      2:MAT[2].CANT:=MAT[2].CANT+CANTI;
      3:MAT[3].CANT:=MAT[3].CANT+CANTI;
      4:MAT[4].CANT:=MAT[4].CANT+CANTI;
      5:MAT[5].CANT:=MAT[5].CANT+CANTI;
      6:MAT[6].CANT:=MAT[6].CANT+CANTI;
     END;
     WRITE(stoc,MAT);
     CLRSCR;
     NILSO();
     GOTOXY(25,12);TEXTCOLOR(4);
     WRITELN('CONTINUA CARGANDO MATERIALES?¨');
     GOTOXY(35,14);
     WRITELN('s=SI   n=NO');
     GOTOXY(40,15);
     READLN(RTA1);
     CLRSCR;
     NILSO();
    END;
   END;
 PROCEDURE SALIDA (VAR RTA2:CHAR; VAR MAT:A); {Modifica el stock con la entrega de los materiales}
  VAR
   OPC,CANTI: INTEGER;
  BEGIN
   CLRSCR;
   NILSO();
   WHILE RTA2='s' DO
    BEGIN
     GOTOXY(25,11);TEXTCOLOR(1);
     WRITELN('ELIJA EL MODELO DE ADM: ');
     GOTOXY(10,13);
     WRITELN('1_ADM66  2_ADM92  3_ADM125  4_ADM150  5_ADM180  6_ADM240');
     GOTOXY(40,14);
     REPEAT
      READLN(OPC)
     UNTIL (OPC>=1) AND (OPC<=6);
     GOTOXY(1,14);DELLINE();GOTOXY(2,15);
     WRITE('INGRESE LA CANTIDAD A ENTREGAR:  ');
     READLN(CANTI);
     READ(stoc,MAT);
     CASE OPC OF
      1:MAT[1].CANT:=MAT[1].CANT-CANTI;
      2:MAT[2].CANT:=MAT[2].CANT-CANTI;
      3:MAT[3].CANT:=MAT[3].CANT-CANTI;
      4:MAT[4].CANT:=MAT[4].CANT-CANTI;
      5:MAT[5].CANT:=MAT[5].CANT-CANTI;
      6:MAT[6].CANT:=MAT[6].CANT-CANTI;
     END;
     WRITE(stoc,MAT);
     CLRSCR;
     NILSO();
     GOTOXY(15,12);TEXTCOLOR(4);
     WRITELN('DESEA CONTINUAR ENTREGANDO ALGUN OTRO MATERIAL?¨');
     GOTOXY(30,14);
     WRITELN('s=SI   n=NO');
     GOTOXY(35,15);
     READLN(RTA2);
     CLRSCR;
     NILSO();
    END;
  END;
PROCEDURE SALUDO(); {Saludo inicial al abrir el programa}
 BEGIN
  CLRSCR;NILSO();
  GOTOXY(10,11);TEXTCOLOR(1);
  WRITELN('BIENVENIDOS AL CONTROL DE SCTOCK DE ADMïS DE NILSO TORRE S.A.');
  GOTOXY(24,13);TEXTCOLOR(15);
  WRITELN('PRECIONE UN TECLA PARA CONTINUAR');
  GOTOXY(1,14);DELLINE();GOTOXY(40,15);
  READLN();
 END;
PROCEDURE INICIA (VAR RTA,RTA1,RTA2:CHAR; VAR MAT:A); {Inicializa todas la variables}
 VAR
  I:INTEGER;
 BEGIN
  FOR I:=1 TO 6 DO
   BEGIN
    MAT[I].CANT:=0;
   END;
  MAT[1].MODE:=66;MAT[2].MODE:=92;MAT[3].MODE:=125;MAT[4].MODE:=150;MAT[5].MODE:=180;MAT[6].MODE:=240;
  RTA:='n'; RTA1:='s'; RTA2:='s';
  WRITE(stoc,MAT);
 END;
PROCEDURE MENUPPAL (VAR OP:INTEGER); {Menu principal, elijo entre cargar el stock o entregar el mismo}
 BEGIN
  CLRSCR;
  NILSO();
  GOTOXY(30,11);TEXTCOLOR(1);
  WRITELN('ELIJA UNA OPCION DE MENé: ');
  GOTOXY(20,13);
  WRITELN('1_ENTRADA DE MATERIA       2_SALIDA DE MATERIAL');
  GOTOXY(43,15);
  REPEAT
   READLN(OP)
  UNTIL (OP=1) OR (OP=2);
  GOTOXY(1,14);DELLINE();
  CLRSCR;
  NILSO();
  IF OP=1
  THEN BEGIN
    ENTRADA (RTA1, MAT);
   END
  ELSE
   BEGIN
    IF OP=2
    THEN BEGIN
      SALIDA (RTA2, MAT);
     END
   END;
  CLRSCR;
  NILSO();
  GOTOXY(15,10);TEXTCOLOR(1);
  WRITELN('LISTADO DE STOCK: ');
  READ(stoc,MAT);
  gotoxy(15,11);textcolor(7);write('================');
  gotoxy(18,13);textcolor(14);write('************************************************');
  GOTOXY(20,14);TEXTCOLOR(3);
  WRITELN('ADM',MAT[1].MODE,'  ADM',MAT[2].MODE,'  ADM',MAT[3].MODE,'  ADM',MAT[4].MODE,'  ADM',MAT[5].MODE,'  ADM',MAT[6].MODE);
  GOTOXY(21,16);WRITE(MAT[1].CANT);GOTOXY(28,16);WRITE(MAT[2].CANT);
  GOTOXY(35,16);WRITE(MAT[3].CANT);GOTOXY(43,16);WRITE(MAT[4].CANT);
  GOTOXY(51,16);WRITE(MAT[5].CANT);GOTOXY(59,16);WRITE(MAT[6].CANT);
  gotoxy(18,17);textcolor(14);write('************************************************');
 END;
PROCEDURE LISTA(MAT:A);{Al terminar todas las tareas me muestra el stock actualizado al cerrar el programa}
 BEGIN
  CLRSCR;
  NILSO();
  GOTOXY(15,10);TEXTCOLOR(1);
  WRITELN('LISTA DE STOCK ACTUALIZADA: ');
  READ(stoc,MAT);
  gotoxy(15,11);textcolor(7);write('==========================');
  gotoxy(18,13);textcolor(14);write('************************************************');
  GOTOXY(20,14);TEXTCOLOR(3);
  WRITELN('ADM',MAT[1].MODE,'  ADM',MAT[2].MODE,'  ADM',MAT[3].MODE,MAT[4].MODE,MAT[5].MODE,MAT[6].MODE);
  GOTOXY(21,16);WRITE(MAT[1].CANT);GOTOXY(28,16);WRITE(MAT[2].CANT);
  GOTOXY(35,16);WRITE(MAT[3].CANT);GOTOXY(43,16);WRITE(MAT[4].CANT);
  GOTOXY(51,16);WRITE(MAT[5].CANT);GOTOXY(59,16);WRITE(MAT[6].CANT);
  gotoxy(18,17);textcolor(14);write('************************************************');
  GOTOXY(13,22);TEXTCOLOR(2);
  CLOSE(stoc);
  WRITELN('PARA CONTINUAR CON EL CIERRE DEL PROGRAMA OPRIMA UNA TECLA');
  READLN();
 END;
BEGIN {Cuerpo del programa principla}
  assign(stoc,'C:\Nilso Torre\Stock.txt'); {Asingno la variable al archivo Fisico, creado manualmente en el S.O.}
  RESET(stoc);
  SALUDO();
  INICIA(RTA,RTA1,RTA2,MAT);
  WHILE RTA='n' DO
   BEGIN
    CLRSCR;
    NILSO();
    MENUPPAL(OP);
    GOTOXY(30,22);TEXTCOLOR(4);
    WRITELN('DESEA SALIR DEL PROGRAMA?');
    GOTOXY(40,23);
    READLN(RTA);
   END;
   LISTA(MAT);
 END.


21-Dec-2011 18:06
Luis Torres (+18)

Cuando trabajo con archivos, yo prefiero trabajar con archivos con tipo. Los archivos de textos son muy buenos, pero para leer datos, así los podrás editar directamente desde el archivo mismo. Me parece que deberías agregar una opción más al menú principal, una opción con la que puedas inicializar el archivo con tipo. Yo elaboré un programa para inicializar el archivo del stock. Los archivos serán muy útiles para guardar la cantidad de unidades de cada ADM, además podrás restar la cantidades cuando se produzcan salidas de materiales. Por cierto, esa opción se ejecutará una vez, por eso es bueno tenerla sólo como opción y no como código que se ejecute cada vez que se corra el programa. Aquí te dejo el programa:

program StockAdm_CrearArchivo;
uses CRT;
Type
Stock= Record
  Mode: integer;
  Des: String[20];
  Cant: integer;
End;
A= Array[1..6] of Stock;
Mate= file of A;

var
Mat: A;
stoc: Mate;
Rta, Rta1, Rta2: char;
Op: integer;
i: integer;

procedure IniciaArchivo;
var
i: integer;
Mat: A;

begin
 Assign(stoc,'C:\Stock.dat');
 Rewrite(stoc);

 Mat[1].Mode:=66; Mat[2].Mode:=92; Mat[3].Mode:=125;
 Mat[4].Mode:=150; Mat[5].Mode:=180; Mat[6].Mode:=240;

 Mat[1].Des:='ADM66'; Mat[2].Des:='ADM92'; Mat[3].Des:='ADM125';
 Mat[1].Des:='ADM150'; Mat[2].Des:='ADM180'; Mat[3].Des:='ADM240';

 for i:=1 to 6 do
   Mat[i].Cant:=0;

 write(stoc,Mat);
 close(stoc);
end;

{Programa Principal}
Begin
 IniciaArchivo;
 Readln;
End.

Con este programa podrás crear el archivo Stock.dat y estará inicializado, listo para ser usado por las rutinas Entradas y Salidas de tu programa. La ruta que tú colocas: 'C:\Nilso Torre\Stock.txt', ese espacio entre Nilso y Torre, no se puede acceder, al menos en mi computador. Es preferible crear el archivo en el disco C directamente (directorio raiz) o en la misma carpeta donde guardas el programa. Espero haberte ayudado en algo. Saludos.


22-Dec-2011 14:12
Luis Torres (+18)

Uno de los errores que tienes se refiere a las operaciones de lectura y escritura de archivos. Resulta que no se puede leer y escribir en un archivo a la vez (no se pueden realizar estas dos operaciones simultaneamente). Si vas a leer, pues debes asignar una dirección al archivo, luego abrirlo para la escritura y finalmente cerrarlo. Tú realizastes una lectura (read(stoc,MAT)) y seguidamente una escritura (write(stoc,MAT)) sin haber cerrado el archivo que estaba abierto para ser leído. Antes de ejecutar la operación de escritura, debes cerrar el archivo y luego abrirlo para escribir en él (rewrite). Yo re-hice el código, le quité mucho de los "adornos", pero funciona bien. Utilicé un archivo de tipo Array[1..6] of Stock. El archivo se llama Stock.dat y está ubicado en el directorio raiz (C). En el menú principal coloqué cuatro opciones: Entrada, Salida, Lista y InicaArchivo. IniciaArchivo configura los nombres de los ADM, los modelos e incializa las cantidades a cero; este procedimiento debe ser ejecutado una sola vez: al inicio de las operaciones del negocio, si el archivo Stock.dat no existe, esta opción lo crea y lo inicializa. El programa guarda los datos en el archivo, o sea los resutados de las operaciones de Entrada y de Salida. Cada vez que se quiera consultar el inventario, no queda sino elegir la opción de Lista, ubicada en el Menu Principal. Fíjate que en cada procedimiento Asigné, Abrí (lectura o escritura) y cerré el archivo. En los procedimientos Salida y Entrada tuve que realizar las operaciones anteriores tanto para la lectura (Asignar, abrir para lectura y cerrar) como para la escritura (Asignar, abrir para escribir y cerrar); la parte de asignar se puede ahorrar, escribiéndola en el programa principal. El programa corre en Turbo Pascal. Yo lo probé y funciona. Espero te sirva. Aquí lo tienes:

program StockAdm_CrearArchivo;
uses CRT;
Type
Stock= Record
  Mode: integer;
  Des: String[20];
  Cant: integer;
End;
A= Array[1..6] of Stock;
Mate= file of A;

var
Mat: A;
stoc: Mate;
Rta, Rta1, Rta2: char;
Op: integer;
i: integer;

procedure IniciaArchivo;
var
i: integer;
Mat: A;

begin
 Assign(stoc,'C:\Stock.dat');
 Rewrite(stoc);

 Mat[1].Mode:=66; Mat[2].Mode:=92; Mat[3].Mode:=125;
 Mat[4].Mode:=150; Mat[5].Mode:=180; Mat[6].Mode:=240;

 Mat[1].Des:='ADM66'; Mat[2].Des:='ADM92'; Mat[3].Des:='ADM125';
 Mat[1].Des:='ADM150'; Mat[2].Des:='ADM180'; Mat[3].Des:='ADM240';

 for i:=1 to 6 do
   Mat[i].Cant:=0;

 write(stoc,Mat);
 close(stoc);
end;

PROCEDURE ENTRADA (VAR MAT:A); {Realiza la carga de stock, cantidad de material comprado}
 VAR
   OPC,CANTI:INTEGER;
 BEGIN
   CLRSCR;
   RTA1:= 's';
   Assign(stoc,'C:\Stock.dat');
   Reset(stoc);
   Read(stoc,MAT);
   WHILE RTA1='s' DO
    BEGIN    
      WRITELN('ELIJA EL MODELO DE ADM A CARGAR STOCK: ');
      WRITELN('1_ADM66  2_ADM92  3_ADM125  4_ADM150  5_ADM180  6_ADM240');
      REPEAT
      READLN(OPC)
      UNTIL (OPC>=1) AND (OPC<=6);
      WRITE('INGRESE LA CANTIDAD DE MATERIAL:  ');
      READLN(CANTI);
      CASE OPC OF
       1:MAT[1].CANT:=MAT[1].CANT+CANTI;
       2:MAT[2].CANT:=MAT[2].CANT+CANTI;
       3:MAT[3].CANT:=MAT[3].CANT+CANTI;
       4:MAT[4].CANT:=MAT[4].CANT+CANTI;
       5:MAT[5].CANT:=MAT[5].CANT+CANTI;
       6:MAT[6].CANT:=MAT[6].CANT+CANTI;
      END;

      CLRSCR;
      WRITELN('CONTINUA CARGANDO MATERIALES?¨');
      WRITELN('s=SI  n=NO');
      READLN(RTA1);
      CLRSCR;
    END;
   close(stoc);
   rewrite(stoc);
   write(stoc,MAT);
   close(stoc);
   END;

PROCEDURE SALIDA (VAR MAT:A); {Modifica el stock con la entrega de los materiales}
 VAR
   OPC,CANTI: INTEGER;
 BEGIN
   CLRSCR;
   RTA2:='s';
   assign(stoc,'C:\Stock.dat');
   reset(stoc);
   read(stoc,MAT);
   WHILE RTA2='s' DO
   BEGIN
     WRITELN('ELIJA EL MODELO DE ADM: ');
 
     WRITELN('1_ADM66  2_ADM92  3_ADM125  4_ADM150  5_ADM180  6_ADM240');

     REPEAT
     READLN(OPC)
     UNTIL (OPC>=1) AND (OPC<=6);
     WRITE('INGRESE LA CANTIDAD A ENTREGAR:  ');
     READLN(CANTI);
     CASE OPC OF
     1:MAT[1].CANT:=MAT[1].CANT-CANTI;
     2:MAT[2].CANT:=MAT[2].CANT-CANTI;
     3:MAT[3].CANT:=MAT[3].CANT-CANTI;
     4:MAT[4].CANT:=MAT[4].CANT-CANTI;
     5:MAT[5].CANT:=MAT[5].CANT-CANTI;
     6:MAT[6].CANT:=MAT[6].CANT-CANTI;
     END;

     CLRSCR;

     WRITELN('DESEA CONTINUAR ENTREGANDO ALGUN OTRO MATERIAL?¨');
     WRITELN('s=SI  n=NO');

     READLN(RTA2);
     CLRSCR;
   END;
   close(stoc);
   rewrite(stoc);
   write(stoc,MAT);
 END;

PROCEDURE LISTA(MAT:A);{Al terminar todas las tareas me muestra el stock actualizado al cerrar el programa}
 BEGIN
 CLRSCR;
 GOTOXY(15,10);TEXTCOLOR(1);
 WRITELN('LISTA DE STOCK ACTUALIZADA: ');
 reset(stoc);
 READ(stoc,MAT);
 gotoxy(15,11);textcolor(7);write('==========================');
 gotoxy(18,13);textcolor(14);write('************************************************');
 GOTOXY(20,14);TEXTCOLOR(3);
 WRITE('ADM',MAT[1].MODE,'  ADM',MAT[2].MODE,'  ADM',MAT[3].MODE);
 WRITELN('  AMD',MAT[4].MODE,'  AMD',MAT[5].MODE,'  AMD',MAT[6].MODE);
 GOTOXY(21,16);WRITE(MAT[1].CANT);GOTOXY(28,16);WRITE(MAT[2].CANT);
 GOTOXY(35,16);WRITE(MAT[3].CANT);GOTOXY(43,16);WRITE(MAT[4].CANT);
 GOTOXY(51,16);WRITE(MAT[5].CANT);GOTOXY(59,16);WRITE(MAT[6].CANT);
 gotoxy(18,17);textcolor(14);write('************************************************');
 GOTOXY(13,22);TEXTCOLOR(2);
 CLOSE(stoc);
 WRITELN('PARA CONTINUAR CON EL CIERRE DEL PROGRAMA OPRIMA UNA TECLA');
 READLN;
 END;


PROCEDURE MENUPPAL (VAR OP:INTEGER); {Menu principal, elijo entre cargar el stock o entregar el mismo}
 BEGIN
 CLRSCR;
 GOTOXY(30,11);TEXTCOLOR(1);
 WRITELN('ELIJA UNA OPCION DE MENU: ');
 GOTOXY(2,13);
 WRITELN('1_ENTRADA DE MATERIAL  2_SALIDA DE MATERIAL  3_LISTA  4_INICIALIZAR ARCHIVO');
 GOTOXY(43,15);
 REPEAT
   READLN(OP)
 UNTIL (OP=1) OR (OP=2) OR (OP=3) OR (OP=4);
 GOTOXY(1,14);DELLINE;
 CLRSCR;
 IF OP=1
 THEN
   ENTRADA (MAT)
 ELSE IF OP=2 THEN
     SALIDA (MAT)
      ELSE if OP=3 THEN LISTA(MAT)
        ELSE INICIAARCHIVO;
 CLRSCR;
 END;


    { Programa Principal }
BEGIN
   RTA:='n';
   WHILE RTA='n' DO
    BEGIN
     CLRSCR;
     MENUPPAL(OP);
     GOTOXY(30,22);TEXTCOLOR(4);
     WRITELN('DESEA SALIR DEL PROGRAMA?');
     GOTOXY(40,23);
     READLN(RTA);
    END;
 Readln;

END.


23-Dec-2011 10:55
Nacho Cabanes (+84)

Lucas, si prefieres tu versión que usa ficheros de texto, para poder ayudarte necesitaríamos una copia del fichero de texto, porque el programa falla cuando lo lanzas sin dicho fichero de datos.


De paso, un par de mejoras necesarias:

- Que la misma función (o preocedimiento) que abre un fichero, lo vuelva a cerrar, para evitar problemas de acceso a ficheros abiertos. Por ejemplo, "LISTA" lee de un fichero que no ha creado no ha abierto... ¡y luego lo cierra!

- Usa IORESULT para comprobar si el fichero no existe, y hacer que el programa se comporte de forma razonable en esos casos.


Y alguna recomendable:

- Usa un estilo consistente, en cuanto al empleo de mayúsculas y minúsculas. Como las mayúsculas cansan más la vista, lo ideal es mezclar mayúsculas y minúsculas: no usar textcolor ni TEXTCOLOR, sino TextColor.

- Los nombres de los procedimientos deberían ser acciones, por legibilidad. En vez de "NILSO", será "MostrarLogoNilso".

- Deja un espacio en blanco entre un procedimiento y otro, para que sea más fácil localizarlos.

- Evita las líneas demasiado largas: intenta no pasar de 80 caracteres por línea.

- Evita los nombres de ficheros y de carpetas que contengan espacios o caracteres internacionales.


23-Dec-2011 15:32
Lucas Matias Guardón

Estimado Luis; modifique bastante el programa, pero ahora me hace algo muy loco, que no se porque, una vez que salgo de la iniciación de las variables y del archivo...dejo el código y gracias por toda la ayuda.

PROGRAM STOCKADM2 (INPUT,OUTPUT);
USES CRT;
TYPE
 MATERIAL=RECORD  {Registro que va a guarad el modelo del ADM; una breve descripcion y la cantidad en stock}
           MODELO:INTEGER;
           DESC:STRING[10];
           STOCK,NRO:INTEGER;
       END;
 MATE= FILE OF MATERIAL;
VAR
 ARCHI:MATE;
 MAT:MATERIAL;
 RTA,RTA1,RTA2,RES:CHAR;
 OP,N:INTEGER;

PROCEDURE NILSO (); {Es para indentificar la empresa en todo momento del uso del programa}
 BEGIN
  gotoxy(33,1);textcolor(8);write('~~~~~~~~~~~~~~~~~~~~');
  gotoxy(33,2);textcolor(8);write('~');
  gotoxy(33,3);textcolor(8);write('~');
  gotoxy(33,4);textcolor(8);write('~');
  gotoxy(33,5);textcolor(8);write('~');
  gotoxy(33,5);textcolor(8);write('~~~~~~~~~~~~~~~~~~~');
  gotoxy(52,2);textcolor(8);write('~');
  gotoxy(52,3);textcolor(8);write('~');
  gotoxy(52,4);textcolor(8);write('~');
  gotoxy(52,5);textcolor(8);write('~');
  gotoxy(35,3);textcolor(1);
  WRITELN('NILSO TORRE S.A.');
  gotoxy(29,7);textcolor(10);write('+++++++++++++++++++++++++++');
  gotoxy(29,9);textcolor(10);write('+++++++++++++++++++++++++++');
  gotoxy(29,8);textcolor(10);write('+');
  gotoxy(55,8);textcolor(10);write('+');
  gotoxy(30,8);textcolor(13);
  WRITELN('CONTROL DE STOCK DE ADMïS');
 END;

PROCEDURE ENTRADA (VAR RTA1:CHAR; VAR MAT:MATERIAL;N:INTEGER); {Realiza la carga de stock, cantidad de material comprado}
  VAR
   OPC,POS,CANTI:INTEGER;
  BEGIN
   CLRSCR;
   NILSO();
   WHILE RTA1='s' DO
    BEGIN
     RESET(ARCHI);
     WRITELN('NRO MODELO  DESCRIPCION STOCK');
     WRITELN('--- ------  ----------- -----');
     READ(ARCHI,MAT);
     WHILE NOT EOF(ARCHI) DO
      BEGIN
       WRITE(MAT.NRO:3,MAT.MODELO:6,'  ',MAT.DESC,MAT.STOCK:15);
      END;
     CLOSE(ARCHI);
     GOTOXY(25,11);TEXTCOLOR(1);
     WRITELN('ELIJA EL MODELO DE ADM A CARGAR STOCK(DE 1 A ',N,'): ');
     READLN(POS);
     POS:=POS-1;
     SEEK(ARCHI,POS); READ(ARCHI,MAT);
     WRITELN('VA A CARGAR STOCK DEL SIGUIENTE MATERIAL: ');
     WRITELN('NRO MODELO  DESCRIPCION STOCK');
     WRITELN('--- ------  ----------- -----');
     WRITE(MAT.NRO:3,MAT.MODELO:6,'  ',MAT.DESC,MAT.STOCK:15);
     CLOSE(ARCHI);
     WRITE('INGRESE LA CANTIDAD A CARGAR: '); READLN(CANTI);
     SEEK(ARCHI,POS); READ(ARCHI,MAT);
     MAT.STOCK:=MAT.STOCK+CANTI;
     SEEK(ARCHI,POS); WRITE(ARCHI,MAT);
     CLOSE(ARCHI);
     WRITE('DESEA CARGAR STOCK DE OTRO MATERIAL?'); READLN(RTA1);
    END;
    CLRSCR;
   END;
 
PROCEDURE SALIDA (VAR RTA2:CHAR; VAR MAT:MATERIAL;N:INTEGER); {Modifica el stock con la entrega de los materiales}
  VAR
   OPC,POS,CANTI: INTEGER;
  BEGIN
   CLRSCR;
   NILSO();
   WHILE RTA2='s' DO
    BEGIN
     RESET(ARCHI);
     WRITELN('NRO MODELO  DESCRIPCION STOCK');
     WRITELN('--- ------  ----------- -----');
     READ(ARCHI,MAT);
     WHILE NOT EOF(ARCHI) DO
      BEGIN
       WRITE(MAT.NRO:3,MAT.MODELO:6,'  ',MAT.DESC,MAT.STOCK:15);
      END;
     CLOSE(ARCHI);
     GOTOXY(25,11);TEXTCOLOR(1);
     WRITELN('ELIJA EL MODELO DE ADM A ENTREGAR(DE 1 A ',N,'): ');
     READLN(POS);
     POS:=POS-1;
     SEEK(ARCHI,POS); READ(ARCHI,MAT);
     WRITELN('VA A ENTREGAR STOCK DEL SIGUIENTE MATERIAL: ');
     WRITELN('NRO MODELO  DESCRIPCION STOCK');
     WRITELN('--- ------  ----------- -----');
     WRITE(MAT.NRO:3,MAT.MODELO:6,'  ',MAT.DESC,MAT.STOCK:15);
     CLOSE(ARCHI);
     WRITE('INGRESE LA CANTIDAD A ENTREGAR: '); READLN(CANTI);
     SEEK(ARCHI,POS); READ(ARCHI,MAT);
     MAT.STOCK:=MAT.STOCK-CANTI;
     SEEK(ARCHI,POS); WRITE(ARCHI,MAT);
     CLOSE(ARCHI);
     WRITE('DESEA ENTREGAR STOCK DE OTRO MATERIAL?'); READLN(RTA1);
    END;
    CLRSCR;
   END;

PROCEDURE INICIO(VAR N:INTEGER;VAR RES:CHAR);
 BEGIN
  N:=0; RES:='s';
  ASSIGN(ARCHI,'C:\NILSO TORRE\STOCK.DAT'); {Asingno la variable al archivo Fisico, creado manualmente en el S.O.}
  REWRITE(ARCHI);
  WHILE RES='s' DO
   BEGIN
    WRITE('INGRESE EL MODELO DE ADM, COMENZANDO CON EL MODELO MAS CHICO: ');
    N:=N+1;
    MAT.NRO:=N;
    READLN(MAT.MODELO);
    WRITE('INGRESE UNA BREVE DESCRIPCION PARA EL MODELO: ');
    READLN(MAT.DESC);
    MAT.STOCK:=0;
    WRITE(ARCHI,MAT);
    WRITE('DESEA CONTINUAR CON LA CARGA DE OTRO MATERIAL?'); READLN(RES);
   END;
  CLOSE(ARCHI);
 END;

PROCEDURE SALUDO(); {Saludo inicial al abrir el programa}
 BEGIN
  CLRSCR;NILSO();
  GOTOXY(10,11);TEXTCOLOR(1);
  WRITELN('BIENVENIDOS AL CONTROL DE SCTOCK DE ADMïS DE NILSO TORRE S.A.');
  GOTOXY(24,13);TEXTCOLOR(15);
  WRITELN('PRECIONE UN TECLA PARA CONTINUAR');
  GOTOXY(1,14);DELLINE();GOTOXY(40,15);
  READLN();
 END;

PROCEDURE MENUPPAL (VAR OP:INTEGER); {Menu principal, elijo entre cargar el stock o entregar el mismo}
 BEGIN
  CLRSCR;
  NILSO();
  GOTOXY(30,11);TEXTCOLOR(1);
  WRITELN('ELIJA UNA OPCION DE MENé: ');
  GOTOXY(20,13);
  WRITELN('1_ENTRADA DE MATERIA       2_SALIDA DE MATERIAL');
  WRITELN('             3_INICIALIZA(reset programa)      ');
  GOTOXY(43,15);
  REPEAT
   READLN(OP)
  UNTIL (OP=1) OR (OP=2) OR (OP=3);
  GOTOXY(1,14);DELLINE();
  CLRSCR;
  NILSO();
  IF OP=1 THEN
   BEGIN
    ENTRADA (RTA1,MAT,N);
   END
  ELSE
   BEGIN
    IF OP=2 THEN
     BEGIN
      SALIDA (RTA2,MAT,N);
     END
    ELSE
     IF OP=3 THEN
      BEGIN
       INICIO(N,RES);
      END
   END;
  CLRSCR;
  NILSO();
  GOTOXY(15,10);TEXTCOLOR(1);
  WRITELN('LISTADO DE STOCK, HASTA EL MOMENTO: ');
  RESET(ARCHI);
  WRITELN('NRO MODELO  DESCRIPCION STOCK');
  WRITELN('--- ------  ----------- -----');
  READ(ARCHI,MAT);
  WHILE NOT EOF(ARCHI) DO
   BEGIN
    WRITE(MAT.NRO:3,MAT.MODELO:6,'  ',MAT.DESC,MAT.STOCK:15);
   END;
  CLOSE(ARCHI);
 END;
 
PROCEDURE LISTA(MAT:MATERIAL);{Al terminar todas las tareas me muestra el stock actualizado al cerrar el programa}
 BEGIN
  CLRSCR;
  NILSO();
  GOTOXY(15,10);TEXTCOLOR(1);
  WRITELN('LISTA DE STOCK: ');
  RESET(ARCHI);
  WRITELN('NRO MODELO  DESCRIPCION STOCK');
  WRITELN('--- ------  ----------- -----');
  READ(ARCHI,MAT);
  WHILE NOT EOF(ARCHI) DO
   BEGIN
    WRITE(MAT.NRO:3,MAT.MODELO:6,'  ',MAT.DESC,MAT.STOCK:15);
   END;
  CLOSE(ARCHI);
  WRITELN('PARA CONTINUAR CON EL CIERRE DEL PROGRAMA OPRIMA UNA TECLA');
  READLN();
 END;

BEGIN {Cuerpo del programa principla}
  SALUDO();
  RTA:='n';
  WHILE RTA='n' DO
   BEGIN
    CLRSCR;
    NILSO();
    MENUPPAL(OP);
    GOTOXY(30,22);TEXTCOLOR(4);
    WRITELN('DESEA SALIR DEL PROGRAMA?');
    GOTOXY(40,23);
    READLN(RTA);
   END;
   LISTA(MAT);
 END.


23-Dec-2011 19:41
Nacho Cabanes (+84)

Sigue habiendo muchas cosas a corregir:

- Cambia la ruta del fichero, para que no tenga espacios ni directorios, o no lo podemos probar en ordenadores que no sean el tuyo.

- Añade una opción de "Mostrar", que te ayude a comprobar que todo está funcionando bien.

- Hay un fragmento de código después del menú que no sé para qué es, y que tiene un RESET sin un ASSIGN, con lo cual falla siempre.

- Cuando listes, hazlo desde el array, no desde fichero, y evitarás problemas innecesarios.

- Sigues teniendo funciones con paréntesis vacíos, y otras con parámetros innecesarios. Además, los parámetros los pasas por referencia, aunque no modifiques nada.

- No usas variables locales en ningún momento.

- ...

En un momento te publico una versión "un poco más a mi gusto".


23-Dec-2011 20:05
Nacho Cabanes (+84)

Algunos de los errores se debían a usar tantas variables globales: mirabas RTA1 en vez de RTA2, suponías valores que las variables quizá no tuvieran, y cosas por el estilo. En otros casos, la lógica era un tanto rebuscada y no hacía lo que esperabas. Lo he reescrito ligeramente, pero como no acabo de entender lo que debe hacer ENTRADA (por ejemplo), sigue teniendo fallos, pero quizá te ayude a entender tú mismo mejor lo que buscas...

---

PROGRAM STOCKADM2 (INPUT,OUTPUT);
USES CRT;

{Registro que va a guarad el modelo del ADM; una breve descripcion y la cantidad en stock}
TYPE
 MATERIAL=RECORD  
           MODELO:INTEGER;
           DESC:STRING[10];
           STOCK,NRO:INTEGER;
       END;

VAR
 archivo: FILE OF MATERIAL;
 salir: boolean;
 maximo: integer;

{Para identificar la empresa en todo momento del uso del programa}
PROCEDURE MostrarLogoNilso;
BEGIN
 GotoXY(33,1);TextColor(8);Write('~~~~~~~~~~~~~~~~~~~~');
 GotoXY(33,2);TextColor(8);Write('~');
 GotoXY(33,3);TextColor(8);Write('~');
 GotoXY(33,4);TextColor(8);Write('~');
 GotoXY(33,5);TextColor(8);Write('~');
 GotoXY(33,5);TextColor(8);Write('~~~~~~~~~~~~~~~~~~~');
 GotoXY(52,2);TextColor(8);Write('~');
 GotoXY(52,3);TextColor(8);Write('~');
 GotoXY(52,4);TextColor(8);Write('~');
 GotoXY(52,5);TextColor(8);Write('~');
 GotoXY(35,3);TextColor(1);
 WriteLn('NILSO TORRE S.A.');
 GotoXY(29,7);TextColor(10);Write('+++++++++++++++++++++++++++');
 GotoXY(29,9);TextColor(10);Write('+++++++++++++++++++++++++++');
 GotoXY(29,8);TextColor(10);Write('+');
 GotoXY(55,8);TextColor(10);Write('+');
 GotoXY(30,8);TextColor(13);
 WriteLn('CONTROL DE STOCK DE ADMïS');
END;


{ Saludo inicial al abrir el programa }
PROCEDURE MostrarSaludo;
BEGIN
 ClrScr; MostrarLogoNilso;
 GotoXY(10,11);TextColor(1);
 WriteLn('BIENVENIDOS AL CONTROL DE SCTOCK DE ADMïS DE NILSO TORRE S.A.');
 GotoXY(24,13);TextColor(15);
 WriteLn('PRESIONE UN TECLA PARA CONTINUAR');
 GotoXY(1,14);DELLINE();GotoXY(40,15);
 ReadLn();
END;

{Realiza la carga de stock, cantidad de material comprado}
PROCEDURE ENTRADA;
VAR
   POS,CANTI:INTEGER;
   RTA1: CHAR;
   MAT: MATERIAL;
BEGIN
   ClrScr;
   MostrarLogoNilso;
   RTA1 := 's';
   WHILE RTA1='s' DO
   BEGIN
     Reset(archivo);
     WriteLn('NRO MODELO  DESCRIPCION STOCK');
     WriteLn('--- ------  ----------- -----');
     WHILE NOT EOF(archivo) DO
     BEGIN
       Read(archivo,MAT);
       WriteLn(MAT.NRO:3,MAT.MODELO:6,'  ',MAT.DESC,MAT.STOCK:15);
     END;
     Close(archivo);
     GotoXY(25,11);TextColor(1);
     WriteLn('ELIJA EL MODELO DE ADM A CARGAR STOCK(DE 1 A ',maximo,'): ');
     ReadLn(POS);
     POS:=POS-1;
     SEEK(archivo,POS); Read(archivo,MAT);
     WriteLn('VA A CARGAR STOCK DEL SIGUIENTE MATERIAL: ');
     WriteLn('NRO MODELO  DESCRIPCION STOCK');
     WriteLn('--- ------  ----------- -----');
     Write(MAT.NRO:3,MAT.MODELO:6,'  ',MAT.DESC,MAT.STOCK:15);
     Close(archivo);
     Write('INGRESE LA CANTIDAD A CARGAR: '); ReadLn(CANTI);
     SEEK(archivo,POS); Read(archivo,MAT);
     MAT.STOCK:=MAT.STOCK+CANTI;
     SEEK(archivo,POS); Write(archivo,MAT);
     Close(archivo);
     Write('DESEA CARGAR STOCK DE OTRO MATERIAL?'); ReadLn(RTA1);
   END;
   ClrScr;
END;

{Modifica el stock con la entrega de los materiales}  
PROCEDURE SALIDA;
VAR
   POS,CANTI: INTEGER;
   RTA2: CHAR;
   MAT: MATERIAL;    
 BEGIN
   ClrScr;
   MostrarLogoNilso;
   RTA2:='s';
   WHILE RTA2='s' DO
   BEGIN
     Reset(archivo);
     WriteLn('NRO MODELO  DESCRIPCION STOCK');
     WriteLn('--- ------  ----------- -----');
     Read(archivo,MAT);
     WHILE NOT EOF(archivo) DO
     BEGIN
       Write(MAT.NRO:3,MAT.MODELO:6,'  ',MAT.DESC,MAT.STOCK:15);
     END;
     Close(archivo);
     GotoXY(25,11);TextColor(1);
     WriteLn('ELIJA EL MODELO DE ADM A ENTREGAR(DE 1 A ',maximo,'): ');
     ReadLn(POS);
     POS:=POS-1;
     SEEK(archivo,POS); Read(archivo,MAT);
     WriteLn('VA A ENTREGAR STOCK DEL SIGUIENTE MATERIAL: ');
     WriteLn('NRO MODELO  DESCRIPCION STOCK');
     WriteLn('--- ------  ----------- -----');
     Write(MAT.NRO:3,MAT.MODELO:6,'  ',MAT.DESC,MAT.STOCK:15);
     Close(archivo);
     Write('INGRESE LA CANTIDAD A ENTREGAR: '); ReadLn(CANTI);
     SEEK(archivo,POS); Read(archivo,MAT);
     MAT.STOCK:=MAT.STOCK-CANTI;
     SEEK(archivo,POS); Write(archivo,MAT);
     Close(archivo);
     Write('DESEA ENTREGAR STOCK DE OTRO MATERIAL?'); ReadLn(RTA2);
   END;
   ClrScr;
END;

{ Crea el fichero de datos}
PROCEDURE INICIO;
VAR
   MAT: MATERIAL;
   RES: CHAR;
BEGIN
 maximo:=0;
 RES:='s';  
 Rewrite(archivo);
 WHILE RES='s' DO
   BEGIN
   Write('INGRESE EL MODELO DE ADM, COMENZANDO CON EL MODELO MAS CHICO: ');
   maximo:=maximo+1;
   MAT.NRO:=maximo;
   ReadLn(MAT.MODELO);
   Write('INGRESE UNA BREVE DESCRIPCION PARA EL MODELO: ');
   ReadLn(MAT.DESC);
   MAT.STOCK:=0;
   Write(archivo,MAT);
   Write('DESEA CONTINUAR CON LA CARGA DE OTRO MATERIAL?'); ReadLn(RES);
   END;
 Close(archivo);
END;

{Muestra el stock actualizado}  
PROCEDURE LISTA;
VAR
   MAT: MATERIAL;
BEGIN
 ClrScr;
 MostrarLogoNilso;
 GotoXY(15,10);TextColor(1);
 WriteLn('LISTA DE STOCK: ');
 Reset(archivo);
 WriteLn('NRO MODELO  DESCRIPCION STOCK');
 WriteLn('--- ------  ----------- -----');
 
 WHILE NOT EOF(archivo) DO
   BEGIN
   Read(archivo,MAT);
   WriteLn(MAT.NRO:3,MAT.MODELO:6,'  ',MAT.DESC,MAT.STOCK:15);
   END;
 Close(archivo);
 ReadLn();
END;

{------------------}
PROCEDURE MenuPrincipal; {Menu principal, elijo entre cargar el stock o entregar el mismo}
VAR
 opcion: byte;
BEGIN
 ClrScr;
 MostrarLogoNilso;

 TextColor(1);
 GotoXY(30,11); WriteLn('ELIJA UNA OPCION DE MENÚ: ');
 WriteLn('  1_ENTRADA DE MATERIAL');
 WriteLn('  2_SALIDA DE MATERIAL');
 WriteLn('  3_LISTADO DE STOCK');
 WriteLn('  4_CREAR FICHERO DE DATOS');
 WriteLn('  0_TERMINAR');
 REPEAT
   ReadLn(opcion)
 UNTIL opcion in [0..4];
 
 ClrScr;
 MostrarLogoNilso;
 CASE opcion OF
   0: salir := true;
   1: ENTRADA;
   2: SALIDA;
   3: LISTA;
   4: INICIO;
 END;
END;
 

{Cuerpo del programa principal}
BEGIN
 salir := false;
 Assign(archivo,'STOCK.DAT');
 
 MostrarSaludo;
 WHILE NOT salir DO
   BEGIN
   MenuPrincipal;
   END;
END.
 



25-Dec-2011 02:17
Luis Torres (+18)

Después de tanto revisar logré dar con los errores que tenía tu programa. Ya tengo el programa corregido y, traté de respetar todo tu código y la forma tuya de programarlo. Lo único que te digo es que funciona sólo para 6 materiales, si quieres poner más o menos, pues deberás modificar la varible N; quise usar la función FilePos(nombreArchivo), pero lamentablemente me generó un error en tiempo de ejecución, así que la eliminé. El programa resultante sigue tieniendo problemas de formato, sobre todo cuando se leen más de 1 vez, porque hay que borrar la pantalla con ClrScr (yo no lo hice), aparecen entonces cadenas de caracteres entre cadenas de mensajes anteriores. Ya lo probé y funciona (probado en Free Pascal); el archivo stock.dat debe estar situado en la unidad C; pero si usas la ruta original, pues puedes hacerlo, sí sirve, lo que tendrás que hacer es cambiar la ruta actual por la original de tu programa (C:\Nilso Torre\stock.dat). Te aconsejo que primero pruebes el programa tal cual como está, claro está deberás ejecutar la opción 3 (INICO), ya que se debe generar primero el archivo para después operar con él, claro está. Sin más a que hacer referencia, te dejo a continuación, el código:

program Prueba_Stock2(INPUT,OUTPUT);
uses CRT;

TYPE
 MATERIAL=RECORD  {Registro que va a guarad el modelo del ADM; una

breve descripcion y la cantidad en stock}
           MODELO:INTEGER;
           DESC:STRING[10];
           STOCK,NRO:INTEGER;
       END;
 MATE= FILE OF MATERIAL;


VAR
 ARCHI:MATE;
 MAT:MATERIAL;
 RTA,RTA1,RTA2,RES:CHAR;
 OP,N:INTEGER;



PROCEDURE NILSO (); {Es para indentificar la empresa en todo momento

del uso del programa}
 BEGIN
 gotoxy(33,1);textcolor(8);write('~~~~~~~~~~~~~~~~~~~~');
 gotoxy(33,2);textcolor(8);write('~');
 gotoxy(33,3);textcolor(8);write('~');
 gotoxy(33,4);textcolor(8);write('~');
 gotoxy(33,5);textcolor(8);write('~');
 gotoxy(33,5);textcolor(8);write('~~~~~~~~~~~~~~~~~~~');
 gotoxy(52,2);textcolor(8);write('~');
 gotoxy(52,3);textcolor(8);write('~');
 gotoxy(52,4);textcolor(8);write('~');
 gotoxy(52,5);textcolor(8);write('~');
 gotoxy(35,3);textcolor(1);
 WRITELN('NILSO TORRE S.A.');
 gotoxy(29,7);textcolor(10);write('+++++++++++++++++++++++++++');
 gotoxy(29,9);textcolor(10);write('+++++++++++++++++++++++++++');
 gotoxy(29,8);textcolor(10);write('+');
 gotoxy(55,8);textcolor(10);write('+');
 gotoxy(30,8);textcolor(13);
 WRITELN('CONTROL DE STOCK DE ADMïS');
 END;

PROCEDURE ENTRADA (VAR RTA1:CHAR; VAR MAT:MATERIAL;N:INTEGER);

{Realiza la carga de stock, cantidad de material comprado}
 VAR
   OPC,POS,CANTI:INTEGER;
   archiaux: mate;
   mataux: material;
 BEGIN
   CLRSCR;
   NILSO();
   assign(archi,'C:\stock.dat');
   rta1:= 's';
   n:= 6; { Aqui hay que tener cuidado con el numero de registros del

archivo, puede que sean mas}
   WHILE RTA1='s' DO
   BEGIN
     RESET(ARCHI);
     WRITELN('NRO MODELO  DESCRIPCION STOCK');
     WRITELN('--- ------  ----------- -----');
     WHILE NOT EOF(ARCHI) DO
     BEGIN
       READ(ARCHI,MAT);
       WRITELN(MAT.NRO:3,MAT.MODELO:6,'  ',MAT.DESC:10,MAT.STOCK:6);
     END;
     GOTOXY(25,18);TEXTCOLOR(1);
     WRITE('ELIJA EL MODELO DE ADM A CARGAR STOCK(DE 1 A ',N,'): ');
     READLN(POS);
     POS:=POS-1;
     SEEK(ARCHI,POS);
     READ(ARCHI,MAT);
     WRITELN('VA A CARGAR STOCK DEL SIGUIENTE MATERIAL: ');
     WRITELN('NRO MODELO  DESCRIPCION STOCK');
     WRITELN('--- ------  ----------- -----');
     WRITELN(MAT.NRO:3,MAT.MODELO:6,'  ',MAT.DESC,MAT.STOCK:10);
     WRITE('INGRESE LA CANTIDAD A CARGAR: '); READLN(CANTI);
     SEEK(ARCHI,POS); READ(ARCHI,MAT);
     MAT.STOCK:=MAT.STOCK+CANTI;
     mataux:= mat;
     seek(archi,0);
     assign(archiaux,'C:\stockaux.dat');
     rewrite(archiaux);
     while not eof(archi) do
      begin        
        if filepos(archi) <> pos then
         begin
           read(archi,mat);
           write(archiaux,mat);
         end
        else
         begin
           read(archi,mat);
           write(archiaux,mataux);
         end;  
      end;
     close(ArchiAux);
     reset(ArchiAux);
     while not eof(ArchiAux) do
      begin
        read(ArchiAux,mat);
        writeln(mat.nro:3,mat.modelo:6,mat.desc:8,mat.stock:10);
      end;
     close(ArchiAux);
     close(archi);
     erase(archi);
     rename(ArchiAux,'C:\stock.dat');
     WRITE('DESEA CARGAR STOCK DE OTRO MATERIAL?'); READLN(RTA1);
   END;
   CLRSCR;
   END;


PROCEDURE SALIDA (VAR RTA2:CHAR; VAR MAT:MATERIAL;N:INTEGER);

{Modifica el stock con la entrega de los materiales}
 VAR
   OPC,POS,CANTI:INTEGER;
   archiaux: mate;
   mataux: material;
 BEGIN
   CLRSCR;
   NILSO();
   assign(archi,'C:\stock.dat');
   rta2:= 's';
   n:= 6; { Aqui hay que tener cuidado con el numero de registros del

archivo, puede que sean mas}
   WHILE RTA2='s' DO
   BEGIN
     RESET(ARCHI);
     WRITELN('NRO MODELO  DESCRIPCION STOCK');
     WRITELN('--- ------  ----------- -----');
     WHILE NOT EOF(ARCHI) DO
     BEGIN
       READ(ARCHI,MAT);
       WRITELN(MAT.NRO:3,MAT.MODELO:6,'  ',MAT.DESC:10,MAT.STOCK:6);
     END;
     GOTOXY(25,18);TEXTCOLOR(1);
     WRITE('ELIJA EL MODELO DE ADM A CARGAR STOCK(DE 1 A ',N,'): ');
     READLN(POS);
     POS:=POS-1;
     SEEK(ARCHI,POS);
     READ(ARCHI,MAT);
     WRITELN('VA A CARGAR STOCK DEL SIGUIENTE MATERIAL: ');
     WRITELN('NRO MODELO  DESCRIPCION STOCK');
     WRITELN('--- ------  ----------- -----');
     WRITELN(MAT.NRO:3,MAT.MODELO:6,'  ',MAT.DESC,MAT.STOCK:10);
     WRITE('INGRESE LA CANTIDAD A ENTREGAR: '); READLN(CANTI);
     SEEK(ARCHI,POS); READ(ARCHI,MAT);
     MAT.STOCK:=MAT.STOCK-CANTI;
     mataux:= mat;
     seek(archi,0);
     assign(archiaux,'C:\stockaux.dat');
     rewrite(archiaux);
     while not eof(archi) do
      begin        
        if filepos(archi) <> pos then
         begin
           read(archi,mat);
           write(archiaux,mat);
         end
        else
         begin
           read(archi,mat);
           write(archiaux,mataux);
         end;  
      end;
     close(ArchiAux);
     reset(ArchiAux);
     while not eof(ArchiAux) do
      begin
        read(ArchiAux,mat);
        writeln(mat.nro:3,mat.modelo:6,mat.desc:8,mat.stock:10);
      end;
     close(ArchiAux);
     close(archi);
     erase(archi);
     rename(ArchiAux,'C:\stock.dat');
     WRITE('DESEA CARGAR STOCK DE OTRO MATERIAL?'); READLN(RTA2);
   END;
   CLRSCR;
   END;


PROCEDURE INICIO(VAR N:INTEGER;VAR RES:CHAR);
 BEGIN
 N:=0; RES:='s';
 ASSIGN(ARCHI,'C:\STOCK.DAT'); {Asingno la variable al archivo

Fisico, creado manualmente en el S.O.}
 REWRITE(ARCHI);
 WHILE RES='s' DO
   BEGIN
   WRITE('INGRESE EL MODELO DE ADM, COMENZANDO CON EL MODELO MAS

CHICO: ');
   N:=N+1;
   MAT.NRO:=N;
   READLN(MAT.MODELO);
   WRITE('INGRESE UNA BREVE DESCRIPCION PARA EL MODELO: ');
   READLN(MAT.DESC);
   MAT.STOCK:=0;
   WRITE(ARCHI,MAT);
   WRITE('DESEA CONTINUAR CON LA CARGA DE OTRO MATERIAL?');

READLN(RES);
   END;
 CLOSE(ARCHI);
 END;

PROCEDURE SALUDO(); {Saludo inicial al abrir el programa}
 BEGIN
 CLRSCR;NILSO();
 GOTOXY(10,11);TEXTCOLOR(1);
 WRITELN('BIENVENIDOS AL CONTROL DE SCTOCK DE ADMïS DE NILSO TORRE

S.A.');
 GOTOXY(24,13);TEXTCOLOR(15);
 WRITELN('PRECIONE UN TECLA PARA CONTINUAR');
 GOTOXY(1,14);DELLINE();GOTOXY(40,15);
 READLN();
 END;


PROCEDURE MENUPPAL (VAR OP:INTEGER); {Menu principal, elijo entre

cargar el stock o entregar el mismo}
 BEGIN
 CLRSCR;
 NILSO();
 GOTOXY(30,11);TEXTCOLOR(1);
 WRITELN('ELIJA UNA OPCION DE MENé: ');
 GOTOXY(20,13);
 WRITELN('1_ENTRADA DE MATERIA      2_SALIDA DE MATERIAL');
 GOTOXY(20,14);
 WRITELN('            3_INICIALIZA(reset programa)      ');
 GOTOXY(43,15);
 REPEAT
   READLN(OP)
 UNTIL (OP=1) OR (OP=2) OR (OP=3);
 GOTOXY(1,14);DELLINE();
 CLRSCR;
 NILSO();
 IF OP=1 THEN
   BEGIN
   ENTRADA (RTA1,MAT,N);
   END
 ELSE
   BEGIN
   IF OP=2 THEN
     BEGIN
     SALIDA (RTA2,MAT,N);
     END
   ELSE
     IF OP=3 THEN
     BEGIN
       INICIO(N,RES);
     END
   END;
 CLRSCR;
 NILSO();
 GOTOXY(15,10);TEXTCOLOR(1);
 WRITELN('LISTADO DE STOCK, HASTA EL MOMENTO: ');
 assign(Archi,'C:\Stock.dat');
 RESET(ARCHI);
 WRITELN('NRO MODELO  DESCRIPCION STOCK');
 WRITELN('--- ------  ----------- -----');

 WHILE NOT EOF(ARCHI) DO
   BEGIN
    READ(ARCHI,MAT);
    WRITELN(MAT.NRO:3,MAT.MODELO:6,MAT.DESC:8,MAT.STOCK:10);
   END;
 CLOSE(ARCHI);
 END;


PROCEDURE LISTA(MAT: MATERIAL);{Al terminar todas las tareas me

muestra el stock actualizado al cerrar el programa}
 BEGIN
 CLRSCR;

 assign(archi,'C:\stock.dat');
 NILSO();
 GOTOXY(15,10);TEXTCOLOR(1);
 WRITELN('LISTA DE STOCK: ');
 RESET(ARCHI);
 WRITELN('NRO MODELO  DESCRIPCION STOCK');
 WRITELN('--- ------  ----------- -----');
 WHILE NOT EOF(ARCHI) DO
   BEGIN
    READ(ARCHI,MAT);
    WRITELN(MAT.NRO:3,MAT.MODELO:6,MAT.DESC:8,MAT.STOCK:10);
   END;

 CLOSE(ARCHI);
 WRITELN('PARA CONTINUAR CON EL CIERRE DEL PROGRAMA OPRIMA UNA

TECLA');
 READLN();
 END;

           { PROGRAMA PRINCIPAL }
BEGIN
 SALUDO();
 RTA:='n';
 WHILE RTA='n' DO
   BEGIN
   CLRSCR;
   NILSO();
   MENUPPAL(OP);
   GOTOXY(30,22);TEXTCOLOR(4);
   WRITELN('DESEA SALIR DEL PROGRAMA?');
   GOTOXY(40,23);
   READLN(RTA);
   END;
   LISTA(MAT);
END.







(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)