Fórum Reordenação de Itinerário de Clientes #423335

08/09/2012

0

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.


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

Sidney Abreu

Responder

Posts

08/09/2012

Edson Melo

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.
Responder

Gostei + 0

08/09/2012

Edson Melo

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
Responder

Gostei + 0

08/09/2012

Sidney Abreu

Isso eu ja estou fazendo conforme o meu código, o problema é q esta em um laço infinito e nao sei como resolver
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar