Reordenação de Itinerário de Clientes
Galera eu estou precisando fazer uma reordenação de um campo especifico na minha tabela de clientes. vou tentar explicar como funciona.
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.
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
Curtidas 0
Respostas
Edson Melo
08/09/2012
ola sidney , pelo que vi, seria facil resolver , coloque o novo cliente com um numero ficticio, fora da sequencia, ordene os cliente com base em seu numero real, mude os numeros da sequencia apartir do numero que devera ser deste novo cliente aumentando 1 digito , vou explicar melhor :
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.
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
Edson Melo
08/09/2012
nao tinha olhado seu codigo, mas acho que resolveria , pois a sequncia de rotas, voce usa integer, o que ajudaria no meu esquema explicado
tentte vale a pena vai ficar mais facil
tentte vale a pena vai ficar mais facil
GOSTEI 0
Sidney Abreu
08/09/2012
Isso eu ja estou fazendo conforme o meu código, o problema é q esta em um laço infinito e nao sei como resolver
GOSTEI 0