Usuário com melhor resposta
Função REPLICATE

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
Respostas
-
Deleted
- Marcado como Resposta Leonardo Slva quinta-feira, 28 de março de 2019 20:22
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]
-
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.
-
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]
- Editado Junior Galvão - MVPMVP, Moderator quinta-feira, 28 de março de 2019 18:22
-
-
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.
-
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.
-
Deleted
- Marcado como Resposta Leonardo Slva quinta-feira, 28 de março de 2019 20:22
-
-
-
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