[ Foro de Pascal ]

Consulta de array de record...

10-Mar-2015 18:44
Jose Gutierrez
4 Respuestas

Muy buenas tardes, estoy trabajando en un trabajo practico en TP y hay un detalle que no he podido resolver, y es hacer una consulta a un array de record, estoy trabajando con un archivo *.dat, el asunto es como sigue:


program  Lacteos;
	uses
		crt, dos;

	const
		
		archivo = 'lacteo.dat';{Archivo Base de Datos}
	type
		string10 = string[10]; {Variable a usar en varios módulos del programa}
		regmaestro = record	{Registro de paciente a guardar en la BD}
			producto, edad : string[2]; {Siglas del producto, Edad del encuestado}
			estrato : string[3]; {Estrato del encuestado}
			sexo : char; {Género sexual del encuestado}
			fecha: string[10]; {Fecha de entrada y salida respectivamente}
		end;
		arrencuesta = array[1..200] of regmaestro;
		
	var
		f : file of regmaestro;	{Archivo del registro ?lacteos?}
		ano, mes, dia, sem : word; {Para uso del comando getdate (fecha del sistema), contador}

	procedure consultarencuesta; {*Esta es la función para consultar una Encuesta*}
	var
		i : word;
		arrenc : arrencuesta;
		archiv : text;
	begin

						writeln('|-------------- EMPRESA XXXXX Y XXXX ---------------|');
						writeln;
						writeln('|------------ MODULO CONSULTAR ENCUESTA ------------|');
						writeln;
						write  (' Digite El Numero De Registro Que Desea Consultar: ');
						readln(i);
						writeln;
		assign(archiv,'lacteos.dat');
		reset(archiv);
		while not seekeof (archiv) do
			begin
						with arrenc[i] do
						begin
						writeln('          <<< El Registro ',i,' consultado es >>>          ');
						writeln;
						readln(archiv,producto);
						writeln('  Producto    = ',producto);
writeln('  Estrato     = ',arrenc[i].estrato);
						writeln('  Sexo        = ',arrenc[i].sexo);
						writeln('  Edad        = ',arrenc[i].edad);
						writeln('  Fecha       = ',arrenc[i].fecha);
						writeln; }
						writeln('  Presione Una Tecla Para Regresar Al Menu Principal');
						readkey;
						end;
			end;
		close(archiv);
	end;




10-Mar-2015 19:12
Jose Gutierrez

Vuelvo a escribir la pregunta pues no se cómo editar:

Muy buenas tardes, estoy trabajando en un trabajo practico en TP y hay un detalle que no he podido resolver, y es hacer una consulta a un array de record, estoy trabajando con un archivo *.dat, el asunto es como sigue:


program  Lacteos; 
uses 
crt, dos; 

const 

archivo = 'lacteo.dat';{Archivo Base de Datos} 
type 
string10 = string[10]; {Variable a usar en varios módulos del programa} 
regmaestro = record	{Registro de paciente a guardar en la BD} 
producto, edad : string[2]; {Siglas del producto, Edad del encuestado} 
estrato : string[3]; {Estrato del encuestado} 
sexo : char; {Género sexual del encuestado} 
fecha: string[10]; {Fecha de entrada y salida respectivamente} 
end; 
arrencuesta = array[1..200] of regmaestro; 

var 
f : file of regmaestro;	{Archivo del registro ?lacteos?} 
ano, mes, dia, sem : word; {Para uso del comando getdate (fecha del sistema), contador} 

procedure consultarencuesta; {*Esta es la función para consultar una Encuesta*} 
var 
i : word; 
arrenc : arrencuesta; 
archiv : text; 
begin 

writeln('|-------------- EMPRESA XXXXX Y XXXX ---------------|'); 
writeln; 
writeln('|------------ MODULO CONSULTAR ENCUESTA ------------|'); 
writeln; 
write  (' Digite El Numero De Registro Que Desea Consultar: '); 
readln(i); 
writeln; 
assign(archiv,'lacteos.dat'); 
reset(archiv); 
while not seekeof (archiv) do 
begin 
with arrenc[i] do 
begin 
writeln('          <<< El Registro ',i,' consultado es >>>          '); 
writeln; 
readln(archiv,producto); 
writeln('  Producto    = ',producto); 
readln(archiv,estrato);
writeln('  Estrato     = ',estrato);
readln(archiv,sexo); 
writeln('  Sexo        = ',sexo);
readln(archiv,edad); 
writeln('  Edad        = ',edad);
readln(archiv,fecha); 
writeln('  Fecha       = ',fecha); 
writeln; 
writeln('  Presione Una Tecla Para Regresar Al Menu Principal'); 
readkey; 
end; 
end; 
close(archiv); 
end; 




El asunto es que no he podido terminar con el modulo consultar, he probado varias formas pero sin éxito. Evidentemente no he pasado al módulo modificar por las mismas razones.

El detalle es que no puedo o no encuentro como hacer un contador como éste: http://www.aprendeaprogramar.com/mod/forum/discuss.php?d=1775 porque todo va a un archivo *.dat y al cerrar y abrir el programa debe continuarse la numeración.

Adjunto el archivo completo por si sirve de algo:

https://mega.co.nz/#!UhZDQZyD!Bl1YcGi_3QT_kXcEC1B5KvChZBGa4K1YfGxpJcOHgX4

https://mega.co.nz/#!Ep4wlIQK!OkVruJBC5HpduvT6FYQ3Z4owgInKzmD5dh1d2pVPxGI


11-Mar-2015 04:19
Luis Torres (+18)

En la línea 304 tienes escrito:


assign(archiv,'lacteos.dat');


pero, el nombre del archivo no es ese, sino "lacteo.dat", sin la letra "s".

Ante todo te felicito porque tu código está muy bien estructurado y pensado, sin embargo, tengo una objeción, declaraste una variable de archivo del tipo "text" en lugar de "file of regmaestro", supongo que lo hiciste para poder utilizar en el ciclo while la función "seekeof" (esta función se usa solo en archivos de texto, y no de registros). Yo en tu lugar, declararía esa variable como debía ser, y utilizaría las funciones que están diseñadas especialmente para manejar archivos de registros, como lo son "seek(variableFichero,indiceRegistro)" y "fileSize(variableFichero)". Solo tienes que tener cuidado en que con la función "seek" el primer registro le corresponde el índice cero, o sea, comienza a numerar los registros desde cero; y "fileSize" devuelve el número de registros, a lo que deberás restarle uno para poder usarla en combinación con "seek" en ciclos "for".

Espero haberte ayudado.
Saludos.


11-Mar-2015 07:34
Jose Gutierrez

Muy buenas madrugadas. Muchas gracias amigo Luis Torres por tu respuesta. Intenté hacer lo que me indicas pero no logré comprenderlo del todo, peri inmediatamente vi esta frese entre tus líneas " . . . y "fileSize" devuelve el número de registros", se me prendió el foco y con pequeñas modificaciones he logrado resolver, añadiendo esto al menú, dentro de la setencia repeat del menú principal:


 	repeat
	assign(f,archivo);
	{$I-} reset(f); {$I+}
	if ioresult <> 0 then
		begin
			close(f);
			n := 1
		end
	else
		begin
			n := filesize(f)+1;
			close(f);
		end;



Adjunto archivo *.pas por si alguien se interesa en saber como lo resolví: https://mega.co.nz/#!kpxmnQbS!ssV1jwF9xwN4AFcEDzj3e3Y03tmCD9iG83dCIXtYaFc


11-Mar-2015 15:01
Luis Torres (+18)

Ya lo revisé, y sí, así era como te lo había indicado.
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.)