Fórum Ajuda com procedure urgente #425043

30/09/2012

0

Olá pessoal, peço desculpas se estou postando no lugar errado, pois essa é meu primeiro post.
Preciso muito de uma ajuda porque nunca trabalhei com procedure e preciso passar uma parte do codigo em PHP para procedure porque quando o clinete clica em fechar pedido o sistema esta se perdendo. Se eu rodo no servidor local da tudo certo, agora na net da zuca no estoque. vou postar o codigo aqui, se alguem puder me ajudar agradeço

$verificaloop = 10;
$query_Lista_itens_do_pedido = mysql_query("SELECT CodItem, CodProduto, Quantidade, valor, idFornecedor, validade FROM pedidositens Where CodPedido = ''$CodigoPedido''");
if (!$query_Lista_itens_do_pedido) {
$erro = "eroo".mysql_error();
} else {
if (mysql_num_rows($query_Lista_itens_do_pedido)>0) {
while($array_itens_do_pedido = mysql_fetch_array($query_Lista_itens_do_pedido)){
$CodItemInicial = $array_itens_do_pedido[''CodItem''];
$IdProdutoInicial = $array_itens_do_pedido[''CodProduto''];
$idFornecedor = $array_itens_do_pedido[''idFornecedor''];
$valor = $array_itens_do_pedido[''valor''];
$validade = $array_itens_do_pedido[''validade''];
$QuantidadeCompradaInicial = $array_itens_do_pedido[''Quantidade''];
//echo("QuantidadeCompradaInicial = ".$QuantidadeCompradaInicial."<br>");
$query_Busca_Estoque_1 = mysql_query("SELECT idestoque, idproduto, lote, estoque_net, esgotado FROM produto_estoque where idproduto = ''$IdProdutoInicial'' and esgotado = 0 limit 1;" );
if (!$query_Busca_Estoque_1) {
$erro2 = "erro2 = ".mysql_error();
} else {
if (mysql_num_rows($query_Busca_Estoque_1)>0) {
while($array_Estoque_1 = mysql_fetch_array($query_Busca_Estoque_1)){
$estoque1 = $array_Estoque_1["estoque_net"];
$idestoque1 = $array_Estoque_1["idestoque"];
$lote = $array_Estoque_1["lote"];
//echo "Encontrou na busca ".$estoque1." iten<br>";
if($estoque1 == $QuantidadeCompradaInicial){
//$verificaloop = 0;
$queryUpdateEstoque = mysql_query("UPDATE produto_estoque SET estoque_net = 0, esgotado = 1 WHERE idestoque = ''$idestoque1''") or die(mysql_error());
$queryUpdateItens = mysql_query("UPDATE pedidositens SET numero_lote = ''$lote'', tem_estoque_sim_nao = 1, idestoque = ''$idestoque1'' WHERE CodItem = ''$CodItemInicial''") or die(mysql_error());
//echo("finaliza o estoque");
}elseif($estoque1 > $QuantidadeCompradaInicial){
//$verificaloop = 0;
//coloca o numero do lote
$query_Coloca_numero_do_lote = mysql_query("UPDATE pedidositens SET numero_lote = ''$lote'', tem_estoque_sim_nao = 1, idestoque = ''$idestoque1'' WHERE CodItem = ''$CodItemInicial''") or die(mysql_error());
$novoEstoque1 = $estoque1 - $QuantidadeCompradaInicial;
//echo("tira ".$QuantidadeCompradaInicial." do estoque atual - estoque atual agora vai ter ".$novoEstoque1."<br>");
$queryUpdateEstoque = mysql_query("UPDATE produto_estoque SET estoque_net = ''$novoEstoque1'' WHERE idestoque = ''$idestoque1''") or die(mysql_error());
}elseif($estoque1 < $QuantidadeCompradaInicial){
$Nova_Quantidade_para_Pegar1 = $QuantidadeCompradaInicial - $estoque1;
//echo("temn que buscar o restante ".$Nova_Quantidade_para_Pegar1." e zerar esse estoque<br>");
$queryUpdateEstoque = mysql_query("UPDATE produto_estoque SET estoque_net = 0, esgotado = 1 WHERE idestoque = ''$idestoque1''") or die(mysql_error());
$queryUpdateItens = mysql_query("UPDATE pedidositens SET sub_itens = ''1'', tem_estoque_sim_nao = 1 WHERE CodItem = ''$CodItemInicial''") or die(mysql_error());
$incere_itenpedidos_sub_itens = mysql_query("INSERT INTO pedidos_sub_itens (
CodItem, CodPedido, CodProduto, Quantidade, valor, idFornecedor, lote, tem_estoque_sim_nao, validade, idestoque
) VALUES (
''$CodItemInicial'', ''$CodigoPedido'', ''$IdProdutoInicial'', ''$estoque1'', ''$valor'', ''$idFornecedor'', ''$lote'', ''1'', ''$validade'', ''$idestoque1''
)") or die(mysql_error());
//inicia loop
for ( $ContaLoop = 1; $ContaLoop <= $verificaloop; $ContaLoop += 1) {
$query_Busca_Estoque_2 = mysql_query("SELECT idestoque, idproduto, lote, estoque_net, esgotado, validade FROM produto_estoque where idproduto = ''$IdProdutoInicial'' and esgotado = 0 limit 1;" );
if (!$query_Busca_Estoque_2) {
$erro3 = "erro2 = ".mysql_error();
} else {
if (mysql_num_rows($query_Busca_Estoque_2)>0) {
while($array_Estoque_2 = mysql_fetch_array($query_Busca_Estoque_2)){
$estoque2 = $array_Estoque_2["estoque_net"];
$validade2 = $array_Estoque_2["validade"];
$idestoque2 = $array_Estoque_2["idestoque"];
$lote2 = $array_Estoque_2["lote"];
if($estoque2 == $Nova_Quantidade_para_Pegar1){
$verificaloop = 0;
//echo("finaliza o estoque");
$queryUpdateEstoque = mysql_query("UPDATE produto_estoque SET estoque_net = 0, esgotado = 1 WHERE idestoque = ''$idestoque2''") or die(mysql_error());
$queryUpdateItens = mysql_query("UPDATE pedidositens SET sub_itens = ''1'', tem_estoque_sim_nao = 1 WHERE CodItem = ''$CodItemInicial''") or die(mysql_error());
//// acrecenta o item no pedidos_sub_itens
$incere_itenpedidos_sub_itens = mysql_query("INSERT INTO pedidos_sub_itens (
CodItem, CodPedido, CodProduto, Quantidade, valor, idFornecedor, lote, tem_estoque_sim_nao, validade, idestoque
) VALUES (
''$CodItemInicial'', ''$CodigoPedido'', ''$IdProdutoInicial'', ''$estoque1'', ''$valor'', ''$idFornecedor'', ''$lote2'', ''1'', ''$validade2'', ''$idestoque2''
)") or die(mysql_error());
}elseif($estoque2 > $Nova_Quantidade_para_Pegar1){
$verificaloop = 0;
$novoEstoque2 = $estoque2 - $Nova_Quantidade_para_Pegar1;
//echo("tira ".$Nova_Quantidade_para_Pegar1." do estoque atual da segunda busca - estoque atual agora vai ter ".$novoEstoque2."<br>");
$queryUpdateEstoque = mysql_query("UPDATE produto_estoque SET estoque_net = ''$novoEstoque2'' WHERE idestoque = ''$idestoque2''") or die(mysql_error());
//// acrecenta o item no pedidos_sub_itens
$incere_itenpedidos_sub_itens = mysql_query("INSERT INTO pedidos_sub_itens (
CodItem, CodPedido, CodProduto, Quantidade, valor, idFornecedor, lote, tem_estoque_sim_nao, validade, idestoque
) VALUES (
''$CodItemInicial'', ''$CodigoPedido'', ''$IdProdutoInicial'', ''$Nova_Quantidade_para_Pegar1'', ''$valor'', ''$idFornecedor'', ''$lote2'', ''1'', ''$validade2'', ''$idestoque2''
)") or die(mysql_error());
}elseif($estoque2 < $Nova_Quantidade_para_Pegar1){
$Nova_Quantidade_para_Pegar2 = $Nova_Quantidade_para_Pegar1 - $estoque2;
$Nova_Quantidade_para_Pegar1 = $Nova_Quantidade_para_Pegar2;
$ja_encontrou_alguma_coisa = 1;
$queryUpdateEstoque2 = mysql_query("UPDATE produto_estoque SET estoque_net = 0, esgotado = 1 WHERE idestoque = ''$idestoque2''") or die(mysql_error());
$incere_itenpedidos_sub_itens = mysql_query("INSERT INTO pedidos_sub_itens (
CodItem, CodPedido, CodProduto, Quantidade, valor, idFornecedor, lote, tem_estoque_sim_nao, validade, idestoque
) VALUES (
''$CodItemInicial'', ''$CodigoPedido'', ''$IdProdutoInicial'', ''$estoque2'', ''$valor'', ''$idFornecedor'', ''$lote2'', ''1'', ''$validade2'', ''$idestoque2''
)") or die(mysql_error());
}
}
}else{
//echo("NÃO ENCONTROU NEM UM LOTE DO PRODUTO2<BR>");
$incere_itenpedidos_sub_itens = mysql_query("INSERT INTO pedidos_sub_itens (
CodItem, CodPedido, CodProduto, Quantidade, valor, idFornecedor, lote, tem_estoque_sim_nao, validade
) VALUES (
''$CodItemInicial'', ''$CodigoPedido'', ''$IdProdutoInicial'', ''$Nova_Quantidade_para_Pegar1'', ''$valor'', ''$idFornecedor'', ''$SemLote'', ''0'', ''$validade''
)") or die(mysql_error());
$verificaloop = 0;
}
}

}
//finalizar loop
$verificaloop = 10;
}
}
}else{
$query_Coloca_numero_do_lote = mysql_query("UPDATE pedidositens SET numero_lote = ''$SemLote'', tem_estoque_sim_nao = 0 WHERE CodItem = ''$CodItemInicial''") or die(mysql_error());
}
}
}
Jocimar Simioni

Jocimar Simioni

Responder

Posts

30/09/2012

Joel Rodrigues

Mas qual está sendo o erro? E que parte precisa ser passada para o procedure?
Responder

Gostei + 0

30/09/2012

Jocimar Simioni

Mas qual está sendo o erro? E que parte precisa ser passada para o procedure?


Olá meu amigo, eu preciso passar todo o código acima para procedure porque quando se fecha o pedido na net, o estoque esta ficando errado eu acho que é o tempo de execução porque se você dar uma olhada no codigo ele executa várias rotinas e isso ao meu ver ta dando o erro no estoque, o codigo faz tudo certo, menos o estoque.
Só para você ter uma ideia
Se o cara colocar no carrinho de compras de 1 a 10 itens mais ou menos o sistema faz tudo certo, agora se colocar mais que isso e pra ajudar a média de itens é de 20, 25 o estoque se perde entendeu?
Responder

Gostei + 0

01/10/2012

William

Colega o código está bem extenso e complexo, mas quando quero baixar estoque direto no banco trabalho com 2 eventos: AfterInsert no seu caso na tabela de itens_pedido, dentro desse evento vc pode disparar uma procedure que vai baixar do estoque o produto com base no código que está sendo inserido. Esse evento é disparado sempre que ocorre uma inserção!

BeforeDelete da mesma tabela de itens_pedido, não é uma das melhores práticas depois de incluído um registro na tabela de itens_pedido deixar o usuário excluir, mas nesse caso sempre que houver uma exclusão na tabela nessa tabela se disparado esse evento, vc pode criar outra procedure para estornar estoque e dispará-la nesse momento.

Bom passei uma ideia inicial, veja se te agrada, qualquer coisa vai postando ak....
Responder

Gostei + 0

01/10/2012

Jocimar Simioni

Colega o código está bem extenso e complexo, mas quando quero baixar estoque direto no banco trabalho com 2 eventos: AfterInsert no seu caso na tabela de itens_pedido, dentro desse evento vc pode disparar uma procedure que vai baixar do estoque o produto com base no código que está sendo inserido. Esse evento é disparado sempre que ocorre uma inserção!

BeforeDelete da mesma tabela de itens_pedido, não é uma das melhores práticas depois de incluído um registro na tabela de itens_pedido deixar o usuário excluir, mas nesse caso sempre que houver uma exclusão na tabela nessa tabela se disparado esse evento, vc pode criar outra procedure para estornar estoque e dispará-la nesse momento.

Bom passei uma ideia inicial, veja se te agrada, qualquer coisa vai postando ak....


Meu amigo eu tinha pensado nessa sua ideia, mas tem mais um probleminha hahahaahaha, o estoque não é baixado até que o cliente clique em converter orçamento para pedido, entendeu?
Primeiro eu faço um orçamento, mando pro comprador, depois de aprovado ai sim eu converto esse orçamento para pedido, e é ai que tenho que dar baixa no estoque. Não sei se você deu uma lida no script, mas alem disso eu verifico o numero do lote e vejo se a quantidade que tem no lote disponivel é suficiente para a compra do produto caso não seja finalizo o lote e pego outro lote para completar o pedido e assim por diante. Resumindo o negocio é bem complexo, por isso preciso passar isso pra procedure e não tenho nem ideia de como fazer isso.
Mas mesmo assim muito obrigado por ter me respondido
Responder

Gostei + 0

01/10/2012

William

Colega Jocimar, não tem problema podemos montar uma baixa do estoque baseado nas suas necessidades, tudo isso em procedures.

- A inclusão na tabela de itens_pedido é feita durante a fase do orçamento e posteriormente conforme aprovação, vai se transformar e um pedido concreto.

- Então poderia criar um campo STATUS_PEDIDO na tabela de itens_pedido com a finalidade de identificar se esse item ainda está em orçamento ou foi aprovado para pedido, vc pode usar o evento AfterUpdate com uma condição para baixa no estoque quando o campo STATUS_PEDIDO mudar seu valor para pedido finalizado ou outro valor qualquer.

Parece complexo, mas esse tipo de procediure tem q ser escrito aos poucos para não deixar escapar nenhuma regra de negócio do sistema!

Passei um rascunho da ideia, mas todas as regras de negócio podem ser transferidas para o banco, vc não tem ideia as procedures de baixa de estoque que já tive de escrever...
Responder

Gostei + 0

01/10/2012

Jocimar Simioni

Colega Jocimar, não tem problema podemos montar uma baixa do estoque baseado nas suas necessidades, tudo isso em procedures.

- A inclusão na tabela de itens_pedido é feita durante a fase do orçamento e posteriormente conforme aprovação, vai se transformar e um pedido concreto.

- Então poderia criar um campo STATUS_PEDIDO na tabela de itens_pedido com a finalidade de identificar se esse item ainda está em orçamento ou foi aprovado para pedido, vc pode usar o evento AfterUpdate com uma condição para baixa no estoque quando o campo STATUS_PEDIDO mudar seu valor para pedido finalizado ou outro valor qualquer.

Parece complexo, mas esse tipo de procediure tem q ser escrito aos poucos para não deixar escapar nenhuma regra de negócio do sistema!

Passei um rascunho da ideia, mas todas as regras de negócio podem ser transferidas para o banco, vc não tem ideia as procedures de baixa de estoque que já tive de escrever...


Meu amigo, obrigado pela ajuda, você clareou minhas ideias, vou mudar a forma de como é feito o orçamento e incluir o campo Status_pedido, porque como esta hoje acho que vai ser mais complicado fazer isso que você sugeriu, porque eu não estou jogando tudo no banco de dados. Só pra você ter uma ideia hoje você faz o orçamento o sistema só pega o id do produto a quantidade deseja e joga na tabelala itens_pedido, ai quando eu fecho o pedido o sistema vai verificar se o numero do lote do produto tem em estoque, se tem maravilha, se não tem o sistema vai procurar outro lote do mesmo produto ai ele anula a tabela itens_pedido e joga pra uma nova tabela sub_itens_pedido com a quantidade que encontrou do primeiro lote e a quantidade do segundo, terceiro ... lote que encontrou, se não encontrou ai sim marca como sem estoque, entendeu?
Vou mexer aqui e te dou uma resposta, agora se você acha que da pra fazer alguma coisa sem eu ter que mexer nisso, sua ajuda vai ser muito válida, podemos combinar alguma coisa R$ pra você me ajudar nisso.
Aguardo um retorno, Obrigado
Responder

Gostei + 0

02/10/2012

William

Jocimar vamos fazer o seguinte, meu skype é willfl2 vc me adiciona, montamos essa procedure e postamos ak no fórum para que outras pessoas possam compartilhar da sua solução. Minha ajuda fica independente da questão $$, isso eu deixo para vc decidir.

Primeiro vamos resolver seu problema..
Responder

Gostei + 0

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

Aceitar