Ir para conteúdo
Fórum Script Brasil
  • 0

Projeto PHP MySQL: a soma das partes


Frank K Hosaka

Pergunta

Eu estou bem enrolado com o projeto portaria2, mas hoje apareceu outro cliente pedindo para aperfeiçoar a gambiarra que eu fiz no MySQL.

O cliente tem uma camisa que custa R$ 6,00, ele queria vender os botões. Cada camisa tem 6 botões, logo, cada botão custa R$ 1,00.

Para resolver isso, eu abri um novo registro chamado botão, e no campo código do fornecedor eu coloquei {"cod":886,"conv":6}, onde 886 é o código da camisa e 6 é o número de botões que cada camisa tem. Eu pedi para o PHP calcular o custo do botão assim:


$custooriginal= // resultado da consulta do produto original
$obj=json_decode($codfornecedor);
$conv=$obj->conv;
$custo=round($custooriginal/$conv,2); // cálculo do custo para um produto vinculado em outro.

Agora, o cliente disse que tem uma camisa que custa R$ 6,00, uma calça que custa R$ 6,00 e um par de chinelo que custa R$ 6,00. Logo o Conjunto Para a Praia custa R$ 18,00.

Para resolver esse problema, eu pensei nessa anotação {"cod":886,"conv":1,"cod":666,"cod":999} e o código PHP ficaria mais ou menos assim:

if (!$conv==1){
         $custo=round($custooriginal/$conv,2);} else {
                  // ver quantos cod tem na anotação json
                  // consultar o custo de cada um deles
                  $custo=$somacusto;}

A primeira dificuldade que eu vejo é que o PHP não vai conseguir distinguir os códigos, a menos que chame de cod1, cod2 e assim vai, mas enfim, isso é apenas um esboço de uma ideia. Na hora de digitar, tudo sai diferente.

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Terminei o meu código rascunho, e ele ficou assim:

 

<?php
$mysqli=new mysqli("localhost","root","","diario");
$query=$mysqli->query("select * from tbprod where codprod=1401");
$row=$query->fetch_assoc();
var_dump($row);
echo "produto ".$row['prod']." codigo ".$row['codprod'];
$codforn=$row['codforn'];
$json=json_decode($codforn);
var_dump($json);
if($json->Conv==1){
	$somacusto=0;
	foreach($json as $chave=>$codprod){
		if($chave<>"Conv"){
			$query=$mysqli->query("select * from tbprod where codprod=$codprod");
			$row=$query->fetch_assoc();
			echo "<br>produto ".$row['prod']." custo ".$row['custo'];
			$somacusto+=$row['custo'];}}}
echo "<br>o custo do novo produto vinculado será de $somacusto";

Resultado:
C:\wamp64\www\frank\astudy.php:5:
array (size=10)
  'codprod' => string '1401' (length=4)
  'un' => string 'un' (length=2)
  'prod' => string 'Kit Quitanda' (length=12)
  'custo' => string '0.59' (length=4)
  'marg' => string '30.00' (length=5)
  'codbar' => string '' (length=0)
  'loc' => string '' (length=0)
  'emb' => string '' (length=0)
  'cf' => string '' (length=0)
  'codforn' => string '{"Cod":198,"Conv":1,"Cod1":44,"Cod2":95}' (length=40)
produto Kit Quitanda codigo 1401
C:\wamp64\www\frank\astudy.php:9:
object(stdClass)[3]
  public 'Cod' => int 198
  public 'Conv' => int 1
  public 'Cod1' => int 44
  public 'Cod2' => int 95

produto Batata custo 6.99
produto Tomate custo 7.99
produto Cebola custo 8.05
o custo do novo produto vinculado será de 23.03

O json é uma tecnologia que só conheci aqui no fórum.

Antes disso, eu usava o Microsoft Access, e o máximo que eu consegui foi somar dois produtos, e usei dezenas e dezenas de linhas, o que dá para fazer com poucas linhas com o json.

O json é muito chato, mas vale a pena utilizar. Para somar três produtos, eu precisei alterar a tbprod, o codforn foi criado com varchar(30), eu tive que alterar para varchar(40). Aumentando o tamanho do campo, vai ser possível somar mais de três produtos.

Link para o comentário
Compartilhar em outros sites

  • 0

 

57 minutos atrás, lowys disse:

Mas porque tá salvando como string?
no mysql tem uma coluna json justamente pra salvar json
e você pode pesquisar pelo índice json que precisar:
https://dev.mysql.com/doc/refman/8.0/en/json.html

Eu não sabia que o MySQL tinha o campo json, mas ele não vai ajudar.

Um banco de dados decente tem um código exclusivo para usar a engenharia InnoDB e catalogar os produtos por nome, unidade, custo, código fiscal, localização, mas JAMAIS poderia ter um código de fornecedor, isso porque um produto pode ser fornecido por vários fornecedores. Esse é o erro número 1. 

Um registro tem que ser vinculado a apenas um produto. Um registro jamais pode ser vinculado a outro registro da mesma tabela. O que eu fiz foi violar centenas de regras como o princípio da atomicidade, o princípio da normatização, para citar apenas alguns.

Se eu criar um campo tipo json na tabela de produtos, certamente vou acabar na cadeia. Se bem que a sugestão é muito valiosa, eu não precisaria ficar procurando na tabela quem é um "registro puro" e o que é um "registro quebra galho".

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...