Venda de Produtos

Galera,

Estou precisando fazer uma aplicação de venda de produtos, estou usando o mestre-detalhe, porém não está funcionado de uma maneira simples para o cliente, estou tendo que fazer duas vezes update para atualizar os valores no banco e etc…

Gostaria de saber se tem alguma maneira de fazer algo parecido com com isso:

Abraços…

Leandro Auler

eu utilizo o sc_exec_sql() para atualizar varias tabelas ao mesmo tempo e inserir tambem, o usuario tem que apenas acionar um botao para executar essas funcções
exemplo

$hoje=date(“m”);

//captura o valor do aluguel para correcao
sc_lookup(dataset,“SELECT valor_aluguel FROM imovel WHERE
codigo = ‘{imovel_id}’”);
if(!empty({dataset})){
$aluguel = {dataset}[0][0];
}

sc_lookup(ds_igpm,“SELECT igpm_12_meses FROM igpm where date_format(data, ‘%m’)= $hoje”);

if(!empty({ds_igpm})){
$igpm = {ds_igpm}[0][0];

}

$correcao=$aluguel * $igpm;

sc_exec_sql(“UPDATE imovel SET valor_aluguel = ‘$correcao’ WHERE codigo ={imovel_id} LIMIT 1”);

sc_exec_sql(“INSERT INTO historico_valor_aluguel (igpm , imovel_id , valor_aluguel,valor_corrigido,data_atualizacao )
VALUES (’$igpm’, ‘{imovel_id}’, ‘$aluguel’,’$correcao’,CURRENT_DATE)”);

Arquimedes,

Mas você utliza em qual evento?

No meu caso pense como se fosse um sistema de supermercado de caixa, onde você adiciona os produtos, tem o valor total e salva isso no banco…

Eu posso inserir N produtos, queria fazer de uma maneira que só precisasse clicar em um botao uma unica vez para confirmar a venda.

Leandro

tira uma duvida?
a)voce consegui adicionar os dados da venda no mestre detalhe com a multiplicação de quantidade x valor do produto?
b)no final voce que que essa compra seja alterada para confirmada?
c)apos a confirmação voce tem que armazenar esses dados em mais de uma tabela ao mesmo tempo?

sobre sua pergunta onde eu coloco o evento, eu não coloco em evento, eu crio um funcao php chamo ele em um botao php e quando nescessario é so clicar no botao e ele executa a funcao.

Arquimedes
Respondendo:

a)voce consegui adicionar os dados da venda no mestre detalhe com a multiplicação de quantidade x valor do produto?
SIM
b)no final voce que que essa compra seja alterada para confirmada?
SIM
c)apos a confirmação voce tem que armazenar esses dados em mais de uma tabela ao mesmo tempo?
SIM

1o.
Eu uso formulario(master) ligado a uma grid(detalhe)
2o.
Eu salvo a nota e depois salvo os itens um a um
3o.
Quando eu salvo o primeiro item eu mostro um botão de fechar nota e mudar a situação para fechada, isso no master

e só…

Caso queira fazer isso tudo e só gravar na ação de um unico clique, voce tem que fazer uma aplicação de controle e toda codificação de insert, update e delete na mão.

o amigo wanderlanlima citou a sequencia que eu iria citar, porem caso voce queira adicionar para mais de uma tabela alterar o status para finalizado voce pode:

a) cria um formulario com a tabela venda chamando o mestre detalhe de produtos dessa venda
b) na tabela de venda voce coloca como o campo status como aguardando
c)cria um botao finaliza
d)cria um metodo php venda()
e) no metodo php venda() voce cria o sc_exec_sql("UPDATE .... )para alterar o status da venda para finalizado f) no metodo php venda() voce crua o sc_exec_sql("INSERT INTO…) para quantas forem nescessarioas o envio para as tabelas de sua nescessidade.
g) voce faz a chamada do metodo php venda(); para dentro do botao php.

pronto apos isso é so testa, voce adiciona quantos produtos forem nescessarios para venda, apos clicar no botao finalizar ele vai acionar o metodo php vendar que ira alterar o status dessa venda para finalizado, depois disso é so fazer um consulta com uma where para exibir somentes vendas com status de finalizado

atenciosamente arquimedes

Arquimedes,

Veja os prints da aplicação:

  1. Inicio uma nova venda de produtos:

  1. Cadastro a VENDA, para começar a cadastrar os produtos:

  1. Após Cadastrar os produtos, faço o PRIMEIRO UPDATE para atualizar o MASTER com o VALOR TOTAL:

  1. E o SEGUNDO UPDATE, para cadastrar o valor total da venda:

Queria simplificar isso…

eu tambem estou passando por isso em um campo de soma, mais eu percebo que o valor foi atualizado no banco, porem ele,
nao é exibido ate q se fassa uma atualização atravez do F5 ou do botao atualiza, na verdade na primeira atualização esse campo no meu caso ja se atualiza, porem so é exibido apos a segunda, estou pensando em uma maneira de pular essa etapa tambem

Arquimedes,

Depois de ficar quebrando a cabeça, consegui usar aenas um update, para realizar todos os INSERT´s e UPDATE´s, mas ainda estou fazendo testes para ver se não está sainda nada de errado.
Pois faço INSERT em 3 tabelas e UPDATE em duas, então tudo tem que sair certinho…

Mas o grande lance, é executar todos os eventos no MASTER e não do DETAIL.

Saindo tudo certinho nos meus testes, disponibilizo o código aqui no forum.

Legal Leandro, parabéns… garanto que muitos estão na espera de sua solução

abs

Cuidados a se tomar com master detail:

  • Se os últimos campos tiverem processamento ajax, orientar o usuário a dar tab no último campo antes de clicar no botão de inserir, alterar, pois descobri que dependendo da velocidade, a ação do botão pode ser mais rápida do que o ajax do campo em andamento, dando erro em somas.

  • usar triggers para recalcular e garantir todos os valores tanto nas tabelas filhos como na pai.

Olá Haroldo poderia dar um exemplo de uso das trigers da forma que falou?
Vlw

companheiro Haroldo o problema para mim não esta na velocidade da atualização, pois eu coloco para atualizar apos a atualização, o problema estar na hora de exibir o campo calculado pelo mestre detalhe, isto é eu adiciono ou altero um campo no mestre detalhe e ele altera na tabela pai sem problema. O problema estar que apos eu inserir no mestre detalhe ele nao exibir de imediato no formulario pai, mais se eu fizer um F5 no browse, ai o formulario pai amostra o campo calculado. eu ja uso o triger e function do postgres e da o mesmo problema, a alteração do mestre detalhe para o formulario pai so é exibida apos inicializar o formulario ou atualizando ou fazendo um F5, esse é meu problema.
Como alterar um campo no mestre detalhe para exibir logo em seguida no formulario pai sem a necessidade de atualizar???

mova o valor do campo para uma variavel string, formate e execute a macro sc_master_value.
Se o problema é só a exibição do valor no mestre.
O meu comentário anterior, é não salvação de campos calculados em eventos ajax.


– Gatilhos pedido_itens

DROP TRIGGER IF EXISTS pedido_itens_bef_ins;
DELIMITER //
CREATE TRIGGER pedido_itens_bef_ins BEFORE INSERT ON pedido_itens
FOR EACH ROW begin
If new.TipoDesconto=2 then
Set new.ValorItem=round(new.Quantidadenew.PrecoUnitario,2)-new.desconto;
Else
Set new.ValorItem=round(new.Quantidade
new.PrecoUnitario*(1-(new.desconto/100.00)),2);
End if;
IF new.PercComiss>0 then
Set New.ValorComiss=round(New.ValorItem*(New.PercComiss/100.00),2);
End if;
End
//
DELIMITER ;
DROP TRIGGER IF EXISTS pedido_itens_aft_ins;
DELIMITER //
CREATE TRIGGER pedido_itens_aft_ins AFTER INSERT ON pedido_itens
FOR EACH ROW begin
update pedido
set NroItens=NroItens+1,
QtdeItens=QtdeItens+new.Quantidade,
ValorTotal=ValorTotal+new.ValorItem
where id=new.pedidoId;
End
//
DELIMITER ;
DROP TRIGGER IF EXISTS pedido_itens_bef_upd;
DELIMITER //
CREATE TRIGGER pedido_itens_bef_upd BEFORE UPDATE ON pedido_itens
FOR EACH ROW begin
If new.TipoDesconto=2 then
Set new.ValorItem=round(new.Quantidadenew.PrecoUnitario,2)-new.desconto;
Else
Set new.ValorItem=round(new.Quantidade
new.PrecoUnitario*(1-(new.desconto/100.00)),2);
End if;
IF new.PercComiss>0 then
Set New.ValorComiss=round(New.ValorItem*(New.PercComiss/100.00),2);
End if;
End
//
DELIMITER ;
DROP TRIGGER IF EXISTS pedido_itens_aft_upd;
DELIMITER //
CREATE TRIGGER pedido_itens_aft_upd AFTER UPDATE ON pedido_itens
FOR EACH ROW begin
update pedido
set QtdeItens=QtdeItens+new.Quantidade-old.Quantidade,
ValorTotal=ValorTotal+new.ValorItem-old.ValorItem
where id=new.pedidoId;
End
//
DELIMITER ;
DROP TRIGGER IF EXISTS pedido_itens_aft_del;
DELIMITER //
CREATE TRIGGER pedido_itens_aft_del AFTER DELETE ON pedido_itens
FOR EACH ROW begin
update pedido
set Desconto=0, ValorFrete=0,
NroItens=NroItens-1,
QtdeItens=QtdeItens-old.Quantidade,
ValorTotal=ValorTotal-old.ValorItem
where id=old.pedidoId;
End
//
DELIMITER ;

Faço deste jeito no mestre detalhe criei um metodo php :

sc_lookup(ds,“SELECT SUM(TotProd) FROM vendas_itens WHERE IdVenda = {IdVenda}”);

if (empty({ds}[0][0])) {
$vlc1 = 0.0;
} else {
$vlc1 = {ds}[0][0];
}

sc_exec_sql(‘UPDATE vendas SET TotalVenda = $vlc1 WHERE IdVenda = {IdVenda}’);
sc_format_num($vlc1, “.”, “,”, 2,“S”, “1”);
sc_master_value(‘TotalVenda’ , $vlc1);

e coloco nos eventos onAfterinsert , no update e no delete .

Ta funcionando normal a cada inclusao/alteracao/exclusao de um item ele ja atualiza a tela mestre .

mais o problema do caro colega talvez não seja este, ele informa que consegue faze a atualização no formulario principal, o problema é que o valor apos alterado aperce somente apos um refresh da pagina, ou seja quando a pagina é novamente carregada

Eu tinha este mesmo problema mas deposi que fiz desta maneira resolveu

if (empty({ds}[0][0])) {
$vlc1 = 0.0;
} else {
$vlc1 = {ds}[0][0];
}
testando se nao esta vazio ai atualiza na hora.

Eu tomei por base o exemplo form38
Form_applications / Config_a_Form_Application

Com poucas modificações, está 100%