Fórum dbExpress Interbase 6.5 Delphi 7.0 #316434

17/03/2006

0

Esta semana o computador me pegou para dar uma coça... Mas fo a semana toda e no fim ainda esta me dando outra.. mMe segurem senão vou quebrar esta joça

Uso os componetes
SQLConnection1 -> SQLDataSet1 -> DataSetProvider1 -> ClientDataSet1 -> DataSource1

ligados conforme manda as boas normas

Tenho tb um DbGrid , um Data Sorce e um Botao

Apresnto os dados faço algumas alteraçoes e quando clico no botão

procedure TForm1.Button1Click(Sender: TObject);
begin
ClientDataSet1.ApplyUpdates(0);
end;

[b:09ef8812a7]me dá o erro abaixo :[/b:09ef8812a7]


[URL=http://imageshack.us][img:09ef8812a7]http://img85.imageshack.us/img85/6292/imagemdbespress19wc.png[/img:09ef8812a7][/URL]


[b:09ef8812a7]e seguindo com a execução do aplicativo , me da o erro[/b:09ef8812a7]


[URL=http://imageshack.us][img:09ef8812a7]http://img116.imageshack.us/img116/8593/imagemdbespress21lo.png[/img:09ef8812a7][/URL]

o problema é que qualquer tabela que vou abrir no Interbase , e depois tento salvar alguns dados <usando a tecnologia DbExpress> , me da este erro....

Usando o IBExpert consigo salvar normalmente as modificaçoes...

Alem disso ja desistalei o Delphi 7.0 e tb o Interbase 6.5 ... E nada

espero muito ajuda . Obtrigado...


Marco Salles

Marco Salles

Responder

Posts

17/03/2006

Vinicius2k

Marco,

Verifique a instrução SQL do TSQLDataSet.

Com dbExpress, os nomes dos objetos do banco de dados (tabelas, campos, SPs, etc) devem estar em maiúsculas. Ex:
// erro
select campo1, campo2, campo3 from tabela
// correto
select CAMPO1, CAMPO2, CAMPO3 from TABELA



Responder

Gostei + 0

17/03/2006

Marco Salles

vinicius2k , é um dos exemplos mais bobo que eu ja fiz na vida

é um exemplo do livro do Guinther , da pag14 do seu livro (Programação para banco de dados)

Para se ter uma idéia da simplicidade o SQL esta Assim

SELECT *FROM CUSTOMER


é o exemplo dele do próprio guinther

isto esta me dando danda dor de cabeça , que ja desistalei e reistalei tudo que tinha direito na máquina... E O pior , tinha componentes de terceiros que vou ter o trabalhão de reistala-los

Levei o problema para casa e la tb deu o mesmo erro

o erro acontece , quando eu simplesmente edito qualquer campo e dou um ClientDataSet1.ApplyUpdates(*); *=0 ou -1

verifiquei devido a segunda mensagem que Fala de Chave Primária.. Algo esta reclamando da ausencia desta Chave.. Mas em processo de edição , não teria sentido ele reclamar Ou teria ????

Outra coisa , criei uma Banco de Dados no Interbase , e nele uma tabela muito simples com dois campos apenas

A Dll desta tabela e esta assim

CREATE TABLE TOTENTANDO (
    COD_VENDA   INTEGER NOT NULL,
    NOME_ALUNO  VARCHAR(30)
);


eu então atraves do DbGrid insiro os dados , tomando o cuidado para não ter nenhum registro repetido e logo no primeiro dado quando clico no botão ele da a mensagem de erro escrita la em cima no Primeiro post..

Porem , quando se tem um Banco com Generator e Triger (Que é o caso do CUSTOMER) eu consegui inserir e entrar com os Dados , so que tive que excluir o Campo ´PK´ do Sql , deixando o Banco retornar o Valor para esta Chave...

[b:9cfb56af5d]Mas qy=uando não se tem Generator e ne Triger , como no caso da tabela que criei la em cima , porque eu não esto uconseguindo digitar dados , Mesmo quando insiro todos os valores
corretamente para os Campos (Cod_Venda e Nome_Aluno)[/b:9cfb56af5d]

O Sql neste ultimo Caso tb é Muito simples

SELECT *FROM TOTENTANDO 


Onde TOTENTANDO É O nome do minha tabela

[b:9cfb56af5d]Conclusão : So posso incluir algum valor se a chave primaria tiver um Generator.. Não tem sentido isso.. MAs é assim que esta funcionando comigo... As tabelas que eu tenho Chave Primaria com GENERATOR eu uso a query sem definir esse campo e incluo os outros dados no DBGRID , ai não da erro... Mas isto não é muito lógico ou é [/b:9cfb56af5d]


Responder

Gostei + 0

17/03/2006

Vinicius2k

Marco,

O exemplo que você está seguindo pede que você altere os valores padrão de alguma das propriedades do TDataSetProvider?
Se sim, quais?

Não creio que seja um problema relacionado a existir ou não Generator + Trigger e sim existir ou não uma chave primária:

Se sua tabela não tem uma PK e o [b:1d1b6c2286]UpdateMode[/b:1d1b6c2286] do TDataSetProvieder estiver como [b:1d1b6c2286]upWhereKeyOnly[/b:1d1b6c2286], ele não possui uma chave para utilizar no Where, logo, não consegue atualizar...

Não posso afirmar que seja isso... É só um exemplo de como as configurações do TDataSetProvider influenciam no tratamento da informação.


Responder

Gostei + 0

17/03/2006

Adriano Santos

Marco, blz?

Cara estou com o Vinicius2K, acredito que não tenha nada a ver com o fato de ter ou não PK na tabela. Acredito que seja alguma configuração de propriedade mesmo.

Vc tem como me passar o exemplinho que está tendo dificuldade? Queria testar este final de semana. Não sou nenhum expert em DBExpress, mas talvez consiga algo.

flw.


Responder

Gostei + 0

18/03/2006

Marco Salles

Vc tem como me passar o exemplinho que está tendo dificuldade? Queria testar este final de semana.



Então vamos lá

A estrutura que estou usando [color=darkblue:aed0e1e635][b:aed0e1e635]Poxa , acho que todos que puderem testar e comentar o seu resultado , seria otimo..

O Exemplinho é muito fácil e rápido

Não toma nen um minuto.. Mas me ajuda demais[/b:aed0e1e635][/color:aed0e1e635]

A estrutura que to usando é


SQLConnection1 -> Clico no SqlConnection e escolho Interbase me conecto ao banco Employye... Todos tem este banco de exemplo no Delphi7.0 ; Que fica em C:\Arquivo de programas\Programas comuns\Borland Shared\Data\Employee SQLQuery a)Propriedade SqlConnection atribuo Sqlconnection1 b)Propriedade Sql digito SELECT *FROM CUSTOMER DatasetProvinder a)Propriedade ProvinderName atribuo o SqlQuery ClintDataSet a)Propriedade ProvinderName Atribuo DataSetProvinder1 DataSource a)Propriedade DataSet atribuo ClientDateSet1 DBgrid Ligo ao Datasource1 DbNavegator Lido ao DataSouce1 Botão 1 no evento OnClick Digito ClientDataSet1.ApplyUpdates(0);


[color=darkblue:aed0e1e635][b:aed0e1e635]Ta ai ... Rodo a aplicação e façao aqualquer alteração no DbGrid e Clico no Botão... [/b:aed0e1e635][/color:aed0e1e635]



:?: :?: :?: :?: :?: :?: :?:
Faço simplesmente isso e não da certo :cry: :cry: :cry: O que acontece no caso de voce :?: :?: :?:


Por favor , postem os resultados.....


Responder

Gostei + 0

18/03/2006

Vinicius2k

Marco,

Só para me certificar que foi apenas um erro de digitação...
A instrução SQL que você informa está incorreta: falta um espaço entre o ´*´ e o ´FROM´.


Responder

Gostei + 0

18/03/2006

Marco Salles

Só para me certificar que foi apenas um erro de digitação... A instrução SQL que você informa está incorreta: falta um espaço entre o ´*´ e o ´FROM´.


Não , foi erro mesmo .... Não me atinei para isto.. Nunca , nen na epoca do BDE

Parece que esta resolsolvido o problema.... Mas porque da esta diferença tão grande ????Nunca me atinei isto , nen usando o BDE , nunca deu falta desse Espaço .... Agora eu ja não sei se eu colocava ou colcava naturalmente , mas usando BDE isto para mim nunca foi problema


Responder

Gostei + 0

18/03/2006

Marco Salles

Vincius2k brilhantemente de maneira sutil voce tirou um elefante em cima das minhas costas. Mas tem outro montado

Sobre esse asunto :

Se sua tabela não tem uma PK e o UpdateMode do TDataSetProvieder estiver como upWhereKeyOnly, ele não possui uma chave para utilizar no Where, logo, não consegue atualizar...


Nomeu caso que estou estudando a[b:464ffd2c75] tabela employye [/b:464ffd2c75]temos uma chave cujo select esta assim:
Select * From CUSTOMER


a biografia manda , manda efetuar os seguintes passos

1)No ClinteDataset de um AddFields 2)selecione todos os campos com exceção do Chave(Que no caso é o CUST_NO) 3)altere na propriedade ProvinderFlags , opção pfInWhere para false exemplo:Ficando esse Tfields assim : ProviderFlags = [pfInUpdate] 4)Para o Campo Chave , altere a Propriedade ProvinderFlags a Opção exemplo: Ficanodo TFiled para a chave assim: ProviderFlags = [pfInUpdate, pfInWhere, pfInKey] 5)Finalmente va em UpdateMode do TDataSetProvieder e altere para upWhereKeyOnly, ficando assim :UpdateMode = upWhereKeyOnly


Com essas medidas , que estão descritas no livro do Guinther pag 15
estamos fazendo uma configuração na clausula WHERE , para ser otimizada.... Isto é importante para processar a instrução de maneira muito mais rápida

:cry: :cry: :cry: :cry:
[color=darkblue:464ffd2c75][b:464ffd2c75]Na hora de executar a aplicação , da erro.. Não consigo atualizar (ClintDataSet.ApplyUpdates(0));[/b:464ffd2c75][/color:464ffd2c75]

[b:464ffd2c75]Alguem ou o proprio Vinicus , consegue enxergar algo nesse processo que não estou fazendo ou deixando de Fazer...[/b:464ffd2c75]


[b:464ffd2c75]O Elefante esta pesado[/b:464ffd2c75]

Se quiserem testar , é importante porque esta tecnologia é a que estará em ´Alfa´ durante os proximos cinco anos.. Temos que começar

Muito obrigado


Responder

Gostei + 0

18/03/2006

Martins

Olá [b:85fcc4154e]Marco Salles[/b:85fcc4154e], fiz tudo q está sendo indicado por vc, mudei
1)No ClinteDataset de um AddFields 2)selecione todos os campos com exceção do Chave(Que no caso é o CUST_NO) 3)altere na propriedade ProvinderFlags , opção pfInWhere para false exemplo:Ficando esse Tfields assim : ProviderFlags = [pfInUpdate] 4)Para o Campo Chave , altere a Propriedade ProvinderFlags a Opção exemplo: Ficanodo TFiled para a chave assim: ProviderFlags = [pfInUpdate, pfInWhere, pfInKey] 5)Finalmente va em UpdateMode do TDataSetProvieder e altere para upWhereKeyOnly, ficando assim :UpdateMode = upWhereKeyOnly


E testei, deu tudo certo aqui, sem mensagem de erro nem nada, quer q eu mande o exemplo para vc ver? Se quiser é só me passar o e-mail, não disponibilizo para mais pessoas pq não tenho um server para hospedar o código.

Abraço!


Responder

Gostei + 0

18/03/2006

Marco Salles

Martins , acho que voce deve ter conseguido .. MAs não desta forma .. Pois to apostando que ela contem um erro

Se não corrigir este erro , futuramente outras pessaos irão errar também

Eu tenho 99¬ de certeza que esta errado isto aqui

1)No [b:800e7c8393]ClinteDataset[/b:800e7c8393] de um AddFields 2)selecione todos os campos com exceção do Chave(


Não é no ClinteDataset que se deve alterar os Flags mas sim No SqlDataSet.. Pois são eles os TSql.... os Responsáveis por passaram Uma instrução Slq para o DatasetProvider , para que este execute a instrução no Banco..


[b:800e7c8393]Voce pode ter os mesmo fields no ClinteDataSert , mas é necessário que se tenha esses Tfilds no SqlQuery.. Pois bem , esta fo ia conclusão que eu cheguei lendo pesquisando e experimentando[/b:800e7c8393]


Responder

Gostei + 0

18/03/2006

Martins

Marcos, segui todos esses passos.

1)No ClinteDataset de um AddFields 2)selecione todos os campos com exceção do Chave(Que no caso é o CUST_NO) 3)altere na propriedade ProvinderFlags , opção pfInWhere para false exemplo:Ficando esse Tfields assim : ProviderFlags = [pfInUpdate] 4)Para o Campo Chave , altere a Propriedade ProvinderFlags a Opção exemplo: Ficanodo TFiled para a chave assim: ProviderFlags = [pfInUpdate, pfInWhere, pfInKey] 5)Finalmente va em UpdateMode do TDataSetProvieder e altere para upWhereKeyOnly, ficando assim :UpdateMode = upWhereKeyOnly


E não tive problemas, vc quer q eu te mande o exemplo para vc dá uma olhada, ressalto ainda q o mesmo foi feito em Delphi 6, q é a única versão q tenho nessa máquina.

Valew!!!!


Responder

Gostei + 0

18/03/2006

Marco Salles

é martins .. Isto me encabula..

Porque teoricamente quem ´´e responsável por enviar as instruçoes Sqk para o DataSetProvider é nesse caso O SqlQuery e não o clientDataSet

Se voce consegui realizar isto somente definindo Tfields para o ClinteDataSet Meu email ´´e este :

salhamoda@uol.com.br


Responder

Gostei + 0

18/03/2006

Martins

[quote:d0b4b188fb=´Marco Salles´]é martins .. Isto me encabula..

Porque teoricamente quem ´´e responsável por enviar as instruçoes Sqk para o DataSetProvider é nesse caso O SqlQuery e não o clientDataSet

Se voce consegui realizar isto somente definindo Tfields para o ClinteDataSet Meu email ´´e este :

salhamoda@uol.com.br[/quote:d0b4b188fb]

Enviei para seu e-mail, e confirmei aquele ant-spam chato da UOL, hehehe :P

Tá, qualquer coisa, posta aqui.

Valew


Responder

Gostei + 0

18/03/2006

Vinicius2k

Marco,

No modelo proposto, ´quem manda´ nas configurações de TFields é o DataSet (TSQLDataSet/TSQLQuery) e não o TClientDataSet. [b:1e298542e1]As alterações na propriedade ProviderFlags devem ser feitas nos TFields do TSQLQuery/TSQLDataSet[/b:1e298542e1] e você nem precisa de TFields no TClientDataSet para isso (logicamente pode precisar para outras coisas).

1. Adicione todos os TFields no TSQLQuery/TSQLDataSet.
2. Faça as mudanças necessárias ao seu propósito.
3. Então, se quiser, adicione os TFields no TClientDataSet. Você verá que os TFields do TClientDataSet terão herdadas as alterações feitas nos TFields do TSQLDataSet/TSQLQuery.

Correndo o risco de parecer pretencioso por se tratar de um livro do Guinther, se ele não o orienta desta forma, infelizmente, ele está errado.


Responder

Gostei + 0

19/03/2006

Marco Salles

No modelo proposto, ´quem manda´ nas configurações de TFields é o DataSet (TSQLDataSet/TSQLQuery) e não o TClientDataSet. As alterações na propriedade ProviderFlags devem ser feitas nos TFields do TSQLQuery/TSQLDataSet e você nem precisa de TFields no TClientDataSet para isso (logicamente pode precisar para outras coisas).


Se voce perceber nos meus tópicos anteriores , eu bati o tempo todo nesta tecla.. E O Martins bateu em uma outra direção
Gentilmente , ele me enviou um email com o seu projeto e pude perceber uma diferença entre o que fiz e o que ele fez
No seu exemplo o Martins usou Um [b:945a9e01fb]SqlDataSet[/b:945a9e01fb] em contraMão do [b:945a9e01fb]SqlQuery[/b:945a9e01fb] que estou usando...
De posse disso , para verificar a [b:945a9e01fb]otimização da Instrução Sql[/b:945a9e01fb]([color=darkred:945a9e01fb]Atraves dos ProvinderFlgas)[/color:945a9e01fb] , coloquei Um [color=darkblue:945a9e01fb]SqlMonitor [/color:945a9e01fb] no Projeto e o configurei para me fornecer um [b:945a9e01fb]Arquivo De Log[/b:945a9e01fb]
[color=darkblue:945a9e01fb][b:945a9e01fb]Nesse artigo de Log pude constatar que o Sql esta mesmo OTIMIZADO , sem que se configurrasse os TFILEDS do TSQLDataSet[/b:945a9e01fb][/color:945a9e01fb]
:!: :!: :!: :!:
De posse desta informação ,[b:945a9e01fb] retirei [/b:945a9e01fb]também os TFileds do ClinteDatset e refis a execução , para que un[b:945a9e01fb] Novo [/b:945a9e01fb]Arquivo de log fosse gerado...
:!: :!: :!:
Para minha surpresa , o Arquivo de log gerado também esta[b:945a9e01fb] OTIMIZADO[/b:945a9e01fb]

:idea: :idea: :idea:
[color=darkblue:945a9e01fb][b:945a9e01fb]ORA , sera uma propriedade do TSQLDataSet , que nos bastidores , ja faz esta otimização .... [/b:945a9e01fb][/color:945a9e01fb] :arrow: Não tenho nenhuma biografia a repeito desse comentário, mas fica registrado que [b:945a9e01fb]foi isso que o Arquivo Log me mostrou[/b:945a9e01fb] , quando usei um SQLDataSet , sem fazer nenhuma configuração dos ProviderFlags dos seus DataSets

Veja parte que interresa do Arquivo gerado , usando SqlDataset sem Configurar o ProviderFlags
update ´SALES´ set ´ORDER_STATUS´ = ? where ´PO_NUMBER´ = ?


O mesmo arquivo Gerado usando SQLQuery , sem confighurar Os ProviderFlags
update ´CUSTOMER´ set ´ORDER_STATUS´ = ? where ´CUST_NO´ = ? and ´CUSTOMER´ = ? and ´CONTACT_FIRST´ = ? and ´CONTACT_LAST´ = ? and ´PHONE_NO´ = ? and ´ADDRESS_LINE1´ = ? and ´ADDRESS_LINE2´ is null and ´CITY´ = ? and ´STATE_PROVINCE´ is null and ´COUNTRY´ = ? and ´POSTAL_CODE´ = ? and ´ON_HOLD´ is null


No mais
Correndo o risco de parecer pretencioso por se tratar de um livro do Guinther, se ele não o orienta desta forma, infelizmente, ele está errado.


O livro esta assim sim,

se eu antes de comprar o livro li os vinte artigos do clube delphi sobre dbexpress/DataSnap to na página 15 com esta dificuldade imagine quando passar para um artigo aonde eu não manjar nada , ai que não vou sair do lugar :cry: :cry: :cry: :cry:


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar