Fórum Reordenação de Itinerário de Clientes #423335
08/09/2012
0
Eu tenho uma tabela de CLIENTES onde eu tenho os campos envolvidos:
Cli_Id(Codigo do Cliente - Primary Key)
Rot_id(Código da rota do Cliente - Integer)
Cli_intinerario(Código do itinerário do cliente)
Cada cliente tem uma Rot_id de visitação, como se fosse os dias de visitação daquele cliente, e tem um código também que indica a ordem da visitação daquela rota, ou seja, no dia X eu tenho q visitar 20 clientes, então o que identifica qual eu vou vistar primeiro é esse campo Cli_intinerario. Assim o vendedor sabe qual o cliente ele vai visitar pela ordem.
Agora vem o problema, vamos supor que nesses 20 clientes que o vendedor esta visitando entre um novo cliente, e esse novo cliente a ordem dele, ou seja, o Cli_intinerario vai ser o numero 5, vai ser o quinto cliente a ser visitado. então eu preciso fazer um reordenação dos outros clientes dessa rota, o cliente que era o 5 agora vai ser o 6, e o cliente 7 agora vai ser o 8, assim por diante.
eu criei um trigger para fazer isso, mas fica travando como se estivesse em um loop infinito, e tb tentei fazer um StoreProcedure, mas tambem não tivi sucesso. estou postando as duas aqui, se alguém puder me ajudar eu agradeço.
CREATE OR ALTER trigger trg_reordenar_intinerario for clientes
active before insert or update position 0
AS
DECLARE VARIABLE VARCONT INTEGER;
DECLARE VARIABLE VARCLI_ID INTEGER;
BEGIN
VARCONT = NEW.cli_intinerario;
FOR
SELECT
CLI_ID
FROM
CLIENTES
WHERE
(cli_intinerario >= :VARCONT) AND
(ROT_ID = NEW.ROT_ID) AND
(CLI_ID <> NEW.CLI_ID)
ORDER BY
cli_intinerario
INTO :VARCLI_ID
DO
BEGIN
VARCONT = VARCONT +1;
UPDATE CLIENTES
SET cli_intinerario = :VARCONT
WHERE (CLI_ID = :VARCLI_ID) AND
(ROT_ID = OLD.ROT_ID);
END
END
CREATE OR ALTER PROCEDURE sp_reordenar_intinerario (
rota integer,
novo_int integer,
cliente integer)
returns (
cli_id integer,
cli_intinerario integer,
rot_id integer)
as
declare variable intinerario integer;
BEGIN
intinerario = :novo_int;
FOR
select cli_id, cli_intinerario, rot_id from clientes
where rot_id = :rota and cli_intinerario > :novo_int and cli_id <> :cliente
order by cli_intinerario
INTO :CLI_ID,
:CLI_INTINERARIO,
:ROT_ID
DO
UPDATE CLIENTES SET
cli_intinerario = :intinerario+1
WHERE (CLI_ID = :CLI_ID) AND
(ROT_ID = :ROT_ID);
intinerario = intinerario;
BEGIN
SUSPEND;
END
END
Sidney Abreu
Curtir tópico
+ 0Posts
08/09/2012
Edson Melo
o novo cliente coloco como sendo de numero 200 por exemplo, ordeno o restante , este novo cliente que inclui devera sser o de numero 7, o que faço e aumentar o numero 7 para 8 seguindo aumentando o restante do 8 para 9 e assim indoo ate proximo ao numero que coloquei para o novo cliente, obs não deixe o sistema auterar este numeo, ai e so fazer com que o sistema edit o numero 200 colocando o 7, e ai estara sua sequencia reordenada.
durante a execução e evidente que teremos dupliciddae pois quando passarmo o numero 7 para oito ja devera existir outro com numero 8, mas como ele vai na sequencia e so renoomear o segundo 8 para 9 e assim sussetivamente.
acho que te resolveria , pelo menos logicamentte agora em projeto tenho duvidas , pois iria depender da m ontagem do banco ode dados, se estaria usando indeces, tabela extrangeira, qual banco firebird, sql server etc.
espero pelo menos ter te dado uma ideia.
Gostei + 0
08/09/2012
Edson Melo
tentte vale a pena vai ficar mais facil
Gostei + 0
08/09/2012
Sidney Abreu
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)