none
Função REPLICATE RRS feed

  • Pergunta

  • Boa tarde,

    Estou com dificuldades na função replicate()

    Preciso de um select que faça isso:

    Tenho esse número, porém ele é a concatenação de alguns campos e preenchimentos: 130720170001 e são eles os campos:

    13|0|72017|000 |1

    • 13 = OINV.ObjType 
    • 0 = completar com zero
    • 72017 = OINV.Docnum
    • 000 = Completar com zero se não tiver numero, 3 zeros se tiver um numero maior no 720178 ele completaria com 2 zeros
    • 1 =  OINV.LineNum
    quinta-feira, 28 de março de 2019 17:38

Respostas

Todas as Respostas

  • Leonardo, 

    Se eu entendi, você deseja utilizar a função Replicate de acordo a faixa de valores aplicadas para as condições:

    0 = completar com zero

    000 = Completar com zero se não tiver numero, 3 zeros se tiver um numero maior no 720178 ele completaria com 2 zeros

    É isso?

    Poderia nos compartilhar a maneira que esta tentando realizar esta réplica de valores?

    Sinceramente, eu fiquei na dúvida de quantos zeros devem ser replicados.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 28 de março de 2019 17:50
    Moderador
  • Leonardo, 

    Se eu entendi, você deseja utilizar a função Replicate de acordo a faixa de valores aplicadas para as condições:

    0 = completar com zero 

    000 = Completar com zero se não tiver numero, 3 zeros se tiver um numero maior no 720178 ele completaria com 2 zeros

    É isso?

    Poderia nos compartilhar a maneira que esta tentando realizar esta réplica de valores?

    Sinceramente, eu fiquei na dúvida de quantos zeros devem ser replicados.


    0= aqui sempre vai ser esse zero, nao sei creio que da pra colocar sem função.

    000= aqui serao replicados 3, por exemplo o numero é esse : 72017000 se fosse (colocou 3 zeros) 72017800(colocou 2 zeros) Creio que o OINV.DOCNUM precisa de um datalength de 8 casas correto?? Porque depois do OINV.DOCNUM preciso colocar mais um campo o OINV.LINENUM.


    quinta-feira, 28 de março de 2019 18:08
  • Leonardo,

    Qual é o tipo de dados que você esta utilizando para este campo e seu respectivo tamanho? Ou ele não existe fisicamente somente logicamente com base na concatenação?

    Em relação a quantidade de zeros, se compreendi, temos que identificar a quantidade de caracteres existentes, ou seja:

    72017 = 5 posições = 3 zeros.

    72017800 = 6 posições = 2 zeros

    Veja se este exemplo, de um post que publiquei ontem no meu blog te ajuda:

    Select Concat(LC.SequencialDeLetrasCombinadas,’-‘,
    Convert(Char(4),Case
    When P.CodigoSequencialNumeroPlacas BetWeen 1 And 9 Then Concat(‘000′,P.CodigoSequencialNumeroPlacas)
    When P.CodigoSequencialNumeroPlacas BetWeen 10 And 99 Then Concat(’00’,P.CodigoSequencialNumeroPlacas)
    When P.CodigoSequencialNumeroPlacas BetWeen 100 And 999 Then Concat(‘0’,P.CodigoSequencialNumeroPlacas)
    When P.CodigoSequencialNumeroPlacas BetWeen 1000 And 9999 Then Convert(Char(4),P.CodigoSequencialNumeroPlacas)
    End)) As ‘Placa’,
    IsNull(F.FaixasDePlacasPorEstadoNomeDoEstado,’Sequência não atribuída…’) As ‘Nome do Estado’
    From LetrasCombinadas LC Inner Join Placas P
    On LC.CodigoSequencialLetrasCombinadas = P.CodigoSequencialLetrasCombinadas
    Left Join FaixasDePlacasPorEstado F
    On LC.SequencialDeLetrasCombinadas Between SubString(F.CodigoSequencialFaixasDeLetrasNumerosInicial,1,3)
    And SubString(F.CodigoSequencialFaixasDeLetrasNumerosFinal,1,3)
    Where LC.SequencialDeLetrasCombinadas = @LetrasCombinadas
    And P.CodigoSequencialNumeroPlacas = @SequenciaNumerica
    End 
     

    Você pode adaptar, fazendo uso da função Len no comando Case When.

    Para entender melhor o cenário, acesse: https://pedrogalvaojunior.wordpress.com/2019/03/27/dica-do-mes-aplicando-analise-combinatoria-no-microsoft-sql-server/


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    quinta-feira, 28 de março de 2019 18:19
    Moderador
  • Deleted
    quinta-feira, 28 de março de 2019 18:33
  • Leonardo, qual é o ERP e versão? sap b1 9.3

    Dúvidas:

    • a coluna OINV.ObjType está declarada como nvarchar(20). O que fazer se ela possuir mais de 2 caracteres? E se possuir somente um caractere? Não vai possuir somente 1 caractere, ela é setada e recebe somente 2 numeros, por exemplo, 13,14,15 somente esses.
    • a coluna DocNum está declarada como integer, podendo ter até 11 algarismos. No exemplo você assume que o limite é de até 8 algarismos? Esse foi um numero que pensamos e vai demorar para preencher todos, por isso setamos 8 caracteres
    • é para inserir o caractere "|" entre as partes? Não, somente divisão para tentar explicar o problema.

    Testo e aviso.

    quinta-feira, 28 de março de 2019 18:44
  • Leonardo, qual é o ERP e versão?

    Dúvidas:

    • a coluna OINV.ObjType está declarada como nvarchar(20). O que fazer se ela possuir mais de 2 caracteres? E se possuir somente um caractere?
    • a coluna DocNum está declarada como integer, podendo ter até 11 algarismos. No exemplo você assume que o limite é de até 8 algarismos?
    • é para inserir o caractere "|" entre as partes?
    • existe coluna LineNum na tabela OINV? Se sim, como ela está declarada?

     
    Eis esboço do código:

    -- código #1
    SELECT (
            right (('00' + substring (OINV.ObjType, 1, 2)), 2) + '|' +         -- OINV.ObjType
            '0|' +
            cast (OINV.DocNum as varchar(8)) + '|' +                           -- OINV.DocNum
            replicate ('0', 8 - len (cast (OINV.DocNum as varchar(8))) + '|'
            right (('0' + cast (OINV.LineNum as varchar(1))), 1)               -- OINV.LineNum
           )
      from ...
      where ...;
    Não testei; pode conter erro(s).




    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    replicate ('0', 8 - len (cast (OINV.DocNum as varchar(8))) + Aparece que precisa de 2 argumentos, da erro. as outras linhas deram certo, faltou apenas os 0 antes do OINV.Linenum
    quinta-feira, 28 de março de 2019 19:17
  • Deleted
    • Marcado como Resposta Leonardo Slva quinta-feira, 28 de março de 2019 20:22
    quinta-feira, 28 de março de 2019 19:29
  • Funcionou perfeitamente.
    quinta-feira, 28 de março de 2019 20:22
  • Deleted
    quinta-feira, 28 de março de 2019 20:26
  • Segue:

    SELECT OINY.ObjType + '0' + OINV.Docnum + REPLICATE('0', 8 - LEN(OINV.Docnum)) + OINV.LineNum FROM OINV WHERE ......

    Leonardo,

    Apenas precisa verificar o tipo dos campos, pois aqui considero que os campos sejam todos textos. Caso contrário deve convertar cada um para texto usando a função CONVERT ou CAST.

    Abraço,

    Marcos Xinna

    quinta-feira, 28 de março de 2019 20:27