Errores en Aplicación de VisualFox

Ya había terminado y estoy capturando datos en mi aplicación, la cual no se pareciera que se ha vuelto loca hay usuarios que me los esta sobre escribiendo con datos que no son, y se supone que llevo un indice para que no se dupliquen y lo esta haciendo tengo usuarios duplicados con esos datos son usuarios que están siendo editados de alguna manera y otro error que tengo es que hay un form para eliminación, trabaja bien, solo que a la hora de salir del form me marca que debo abrir en modo exclusivo AYUDA!

2 respuestas

Respuesta
1

Respecto a que para borrar te solicita que debe ser en modo exclusivo es por que tienes abierta la tabla en la que quieres borrar datos en modo "shared" y debes usar el comando "pack", cosa que arroja error en un entorno compartido, puedes usar el método pack al cerrar toda la aplicación (es decir al salir del sistema) dentro del comando try... mira:

Try
     Pack
Catch
     Wait Window Nowait "Tabla en modo compartido"
Endtry

Lo otro de los índices, es posible que no estés apuntando bien tus modificaciones y al enviar un comando Replace por ejemplo lo esté haciendo sobre un registro equivocado. Antes de realizar cualquier modificación a tus tablas deberías confirmar que estés escogiendo correctamente el registro; usando por ejemplo LOCATE o SEEK o bien abrir directamente la tabla desde un grid... bueno hay várias maneras de hacerlo.

En la eliminación estoy manejando el comando Pack en el relesase para que lo elimine completo no solo la info y me deje el espacio.

¿Y en cuestión de la modificación lo hago desde un combo para cargar la info a modificar lo haci bien los primero 5 de ahí seguí modificando y ahora tengo varios que ya están mal el comando seek es parecido al que se ocupo para los informes no?

Ocupe tu código y lo elimina pero no físicamente y no lo puedo volver a dar de alta ya que se socio ya esta ocupado

Si, el SEEK funciona del mismo modo.

No lo elimina físicamente, pero puedes evitar verlo más usando SET DELETE ON, lo agregas una sola vez al inicio de tu aplicación y listo.

Para eliminar fisicamente los datos marcados para borrar con DELETE debes esperar a que ningún usuario esté usando el sistema y abrir la tabla en modo exclusivo... por ejemplo, podrías usar un bucle usando el mismo comando try para abrir la tabla en modo exclusivo; por ejemplo:

Try
     Select <Tabla>
     Use
     Use <Tabla> Exclusive
     Pack
Catch
     Wait Windows "La Tabla está en uso por otro usuario."
Endtry

Esto podrías ponerlo en el método destroy o release del formulario. Entonces al último que cierre el formulario hará el pack.

En los casos en que deseas usar el mismo código o número de socio no lo elimines solo modifica reemplazando los datos del socio, tal que nombres, etc dejando los campos vacíos para poder llenarlos con un nuevo socio, y el mismo número, ¿no se si soy claro?.

Si solo dejo la opción de eliminación por si así lo desea el usuario para mi se me hace más viable como lo dices es cuestión de cada usuario, agradezco el tiempo que te tomas en resolver mis dudas, sabes la idea que tengo es en los form de búsquedas para la impresión del informe añadir el botón de edición para que sea certara la edición llamando mi form de edición ya que lo intente desde ese form y me marca que no encuentra la variable m.csocio que se le agrego a los informes si me puedes instruir como seria te lo agradecería mucho ya que estoy editando la tabla con los datos que se dañaron colocando los que deben ser

Corrígeme si me equivoco pero creo que ya di con el error si es que mi teoría es cierta cuando yo doy de alta un usuario la serie se encuentra en el socio no en el id por que así lo configure pero la edición la tengo configurada que me llame el id del usuario no el numero de socio donde esta la serie  crees que por eso se haya puesto loco a la hora de editar?

Totalmente de acuerdo con tu pensamiento, por ese lado debe producirse el error a la hora de modificar datos.

Por otro lado es buena idea usar el formulario de busqueda que tienes y desde allí crear un botón para llamar al formulario de edición; para asegurarte de posicionarte en el formulario de edición sobre el registro correcto... no se si sabes que puedes pasar por valor el código del socio (por ejemplo) o más datos si quieres...

Do Form <FormDeEdicion> With cCodigo
** Donde cCodigo podría ser el código del Socio.

Luego para leer ese código agregar en el Formulario de edición en el método "INIT" el parámetro que leerá el valor pasado...

Parameter cCodigo

En ese mismo método Init podrías usar el USE para abrir la tabla si no esta abierta o SELECT y luego SEEK para asegurarte de posicionarte en el registro correcto.

Ok cree un botón en el reporte donde busco al usuario, en el form de modificación quite el combo aun falta corregir sus botones de guardado y cancelar, ya que cambie unos text en el init agregue esto

SET DATE TO DMY
Parameter cCodigo
Select Planilla
Set order to Socio
Seek m.cSocio
If found()
Select Planilla
m.cSocio = Planilla.Socio
Endif

Y en el botón el código que me proporcionaste

Do Form c:\recursos_humanos\cambios.scx With cCodigo

¿Y me marca que con encuentra la variable ccodigo aunqye ya la declare en el release como publica como vez que estoy haciendo mal?

Parameter debe ser la primera línea, y la haz puesto en 2do lugar.

Parameter cCodigo
SET DATE TO DMY
Select Planilla
Set order to Socio
Seek m.cSocio
...

Por otro lado no necesitas publicar en Release variables ya que al salir del formulario ya no usas esas variables; cuando haces DO <formulario> with <variable>, esta última pasa por valor y en donde está Parameter la estas declarando, incluso puedes usar otro nombre de variable en Parameter que contendrá el mismo valor pasado.

Me sigue dando el mismo problema a la hora de llamar el form de edición desde el de los reportes

Es que no debes haber declarado la variable cCodigo; no debes declararla en Release como mencionabas, debes declararla al inicio del método click del botón nuevo que creaste "Editar"...

Listo ya la declare en el mismo botón y ahora me marca que la variable m.csocio de init del fom de modificación no esta declarada y ya la coloque en el release de ese fom, y si le doy pasar por alto me carga la información del primer usuario...

No declares variables en Release, no tiene mucho sentido, ya que ahí solo se activaran al cerrar el formulario..

Por otro lado: pasas el código del Socio entre formulario a través de la variable cCodigo, entonces el Seek debe ser con esa misma variable... mira:

Parameter cCodigo
SET DATE TO DMY
Select Planilla
Set Order to Socio
Seek cCodigo       && Aquí usas el valor del código de Socio pasado.
If Found()
     Select Planilla
     m.cSocio = Planilla.Socio
Endif

Lo que tiene dentro del bloque If Found() - Endif, no tiene mucho sentido ya que repites lo que indicaste solo 3 líneas antes; es decir Select Planilla... ya tienes seleccionada la tabla Planilla no es necesario que la vuelvas a seleccionar; la segunda línea dentro del If-Endif (m.cSocio=Planilla. Socio) también tienes ese dato que es el que pasaste por valor desde el formulario de búsqueda, solo que ahora se llama cCodigo (que es el equivalente a m.cSocio); lo entiendes; sino cualquier cosa me dices y tratare de explicarme mejor.

Ya más o menos te entendí ya quite las líneas que tengo demás, si quito el seek me carga sin ninguno error el primer registro de la base no el que seleccione si lo agrego me marca que los datos no coinciden los tipos de datos y es con la línea del seek en el depurador

No tienes que quitar el Seek, debe quedar como "Seek cCodigo".

En el formulario de búsqueda, donde escribes..

Do Form c:\recursos_humanos\cambios.scx With cCodigo

Que valor le das a la variable cCodigo?, haz una captura de pantalla para ver de donde tomas el valor a pasar

En el botón de edición se queda con estas líneas

¿Ya hice los arreglos entre el calor y tanto código ya me tienen atarantado ya funciona en el form de edición quite el combo y deje todos los text con el código de guardado crees que me vuelva a dar más lata o ya con eso se suficiente?

Ahí cCodigo no tiene ningún valor, no es necesario que uses Public, quita esa línea.

Para que cCodigo tenga un valor deberías asignarle uno, por ejemplo y al igual que el código que usas en Reporte, dale valor a cCodigo por ejemplo así... como antes no lo uses literal.

cCodigo = Thisform.Grid1.Column1.Text1.Value
Do Form <OtroForm> With cCodigo

Excelente!, no lo creo así quedará bien ya.

Que crees si no abro al usuario para visualizar el reporte interno o externo en el fom de edición sale vació y si me salgo y regreso sigue cargada la información del ultimo usuario que edite además de que el botón de cancelar lo quitare ya que me borro el usuario que visualice y le di cancelar y lo borro solo dejo la fila vacía

Sorry, sorry error mio había cargado la información con la variable de los reportes m.csocio y no me fije que los cambiaste a ccodigo hasta que cerré y abrí nuevamente y corrí la form me marco el error hice el arreglo y quedo ya lo probé solo lo dejare en el form de búsqueda por ide para que no se hagan tantas bolas agradezco nuevamente toda tu paciencia y tiempo en ayudarme

Me alegro mucho, exitos.

Respuesta
1

La primera prueba que aria es reindexar las tablas, en el entorno del fox, abre la base de datos en forma exclusiva, abre la tabla que aparentemente tiene el problema y ejecuta un REINDEX.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas