Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Manejo de datos en red (https://www.clubdelphi.com/foros/showthread.php?t=79235)

fpirovani 18-06-2012 15:19:57

Manejo de datos en red
 
Buenos días a todos.
Les cuento que soy novato en esto de la programación asi que pido disculpa de antemano si estoy preguntando una gansada, estuve buscando en el foro pero no encontré una respuesta.
Desarrolle para un amigo un sistema que le permite llevar el control de los pedidos de mercadería que le hacen sus clientes, tiene una sección donde se cargan los pedidos pendientes de entrega y cuando estos pedidos son despachados lo marco como tal mediante un campo verdadero/falso en la base de dados.
El tema es que si dos personas tienen abierta la sección “pendientes” al mismo tiempo puede pasar que una persona esta viendo un pedido como pendiente cuando en realidad acaba de ser despachado por otro usuario. Es mas puede volver a despachar un pedido que ya fue despachado, con lo cual se generan dos números de despacho.
Agradecería si alguien me puede dar una idea de cómo encarar este tema.

Estoy usando tablas Access y un ADOQuery para cada estado del pedido (pendiente, despachado, entregado) los cuales consultan la misma tabla, solo que los filtro según el valor campos verdadero/falso en la tabla.
En un principio usaba un solo ADOQuery, pero eso me generaba otros problemas, que no vienen al caso ahora.

Desde ya Muchas gracias.

newtron 18-06-2012 16:43:08

Hola.

¿Cómo visualizas y seleccionas el pedido a servir? ¿Los tienes en un grid y picas en el que quieres?.

fpirovani 18-06-2012 16:57:47

Los muestro en un dbgrid, al presionar la tecla insert se marca como seleccionado mediante un campo verdadero/falso en la tabla. De esta forma se pueden seleccionar varios pedidos para despacharlos.

Luego al hacer clic en el boton Despachar, los marco como despachado mediente un update

Código SQL [-]
Update Pedidos Set Despachado = True Where PedidoSeleccionado = True

Casimiro Notevi 18-06-2012 17:48:47

Desconozco el tema de transacciones con access, pero en todo caso podrías comprobar si ya ha sido despachado antes de actualizar.

fpirovani 18-06-2012 21:49:14

Gracias por responder.
Como te decia soy nuevo en esto y no tengo estudio en el tema, simplemente voy aprendiendo a medida que voy necesitando hacer algo nuevo, busco una solucion.
Me podrias explicar en general par que se usan las transacciones? porque la verdad no tengo idea.

Si hay dos usuarios usando la misma seccion del programa, supongamos que viendo registros
listados en un DBGrid y uno agrega un registro, hay alguna forma de que el segundo usuario vea esa modificacion sin tener que hacer un Requery o algo similar?

Casimiro Notevi 18-06-2012 21:57:24

No sé si access contempla transacciones, la verdad. Pero ya que estás aprendiendo autodidácticamente te aconsejaría que, si puedes, cambies a postgresql, firebird, mysql, etc. y te olvides de access, paradox, etc.
Este es el "libro maestro" sobre transacciones, en firebird/interbase.

fpirovani 18-06-2012 22:41:29

Si, de hecho estoy en eso, ya instale firebird 2.1.3 y ZoesLib 6.6.6-stable y estoy usando IBExpert para crear la base de datos y todo eso, ya estoy probando.
Gracias por el pdf sobre transacciones, lo voy a leer.
Cuando mencionaste el termino que no conocia busque en internet y vi que se trata de mantener la integridad de los datos, si no se ejecutan correctamente todas las instrucciones de una transaccion, no se ejecuta ninguna.

Ahora, vuelvo a preguntar, si hay dos usuarios usando la misma seccion del programa, supongamos que viendo registros listados en un DBGrid y uno agrega un registro, hay alguna forma de que el segundo usuario vea esa modificacion sin tener que hacer un Requery o algo similar?

Como dije antes, pido disculpas si estoy haciendo una pregunta tonta.

Casimiro Notevi 18-06-2012 22:47:45

O sea, que esté mirando la pantalla fijamente y de golpe se refresque, ¿es eso?.
Busca por post_event
:)

fpirovani 18-06-2012 23:04:46

Claaaro, eso mismo, que si usuario agrega un registro el otro usuario vea reflejado ese cambio, pero sin necesidad de estar haciendo un Requery por las dudas que otro usuario haya agregado un registro por ejemplo.

Gracias por el dato, voy a buscar a ver que enuentro. :D

fpirovani 18-06-2012 23:55:17

Ya estaaaa :D
Muy bueno tu dato, Muchas gracias!!!
Use un ZIBEventAlerter y cree los trigger en la base de datos :)
Por si alguien esta en la misma situacion les dejo esta pagina, donde lo explican muy claramente.
Desgraciadamente nada de esto funciona para el sistema que ya tengo hecho con access :(

Muchas Gacias!! :)

http://www.firebird.com.mx/modules/A...php?storyid=35

Casimiro Notevi 19-06-2012 00:25:20

Es que access es una "tabla plana", algo muy "doméstico", no es relacional ni... nada. No tiene procedimientos, triggers, etc.

fpirovani 19-06-2012 14:20:27

Si, ya veo que firebird da muchas mas posiblidades....

Vos sabes que no lograba que se refrezcaran los datos en el DBgrid, el evento Post_Event se ejecutaba, hacia un refresh y nada, no aparecia el nuevo registro.
Descubri que hay que configurar la propiedad TransactIsolationLevel del ZConnection en tiReadCommitted. Por el nombre supuse que se referia a que debia leer las transacciones que se ejecutaron con exito, y asi fue.

Gracias por tu ayuda, esta muy bueno esto...

Casimiro Notevi 19-06-2012 14:40:28

Cita:

Empezado por fpirovani (Mensaje 435501)
Gracias por tu ayuda, esta muy bueno esto...

Me alegro :)

Delphius 19-06-2012 16:31:21

Casimiro Access si es relacional, aunque no cuenta con los triggers, etc.
En términos reales Access no es una base de datos, es más bien una fachada muy básica del verdadero motor: Jet4.

Access no soporta transacciones, pero si se está empleando ADO para acceder a éste es posible ya que ADO tiene soporte para eso (véase el método BeginTrans y otros de sus componentes). El asunto es que para funcionar las transacciones sobre Access requiere de una "capa" más ya que se requiere "emular" y tratar a Access como si fuera MS SQL Server, que es también otra fachada del motor Jet4, aunque ya algo como la gente :rolleyes:
Se que la explicación anterior es medio burda, no sabría como explicarlo mejor.

Saludos,

Casimiro Notevi 19-06-2012 21:42:10

Cita:

Empezado por Delphius (Mensaje 435512)
Se que la explicación anterior es medio burda, no sabría como explicarlo mejor.

Se entiende :)


La franja horaria es GMT +2. Ahora son las 07:57:03.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi