|
Postada em 07/05/2007 12:37 hs
Oipessoal!! Eu tenho uma aplicação feita em visual basic, com bases de dados em access e uso Data environement e tenho um problema de gravação de dados. O meu problema é que a tabela que estou a utilizar tem muitos campos(alias, tem o maximo de campos possivel numa tabela de access), e aquando da gravação dá um erro que diz que foram definidos muitos campos e que é impossivel gravar os dados! Eu para tentar fugir a esse erro criei dois "Command" no data envirenement, nos quais tenho a tabela dividida em dois. no inicio eu tenho este código: Form Load() Set DETabA = Nothing Set DETabA = New ADODB.Recordset Set DETabA = DEGeral.rsTblA Set DETabB = Nothing Set DETabB = New ADODB.Recordset Set DETabB = DEGeral.rsTblB end sub ******************************************* Depois quando faço novo: DETabA.AddNew DETabA("Ano").Value = Year(Now) DETabA("Nipc").Value = "123456789" mas nesta situação ele não faz o addnew aos campos da segunda tabela e ao fazer o guardar ele não guarda na linha correcta, pq não sei como fazer para o relacionar com a primeira tabela sem fazer o addnew à segunda tabela, pq caso eu faça o Addnew à segunda tabela ele vai criar dois registos do mesmo ano!! No guardar faço: DETabA.Update DETabB.Update Se alguem me puder ajudar agradeço imenso!! Obrigado!
|
|
|
|
|
Postada em 07/05/2007 17:41 hs
Olha, se não me engano o access suporta 255 campos estou correto? Eu já vi tabelas com mais de 300 campos mas não em access! Deve estar tendo um erro de estruturação aí... se não tiver erro, com o relacionamento entre os dados de maneira unívoca (1-1) , então o correto seria dividir a tabela em outras tabelas que é o acontece no caso de ter muitos campos. Tendo 1 chave para identificar os registros nas tabela que se relacionam. Se vc puder fazer isso ótimo, ganhará em desempenho, estruturação e futuras dores-de-cabeça. :) Se eu entendi são 2 commands (DEtabA e DETabB respectivamente) certo? Os 2 representam 1 tabela, blz? Bom tenta não usar 2 commands...não sei se dará certo mas grave metade dos campos primeiro depois vc não usa o AddNew e sim o EDIT. Vc ainda pode usar SQL, mas não sei se vc terá problemas. Um exemplo simples: Dim BD as DataBase, SQL as String .... SQL = "INSERT INTO TABELA (campo_numerico,campo_texto) VALUES (123,'joao')" BD.Execut SQL espero q ajude at+
|
|
|
|
Postada em 08/05/2007 08:25 hs
O problema é que eu tenho dois comands no data environement, criei atraves de dois selects, assim posso dividir a tabela em dois e já me permite gravar os dados, mas existe um problema, eu quando faço "NOVO" não posso fazer o AddNew para os dois comandos, senão vai criar dois registos iguais na tabela! Quando faço novo so posso fazer: DeTabA.AddNew Depois quando Guardo e se tiver mais registos na tabela ele não sabe em que registo alterar os dados e grava tudo errado: DeTabA.UPDATE ***se executar a mensagem ele retorna por ex. o ano 2006 MsgBox DETabA.Fields("Ano").Value '****Mas nesta parte de baixo eu não como indicar ou redireccionar o caminho para o registo certo: ***Se executar a mensagem ele retorna outro ano (talvez o primeiro que tiver inserido na tabela) Ex. 2004, e vai guardar os campos do DETabB no ano de 2004 em vez de gravar no ano de 2006 MsgBox DETabB.Fields("Ano").Value DeTabB.UPDATE ***************************************************** Já tentei fazer isto, mas nem assim... DETabB.Find "Ano = " & DETabA.Fields("Ano").Value, , adSearchForward, 1 se alguém souber o que fazer, agradeço ajuda!
|
|
|
|
Postada em 08/05/2007 08:26 hs
Falas-te no EDIT, como faço utilizando o data environment???
|
|
|
|
Postada em 08/05/2007 12:01 hs
Olha, que me lembro o DataEnvironment era DAO mas é parecido com o ADO... se for DAO vc vai ter uma função chamada EDIT que editará o registro: DETabB.Edit DETabB.("Ano").Value = "2006" DETabB.UpDate Agora se for ADO então não usa-se o EDIT, apenas grava: DETabB.("Ano").Value = "2006" DETabB.UpDate Ambos têm que localizar o registro antes de editar. Procure pelo campo chave: DETabB.Find "CAMPO_CHAVE = 1" DETabB.Edit DETabB.("Ano").Value = "2006" DETabB.UpDate Entendeu? Pode-se fazer via SQL também só que não lembro onde ficava a função Execute. Acho que era no objeto Connection. Posso estar enganado mas tu podes tentar: Conexao.Execute "INSERT INTO TABELA (campo_numerico,campo_texto) VALUES (123,'joao')" Citando como exemplo. Qualquer problema é só postar. até +
|
|
|
|
Postada em 08/05/2007 12:34 hs
Eu já tentei fazer isso, mas se ele tiver dois registos ou mais (2005, 2006...) ele não consegue relacionar os registos e se tiver a editar o registo de 2006 ele grava a primeira parte da tabela (1º comando) correctamente, mas a segunda parte (2º comando) vai guardar noutro ano diferente!!!
|
|
|
|