DataTables guardar dados da última consulta [RESOLVIDO]

1. DataTables guardar dados da última consulta [RESOLVIDO]

Emilio
Emilio Araujo

(usa Debian)

Enviado em 07/07/2023 - 17:11h

Olá,

Estou com um pequeno projeto aqui na empresa, e nele, eu pesquiso os campos "cotanum" e "cnpj", e o form retorna uma planilha datatables com os resultados, até aí está funcionando bem, mas surgiu a solicitação de que ao navegar e editar as linhas da planilha, ela mantenha o estado da planilha até o próximo submt (manter resultados, paginação, etc).

Pesquisando na documentação do datatables, achei essa funcionalidade: stateSave (https://datatables.net/reference/option/stateSave), eu apliquei essa funcionalidade ao código, mas agora ele segura o resultado da primeira pesquisa, e mesmo pesquisando algo novo, ele retorna os dados da primeira, subscreve no mesmo segundo seguinte ao submit, eis o trecho de código que faz a pesquisa e retorna os dados para o dataTables:

<script>
$(document).ready(function() {
var tabela;

function initDataTable() {
var estadoDaTabela = JSON.parse(localStorage.getItem('estadoDaTabela'));
if (estadoDaTabela && estadoDaTabela.pesquisa) {
$('#cotanum').val(estadoDaTabela.pesquisa.cotanum);
$('#cnpj').val(estadoDaTabela.pesquisa.cnpj);

$.ajax({
url: 'buscaItensCotacao.php',
type: 'POST',
data: $('#form-pesquisa').serialize(),
success: function(response) {
$('#resultado-pesquisa').html(response);
if ($.fn.DataTable.isDataTable('#resultado-pesquisa table')) {
tabela.destroy();
}
tabela = $('#resultado-pesquisa table').DataTable({
language: {
url: 'inc/datatables/pt-BR.json'
},
paging: true
});
}
});
} else {
tabela = $('#resultado-pesquisa table').DataTable({
language: {
url: 'inc/datatables/pt-BR.json'
},
paging: true
});
}
}

initDataTable();

$('#form-pesquisa').submit(function(event) {
event.preventDefault();
tabela.state.save();
$.ajax({
url: 'buscaItensCotacao.php',
type: 'POST',
data: $(this).serialize(),
success: function(response) {
$('#resultado-pesquisa').html(response);
if ($.fn.DataTable.isDataTable('#resultado-pesquisa table')) {
tabela.destroy();
}
initDataTable();
}
});
});

tabela.on('draw', function() {
tabela.state.save();
});

tabela.on('search.dt', function() {
tabela.state.save();
});

tabela.on('length.dt', function() {
tabela.state.save();
});

tabela.on('order.dt', function() {
tabela.state.save();
});

tabela.on('page.dt', function() {
tabela.state.save();
});

tabela.on('processing.dt', function() {
tabela.state.save();
});

tabela.on('destroy', function() {
localStorage.removeItem('estadoDaTabela');
});
});
</script>


e também, no console do navegador, retorna o erro conforme a imagem:




  


2. Re: DataTables guardar dados da última consulta

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 07/07/2023 - 17:43h

O erro acontece devido porque o $.ajax() é um método assincrono e logo depois do submit que é sincrono a tabela será provavelmente undefined.
Tem que colocar um await na chamada do método ajax do submit e tá resolvido.
Edit, talvez até nas outras chamadas do ajax seja preciso o await.
Edit 2: tem a opção async no objeto do ajax, entã vc pode colocar async:false pra ter requisição sincrona.

https://nerdki.blogspot.com/ acessa ai, é grátis
Não gostou? O ícone da casinha é serventia do site!


3. Re: DataTables guardar dados da última consulta [RESOLVIDO]

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 07/07/2023 - 17:53h


SamL escreveu:

O erro acontece devido porque o $.ajax() é um método assincrono e logo depois do submit que é sincrono a tabela será provavelmente undefined.
Tem que colocar um await na chamada do método ajax do submit e tá resolvido.
Edit, talvez até nas outras chamadas do ajax seja preciso o await.
Edit 2: tem a opção async no objeto do ajax, entã vc pode colocar async:false pra ter requisição sincrona.

Uma solução mais elgante que vi aqui:
passar o código onde tem os tabela.on(), dentro do callback de sucess das chamadas ajax.

Isso vai lhe garantir com certeza que o objeto tabela já foi inicializado.


https://nerdki.blogspot.com/ acessa ai, é grátis
Não gostou? O ícone da casinha é serventia do site!


4. Re: DataTables guardar dados da última consulta [RESOLVIDO]

Emilio
Emilio Araujo

(usa Debian)

Enviado em 07/07/2023 - 17:56h


SamL escreveu:

O erro acontece devido porque o $.ajax() é um método assincrono e logo depois do submit que é sincrono a tabela será provavelmente undefined.
Tem que colocar um await na chamada do método ajax do submit e tá resolvido.
Edit, talvez até nas outras chamadas do ajax seja preciso o await.
Edit 2: tem a opção async no objeto do ajax, entã vc pode colocar async:false pra ter requisição sincrona.

https://nerdki.blogspot.com/ acessa ai, é grátis
Não gostou? O ícone da casinha é serventia do site!


Eu fiz da seguinte forma:

<script>
$(document).ready(function() {
var tabela;

function initDataTable() {
tabela = $('#resultado-pesquisa table').DataTable({
language: {
url: 'inc/datatables/pt-BR.json'
},
paging: true,
stateSave: true,
stateSaveParams: function(settings, data) {
data.pesquisa = {
cotanum: $('#cotanum').val(),
cnpj: $('#cnpj').val()
};
},
stateLoadCallback: function(settings, callback) {
var estadoDaTabela = JSON.parse(localStorage.getItem('estadoDaTabela'));
if (estadoDaTabela && estadoDaTabela.pesquisa) {
$('#cotanum').val(estadoDaTabela.pesquisa.cotanum);
$('#cnpj').val(estadoDaTabela.pesquisa.cnpj);
}
callback(estadoDaTabela);
}
});
}

initDataTable();

$('#form-pesquisa').submit(async function(event) {
event.preventDefault();
tabela.state.save();
try {
await $.ajax({
url: 'buscaItensCotacao.php',
type: 'POST',
data: $(this).serialize(),
success: function(response) {
if ($.fn.DataTable.isDataTable('#resultado-pesquisa table')) {
tabela.destroy();
}
$('#resultado-pesquisa').html(response);
initDataTable();
}
});
} catch (error) {
console.error(error);
}
});

tabela.on('draw', function() {
tabela.state.save();
});

tabela.on('search.dt', function() {
tabela.state.save();
});

tabela.on('length.dt', function() {
tabela.state.save();
});

tabela.on('order.dt', function() {
tabela.state.save();
});

tabela.on('page.dt', function() {
tabela.state.save();
});

tabela.on('processing.dt', function() {
tabela.state.save();
});

tabela.on('destroy', function() {
localStorage.removeItem('estadoDaTabela');
});
});
</script>


Mas na navegação, a tabela não mantém o estado.



5. Re: DataTables guardar dados da última consulta [RESOLVIDO]

Emilio
Emilio Araujo

(usa Debian)

Enviado em 07/07/2023 - 17:59h


SamL escreveu:


SamL escreveu:

O erro acontece devido porque o $.ajax() é um método assincrono e logo depois do submit que é sincrono a tabela será provavelmente undefined.
Tem que colocar um await na chamada do método ajax do submit e tá resolvido.
Edit, talvez até nas outras chamadas do ajax seja preciso o await.
Edit 2: tem a opção async no objeto do ajax, entã vc pode colocar async:false pra ter requisição sincrona.

Uma solução mais elgante que vi aqui:
passar o código onde tem os tabela.on(), dentro do callback de sucess das chamadas ajax.

Isso vai lhe garantir com certeza que o objeto tabela já foi inicializado.


https://nerdki.blogspot.com/ acessa ai, é grátis
Não gostou? O ícone da casinha é serventia do site!


Eu entendo de banco de dados, e um pouco de php, os resto estou fazendo com ajuda do nosso amigo chatgpt, então não consegui entender bem como implementar esta solução, desculpe minha limitação.



6. Re: DataTables guardar dados da última consulta [RESOLVIDO]

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 07/07/2023 - 18:20h


Emilio Araujo escreveu:


SamL escreveu:


SamL escreveu:

O erro acontece devido porque o $.ajax() é um método assincrono e logo depois do submit que é sincrono a tabela será provavelmente undefined.
Tem que colocar um await na chamada do método ajax do submit e tá resolvido.
Edit, talvez até nas outras chamadas do ajax seja preciso o await.
Edit 2: tem a opção async no objeto do ajax, entã vc pode colocar async:false pra ter requisição sincrona.

Uma solução mais elgante que vi aqui:
passar o código onde tem os tabela.on(), dentro do callback de sucess das chamadas ajax.

Isso vai lhe garantir com certeza que o objeto tabela já foi inicializado.


https://nerdki.blogspot.com/ acessa ai, é grátis
Não gostou? O ícone da casinha é serventia do site!


Eu entendo de banco de dados, e um pouco de php, os resto estou fazendo com ajuda do nosso amigo chatgpt, então não consegui entender bem como implementar esta solução, desculpe minha limitação.

Já eu, entendo nada de banco de dados mas sim de programação somos dois inversos hahaha
É assim:
o await não vai funcionar porque a execução da requisição é interna na chama do $.ajax().
Sendo assim, fua opção pode ser a seguinte:
-pegar todo código que tem o tabela.on() e colocar no final de initDataTable()
Não é colocar dentro do if/else mas sim no escopo da função.

Como tabela é global e vc já fez a lógica certinho, basta apenas garantir que o objeto tabela esteja iniciado.
Ou seja, no caso, vc pode pegar seu código antigo (do primeiro post), copiar tudo que tem o tabela.on() pro final de initDataTable(), e então, é provável que se resolva.

Teste ai, e depois me avise caso funcione ou não.


https://nerdki.blogspot.com/ acessa ai, é grátis
Não gostou? O ícone da casinha é serventia do site!


7. Re: DataTables guardar dados da última consulta [RESOLVIDO]

Emilio
Emilio Araujo

(usa Debian)

Enviado em 12/07/2023 - 08:35h


SamL escreveu:


Emilio Araujo escreveu:


SamL escreveu:


SamL escreveu:

O erro acontece devido porque o $.ajax() é um método assincrono e logo depois do submit que é sincrono a tabela será provavelmente undefined.
Tem que colocar um await na chamada do método ajax do submit e tá resolvido.
Edit, talvez até nas outras chamadas do ajax seja preciso o await.
Edit 2: tem a opção async no objeto do ajax, entã vc pode colocar async:false pra ter requisição sincrona.

Uma solução mais elgante que vi aqui:
passar o código onde tem os tabela.on(), dentro do callback de sucess das chamadas ajax.

Isso vai lhe garantir com certeza que o objeto tabela já foi inicializado.


https://nerdki.blogspot.com/ acessa ai, é grátis
Não gostou? O ícone da casinha é serventia do site!


Eu entendo de banco de dados, e um pouco de php, os resto estou fazendo com ajuda do nosso amigo chatgpt, então não consegui entender bem como implementar esta solução, desculpe minha limitação.

Já eu, entendo nada de banco de dados mas sim de programação somos dois inversos hahaha
É assim:
o await não vai funcionar porque a execução da requisição é interna na chama do $.ajax().
Sendo assim, fua opção pode ser a seguinte:
-pegar todo código que tem o tabela.on() e colocar no final de initDataTable()
Não é colocar dentro do if/else mas sim no escopo da função.

Como tabela é global e vc já fez a lógica certinho, basta apenas garantir que o objeto tabela esteja iniciado.
Ou seja, no caso, vc pode pegar seu código antigo (do primeiro post), copiar tudo que tem o tabela.on() pro final de initDataTable(), e então, é provável que se resolva.

Teste ai, e depois me avise caso funcione ou não.


https://nerdki.blogspot.com/ acessa ai, é grátis
Não gostou? O ícone da casinha é serventia do site!


Olá SamL, obrigado por dedicar tempo a me ajudar, tentei aplicar sua dica, mas a tabela segue igual.




8. Re: DataTables guardar dados da última consulta [RESOLVIDO]

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 12/07/2023 - 10:38h


Emilio Araujo escreveu:

Olá SamL, obrigado por dedicar tempo a me ajudar, tentei aplicar sua dica, mas a tabela segue igual.

Vendo o código com mais paciência, realmente não ia funcionar por conta da chamada assincrona da requisição dentro do initDataTable().

Mas experimenta esse novo código:
Fiz ele com calma e creio que dessa vez se resolva seu problema.
Avise depois se funcionou ou não porque não tenho como testar tal código.
Verifique o console e se aparecer a mensagem "Tabela eh indefinida", é porque não funcionou.
<script>
$(document).ready(function() {
var tabela = undefined;

function initEvents() {
if (!tabela) {
console.error("Tabela eh indefinida");
return;
}

tabela.on('draw', function() {
tabela.state.save();
});

tabela.on('search.dt', function() {
tabela.state.save();
});

tabela.on('length.dt', function() {
tabela.state.save();
});

tabela.on('order.dt', function() {
tabela.state.save();
});

tabela.on('page.dt', function() {
tabela.state.save();
});

tabela.on('processing.dt', function() {
tabela.state.save();
});

tabela.on('destroy', function() {
localStorage.removeItem('estadoDaTabela');
});
}

function initDataTable() {
var estadoDaTabela = JSON.parse(localStorage.getItem('estadoDaTabela'));
if (estadoDaTabela && estadoDaTabela.pesquisa) {
$('#cotanum').val(estadoDaTabela.pesquisa.cotanum);
$('#cnpj').val(estadoDaTabela.pesquisa.cnpj);

$.ajax({
url: 'buscaItensCotacao.php',
type: 'POST',
data: $('#form-pesquisa').serialize(),
success: function(response) {
$('#resultado-pesquisa').html(response);
if ($.fn.DataTable.isDataTable('#resultado-pesquisa table')) {
tabela.destroy();
}
tabela = $('#resultado-pesquisa table').DataTable({
language: {
url: 'inc/datatables/pt-BR.json'
},
paging: true
});

//inicializa os eventos
initEvents();
}
});
} else {
tabela = $('#resultado-pesquisa table').DataTable({
language: {
url: 'inc/datatables/pt-BR.json'
},
paging: true
});

//inicializa os eventos
initEvents();
}
}

initDataTable();

$('#form-pesquisa').submit(function(event) {
event.preventDefault();
tabela.state.save();
$.ajax({
url: 'buscaItensCotacao.php',
type: 'POST',
data: $(this).serialize(),
success: function(response) {
$('#resultado-pesquisa').html(response);
if ($.fn.DataTable.isDataTable('#resultado-pesquisa table')) {
tabela.destroy();
}
initDataTable();
}
});
});


});
</script>



https://nerdki.blogspot.com/ acessa ai, é grátis
Não gostou? O ícone da casinha é serventia do site!


9. Re: DataTables guardar dados da última consulta [RESOLVIDO]

Emilio
Emilio Araujo

(usa Debian)

Enviado em 12/07/2023 - 10:49h


SamL escreveu:


Emilio Araujo escreveu:

Olá SamL, obrigado por dedicar tempo a me ajudar, tentei aplicar sua dica, mas a tabela segue igual.

Vendo o código com mais paciência, realmente não ia funcionar por conta da chamada assincrona da requisição dentro do initDataTable().

Mas experimenta esse novo código:
Fiz ele com calma e creio que dessa vez se resolva seu problema.
Avise depois se funcionou ou não porque não tenho como testar tal código.
Verifique o console e se aparecer a mensagem "Tabela eh indefinida", é porque não funcionou.
<script>
$(document).ready(function() {
var tabela = undefined;

function initEvents() {
if (!tabela) {
console.error("Tabela eh indefinida");
return;
}

tabela.on('draw', function() {
tabela.state.save();
});

tabela.on('search.dt', function() {
tabela.state.save();
});

tabela.on('length.dt', function() {
tabela.state.save();
});

tabela.on('order.dt', function() {
tabela.state.save();
});

tabela.on('page.dt', function() {
tabela.state.save();
});

tabela.on('processing.dt', function() {
tabela.state.save();
});

tabela.on('destroy', function() {
localStorage.removeItem('estadoDaTabela');
});
}

function initDataTable() {
var estadoDaTabela = JSON.parse(localStorage.getItem('estadoDaTabela'));
if (estadoDaTabela && estadoDaTabela.pesquisa) {
$('#cotanum').val(estadoDaTabela.pesquisa.cotanum);
$('#cnpj').val(estadoDaTabela.pesquisa.cnpj);

$.ajax({
url: 'buscaItensCotacao.php',
type: 'POST',
data: $('#form-pesquisa').serialize(),
success: function(response) {
$('#resultado-pesquisa').html(response);
if ($.fn.DataTable.isDataTable('#resultado-pesquisa table')) {
tabela.destroy();
}
tabela = $('#resultado-pesquisa table').DataTable({
language: {
url: 'inc/datatables/pt-BR.json'
},
paging: true
});

//inicializa os eventos
initEvents();
}
});
} else {
tabela = $('#resultado-pesquisa table').DataTable({
language: {
url: 'inc/datatables/pt-BR.json'
},
paging: true
});

//inicializa os eventos
initEvents();
}
}

initDataTable();

$('#form-pesquisa').submit(function(event) {
event.preventDefault();
tabela.state.save();
$.ajax({
url: 'buscaItensCotacao.php',
type: 'POST',
data: $(this).serialize(),
success: function(response) {
$('#resultado-pesquisa').html(response);
if ($.fn.DataTable.isDataTable('#resultado-pesquisa table')) {
tabela.destroy();
}
initDataTable();
}
});
});


});
</script>



https://nerdki.blogspot.com/ acessa ai, é grátis
Não gostou? O ícone da casinha é serventia do site!


Sem novidades, segue igual, mantendo a primeira consulta. :(


10. Re: DataTables guardar dados da última consulta [RESOLVIDO]

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 12/07/2023 - 11:20h


Emilio Araujo escreveu:

Sem novidades, segue igual, mantendo a primeira consulta. :(

Mas parou o erro anterior? Aquele primeiro erro da sua imagem do primeiro post.
Agora só mantem a primeira consulta?


https://nerdki.blogspot.com/ acessa ai, é grátis
Não gostou? O ícone da casinha é serventia do site!


11. Re: DataTables guardar dados da última consulta [RESOLVIDO]

Emilio
Emilio Araujo

(usa Debian)

Enviado em 12/07/2023 - 11:31h


SamL escreveu:


Emilio Araujo escreveu:

Sem novidades, segue igual, mantendo a primeira consulta. :(

Mas parou o erro anterior? Aquele primeiro erro da sua imagem do primeiro post.
Agora só mantem a primeira consulta?


https://nerdki.blogspot.com/ acessa ai, é grátis
Não gostou? O ícone da casinha é serventia do site!


Só aparecem os dados da primeira consulta, sem erros ao retornar dados ou montar a tabela.




12. Re: DataTables guardar dados da última consulta [RESOLVIDO]

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 12/07/2023 - 11:47h


Emilio Araujo escreveu:


SamL escreveu:


Emilio Araujo escreveu:

Sem novidades, segue igual, mantendo a primeira consulta. :(

Mas parou o erro anterior? Aquele primeiro erro da sua imagem do primeiro post.
Agora só mantem a primeira consulta?


https://nerdki.blogspot.com/ acessa ai, é grátis
Não gostou? O ícone da casinha é serventia do site!


Só aparecem os dados da primeira consulta, sem erros ao retornar dados ou montar a tabela.

Certo, então tá montando direitinho.
Agora me fala:
-qual é a versão do jquery que vc tá usando?
Preciso saber disso pra ver o que fazer agora.
Tem umas versões que tem bug ao salvar o state do data table, e isso pode ser o problema que estamos enfrentando aqui.

Depois diz ai que já eu volto aqui.



https://nerdki.blogspot.com/ acessa ai, é grátis
Não gostou? O ícone da casinha é serventia do site!



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts