Ir para conteúdo
Fórum Script Brasil
  • 0

não consigo escrever no DBEdit


Xafam

Pergunta

bom dia,

estou com o seguinte problema,

tenho uma tabela com os seguintes componentes

placaVeiculo = placa do veiculo

nrAuto = Nº do auto

cdInfracao = codigo da infração

data_autuacao = data da autuação

data_notificacao_autuacao = data de notificação da autuação

data_publicacao = data da publicação

data_publicacao = data da publicação

nr_processo = nº do processo

eu pego o placaVeiculo e arrasto ele pro meu form, e é criado um DBEdit, até ai tudo bem ...

porem quando executo a aplicação e tento escrever nesse DBEdit, o cursor de escrita fica la (piscando), mas eu não consigo escrever nada nele ...

porque isso acontece ??

ps.: não testei com os outros campos ...

Link para o comentário
Compartilhar em outros sites

16 respostass a esta questão

Posts Recomendados

  • 0
porem quando executo a aplicação e tento escrever nesse DBEdit, o cursor de escrita fica la (piscando), mas eu não consigo escrever nada nele ...

Como assim "escrever nesse DBEdit"? O DBEdit recebe os dados da base que você seta no DataSource, não é como um Edit, que você escreve o que quiser.

Talvez você esteja tentando dizer que não consegue visualizar os dados da base, é isso? Se for, talvez você não tenha colocado um comando para abrir sua base de dados.

Link para o comentário
Compartilhar em outros sites

  • 0

a aplicação , não fui eu quem criei .. foi um cara aki onde trabalho (estagio) que criou (e ta de ferias) , ele fez um botao de alterar, que quando apertado , da para escrever no BDEdit, cliquei 2x no butao para ver qual era o comando e apareceu isso:

DMSISRET.Qvoto.Edit; // aki, acho q é pra editar o BD

 Pagecontrol1.Enabled := True; // pra colocar o Enabled do Pagecontro1 true

 Panel1.Enabled := True; // pra colocar o Enabled do Panel1 true

 Edit1.Text := 'A'; // aki não faço a minina ideia de que gambiarra ele fez
ai eu fui e fiz isso . . .
DMSISRET.Qvoto.Edit;
 Pagecontrol1.Enabled := True;
 Panel1.Enabled := True;
 Edit1.Text := 'A';

 // acrescentei esses codigos aki

 DMSISRET.Qarmazem2.Edit; // aki para editar o banco q eu quero , no caso Qarmazem2

 Panel3.Enabled := True; // pra colocar o Enabled do Panel3 true , já q é onde vai ficar os campos

mas ai da esse erro ...

Project SISRET.exe raised exception class EDatabaseError with message 'Qarmazem2: Cannot modify a read-only dataset'. Process stopped. Use Step ou Run to continue.

outra coisa ... quando eu jogo os campos de outra tabela (por exemplo TbUsuario) aparece o conteúdo que tá neles, e nesse banco o Qarmazem2, aparece em branco ..

nunca mechi com DBEdit, por isso tenho muitas duvidas de como usá-los ..

valeu a ajuda ..

xafam ...

Link para o comentário
Compartilhar em outros sites

  • 0

Xafam, você diz que tem dúvidas quanto ao DBEdit, mas nessas linhas de código que você deixou no seu post, não tem nenhum DBEdit.

No erro apresentado ('Qarmazem2: Cannot modify a read-only dataset'), o Delphi está te dizendo que você não pode modificar uma tabela somente leitura. Se não aparece nada nos campos da mesma, talvez não tenha nada mesmo. Tente abrir essa tabela com a ajuda de alguma ferramenta para a sua base de dados para fazer uma verificação.

Link para o comentário
Compartilhar em outros sites

  • 0

é porque quando eu fiz o codigo estava fazendo igual o cara que programou o aplicativo (usando o Pagecontrol1 e Painel) ,

agora .. eu troquei e deu certo (pelo menos na parte de escrever nos BDEdits) .. eu usei esse codigo:

// essa daki já existia
 DMSISRET.Qvoto.Edit;

 Pagecontrol1.Enabled := True;
 Panel1.Enabled := True;
 Edit1.Text := 'A';

// eu fui e acrescentei esse codigo aki 

 DMSISRET.Qarmazem2.Edit;

 Panel3.Enabled := True;

// e coloquei todos os DBEdit que serão alterados

 DBEdit22.Enabled := True;
 DBEdit14.Enabled := True;
 DBEdit16.Enabled := True;
 DBEdit20.Enabled := True;
 DBEdit18.Enabled := True;
 DBEdit21.Enabled := True;
 DBEdit17.Enabled := True;
 DBEdit23.Enabled := True;
alem desse codigo, na propriedade RequestLive e UniDirectionalda query Qarmazem2, eu coloquei TRUE, ai o erro parou ... finalmente funcionou ... consegui escrever nos DBEdit's ... :) :) e como felicidade de pobre dura pouco <_< <_< <_< to precisando de outra ajuda .... , consigo escrever nos DBEdit's, mas não salvo as informações contidas neles .. :( eu acrescentei ao codigo que já existia do butao salvar :
// esse aki já existia
DMSISRET.Qvoto.edit;
DMSISRET.Qvoto.Post;
DMSISRET.Qvoto.Close;
DMSISRET.Qvoto.Open;
Pagecontrol1.Enabled := false;
Panel1.Enabled := false;
Edit1.Text := '';

// eu fui e acrescentei isso (sinplesmente troquei a query [en vez de Qvoto, coloqueiQarmazem2] 
// e o Painel [en vez do Panel1, coloquei Panel3]

DMSISRET.Qarmazem2.edit;
DMSISRET.Qarmazem2.Post;
DMSISRET.Qarmazem2.Close;
DMSISRET.Qarmazem2.Open;
Panel3.Enabled := false;
Edit1.Text := '';

e ai quando compilo e aperto o butao salvar, gera esse erro:

Project SISRET.exe raised exception class EDBEngineError with message 'General SQL error. [Microsoft][ODBC SQL Server Driver][sql Server] The view or function 'dbo.VIEW18' is not updatable because the definition contains the TOP clause.'. Process stopped. Use Step ou Run to continue.

alguém tem ideia de o que seja isso ??? :blink:

valeu todos a ajuda ...

xafam

Link para o comentário
Compartilhar em outros sites

  • 0

Project SISRET.exe raised exception class EDBEngineError with message 'General SQL error. [Microsoft][ODBC SQL Server Driver][sql Server] The view or function 'dbo.VIEW18' is not updatable because the definition contains the TOP clause.'. Process stopped. Use Step ou Run to continue.

tradução do erro:

Projeto SISRET.exe elevou classe de exceção EDBEngineError com mensagem ' erro de SQL Geral. [Microsoft][ODBC SQL Servidor Servidor de Driver]

 A visão ou função ' dbo.VIEW18 ' não é nenhum updatable porque a definição contém a cláusula TOP. '. Processo parou.

verifique esta função ' dbo.VIEW18 '

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
alem desse codigo, na propriedade RequestLive e UniDirectionalda query Qarmazem2, eu coloquei TRUE,

ai o erro parou ...

finalmente funcionou ... consegui escrever nos DBEdit's ... :) :)

e como felicidade de pobre dura pouco <_< <_< <_<

to precisando de outra ajuda .... , consigo escrever nos DBEdit's, mas não salvo as informações contidas neles .. :(

eu acrescentei ao codigo que já existia do butao salvar :

// esse aki já existia
DMSISRET.Qvoto.edit;
DMSISRET.Qvoto.Post;
DMSISRET.Qvoto.Close;
DMSISRET.Qvoto.Open;
Pagecontrol1.Enabled := false;
Panel1.Enabled := false;
Edit1.Text := '';

// eu fui e acrescentei isso (sinplesmente troquei a query [en vez de Qvoto, coloqueiQarmazem2] 
// e o Painel [en vez do Panel1, coloquei Panel3]

DMSISRET.Qarmazem2.edit;
DMSISRET.Qarmazem2.Post;
DMSISRET.Qarmazem2.Close;
DMSISRET.Qarmazem2.Open;
Panel3.Enabled := false;
Edit1.Text := '';

Xafam, acho que você não está meio perdido, e se perde mais ainda ao seguir o código que já estava no botão. :wacko:

Olhe bem as duas primeiras linhas do bloco de quatro que você usa para "salvar" a informação... Percebe que coisa meio estranha é chamar o método Edit seguido do Post?

O método Edit coloca o dataset em edição e o Post grava estas alterações no banco. Então, a lógica diz que entre uma operação e outra alguma coisa deveria/poderia ser alterada. Assim, prossivelmente em algum lugar quando o form é mostrado já deve ter sido chamado o método Edit deixando os dados em condições de serem alterados/manipulados pelo usuário que, por fim, ao desejará gravar estas alterações, o que normalmente é feito através de um botão para este fim onde aparece o método Post apenas (eventualmente um commit ou commitretained - dependendo dos componentes usados).

e ai quando compilo e aperto o butao salvar, gera esse erro:

Project SISRET.exe raised exception class EDBEngineError with message 'General SQL error. [Microsoft][ODBC SQL Server Driver][sql Server] The view or function 'dbo.VIEW18' is not updatable because the definition contains the TOP clause.'. Process stopped. Use Step ou Run to continue.
parece que você está tentando editar um select realizado sobre uma VIEW e não TABLE. Para os selects sobre um VIEW poderem ser atualizáveis (editáveis), existem algumas restrições. O erro já aponta o uso da palavra reservada TOP nest select - uma das restrições. Pesquise a respeito.

E lembre-se de informar que banco de dados está usando, componentes de acesso e no neste caso específico, parece interessante saber se sua consulta está mesmo sendo feita sobre uma view. Isto facilita a vida dos colegas ao tentarem lhe dar sugestões. ;)

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus,

E lembre-se de informar que banco de dados está usando, componentes de acesso e no neste caso específico, parece interessante saber se sua consulta está mesmo sendo feita sobre uma view. Isto facilita a vida dos colegas ao tentarem lhe dar sugestões.
eu não falei porque não sabia qual era... ai, fui no SQL Explorer , cliquei no meu banco de dados (DBSISRET) e la tava, TYPE: SQL SERVER ...

os componentes de acesso são:

Database; // sinceramente não seu o que faz ...

Query; // existem 6, mas só uma me interessa , que é a Qarmazem2

DataSource; // existem 7, mas só uma me interessa , que é a DSarmazem2

Table; // que tem apenas 3 campos (usu_matricula, usu_tipo, usu_nome)

parece interessante saber se sua consulta está mesmo sendo feita sobre uma view

quando eu clico duas vezes na minha Query Qarmazem2, para ver os campos... em todos os campos, na Propriedade Origin, está VIEW18.nome_do_campo

acho que está sendo feita sobre uma VIEW ...

O erro já aponta o uso da palavra reservada TOP nest select - uma das restrições. Pesquise a respeito

ainda não pesquisei a respeito , por falta de tempo ..

valeu a ajuda de todos ...

tão dando uma grande força ...

valeu mesmo ...

Xafam

Link para o comentário
Compartilhar em outros sites

  • 0

aki,

queria saber o seguinte ...

como que eu faço para alterar/salvar_alteração dessa tabela .. (dbo.VIEW18)

se não tiver jeito, quais seriam as alternativas para conseguir altera-las ???

valeu a todos ..

Xafam

ps.: se há algo que ainda não falei sobre o programa, e que possa ser importante, me avisem ........

=========================

outra observação, olhando no SQL Explorer, fui la na dbo.VIEW18, e tá com o TYPE: VIEW ..

tentei alterar, mas ai veio uma mensagem "Cannot edit Type" (não posso alterar o tipo)

Editado por Xafam
Link para o comentário
Compartilhar em outros sites

  • 0

Observe o que você postou...

quando eu clico duas vezes na minha Query Qarmazem2, para ver os campos... em todos os campos, na Propriedade Origin, está VIEW18.nome_do_campo

acho que está sendo feita sobre uma VIEW ...

outra observação, olhando no SQL Explorer, fui la na dbo.VIEW18, e tá com o TYPE: VIEW ..

tentei alterar, mas ai veio uma mensagem "Cannot edit Type" (não posso alterar o tipo)

e o que eu já havia comentado...

(...)parece que você está tentando editar um select realizado sobre uma VIEW e não TABLE. Para os selects sobre um VIEW poderem ser atualizáveis (editáveis), existem algumas restrições. O erro já aponta o uso da palavra reservada TOP nest select - uma das restrições. Pesquise a respeito.
Resolvi fazer a pesquisa para você, mas não achei muita coisa em português não. Inicialmente, para você pelo menos saber com o que está lidando, seria interessante ler estes dois pequenos artigos:

- Introdução a Views (ref. DevMedia)

- Usando Views (ref. iMasters)

Se você quiser encontrar uma alternativa, deve saber do que se trata uma View.

E especificamente sobre as restrições que eu havia comentado, neste artigo (em inglês) - Views in SQL Server 2000 - encontrei algumas informações:

Update data

There are some restrictions for updating data through a view.

* A view cannot modify more than one table. So if a view is based on two or more tables, and you try to run a DELETE statement, it will fail. If you run an UPDATE or INSERT statement, all columns referenced in the statement must belong to the same table.

* It’s not possible to update, insert or delete data in a view with a DISTINCT clause.

* You cannot update, insert or delete data in a view that is using GROUP BY.

* It’s not possible to update, insert or delete data in a view that contains calculated columns.

Also be aware of columns that cannot contain NULL. If it has no default value, and is not referenced in the view, you will not be able to update the column.

basicamente:

- Uma view não pode alterar mais que uma tabela. Assim, se uma view for baseada em um select com duas ou mais tabelas e você tentar executar um DELETE, ele falhará. Se executar um UPDATE ou INSERT, todas as colunas referenciadas (nestes comandos) devem pertencer a mesma tabela (não funciona se forem colunas de tabelas diferentes);

- Não é possível atualizar, inserir ou excluir dados em uma view que tenha a cláusula DISTINCT;

- Voce não pode atualizar, inserir ou excluir dados em uma view que esteja usando GROUP BY;

- Não é possível atualizar, inserir ou excluir dados em uma view que tenha colunas calculadas (que usam: SUM, COUNT,...)

Caso em algum lugar do código ou documentação você não encontre o SQL de criação da VIEW, voce deve usar o front-end (ou ferramenta de gerenciamento do banco) para descobrir com que instrução SELECT foi criada a VIEW. Assim, você poderá confirmar que ela não está podendo ser atualizada devido a sua construção. Procure saber mais a respeito.

queria saber o seguinte ...

como que eu faço para alterar/salvar_alteração dessa tabela .. (dbo.VIEW18)

Como você já deve ter percebido, uma VIEW não é exatamente uma TABELA.

se não tiver jeito, quais seriam as alternativas para conseguir altera-las ???
Alternativas com certeza haverão. Entretanto, acredito que isto pode depender das características do seu sistema e acho pouco provável que eu possa lhe ajudar.

Se atualmente você edita esta view em um DBGrid, talvez seja necessário utilizar outra tela para as atualizações, acessando os dados especificamente na tabela (não através view).

Aparentemente, neste assunto, parece que você não tem muita experiência. Então, procure alguém mais próximo de você para lhe ajudar - alguém que possa olhar o projeto/banco junto com você.

Abraços e boa sorte.

Link para o comentário
Compartilhar em outros sites

  • 0

seguinte Micheus,

eu conversei com uns dos caras aki (onde trabalho) .. e o motivo de que a "tabela" seja uma VIEW .. é justamente porque não pode ser alterada, até porque a tabela onde está os dados, não é feita aki, e de outro lugar (se ele tivesse me falado isso antes pouparia muita coisa .. hehehhe) <_< <_< ..

então .. pensei numa solução ...

quero fazer uma cópia dessa tabela ... tem que ser igualsinha ... uma que ai eu possa edita-la caso tenha algum erro , como que eu faço isso ???

valeu a todos ....

Xafam

ps.: banco de dados não é o meu forte ... hehehehhe :D :D

Link para o comentário
Compartilhar em outros sites

  • 0
então .. pensei numa solução ...

quero fazer uma cópia dessa tabela ... tem que ser igualsinha ... uma que ai eu possa edita-la caso tenha algum erro , como que eu faço isso ??

Xafam, mas a informação que vem desta view não é atualizada em algum lugar?

Fazendo uma cópia dela, você não terá que de tempo em tempo compará com a original? E como vai ficar as alterações que você pretende fazer nesta sua cópia? Elas poderão ser perdidas. Pense a respeito.

A cópia em si, poderá ser feita com a instrução SELECT INTO (Sintax SELECT - ref. msdn - SQL Server Developer Center):

select * into TAB_FROM_VIEW18 from VIEW18

Esta instrução irá criar uma tabela chamada TAB_FROM_VIEW18 no seu banco de dados, com a mesma estrutura e dados retornados pela VIEW18.

A princípio você irá criar/copiar estes dados apenas uma única vez (depende das respostas aos questinamentos anteriores). Se for mesmo uma única vez, pessa a algum desses seu colegas "sacanas", ou quem administra o banco, para que execute esta instrução no front-end, pois não justificaria colocar isto em um programa.

Abraços

Editado por Micheus
Link para o comentário
Compartilhar em outros sites

  • 0
Xafam, mas a informação que vem desta view não é atualizada em algum lugar?
é sim ... mas desconheço a pessoa que faz isso .. até porque deve ser de outra empresa ....

Fazendo uma cópia dela, você não terá que de tempo em tempo compará com a original?

já pensei nessa hipótese ... mas por enquanto isso não é a minha prioridade ... mas pretendo criar uma rotina de verificação dos dados , para ver se estão iguais, e emitir um relatório falando de cada dado se está OK ou não ...

E como vai ficar as alterações que você pretende fazer nesta sua cópia? Elas poderão ser perdidas. Pense a respeito.

porque as alterações da cópia poderiam ser perdidas ?? :huh: :huh:

as alterações só serão feitas quando tiver uma divergencia entre os dados das tabelas .. é tb seria só alterado na tabela que eu criei e não na da VIEW ..

e se fosse confirmado o erro na VIEW .. teria q fazer aquela burogracia toda para ser alterada (informar ao responsavel pelo banco de dados atravez de Email , etc ...)

por enquanto é só isso .. ainda não criei a cópia da tabela .....

outra coisa .. tb pensei em criar uma tabela que tenha os mesmo campos da VIEW , mas em branco .. ai o usuario que "cadastraria" os dados (tudo de novo) .. e fosse verificado se há divergencias entra essa tabela e a VIEW ...

mas ai acho q seria mas trabalhoso para o usuario (ter q cadastrar tudo de novo)

========

ahh .. outra coisa .. como é que eu criaria a outra tabela no Delphi ??

fiu lá no SQL Explorer .. selecionei o DBSISRET(onde tem todas as tabelas) .. abriu duas opções (TABLES, PROCEDURES), fui em TABLES .. botao direito e não tem opção de criar nova ...

PS.: não sou administrador da maquina ..

========

valeu a ajuda ...

Xafam

Editado por Xafam
Link para o comentário
Compartilhar em outros sites

  • 0
porque as alterações da cópia poderiam ser perdidas ?? :huh: :huh:
eu me referia ao fato da reimportação dos dados da view, o que poderia resultar nos dados alterados em sua tabela serem substituídos pelos existentes na view. Mas, como você diz que já está pensando sobre estas questões de conferência dos dados e tal...

Também, convém lembrar que o método que sugeri (select into), irá reescrever a sua tabela, logo, você terá mesmo que criar a estrutura da tabela e fazer algum tipo de verificação antes de importar os dados da view para ela.

ahh .. outra coisa .. como é que eu criaria a outra tabela no Delphi ??

fiu lá no SQL Explorer .. selecionei o DBSISRET(onde tem todas as tabelas) .. abriu duas opções (TABLES, PROCEDURES), fui em TABLES .. botao direito e não tem opção de criar nova ...

Xafam, apenas para ficarem claras as coisas. Uma coisa é criar a tabela no Delphi (ferramenta de programação - seria via código) e outra coisa é utilizar uma das ferramentas que acompanham o Delphi - como é o caso SQL Explorer - com a qual você poderia criar a tabela.

Meu conhecimento em SQL Server é um pouco limitado (fazem 10anos que mexi com ele), mas vejo uma forma simples de criar a tabela vazia usando justamente o que passei antes. A diferença seria no fato de você adicionar uma condição (na cláusula where) que não retornasse algo. Para exemplificar, vou supor que nesta sua view exista um campo chamado CODIGO que um valor que sabemos não dever existir seria negativo:

select * into TAB_FROM_VIEW18 from VIEW18 where CODIGO = -1
Atualmente tenho trabalhado com o FireBird e esta sintaxe acima não funcionaria. Para este caso, eu teria que usar:
insert into TAB_FROM_VIEW18 select * 
from VIEW18 where CODIGO = -1

o qual funcionaria perfeitamente. Assim, você teria duas opções a testar na sua ferramenta de acesso ao banco (front-end) - se não me engano, o SQL Explorer permita execução de SQL's.

Dúvidas específicas do banco de dados (gerenciamento e SQL), você pode tirar na sessão Banco de Dados -> SQL Server

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus,

seguinte ...

usei o comando que você sugeriu ... e deu certo (depois que reparei que eu tinha criado a tabela TAB_FROM_VIEW18),

apareceu uma tabela identica a VIEW18 e sem nenhum dado nela ...

acho que seria melhor ela assim .. em branco .. já que tudo o que está na VIEW18 está impresso e será (de qualquer jeito) passado para a TAB_FROM_VIEW18 manualmente, atravez do programa

até agora nun tive mais nenhum erro de editar/gravar/salvar , apos a criação dessa tabela ...

para criar a tabela , era a coisa mais faciul de todas .. era so ir la no meu database (DBSISRET) , fui em Tables ..

e ai tinha uma aba escrito Enter SQL , ai fui e peguei o seu codigo, fiz algumas alterações (mudei o nome do campo CODIGO , para PlacaVeiculo), e executei .. ai (depois q eu fechei e abri de novo o delphi) apareceu a TAB_FROM_VIEW18 .. :D :D

acredito que o problema foi resolvido ...

valeu muito a sua ajuda ...

xafam

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...