Aprenda PL/SQL

Trazer uma descrição de um campo no BD

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
  

Mensagemem Ter, 14 Fev 2017 3:06 pm

Pessoal do forum, boa tarde.

É a primeira vez que acesso o fórum. Sou iniciante em SQL. Venho de outra linguagem de programação e devido a mudança de sistema na empresa, estou procurando aprender Oracle SQL. Estou tentando alterar uma consulta que foi passada, e estou emperrado num trecho que não consigo resolver, e peço orientação do Fórum. Vamos lá :

Código: Selecionar todos
SELECT C.NUNOTA,
       C.CODPARC,
       P.NOMEPARC,
       C.DTNEG,
       C.NUMNOTA,
       I.CODPROD,
       PR.REFERENCIA,
       PR.COMPLDESC,
       I.CODVOL,
       I.QTDNEG,
       I.CODLOCALORIG,

       (SELECT L1.DESCRLOCAL   FROM TGFLOC L1        WHERE L1.CODLOCAL = I.CODLOCALORIG) DESCR_LOCALORIG,
               
       (SELECT PL1.CODLOCALINI FROM AD_TGFPROLOC PL1 WHERE PL1.CODPROD = I.CODPROD) PINI,

       (SELECT PL2.CODLOCALFIN FROM AD_TGFPROLOC PL2 WHERE PL2.CODPROD = I.CODPROD) PFIM,

             
       CI.QTDCONF,
       CF.NUCONF,
       CF.CODUSUCONF,
       U.NOMEUSU,
       CASE
         WHEN CF.STATUS = 'F' THEN
          'Finalizada'
         ELSE
          'Aguardando'
       END AS STATUS,
       TRUNC(CF.DHINICONF) AS DTCONF,
       TO_CHAR(CF.DHINICONF, 'HH24:MI:SS') AS HRINI,
       TO_CHAR(CF.DHFINCONF, 'HH24:MI:SS') AS HRFIN,
       calcdata_social(TO_CHAR(CF.DHINICONF, 'DD/MM/YYYY HH24:MI:SS'),
                       TO_CHAR(CF.DHFINCONF, 'DD/MM/YYYY HH24:MI:SS')) AS TEMPO,
       (SELECT COUNT(I2.CODPROD) FROM TGFITE I2 WHERE C.NUNOTA = I2.NUNOTA) AS QTDITE,
       (SELECT SUM(I2.QTDNEG)    FROM TGFITE I2 WHERE C.NUNOTA = I2.NUNOTA) AS QTDVOL
     
  FROM       TGFCAB       C
 
  INNER JOIN TGFPAR       P  ON P.CODPARC     = C.CODPARC
  INNER JOIN TGFITE       I  ON I.NUNOTA      = C.NUNOTA
  INNER JOIN TGFPRO       PR ON PR.CODPROD    = I.CODPROD
  INNER JOIN TGFCON2      CF ON CF.NUNOTAORIG = C.NUNOTA
                            AND CF.NUCONF     = C.NUCONFATUAL
  INNER JOIN TGFCOI2      CI ON CI.NUCONF     = CF.NUCONF
                            AND CI.CODPROD    = I.CODPROD
  INNER JOIN TSIUSU       U  ON U.CODUSU      = CF.CODUSUCONF
  INNER JOIN TGFLOC       L  ON L.CODLOCAL    = I.CODLOCALORIG     


  WHERE C.NUNOTA = 334779
     
GROUP BY C.NUNOTA,
          C.CODPARC,
          P.NOMEPARC,
          C.DTNEG,
          C.NUMNOTA,
          I.CODPROD,
          PR.REFERENCIA,
          PR.COMPLDESC,
          I.CODVOL,
          I.QTDNEG,
          I.CODLOCALORIG,
          CI.QTDCONF,
          CF.NUCONF,
          CF.DHINICONF,
          CF.DHFINCONF,
          CF.CODUSUCONF,
          U.NOMEUSU,
          CF.STATUS

ORDER BY I.CODLOCALORIG


Nas linhas onde tem os apelidos PINI E PFIM, na verdade a consulta está trazendo um código que é o endereço onde se encontra o produto no estoque da empresa. O que eu preciso é através desse código eu possa ler a tabela TGFLOC que está logo acima , para que eu possa trazer a descrição do local do produto. Já tentei usar o PINI e PFIM para ler a tabela TGFLOC que está acima, já tentei utilizar os PL1.CODLOCALINI e PL1.CODLOCALFIN, para acessar a tabela TGFLOC, mas tento codificar o comando SQL, para trazer a descrição do local, dá a mensagem de Identificador inválido. Alguém poderia me dar uma idéia por favor ???
Desde já fico grato ............
pssgyn

Mensagemem Ter, 14 Fev 2017 5:00 pm

Tenta colocar a descrição direto dentro de cada query.
Algo assim:
Código: Selecionar todos
       (SELECT L2.DESCRLOCAL FROM AD_TGFPROLOC PL2, TGFLOC L2  WHERE PL2.CODPROD = I.CODPROD AND L2.COD_LOCAL=PL2.CODLOCALINI) PINI,

       (SELECT L3.DESCRLOCAL FROM AD_TGFPROLOC PL3, TGFLOC L3  WHERE PL3.CODPROD = I.CODPROD AND L3.COD_LOCAL=PL3.CODLOCALFIN) PFIM,


PS: Como eu não tenho a descrição das suas tabelas, eu montei isso baseado no que eu to vendo na sua Query. Pode não funcionar ou ter algum campo errado.
dr_gori
Localização: Porto Alegre - RS

Thomas F. G
https://www.patreon.com/glufke

Mensagemem Qua, 15 Fev 2017 8:50 am

Dr_Gori, bom dia. Vou testar aqui e posto a resposta depois.

Muito obrigado. :) :) :)
pssgyn

Mensagemem Qui, 16 Fev 2017 2:44 pm

Dr_Gori, eu entendi e agradeço a sua resposta, o campo descrlocal pertence a tabela tgfloc, que é a descrição do endereço do produto no estoque. A tabela ad_tgfproloc, tem os campos código do produto, codlocalini e codlocalfin. A tabela ad_tgfproloc guarda apenas endereços de produtos que precisam de endereço extra no estoque. Ou seja, nem todos os produtos tem endereço extra.

Esse endereço extra, serve apenas quando o produto não cabe sómente no endereço principal.

Essa consulta gera um relatório, e serve para quando o produto chega do fornecedor, a pessoa que recebe dá entrada no sistema, confere produto, quantidade, estoque, endereço principal e endereço extra, quando existe.

Para saber qual a descrição do endereço extra, tem que ir na tabela tgfloc buscar a descrição. Mas na tabela tgfloc, tem apenas o codigolocal e a descriçao. A ligação são os campos codlocalini e codlocalfin da tabela ad_tgfproloc.

Eu codifiquei a solução que você me respondeu, mas nem todos os produtos tem endereço extra. Aí a consulta traz apenas os produtos que tem endereço extra. Ou seja, a consulta deveria trazer a coluna de endereço extra em branco.

Mas de qualquer forma agradeço a resposta. Vou continuar tentando aqui. Mas a sua resposta, acaba fazendo a gente pensar em outras soluções, talvez codificar alguma coisa com o comando case.
pssgyn



Voltar para SQL

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 6 visitantes