CALCULO DE PERCENTUAL E FAZER UPDATE EM OUTRA COM RESULTADO

16/04/2015

0

Bom dia pessoal
sou novo no fórum e estou engatinhando na programação não fiz curso algum tudo que sei é frutos de pesquisas e
na pratica do dia a dia então me desculpem se eu soltar algumas grandes besteiras.

Trabalho em uma empresa que representa sistemas fiscais, e como sabemos estes sistemas a maioria é limitado por questões de legislação federal, estadual e alguns ate municipal, a as vezes precisamos criar um relatórios a parte como este que estou tentando fazer.

preciso pegar do banco de dados as vendas feitas com cupom fiscal e somar todos e agrupar por formas de pagamento, até ai ta tranquilo usei
a sql
SELECT VENDAS_FORMASPAG.DESCRICAO,SUM(CAST(VALOR AS DECIMAL(15,2))) AS VALOR FROM VENDAS_FORMASPAG WHERE VENDAS_FORMASPAG.DATA = '2015-04-14' and CANCELADO = '0' GROUP BY VENDAS_FORMASPAG.DESCRICAO ";


Aqui esta uma imagem deste resultado estou fazendo ele com php
resultado
o codigo do php esta assim
<?php
//$servidor = "127.0.0.1:c:\bases\BASE_AA.GDB";
$servidor = "192.168.0.104:C:\sistema\DADOS\DADOS.FDB";
//conexão com o banco, se der erro mostrara uma mensagem.
if (!($dbh=ibase_connect($servidor, 'SYSDBA', 'masterkey')))
die('Erro ao conectar: ' . ibase_errmsg());
//Fazer uma consulta no banco:

$dia = $_POST['fdata'];
$sql = "SELECT VENDAS_FORMASPAG.DESCRICAO,SUM(CAST(VALOR AS DECIMAL(15,2))) AS VALOR FROM VENDAS_FORMASPAG WHERE VENDAS_FORMASPAG.DATA = '$dia' and CANCELADO = '0' GROUP BY VENDAS_FORMASPAG.DESCRICAO ";
$sqlcontar = ibase_query("SELECT COUNT(CANCELADO) FROM VENDAS_FORMASPAG WHERE DATA = '$dia' and CANCELADO = '0'");
$contar = ibase_fetch_row($sqlcontar);
$num = $contar['0'];
$consulta = ibase_query($sql);
?>
<html>
<head>
<link rel="shortcut icon" href="img/favicon.ico" type="image/x-icon" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />


</head>

<body>

<div id="teste">
<center><img src="img/logo-RC-100-67.png"></center>
</div>
<link href="css.css" rel="stylesheet">

<br />
<div id="contar" align="center">
<?php
echo "Quantidade de Registros Contabilizados = ".$num;
?>
</div>
<div id "tabela" align="center">
<table border="0" align="center" class="tabela">
	<tr>
		<td width="300"><div align="center" class="letra_cabeçalho">DESCRICAO</div></td>
		<td><div align="center" class="letra_cabeçalho">VALOR</div></td>
	</tr>
<?php
$i = 0;
while ($imprime = ibase_fetch_assoc($consulta)){
	$descricao 		= $imprime['DESCRICAO'];
	$valor 			= $imprime['VALOR'];
	$i++;
	$style = ($i % 2 == 0) ? 'style="background:#B4CDCD"' : 'style="background:#7A8B8B;"';
?>
<tr <?php echo $style; ?>>
    <td class="bordinha"><pre class="txtabela"><?php echo $descricao; ?></pre></a></td>
	<td class="bordinha"><pre class="txtabela"><?php echo $valor; ?></pre></td>
</tr>
<?php
}
ibase_close();
?>
<br/>
<br/>
<form action="cpos.php" method="post" align="center" > 
Data: <input type=date name=fdata><br> 
<input type=submit value="OK"> 
</form>
<link href="css.css" rel="stylesheet">
<div align="center"  class="titulo"><h1></h1></div>
<br />
<div id="contar" align="center">
<?PHP
echo "________________________";
echo "<br>";
echo "Data Processada: " .$_POST['fdata'];
echo "<br>";
echo "¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯";

?>
<br />
<br />
</div>
</div>
</table>

Porem preciso depois de saber o total do dia quanto cada forma de pagamento teve e descontar um porcentagem que vai ser paga a operadoras de cartões, dai começou
a me dificultar pois tentei alguns sql mas não resolveu resumido cada forma de pagamento teria um percentual.

Bom resumidão preciso pegar a tabela de vendas agrupar por formas de pagamento (pois cada venda gera um registro na tabela) depois descontar o percentual de cada forma de pagamento e me mostrar quanto sobraria para o cliente realmente sem o percentual. e esse resultado fazer um update em uma tabela para que depois eu consiga printar ela com php.



ex: forma de pgto = percentual a ser pago
boleto = 0
cielo_elo_cred = 3,2
cielo_elo_deb =2
dinheiro =0
get_master_1x =3,5
get_master_2x =4,2
get_master_3x =4,2
get_master_4x =4,3
get_master_deb =2
get_visa_1x =3,5
get_visa_2x =4,2
get_visa_3x =4,2
get_visa_4x =4,3
get_visa_deb =2
hiper_1x =3,95
hiper_2x =4,65
redecard_1x =3,65
redecard_2x =4,35
redecard_3x =4,35
redecard_4x =4,35
redecard_deb =2

para facilitar a quem me ajudar a estrutura da tabela é essa
CREATE TABLE VENDAS_FORMASPAG (
  NOTA VARCHAR(6) CHARACTER SET NONE COLLATE NONE,
  MODELO CHAR(2) CHARACTER SET NONE COLLATE NONE,
  SERIE CHAR(3) CHARACTER SET NONE COLLATE NONE,
  SUBSERIE CHAR(2) CHARACTER SET NONE COLLATE NONE,
  ORIGEM CHAR(2) CHARACTER SET NONE COLLATE NONE,
  DATA DATE,
  DESCRICAO VARCHAR(20) CHARACTER SET NONE COLLATE NONE,
  VALOR NUMERIC(15, 4),
  CANCELADO SMALLINT);


CREATE INDEX IDX_VENDAS_FORMASPAG ON VENDAS_FORMASPAG(NOTA,MODELO,SERIE,SUBSERIE,ORIGEM,DATA);



se puderem me ajudar agradeço.
Marcos Aurelio

Marcos Aurelio

Responder

Post mais votado

16/04/2015

Marcos,

A integração entre bancos no Firebird ( via Execute Statment on Data Source ) só funciona a partir da versão 2.5, que é superior a versão do teu ambiente.

Sendo assim, minha sugestão é rodar a query com o group by de vendas do lado do Firebird, recuperarando todas as linhas geradas do lado do PHP e descarregando essas linhas em outro banco de apoio ( eventualmente até no MySql ) em uma temporária.

Ou seja, você usaria a aplicação para intercambiar os dados entre os bancos.

Depois da temporária gerada, fica simples gerar a query completa, conforme conversamos hoje a tarde.

Acaba sendo o método mais rápido para atender sua necessidade.

Ok ?!?

Marcos P

Marcos P
Responder

Mais Posts

16/04/2015

Marcos P

Marcos,

Vai no Fiddle, crie a tabela e insira alguns registros de teste.

Depois volte aqui, que eu te ajudo com a query...
Responder

16/04/2015

Marcos Aurelio

Ok Estou vendo como colocar pois ele não tem firebird.
Responder

16/04/2015

Marcos P

Acredito que a query não seja tão complexa, tente fazer como MySql ou Sql Server...
Responder

16/04/2015

Marcos Aurelio

Responder

16/04/2015

Marcos Aurelio


lembrando consegui colocar como mysql mas a biblioteca de comandos firebird e diferente do mysql.
Responder

16/04/2015

Marcos P

Pelo que você colocou, temos :

1. preciso pegar a tabela de vendas agrupar por formas de pagamento
2. depois descontar o percentual de cada forma de pagamento
3. resultado fazer um update em uma tabela para que depois eu consiga printar ela com php

perguntas...

1. O group by que você já fez ( GROUP BY VENDAS_FORMASPAG.DESCRICAO ), resolve essa questão... certo ?
2. Qual a coluna que representa o percentual a ser descontado ?
3. Essa parte ficou confusa... update em qual tabela ?
Se fizermos uma query que retorne o total e o desconto, você não consegue tratar direto do lado da aplicação ?
Responder

16/04/2015

Marcos Aurelio

então agrupar por descricao a coluna percentual não tem por isso teria que fazer um update em outra tabela pode ser só com colunas descricao, percentual, valor.
estava tentando fazer uma query por cada forma de pagamento assim ja colocando na própria query o percentual se a necessidade de criar uma nova tabela.

tentei usar assim mas não deu certo:
select (valor * (15 / 100)) as
valor_receber from VENDAS_FORMASPAG;


dai eu criaria uma query por forma de pagamento n sei se seria viavel não tenho muita experiencia pois depois teria que tratar no php.
Responder

16/04/2015

Marcos Aurelio

então agrupar por descricao a coluna percentual não tem por isso teria que fazer um update em outra tabela pode ser só com colunas descricao, percentual, valor.
estava tentando fazer uma query por cada forma de pagamento assim ja colocando na própria query o percentual sem a necessidade de criar uma nova tabela.

tentei usar assim mas não deu certo:
select (valor * (15 / 100)) as
valor_receber from VENDAS_FORMASPAG;


dai eu criaria uma query por forma de pagamento n sei se seria viavel não tenho muita experiencia pois depois teria que tratar no php.



respondendo com mais clareza não tenho esta informação de percentual no banco e não posso colocar pois se trata de um programa fiscal não posso alterá-lo o que posso fazer e criar outro banco de dados e fazer um update ou insert, não posso manipular o banco original a fiscalização não permite e iria dar uma multa gigantesca para o cliente e para minha empresa. mas posso extrair informações sem problemas.
Responder

16/04/2015

Marcos P

O percentual a ser aplicado é fixo ( 15% ) para todos os itens... é isso ?

Caso não seja, são muitas opções de percentual e qual a regra que define qual percentual se aplica a qual item ?
Responder

16/04/2015

Marcos Aurelio

não se gue aquela tabela que dei exemplo la no primeiro post :

boleto = 0
cielo_elo_cred = 3,2
cielo_elo_deb =2
dinheiro =0
get_master_1x =3,5
get_master_2x =4,2
get_master_3x =4,2
get_master_4x =4,3
get_master_deb =2
get_visa_1x =3,5
get_visa_2x =4,2
get_visa_3x =4,2
get_visa_4x =4,3
get_visa_deb =2
hiper_1x =3,95
hiper_2x =4,65
redecard_1x =3,65
redecard_2x =4,35
redecard_3x =4,35
redecard_4x =4,35
redecard_deb =2
Responder

16/04/2015

Marcos P

O certo, então, é você fazer diferente... não rode essa query no banco "oficial" crie um outro, somente para esse tipo de pesquisa.

Nesse novo, crie uma tabela com esses percentuais para cada uma das formas de pagamento...

Aí fazemos o select usando a tabela de vendas do banco de produção ( somente select ) e todas as demais tabelas de apoio no banco de consulta.

Para adiantar, crie também no Fiddler essa tabela com os percentuais.

Me avise que eu preparo a query e depois você adapta ela para referência ao outro banco.

Entendeu a ideia ?

Outra coisa essa tabela q você criou não suporta o GROUP ( GROUP BY VENDAS_FORMASPAG.DESCRICAO ), pois não existe essa coluna nela. Acho bom você revisar isso, também !

Se complicar a comunicação, tenho GTalk e Skype. Me passe teus contatos que falamos por lá...
Responder

16/04/2015

Marcos Aurelio

Me adicione no skype sdn.marcos creio que vai ficar mais fácil, dai para mantermos a função do fórum depois eu coloco a resolução aqui para futuras duvidas de outros membros.
só peço que se identifique no pedido pois este skype e direcionado somente para trabalho então não aceito pedidos que não saiba de quem é.
Responder

17/04/2015

Marcos Aurelio

Ok vou fazer algumas pesquisas, sobre o assunto. Obrigado pela ajuda.
Responder

11/06/2015

Marcos Aurelio

Gostaria de agradecer o Marcos P pela sua atenção, me ajudou muito e consegui resolver minha duvida para nós darmos continuidade no forum e para que outros possam utilizar do código de forma didática segue o codigo

SELECT VENDAS_FORMASPAG.DATA, VENDAS_FORMASPAG.DESCRICAO, FORM_PGTO.PERCENTUAL, CAST(SUM(VENDAS_FORMASPAG.VALOR) AS DECIMAL(15,2)) AS TOTALBRUTO, CAST((SUM(VENDAS_FORMASPAG.VALOR)* (FORM_PGTO.PERCENTUAL/100)) AS DECIMAL(15,2)) AS TOTALPERCENTUAL, CAST((SUM(VENDAS_FORMASPAG.VALOR)-(SUM(VENDAS_FORMASPAG.VALOR)* (FORM_PGTO.PERCENTUAL/100))) AS DECIMAL(15,2)) AS TOTALLIQUIDO FROM VENDAS_FORMASPAG INNER JOIN FORM_PGTO ON (VENDAS_FORMASPAG.DESCRICAO = FORM_PGTO.FORMAS) WHERE VENDAS_FORMASPAG.CANCELADO = '0' AND VENDAS_FORMASPAG.DATA = '$dia' GROUP BY VENDAS_FORMASPAG.DATA, VENDAS_FORMASPAG.DESCRICAO, FORM_PGTO.PERCENTUAL ORDER BY VENDAS_FORMASPAG.DATA, VENDAS_FORMASPAG.DESCRICAO;


[img:descricao=Resultado do relatório]http://arquivo.devmedia.com.br/forum/imagem/424944-20150611-140221.jpg[/img]
Responder

11/06/2015

Marcos P

Ótimo o seu retorno... apareça sempre por aqui !
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar