GARANTIR DESCONTO

Fórum Alteração de Campo Lookup resultou em Column Unknown #335429

30/12/2006

0

Pessoal,

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

Marcelocda

Responder

Posts

30/12/2006

Marcelocda

Pessoal, por favor, onde estiver escrito LOOKUP, favor entender como CALCULATED.


Responder

Gostei + 0

30/12/2006

Marcelocda

Consegui alguns progressos, porém, ainda não consegui resolver o problema completamente.

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.


Responder

Gostei + 0

30/12/2006

Marcelocda

Pessoal, há um detalhe que não mencionei:

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 !


Responder

Gostei + 0

30/12/2006

Marcelocda

Resolvi o problema. Tive que mudar o SQL para funcionar. Ficou desta forma:

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


Responder

Gostei + 0

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

Aceitar