Usuário com melhor resposta
Como fazer múltiplos Inserts em DB através de formulário?

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
Respostas
-
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
Todas as Respostas
-
-
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
-
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á. *** -
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
-
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á. *** -
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") &"')", conexaoNext 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
-
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á. *** -
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
-
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
-