none
Criar uma Consulta para trazer apenas o CFOP do primeiro Item.. Segue exemplo

    Question

  • Bom dia Galera!!!

    Tenho a Seguinte situação. Preciso selecionar o CFOP do Primeiro item, ou seja, no exemplo eu tenho uma nota (001) com 3 itens e cada item tem um CFOP...

    Mesmo que a nota tenha varios itens, eu preciso sempre pegar o CFOP do primeiro item.

    A minha tabela itens é mais ou menos assim:

    Veja exemplo:

    Tabela_item 
    ---------------------------------------------------------------------
    NumNF    CodItem   NrItem     Descricao  cfop
    ---------------------------------------------------------------------
    0001      12345         1          Ferro         5101
    0001       321321      2          Plastico      5101 
    0001       22233        3         Papel          5101
    0002       11221        1         Lata           6101
    0002       45454        2         Caixa          6101

    Ja usei o select top 1 i.cfop, i.* from Tabela_item as i , porem no resultado abaixo só vem o primeiro item.

    NumNF    CodItem   NrItem     Descricao  cfop
    ---------------------------------------------------------------------
    0001      12345         1          Ferro         5101

     

    Algeum tem uma luz?

     

    Abraços!!

    Tuesday, March 30, 2010 2:16 PM

Answers

  • Leonardo,

    Qual valor vc quer mostrar no CFOP ja que não quer repetir o cfop do promeiro?  0 ou ' ', basta usar o isnull, veja o exemplo abaixo

    declare @tbTeste as table (NumNF char(4), CodItem int, NrItem tinyint, Descricao varchar(10), cfop char(5))
    insert into @tbTeste values('0001',12345,1,'Ferro',5101)
    insert into @tbTeste values('0001',321321,2,'Plastico',5101)
    insert into @tbTeste values('0001',22233,3,'Papel',5101)
    insert into @tbTeste values('0002',11221,1,'Lata',6101)
    insert into @tbTeste values('0002',45454,2,'Caixa',6101)
    
    ;with cte_distinct
    as
    (
    select NumNF, cfop,NrItem from @tbTeste where NrItem=1
    )
    
    select a.NumNF, a.CodItem, a.NrItem, a.Descricao, isnull(b.cfop,' ') as cfop
    from @tbTeste a left join cte_distinct b on a.NumNF = b.NumNF AND a.NrItem =  b.NrItem
    

    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    Wednesday, March 31, 2010 3:21 PM
    Moderator

All replies

  • Leonardo,

    Eu tenho uma ideia, mas preciso tirar uma dúvida, vc quer exibir todos os nrItem =1 ou repetir o CFOP do item 1 para os demais items da mesma nf?

    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    Tuesday, March 30, 2010 3:21 PM
    Moderator
  • Boa Tarde,

    O link abaixo mostra várias possibilidades de como fazer isso:

    Como retornar o último registro por grupo ?
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!277.entry

    Só basta mudar a lógica de "último" para primeiro

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Como importar dados a partir de uma range de células de uma planilha excel ?
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!996.entry


    Classifique as respostas. O seu feedback é imprescindível
    Tuesday, March 30, 2010 4:22 PM
    Moderator
  • boa tarde Marcelo,

    Imagina assim: A NF 001 tem tres itens.. O resultato precisa mostrar que a NF 001 possui tres itens e um CFOP (O cfop do primeiro item) .

    Repetir não ajudaria, pois o CFOP é igual para todos os itens.

    Desde já agradeço pela ajuda e aceito a sua ideia.

     

    Maia,

     

    Att,

     

    Leonardo

     

    Tuesday, March 30, 2010 5:22 PM
  • Leonardo,

    Segue minha ideia (funionará para SQL 2005 ou 2008)

    declare @tbTeste as table (NumNF char(4), CodItem int, NrItem tinyint, Descricao varchar(10), cfop int)
    insert into @tbTeste values('0001',12345,1,'Ferro',5101)
    insert into @tbTeste values('0001',321321,2,'Plastico',5101)
    insert into @tbTeste values('0001',22233,3,'Papel',5101)
    insert into @tbTeste values('0002',11221,1,'Lata',6101)
    insert into @tbTeste values('0002',45454,2,'Caixa',6101)
    
    ;with cte_distinct
    as
    (
    select NumNF, cfop,NrItem from @tbTeste where NrItem=1
    )
    
    select a.NumNF, a.CodItem, a.NrItem, a.Descricao, b.cfop
    from @tbTeste a left join cte_distinct b on a.NumNF = b.NumNF AND a.NrItem =  b.NrItem
    



    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    Tuesday, March 30, 2010 5:48 PM
    Moderator
  • Bom dia pessoal!!

    Preciso de uma ajudona. Crei a seguinte consulta.

    select h.nNF, I.cfop, h.emit_CNPJ, i.nItem from TB_EDINFEHeader as h inner join TB_EDINFEItens as i on h.ChaveAcesso = i.ChaveAcesso  ORDER BY H.emit_CNPJ

    E tive o seguinte resultado:

    nNF         cfop             emit_CNPJ             nItem
    ----------- ----------- -------------- -----------
    182         6101        00074024000357          1
    182         6101        00074024000357          3
    183         6920        00074024000357          1
    223         6101        00074024000357          2
    242         6101        00074024000357          1
    242         6101        00074024000357          2
    242         6101        00074024000357          4
    245         6920        00074024000357          1
    309         6101        00074024000357          1
    325         6101        00074024000357          1
    326         6920        00074024000357          1
    475         6920        00074024000357          1
    530         6101        00074024000357          2
    567         6101        00074024000357          2
    568         6920        00074024000357          1
    600         6101        00074024000357          1
    600         6101        00074024000357          3

     

    Eu preciso que o meu resultado acima mostre apenar o primeirio cfop que sempre será o nitem, conforme resultado abaixo. Alguem pode me ajudar a chegar ao resultado abaixo?

     

    nNF         cfop            emit_CNPJ         nItem
    ----------- ----------- -------------- -----------
    182         6101        00074024000357  1
    183         6920        00074024000357  1
    223         6101        00074024000357  1
    242         6101        00074024000357  1
    245         6920        00074024000357  1
    309         6101        00074024000357  1
    325         6101        00074024000357  1
    326         6920        00074024000357  1
    475         6920        00074024000357  1
    530         6101        00074024000357  1
    567         6101        00074024000357  1
    568         6920        00074024000357  1
    600         6101        00074024000357  1

    Att,

     

    Leonardo

     

    Wednesday, March 31, 2010 1:02 PM
  • Leonardo,

    Qual a  versao do seu SQL? meu script nao te ajudou?

    att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    Wednesday, March 31, 2010 2:03 PM
    Moderator
  • Marcelão,

    Estou no sql 2008.

    Seu script funcionou chegou bem perto do que eu preciso. O Unico problema seria os valores NULL no campo CFOP. Acredito que no momento que  o usuario clicar no campo CFOP o sistema listará as opções NULL para ele. Mas o seu resultado é o que eu preciso.

    Eu alterei q minha query. Agrupei nota, cnpj, cfop e item.. Depois coloquei uma clausula where para me trazer só o primeiro item numero 1... Só que fico sem as informações do segundo, terceiro e etc.

    select h.nnf, h.emit_CNPJ, I.cfop, i.nItem from TB_EDINFEHeader as h inner join TB_EDINFEItens as i on h.ChaveAcesso = i.ChaveAcesso
    where i.nItem = 1 AND i.nItem = 1
    group by h.nnf, h.emit_CNPJ, I.cfop, i.nItem order by H.emit_CNPJ

    Wednesday, March 31, 2010 3:12 PM
  • Leonardo,

    Qual valor vc quer mostrar no CFOP ja que não quer repetir o cfop do promeiro?  0 ou ' ', basta usar o isnull, veja o exemplo abaixo

    declare @tbTeste as table (NumNF char(4), CodItem int, NrItem tinyint, Descricao varchar(10), cfop char(5))
    insert into @tbTeste values('0001',12345,1,'Ferro',5101)
    insert into @tbTeste values('0001',321321,2,'Plastico',5101)
    insert into @tbTeste values('0001',22233,3,'Papel',5101)
    insert into @tbTeste values('0002',11221,1,'Lata',6101)
    insert into @tbTeste values('0002',45454,2,'Caixa',6101)
    
    ;with cte_distinct
    as
    (
    select NumNF, cfop,NrItem from @tbTeste where NrItem=1
    )
    
    select a.NumNF, a.CodItem, a.NrItem, a.Descricao, isnull(b.cfop,' ') as cfop
    from @tbTeste a left join cte_distinct b on a.NumNF = b.NumNF AND a.NrItem =  b.NrItem
    

    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    Wednesday, March 31, 2010 3:21 PM
    Moderator
  • Marcelo com o isnull o resultado ficou perfeito.

    Editei o seu script, porém eu tenho duas tabalas uma de Header que possui chave de acesso, numNf e outra tabela Itens que possui chave de acesso, cfop, descrição do item, nrItem.

    Quando rodo o script abaixo, ele tras apenas os dados da linha Nritem = 1.

    Outra duvida, eu consigo add esse CTE no meio de outro select?

    Desde ja obrigado pela ajuda!!!

    ;with cte_distinct
    as
    (
    select i.ChaveAcesso, i.cfop, i.Nitem from TB_EDINFEItens as i where i.nitem =1
    )

    select h.nNF, h.emit_cnpj, b.cfop, b.Nitem
    from TB_EDINFEHeader h left join cte_distinct b on h.chaveacesso = b.chaveacesso
     

    Wednesday, March 31, 2010 3:57 PM
  • Leonardo qual o conteudo da table header?

    da uma verificada se não esta fazendo um produto cartesiano, ou se na tabela header tem outra chave que vc esta esquecendo de colocar no left join...

    A aplicacao desta solução que te passei é simples.. como vc pode ver no exemplo... deve ser algum detalhe de chave..

    att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    Wednesday, March 31, 2010 5:09 PM
    Moderator
  • Marcelo,

    Está bem proximo do resultado. Já consegui unificar o seu cte com o restante da minha query.

    a dificuldade que tenho agora é que não tenho o NrItem na tabela heard só na tabela Itens.

    O unico campo ligando as tablas é chaveacesso, nas duas tableas é chave de acesso. Se eu tirar o trecho  AND a.NrItem =  b.NrItem a consulta so me tras o primeiro item de cada nota.

    Eu teria como contornar esta situação?

     

    select a.NumNF, a.CodItem, a.NrItem, a.Descricao, isnull(b.cfop,' ') as cfop
    from @tbTeste a left join cte_distinct b on a.NumNF = b.NumNF AND a.NrItem =  b.NrItem

    Wednesday, March 31, 2010 5:17 PM
  • Leonardo,

    este campo chaveacesso tem um valor direferente p/ cada linha? ou seja é uma pk?

    faz o seguinte posta um exemplo de registros das duas tables para eu visualizar melhor...

    att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    Wednesday, March 31, 2010 5:34 PM
    Moderator
  • Marcelo,

    A chaveacesso é o numero da nota com mais informações.. Ele não muda, vai sempre acompanhar o numero da nota

     

    exemplo que vc solicitou

     

    chaveacesso                                                              nnf         emit_CNPJ               cfop      nItem
    -------------------------------------------- ----------- -------------- ----------- -----------
    42090900074024000357550010000002230000000002 223         00074024000357 6101        1
    42090900074024000357550010000002240000000000 224         00074024000357 6920        1
    42090900074024000357550010000002420000000008 242         00074024000357 6101        1
    42091000074024000357550010000002860000000002 286         00074024000357 6101        1

    Wednesday, March 31, 2010 5:47 PM
  • Marcelo,

     

    Consegui chegar ao resultado.. So um minimo detalhe.. usando o sinull o meu campo fica com o valor zero (0) ao inves de branco.

     

    Sera o meu tipo de dado?

     

    att,

    Wednesday, March 31, 2010 6:29 PM
  • Marcelo,

     

    Consegui chegar ao resultado!!!!

     

    Muito obrigado pela ajuda!!!

     

    Obrigado mesmo!!!

    Wednesday, March 31, 2010 7:07 PM