Incluir conforme falta/existe

Forum sobre SQL.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Incluir conforme falta/existe

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Incluir conforme falta/existe

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Incluir conforme falta/existe

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Incluir conforme falta/existe

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Incluir conforme falta/existe

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Incluir conforme falta/existe

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Incluir conforme falta/existe

Mensagem por JoséQuintas »

Só surge uma dúvida:

E se o resultado for vazio?
dá erro no insert?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Incluir conforme falta/existe

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder