Clipper On Line • Ver Tópico - Incluir conforme falta/existe

Incluir conforme falta/existe

Discussão sobre SQL

Moderador: Moderadores

 

Incluir conforme falta/existe

Mensagempor JoséQuintas » 15 Set 2020 18:28

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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18010
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Incluir conforme falta/existe

Mensagempor JoséQuintas » 15 Set 2020 19:04

tá difícil achar o erro:

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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18010
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Incluir conforme falta/existe

Mensagempor JoséQuintas » 15 Set 2020 19:08

por parte, durante post:

SELECT idpatrimonio FROM jppatrimonio WHERE patricategoria = 12


isso retornou 25.
usando alias, então tenho gravar.idpatrimonio = 25 no primeiro select
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18010
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Incluir conforme falta/existe

Mensagempor JoséQuintas » 15 Set 2020 19:10

No segundo select:

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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18010
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Incluir conforme falta/existe

Mensagempor JoséQuintas » 15 Set 2020 19:13

por partes

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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18010
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Incluir conforme falta/existe

Mensagempor JoséQuintas » 15 Set 2020 19:22

quase lá....

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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18010
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Incluir conforme falta/existe

Mensagempor JoséQuintas » 15 Set 2020 19:24

Só surge uma dúvida:

E se o resultado for vazio?
dá erro no insert?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18010
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Incluir conforme falta/existe

Mensagempor JoséQuintas » 16 Set 2020 03:59

O barato é doido.
Ainda estou testando.

      :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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18010
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes




Retornar para SQL

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 10 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro