[ Foro de Pascal ]

Pulir detalles de un programa en pascal

28-Jun-2014 23:14
Jose Gutierrez
17 Respuestas

Muy buenas tardes amigos del foro, tengo una asignación y he logrado entre un 85 y 90 % del proyecto, sin embargo, hay que pulirle unas cosillas para dejarlo 100% funcional.

Tengo problemas para ingresar una fecha de ingreso entre la linea 99 y 117.

El  otro problema es agregar un submenú para consultas estadísticas, línea 455.

Las especificaciones de lo que se necesita y el código lo subo de manera alternativa pues tengo razones para no hacerlo libremente por tratarse de un proyecto que, de ser visto en ésta página pondría en riesgo mi calificación.

https://mega.co.nz/#!V44AEBzQ!vogZEUZ2AtYZVPhBLFqD6bKIFAwS343EET6NyEFEoFk


28-Jun-2014 23:23
Jose Gutierrez

Quiero agregar, que después de hacer una consulta, modificación, inclusión, alta, o lo que sea que haga, el menú no vuelve a funcionar correctamente. Lo único que he podido hacer en fila son no mas las inclusiones.


29-Jun-2014 00:58
Luis Torres (+12)

Es extraño, pero yo ejecuto tu programa y me funciona bien. Si puedes ser más explícito en los problemas que tú le ves, sería mejor.
Veo que no necesitas realizar operaciones con las fechas, pero en programas en los que son necesarias el mejor formato para almacenarlas es: aaaammdd.
Saludos.


29-Jun-2014 01:08
Luis Torres (+12)

Creo que lo que se te olvidó fue sumarle al total de los días, el costo que tiene que pagar por el ingreso a la clínica.
Saludos.


29-Jun-2014 02:27
Jose Gutierrez

@Luis dijo: "Si puedes ser más explícito en los problemas que tú le ves, sería mejor."
Rta.: Gracias por tu pronta respuesta, el primer problema lo experimento al ingresar varios pacientes, hago una consulta o una modificación, y luego vuelvo al menú principal para ejecutar otro sub-menú, como por ejemplo "reporte de alta" y me pide el número del paciente, lo ingreso y me dice "Error Archivo No Encontrado Pulse Una Tecla"  como si el paciente no está ingresado. Lo cierro y lo abro y si me lo permite.

Lo que me tiene con la fecha (entre las lineas 99 y 117) es que quiero que al ingresar el paciente me permita elegir entre hoy (fecha actual) o ingresar manualmente otra fecha, y no lo hace.

El tercer punto es en la linea 474-475 necesito que me abra otro sub-menú que me permita consultar las estadísticas pedidas en la página 3 del *.pdf que adjunté al *.rar

@Luis dijo: "Creo que lo que se te olvidó fue sumarle al total de los días, el costo que tiene que pagar por el ingreso a la clínica."

Tienes razón, voy a revisarlo para que realice el calculo correcto. Es que trabajarlo por ratos entre trabajo y otras cosas no es tan fácil, se que falta poco para dejarlo al 100%, pero las trabas planteadas no me dejan avanzar completamente.

Muchas gracias por tu respuesta amigo, espero puedas orientarme en los puntos planteados.


29-Jun-2014 05:14
Luis Torres (+12)

Hasta donde yo sé, y espero que el prof. Nacho Cabanes lo aclare, no se puede abrir un archivo para la escritura con rewrite(fichero) y escribir en él sin que los datos que estaban antes sean borrados. Yo tengo entendido que con rewrite(fichero) si el archivo no existe lo crea, y si ya existe borra los datos que estaban allí y comienza a escribir los datos nuevos desde el principio del archivo.
Cuando se quiere "agregar datos" a un archivo ya existente se aplica un "truco", el cual consiste en usar un archivo auxiliar para volcar los datos del archivo existente previamente abierto para la lectura, el archivo auxiliar se abrió para la escritura (rewrite(aux)), así que mientras no sea cerrado se pueden añadir más datos, por lo que se aprovecha la situación para almacenar en él los nuevos datos. Una vez hecho esto, se elimina el archivo original, y se renombra el auxiliar con el nombre del original.
De todas maneras, que sea el prof. Nacho Cabanes quien aclare todo esto. Acabo de revisar a vuelo de pájaro el tutorial de este sitio, pero no noté que dijera nada al respecto.
Saludos.


29-Jun-2014 06:41
Nacho Cabanes (+30)

Efectivamente, "rewrite" es destructivo. Si el fichero ya existía, su contenido es reemplazado por el nuevo. La alternativa es usar "append" para añadir al final, o volcar todo el contenido de ese fichero a un segundo fichero en caso de que se quiera añadir en un punto intermedio.

http://www.aprendeaprogramar.com/mod/resource/view.php?id=223


29-Jun-2014 14:41
Luis Torres (+12)

El problema que hay es que el uso de append es solo para archivos de texto, pero tu programa maneja archivos con tipo, por lo que no se podrá usar. En su lugar debes aplicar "el truco" que te expliqué anteriormente. De todas maneras yo ya hice un código que te dejo a continuación:

 
function guardardatos(dd : paciente) : boolean;
    var
      tt : longint;
      dt : paciente;
      err : boolean;
	  faux : file of paciente;
    begin
       guardardatos := false;
       assign(f,archi);
   {$I-} reset(f); {$I+}
      if ioresult <> 0 then
      begin
	     rewrite(f);
		 write(f,dd);
         close(f);
		 guardardatos := true;
      end
  else
      begin
	      assign(faux,'auxiliar.dat');
		  rewrite(faux);
	      while not eof(f) do
		  begin
		     read(f,dt);
			 write(faux,dt);
		  end;
          write(faux,dd);		  
	      close(f);      
          erase(f);
		  close(faux);
		  rename(faux,archi);
          guardardatos := true;
      end;
    end;
 


Pruébalo a ver si funciona.
Saludos.


29-Jun-2014 18:29
Jose Gutierrez

Muy buen día, gracias por sus atentas respuestas. La nueva función "guardardatos" me ha servido, no me borra los anteriores sino que me anexa, modifica o elimina según la orden que utilice, eso está  bien.

Sigue el problema de no poder hacer más que una inclusión, consulta, alta o modificación, por cada apertura del programa. Es decir, necesito cerrar y abrirlo por cada inclusión, modificación . . .

Por ahora he hecho modificaciones y va así:

https://mega.co.nz/#!ttx3wSyb!zs4qfH33OEQdXrI5VBmDwxMyFSQSxn-4j3IVDrutwHc

Sigo sin entender como generar el reporte estadístico que se necesita.


29-Jun-2014 20:45
Luis Torres (+12)

Pero, tienes que aplicar las mismas explicaciones de mi respuesta anterior para modificar y eliminar un registro, cosa que no hiciste en el último programa.
Para generar el reporte tienes que recorrer cada uno de los registros que está
en el archivo con los datos, con variables acumuladoras (ingresosPatA, ingresosPatB, ingresosPatC, totalMen18, totalMay65F, totalMay65M) guardarás los montos y las cantidades que resulten de sumar cada uno de los ingresos en su respectivo renglón, y contabilizar con variables de incrementos cada vez que se encuentra con un paciente menor de 18 años, o mayor de 65 años y femenino, o mayor de 65 años y masculino, cada una en su variable respectiva. Tienes que buscar, en cada registro el campo que corresponda para hacer el cálculo.


29-Jun-2014 20:58
Jose Gutierrez

Ok, voy a trabajar en eso y les cuento los adelantos.


30-Jun-2014 15:58
Jose Gutierrez

@Luis dijo: "tienes que aplicar las mismas explicaciones de mi respuesta anterior para modificar y eliminar un registro, cosa que no hiciste en el último programa."

Lo intenté ayer y leí el tutorial dejado por el profesor @Cabanes  para comprenderlo mejor y no pude hacerlo en los menúes Modificar y Eliminar, Por ahora sigo detenido en ese punto.

Lo de recorrer cada registro me ha arrojado luz para el reporte estadístico, sin embargo ayer solo me dediqué al asunto que tengo con lo del registro.

Por otra parte, hablé con la profesora y le plantee mis dudas y e dice que por tratarse de un ejercicio y no de un programa productivo, puedo hacerlo sin guardar los datos en un *.dat, me dice que es igual si guarda los datos y si éstos sean temporales, mientras el programa esté abierto. Con respecto a ésto último que me recomiendan ustedes? seguir el camino que llevo o rehacerlo como ella lo considera? Honestamente siento que, a pesar de los detalles he avanzado bastante como para re-estructurarlo cambiándole ese detalle, no obstante espero su opinión y orientación.

Muchas gracias por sus respuestas.


30-Jun-2014 19:06
Luis Torres (+12)

Sí, es verdad, este trabajo es para ser resuelto usando arreglos y nada más, pero como ya te metiste con archivos yo creo que sería de mayor provecho para ti que los sigas trabajando como tal, además, ya estarás listo para Procesamiento de Datos (330).

Recuerda que no puedes abrir un archivo para la lectura y escritura al mismo tiempo, cuando has escrito en un archivo y luego quieres abrirlo para leerlo, debes cerrado primero para después abrirlo a la lectura.

Cada vez que abras un archivo y lo hayas usado (consulta, eliminación, modificación) debes cerrarlo después; con el uso de un procedimiento aquí y otro allá se pueden haber quedado archivos abiertos y si se abren dos o más veces (sin haber estado cerrado antes) eso te traerá problemas.

Saludos.


30-Jun-2014 20:14
Luis Torres (+12)

Para el procedimiento Eliminar, fíjate en el siguiente código:

 
 procedure eliminapaciente(num : longint);
    var
      bn, hh, indice : longint;
	  hallado: boolean;
	  faux: file of paciente;
	  datosE: paciente;
    begin
	  hallado := false;
      assign(f,archi);
    {$I-} reset(f); {$I+}
      if ioresult <> 0 then
      begin
         writeln('  Error Archivo No Encontrado Pulse Una Tecla');
         readkey;
      end
      else
       begin
          bn := 0;
          for hh := 0 to filesize(f) - 1 do
          begin
             seek(f,hh);
             read(f,datos);
             if datos.numpac <> num then
             begin
             end
          else
             begin
			    hallado := true;
                indice := hh;
             end;
          end;
		  if hallado then
		  begin
			 assign(faux,'auxiliar.dat');
		     rewrite(faux);
			 for hh := 0 to filesize(f) - 1 do
			 begin
			    seek(f,hh);
			    if hh <> indice then
                begin
				  read(f,datosE);
				  write(faux,datosE);
                end;				
			 end;
			 close(f);
			 close(faux);
			 erase(f);
			 rename(faux,archi);
	      end
		  else
          begin		  
             close(f);
		  end;	 
      end;
    end;
 


Pruébalo haciendo inserciones y eliminaciones a ver si ahora te da los problemas de antes.
En cuanto a Modificar, creo que no te podré ayudar mucho, pero debes utilizar lo que aprendiste en Incluir y ahora Eliminar.
Saludos.


30-Jun-2014 22:13
Invitado (Procesamiento de Datos (330))

hola compañeros.
Gracias jose por subir el enunciado y tu codigo , ayuda mucho. Luis queria pedirte el favor si tu ya viste Procesamiento de Datos (330) si tienes tu proyecto me ayudaria a guiarme para el mio agradezco tu ayuda.


01-Jul-2014 01:06
Luis Torres (+12)

No, en realidad no está disponible, porque lo tenía en un pendrive y, no sé dónde está.
Saludos.


01-Jul-2014 06:48
Jose Gutierrez

@Luis dijo: "Cada vez que abras un archivo y lo hayas usado (consulta, eliminación, modificación) . . . y si se abren dos o más veces (sin haber estado cerrado antes) eso te traerá problemas."

Amigo Luis, esta explicación si me ha dejado claro, te lo agradezco mucho. Con ésta explicación y la función "eliminapaciente" que me dejaste, logré entender bien el asunto y he resuelto en "modificar" y "alta", lo que me permite ahora pasar de un menú a otro sin problemas, reitero: muchas gracias.

Ahora me toca trabajar en el reporte estadístico y en detalles menores, considero que ya queda un 5% del programa como tal, luego me liaré para hacer lo de MAPS.

Al terminar el semestre compartiré con ustedes el código final para que sirva de ayuda y ejemplo.

Al amigo Luis y al profesor Cabanes, muchas gracias. Cualquier duda que tenga, pasaré nuevamente por aquí.


01-Jul-2014 22:43
Invitado (invitado)

Ojala encontraras el pen drive luis , me seria de mucha ayuda tu practica de tu año... si tienes informacion de donde estudiaste tu cobol te lo agradezco






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