Jump to content
Fórum Script Brasil
  • 0

Projeto PHP MySQL: a soma das partes


Frank K Hosaka

Question

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.

Edited by Frank K Hosaka
Link to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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".

Edited by Frank K Hosaka
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.1k
    • Total Posts
      652k
×
×
  • Create New...