none
Como fazer múltiplos Inserts em DB através de formulário? RRS feed

  • Pergunta

  • Olá pessoal,

    Estou fazendo um sistema de agenda aonde um funcionário da empresa pode criar um agendamento igual para vários funcionários, ex: José, Maria e João terão uma reunião no dia 05/03 ás 9:00. Nesse caso, as mesmas informações de dia e hora serão gravadas para todos os funcionários selecionados no formulário, dentro da mesma tabela do db. O insert funciona se eu selecionar apenas um nome de cada vez em uma lista, mas se eu selecionar vários, ele retorna o seguinte erro:

    Tipo de erro:
    Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
    [Microsoft][Driver ODBC para Microsoft Access] Não é possível adicionar ou alterar registros, pois é necessário que eles tenham um registro relacionado na tabela 'funcionarios'.


    Andei pesquisando na internet, e parece que a instrução INSERT deve estar dentro de um laço for, mas os testes que andei fazendo por aqui não funcionaram. É possível fazer isso? Ou seria o caso de jogar os nomes dentro de um array?

    Segue abaixo o código:

    1) Formulário para selecionar os funcionários:

    <select name="funcionarios" size="5" multiple="multiple" class="formulario" id="funcionarios">
        <option selected="selected">--- Escolha o(a) Consultor(a)</option>
        <% Do While Not rs.EOF %>
          <option><%= rs.Fields("nomefuncionario") %></option>
          <%
            rs.MoveNext
            Loop
           
            rs.Close
            conexao.Close
           
            Set rs = Nothing
            Set conexao = Nothing
          %>
         
        </select>


    2) instrução INSERT

    Set conexao = Server.CreateObject("ADODB.Connection")
    Set rs = Server.CreateObject("ADODB.Recordset")

    conexao.Open "Driver={Microsoft Access Driver (*.mdb)};DBQ=..."

    For Each Request.Form("funcionarios")

    rs.Open "INSERT INTO agendaRTS (nomefuncionario, data, horainicial, horafinal, servicosrealizados, empresa, contato, cargo, departamento) VALUES ('"& Request.Form("funcionarios") &"','"& data &"','"& Request.Form("horainicial") &"','"& Request.Form("horafinal") &"','"& Request.Form("assunto") &"','"& Request.Form("clientes") &"','"& Request.Form("contato") &"','"& Request.Form("cargo") &"','"& Request.Form("departamento") &"')", conexao

    Next


    Grato pela atenção,

    Marcelo Silveira
    quarta-feira, 4 de março de 2009 13:16

Respostas

Todas as Respostas

  • Marcelo essa lista de funcionários no formulário esta sendo exibido checkbox??

    Abraço

    Estevam

    **** Se a reposta foi útil, então não esqueça de marca-lá. ***
    segunda-feira, 9 de março de 2009 12:42
  • Ola, Estevam.

    Nõa, a lista não está como checkbox, e sim como lista de seleção (List/Menu), com a opção allow multiple selecionada, ou seja, a pessoa abre uma lista com todos os nomes e pode selecionar vários com o a tecla ctrl.

    att,

    Marcelo Silveira
    segunda-feira, 9 de março de 2009 14:12
  • Marcelo, creio que você tenha que fazer um for each no campo do formulário e não no próprio form, fiz um teste abaixo para você ver como funciona. É só criar uma nova página asp e colar e veja como funciona.

    <
    Dim ddTeste : ddTeste = Request.Form("ddTeste") 
    Response.Write("Valores dentro campo de formulário: " & ddTeste) 
     
    Response.Write("<br />") 
    Response.Write("Valores após tratamento: <br />") 
    Dim arrayTeste : arrayTeste = split(ddTeste,",") 
    For Each i in arrayTeste 
        Response.Write(i & "<br />") 
    Next 
    %> 
    <html> 
    <head> 
        <title>teste</title> 
    </head> 
    <body> 
        <form action="" method="post"
            <select name="ddTeste" multiple="multiple"
                <option value="opt1">Valor1</option> 
                <option value="opt2">Valor2</option> 
                <option value="opt3">Valor3</option> 
                <option value="opt4">Valor4</option> 
                <option value="opt5">Valor5</option> 
            </select> 
            <br /> 
            <input type="submit" name="btnTeste" value="Enviar" /> 
        </form> 
    </body> 
    </html> 


    Abraços

    Estevam




    **** Se a reposta foi útil, então não esqueça de marca-lá. ***
    segunda-feira, 9 de março de 2009 17:00
  • Eu tentei dessa forma, colocando dentro do laço for o comando sql, só que no db todos os nomes foram inserido no mesmo registro, e estou tentando inserir um nome por registro.

    Ex: registro 1 - nome: José // dia - 15/03/2009 // local - auditório.... etc
         registro 2 - nome: Maria // dia - 15/03/2009 // local - auditório.... etc
         registro 3 - nome: João // dia - 15/03/2009 // local - auditório.... etc

    Desse jeito que vc me passou, ficou assim:

    registro 1 - nome: José, Maria, João // dia - 15/03/2009 // local - auditório.... etc

    Tem como separar isso em múltiplos registros?

    att,

    Marcelo Silveira
    terça-feira, 10 de março de 2009 17:53
  • Marcelo, você deve fazer o for somente para o campo e não para o form (so existir mais de um form na pagina), os nomes estão entrando desta forma porque você não esta tratando o campo conforme lhe mostrei no exemplo.
    Se não conseguir envia o código para poder visualizar melhor o que esta acontecendo

    Abraço

    Estevam

    **** Se a reposta foi útil, então não esqueça de marca-lá. ***
    quarta-feira, 11 de março de 2009 13:13
  • Lá vai o código:

    1) Página que tem o formulário:

    Set conexao = Server.CreateObject("ADODB.Connection") 
    Set rs = Server.CreateObject("ADODB.Recordset") 
     
    conexao.Open "...
    rs.Open "SELECT * FROM funcionarios ORDER BY nomefuncionario", conexao 
    %> 
     
    <form id="form1" name="form1" method="post" action="geraAgenda.asp"
     
     
    <select name="funcionarios" size="5" multiple="multiple" class="formulario" id="funcionarios" > 
        <option selected="selected">--- Escolha o(a) Consultor(a) ---</option> 
        <% Do While Not rs.EOF %> 
          <option><%= rs.Fields("nomefuncionario") %></option
          <
            rs.MoveNext 
            Loop         
            rs.Close 
            conexao.Close 
             
            Set rs = Nothing 
            Set conexao = Nothing 
          %> 
        </select>

    Daqui para baixo são campos de formulário comuns, com escolha de datas, horários, etc.

    2) Página que grava os dados no DB:

    Set conexao = Server.CreateObject("ADODB.Connection") 
    Set rs = Server.CreateObject("ADODB.Recordset") 
     
    conexao.Open "... 
     
    Dim funcionarios : funcionarios = Request.Form("funcionarios")  
    Dim arrayTeste : arrayTeste = split(funcionarios,",")  
     
    For Each i in arrayTeste  
     
    rs.Open "INSERT INTO agendaRTS (nomefuncionario, data, horainicial, horafinal, servicosrealizados,
    empresa, contato, cargo, departamento) VALUES ('"& Request.Form("funcionarios") &"'
    ,'"& data &"','"& Request.Form("horainicial") &"','"& Request.Form("horafinal") &"'
    ,'"& Request.Form("assunto") &"','"& Request.Form("clientes") &"','"& Request.Form("contato") &"'
    ,'"& Request.Form("cargo") &"','"& Request.Form("departamento") &"')", conexao 
     
    Next  
     
    rs.Close 
    conexao.Close 
     
    set rs = nothing 
    set conexao = nothing 
    %> 

    O engraçado é que além dejogar todos os nomes no mesmo registro, o código cria também um número de registrosconforme o número de nomes selecionados no formulário. Ex: 3 nomes selecionados ( José, Maria e João)

         registro 1 - nome: José, Maria, João // dia - 15/03/2009 // local - auditório.... etc
         registro 2 - nome: José, Maria, João // dia - 15/03/2009 // local - auditório.... etc
         registro 3 - nome: José, Maria, João // dia - 15/03/2009 // local - auditório.... etc

    Grato,

    Marcelo Silveira
    quarta-feira, 11 de março de 2009 15:14
  • Marcelo, o erro esta justamente que no insert você esta utilizando o campo vindo do form e não o valor do array dentro da interação. Seu código de insert deve ficar como o abaixo:

    rs.Open "INSERT INTO agendaRTS (nomefuncionario, data, horainicial, horafinal, servicosrealizados, 
    empresa, contato, cargo, departamento) VALUES ('"& i &"' 
    ,'"& data &"','"& Request.Form("horainicial") &"','"& Request.Form("horafinal") &"' 
    ,'"& Request.Form("assunto") &"','"& Request.Form("clientes") &"','"& Request.Form("contato") &"' 
    ,'"& Request.Form("cargo") &"','"& Request.Form("departamento") &"')", conexao  


    Repare que no lugar de Request.Form("funcionarios"), eu troquei por "i" que é o item do array no momento.


    Abraço

    Estevam




    **** Se a reposta foi útil, então não esqueça de marca-lá. ***
    quarta-feira, 11 de março de 2009 17:33
  • Olá, Estevam,

    Realmente do seu jeito funcionou, só que tem um probleminha. O primeiro nome selecionado da lista é armazenado sem problemas no DB, mas a partir do segundo nome é adicionado um espaço em branco no início do nome, provavelmente no lugar da vírgula que dividia os nomes no array. Preciso tirar esse espaço, pois ele não permite que eu recupere as informações em outra página que busca o nome do funcionário. Tentei usar Trim e LTrim da seguinte maneira:

    Set conexao = Server.CreateObject("ADODB.Connection") 
    Set rs = Server.CreateObject("ADODB.Recordset") 
     
    conexao.Open "...
     
    Dim funcionarios : funcionarios = Request.Form("funcionarios")   
    Dim arrayNomes : arrayNomes = split(funcionarios,",")   
    LTrim ("i") // ou Trim ("i") 
    For Each i in arrayNomes   
     
    rs.Open "INSERT INTO agendaRTS (nomefuncionario, data, horainicial, horafinal, servicosrealizados, empresa, contato, cargo, departamento) VALUES ('"& i &"','"& data &"','"& Request.Form("horainicial") &"','"& Request.Form("horafinal") &"','"& Request.Form("assunto") &"','"& Request.Form("clientes") &"','"& Request.Form("contato") &"','"& Request.Form("cargo") &"','"& Request.Form("departamento") &"')", conexao 
     
    Next 

    mas continua com o mesmo problema, tem algum jeito de corrigir isso?

    Grato,

    Marcelo Silveira
    quarta-feira, 11 de março de 2009 19:55
  • Marcelo, o Trim e LTrim sao funções então não coloque espaço para utiliza-las.
    Trim(i)
    LTrim(i)

    Outra forma seria o Replace:

    Replace(i, " ", "")
    Mais informações sobre Replace: http://www.w3schools.com/Vbscript/func_replace.asp

    Abraço

    Estevam

    **** Se a reposta foi útil, então não esqueça de marca-lá. ***
    • Marcado como Resposta Marcelo Silveira quinta-feira, 12 de março de 2009 13:24
    quinta-feira, 12 de março de 2009 12:50
  • Agora funcionou!!! Muito Obrigado!!!!
    quinta-feira, 12 de março de 2009 13:26