Fórum SimpleDataSet + Join + Configuração de ProviderFlags = Erro ao Excluir/Editar #419148
30/06/2012
0
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
Curtir tópico
+ 0Posts
30/06/2012
Marco Salles
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
30/06/2012
Dyego Santos
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
30/06/2012
Dyego Santos
Gostei + 0
30/06/2012
Marco Salles
e sua base de dados ?? quala versão ??
Gostei + 0
30/06/2012
Marco Salles
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
30/06/2012
Dyego Santos
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
30/06/2012
Dyego Santos
Gostei + 0
30/06/2012
Marco Salles
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
30/06/2012
Dyego Santos
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
30/06/2012
Marco Salles
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
01/07/2012
Marco Salles
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
01/07/2012
Dyego Santos
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
01/07/2012
Marco Salles
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
01/07/2012
Dyego Santos
Obrigado pela ajuda e atenção Marco.
Gostei + 0
02/07/2012
Marco Salles
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
Clique aqui para fazer login e interagir na Comunidade :)