Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

alissong

Update com Foreach

Recommended Posts

Pessoal, 

 

Estou criando um formulário que atualizar os valores de custo e venda do produto conforme o critério de busca do usuário.

Veja o formulário de busca:

<?php
#Arquivo de funções *************************************
 require_once("verifica.php");
 include_once("conexao/bdinc.php");

#********************************************************

if ($_SERVER['REQUEST_METHOD'] == 'GET') {
	$ajuste_preco = $_GET['percentual'];
	$criterio = $_GET['criterio'];
    $busca = $_GET['busca'];
	
 }
 
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Relatorio de Fornecedores</title>
<script type="text/javascript">
function mudar(x,y){

x.style.backgroundColor=y;
}
//-->
</script>
</head>
<body>
<table  width="100%" cellspacing="1" cellpadding="0" bgcolor="#000000">
<tr>
<td  width="100%" bgcolor="#E1E1E1">
   <form name="con_ajuste_preco_produto" method="post" action="cad_ajuste_preco_venda.php">
   <table border="1" width="100%" cellpadding="0" class="tabela">
     <br> 
     <tr align="center" class="cabecalho">
        <td width = "5%"><label><b>Selecao</b></label></td>
		<td width = "8%"><label><b>Cod. Produto</b></label></td>
        <td width = "30%"><label><b>Nome Produto</b></label></td>
        <td width = "8%"><label><b>Pre&ccedil;o Custo</b></label></td>
        <td width = "8%"><label><b>Margem Segura&ccedil;a</b></label></td>
		<td width = "8%"><label><b>Pre&ccedil;o Venda</b></label></td>
		<td width = "15%"><label><b>Pre&ccedil;o Custo Ajustado</b></label></td>
		<td width = "15%"><label><b>Pre&ccedil;o Venda Ajustado</b></label></td>
        <td width = "5%"><label><b>Data Inclus&atilde;o</b></label></td>
     </tr>
<?php

// Pegar o criterio para o SQL da consulta
$sql1 = "SELECT cod_produto,descricao,preco_custo,lucratividade,preco_venda,date_format(data_inclusao, '%d/%m/%Y')
FROM produto
WHERE cod_produto LIKE '".$busca."'
ORDER BY data_inclusao DESC,cod_produto,descricao";

$sql2 = "SELECT cod_produto,descricao,preco_custo,lucratividade,preco_venda,date_format(data_inclusao, '%d/%m/%Y')
FROM produto
WHERE descricao LIKE '".$busca."%'
ORDER BY data_inclusao DESC,cod_produto,descricao";

$sql3 = "SELECT cod_produto,descricao,preco_custo,lucratividade,preco_venda,date_format(data_inclusao, '%d/%m/%Y')
FROM produto
ORDER BY cod_produto,descricao";

// Seleciona no banco de dados com o LIMIT indicado pelos números acima
switch ($criterio) {
    case 1:
		$criterio = $sql1;
        break;
    case 2:
		$criterio = $sql2;
        break;
    case 3:
		$criterio = $sql3;       
        break;
        default;
                $criterio = $sql3;  
        break;

}
$res = mysqli_query($con,$criterio);
$Cor = "";

//VERIFICA A QUANTIDADE DE REGISTROS RETORNADOS
$registros = mysqli_num_rows($res);

if($registros > 0){
$valor = $ajuste_preco;

while ($linha = mysqli_fetch_array($res)){
if ($Cor == "#FFFFFF") $Cor = "#ECF2F8"; else $Cor = "#FFFFFF";
$preco_custo_ajustado = $linha[2] * (1 + ($valor/100));  
$preco_venda_ajustado = $preco_custo_ajustado * (1 + ($linha[3]/100));  
echo " <tr bgcolor='" . $Cor . "' onmouseover=\"mudar(this,'#FFE2CC');\" onmouseout=\"mudar(this,'" . $Cor . "');\">";
echo " <td class='tabela'><input type='checkbox' name='produto[]' value='$linha[0]' checked ='true'></td>";
echo " <td class='tabela'>$linha[0]</td>";
echo " <td style='text-align:left' class='tabela'>$linha[1]</td>";
echo " <td style='text-align:right;color:red' class='tabela'>$linha[2]</td>";
echo " <td align ='right' class='tabela'>$linha[3]</td>";
echo " <td style='text-align:right;color:blue' class='tabela'>$linha[4]</td>";
echo " <td style='text-align:right;color:red' class='tabela'><input type='text' name='produto[]' readonly='true' value=".number_format($preco_custo_ajustado, 2, ',', '.')."></td>";
echo " <td style='text-align:right;color:blue' class='tabela'><input type='text' name='produto[]' readonly='true' value=".number_format($preco_venda_ajustado, 2, ',', '.')."></td>";
echo " <td style='text-align:right' class='tabela'>$linha[5]</td>";

echo "</tr>"; 
}//fecha if while
}//fecha if
else {
echo "<b>N&atilde;o existe(em) entrada(s) para o crit&eacute;rio de busca !<b>";

}//fecha else
?>
<tr>
<td><input type="submit" value="Atualizar" class="botao"></td>
</tr>
</table>
</td>
</tr>
<?php
mysqli_close($con);
?>
 
</table>
    <p align=right><font face=Arial size=1><a href="index.php" title="Retornar"><< Retornar</a></p>
</form>
</body>
</html>

Agora veja o código que estou fazendo para atualizar os valores:

 

<?php 
# Função para conectar o banco de dados
    include("verifica.php");
    include("conexao/bdinc.php");
# Fim da conexão

?>
<!DOCTYPE html>
<HTML>
<html lang="pt-br">
<HEAD>
 <TITLE>FORMUL&Aacute;RIO DE AN&Aacute;LISE CONT&Aacute;BIL</TITLE>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1"> 
</HEAD>
<BODY>
<?php 
 $produtos  = isset($_POST['produto']) ? $_POST['produto'] : '';
 $valores[]  = array_chunk($produtos, 3, true); 

  	
// verifica se a PERMISSÃO ja está cadastrada...
     
     foreach ($valores as $id => $produto) {		
		
		$cod_prod              = intval($produto[0][0]);      
		$preco_custo_ajustado  = str_replace(",",".",$produto[0][1]);
        $preco_venda_ajustado  = str_replace(",",".",$produto[0][2]); 
	
	 
// INICIO - SQL DO FORMULÁRIO
   $up_produto = ("UPDATE produto SET preco_custo = '$preco_custo_ajustado', preco_venda = '$preco_venda_ajustado' WHERE cod_produto = $cod_prod");
	
// FIM - SQL DO FORMULÁRIO

// INICIO - EXECUÇÃO DO COMANDO SQL  e APAGANDO A SESSION
	if (!mysqli_query($con,$up_produto))
  {
  die('Error: ' . mysqli_error($con));
  }    
// FIM - EXECUÇÃO DO COMANDO SQL 
}// Fecha o if foreach 

	echo "<script language=JavaScript> window.alert('O produto foi alterado com sucesso !'); </script>";
    echo "<script>window.location = 'movimentos.php?mov=ajuste_preco_produto'</script>"; 

?> 
</BODY>
</HTML>

Agora veja como esta saindo o array:

Array
(
    [0] => Array
        (
            [0] => 5450
            [1] => 24,48
            [2] => 36,71
        )

    [1] => Array
        (
            [3] => 5451
            [4] => 26,93
            [5] => 40,40
        )

    [2] => Array
        (
            [6] => 1824
            [7] => 7,13
            [8] => 10,69
        )

    [3] => Array
        (
            [9] => 1828
            [10] => 14,57
            [11] => 21,86
        )

    [4] => Array
        (
            [12] => 1829
            [13] => 16,30
            [14] => 24,44
        )

    [5] => Array
        (
            [15] => 1830
            [16] => 15,50
            [17] => 23,25
        )

    [6] => Array
        (
            [18] => 1831
            [19] => 15,99
            [20] => 23,99
        )

    [7] => Array
        (
            [21] => 1835
            [22] => 16,40
            [23] => 24,60
        )

    [8] => Array
        (
            [24] => 1838
            [25] => 6,96
            [26] => 10,44
        )

    [9] => Array
        (
            [27] => 1855
            [28] => 9,65
            [29] => 14,47
        )

    [10] => Array
        (
            [30] => 2319
            [31] => 13,23
            [32] => 19,85
        )

    [11] => Array
        (
            [33] => 3335
            [34] => 4,56
            [35] => 6,84
        )

    [12] => Array
        (
            [36] => 3577
            [37] => 22,50
            [38] => 33,75
        )

    [13] => Array
        (
            [39] => 4275
            [40] => 7,25
            [41] => 10,87
        )

)

Mas quando clico em atualizar somente grava no banco de dados o primeiro dado:

(
            [0] => 5450
            [1] => 24,48
            [2] => 36,71
        )

Alguém sabe me informar como fazer para percorrer todas as linhas no foreach?

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.

 

Temos uma matriz, os dados estão todos na posição 0 da variável e o laço de repetição está executando nesse indice, por isso ele vai executar apenas uma vez.

Array
(
    [0] => Array

Veja, tem um array de arrays (matriz), o foreach só vai funcionar no primeiro nível dessa matriz, portanto só vai executar uma vez, para acessar a primeiro indice, que é onde tem o segundo nivel da matriz, ou o array interno, que é o que precisamos acessar.

 

Os índices internos do array estão sequenciais, devido ao uso da função array_chunk, eles vão do 0 ao 40, nesse caso, temos duas opções:

  1. Fazer um contador para acessar os índices (mais difícil e menos performático)
  2.  Resetar os indices toda vez dentro do laço de repetição (mais fácil e mais performático)

 

Por esses motivos que está atualizando somente o primeiro dado.

 

Os problemas estão aqui:

foreach ($valores as $id => $produto) {		
		
		$cod_prod              = intval($produto[0][0]);      
		$preco_custo_ajustado  = str_replace(",",".",$produto[0][1]);
        $preco_venda_ajustado  = str_replace(",",".",$produto[0][2]); 

Segue como deve ficar:

//Acessa o primeiro indice da matriz para pegar o array com todos os dados
$valores = $valores[0];

foreach ($valores as $id => $produto) {
//Reseta os indices do array $produto, para que as informações sempre fiquem nos indices sequenciais corretos
        $produto = array_values($produto);
		
	$cod_prod = intval($produto[0]);      
	$preco_custo_ajustado  = str_replace(",",".",$produto[1]);
        $preco_venda_ajustado  = str_replace(",",".",$produto[2]); 

 

Espero ter ajudado!

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

hyvOK,

 

Você é o cara! Muito obrigado pela ajuda.

Agora segue o código para ajudar alguém um dia?

<?php 
# Função para conectar o banco de dados
    include("verifica.php");
    include("conexao/bdinc.php");
# Fim da conexão

?>
<!DOCTYPE html>
<HTML>
<html lang="pt-br">
<HEAD>
 <TITLE>FORMUL&Aacute;RIO DE AN&Aacute;LISE CONT&Aacute;BIL</TITLE>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1"> 
</HEAD>
<BODY>
<?php 
// Acessa os produtos selecionado na Checkbox ...
 $produtos  = isset($_POST['produto']) ? $_POST['produto'] : '';
 $valores[]  = array_chunk($produtos, 3, true); 
     
//Acessa o primeiro indice da matriz para pegar o array com todos os dados
 $valores = $valores[0];

// Faz o loop para update no banco de dados 
     foreach ($valores as $id => $produto) {		
//Reseta os indices do array $produto, para que as informações sempre fiquem nos indices sequenciais corretos
       	$produto = array_values($produto);
	    $cod_prod              = intval($produto[0]);      
		$preco_custo_ajustado  = str_replace(",",".",$produto[1]);
        $preco_venda_ajustado  = str_replace(",",".",$produto[2]);  
		
	
/*	echo '<pre>';
		print_r($cod_prod);
		print_r($preco_custo_ajustado);
		print_r($preco_venda_ajustado);		
		echo '</pre>';
	 }
	 */
	 
 
// INICIO - SQL DO FORMULÁRIO
   $up_produto = ("UPDATE produto SET preco_custo = $preco_custo_ajustado, preco_venda = $preco_venda_ajustado WHERE cod_produto = $cod_prod");
	
// FIM - SQL DO FORMULÁRIO

// INICIO - EXECUÇÃO DO COMANDO SQL  PARA UPDATE NO BANCO

	if (!mysqli_query($con,$up_produto))
		{
			die('Error: ' . mysqli_error($con));
		}      
  
// FIM - EXECUÇÃO DO COMANDO SQL 

}// Fecha o if foreach 

	echo "<script language=JavaScript> window.alert('O produto foi alterado com sucesso !'); </script>";
    echo "<script>window.location = 'movimentos.php?mov=ajuste_preco_produto'</script>"; 
	
?> 
</BODY>
</HTML>

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por violin101
      Caros amigos do grupo, saudações e um feliz 2025.
       
      Estou com uma pequena dúvida referente a Teclas de Atalho.

      Quando o Caps Lock está ativado o Comando da Tecla de Atalho não funciona.
      ou seja:
      se estiver para letra minúscula ====> funciona
      se estiver para letra maiúscula ====> não funciona
       
      Como consigo evitar essa falha, tanto para Letra Maiúscula quanto Minúscula ?

      o Código está assim:
      document.addEventListener( 'keydown', evt => { if (!evt.ctrlKey || evt.key !== 'r' ) return;// Não é Ctrl+r, portanto interrompemos o script evt.preventDefault(); });  
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Por favor, poderiam me ajudar.

      Estou com a seguinte dúvida:
      --> como faço para para implementar o input código do produto, para quando o usuário digitar o ID o sistema espera de 1s a 2s, sem ter que pressionar a tecla ENTER.

      exemplo:
      código   ----   descrição
           1       -----   produto_A
       
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Humildemente peço desculpa por postar uma dúvida que tenho.

      Preciso salvar no MySql, os seguinte Registro:

      1 - Principal
      ====> minha dúvida começa aqui
      ==========> como faço para o Sistema Contar Automaticamente o que estiver despois do 1.____?
      1.01 - Matriz
      1.01.0001 - Estoque
      1.01.0002 - Oficina
      etc

      2 - Secundário
      2.01 - Loja_1
      2.01.0001 - Caixa
      2.01.0002 - Recepção
      etc
       
      Resumindo seria como se fosse um Cadastro de PLANO de CONTAS CONTÁBEIL.

      Grato,


      Cesar









       
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a orientação dos amigos.

      Preciso fazer um Relatório onde o usuário pode Gerar uma Lista com prazo para vencimento de: 15 / 20/ 30 dias da data atual.

      Tem como montar uma SQL para o sistema fazer uma busca no MySql por período ou dias próximo ao vencimento ?

      Tentei fazer assim, mas o SQL me traz tudo:
      $query = "SELECT faturamento.*, DATE_ADD(faturamento.dataVencimento, INTERVAL 30 DAY), fornecedor.* FROM faturamento INNER JOIN fornecedor ON fornecedor.idfornecedor = faturamento.id_fornecedor WHERE faturamento.statusFatur = 1 ORDER BY faturamento.idFaturamento $ordenar ";  
      Grato,
       
      Cesar
       
       
       
       
    • Por violin101
      Caros amigos, saudações
       
      Por favor, me perdoa em recorrer a orientação dos amigos, tenho uma dúvida.
       
      Gostaria de uma rotina onde o Sistema possa acusar para o usuário antes dos 30 dias, grifar na Tabela o aviso de vencimento próximo, por exemplo:
       
      Data Atual: 15/11/2024
                                           Vencimento
      Fornecedor.....................Data.....................Valor
      Fornecedor_1...........01/12/2024..........R$ 120,00 <== grifar a linha de Laranja
      Fornecedor_1...........01/01/2025..........R$ 130,00
      Fornecedor_2...........15/12/2024..........R$ 200,00 <== grifar a linha de Amarelo
      Fornecedor_2...........15/01/2025..........R$ 230,00
      Fornecedor_3...........20/12/2024..........R$ 150,00
       
      Alguém tem alguma dica ou leitura sobre este assunto ?

      Grato,
       
      Cesar
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.