Fórum Gerenciar fila no banco de dados #523924
24/06/2015
0
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
Curtir tópico
+ 0Posts
24/06/2015
Dorivan Sousa
Gostei + 0
25/06/2015
Rafael Mattos
É 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?
Gostei + 0
26/06/2015
Marisiana Battistella
Gostei + 0
26/06/2015
Dorivan Sousa
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
Gostei + 0
26/06/2015
Marcos P
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.
Gostei + 0
30/06/2015
Rafael Mattos
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.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)