Lookup de campo do form não aceita NOT EXISTS e nem IN no SELECT

Quero que a lista do campo de aluno liste todos os alunos que sejam da turma e ainda não constem na lista de faltas dessa turma. Porém, ao usar a cláusula NOT EXISTS o select dá problema, exibindo o id (primeiro campo) no lugar do nome (segundo campo usado como rótulo). Vejam:

#1 - o select para todos os alunos da turma, que funciona perfeitamente, exibindo o nome (nm_aluno) e gravando o ID (id_aluno):
SELECT a.id_aluno , a.nm_aluno
FROM aluno a
INNER JOIN turma_aluno ta ON ta.id_aluno = a.id_aluno
WHERE ta.id_turma = [ii_id_turma]
ORDER BY a.nm_aluno

#2 - agora o mesmo select, mas com a inclusão do NOT EXISTS no WHERE para não exibir alunos que já estejam na tabela de faltas, evitando a duplicidade e consequente erro de chave única
SELECT a.id_aluno , a.nm_aluno
FROM aluno a
INNER JOIN turma_aluno ta ON ta.id_aluno = a.id_aluno
WHERE ta.id_turma = [ii_id_turma]
AND not exists (SELECT 1 FROM falta f WHERE f.id_aluno = a.id_aluno AND f.id_turma = [ii_id_turma])
ORDER BY a.nm_aluno

#3 - agora o mesmo select do #2, mas usando o IN (menos performático) ao invés do NOT EXISTS (mais performático), mas que produz o mesmo efeito nesse caso, para ver se funciona
SELECT a.id_aluno , a.nm_aluno
FROM aluno a
INNER JOIN turma_aluno ta ON ta.id_aluno = a.id_aluno
WHERE ta.id_turma = [ii_id_turma]
AND a.id_aluno NOT IN (SELECT f.id_aluno FROM falta f WHERE f.id_turma = [ii_id_turma])
ORDER BY a.nm_aluno

Tanto nas soluções 2 e 3 tive problemas com Bug do SC. O que ocorre é que ele exibe o id_aluno a invés do nm_aluno na recuperação do registros já existentes ao abrir a aplicação e a lista de alunos do combobox fica vazia ao inserir um registro novo ou alterar um existente, sendo que existem registros (alunos) a serem exibidos.

E se criar views?

Também estava tentando usar o NOT EXISTS, mas para Campo Numérico Auto Complete, e testei também com campo do tipo SELECT, mas nos dois casos o SC se perde.

O que acabei fazendo foi o seguinte:
Mudei o campo para digitação simples com ligação de captura, e nesta (grid), fiz o SELECT com o NOT EXISTS.
No formulário com o campo numérico vou apenas criar uma função com as mesmas condições para o SELECT (NOT EXISTS).

Infelizmente foi a maneira que consegui fazer.

Esse select como é mais ‘complexo’ usar inner join que já tem o where do join embutido nele e ainda usa-se o select externo com um campo [] por isso que não esta dando
certo diretamente no SC seria obrigatório neste caso especifico o uso de VIEW.

Estou encontrando o mesmo problema que você, quando vou utilizar meu select dentro de um formulário “Mestre-Detalhe” encontro este problema de trabalhar com NOT IN e o select mostrar somente o valor original do lookup.
Nas versões anteriores do SC não tínhamos esse problema.

Kleyber, mesmo criando a view o problema persiste.

Vejam abaixo como ficou a implementação do teste com a view:

#1 - A View:
CREATE VIEW vw_aluno_sem_falta AS
SELECT ta.id_turma as id_turma, a.id_aluno as id_aluno, a.nm_aluno as nm_aluno
FROM aluno a
INNER JOIN turma_aluno ta ON ta.id_aluno = a.id_aluno
WHERE not exists (SELECT 1 FROM falta f WHERE f.id_aluno = a.id_aluno AND f.id_turma = ta.id_turma);

#2 - O Select do lookup do sc:
SELECT a.id_aluno, a.nm_aluno
FROM vw_aluno_sem_falta a
WHERE a.id_turma = [ii_id_turma]
ORDER BY a.nm_aluno

O mesmo problema ocorreu: ao invés do nome, o formulário exibe o ID do aluno. Os nomes só aparecem no momento de edição do registro. Logo após salvar ele passa a exibir o ID. Registros recuperados ao abri o formulário também exibem apenas o ID do aluno.

Amigos do Fórum…
Tenho encontrado esse problema nesta versão 8, e sinceramente não sei se na versão 7 isso já acontecia.
Utilizo o Scriptcase desde a V2 até a V5 e esse procedimento acontecia conforme declarado no primeiro post (sempre com ID e nome).
A questão do uso da view não é uma opção ao meu ponto de vista, porque é impraticável montar uma view para cada necessidade dos campos nas aplicações.

No meu caso, ainda utilizava uma estratégia para que exibisse o campo na inclusão somente se não tivesse já registrado, mas ao mesmo tempo se estivesse na edição, o sistema deveria exibir, mesmo que em read-only. Segue exemplo abaixo:

================================
#tb_aluno (cod_unidade_escolar (PFK) INTEGER, cod_aluno (PK) INTEGER, dsc_aluno VARCHAR(100));
#tb_matricula_aluno (cod_aluno (PFK) INTEGER, cod_unidade_escolar (PFK) INTEGER, num_ano_letivo (PFK) INTEGER)
select
a.cod_aluno, a.dsc_aluno
from
tb_aluno a
where
a.cod_unidade_escolar = {unidade}
and not exists (select cod_aluno from tb_matricula_aluno where cod_aluno = a.cod_aluno and cod_aluno <> {cod_aluno}
and num_ano_letivo = {ano} and cod_unidade_escolar = a.cod_unidade_escolar)
order by a.dsc_aluno

*Dentro do not exists eu fazia o tratamento para exibir se já estivesse cadastrado (edição read-only) ou exibir os que não estavam cadastrados (novo).

Tenho produtos na qual a lista é grande, então quando não exibimos o que já está cadastrado na tabela em questão, já otimiza e facilita a utilização do nosso cliente.
A solução nada prática e funcional que tenho feito, é deixar sem a condição NOT IN ou NOT EXISTS, e ao cliente clicar em incluir, eu tenho q fazer um lookup no onBeforeInsert validando se o cadastro já foi realizado.

qual é o banco de dados.

Não é uma boa prática usar sub select em condições where. Use Inner Join.

Olá Haroldo, estou utilizando o PostgreSql 9.4.

Não é questão de boa prática, é questão de necessidade… Esse modelo eu utilizei nas versões mais antigas do SC e mostrei apenas como exemplo, pois na época não tinha como utilizar JOIN para tratar da maneira que apresentei.

Como quero exibir somente o que não está registrado, utilizei o LEFT JOIN por exemplo, tratando um campo da tabela RIGHT como NULL e ele apresenta o mesmo problema, exibe somente o ID e não a descrição.

Eu posso orientar sobre tua postagem aqui, sobre outros caso não consigo ajudar e nem sobre versões anteriores.
Já tentou visualizações? (Views)?

Sim Haroldo, é justamente por isso que postei, estou com dificuldades em encontrar uma solução para esse caso… rs

Na verdade utilizando View ele apresenta o mesmo problema. Acredito que seja um Bug, pois ao rodar o modo debug, o Scriptcase faz o Select corretamente, inclusive copio o Select exibido no debug e executo no BD sem problemas, ele me retorna o resultado conforme o Select (Id e Nome). O problema é que o Scriptcase buga ao exibir o resultado no lookup do Select.

que tipo de campo é?

Integer no Banco de Dados e Select no Scriptcase.

se vc fizer um sc_lookup com esse select, funciona?

Se funcionar, monta dinamicamente o select.

Aqui tem um exemplo de como:

http://iw.servehttp.com:81/sc81/app/forum_sc/control_campo_select_dinamico

Eu sempre utilizo tanto a clausula IN como o NOT EXISTS no SC com o PostgteSQL 9.X e nunca tive problemas.
qual a tua real necessidade ?

Att,
Paulo.

Paulo, sempre que usamos IN ou NOT EXISTS no campo SELECT dentro do Formulário, ele aparece apenas o ID no modo edição.

Pessoal, estava analisando o caso aqui hoje, e descobri a causa e a solução para este problema.
Na verdade, estava forçando ao SC que exibisse o registro que ainda não existia cadastrado no modo de inclusão, só que quando eu faço isso no modo de alteração/edição, o SC identificava o ID mas ele não trazia mais o lookup do nome pois a própria cláusula impedia que ele mostrasse (“where not exists…”).

Com isso, a solução é justamente “tratar” o select para que ele mostre caso esteja vinculado na tabela, mas não esteja vinculado ao “campo” do ScriptCase.

No próprio exemplo que citei já estava a solução…
“where cod_aluno = a.cod_aluno and cod_aluno <> {cod_aluno}”

Erikson, baseado no seu Select eu te mando um exemplo de como deve ficar no seu Formulário:

SELECT a.id_aluno , a.nm_aluno
FROM aluno a
INNER JOIN turma_aluno ta ON (ta.id_aluno = a.id_aluno)
WHERE ta.id_turma = [ii_id_turma]
AND NOT EXISTS (SELECT * FROM falta f WHERE f.id_turma = ta.id_turma AND f.id_aluno = a.id_aluno AND f.id_aluno <> {id_aluno})
ORDER BY a.nm_aluno

*Onde {id_aluno} deve ser o campo do seu formulário.

Aos amigos do Fórum agradeço a colaboração de todos em ajudar!