[ Foro de Pascal ]
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.
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.
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.
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.
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.
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.
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.
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.
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.
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".
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.
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.)