Cliente Servidor

Hola Alonso te cuento que terminé mi proyecto final y funciona genial a nivel local, sin embargo para la demo que tengo que hacer necesito que funcione en red y a nivel de procedimientos lo hace, pero tengo un inconveniente con la velocidad a la que funciona ya que es demasiado lento para guardar e imprimir los tiquetes de préstamo de libros. En el archivo main del sistema le hago un SET DEFAULT TO z:\ en donde z es una unidad compartida en un servidor de pruebas con windows 2000 server y creo una unidad en dos pcs desde la cual jalo los accesos directos al sistema. Ya te digo funciona pero demasiado lento. Lo extraño es que a la hora de guardar lo que hace es un insert que se supone que debía ser muy rapido según la literatura. Tienes alguna idea

3 Respuestas

Respuesta
1
Bueno realmente es raro porque un insert si funciona rápidamente ahora dime estas seguro que es en el insert el que te esta causando el problema?
Voy a correr el proceso con el debuguer a ver donde es que dura más el proceso y te aviso, no se me había ocurrido pensar que podría ser algo más que los insert, más bien estaba pensando que podía ser algo a nivel de protocolo de red o algo similar ya que desde mi maquina local corre de maravillas.
Saludos y gracias por la ayuda, en un rato te cuento si es el insert o algo más,
Mira tratando de debugear la aplicación descubrí lo que pasa. Y es que dura un gran rato después de que hace los insert pensando y al final dice [conflicto de actualizacion de cursor] lo cual no se que significa, te comento que las tablas están ligadas al entorno de datos del formulario y en la propiedad de "buffer mode override" de las tablas la puse como 3 que es optimistic row buffering y la propiedad buffer mode del formulario la puse como 2 que es row buffering y cuando hago un insert luego ejecuto un tableupdate().
Saludos y agradezco tu ayuda.
Mmm de pronto el problema es el entorno de datos por eso no soy muy participe de usar el entorno de datos lo que generalmente hago es abrir la base de datos en el programa principal y en cada formulario ejecute insert y todas las instrucciones sql y hasta el momento no me ha dado ningún problema
¿Cómo manejo de esa forma el programa? ¿Qué hago? ¿Quito las tablas del entorno de datos? Perdón que pregunte tanto pero apenas estoy iniciando en este asunto !
Saludos
Si puedes quitar las tablas del entorno de datos y trabajar solamente en los form sacando los datos con las instrucciones sql como el select, insert, delete, update, busca en la ayuda así te podrás guiar
Respuesta
1
El problema radica en que esa no es la forma en que debes crear una aplicación de base de datos, lo ideal es que debes acceder a la base de datos desde la aplicación instalada directamente en los pcs clientes y no acceder a ellas al servidor mediante accesos directos, me explico mejor, copias la base de datos en el servidor, instalas la aplicación en los pcs cliente y te conectas a la base de datos desde la aplicación suministrando un cuadro de diálogo para tal efecto, esa es la manera más apropiada.
Otra causa posible hubiera sido el número de usuarios que se conectan al servidor, pero como está claro que son dos, esta posibilidad queda descartada, así que trata mediante la primera opción.
Cualquier cosa me comentas.
Hice otro cambio antes y mejoró muchísimo, lo que hice fue usar lock y unlock cada vez que hago un insert o un update, ya que estaba únicamente atenido al entorno de datos y haciéndolo manualmente mejora mucho. Ahora tengo una confusión mayor, ya que no se cual sea la mejor forma de manejar ese tema. Lo que hice fue que ligué las tablas al entorno de datos el cual puse como optimista y a cada taba la puse como optimistic row buffering. a la hora de hacer un insert o update hago esto:
if flock('Prestalibro')
       insert
       unlock in prestalibros
else
Endif
Y funciona bastante mejor pero no se si sea la forma correcta
Saludos
De hecho esa es la forma correcta, daba por sentado de que habías implementado las líneas que escribiste y que aún así tu aplicación era lenta por eso creí que el problema estaba en la forma como implementabas la aplicación, considero que ya solucionaste el problema.
Cualquier cosa me comentas.
Tengo una consulta más, vieras que extraño, cuando en una de las pc está abierta la ventana bloquea las tablas y en la otra pc trabaja lentísimo, si abro la aplicación en una maquina a la vez funciona perfecto, sin embargo si se abre en las 2 pc se bloquea, no se si sea por tener agregadas las tablas en el entorno de datos.
Saludos y gracias por la ayuda
Trata con esto, establece las propiedades del formulario Datasession y BufferMode del formulario a 2.
Cualquier cosa me comentas.
mmm ya las tenía de esa forma pero es muy extraño porque mientras tenga el formulario abierto en una maquina la otra es demasiado lenta y si presiono guardar en las dos al mismo tiempo una se pega hasta que la otra guarda y se sale del form y en ese momento también guarda y sale.
Saludos y gracias
Entonces quita la función Flock y Bloquea solo el registro de la tabla que se va a actualizar con Rlock ejemplo:
Go 5 In Clientes
If Rlock()
  Replace CampoN With "Nombre"
  Unlock
Endif
A ver cómo te va con esto.
Respuesta
1
Disculpame la demora en responder.
Mirá, lo que te está pasando no es normal. No debería pasar. Me inclino a pensar que se debe a algún problema con la red (quizás por el lado de seguridad de windows). Pero para afirmar esto hay que analizar muchísimos factores.
Según lo que me decís que hiciste, no deberías tener problemas, aunque yo te recomiendo que no hagas SET DEFAULT TO, sino que definas la ruta de acceso del VFP con SET PATH TO a la ruta compartida del servidor. De esta forma, no te importa donde están los datos. Si vos hacés SET PATH TO \\SERVIDOR\CARPETACOMPARTIDA\, después no hace falta referenciar la ruta de ningún archivo de datos, ni siquiera tenés que conectar una unidad de red, directamente abrís la tabla y hacés el INSERT.
Te repito, lo que vos estás haciendo no está mal, y debería funcionar. Lo que yo te digo es una forma prolija de funcionamiento. Por lo tanto no creo que te sirva como solución a tu problema. Yo me inclinaría por lo que te comenté al principio.
Lamento no poder ayudarte más.
Mil gracias por responder, vieras que he hecho muchas pruebas y logré determinar que el sistema se pone lento únicamente cuando se abre en las 2 pc al mismo tiempo, y parece ser que el entorno de datos es lo que bloquea las tablas por los que la otra maquina se pone lenta, pero no se como quitarlas de ahí y seguir usándolas, ya que actualmente yo cuando hago un insert nada más lo hago y si quito la tabla me dice que no se encuentra el alias. Tal vez ahora me puedes echar una mano con más claridad.
Maxisis que pena seguirte molestando pero no se que hacer, si quito las tablas del entorno de datos y mando a guardar da error me dice que no existe el alias, si antes de hacer un insert le pongo use prestalibros me da un error cuando hago el tableupdate() me dice que la función requiere table buffering y si hago un select prestalibros dice lo mismo
Saludos y gracias por tu valios ayuda
Si hacés el INSERT directamente y te dice que no existe el alias quiere decir que VFP no encuentra el archivo donde insertar. Al ejecutar el comando INSERT, si la tabla donde querés insertar no está abierta, VFP la abre, siempre y cuando pueda encontrarla. Para eso, VFP busca el archivo en el directorio de trabajo, si no lo encuentra, lo busca en las rutas definidas con SET PATH. Por eso te nombraba antes ese comando. Fíjate de definirle la ruta donde se encuentra ese archivo con el SET PATH, o sino hacé el INSERT INTO \\servidor\carpeta\archivo directamente (o sea, decile la ruta completa del archivo donde insertar).
Mil gracias funciona muy bien de esa manera, el paso de insertar el prestamo del libro como tal es super rapido,  pero tengo aun otro par de inconvenientes, había puesto en el entorno de datos la tabla estudiantes y con el generador puse un combobox pegado de esa tabla y ahora no se como cambiarlo. me parece mucho mas efectiva la manera de trabajar desconectado de la Base de datos,  y podría hacer un select estudiantes into cursor y que ese combo jalara los datos del cursor, pero me dá error si lo hago y el otro inconveniente es que la tabla de libros es muy larga y en el detalle del prestamo hice una tabla temporal te pongo el codigo a continuacion porque ese paso sigue estando lento
SELECT codigo,cantidad FROM detlibros WHERE detlibros.boleta = boleta INTO CURSOR rebajalibros
SCAN
      WAIT 'Actualizando disponibilidad de libros' WINDOW NOWAIT
      codi = codigo
      cant = cantidad
      UPDATE libros SET cant_disp = (cant_disp - cant) WHERE libros.codigo = codi
ENDSCAN
creo que sería mas rapido si solo usara sql  pero no se como armar esa consulta.
Gracias por todo. De verdad mil gracias.
Maxsis soy yo de nuevo, vieras que ya resolví el asunto del combo box para que trabaje desde un cursor, ahora funciona perfecto, lo único que no se como resolver ahora es el asunto del scan en la tabla de libros.
Saludos y mil gracias de nuevo.
Me alegro que hayas podido resolver los temas anteriores.
Con respecto a armar una única consulta SQL, necesitaría saber la estructura de los datos.
Tenés una tabla "libros" (donde tenés los datos de cada libro por registro) y otra que corresponde a los préstamos de cada uno, ¿no ("detlibros")?
Lo que te recomiendo es organizar los datos como para tener cierta integridad. Para esto, siempre conviene tener un dato en un solo lugar y no en distintos lugares. En tu caso, aparentemente, tenés en la tabla libros un campo que guarda la cantidad de libros disponibles, y en la tabla detlibros tenés la cantidad de libros prestados. Con estos datos debería ser suficiente para saber cuántos te quedan para prestar. No es conveniente guardar en la tabla libros ese valor, ya que por distintos motivos podrías tener una inconsistencia de datos. Con una estructura así, para saber de cada libro cuántos existen, cuántos prestaste o cuántos te quedan, podrías hacer así:
SELECT libros.codigo, libros.nombre, libros.cant_tot AS total, SUM(detlibros.cantidad) AS prestado, libros.cant_tot - SUM(detlibros.cantidad) AS disponible FROM libros LEFT JOIN detlibros ON libros.codigo = detlibros.codigo GROUP BY detlibros.codigo
Este ejemplo que te puse no lo probé, y son nombres de campo de ejemplo. Pero es para darte una idea de como hacerlo.
Consúltame lo que necesites.
Lo que tengo que pedir es que si necesitás consultar alguna cosa pero de otro tema, abras una nueva pregunta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas