SimpleDataSet + Join + Configuração de ProviderFlags = Erro ao Excluir/Editar

Delphi

30/06/2012

Olá galera do Fórum DevMedia, sou novo por aqui e estou precisando de uma força ;)

Estou quebrando a cabeça para realizar Join com 2 tabelas em Firebird (Funcionários + Afastamentos) para exibir em um dbgrid, porém gera erro de coluna não encontrada ou não gera erro ao excluir/editar, na segunda situação, a informação não é atualizada no banco de dados, após executar o comando Simpledataset.delete/Simpledataset.edit e aplicar as atualizações (Simpledataset.applyupdates(-1)).

Já adicionei os campos da consulta com join no Fields Editor e Edit Internal Dataset, alterando a propriedade ProviderFlags para False (Update, Where, Key e Hidden) da tabela que não deve ser realizado o apply para False, porém sem sucesso, não sei mais o que fazer.

Segue abaixo a consulta que estou realizando:
SELECT AFASTAMENTOS.*, FUNCIONARIOS.FUN_NOME FROM AFASTAMENTOS LEFT JOIN FUNCIONARIOS ON AFASTAMENTOS.AFA_CODIGO = FUNCIONARIOS.FUN_CODIGO

Ao monitorar pelo SQL Monitor o código que está sendo passado contém a coluna FUN_NOME, mesmo desabilitando o providerFlags, existe alguma outra maneira de não passar a coluna fun_nome para atualizar/excluir?

Adicionei um DataSetProvider e antes de excluir passei o comando SimpleDataset.SetProvider(Provider_adicionado), no provider alterei o update Mode para upWhereKeyOnly e GetTableName informei a tabela de afastamentos, porém o erro persite.

Na tabela afastamentos, existe os campos:

afa_sequencia = chave primária, inteiro, providerflags = [pfInUpdate,pfInWhere,pfInKey]
afa_codigo = inteiro, providerflags = [pfInUpdate,pfInWhere]
afa_data_inicial = date, providerflags = [pfInUpdate,pfInWhere]
afa_data_final = date, providerflags = [pfInUpdate,pfInWhere]

Na tabela funcionarios, existe os campos:
fun_nome = string, providerflags = []
fun_codigo = inteiro, Não estou usando na consulta

Desde já agradeço a atenção de todos os usuários.
Dyego Santos

Dyego Santos

Curtidas 0

Respostas

Marco Salles

Marco Salles

30/06/2012

Bom dia .

Eu estou na dúvida dobre o campo

Limpe o seu Fields (Editor de Fileds)

com este sql quais são os campos que aparecem no seu editor ???

SELECT AFASTAMENTOS.*, FUNCIONARIOS.FUN_NOME FROM AFASTAMENTOS LEFT JOIN FUNCIONARIOS ON AFASTAMENTOS.AFA_CODIGO = FUNCIONARIOS.FUN_CODIGO

A recomendação é para a configuração update do DataSetProvider em upWhereKeyOnly é

chave primária, inteiro, providerflags = [pfInUpdate,pfInWhere,pfInKey] .. Parece que vc fez
demais campos relacionados a tabela AFASTAMENTOS = [pfInUpdate] ... Somente
demais campos da Tabela Join em []
GOSTEI 0
Dyego Santos

Dyego Santos

30/06/2012

Boa tarde Marco,

Ao abrir o editor de campos, ao clicar no botão add fields, aparece os campos da tabela principal, na qual eu preciso excluir os registros (AFASTAMENTOS) e o campo FUN_Nome da tabela de funcionários na qual é a tabela que não deve aparecer na instrução delete.

Ajustei novamente os campos no editor, porém sem sucesso, ao excluir apenas pelo executavel, exclui, porém não gera erro, porém ao depurar pelo Delphi, acusa que a coluna fun_nome não foi encontrada, abaixo consta o link para download do fonte e banco de dados, que estou realizando testes:

http://www.4shared.com/zip/h_cS6dJN/Join_SimpleDataSet.html

É possível realizar Join com SimpleDataset e excluir/editar o registro?

Até mais.
GOSTEI 0
Dyego Santos

Dyego Santos

30/06/2012

Esqueci de mencionar, o projeto está em Delphi 7
GOSTEI 0
Marco Salles

Marco Salles

30/06/2012

Esqueci de mencionar, o projeto está em Delphi 7


e sua base de dados ?? quala versão ??
GOSTEI 0
Marco Salles

Marco Salles

30/06/2012

Esqueci de mencionar, o projeto está em Delphi 7


e sua base de dados ?? quala versão ??


Vc disse Firebird no inicio .. mas minha versão é 2.1

Vc não passa o Script das tabelas
GOSTEI 0
Dyego Santos

Dyego Santos

30/06/2012

Segue abaixo o script das tabelas:

create table funcionarios
(
fun_codigo int not null,
fun_nome varchar(40),
primary key (fun_codigo)
);

create table afastamentos
(
afa_sequencia int not null,
afa_codigo int not null,
afa_data_inicial date,
afa_data_final date,
primary key (afa_sequencia)
);

Grato!
GOSTEI 0
Dyego Santos

Dyego Santos

30/06/2012

Estou utilizando o Firebird 2.5
GOSTEI 0
Marco Salles

Marco Salles

30/06/2012

Bem , eu vou tentar reproduzir o cenrário , porém vc esta utilizando forebird2.5 o o driver Interbase no delphi7
Não é garantia de compatibilidade. Algumas instruções mais simples selects * from podem serem resolvidas , mas não alguns
sql mais elaborados podem não retornar valores desejados
GOSTEI 0
Dyego Santos

Dyego Santos

30/06/2012

Estou utilizando DBExpress, com o driver Interbase + SimpleDataSet do DBExpress.

Ok, pois não sei mais o que fazer, tenho minhas dúvidas se realmente funciona Join com o componente SimpleDataset.

Abraços!
GOSTEI 0
Marco Salles

Marco Salles

30/06/2012

Estou utilizando DBExpress, com o driver Interbase + SimpleDataSet do DBExpress.

Ok, pois não sei mais o que fazer, tenho minhas dúvidas se realmente funciona Join com o componente SimpleDataset.

Abraços!


Bem , tem que fazer na mão os selects

utilizar o evento onBeforeUpdateRecord do TDataSetProvider
GOSTEI 0
Marco Salles

Marco Salles

30/06/2012

Estou utilizando DBExpress, com o driver Interbase + SimpleDataSet do DBExpress.

Ok, pois não sei mais o que fazer, tenho minhas dúvidas se realmente funciona Join com o componente SimpleDataset.

Abraços!


Bem , tem que fazer na mão os selects

utilizar o evento onBeforeUpdateRecord do TDataSetProvider


Então amigo , particularmente eu conheço duas formas de fazer .. Se quiser alterar tb o campo relacionado a tabela funcionarios , no caso em particular do Fun_Nome , tem que fazer os insertes/deletes/updates no Braço , utilizando o evento
onBeforeUpdateRecord do TDataSetProvider (qualquer coisa lhe passo um exemplo).

Mas se vc quiser alterar somente os campos relacionados a Tabela Afastamentos , voce deve manter as configuraçoes iniciais do ProviderFlags (igual a que vc fez) mas escrever um novo SQL . Ontem conversando em off com um amigo meu o Eduardo_Belo ele passou o SQL abaixo

SELECT
AFASTAMENTOS.AFA_SEQUENCIA,
AFASTAMENTOS.AFA_CODIGO,
AFASTAMENTOS.AFA_DATA_INICIAL,
AFASTAMENTOS.AFA_DATA_FINAL,
FUNCIONARIOS.FUN_NOME
FROM AFASTAMENTOS
INNER JOIN FUNCIONARIOS ON (AFASTAMENTOS.AFA_CODIGO = FUNCIONARIOS.FUN_CODIGO)

Fizemos os teste e fez as operações normalmente

[]sds
GOSTEI 0
Dyego Santos

Dyego Santos

30/06/2012

Estou utilizando DBExpress, com o driver Interbase + SimpleDataSet do DBExpress.

Ok, pois não sei mais o que fazer, tenho minhas dúvidas se realmente funciona Join com o componente SimpleDataset.

Abraços!


Bem , tem que fazer na mão os selects

utilizar o evento onBeforeUpdateRecord do TDataSetProvider


Então amigo , particularmente eu conheço duas formas de fazer .. Se quiser alterar tb o campo relacionado a tabela funcionarios , no caso em particular do Fun_Nome , tem que fazer os insertes/deletes/updates no Braço , utilizando o evento
onBeforeUpdateRecord do TDataSetProvider (qualquer coisa lhe passo um exemplo).

Mas se vc quiser alterar somente os campos relacionados a Tabela Afastamentos , voce deve manter as configuraçoes iniciais do ProviderFlags (igual a que vc fez) mas escrever um novo SQL . Ontem conversando em off com um amigo meu o Eduardo_Belo ele passou o SQL abaixo

SELECT
AFASTAMENTOS.AFA_SEQUENCIA,
AFASTAMENTOS.AFA_CODIGO,
AFASTAMENTOS.AFA_DATA_INICIAL,
AFASTAMENTOS.AFA_DATA_FINAL,
FUNCIONARIOS.FUN_NOME
FROM AFASTAMENTOS
INNER JOIN FUNCIONARIOS ON (AFASTAMENTOS.AFA_CODIGO = FUNCIONARIOS.FUN_CODIGO)

Fizemos os teste e fez as operações normalmente

[]sds


Olá Marco,

Então existe uma maneira de fazer sem usar um provider e passar os códigos SQL? Utilizando apenas o componente SimpleDataSet?
Efetuei um teste alterando o código SQL na Abertura da tabela, sem o provider, ajustei os campos, porém sem sucesso, poderia me enviar as modificações que você realizou?
Obrigado pela força ;) e ao Eduardo_Belo

[]s
GOSTEI 0
Marco Salles

Marco Salles

30/06/2012

Bem eu nãoutilizei o SimpleDataSet pq não estou familarizado com ele

Tb não recomendo utiliza-lo , pq vc não utiliza oconjunto sqldataSet , TdataSetProvider e clientDataSet

A dificuldade é a mesma e os ganhos são incriveis ..
GOSTEI 0
Dyego Santos

Dyego Santos

30/06/2012

Entendi, é que estou com um projeto que está com esse escopo e não queria mexer na estrutura, mas creio que não terá outra forma, utilizando ClientDataset + Provider + SQL Query também consegui eliminar sem problemas.

Obrigado pela ajuda e atenção Marco.
GOSTEI 0
Marco Salles

Marco Salles

30/06/2012

Veja bem o Simpledataset dificulta em muito uma transição futura de um projeto para n-tier ..

Se vc não separa agora ( o sqlDataSet+DataSetProvider=Um DataMOdudo <Servidor>) , ( o ClientdataSet outro dataMododulo<Cliente> ) tudo isto simulando com o TLOcalConection , ou utilizando o setprovider do clientdataset ,
para definir esses providers que estão em outro DataModulo , e no futuro vc quiser migrar para uma arquitetura multicamadas
vc tera um dificuldade adicional com o Simpleidataser . Foi um dos motivos que não me interressei por este componente

[]sds
GOSTEI 0
POSTAR