Página 1 de 1
Incluir conforme falta/existe
Enviado: 15 Set 2020 18:28
por JoséQuintas
Já vi que é possível, mas ainda pensando....
Tenho lá
Licencas: IdLicenca
Categorias: IdCategoria
LicMix: é a lista de licenças pra cada categoria IdLicMix, LicMixCategoria, LicMixLicenca
Patrimonio: IdPatrimonio, PatriCategoria
PatDetalhe: é a lista REAL de licenças, contendo: IdPatDetalhe, PatDetLicenca, PatDetPatrimonio
Até aí, tudo bem, tudo ok.
O quebra cabeças vai ser, por exemplo:
Ao incluir uma licença para uma categoria, cadastrar automaticamente em todos os itens do patrimonio que ainda não tem isso (não deveria ter, mas vai que tem)
E como deixei flexível... fazer isso a partir das licenças ou do patrimônio, na inclusão e exclusão.
Vai ficar interessante, e é uma boa demonstração do que o SQL tem que o DBF não tem.
Incluir conforme falta/existe
Enviado: 15 Set 2020 19:04
por JoséQuintas
tá difícil achar o erro:
Código: Selecionar todos
SELECT *
FROM
(
( SELECT idpatrimonio
FROM jppatrimonio WHERE patricategoria = 12 ) AS gravar
LEFT JOIN
( SELECT patdetpatrimonio
FROM jppatdetalhe
LEFT JOIN jppatrimonio ON idpatrimonio = patdetpatrimonio
WHERE patricategoria = 12
AND patdetlicenca = 25
) AS jatem
ON jatem.patdetpatrimonio = gravar.idpatrimonio
WHERE jatem.patdetpatrimonio IS NULL
) AS falta
Todos os campos são únicos não precisam identificação
CADA select vai retornar um resultado, não precisa de alias individual, mas precisa pro resultado
à primeira vista, tudo certo.
Incluir conforme falta/existe
Enviado: 15 Set 2020 19:08
por JoséQuintas
por parte, durante post:
Código: Selecionar todos
SELECT idpatrimonio FROM jppatrimonio WHERE patricategoria = 12
isso retornou 25.
usando alias, então tenho gravar.idpatrimonio = 25 no primeiro select
Incluir conforme falta/existe
Enviado: 15 Set 2020 19:10
por JoséQuintas
No segundo select:
Código: Selecionar todos
SELECT patdetpatrimonio
FROM jppatdetalhe
LEFT JOIN jppatrimonio ON idpatrimonio = patdetpatrimonio
WHERE patricategoria = 12
AND patdetlicenca = 25
retornou vazio.
então tenho jpatem.patdetpatrimonio mas vazio
Incluir conforme falta/existe
Enviado: 15 Set 2020 19:13
por JoséQuintas
por partes
Código: Selecionar todos
SELECT * From
( SELECT idpatrimonio
FROM jppatrimonio WHERE patricategoria = 12 ) AS gravar
LEFT JOIN
( SELECT patdetpatrimonio
FROM jppatdetalhe
LEFT JOIN jppatrimonio ON idpatrimonio = patdetpatrimonio
WHERE patricategoria = 12
AND patdetlicenca = 25
) AS jatem
ON jatem.patdetpatrimonio = gravar.idpatrimonio
WHERE jatem.patdetpatrimonio IS NULL
isso retornou idpatrimonio e patdetpatrimonio
ainda não é isso que eu quero, mas é o que vou precisar.
retornou dois campos:
idpatrimonio e patdetpatrimonio
significa que o * não se trata de todos da "área atual", mas sim de tudo mesmo.
Incluir conforme falta/existe
Enviado: 15 Set 2020 19:22
por JoséQuintas
quase lá....
Código: Selecionar todos
SELECT idpatrimonio, 25 From
( SELECT idpatrimonio
FROM jppatrimonio WHERE patricategoria = 12 ) AS gravar
LEFT JOIN
( SELECT patdetpatrimonio
FROM jppatdetalhe
LEFT JOIN jppatrimonio ON idpatrimonio = patdetpatrimonio
WHERE patricategoria = 12
AND patdetlicenca = 25
) AS jatem
ON jatem.patdetpatrimonio = gravar.idpatrimonio
WHERE jatem.patdetpatrimonio IS NULL
peguei todos os patrimonios categoria 12, vinculados as licencas cadastradas de código 25, trazendo o que não tinha essa licença
o select vai me retornar a lista de patrimônios, já com o código de licença 25.
Acho que é isso, agora é só acrescentar o INSERT.
Incluir conforme falta/existe
Enviado: 15 Set 2020 19:24
por JoséQuintas
Só surge uma dúvida:
E se o resultado for vazio?
dá erro no insert?
Incluir conforme falta/existe
Enviado: 16 Set 2020 03:59
por JoséQuintas
O barato é doido.
Ainda estou testando.
Código: Selecionar todos
:ExecuteCmd( "DELETE" + ;
" FROM JPPATDETALHE" + ;
" WHERE PATDETPATRIMONIO = " + NumberSQL( nIdPatrimonio ) + ;
" AND PATDETLICENCA NOT IN" + ;
" ( SELECT LICMIXLICENCA FROM JPTABLICMIX WHERE LICMIXCATEGORIA = " + ;
" ( SELECT PATRICATEGORIA FROM JPPATRIMONIO WHERE IDPATRIMONIO = " + ;
NumberSQL( nIdPatrimonio ) + " ) )" )
:ExecuteCmd( "INSERT" + ;
" INTO JPPATDETALHE ( PATDETPATRIMONIO, PATDETLICENCA )" + ;
" SELECT " + NumberSQL( nIdPatrimonio ) + ", LICMIXLICENCA" + ;
" FROM JPTABLICMIX WHERE LICMIXCATEGORIA = " + ;
" ( SELECT PATRICATEGORIA FROM JPPATRIMONIO WHERE IDPATRIMONIO = " + ;
NumberSQL( nIdPatrimonio ) + " ) AND " + ;
" NOT LICMIXLICENCA IN " + ;
" ( SELECT PATDETLICENCA FROM JPPATDETALHE WHERE PATDETPATRIMONIO + " + ;
NumberSQL( nIdPatrimonio ) + ")"
Qual a situação: inclusão/alteração do cadastro do patrimônio.
Pode ser alterada a categoria.
Outra categoria outras licenças, então tem licença a ser mantida, licença pra apagar e licença a incluir nesse patrimônio.
Aí não tem jeito, precisou de dois comandos.
Comando grande?
Considerando que a única referência usada é a Id do patrimônio...
Antes isso tudo era um campo "linguição" em duas tabelas.
Imagine quanto fonte Harbour ia precisar pra analisar isso tudo, pra inclusão e exclusão.