Fórum Gerenciar fila no banco de dados #523924

24/06/2015

0

Buenas pessoal!

Estou querendo desenvolver uma aplicação para gerenciar uma fila, ou seja, inserir, remover e alterar ordem, mas essa lógica gostaria de deixar no banco.
Alguém já desenvolveu alguma coisa parecida? Pensei em criar uma procedures no banco ou desenvolver no Delphi, não sei. Gostaria de uma ajuda.

Obrigado desde já!
Rafael Mattos

Rafael Mattos

Responder

Posts

24/06/2015

Dorivan Sousa

voce fala fila de atendimento? onde vai adicionando na ordem sempre no ultimo, ou vai removendo quem ja foi atendido,ou quando chega alguem mais importante e tem que ser colocado no inicio da fila?
Responder

Gostei + 0

25/06/2015

Rafael Mattos

Dorivan, obrigado pelo interesse!

É uma fila de tarefas, quero poder alterar a ordem, ou seja, é a tarefa 1 mas quero mudar para a tarefa de número 3. Então a tarefa 2 vira a tarefa 1, a tarefa 3 vira a tarefa 2. Compreendeu? Acho que a denominação certa seria uma lista e não fila, gostaria de tentar deixar isso no banco. Será que é o correto?
Responder

Gostei + 0

26/06/2015

Marisiana Battistella

Acompanhando para conhecimento...
Responder

Gostei + 0

26/06/2015

Dorivan Sousa

no seu caso de lista de tarefas onde voce precisa definir uma ordem pois é interessante nao alterar o valor do id (chave primaria) no banco de dados da tarefa o melhor é ter o campo ordem que esse voce faria essas mudanças.

pra alterar a ordem de uma tarefa é simples

var
  IdOrigem, OrdemOrigem,  IdDestino, OrdemDestino: integer;

begin
  //antecipando a tarefa de uma registro selecionado
  IdOrigem:=TabelaID.AsInteger;
  OrdemOrigem:=TabelaOrdem.AsInteger;
  
  Query.Close;
  Query.Sql.Clear; //eu utilizo firebird entao eu uso first 1 para pegar so um registro, se for mysql é limit 1 no final do codigo
  Query.Sql.Add('Select first 1 id, ordem from tabela where ordem <:ordem order by order ordem');
  Query.ParamByName('ordem').AsInteger:=OrdemOrigem;
  Query.open;
  
  if not Query.isEmpty then //verifica se ta vazio, pq se tiver nao podemudar a ordem
  begin
    idDestino:=Query.Fields[0].AsInteger; //pega o id
    OrdemDestino:=Query.Fields[1].AsInteger; //pega a ordem

     //atualizando a nova ordem do registro anterior
    Query.Close;
    Query.Sql.Clear;
    Query.Sql.Add('Update tabela set ordem = :ordem');
    Query.Sql.Add('where id = :id');
    Query.ParamByName('ordem').AsInteger;=OrdemOrigem; // aqui eu informo a ordem do registro q eu quero alternar
    Query.ParamByName('id').AsInteger;=IdDestino; 
    Query.ExecSQL;

     //atualizando a nova ordem do registro atual
    Query.Close;
    Query.Sql.Clear;
    Query.Sql.Add('Update tabela set ordem = :ordem');
    Query.Sql.Add('where id = :id');
    Query.ParamByName('ordem').AsInteger;=OrdemDestino; // aqui eu informo a ordem do registro q eu quero alternar
    Query.ParamByName('id').AsInteger;=idOrigem; 
    Query.ExecSQL;
  end;
 
end;


ficou confuso?? eu imaginei uma situacao em que voce vai subindo a tarefa em uma lista... e ja fazendo isso via sql... detalhe é que vc teria q atualizar a visao dos dados a cada operacao
Responder

Gostei + 0

26/06/2015

Marcos P

Mattos,

Sua dúvida é em relação a lógica a ser desenvolvida ou você já tem a lógica e gostaria de ajuda na implementação do lado do banco ?

Se for em relação a lógica, siga o modelo proposto pelo Dorivan : despreze as chaves físicas da tabela ( se elas existirem ) e trabalhe com um ponteiro lógico que defina a ordem relativa das linhas.

Se for em relação a implementação : assumindo que a tabela com a lista já existe, você vai precisar de uma procedure para inserir registros na lista e uma para mudar a ordem dos registros se precisar reordenar os registros por algum critério.

Tenho mais de um sistema que trabalha com esse modelo, mas a lógica fica do lado da aplicação.

Por exemplo : agendamento de serviço em campo, em que se priorizam determinados bairros para atendimento... é exatamente isso !

Tendo a lógica definida, a opção de implementar no banco ou na aplicação, passa a ser uma questão secundária.

Lembrando que trata-se de uma "lista ordenada"... fila e pilha são algoritimos de ordenação baseado na ordem física de inserção dos registros.
Responder

Gostei + 0

30/06/2015

Rafael Mattos

Pessoal, bom dia!

Usei a TObjectList<T> para gerenciar a lista, para preencher a lista uso um "ORDER BY SEQUENCE" na query e quando mando salvar essa lista eu percorro a lista comparando a property Sequence: Integer do meu objeto com o (index + 1) da lista para saber se mudou a ordem, então eu persisto.

Mas não estou satisfeito, gostaria que essa lógica TObjectList<T>.Insert, Add, Move, Remove, etc..ficasse no banco, Assim com uma procedure insert, eu poderia tratar várias listas.

Exemplo: Lista de Serviços da equipe 1 e 2, Se inserir uma tarefa na lista da equipe 1, mas ela já estava listada na equipe 2, já remove a tarefa da lista da equipe 2 e reordena as duas listas.
Responder

Gostei + 0

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

Aceitar