Fórum Alteração de Campo Lookup resultou em Column Unknown #335429
30/12/2006
0
estou com um problema aqui que não consigo resolver de jeito nenhum.
Estou usando SQL Query + Dataset provider + client dataset + datasource, com Firebird 1.5 e Delphi 7.
O problema todo é que, além dos campos que eu tinha na minha consulta SQL, eu incluí um campo CALCULATED no meu clientdataset. O meu cadastro/edição funcionava perfeitamente. Daí eu resolvi retirar este campo lookup do clientdataset e incluir este campo na consulta SQL dentro do SQLQuery, através de uma cláusula CASE. A consulta ficou desse jeito:
SELECT EMPRESTIMO.*, (CASE EMPRESTIMO.TIPO_ITEM WHEN ´C´ THEN (SELECT PLATAFORMA.NOME FROM PLATAFORMA, CONSOLE WHERE CONSOLE.COD = EMPRESTIMO.COD_ITEM AND CONSOLE.COD_PLATAFORMA = PLATAFORMA.COD) WHEN ´J´ THEN (SELECT JOGO.NOME_JOGO FROM JOGO WHERE JOGO.COD = EMPRESTIMO.COD_ITEM) WHEN ´A´ THEN (SELECT ACESSORIO.NOME FROM ACESSORIO WHERE ACESSORIO.COD = EMPRESTIMO.COD_ITEM) ELSE (SELECT REVISTA.NOME || EXEMPLAR.NUMERO FROM EXEMPLAR, REVISTA WHERE EXEMPLAR.COD = EMPRESTIMO.COD_ITEM AND REVISTA.COD = EXEMPLAR.COD_REVISTA) END) AS ITEM FROM EMPRESTIMO
Testei a consulta isoladamente no IBExpert e funciona perfeitamente.
Além disso, todos os providerflags do campo ITEM acima estão como FALSE. O campo COD está TRUE para update, where e key, e os demais, com exceção do campo ITEM, estão apenas como update.
Não há chaves estrangeiras nesta tabela. A única constraint aí é a Chave Primária, que é o campo COD.
Outra informação importante é que os nomes dos campos foram preservados, ou seja, em termos de nome de campo nada mudou em relação ao que já estava antes da alteração.
O erro acontece no ApplyUpdates. Antes de editar o registro eu faço um cds.Edit. No Salvar faço um Post, seguido de um ApplyUpdates. Já funcionava assim antes.
Em resumo: a única coisa que mudou foi o tipo do campo ITEM, que deixou de ser CALCULATED para ser DATA. Todos os nomes permanecem os mesmos. No entanto o erro COLUMN UNKNOWN ocorre com dois campos: data_emprestimo e tipo_item.
Muito obrigado pela ajuda, pessoal !!
Marcelocda
Curtir tópico
+ 0Posts
30/12/2006
Marcelocda
Gostei + 0
30/12/2006
Marcelocda
Eu fiz as seguintes alterações no SQL:
SELECT COD, TIPO_ITEM, COD_ITEM, DATA_EMPRESTIMO, DATA_DEVOLUCAO, FAVORECIDO, FAVORECIDO_TEL, OBS, DT_CAD, LEMBRETE, EMAIL_FAVORECIDO FROM EMPRESTIMO
Ou seja, eu retirei a coluna que vinha da cláusula CASE. Após eu ter feito isso tudo voltou a funcionar.
No entanto, eu realmente preciso desta coluna, que chama-se ITEM, pois na minha listagem eu tenho um filtro que é aplicado nela. Por este motivo ela não pode ser do tipo CALCULATED ou LOOKUP, justamente porque eu preciso filtrar e o Filter do clientdataset não atua sobre este tipo de campo.
Eu tentei deixar o CASE no SQL, adicionando o campo no SQLQuery e no ClientDataSet, colocando todos os provider flags deste campo de ambos os componentes em FALSE. Quando fiz isso o erro voltou.
Vale ressaltar que eu preciso deste campo ITEM apenas para a LISTAGEM, no qual será aplicado um FILTRO. É APENAS por este motivo que eu inclui esta cláusula CASE no meu SQL.
Por favor, pessoal, alguém poderia me dar uma dica sobre isso ?
Obrigado mais uma vez.
Gostei + 0
30/12/2006
Marcelocda
o referido ITEM em questão, pode ser de 1 dentre 4 tabelas possíveis. Se nessa situação eu usasse um JOIN, como se o campo ITEM fosse apenas de uma outra tabela (uma só possível), funcionaria perfeitamente, pois tenho situações idênticas a esta aqui, também utilizando FILTRO.
É para isso que serve o campo TIPO_ITEM, para identificar a qual tabela ele pertence. Esta solução não é a mais adequada, com certeza. Poderia ter sido modelado de forma melhor...
Então, quando eu faço o CASE ele não consegue identificar a qual tabela pertence o campo ITEM. Esta é a única explicação racional que eu consegui até agora para isto, já que quando uso JOIN ele identifica o campo sem problemas.
Alguém poderia me dar alguma idéia para a resolução deste pepino ?
Valeu !
Gostei + 0
30/12/2006
Marcelocda
SELECT E.*, J.NOME_JOGO AS NOME FROM EMPRESTIMO E, JOGO J WHERE E.COD_ITEM = J.COD AND E.TIPO_ITEM = ´J´ UNION SELECT E.*, A.NOME AS NOME FROM EMPRESTIMO E, ACESSORIO A WHERE E.COD_ITEM = A.COD AND E.TIPO_ITEM = ´A´ UNION SELECT E.*, (SELECT PLATAFORMA.NOME FROM PLATAFORMA WHERE C.COD_PLATAFORMA = PLATAFORMA.COD) AS NOME FROM EMPRESTIMO E, CONSOLE C WHERE E.COD_ITEM = C.COD AND E.TIPO_ITEM = ´C´ UNION SELECT E.*, CAST((SELECT REVISTA.NOME || EX.NUMERO FROM REVISTA WHERE REVISTA.COD = EX.COD_REVISTA) AS VARCHAR(250)) AS NOME FROM EMPRESTIMO E, EXEMPLAR EX WHERE E.COD_ITEM = EX.COD AND E.TIPO_ITEM = ´E´
Desta forma não ocorrem mais problemas do tipo ´column unknown´.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)