Jump to content

Recommended Posts

Posted

Bom eu tenho uma base de dados em Access e tenho um programa em Visual Basic para a gerir, de momento encontro-me com um problema que é na parte de realização de encomendas

A Tabela "Encomendas" encontra-se ligada a duas tabelas "Produtos" e "Clientes", ou seja na tabela "Encomendas" em si so irão aparecer os ID's dessas duas tabelas em campos diferentes.

O meu problema é que quando eu coloco isto num combobox aparecem os Id's das outras tabelas normalmente, mas eu queria era que aparecessem os nomes dos clientes e os nomes dos produtos associados ao ID e não o id em si.

(E sim as tabelas encontra-se relacionadas)

Posted (edited)

Podes mostrar o código que estás a usar para preencher a combobox?

Sim sim, isto é o que esta a preenche-las:

Dim reader As OleDbDataReader
       cmd = New OleDbCommand("Select ID_Forn from Fornecedores", ConnectionString)
       reader = cmd.ExecuteReader
       While reader.Read
           FornCB1.Items.Add(reader.Item("ID_Forn"))
           FornCB2.Items.Add(reader.Item("ID_Forn"))
       End While
       ConnectionString.Close()
       ConnectionString2.Open()
       Dim reader2 As OleDbDataReader
       cmd2 = New OleDbCommand("Select ID_Prod_Peso from Produto_Peso", ConnectionString2)
       reader2 = cmd2.ExecuteReader
       While reader2.Read
           PesoCB.Items.Add(reader2.Item("ID_Prod_Peso"))
       End While
       ConnectionString2.Close()
       ConnectionString3.Open()
       Dim reader3 As OleDbDataReader
       cmd3 = New OleDbCommand("Select ID_Prod_Uni from Produto_Uni", ConnectionString3)
       reader3 = cmd3.ExecuteReader
       While reader3.Read
           UniCB.Items.Add(reader3.Item("ID_Prod_Uni"))
       End While
       ConnectionString3.Close()
Edited by thoga31
GeSHi
Posted (edited)

No primeiro post falas numas tabelas, mas o exemplo usa outras.

De qualquer maneira, vais ter de usar o JOIN no select para juntar 2 tabelas.

Por exemplo, se tiveres a tabela Clientes com o campo ID e Nome, e tiveres a tabela Encomendas com o campo ID_Cliente, podes usar o seguinte query para retornar as encomendas juntamente com o nome do cliente a que se refere

SELECT Encomendas.ID_Cliente, Clientes.Nome
FROM Encomendas INNER JOIN Clientes ON Encomendas.ID_Cliente = Clientes.ID

Uma forma de facilmente fazeres os queries é usar o Query Design do Access

Edited by nelsonr
Posted (edited)

No primeiro post falas numas tabelas, mas o exemplo usa outras.

De qualquer maneira, vais ter de usar o JOIN no select para juntar 2 tabelas.

Por exemplo, se tiveres a tabela Clientes com o campo ID e Nome, e tiveres a tabela Encomendas com o campo ID_Cliente, podes usar o seguinte query para retornar as encomendas juntamente com o nome do cliente a que se refere

SELECT Encomendas.ID_Cliente, Clientes.Nome
FROM Encomendas INNER JOIN Clientes ON Encomendas.ID_Cliente = Clientes.ID

Uma forma de facilmente fazeres os queries é usar o Query Design do Access

Bom adaptado o codigo deu isto:

ConnectionString.Open()

	Dim reader As OleDbDataReader
	cmd = New OleDbCommand("SELECT Encomenda_Casa.ID_Fornecedor, Fornecedores.Nome FROM Encomenda_Casa INNER JOIN Fornecedores ON Encomenda_Casa.ID_Fornecedor = Fornecedores.ID_Forn", ConnectionString)

	reader = cmd.ExecuteReader
	While reader.Read
		FornCB1.Items.Add(reader.Item("Fornecedores.ID_Forn"))
		FornCB2.Items.Add(reader.Item("Fornecedores.ID_Forn"))
	End While
	ConnectionString.Close()

(Este codigo encontra-se no Form Load)

Mas não me esta a deixar abrir o form.

Edited by Luisveiga18
Posted (edited)

No select retorna 2 campos, ID_Fornecedor e Nome.

No reader estás a ler Fornecedores.ID_Forn.

Não coloques o nome da tabela no reader e poe o nome de acordo com o resultado do SELECT.

E não sei se isso do item funciona (nao consigo experimentar). Senao podes ler com algo assim:

FornCB1.Items.Add(reader.GetInt32(reader.GetOrdinal("ID_Fornecedor")))
Edited by nelsonr
Posted

No select retorna 2 campos, ID_Fornecedor e Nome.

No reader estás a ler Fornecedores.ID_Forn.

Não coloques o nome da tabela no reader e poe o nome de acordo com o resultado do SELECT.

E não sei se isso do item funciona (nao consigo experimentar). Senao podes ler com algo assim:

FornCB1.Items.Add(reader.GetInt32(reader.GetOrdinal("ID_Fornecedor")))

Se fizer assim:

ConnectionString.Open()

       Dim reader As OleDbDataReader
       cmd = New OleDbCommand("SELECT Encomenda_Casa.ID_Fornecedor, Fornecedores.Nome FROM Encomenda_Casa INNER JOIN Fornecedores ON Encomenda_Casa.ID_Fornecedor = Fornecedores.ID_Forn", ConnectionString)

       reader = cmd.ExecuteReader
       While reader.Read
           FornCB1.Items.Add(reader.GetInt32(reader.GetOrdinal("ID_Fornecedor"))

Apenas vão aparecer os ID do campo ID_Fornecedor da Tabela Encomenda_Casa (Ou seja os Id's já inseridos no campo) e não os id's da tabela fornecedores + nomes.

Posted

Sim, se quiseres o id e o nome podes usar algo como:

FornCB1.Items.Add( String.Format("{0} - {1}", reader.GetInt32(reader.GetOrdinal("ID_Fornecedor")), reader.GetString(reader.GetOrdinal("Nome")) ))

Mas esse exemplo está a ir buscar os fornecedores que existem na tabela de encomeda_casa.

O que é que pretendes exactamente?

Posted

Sim, se quiseres o id e o nome podes usar algo como:

FornCB1.Items.Add( String.Format("{0} - {1}", reader.GetInt32(reader.GetOrdinal("ID_Fornecedor")), reader.GetString(reader.GetOrdinal("Nome")) ))

Mas esse exemplo está a ir buscar os fornecedores que existem na tabela de encomeda_casa.

O que é que pretendes exactamente?

Bom explicado no inicio. Na Tabela Encomeda_Casa eu tenho um campo ID_Fornecedor que esta ligado (por relações) ao campo ID_Forn da Tabela Forncedores. O que eu queria é que ele fosse buscar o nome associado a cada id à tabela Fornecedores para assim na CoBoBox em vez de aparecerem os Id's (como estao a aparecer agora) aparecerem os nomes. Ou seja eu quero "mascarar" o id para aparecerem nomes em vez de numeros.

Posted (edited)

Mas se queres ter na combo apenas os fornecedores (mostrando o nome), para que precisas da tabela encomenda_casa?

Basta fazeres um select do tipo:

cmd = New OleDbCommand("SELECT ID_Forn, Nome FROM Fornecedores", ConnectionString)

E ao adicionares à lista, adicionas só o nome

FornCB1.Items.Add(reader.GetString(reader.GetOrdinal("Nome")) )

Depois o mais provavel é precisares de guardar o ID algures ai para conseguires saber qual o fornecedor selecionado

Edited by nelsonr
Posted

Mas se queres ter na combo apenas os fornecedores (mostrando o nome), para que precisas da tabela encomenda_casa?

Basta fazeres um select do tipo:

cmd = New OleDbCommand("SELECT ID_Forn, Nome FROM Fornecedores", ConnectionString)

E ao adicionares à lista, adicionas só o nome

FornCB1.Items.Add(reader.GetString(reader.GetOrdinal("Nome")) )

Depois o mais provavel é precisares de guardar o ID algures ai para conseguires saber qual o fornecedor selecionado

Mas as encomendas vão ficar guardadas na Tabela Encomenda_Casa, e nesse tabela apenas existe o ID_Fornecedor (Que como já disse esta ligado ao ID_Forn da Tabela Fornecedores)

Posted

Vai por partes...

Queres ter na combo apenas a lista dos fornecedores, correcto? Ai não precisas da tabela de encomendas.

Depois queres em outro sitio ir buscar as encomendas do fornecedor selecionado, é isso?

Posted (edited)

Vai por partes...

Queres ter na combo apenas a lista dos fornecedores, correcto? Ai não precisas da tabela de encomendas.

Depois queres em outro sitio ir buscar as encomendas do fornecedor selecionado, é isso?

Depois noutro sitio em quero fazer encomendas a partir dessa lista de fornecedores, essas encomendas serão inseridas na tabela encomendas_casa

Edited by Luisveiga18

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • 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.