Ir para conteúdo

POWERED BY:

Arquivado

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

pedrovisk

For Each com erro ao inserir

Recommended Posts

Turma,

 

Estou trabalhando com um For Each..., conforme abaixo.

 

IDCotacao	= Request.Form("ID")
IDAgente		= Int(Session("IDEmissor"))
DtEmbarque	= Trim(Request.Form("DtEmbarque"))
Hora		= Trim(Request.Form("Hora"))
Origem		= Trim(Request.Form("Origem"))
Destino		= Trim(Request.Form("Destino"))

DtEmbarque	= Split(DtEmbarque,",")
Hora		= Split(Hora,",")
Origem		= Split(Origem,",")
Destino		= Split(Destino,",")

I=0
For Each Item in Request.Form()
  SQL = "INSERT INTO Cotacao_Roteiro_Viagem (IDCotacao, DtEmbarque, Hora, Origem, Destino) VALUES ("&IDCotacao&", '"&DtEmbarque(I)&"', '"&Hora(I)&"', '"&Origem(I)&"', '"&Destino(I)&"')"
  'Response.Write(SQL)
  'Response.End()
  Set rs = Conx.Execute(SQL)
i = i+1
Next

O formulário está com 10 linhas, iguais as do código abaixo:

 

<tr bgcolor="#FFFFFF">
<td align="right"><strong>1</strong></td>
<td align="left"><input name="DtEmbarque" type="text" class="Caixa" id="DtEmbarque" value="" size="10" maxlength="10" /></td>
<td nowrap="nowrap"><input name="Hora" type="text" class="Caixa" id="Hora" value="" size="10" maxlength="5" /></td>
<td valign="top" nowrap="nowrap"><input name="Origem" type="text" class="Caixa" id="Origem" value="" maxlength="3"/></td>
<td nowrap="nowrap"><input name="Destino" type="text" class="Caixa" id="Destino" value="" maxlength="3"/></td>
</tr>

Quando vou inserir no BD, conforme Query abaixo:

 

INSERT INTO Cotacao_Roteiro_Viagem (IDCotacao, DtEmbarque, Hora, Origem, Destino) VALUES (3, '01/05/2009', '0000', 'FOR', 'REC')

Gera a seguinte mensagem de erro:

 

Microsoft OLE DB Provider for SQL Server (0x80040E57)

String or binary data would be truncated.

/cc/Cotacao/Processa_Roteiro_Viagem.asp, line 30

 

A linha 30 é justamente a linha do SQL, conforme acima.

 

Pedro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dentro do FOR você não precisa somar i + 1

 

Ao invés de utilizar Set rs = Conx.Execute(SQL), coloque apenas Conx.Execute(SQL)

 

Quais campos são chave primaria na sua tabela? Lembre-se, chave primária não pode ser repetida.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hargon,

 

Mas desta forma, ele está inserindo 6x a primeira linha de registro, ou seja, a segunda linha que foi preenchida no form não entra no BD e ainda repete por 6x a mesma linha. Conforme abaixo:

 

1 3 1/5/2009 0000 FOR REC

2 3 1/5/2009 0000 FOR REC

3 3 1/5/2009 0000 FOR REC

4 3 1/5/2009 0000 FOR REC

5 3 1/5/2009 0000 FOR REC

6 3 1/5/2009 0000 FOR REC

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente, não vi que o I não fazia parte do FOR.

 

Mantenha como estava essa parte.

 

Mas sobre a tabela, como está? A chave primária está correta? Os outros campos são texto?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hargon,

 

A tabela está assim:

 

IDRoteiro int 4 (Identity = Yes)

IDCotacao int 4

DtEmbarque datetime 8

Hora char 5

Origem char 3

Destino char 3

QtdDias int 4

 

Deixei o código assim:

 

I=0
For Each Item in Request.Form()
SQL = "INSERT INTO Cotacao_Roteiro_Viagem (IDCotacao, DtEmbarque, Hora, Origem, Destino) VALUES ("&IDCotacao&", '"&DtEmbarque(I)&"', '"&Hora(I)&"', '"&Origem(I)&"', '"&Destino(I)&"')"
'Response.Write(SQL)
'Response.End()
Conx.Execute(SQL)
Next
i=i+1

E continua REPETINDO a PRIMEIRA linha 6x, conforme explique anteriormente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas você colocou o i = i +1 fora do FOR. Você tinha que voltar essa parte conforme estava antes, dentro do FOR.

 

IDRoteiro é autonumeração? QtdDias pode ser nulo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hargon,

 

Respondendo:

IDRoteiro é autonumeração? SIM

QtdDias pode ser nulo? SIM

 

Corrigi conforme sua instrução, veja:

 

I=0
For Each Item in Request.Form()
SQL = "INSERT INTO Cotacao_Roteiro_Viagem (IDCotacao, DtEmbarque, Hora, Origem, Destino) VALUES ("&IDCotacao&", '"&DtEmbarque(I)&"', '"&Hora(I)&"', '"&Origem(I)&"', '"&Destino(I)&"')"
'Response.Write(SQL)
'Response.End()
Conx.Execute(SQL)
i = i+1
Next

Desta forma só insere uma linha, ou seja, NÃO REPETE mais 5x.

 

A tela do meu form está assim:

 

Imagem Postada

 

E o código do meu form está assim:

 

<input name="DtEmbarque" type="text" class="Caixa" id="DtEmbarque" value="" size="10" maxlength="10" />
<input name="Hora" type="text" class="Caixa" id="Hora" value="" size="10" maxlength="5" />
<input name="Origem" type="text" class="Caixa" id="Origem" value="" maxlength="3"/>
<input name="Destino" type="text" class="Caixa" id="Destino" value="" maxlength="3"/>

E o erro continua assim:

 

Microsoft OLE DB Provider for SQL Server (0x80040E57)

String or binary data would be truncated.

 

Não sei onde está este erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aumenta o tamanho do seu campo DtEmbarque, ele é 8, mas você está inserindo 10 caracteres.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hargon,

 

É um campo datime. Ele não permite que eu altere o tamanho. Será que realmente isto?

 

Obrigado pela ajuda,

 

Pedro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse erro ocorre quando você tenta inserir um valor com tamanho maior do que o campo pode receber.

 

Por tudo que você postou deu a entender que a data é o único campo com tamanho incorreto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hargon,

 

Sinceramente eu não sei onde está o problema. Não consigo inserir estas informações no BD através do For Each. Você sabe informar qual sei outra saída?

 

Obrigado pela ajuda,

 

Pedro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta assim:

SQL = "INSERT INTO Cotacao_Roteiro_Viagem (IDCotacao, DtEmbarque, Hora, Origem, Destino) VALUES ("&IDCotacao&", convert(datetime,'"&DtEmbarque(I)&"',103) , '"&Hora(I)&"', '"&Origem(I)&"', '"&Destino(I)&"')"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ao lidar com colunas CHAR / VARCHAR , e não validar o input do user , você pode ter todo este erro,normalmente, é causado por tentar inserir caracteres maiores do que os definidos em uma coluna. Por exemplo

 

INSERT #foo(bar) VALUES('xanxanxanxan')

 

usando métodos (como, maxlength ou JavaScript) para impedir que esses dados sejam apresentados,ou ajustando a definição coluna (s) para ter em conta a duração provável dos dados, ou adaptar os dados recebidos para caber na coluna , por exemplo:

 

<% 
	bar = replace(left(request.form("bar"),5),"'","''") 
	sql = "INSERT #foo(bar) VALUES('" & bar & "')" 
	' ... 
%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Respondendo:

IDRoteiro é autonumeração? SIM

QtdDias pode ser nulo? SIM

Se o IDRoteiro é autonumeração, e você está inserindo várias vezes o mesmo, então este é o erro.

Campo com Autonumeração, você não precisa inseri-lo na Query.

E pelo seu formulário, se 3 pessoas diferentes fizerem o cadastro, você estará tentando colocar 3x cada IDRoteiro. Ou seja, o ID que você está passando não está sendo "AutoNumerado".

Uma vez que ele é a PK da sua table, a repetição dele causa o erro.

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.