GARANTIR DESCONTO

Fórum SimpleDataSet + Join + Configuração de ProviderFlags = Erro ao Excluir/Editar #419148

30/06/2012

0

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

Responder

Posts

30/06/2012

Marco Salles

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 []
Responder

Gostei + 0

30/06/2012

Dyego Santos

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.
Responder

Gostei + 0

30/06/2012

Dyego Santos

Esqueci de mencionar, o projeto está em Delphi 7
Responder

Gostei + 0

30/06/2012

Marco Salles

Esqueci de mencionar, o projeto está em Delphi 7


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

Gostei + 0

30/06/2012

Marco Salles

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
Responder

Gostei + 0

30/06/2012

Dyego Santos

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!
Responder

Gostei + 0

30/06/2012

Dyego Santos

Estou utilizando o Firebird 2.5
Responder

Gostei + 0

30/06/2012

Marco Salles

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
Responder

Gostei + 0

30/06/2012

Dyego Santos

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!
Responder

Gostei + 0

30/06/2012

Marco Salles

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
Responder

Gostei + 0

01/07/2012

Marco Salles

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
Responder

Gostei + 0

01/07/2012

Dyego Santos

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
Responder

Gostei + 0

01/07/2012

Marco Salles

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 ..
Responder

Gostei + 0

01/07/2012

Dyego Santos

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.
Responder

Gostei + 0

02/07/2012

Marco Salles

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
Responder

Gostei + 0

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

Aceitar