Jump to content
Retsu9

Listar Produtos

Recommended Posts

Retsu9

Boas,

eu recentemente tenho andado a desenvolver um projecto para a empresa em que estou a trabalhar para gestão de stocks.

tenho tudo já praticamente feito só que no entanto surgiu algo que preciso implementar, não é dificil eu sei, mas secalhar por andar a martelar de mais ja nao consigo pensar direito xDD

é o seguinte eu tenho essencialmente , para este problema 3 tabelas: obras, produtos e a tabela relacional produtos_obras.

eu tenho para cada obra os produtos que se usaram , ate aqui tudo bem.

Agora nos produtos eu queria listar um historico desse produto, do genero: o produto X foi para a obra Y no dia 8, mas o mesmo produto X foi para a obra Y no dia 9, no historico aparecia duas linhas , uma no dia 8 e outra para o dia 9,

Alguma dica?

Cumps

Share this post


Link to post
Share on other sites
Retsu9

ja consegui separar, na tabela relacional coloquei 3 chaves primarias: idprod, idobra, e data .

mas quando eu quero update a quantidade de um produto com a mesma data ele nao faz .. eu tenho isto :

query = "Update obras_prod Set Quantidade=Quantidade + " & Val(txt_qtd.Text) & " Where ID_prod='" & produto & "' And ID_obra=" & IDOBRA & " And Data=" & data & ""
    executar_query_nonReader(query)
    MsgBox(aux)
    If aux = 0 Then
	    query = "Insert Into obras_prod (ID_prod,ID_obra,Quantidade,Data) Values('" & produto & "'," & IDOBRA & "," & txt_qtd.Text & ",'" & data & "')"
	    executar_query_nonReader(query)
    End If

ele nao retorna qualquer valor na isntruçao update, logo passa para o insert, e ai como é logico da erro pq ia criar valores duplicados. mas se eu estou a tentar update com o msm idprod, o msm idobra e a mesma data ele não deveria fazer corretamente o update sem passar ao insert?

Share this post


Link to post
Share on other sites
vikcch

Podes usar o INSERT INTO e o UPDATE na mesma query:

ele nao retorna qualquer valor na isntruçao update, logo passa para o insert, e ai como é logico da erro pq ia criar valores duplicados. mas se eu estou a tentar update com o msm idprod, o msm idobra e a mesma data ele não deveria fazer corretamente o update sem passar ao insert?

e faz o update?

essa var aux é global?? não devias retornar esse valor se fez o update ou não nesta sub "executar_query_nonReader(query)"

guardar datas como id não deve ser boa ideia.. podes estar a gravar com as horas... vê isso que o problema deve ser com esse campo....

Podes juntar as 2 querys em uma só:

INSERT INTO obras_prod (ID_prod,ID_obra,Quantidade,Data) VALUES ('" & produto & "'," & IDOBRA & "," & txt_qtd.Text & ",'" & data & "') ON DUPLICATE KEY UPDATE Quantidade=Quantidade + " & Val(txt_qtd.Text)

Share this post


Link to post
Share on other sites
Retsu9

não ele nao faz o update, aquela variavel aux é o valor disto : aux = cmd.ExecuteNonQuery()

retorna 0, se supostamente nao houver linhas afetadas na tabela, mas vou experimentar esse codigo

eu pus essa instrução e diz que falta ponto e virgula no fim da instrução, nunca utilizei ponto e virgula no VB, mas tentei colocar e continua a dar o mesmo erro.

 query = "INSERT INTO obras_prod (ID_prod,ID_obra,Quantidade,DATA) VALUES ('" & produto & "'," & IDOBRA & "," & txt_qtd.Text & ",'" & data & "') ON DUPLICATE KEY UPDATE Quantidade=Quantidade + " & Val(txt_qtd.Text) & ""

Share this post


Link to post
Share on other sites
Retsu9

mesmo usando essa instrução diretamente no access dá me o mesmo erro, será que nao aceita esse comando?

Share this post


Link to post
Share on other sites
vikcch

Pelo que vi o access não tem o ON DUPLICATE KEY UPDATE...

o problema deve ser aí nas datas como tinha dito.... acho que quando gravas só a data na base de dados a hora é como ficasse 00:00:00 e depois ou comparares dá pau... mas tb não faz muito sentido porque quando compraras tb usas 00:00:00 com sendo a hora....

Experimenta assim:

Dim data As Date = Date.Today
Dim query As String = "UPDATE obras_prod SET Quantidade=Quantidade + " & Val(txt_qtd.Text) & " WHERE ID_prod=" & produto & " AND ID_obra=" & IDOBRA & " AND Data>=#" & data & "# AND Data<# " & data.AddDays(1) & "#"

Share this post


Link to post
Share on other sites
Retsu9

boas,

essa solução também nao da... eu nao estou a perceber porque a data vem sem hora eu faço uma msgbox com o valor que está a vir na variavél data e vem s a data sem hora...

Share this post


Link to post
Share on other sites
vikcch

fiz este exemplo e funciona...

os campos na base de dados são todos numericos menos o "data" que é data/hora e está formatado para "data abreviada"

	    Dim produto As Integer = 25
    Dim IDOBRA As Integer = 1
    Dim data As Date = Date.Today

    Dim ConnectionString As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Application.StartupPath & "\BD.accdb; Persist Security Info=False;")
    ConnectionString.Open()

    Dim query As String = "UPDATE obras_prod SET Quantidade=Quantidade + " & Val(txt_qtd.Text) & " WHERE ID_prod=" & produto & " AND ID_obra=" & IDOBRA & " AND Data>=#" & data & "# AND Data<# " & data.AddDays(1) & "#"

    Dim command As New OleDbCommand(query, ConnectionString)

    If command.ExecuteNonQuery() < 1 Then

	    query = "INSERT INTO obras_prod(ID_prod, ID_obra, Data, Quantidade) VALUES (" & produto & "," & IDOBRA & ",'" & data & "'," & Val(txt_qtd.Text) & ")"

	    command = New OleDbCommand(query, ConnectionString)

	    If command.ExecuteNonQuery() < 1 Then
		    MessageBox.Show("Erro ao inserir", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)
	    Else
		    MessageBox.Show("Registo inserido com sucesso!", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Information)
	    End If

    Else
	    MessageBox.Show("Fez o update com sucesso!", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Information)
    End If

    ConnectionString.Close()
    command = Nothing

Share this post


Link to post
Share on other sites
Retsu9

diz que não foi fornecido valores para um ou mais parametros necessários

 Dim produto As String = lst_produtos.SelectedItem.Split("|")(0)
    Dim preco As Decimal
    Dim data As Date
    If chkb_data.Checked = True Then
	    data = Date.Today
    Else
	    data = dtp_data.Text
    End If
    'Format(data, "dd/MM/yyyy")
    MsgBox(data)
    query = "Select Preco_Compra From produtos Where ID='" & produto & "'"
    dr = executar_query_Reader(query)
    While dr.Read
	    preco = dr("Preco_Compra")
    End While
    con.Close()
    query = "UPDATE obras_prod SET Quantidade=Quantidade + " & Val(txt_qtd.Text) & " WHERE ID_prod=" & produto & " AND ID_obra=" & IDOBRA & " AND Data>=#" & data & "# AND Data<# " & data.AddDays(1) & "#"

Share this post


Link to post
Share on other sites
vikcch

fica difícil de ajudar...

posta mais coisas, como tens as tabelas estruturadas, essas subs "executar_query_Reader", "executar_query_nonReader"... etc

o produto é uma string? sendo Id/chave primaria na tabela produtos ? está tudo bem até ai?

query = "Select Preco_Compra From produtos Where ID='" & produto & "'"

Edited by vikcch

Share this post


Link to post
Share on other sites
Retsu9

sim o produto é string.

Public Function executar_query_Reader(ByVal Instrucao As String) As OleDb.OleDbDataReader
Dim datareader As OleDbDataReader = Nothing ' declarar uma variavel do tipo oledatareader para ler os dados da base de dados
cmd = New OleDbCommand(Instrucao, con) ' nova variavel do tipo oledbcommand, com a instruçao sql e a conexao
Try
con.Open() 'abrir a conexão
datareader = cmd.ExecuteReader 'executar a variavel cmd e receber os dados na variavel datareader
Catch ex As Exception
MessageBox.Show(ex.Message) 'mensagem de erro, se aplicavel
Finally
End Try
Return datareader 'retornar os dados atraves da variavel datareader
End Function
'************************** Procedimento para comandos Insert\Update\Delete *********************************************
Public Sub executar_query_nonReader(ByVal Instrucao As String)
cmd = New OleDbCommand(Instrucao, con) ' nova variavel do tipo oledbcommand, com a instruçao sql e a conexao
con.Open() 'abrir a conexão
Try
aux= cmd.ExecuteNonQuery() 'executar a variavel cmd e receber os dados na aux
Catch ex As Exception
MessageBox.Show(ex.Message) 'mensagem de erro, se aplicavel
Finally
con.Close() 'fechar a conexão
End Try
End Sub

Edited by Retsu9

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.