[ Foro de Pascal ]

codigo - fallo al modificar artículos

12-Jul-2014 16:53
Invitado (Leandro)
2 Respuestas

Estimado si pueden ayudarme........ tengo esta porcion de codigo para un abm de articulos.... bastante sencillo, crea articulos, los mod, consulta y lista en una carpetita en c:\Producto.txt....

todos los modulos funcionan bien, salvo el de modificacion. como veran tengo q ingresar el nro. de art a modificar, y ahi se me hace lios  al querer modif. la descripc del archivo !!!
Agradezco toda ayuda!!!


Program Productos;
Uses CRT;

Type Tipo_registro = record { Campos: }
 no_prod : integer; { Numero de producto}
 descrip : char; { Descripcion del articulo}
 cantidad: integer; { Cantidad disponible en almacen}
 precio : real; { Precio del articulo}
 garantia: char; { Tiene garantia? [S/N]}
End;


Var Registro : Tipo_registro; { Declaracion global de la variable "Registro" de tipo struct
tipo_registro}

 alias : FILE OF Tipo_registro; { Declaracion global de la variable  "alias" (apuntador a un archivo)}

Procedure Alta;
Var no_prod: integer; { Variable local para el numero de producto}
Begin
clrscr;
writeln('ALTAS DE REGISTROS DE PRODUCTOS');

 Assign(alias,'c:\PRODUCTO.txt'); { Asignacion del nombre del archivo al
alias}
{$I-} { <--- Directivas para deshabilitar mensajes de error del Sist.
Operativo }
 Reset(alias); {Intenta abrir el archivo PRODUCTO.txt
 en modo de lectura/escritura}
{$I+}
 If(IoResult<>0) Then
 Rewrite(alias); { Crea el archivo en caso de no existir }

 write('Numero de producto: '); readln(no_prod);

 While(Not Eof(alias)) Do { Ciclo mientras no se encuentre el final del
archivo}
 Begin
 Read(alias,Registro);
 { Lee el "Registro", de tamano=sizeof(Registro) del archivo
"alias" }
 If(Registro.no_prod=no_prod) Then
 Begin
 writeln('Registro duplicado !!!');
 writeln('<<< Oprima cualquier tecla para continuar >>>');
 Close(alias);
 Readkey;
 Exit;
 End;
 End;
 write('Descripcion: '); readln(Registro.descrip);
 write('Cantidad : '); readln(Registro.cantidad);
 write('Precio : '); readln(Registro.precio);
 Repeat
 write('Garantia : '); readln(Registro.garantia);
 Registro.garantia:=Upcase(Registro.garantia);
 Until(Registro.garantia='S') OR (Registro.garantia='N');
 Registro.no_prod:=no_prod;
 Write(alias,Registro); { Grabar el Registro completo }
 Close(alias); { Cierra el archivo }
 writeln('Producto registrado !!!');
 writeln('<<< Oprima cualquier tecla para continuar >>>');
 readkey;
End;
///////////////////////////////////////////////////////////////////////////////////////////
Procedure Consulta;
Var no_prod: integer; { Variable local para el numero de producto}
Begin
clrscr;
writeln('CONSULTA DE REGISTROS DE PRODUCTOS');

 Assign(alias,'c:\PRODUCTO.txt'); { Asignacion del nombre del archivo al
alias}
{$I-} { <--- Directivas para deshabilitar mensajes de error del Sist.
Operativo }
 Reset(alias); {Intenta abrir el archivo PRODUCTO.txt
 en modo de lectura/escritura}
{$I+}
 If(IoResult<>0) Then
 Rewrite(alias); { Crea el archivo en caso de no existir }

 write('Numero de producto: '); Read(no_prod);

 While(Not Eof(alias)) Do { Ciclo mientras no se encuentre el final del
archivo}
 Begin
 Read(alias,Registro);
 { Lee el "Registro", de tamano=sizeof(Registro) del archivo
"alias" }
 If(Registro.no_prod=no_prod) Then
 Begin
 writeln('No Prod Descripcion Cantidad Precio Garantia');
 writeln('------------------------------------------------------------------------');

writeln(Registro.no_prod:3,Registro.descrip:10,Registro.cantidad:10,' ',Registro.precio:10:2,' ',Registro.garantia:5);
 writeln('<<< Oprima cualquier tecla para continuar >>>');
 Close(alias);
 Readkey;
 Exit;
 End;
 End;

 writeln('No se encuentra ese registro !!!');
 Close(alias); { Cierra el archivo }
 writeln('<<< Oprima cualquier tecla para continuar >>>');
 Readkey;
End;
//////////////////////////////////////////////////////////////////////////////////////////////
Procedure Listar;
Var no_prod: integer;
Begin
 Clrscr;
 writeln('LISTADO DE REGISTROS DE PRODUCTOS');

 Assign(alias,'c:\PRODUCTO.txt'); { Asignacion del nombre del archivo al
alias}
{$I-} { <--- Directivas para deshabilitar mensajes de error del Sist.
Operativo }
 Reset(alias); {Intenta abrir el archivo PRODUCTO.txt
 en modo de lectura/escritura}
{$I+}

 If(IoResult<>0) Then
 Begin
 writeln('No existe el archivo !!!');
 writeln('<<< Oprima cualquier tecla para continuar >>>');
 Readkey;
 Exit;
 End;

 writeln('No Prod Descripcion Cantidad Precio Garantia');
 writeln('------------------------------------------------------------------------');

 While(Not Eof(alias)) Do { Ciclo mientras no se encuentre el final del
archivo}
 Begin
 Read(alias,Registro);
 { Lee el "Registro", de tamano=sizeof(Registro) del archivo "alias" }
 writeln(Registro.no_prod:3,Registro.descrip:10,Registro.cantidad:10,' ',Registro.precio:10:2,' ',Registro.garantia:5);
 End;

 writeln('Fin del listado !!!');
 Close(alias); { Cierra el archivo }
 writeln('<<< Oprima cualquier tecla para continuar >>>');
 Readkey;
End;
//////////////////////////////////////////////////////////////////////////////////////////////
Procedure Modificar;
Var no_prod: integer;
Begin
 Clrscr;
 writeln('MODIFICACION DE REGISTROS DE PRODUCTOS');

 Assign(alias,'c:\PRODUCTO.txt'); { Asignacion del nombre del archivo al
alias}
{$I-} { <--- Directivas para deshabilitar mensajes de error del Sist.
Operativo }
 Reset(alias); {Intenta abrir el archivo PRODUCTO.txt
 en modo de lectura/escritura}
{$I+}

 If(IoResult<>0) Then
 Begin
 writeln('No existe el archivo !!!');
 writeln('<<< Oprima cualquier tecla para continuar >>>');
 Readkey;
 Exit;
 End;

 write('Numero de producto: '); Read(no_prod);
 clrscr;

 While(Not Eof(alias)) Do { Ciclo mientras no se encuentre el final del
archivo}
 Begin
 Read(alias,Registro);
 { Lee el "Registro", de tamano=sizeof(Registro) del archivo "alias" }
	If(Registro.no_prod=no_prod) Then
	Begin
	writeln('No Prod Descripcion Cantidad Precio Garantia');
	writeln('-----------------------------------------------------------------------');
	writeln(Registro.no_prod:3,Registro.descrip:10,Registro.cantidad:10,' ',Registro.precio:10:2,' ',Registro.garantia:5);
	writeln('Anote los nuevos datos ...');
	
	write('Descripcion: '); Read(Registro.descrip);
	write('Cantidad : '); 	Read(Registro.cantidad);
	write('Precio : '); 	Read(Registro.precio);
		
	Repeat
	write('Garantia : ');
	Read(Registro.garantia);
	Registro.garantia:=Upcase(Registro.garantia);
	Until(Registro.garantia='S') OR (Registro.garantia='N');

 { Es necesario reposicionar el apuntador del archivo al principio
del
 registro que desea modificar, ya que al leer un registro, el
 apuntador se posiciona en el registro siguiente
 La funcion FilePos(alias) devuelve la posicion donde se encuentra
el
 apuntador }
 Seek(alias,FilePos(alias)-1);
 Write(alias,Registro); { Graba el registro con los nuevos campos}
 Close(alias); { Cierra el archivo }
 writeln('Registro modificado !!!');

 writeln('<<< Oprima cualquier tecla para continuar >>>');
 Readkey;
 Exit;
 End;
 End;

 writeln('No se encuentra ese registro !!!');
 Close(alias); { Cierra el archivo }
 writeln('<<< Oprima cualquier tecla para continuar >>>');
 Readkey;
End;
//////////////////////////////////////////////////////////////////////////////////////////////
var op: byte;
begin   {PP}
op:= 1;
	clrscr;
	op:=1;
	while op<>0 do
        begin
                clrscr;
                writeln('*****Ingrese opcion**********');
				Writeln;
				writeln('1: Alta');
				writeln('2: Consulta');
				writeln('3: Listar');
				writeln('4: Modificar');
				Writeln('0: Salir');
                readln(op);
			case op of
		    1:Alta();
		    2:Consulta();
			3:Listar();
			4:Modificar();
			
            end;
        end;
end.



12-Jul-2014 21:41
Nacho Cabanes (+84)

Yo en general lo veo bien, aunque hay algunas cosas mejorables, como por ejemplo usar "Read" para pedir datos al usuario, en vez de "ReadLine", y eso es peligroso cuando hay cadenas de texto, que pueden contener espacios. También usas variables globales sin que sea necesario, porque no compartes datos con otros procedimientos, ya que toda la información la lees de fichero o la pides en el momento. Pero en general, la lógica es buena.

(Por cierto, ¿por qué la descripción es un "char"?)


12-Jul-2014 23:22
Luis Torres (+18)

Estuve toda la tarde probando en programa y me voy a tomar la libertad de repetir la respuesta del profesor Nacho Cabanes.
No sé cuál IDE estás utilizando. Para colocar comentarios o líneas divisorias, hasta donde dan mis conocimientos, no se utiliza
//////////////////////////////////////////////////////////////////////////////////////////////////////////

En:


Type Tipo_registro = record { Campos: }
 no_prod : integer; { Numero de producto}
 descrip : char; { Descripcion del articulo}
 cantidad: integer; { Cantidad disponible en almacen}
 precio : real; { Precio del articulo}
 garantia: char; { Tiene garantia? [S/N]}
End;


descrip no debería ser del tipo char, porque vas a almacenar algo más que un caracter, el tipo debe ser un string, yo utilizaría un string[15]

Y, vamos a tu problema principal, cuando vas a leer desde el teclado, como en:


 write('Numero de producto: '); Read(no_prod);
 clrscr;


No se usa "Read", sino "Readln", es aquí donde se te echa a perder tu programa. Utiliza "Read" solo cuando vayas a leer desde un archivo y no desde un teclado. Tenlo siempre presente de ahora en adelante.

Aunque el programa va a realizar todas las operaciones bien, después que realices esa pequeña corrección, yo tengo algo que objetar, según tengo entendido no se puede abrir un archivo para la escritura y lectura al mismo tiempo, se puede abrir o para la lectura o para la escritura. De todas maneras así como lo tienes funciona perfectamente (con la corrección antes mencionada, claro está).

Te felicito porque el programa está bastante bien.
Saludos.






(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.)