Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Aprendiz/CE

Como inserir dados mestre/detalhes de uma só vez?

Recommended Posts

Prezados,

Como eu faço para inserir dados no DB em uma tabela mestre e três outras detalhes tudo em um único submit? Quero um dica que seja segura, pois como se trata de dados, não quero correr risco de falta de consistência de informações.

Grato e aguardo qualquer orientação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ué...

 

- Submit

- Insert na tabela mestre

- Pega o last_insert_id

- Insere na primeira tabela detalhe

- Insere na segunda tabela detalhe

- Insere na terceira tabela detalhe

- Redirect / Mensagem de confirmação.

 

Não entendi sua dúvida na verdade. Mas se for algo sobre a rotina de execução, espero ter ajudado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ué...

 

- Submit

- Insert na tabela mestre

- Pega o last_insert_id

- Insere na primeira tabela detalhe

- Insere na segunda tabela detalhe

- Insere na terceira tabela detalhe

- Redirect / Mensagem de confirmação.

 

Não entendi sua dúvida na verdade. Mas se for algo sobre a rotina de execução, espero ter ajudado.

 

Explicando melhor:

 

Eu quero informar tudo, ou seja, o mestre e todos os registros detalhes sem submeter nada, da[i quando eu fosse submeter faria a inserção dos dados de uma única vez. Entendeu?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia para todos, amigo, jé pensou em usar triggers, direto pelo banco, se tu consegue todos os dados no primeiro insert, depois é só criar as triggers que o banco faz sozinho, mas tem que ver no seu host se eles vão te dar suporte ao uso de triggers, pois tem alguns hosts que não liberam tal recurso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia para todos, amigo, jé pensou em usar triggers, direto pelo banco, se tu consegue todos os dados no primeiro insert, depois é só criar as triggers que o banco faz sozinho, mas tem que ver no seu host se eles vão te dar suporte ao uso de triggers, pois tem alguns hosts que não liberam tal recurso.

 

Olá,

 

A minha preocupação não seria a inserção propriamente dita, mas sim a interface com o usuário. Quero o usuário faça tudo que seja necessário em "tela" e daí quando ele terminar tudo... submeter de uma só vez essas informações no banco.

 

Peço desculpa, se não fui claro nas minhas colocações relativas a minha dúvida.

 

Grato..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use javascript e altere o DOM.

 

Crie elementos em um formulário, depois realize o submit, com todos os dados, de uma só vez.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, tenho isto aqui na nossa intranet, eu faço da seguinte forma:

salvo todo o pedido na sessão, e depois com um botão eu chamo o arquivo que finaliza o pedido e faz a inserção no BD, segue uma imagem do formulario

 

1zpmdjc.png

 

 

Depois entra o php:

<?php
include_once './cabecalho.php';
$msg='';

$objProdutos = new Produtos();
$objFuncionario = new Funcionarios();
$objPedidos = new Pedidos();
//SELECT PRODUTOS
$produtos=$objProdutos->montaSelec('produto_id',null," WHERE pro.qtde > 0 "); //TRAZ SOMENTE PRODUTOS COM QTDE MAIOR QUE ZERO
$wLista='<tr>
            <td>1</td>
            <td>'. $produtos.'</td>
            <td><input class="form-control" name="qtde" id="qtde" required=""></td>
            
         </tr>';

//AQUI FAZER UM BACALHAO PARA IR PREECHENDO OS ITENS DO PEDIDO
if (isset($_SESSION['pedidoi'])){
    $wCont=1;
    $wLista='';
    foreach ($_SESSION['pedidoi'] as $produto_id => $qtde) {
//    //AQUI FAZER BACHALHAU PARA PEGAR OS PRODUTOS DO BANCO
    $objProduto = new Produtos();
    $objProduto->id=$produto_id;
    $produto = $objProduto->SelectUm();
    $wLista.='<tr>
           <td>'.$wCont.'</td>
           <td><input type="hidden" name="produto_id" value="'.$produto_id.'">'.$produto->nome.'</td>
           <td><input type="text" class="form-control"  value="'.$qtde.'" readonly="on"></td>
            <td><button class="btn btn-danger btn-lx" type="button" onclick="ApagaColuna(this,'.$produto_id.');">Remover</button></td>
         </tr>';
    $wCont++;
    }
}
if ($_GET){
    //REMOVE ITEM DO PEDIDO
    $id = intval($_GET['excluir']);
    if(isset($_SESSION['pedidoi'][$id])){
        unset($_SESSION['pedidoi'][$id]);
        header("Location: pedidoIncluir.php");
        exit();
    }
}

if ($_POST){
    //VERIFICA SE FOI SELECIONADO ALGUM PRODUTO    
    //ADICIONA ITENS AO PEDIDO
    //CRIA A SESSÃO COM A CABEÇA DO PEDIDO
    //CRIA A SESSÃO COM O CORPO DO PEDIDO
    
    if ($_POST['produto_id']=="0"){
        escreve("INFORMAR UM PRODUTO");
    }else{
        //VERIFICA SE TEM EMPRESA DEFINIDA
        if (EMPRESA_ID=='' || EMPRESA_ID=='TD'){
            if ($_POST['empresa']=='0'){
                escreve("INFORMAR A EMPRESA");
            }else{
                if (EMPRESA_ID=='TD'){
                    $_SESSION['pedido']['empresa_id']=$_POST['empresa'];
                }
                //VERIFICA SE QUANTIDADE É IGUAL OU MAIOR QUE 0(ZERO)
                if ($_POST['qtde']<='0'){
                    escreve("INFORMAR QTDE MAIOR QUE ZERO");
                }else{
                    if (isset($_POST['adicionaItem'])){
                        $_SESSION['pedido']['data_cad']= date('y/m/d');
                        $_SESSION['pedido']['chave']=  session_id().$objPedidos->pegaUltimaID(); //PEGAR ALGUM DADO PARA DESEMPATAR
                        //CASO JA TENHA ADICIONADO O PRODUTO DA UM ELE VAI PEGAR O ÚLTIMO LANÇAMENTO.
                        $qtde_pro = intval($_POST['qtde']);
                        $_SESSION['pedidoi'][$_POST['produto_id']] = $qtde_pro;
                        header("Location: pedidoIncluir.php");
                        exit();
                    }
                }    
            }
        }        
    }
}
?>

Não sei se consegui ta ajudar, sou novo no PHP, com certeza deve ter algum modo mais simples de se fazer isto.

Mas é o modo que eu consegui fazer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use javascript e altere o DOM.

 

Crie elementos em um formulário, depois realize o submit, com todos os dados, de uma só vez.

 

Olá,

 

Entendi o seu raciocínio, mas te confesso que não sei como coloca-lo em prática. Exemplos de como fazer, mesmo que pequenos, me ajudariam muito.

 

Grato pela sua atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, tenho isto aqui na nossa intranet, eu faço da seguinte forma:

salvo todo o pedido na sessão, e depois com um botão eu chamo o arquivo que finaliza o pedido e faz a inserção no BD, segue uma imagem do formulario

 

1zpmdjc.png

 

 

Depois entra o php:

<?php
include_once './cabecalho.php';
$msg='';

$objProdutos = new Produtos();
$objFuncionario = new Funcionarios();
$objPedidos = new Pedidos();
//SELECT PRODUTOS
$produtos=$objProdutos->montaSelec('produto_id',null," WHERE pro.qtde > 0 "); //TRAZ SOMENTE PRODUTOS COM QTDE MAIOR QUE ZERO
$wLista='<tr>
            <td>1</td>
            <td>'. $produtos.'</td>
            <td><input class="form-control" name="qtde" id="qtde" required=""></td>
            
         </tr>';

//AQUI FAZER UM BACALHAO PARA IR PREECHENDO OS ITENS DO PEDIDO
if (isset($_SESSION['pedidoi'])){
    $wCont=1;
    $wLista='';
    foreach ($_SESSION['pedidoi'] as $produto_id => $qtde) {
//    //AQUI FAZER BACHALHAU PARA PEGAR OS PRODUTOS DO BANCO
    $objProduto = new Produtos();
    $objProduto->id=$produto_id;
    $produto = $objProduto->SelectUm();
    $wLista.='<tr>
           <td>'.$wCont.'</td>
           <td><input type="hidden" name="produto_id" value="'.$produto_id.'">'.$produto->nome.'</td>
           <td><input type="text" class="form-control"  value="'.$qtde.'" readonly="on"></td>
            <td><button class="btn btn-danger btn-lx" type="button" onclick="ApagaColuna(this,'.$produto_id.');">Remover</button></td>
         </tr>';
    $wCont++;
    }
}
if ($_GET){
    //REMOVE ITEM DO PEDIDO
    $id = intval($_GET['excluir']);
    if(isset($_SESSION['pedidoi'][$id])){
        unset($_SESSION['pedidoi'][$id]);
        header("Location: pedidoIncluir.php");
        exit();
    }
}

if ($_POST){
    //VERIFICA SE FOI SELECIONADO ALGUM PRODUTO    
    //ADICIONA ITENS AO PEDIDO
    //CRIA A SESSÃO COM A CABEÇA DO PEDIDO
    //CRIA A SESSÃO COM O CORPO DO PEDIDO
    
    if ($_POST['produto_id']=="0"){
        escreve("INFORMAR UM PRODUTO");
    }else{
        //VERIFICA SE TEM EMPRESA DEFINIDA
        if (EMPRESA_ID=='' || EMPRESA_ID=='TD'){
            if ($_POST['empresa']=='0'){
                escreve("INFORMAR A EMPRESA");
            }else{
                if (EMPRESA_ID=='TD'){
                    $_SESSION['pedido']['empresa_id']=$_POST['empresa'];
                }
                //VERIFICA SE QUANTIDADE É IGUAL OU MAIOR QUE 0(ZERO)
                if ($_POST['qtde']<='0'){
                    escreve("INFORMAR QTDE MAIOR QUE ZERO");
                }else{
                    if (isset($_POST['adicionaItem'])){
                        $_SESSION['pedido']['data_cad']= date('y/m/d');
                        $_SESSION['pedido']['chave']=  session_id().$objPedidos->pegaUltimaID(); //PEGAR ALGUM DADO PARA DESEMPATAR
                        //CASO JA TENHA ADICIONADO O PRODUTO DA UM ELE VAI PEGAR O ÚLTIMO LANÇAMENTO.
                        $qtde_pro = intval($_POST['qtde']);
                        $_SESSION['pedidoi'][$_POST['produto_id']] = $qtde_pro;
                        header("Location: pedidoIncluir.php");
                        exit();
                    }
                }    
            }
        }        
    }
}
?>

Não sei se consegui ta ajudar, sou novo no PHP, com certeza deve ter algum modo mais simples de se fazer isto.

Mas é o modo que eu consegui fazer.

 

Olá,

 

Aparentemente o seu exemplo servirá com ponto de partida para o que eu quero. Será que seguindo o seu método, eu não terei problemas com perda de dados no momento da inserção? Falo pelo fato de tudo estar em "memória".

 

Muito obrigatório pela sua atenção e se tiver algo a acrescentar, não se furte.

 

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, aqui eu nunca tive estes tipos de problemas, até pq o tráfego na nossa rede não é tão grande, mas se esta na sessão e depois vai pro banco...acho que não tem o que dar erro, lógico, teriamos que tratar possíveis erros.

Mas esta é um norte só né...heheh

 

abraços...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não precisa jogar em Sessions. Você pode passar em post desta mesma maneira. Apenas use inputs com o nome em comum e adicione "[]" ao final do name.

 

A lógica é esta (montei rapidamente para você):

http://codepen.io/maykelesser/pen/vGxVgp

 

Aí, quando der o submit, pega mais ou menos assim:

for ( $i = 0; $i < count( $_POST['txCampo'] ); $i++ ){
	// * Faz a inserção no seu banco de dados ;)
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Não precisa jogar em Sessions. Você pode passar em post desta mesma maneira. Apenas use inputs com o nome em comum e adicione "[]" ao final do name.

 

A lógica é esta (montei rapidamente para você):

http://codepen.io/maykelesser/pen/vGxVgp

 

Aí, quando der o submit, pega mais ou menos assim:

for ( $i = 0; $i < count( $_POST['txCampo'] ); $i++ ){
	// * Faz a inserção no seu banco de dados ;)
}

 

Olá Maykel-ctba, bom dia.

 

Pois é, acho que trabalhar com sessions tem lá as suas vantagens, mas penso que para o meu caso não ficaria muito legal não, haja vista que o meu "submit" será meio extenso, aonde o mesmo terá uma tabela mestre e quatro tabelas detalhes, e isso sem falar que uma dessas detalhes poderá ter até mais de cem registros por "submit" relacionado com a sua mestre.

 

Outra dúvidas:

Utilizando essa "técnica" não terei problemas com perda de registros? Não falo com relação ao DB, mas sim com os dados que estão nos inputs.

 

Muitíssimo obrigado pela sua atenção e aguardo pelo seu comentário.

 

Forte abraço!

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia.

 

Por que você não trabalha com tabelas temporárias?
Vamos supor um caso, como o que tenho aqui na empresa.Desenvolvi uma interface Web para inserção de pedidos no ERP.
A interface se conecta diretamente no SQL do ERP.

Quando o usuário inicia um novo pedido, o sistema automaticamente atribui um ID para ele, e o usuário seleciona o cliente, forma de pagamento e outros dados do pedido.

Em relação aos itens, conforme ele vai adicionando os produtos no pedido, eu vou gravando-os em uma tabela temporária, chamada "##PedidoDeVendaItem_" + o ID do pedido gerado.

Quando o usuário clica em "Gravar Pedido", eu insiro as informações do "cabeçalho do pedido", digamos assim, que são o cliente, o ID, o número e etc, na tabela de PedidoDeVenda, e na mesma hora faço uma consulta na tabela temporária de produtos, e adiciono os registros na tabela oficial.

Assim, existe apenas um submit de dados ao se gravar o pedido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, eu uso isso num formulário enorme. Se você inserir corretamente, não terá riscos com perda de registros. Faça bastantes testes antes.

Beleza.

 

Grato pela sua atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia.

 

Por que você não trabalha com tabelas temporárias?

Vamos supor um caso, como o que tenho aqui na empresa.Desenvolvi uma interface Web para inserção de pedidos no ERP.

A interface se conecta diretamente no SQL do ERP.

Quando o usuário inicia um novo pedido, o sistema automaticamente atribui um ID para ele, e o usuário seleciona o cliente, forma de pagamento e outros dados do pedido.

Em relação aos itens, conforme ele vai adicionando os produtos no pedido, eu vou gravando-os em uma tabela temporária, chamada "##PedidoDeVendaItem_" + o ID do pedido gerado.

 

Quando o usuário clica em "Gravar Pedido", eu insiro as informações do "cabeçalho do pedido", digamos assim, que são o cliente, o ID, o número e etc, na tabela de PedidoDeVenda, e na mesma hora faço uma consulta na tabela temporária de produtos, e adiciono os registros na tabela oficial.

 

Assim, existe apenas um submit de dados ao se gravar o pedido.

 

Entendi. Vou teste isso depois.

 

Grato pela sua atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O uso de tabelas temporárias é um contorno para as limitações de certas linguagens. Usadas principalmente em linguagens mais ultrapassadas ou, em alguns casos, pois "sempre foi assim". O caso mais simples é quando o sistema/linguagem não consegue manter dados em nível de aplicação, sessão ou client.

 

Além de gerar overhead de transação (aumentando o I/O com o SGBD) as tabelas temporárias são desnecessárias no seu caso.

Na época que me questionou sobre exemplos, acabei ficando sem acessar o fórum, veja se o que há abaixo pode lhe ajudar:
http://www.randomsnippets.com/2008/02/21/how-to-dynamically-add-form-elements-via-javascript/
http://www.dustindiaz.com/add-and-remove-html-elements-dynamically-with-javascript/
http://stackoverflow.com/questions/14853779/adding-input-elements-dynamically-to-form
http://jsfiddle.net/jaredwilli/tzpg4/4/ (usando jQuery, o que não é necessário, mas a lógica vai ajudar)

Enviando array através de post:
http://forum.imasters.com.br/topic/462549-resolvidoretornar-array-de-inputs-com-mesmo-nome/

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.