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