Jump to content
Sign in to follow this  
wneo

UPDATE reorganizando ordem numérica, como fazer?

Recommended Posts

Olá!!!

Pessoal preciso fazer com q o update reorganize uma ordem numérica.

- Imaginem que possuo vários registros em uma tabela, e o que define sua ordem de exibição é uma coluna chamada 'ordem'.

- Quando vou exibir, faço o select com o 'order by ordem'. Até aí tudo ok.

- Mas agora, na tela de gestão que criei, preciso oferecer a possibilidade de atualizar essa ordem.

- Então imaginem que tenho 10 registros. Dessa forma a coluna ordem estará 1,2,3,4,5,6,7,8,9,10.

- Agora se o usuário escolher que que o registro 2 deve ser o 1 a ser exibido. então ele fará o update no 2 para 1.

- Então nesse momento teremos dois registros com numero 1. A 'ordem' ficaria 1,1,3,4,5,6,7,8,9,10. Eis o problema...

- Como posso fazer para que o update ocorra de forma progressiva, atualizando a coluna 'ordem' sequencialmente, reorganizando os numeros da forma certa e não duplicá-los, fazendo com q aquele q era 1 virar 2 e assim por diante?

- E se eu precisasse inserir um novo registro nessa situação.. como ficaria o insert?

Share this post


Link to post
Share on other sites

Você envia todos os dados novamente para update? Ou apenas quele que mudou de ordem?

Share this post


Link to post
Share on other sites

Envio somente aquele que mudou de ordem.

- Por exemplo, digamos q a tabela tem as colunas 'produto','categoria,'ordem'.

- Se quero que o 'Produto1' fique na 'ordem3', faço update nele... mas nesse caso, para corrigir meu caso, precisaria ser feito uma operação em todos os registros com base na coluna 'ordem'...

Edited by Gabriel Heming
Remover quote desnecessário

Share this post


Link to post
Share on other sites

Envie todos já com a nova ordem. Vai te facilitar muito o trabalho.

Share this post


Link to post
Share on other sites

A ideia é boa, poderia ser algo com jquery...

imagino q atraves de campos form option, atualizando onchange...

como poderia ser isso em js, tem noção?

Edited by Gabriel Heming
remover quote desnecessário

Share this post


Link to post
Share on other sites

Isso vai depender de como você realiza a edição da ordem.

Share this post


Link to post
Share on other sites

Imaginei em carregar todos da coluna ordem em form select, cada registro em seu select. De 1 a 10 por exemplo.

Então quando quando mudar '.change()' o que tá em 2 pra 3, todos mudarem sua ordem automatica. E quando salvar, realizar o update em todos já ordenados.

Saberia fazer isso em jquery?

...ou pensa em alguma outra forma, diz aí..?

Edited by Gabriel Heming
Remover quote desnecessário

Share this post


Link to post
Share on other sites

O digitar a ordem é muito subjetivo, faça algo para mover as linhas.

Pronto tem este: https://jqueryui.com/sortable/

Ou construa algo próprio somente com javascript.

Share this post


Link to post
Share on other sites

O digitar a ordem é muito subjetivo, faça algo para mover as linhas.

Pronto tem este: https://jqueryui.com/sortable/

Ou construa algo próprio somente com javascript.

Oi,

gostei desse:

<ul id="sortable">
<li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 1</li>
<li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 2</li>
<li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 3</li>
<li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 4</li>
<li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 5</li>
<li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 6</li>
<li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 7</li>
</ul>

Mas como poderia fazer para que o fosse registrado no banco de dados a posição que escolhi..?

por exemplo, arrastei o item1 pra segunda posição, então clico em salvar..

Share this post


Link to post
Share on other sites

Coloque dentro de um formulário com input hidden e utilize os inputs como array, conforme o exemplo no link abaixo:

http://forum.imasters.com.br/topic/462549-resolvidoretornar-array-de-inputs-com-mesmo-nome/?p=1832412

O PHP receberá conforme a ordem que você definiu.

Share this post


Link to post
Share on other sites

Coloque dentro de um formulário com input hidden e utilize os inputs como array, conforme o exemplo no link abaixo:

http://forum.imasters.com.br/topic/462549-resolvidoretornar-array-de-inputs-com-mesmo-nome/?p=1832412

O PHP receberá conforme a ordem que você definiu.

To tentando montar:

<meta charset="utf-8">
<?php  
require("oraculo/conecta/conecta.php");
//require "../oraculo/sessions/session.php";

require "oraculo/sql/sql_global.php";
?>	

<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>jQuery UI Sortable - Default functionality</title>
  <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
  <link rel="stylesheet" href="/resources/demos/style.css">
  <style>
  #sortable { list-style-type: none; margin: 0; padding: 0; width: 60%; }
  #sortable li { margin: 0 3px 3px 3px; padding: 0.4em; padding-left: 1.5em; font-size: 1.4em; height: 18px; }
  #sortable li span { position: absolute; ; }
  </style>
  <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
  <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
  <script>
  $( function() {
    $( "#sortable" ).sortable();
    $( "#sortable" ).disableSelection();
  } );
  </script>
</head>
<body>
 
<ul id="sortable">

<?php	
	while($row = mysql_fetch_array($rs_ordenador)){
	$id = $row['id'];
	$titulo = $row['titulo']; 
	$ordem = $row['ordem'];
?>
  <li class="ui-state-default"> 
  <form>
  <input type="hidden" name="ordem[]" value="<?php echo $ordem; ?>"> 
  </form>
  <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
  <?php echo $titulo; ?>
  </li>
 
<?php
}//end while
?>  
<button type="submit">Salvar</button>
</ul>
 
 
</body>
</html>

To no caminho certo?

caso sim..agora preciso fazer o script de update... ajuda?

Share this post


Link to post
Share on other sites

Uma vez eu fiz assim, mas faz tempo

Criei o atributo date-id que é id auto-increment

<tr data-id="9"></tr>

<tr data-id="10"></tr>

<tr data-id="11"></tr>

Conforme atualiza as posições pego sequencia conforme arvore DOM.

 $(this.elemento_nome)[i].getAttribute('data-id')

Depois envio as posições separado por virgula que são as IDs, já no php dou explode na virgula, criando o array, depois percorro com foreach e uso o indice "$key" para gerar as novas posições de 0 a *, na coluna order sempre vai ser default 0, fiz isso para ordenar imagem de produto.

Exemplos tem de KG na internet, o esquema ae é só o php mesmo, que é usar a ID e o indice do array que se inicia com a posição zero.

Share this post


Link to post
Share on other sites

Uma vez eu fiz assim, mas faz tempo

Criei o atributo date-id que é id auto-increment

<tr data-id="9"></tr>

<tr data-id="10"></tr>

<tr data-id="11"></tr>

Conforme atualiza as posições pego sequencia conforme arvore DOM.

 $(this.elemento_nome)[i].getAttribute('data-id')

Depois envio as posições separado por virgula que são as IDs, já no php dou explode na virgula, criando o array, depois percorro com foreach e uso o indice "$key" para gerar as novas posições de 0 a *, na coluna order sempre vai ser default 0, fiz isso para ordenar imagem de produto.

Exemplos tem de KG na internet, o esquema ae é só o php mesmo, que é usar a ID e o indice do array que se inicia com a posição zero.

Gostei da ideia.. mas ainda fiquei perdido...

Share this post


Link to post
Share on other sites

Imagino uma forma de fazer que seria mais simples, assim:

- Atualmente o Produto x está na posição 7, e decido q ele deve ficar na 3.

- Então o update deveria ocorrer incrementando +1 naquele que era antigamente o 3 até o 6.

vou tentar iniciar o codigo:

<?php

require "conecta.php";

$id_produto_escolhido = $_POST['id'];
$ordem_escolhida = $_POST['ordem'];//essa é a ordem q o usuario escolheu para determinado produto

$up_escolhido = "UPDATE produtos SET ordem = '$ordem_escolhida' WHERE id = '$id_escolhido'";
$rs_escolhido = mysql_query($up_escolhido);

$seleciona_ordem_igual = "SELECT * FROM tabela WHERE ordem='$ordem_escolhida'";
$rs_ordem_igual = mysql_query($seleciona_ordem_igual );

	
	while($row = mysql_fetch_array($rs_ordem_igual)){
	$ordem = $row['ordem'];
        }


###########Agora nessa parte teria que fazer um update com +1,
###########começando por aquele que tem a ordem igual a escolhida até o produto($id_produto_escolhido) 
###########que foi selecionado para mudar de posição. Imagino que seja necessário um for aqui para isso,
###########peço ajuda aí..  




?>

Share this post


Link to post
Share on other sites

...Enquanto isso, olha como to tentando:

- adicionei 3 registros no banco e estou exibindo assim:

<meta charset="utf-8">
<?php  
require("oraculo/conecta/conecta.php");
//require "../oraculo/sessions/session.php";

require "oraculo/sql/sql_global.php";
?>	

<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Ordenar</title>
  <link rel="stylesheet" href="css/global.css">
 
  
</head>
<body>
 

<?php	
	while($row = mysql_fetch_array($rs_ordenador)){
	$id = $row['id'];
	$titulo = $row['titulo']; 
	$ordem = $row['ordem'];
?>
<li>
<?php echo $titulo; ?>
<form method="post" action="oraculo/form-operation/update/up-ordem.php">
<label></label>
<select name="ordem">
<option value="<?php echo $ordem; ?>" ><?php echo $ordem; ?></option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
<button>Salvar</button>
<input type="hidden" name="id" value="<?php echo $id; ?>">
</form> 
</li> 
<?php
}//end while
?>  
 
</body>
</html> 

- E o update estou fazendo assim:

<meta charset="utf-8">
<?php

require "../../conecta/conecta.php";

$id = $_POST['id'];
$ordem_escolhida = $_POST['ordem'];


$up_igual = "UPDATE ordenador SET ordem = ordem+1 WHERE id != '$id'";
$rs_igual = mysql_query($up_igual);	


$up_escolhido = "UPDATE ordenador SET ordem = '$ordem_escolhida' WHERE id = '$id'";
$rs_escolhido = mysql_query($up_escolhido);	

header("location:../../../index.php");


?> 

- Quando mudo o 3 pra 1, tudo certo, mas quando mudo de 2 pra 1, acaba ficando 1,2,4... =/

e agora...??? como resolver...

Share this post


Link to post
Share on other sites

- Quando mudo o 3 pra 1, tudo certo, mas quando mudo de 2 pra 1, acaba ficando 1,2,4... =/

e agora...??? como resolver...

Fazendo da forma correta e evitando Gambiarras, assista o vídeo que passei.

Share this post


Link to post
Share on other sites

Fazendo da forma correta e evitando Gambiarras, assista o vídeo que passei.

hshs.. sim, quero fazer da forma certa sem gambiarra... estou pensando no código pra isso..

vou assistir...

Share this post


Link to post
Share on other sites

assisti o video, mas ainda não me resolveu...

com esse codigo tá quase.. se alguem conseguir complementar me avisa aí:

<meta charset="utf-8">
<?php

require "../../conecta/conecta.php";

$id = $_POST['id'];
$ordem_escolhida = $_POST['ordem'];


$up_igual = "UPDATE ordenador SET ordem = ordem+1 WHERE id != '$id'";
$rs_igual = mysql_query($up_igual);	


$up_escolhido = "UPDATE ordenador SET ordem = '$ordem_escolhida' WHERE id = '$id'";
$rs_escolhido = mysql_query($up_escolhido);	

header("location:../../../index.php");


?>

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Similar Content

    • By RX3Info
      Boa Tarde!
      Pessoal,
      Estou precisando realizar um cálculo dentro de uma select, mas não estou conseguindo, segue abaixo a select sem as operações e um exemplo (que não funcionou) logo abaixo:
       
      Este código está funcionando:
      select A.CODPRODUTO, A.LOTE, A.QTD, A.`LOCAL`, A.OT, A.ALTUSU, A.ALTMOM, B.CODPRODUTO, B.DESCRICAO, B.CUSTO, C.ICMS_VALOR, C.IPI_VALOR, C.COFINS_VALOR, C.QTD from proqtd as A inner join produto as B on a.CODPRODUTO = B.CODPRODUTO inner join nfeprodu as C on B.CODPRODUTO = C.PRODUTO  
      Este não funciona e da erro devido ao cálculo.
      select A.CODPRODUTO, A.LOTE, A.QTD, A.`LOCAL`, A.OT, A.ALTUSU, A.ALTMOM, B.CODPRODUTO, B.DESCRICAO, (B.CUSTO, - C.ICMS_VALOR, - C.IPI_VALOR, - C.COFINS_VALOR, / C.QTD) as CustoSemImpostos from proqtd as A inner join produto as B on a.CODPRODUTO = B.CODPRODUTO inner join nfeprodu as C on B.CODPRODUTO = C.PRODUTO  
      O que eu preciso é o seguinte, que me traga os itens com os valores sem os impostos, veja acima que a tentativa está sendo de pegar o valor de custo de um item, subtrair os impostos e dividir pela quantidade em estoque, desta forma, tenho o valor da unidade de cada item sem os impostos, mas não estou conseguindo.
       
      Se alguém puder me ajudar com um exemplo, ficarei muito agradecido.
      Obrigado!
       
    • By k9studio
      Olá Amigos,
      tenho essa tabela abaixo e estou apanhando para listar os dados e fazer validação,
      alguém pode ajudar como chamar os dados e validar mostrar o nome somente se estiver visible=on  

       
      CREATE TABLE `system` (   `namesystem` text COLLATE utf8_unicode_ci NOT NULL,   `setting` text COLLATE utf8_unicode_ci NOT NULL,   `value` text COLLATE utf8_unicode_ci NOT NULL,   `order` int(1) NOT NULL,   KEY `namesystem_setting` (`namesystem`(32),`setting`(32)),   KEY `setting_value` (`setting`(32),`value`(32)) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; como os dados estão na tabela:
       
      namesystem setting   value   order (honda)    (name)   (Honda)   1 (honda)    (xtts)   (ok)      0    (honda)   (visible)  (on)      0    (toyota)    (name)   (Toyota)  2 (toyota)    (xtts)   (ok)      0    (toyota)  (visible)  (on)      0    
    • By iguulima
      É possivel realizar uma consulta SQL em duas colunas da mesma tabela usando outra função que não seja o AND ou OR? Segue o meu Select ate agora:
       
      (SELECT * FROM product WHERE comid = $idcom AND status = 'Ativo' AND categ = $category AND nameprod like'%$search%'  ORDER BY id DESC)  
      Por exemplo se eu colocar um AND após buscar o nameprod, no nome do produto não tiver a palavra chave ele também não irá buscar. Ou se colocar um OR ele anulo as outras condições até onde eu sei.
      Iniciante em programação.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.