Forum Pplware
Prova De Aptidão Profissional - SoS PeoPleWaRe - Versão de Impressão

+- Forum Pplware (http://forum.pplware.com)
+-- Fórum: Mais Tech (/forumdisplay.php?fid=11)
+--- Fórum: Programação e Web (/forumdisplay.php?fid=16)
+--- Tópico: Prova De Aptidão Profissional - SoS PeoPleWaRe (/showthread.php?tid=5988)

Páginas: 1 2 3 4 5 6


Prova De Aptidão Profissional - SoS PeoPleWaRe - P3dr0 - 10-05-2010 23:06

Boa noite!

Isto é assim eu sou aluno do 12º ano e frequento o curso profissional de técnico de Gestão, E no final dos 3 anos de curso temos que fazer a PaP(Prova de Aptidão Profissional) e só tendo a mesma positiva é que receberemos o diploma com o prémio de fim de curso.

Bem eu para a minha PaP vou fazer uma aplicação de Gestão de venda de productos informáticos, tipo a worten ou a box, mas claro em termos de tamanho é mini xD

E gostava que podesse ter este tópico aqui aberto para ir pondo aqui as minhas duvidas e erros que me vão aparecendo para me irem ajudando...

Bem como programa para a minha base de dados estou a usar o sql server 2008 utilizando o visual basic para a manusear.

e em termos de base de dados já tenho tudo feito, mas agora que comecei a programar acerio é que isto ta mal ^^

Bem então comecei por tentar adicionar clientes na base de dados, a tabela clientes que recebe todos os valores do programa que o utilizador digita, menos o codigo postal que vem numa tabela aparte, ou seja a tabela cliente relaciona se com a codigo postal, de forma a ter todos os codigos postais numa combobox para o utilizador la ir buscar.



tenho o seguinte código:

Código:
Private Sub Novo_Cliente_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  
        Dim adapter_codigopostal As New GesturoDBDataSetTableAdapters.Codigo_PostalTableAdapter
        Dim tb_codigo_postal As New GesturoDBDataSet.Codigo_PostalDataTable
        adapter_codigopostal.Fill(tb_codigo_postal)
        Dim Codigo As DataRow
        For Each Codigo In tb_codigo_postal.Rows
            Codigo_PostalComboBox.Items.Add(Codigo.Item(0))
        Next
End Sub
PS: Esta parte serve para quando o form novo_cliente é carregado vaia buscar a tabela codigopostal os valores a meter na combobox para o utilizador possa selecionar o que deseja.


Código:
Private Sub Avançar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Avançar.Click

        Dim contribuinte As Integer
        Dim nome As String
        Dim telefone As Integer
        Dim email As String
        Dim codigopostal As Integer
        Dim morada As String
        contribuinte = N_ContribuinteMaskedTextBox.Text
        nome = NomeTextBox.Text
        telefone = TelefoneMaskedTextBox.Text
        email = E_mailTextBox.Text
        codigopostal = Codigo_PostalComboBox.Text
        morada = MoradaTextBox.Text
        Const constr As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Pedro Fernandes\Desktop\my precious\escola\PRojecto final de curso\Gesturo\Gesturo\GesturoDB.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"
        Dim db As New SqlConnection(constr)
        db.Open()

        Dim Varsql As String
      
        Varsql = "INSERT INTO Cliente(N_Contribuinte,Nome,Telefone,E_mail,morada) VALUES(@N_ContribuinteMaskedTextBox,@NomeTextBox,@TelefoneMaskedTextBox,@E_mailT​extBox,@MoradaTextBox)"
        Dim cmd As New SqlCommand(Varsql, db)
        cmd.Parameters.Add("@N_ContribuinteMaskedTextBox", SqlDbType.Int).Value = contribuinte
        cmd.Parameters.Add("@NomeTextBox", SqlDbType.VarChar).Value = nome
        cmd.Parameters.Add("@TelefoneMaskedTextBox", SqlDbType.Int).Value = telefone
        cmd.Parameters.Add("@E_mailTextBox", SqlDbType.VarChar).Value = email
        cmd.Parameters.Add("@Codigo_PostalComboBox", SqlDbType.Int).Value = Codigo_PostalComboBox.Text
        cmd.Parameters.Add("@MoradaTextBox", SqlDbType.VarChar).Value = morada
        cmd.ExecuteNonQuery()
        db.Close()
        Me.Close()

      

    End Sub

PS: esta Parte é para adicionar Valores na base de dados!

Até aqui tudo Bem, mas quando vou correr o programa e acesso á base de dados da me o seguinte erro:

Código:
ConstraintException was unhandled:
Falha ao activar restrições. Uma ou mais linhas contêm valores que violam restrições não nulas, exclusivas ou de chave externa.

Erro este na parte do load do form, quando estou a fazer o código para ir buscar os valores á tabela codigo postal, ja tentei de tudo, ja fui a BD tirar e por os allow nulls activos e desactivos vezes sem conta, e mexi e remexi e da sempre o mesmo erro.

mas o engrançado é que se eu for a tabela clientes e meter o codigo postal como nulo, e na parte do codigo puser em comentario tudo aquilo que tem haver com o codigopostal e correr o programa já consigo adicionar coisas na tabela, o que me leva a crer que o erro deve estar nas ligações entre as tabelas clientes e codigo postal, mas não sei...

portanto se alguem me puder dar uma ajuda nisto força Wink

se não perceberem algo digam ^^


RE: Prova De Aptidão Profissional - SoS PeoPleWaRe - crazyman - 11-05-2010 01:17

boas seria optimo tb colocares as ligaçoes que fizeste na BD, para vermos se estao correctas...

Pelo menos entre a tbl clientes e a tbl codigo postal Wink

Qual é a versão do VB?
pelo erro que está a dar, penso que será da chave estrangeira, ou seja da chave da tb cod post, mas...

Só vendo as ligaçoes...


RE: Prova De Aptidão Profissional - SoS PeoPleWaRe - jaimetotal - 11-05-2010 09:44

Mostra também as queries.


RE: Prova De Aptidão Profissional - SoS PeoPleWaRe - P3dr0 - 11-05-2010 10:30

[Imagem: vzc9dv.jpg]

Aqui está o diagrama das minhas tabelas...

as ligações que tenho feito entre a tabela clientes e a tabela fornecedores com a tabela codigo postal, e que o campo codigopostal na tabela codigo postal e chave primaria e o campo codigopostal nas outras tabelas e chave estrangeira...

o programa que uso é o visual basic express edition 2008!


RE: Prova De Aptidão Profissional - SoS PeoPleWaRe - crazyman - 11-05-2010 20:35

nao creio q o codigo postal possa ser uma chave primaria...

o meu vizinho do 3º andar tem o mesmo codigo postal do que eu...


RE: Prova De Aptidão Profissional - SoS PeoPleWaRe - norua - 12-05-2010 10:25

Sinceramente, embora construcção de base de dados nunca tenha sido o meu forte, acho que teres ai a tabela Código Postal só não tem utilidade nenhuma como não tem lógica também. Já para não falar no problema que no post a cima descreveram.
Para ser sincero se fosse a ti (e tive-res tempo) tentava fazer isso sem essa tabela.
Cumps.


RE: Prova De Aptidão Profissional - SoS PeoPleWaRe - crazyman - 12-05-2010 11:12

ontem apenas coloquei aquele post porque estava com pressa e apenas detectei aquele erro Big Grin

Mas agora olhando bem para estas ligaçoes existem aqui alguns erros de coerencia que te vao dar erros no futuro:

tabela vender_produto:

Trata-se de uma tabela intermédia
com o contribuinte como chave primaria e cod_produto como chave estrangeira vai te dar um problema grave.
1 cliente so pode comprar 1 unica vez nessa loja... Sad
Sugestão: Cria um campo nessa tabela como numeração automatica com o titulo por exemplo "cod_ven_prod" e esse sim fica como chave primaria e mantem os outros como chave estrangeira

Tabela Fornecedor_produto

O erro é exactamente o mesmo do anterior.
A solução passa pela mesma Wink

Tabela cod_postal
Pelas razões que já descrevi no meu post anterior
A solução passa por atribuires uma Chave primaria de numeração automatica como por exemplo "cod_codpost"

Assim funcionará de certeza absoluta...

Existem outros pormenores que eu alterearia/intrudozia mas isso já depende do que se queira fazer...

Por exemplo:

Criaria mais 2 tabelas:
Tabela Familia e Tabela Subfamilia

Alterava a chave n_contribuite da tabela Cliente para a Chave N_BI, pois na programação pode confundir com o N_contribuite da tabela Fornecedor.

Para te poupar trabalho tenho aqui as tabelas ja feitas com os codigos postais, freguesias, conselhos e distritos que utilizei para uma aplicação que fiz ha pouco tempo.

Se quizeres manda me uma MP.

1 abraço


RE: Prova De Aptidão Profissional - SoS PeoPleWaRe - P3dr0 - 12-05-2010 11:27

Mas o codigo postal so é chave primaria na sua propria tabela,

na tabela clientes ja não o e, o que faz com que 2 clientes possam ter o mesmo codigo postal...

então mas a tabela codigo postal vem de forma a ter adicionado la todos os codigos postais existentes e as relativas localidades ao que os mesmos correspondem, de forma a que quando estou a adicionar um cliente ou fornecedor, faça simplesmente o levantamento do codigo postal e a localidade venha logo incorporada...


RE: Prova De Aptidão Profissional - SoS PeoPleWaRe - jaimetotal - 12-05-2010 11:55

Viva,
o código postal está correcto como está, pelos mesmos argumentos que usaste. Muitas pessoas nem sabem correctamente a localidade delas. Mas caso queiras os códigos postais todos, tens isso no site dos CTT, mas é necessário uma limpeza.

Quanto aos clientes, recomendo-te usares um ID automático. Não te esqueças que o NIF são 9 dígitos e pesquisar sempre por eles é complicado, o mesmo para o fornecedor. Não é que esteja mal, mas é standard.

Para vender e comprar, recomendo-te outro tipo de tabela, que é o que se costuma fazer

Código:
Tabela CabecDoc

  NumFactura (Chave automática única com tipo entidade)
  TipoEntidade  (Cliente/Fornecedor) (Chave única com nr factura)
  CodEntidade (ID automático de cada cliente/fornecedor)
  Data
  Tipo de Pagamento
  etc
  ...

Código:
Tabela LinhasDoc (Para comprar mais que um artigo na mesma factura)

  NumCabecDoc (Chave estrangeira de NumFactura) (Chave única com NumLinha)
  NumLinha (Só para ficar na mesma ordem em que foi inserido. Não é propriamente necessário) (Chave únicaNumLinha)
  Cod_Produto (Chave estrangeira)
  Quantidade
  Preço Base
  IVA
  Desconto?
  etc
  ...

A ter em conta:
- A tabela CabecDoc normalmente até é mais elaborada, mas para ficar simples, isto chega.
- Na tabela LinhasDoc, fazes a relação das linhas de artigo com a cabeçalho da factura através do NumCabecDoc e NumLinhasDoc. Se não quiseres NumLinhasDoc, NumCabecDoc não pode ser chave única.
- Convém guardar o preço de cada artigo, porque como é algo dinâmico, tens que saber o preço do dia da factura, não no dia em que vás ver a factura.
- Não é necessário saber o total, porque calcula-se na hora do levantamento.

Quanto ao teu problema concretamenteBig Grin :
- Mostra as queries de consulta, e a que usaste para criar a tabela código postal e clientes. O erro queixa-se basicamente de uma constraint que aplicaste que está a ser violada.
- Conheces SqlDataReader? Usas com o SqlCommand,SqlConnection e são melhores que datasets em muitos casos (até maioria dos casos) e aplicam-se melhor no teu Novo_Cliente_Load.

exemplo:
Código:
dim sqlCmd as new sqlCommand("select codigo from dbo.codigopostal",sqlCon)
dim sqlReader as SqlDatareader
sqlReader=sqlCmd.executereader
if sqlreader.hasrows then
   while sqlreader.read
         Codigo_PostalComboBox.items.add(sqlreader(0))
   end while
end if


- Por último, tenta mudar a maneira que dás nomes às coisas. Primeiro o tipo de objecto txt,cmb,mtxt, e o nome. Exemplo: txtNome,frmCliente. O mesmo para as variáveis: i(nt)CodPostal (só pelo nome vê-se que é inteiro). Embora existam várias maneiras de nomear as coisas, tens que aderir a uma. É mais perceptível o que é e para o que serve, e ajudar-te-á no futuro, caso queiras vir para estes lados.

Cumps.


RE: Prova De Aptidão Profissional - SoS PeoPleWaRe - crazyman - 12-05-2010 12:30

Tens a tabela de cod postais toda preenchida com todas as localidades do pais e nao tens nenhum codigo postal repetido????

Entao pode ficar como chave primaria...

Se no futuro nao te aparecer uma localidade diferente com o mesmo codigo postal...