Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Actualizar registros individualmente (https://www.clubdelphi.com/foros/showthread.php?t=76568)

oscarac 09-11-2011 18:10:22

Actualizar registros individualmente
 
Buenos dias....
tengo un tema que le doy vueltas y vueltas y hasta ahora no consigo solucion...
tratare de ser lo mas explicito posible...
se trata de un concesionario de comidas.... la cual subvenciona 1 sola comida al dia, pero como las computadoras no estan en red y tienen otras sucursales... a veces los comensales pueden comer en un lugar e ir a otro y cenar
la informacion que se graba es la siguiente

Cita:

Cabecera
NumeroTicket-----Fecha----CodigoTrabajador-----
0000000001------01/11/2011-----000325
0000000002------01/11/2011-----000245
0000000003------01/11/2011-----000999
0000000004------01/11/2011-----000657
0000000005------01/11/2011-----002144
0000000006------01/11/2011-----000325
Cita:

Detalle
NumeroTicket-----Producto-------Cantidad---Subvencion
0000000001------00001----------1------------0
0000000002------00001----------1------------0
0000000003------00001----------1------------0
0000000004------00001----------1------------0
0000000005------00001----------1------------0
0000000006------00001----------1------------0
despues de procesar deberia quedar asi

Cita:

Detalle
NumeroTicket-----Producto-------Cantidad---Subvencion
0000000001------00001----------1------------1
0000000002------00001----------1------------1
0000000003------00001----------1------------1
0000000004------00001----------1------------1
0000000005------00001----------1------------1
0000000006------00001----------1------------0
Si se dan cuenta el ticket 00000006 es de la misma persona el mismo dia.. entonces el segundo consumo no se subvenciona...

alguna idea?

Casimiro Notevi 09-11-2011 18:45:02

¿Esto es lo mismo del otro día?.

oscarac 09-11-2011 19:56:12

Cita:

Empezado por Casimiro Notevi (Mensaje 418030)
¿Esto es lo mismo del otro día?.

asi es.. solo que aqui he tratado de simplificar la base del problema.. se que con un query no lo podre solucionar, tendre que hacer un "barrido" (recorrer) la tabla de detalle

Casimiro Notevi 09-11-2011 20:08:25

¿No te has parado a pensar que si allí no te contestó nadie puede ser porque no se entienda bien lo que preguntas?
Yo todavía no lo tengo muy claro, la verdad, entiendo por dónde van las cosas, pero claro, como para contestar algo, no.
Deberías especificar tablas, campos, claves entre ellos, etc. creo que eso aclararía bastante las cosas.

oscarac 09-11-2011 20:13:39

Cita:

Empezado por Casimiro Notevi (Mensaje 418037)
¿No te has parado a pensar que si allí no te contestó nadie puede ser porque no se entienda bien lo que preguntas?
Yo todavía no lo tengo muy claro, la verdad, entiendo por dónde van las cosas, pero claro, como para contestar algo, no.
Deberías especificar tablas, campos, claves entre ellos, etc. creo que eso aclararía bastante las cosas.

claro que siii.... pero mas que una solucion tacita busco ideas para la solucion, basicamente el problema se resume a....
solo grabar un dato en un campo x cuando el consumo del dia sea solo 1 y grabar en ese mismo campo el valor o (cero) cuando el consumo del dia sea mas de 1 :(
la cosa es como hacerlo...

Casimiro Notevi 09-11-2011 22:06:45

¿Pero importa el producto, puede ser otro o da igual, con tal de que sea el mismo trabajador?. Es por día, no?, ¿si la fecha es otra entonces no cuenta?.
Falta aclarar las cosas, que como tú lo sabes, te parece que se da por hecho que es así, pero nosotros no lo sabemos :)
Además, esos ejemplos que has puesto, la tabla detalle, no lo entiendo, ¿son dos tablas detalles?, en una debe quedar 1 y en la otra cero?

oscarac 09-11-2011 22:16:10

Cita:

Empezado por Casimiro Notevi (Mensaje 418052)
¿Pero importa el producto, puede ser otro o da igual, con tal de que sea el mismo trabajador?. Es por día, no?, ¿si la fecha es otra entonces no cuenta?.
Falta aclarar las cosas, que como tú lo sabes, te parece que se da por hecho que es así, pero nosotros no lo sabemos :)
Además, esos ejemplos que has puesto, la tabla detalle, no lo entiendo, ¿son dos tablas detalles?, en una debe quedar 1 y en la otra cero?

ok Casimiro.. mas detalles

el consumo debe ser por dia... si es de un dia diferente no importa...
los productos... normalmente es solo uno (aunque quiero dejar abierta la posibilidad de que puedan ser mas)
la primera tabla de detalle es como se graba la informacion con la subvencion en o (cero)
la segunda tabla es como debe quedar despues de generar el proceso ? (que aun no se como hacer):(

Casimiro Notevi 09-11-2011 22:26:54

Vale, entonces creo que va a ser fácil con un trigger, ¿es firebird, verdad?

oscarac 09-11-2011 22:34:14

lamento decirte que no
es MS SQL server

Casimiro Notevi 09-11-2011 22:40:16

Pero supongo que tiene triggers.

Sólo tienes que crear uno en el beforeinsert, que haga un count de la cantidad por producto y trabajador.
Si es cero entonces cambias el campo por 1, si es mayor entonces lo cambias por 0.
A ver si te doy un ejemplo...

oscarac 09-11-2011 22:47:40

creo que nos estamos confundiendo un poco...
esa parte si esta controlada... osea.. el sistema busca cada vez que se hace un consumo si es que el trabajador ya hizo algun consumo ese mismo dia

el problema es que la informacion como no esta en red. se centraliza en una computadora central (hay un proceso que genera un archivo de texto para envio y el sistema procesa esa informacion y lo actualiza)

como el trabajador puede comer en cualquier lugar (de los n puntos instalados), debo reprocesar la informacion para acomodar las subvenciones.. se entiende ahora?

Casimiro Notevi 10-11-2011 00:26:39

¿Entonces son ficheros de texto? :confused:

oscarac 10-11-2011 15:10:11

Cita:

Empezado por Casimiro Notevi (Mensaje 418067)
¿Entonces son ficheros de texto? :confused:

No, no son ficheros de texto.... el sistema envia la informacion a la computadora donde se centraliza via archivo de texto, el cual abre ese archivo de texto y unifica, actualiza, complementa la informacion de los demas puntos de venta

Casimiro Notevi 10-11-2011 17:16:24

Puede que esté un poco confundido, pero no logro comprender "el entorno" para aconsejarte, por ejemplo, dices que no son ficheros de texto, sin embargo dices:

Cita:

Empezado por oscarac (Mensaje 418103)
No, no son ficheros de texto.... el sistema envia la informacion a la computadora donde se centraliza via archivo de texto, el cual abre ese archivo de texto y unifica, actualiza, complementa la informacion de los demas puntos de venta


Si envías un archivo de texto, abres el archivo de texto y procesas el archivo de texto, entonces son archivos de texto :)


Puedo ser bastante torpe en ocasiones, pero en serio que no me entero de lo que necesitas :(:o

Hay algo que te estás saltando en las explicaciones :)

oscarac 10-11-2011 17:26:08

ok
hay un sistema que controla que los consumos no se repitan en el mismo dia
lamentablemente el comedor tiene sucursales y las maquinas no estan en red
toda esa informacion se centraliza (via archivos de texto) en una computadora donde se realiza el proceso de facturacion

al aceptar informacion de otras sucursales nos dimos cuenta que los trabajadores podian comer el mismo dia en una u otra sucursal (como no estan en red.. no es posible saber si comen o no en otro lado)

cuando se sacaron los reportes para verificar los consumos.. nos dimos cuenta que los trabajadores podian consumir en "n" lugares el mismo dia... entonces la idea cual fue.... ok... vamos a "reprocesar" la informacion para que si existen mas de 1 consumo en un dia.. solo reconozcamos 1 consumo.. los "n" demas... los asume el trabajador

se entiende ahora?

Chris 10-11-2011 18:43:55

mmm entonces los tiros van por cómo sincronizar la información, no del cómo determinar si un trabajor ya hizo un consumo en el día que corre. Lo último se resuelve fácilmente, a cómo te ha dicho Casimiro. Respecto al asunto de la sincronización, yo más bien creo que -con todo el respeto- están infrautilizando sus recursos y el sistema actual es deficiente al estar imposibilitado de sincronizarse en tiempo real.

Algo que no entiendo es: Dices que las computadoras no están en red. Pero, ¿De qué forma se intercambian las computadoras el archivo de texto con el que se sincronizan? ¿Con memoria USB, por medio de correos electrónicos, a mano?

La mejor solución que yo veo es que centralices el sistema en un sólo servidor. No sé que condiciones tienes, pero si puedes ver que las condiciones se prestan a la posibilidad de centralizar los datos, lo hagas de una vez por todas.

Saludos,
Chris

oscarac 10-11-2011 18:57:06

parece que aun no me hago entender
en cada computadora, se efectuan los consumos...
Ejemplo...
Computadora Nº 001
viene el trabajador.. pasa su fotocheck por la lectora de codigos de barra.. el sistema lo identifica y hace el pedido de lo que quiere comer, antes de grabar el sistema valida que no haya efectuado un consumo anterior, el sistema graba emite un ticket como comprobante del consumo y listo... siguiente trabajador...

ahora digamos que este mismo señor.. regrese en la noche.. pero en lugar de ir a la computadora 001 va a la 002 y hace un pedido... al no estar en red... el sistema no tiene forma de saber que ya en la Nº 001 hizo un consumo

a la semana o cada quince dias... todos los tickets de todos los trabajadores de todas las computadores se envian (via archivos de texto en un USB o mail) a una computadora central donde se agregan los tickets...

si nos damos cuenta en el ejemplo que acabo de mencionar se tendria lo siguiente:

Cabecera
Cita:

Ticket---------fecha-----Trabajador
001-0000355 08/11/2011 000325
002-0011477 08/11/2011 000325
Detalle
Cita:

Ticket--------Producto-- Precio----Subvencion
001-0000355 --00001 ---5.00--------5.00
002-0011477 --00001 ---5.00--------5.00
mismo trabajador mismo dia... 2 tickets diferentes (dentro del ticket pueden registrarse varios productos)

la idea como dije era reprocesar (algo que ya esta grabado) y que quede la informacion asi

Detalle
Cita:

Ticket--------Producto-- Precio----Subvencion
001-0000355 --00001 ---5.00--------5.00
002-0011477 --00001 ---5.00--------0.00
espero me haya dejado entender

Chris 10-11-2011 19:06:18

Ok. Creo que medio entiendo. Lo que quisiera saber que cómo le metes la información del archivo de texto a la computadora central. No habló del cómo llevas la información a ella. Ya has dicho que lo haces por USB o Correo. Estoy hablando si tú controlas el proceso de la interpretación del archivo que se le mete a la computadora central. Dinos cómo haces la interpretación del archivo. Es en esta etapa dónde tienes que hacer ese control y conversión que necesitas.

Saludos,
Chris

oscarac 10-11-2011 20:22:56

gracias chris por la atencion y el interes,
seria una buena forma el controlarlo de esa forma, el problema es que ya existe informacion grabada

y me gustaria que sea un proceso posterior.. puesto que estoy pensando que el subsidio no siempre sera el mismo y puede ser que cambie en cualquier momento desde cualquier momento

ejemplo..
estamos 10-11-2011 y pueden decir... todos los consumos desde el 01-11-2011 el subsidio ya no sera solo del plato XXXX sino tambien del plato YYYY .. entonces se tendria que reprocesar toda la informacion desde el 01 al 10

abelg 10-11-2011 21:54:02

Hola, mira no se si comprendi bien pero con los datos que proporcionaste pude plantear esta solución, cree 2 tablas temporales solo para simular tus tablas y 1 que si la uso para el resultado. (esta en SQL Server) pero creo puede aplicarse la misma lógica en cualquier otro.

Código SQL [-]
Create table #cabecera (
  nro_tiket varchar(10),
  fecha     datetime,
  cod_trab  varchar(6)
)

create table #detalle (
        nro_tiket varchar(10),
        producto  varchar(5),
        cantidad  int,
        subvencion int,
)

create table #result(
        orden int identity(1,1),
  nro_tiket varchar(10),
  cod_trab varchar(6),
  fecha datetime,
  producto varchar(5),
  cantidad int,
  subvencion int
)


insert into #cabecera values ('0000000001', '2011-01-11', '000325')
insert into #cabecera values ('0000000002', '2011-01-11', '000245')
insert into #cabecera values ('0000000003', '2011-01-11', '000999')
insert into #cabecera values ('0000000004', '2011-01-11', '000245')
insert into #cabecera values ('0000000005', '2011-01-11', '002144')
insert into #cabecera values ('0000000006', '2011-01-11', '000325')

insert #detalle values('0000000001', '00001', 1, 0)
insert #detalle values('0000000002', '00001', 1, 0)
insert #detalle values('0000000003', '00001', 1, 0)
insert #detalle values('0000000004', '00001', 1, 0)
insert #detalle values('0000000005', '00001', 1, 0)
insert #detalle values('0000000006', '00001', 1, 0)

insert #result
Select c.nro_tiket,
       c.cod_trab,
       c.fecha,
       d.producto,
       d.cantidad,
       d.subvencion
from #cabecera c
    inner join #detalle d on c.nro_tiket = d.nro_tiket


update #result set subvencion = 1

update #result set subvencion = 0
where cod_trab in (Select rt.cod_trab 
                   from #result rt
                   where #result.orden > rt.orden and 
                   rt.cod_trab = #result.cod_trab and 
                   rt.fecha = #result.fecha)

Select *
from #result

Drop table #cabecera
Drop table #detalle
Drop table #result

Salu2, espero sea lo que buscas.


La franja horaria es GMT +2. Ahora son las 05:30:17.

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