Ir para conteúdo

Arquivado

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

duarte69

[Resolvido] Run-time error '3001'

Recommended Posts

Boas, aqui estou eu outra vez com mais um erro ao ligar o VB a uma base de dados.

 

Desta vez o erro é o seguinte: Run-time error '3001' --> "Os argumentos são do tipo incorrecto, estão fora do intervalo aceitável ou estão em conflito uns com os outros"

 

 

O código é o seguinte:

 

CODE
Private Sub confirmar_Click()

Dim arm_correct As String

Dim cn1 As New ADODB.Connection

Dim rs1 As New ADODB.Recordset

Dim cn2 As New ADODB.Connection

Dim rs2 As New ADODB.Recordset

 

cn1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\ATI(pen)\MDB\projectotecnologico.mdb;Persist Security Info=False"

cn2.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\ATI(pen)\MDB\projectotecnologico.mdb;Persist Security Info=False"

cn1.Open

cn2.Open

rs1.Open "SELECT * FROM Produtos WHERE (referencia = '" & ref.Text & "')", cn, 3, 3

rs2.Open "SELECT * FROM Armazém", cn, 3, 3

If rs1.EOF Then

MsgBox "Referência inválida", vbExclamation, "ERRO"

 

ElseIf rs1!cod_armazem = "AZ" Then

 

rs2.Open "SELECT * FROM Armazém", cn, 3, 3

rs2.AddNew

rs2!referencia = rs1!referencia

rs2!tipo_produto = rs1!tipo_produto

rs2!cod_produto = rs1!cod_produto

rs2!qualidade = rs1!qualidade

rs2!calibre = rs1!calibre

rs2!peso = rs1!peso

rs2!lote = rs1!lote

rs2!hora = rs1!hora

rs2!data = rs1!data

rs2!cod_armazem = rs1!cod_armazem

local_armazem

rs2.Update

Else

arm_correct = rs1!armazem

MsgBox "Armazém errado, por favor dirija-se ao armazém & arm_correct", vbExclamation, "ERRO"

End If

cn1.Close

cn2.Close

End Sub

O erro aponta para a linha a negrito.

 

O que estou a tentar fazer é copiar dados de uma tabela para a outra, ambas pertencem à mesma base de dados.

 

O tipo de dados do campo é "texto" e suporta até 255 caracteres.

 

Os dados que estou a introduzir são, por exemplo: 152543fvAZ3212008

 

A SQL em Access trabalha bem e não dá erro.

 

Se alguém poder ajudar mais uma vez agradecia, e desculpem estar sempre a perguntar coisas, mas estou a aprender.

 

Cumps

 

ps: já agora, é necessário ter cn1 e cn2 ou basta ter um?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se os dois recordsets estão conectando no mesmo banco de dados (mesmo arquivo acess), não precisa de dois connections não. Apenas um basta.

 

E seu erro, acredito eu, esteja em quando você mandou usar cn para se conectar. E você não tem a variável cn, e sim cn1 e cn2.

 

O certo (caso sejam dois arquivos acess):

 

rs1.Open "SELECT * FROM Produtos WHERE (referencia = '" & ref.Text & "')", cn1, 3, 3

rs2.Open "SELECT * FROM Armazém", cn2, 3, 3

 

Ou (caso seja um arquivo acess):

 

rs1.Open "SELECT * FROM Produtos WHERE (referencia = '" & ref.Text & "')", cn1, 3, 3

rs2.Open "SELECT * FROM Armazém", cn1, 3, 3

 

Abraços...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma pergunta, o Bd é o msm?

Pq percebi que você utiliza duas variáveis do tipo conexão para linkar ao msm bd,

e as utiliza separadamente uma pra cada tabela.

 

Além do que você declara as conexões como "cn1" e "cn2", e quando tenta abrir uma tabela coloca a referência "cn"

 

não sei se vai resolver, mas Tenta tipow, eliminar umas das conexões e usar somente a outra, e desta vez utilizar a referência certa por exemplo:

 

cn1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\ATI(pen\MDB\projectotecnologico.mdb;Persist Security Info=False"
rs1.Open "SELECT * FROM Produtos WHERE (referencia = '" & ref.Text & "')", cn1, 3, 3
rs2.Open "SELECT * FROM Armazém", cn1, 3, 3

E sempre que precisar chamar a conexão, em vez de "cn", usar o "cn1"

 

Tenta ai mano

É isso ae XD

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boas,

 

O problema era mesmo esse, são erros mesmo estúpidos, mas eu não tenho experiência nenhuma nisto. Obrigado pela ajuda e pela resposta rápida.

Já agora, podem explicar o que fazem o 3,3 ??

 

Esse problema está resolvido, mas agora está a dar outro mais à frente:

 

CODE
'atribuir localização aos produtos do armazém

Private Sub local_armazem()

Dim line!, column!, floor!

Dim cn As New ADODB.Connection

Dim rs As New ADODB.Recordset

Dim rsverificar As New ADODB.Recordset

 

 

cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\ATI(pen)\MDB\projectotecnologico.mdb;Persist Security Info=False"

cn.Open

rs.Open "SELECT * FROM Produtos WHERE (referencia = '" & ref.Text & "')", cn, 3, 3

 

'se=ervilha

If rs!cod_produto = "ee" Then

If rs.RecordCount = 200 Then 'verificar se a zona está cheia

MsgBox "Zona cheia, dirija-se ao armazém Laranja", vbCritical, "Zona Cheia"

Else

REPEATee:

line = Int((2 * Rnd) + 1)

column = Int((20 * Rnd) + 1)

floor = Int((5 * Rnd) + 1)

rsverficar.Open "SELECT * FROM Armazem WHERE (zona = 1) and (linha = line) and (coluna=column) and (andar = floor)", cn, 3, 3

If rs.EOF Then

rs1!zona = 1

rs1!linha = line

rs1!coluna = column

rs1!andar = floor

Else

GoTo REPEATee

End If

End If

Diz "Object required" e aponta para a linha a negrito.

O rs1 pertence ao Main que por sua vez chama a função "local_armazem", mas ele está a dar erro num rs feito nesta função, não percebo onde está o erro.

 

Mais uma vez agradeço a vossa ajuda.

 

Cumps

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, vamos lá:

 

Me diga o que são, na string abaixo: "line", "column" e "floor".

 

rsverficar.Open "SELECT * FROM Armazem WHERE (zona = 1) and (linha = line) and (coluna=column) and (andar = floor)", cn, 3, 3

 

Se forem variáveis declaradas no programa, você precisa colocar entre aspas e contatenar com a string do banco:

 

rsverficar.Open "SELECT * FROM Armazem WHERE (zona = 1) and (linha = '" & line & '") and (coluna= '" & column & "') and (andar = '" & floor & "')", cn, 3, 3

 

Se forem valores que estão na tabela, precisa colocar entre aspas simples:

 

rsverficar.Open "SELECT * FROM Armazem WHERE (zona = 1) and (linha = 'line') and (coluna= 'column') and (andar = 'floor')", cn, 3, 3

 

Acredito que a primeira opção que dei deve ser a correta, mas de qualquer forma veja o que se encaixa ai, tenta e avisa se deu erro.

 

Abraços...

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.