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.