Página 1 de 2

Expressão Regular no SET FILTER

Enviado: 20 Set 2018 10:17
por clodoaldomonteiro
Olá amigos,

Tem como usar Expressão Regular no SET FILTER:

Tenho uma demanda em que devo imprimir alguns determinados registro, onde cada um gera um formulário em PDF.
O Operador vai informar quais códigos do documento devem ser listados, tipo:
Códigos: [00001-00010, 00025, 00040-00045].
No exemplo acima, deve ser filtrado os registros com código de 00001 ao 00010, e o registro de código 00025, e os registros de códigos 00040 ao 00045.
Seria a mesma coisa que fazemos quando vamos imprimir um DOC Word, que podemos escolher uma variedade de páginas.

Desde já agradeço a atenção

Expressão Regular no SET FILTER

Enviado: 20 Set 2018 10:59
por JoséQuintas
Se não for de um jeito, vai de outro.

Sempre tem a opção SET FILTER TO MinhaFuncao()

Mas o ideal seria criar um set filter que não dependa de variável externa, pra não ter erro.

Código: Selecionar todos

cFilter := [codigoitem $ "123,456,789"]
SET FILTER TO &cFilter
De repente, uma função que converte a seleção.

cFilter := Converte( cSelecao )

Expressão Regular no SET FILTER

Enviado: 20 Set 2018 12:49
por Itamar M. Lins Jr.
Ola!
Estando indexado pelo código, não use SET FILTER. OrdScope é mais rápido.
Basta criar uma função para ir pegando os pedaços de dentro "0010-0015,00X1-00X5,..." separado por virgulas e se tiver "-" será inicio "-" e o fim do ordscope.

Saudações,
Itamar M. Lins Jr.

Expressão Regular no SET FILTER

Enviado: 20 Set 2018 13:43
por clodoaldomonteiro
Vocês acham que teria como usar a função OrdWildSeek() para de alguma forma no Do While fazer esse controle?

Expressão Regular no SET FILTER

Enviado: 20 Set 2018 15:16
por Itamar M. Lins Jr.
Ola!
Lógico. As informações para usar OrdWildSeek estão na string fornecida, é só pegar os pedaços usando substr(), at()... Tem um post mais abaixo que faço isso com arquivo .INI transformo em string e manipulo.
Por exemplo: "0010 até 0020" -> "0010-0020," ai o usuario escolhe mais uma "0001," só essa, depois escolhe de "00FF-00II" significa dá 00FF, 00GG, 00HH até 00II. Tudo isso em uma única string, "0010-0020,0001,00FF-00II"
Botar o neurônios ai para pensar como manipular(cortar) isso. O Guru "José Quintas" é fera nisso ai rsrsrss.

Saudações,
Itamar M. Lins Jr.

Expressão Regular no SET FILTER

Enviado: 20 Set 2018 16:07
por JoséQuintas
Tenho no preview de relatório, pra escolher qualquer combinação de numeração de página.

https://github.com/JoseQuintas/JoseQuin ... review.prg

Mas no final, como deve ter alguma ordem isso, talvez jogar em array ou temporário.

Expressão Regular no SET FILTER

Enviado: 21 Set 2018 09:39
por designsistemas
bom dia,
Não sei o cenario que sera utilizado , mas caso estaja usando algum SGBD SQL, pode aplicar a expressão regular ja no select

Paulo Cezar
Design Sistemas

Expressão Regular no SET FILTER

Enviado: 21 Set 2018 15:14
por Itamar M. Lins Jr.
Ola!
Não sei o cenario que sera utilizado , mas caso estaja usando algum SGBD SQL, pode aplicar a expressão regular ja no select
Está implícito na própria pergunta, se é SET FILTER e OrdWild... então é DBF. Se bem que hoje em dia se usa SQL até em DBF's.

Saudações,
Itamar M. Lins Jr.

Expressão Regular no SET FILTER

Enviado: 21 Set 2018 17:24
por alxsts
Olá!

Seja bem-vindo ao Fórum Paulo Cezar!

Expressão Regular no SET FILTER

Enviado: 22 Set 2018 14:33
por designsistemas
Ola Amigos,
vou me apresentar, minha historia se parece com a de muitos aqui. Tenho 52 anos, comecei na programação aos 16 anos. Iniciei no Basic, em seguida comecei a desenvolver usando Clipper Autumn 86, passando para o incrivel Summer 87, ai veio o CA-Clipper 5.0, etc... Depois de desilusões com o VB, em 2004 comecei com Harbour/Linux/MySQL que me levou ao xHarbour.com e SQLRDD. Muitas vezes fui socorrido por este forum.
Atualmente meus sistemas rodam nativo no Linux e Windows em interface texto, os relatórios gero em HTML e Excel, complemento com modulos PHP quando o cliente precisa de algo externo, por exemplo cotação de compra. Uso bastante pelo xHarbour consumo de web-service SOAP e REST para intergração com sites, mercado-livre, etc.
abs a todos.
Paulo Cezar
Design Sistemas

Expressão Regular no SET FILTER

Enviado: 24 Set 2018 17:07
por filizola
Ze quintas, esta sua rotina preview tem que ser compilada com wvg ou pode ser com wvt ?

Expressão Regular no SET FILTER

Enviado: 27 Set 2018 08:04
por clodoaldomonteiro
Uma coisa que tem que ser feito, é uma Expressão regular para o GET das páginas a serem impressas.
Ex.: [001-010, 020, 030-040]
Vejam que na sequencia de páginas acima, o operador tem que respeitar a máscara de edição, acho que no PICT, onde só pode existir números, traço e a vírgula.
Então como montar esse Picture? com um LIKE?

Expressão Regular no SET FILTER

Enviado: 27 Set 2018 08:22
por JoséQuintas
filizola escreveu:Ze quintas, esta sua rotina preview tem que ser compilada com wvg ou pode ser com wvt ?
O preview é console, exceto os botões.
Se retirar os botões ok, só vai precisar a mensagem pro usuário saber o que digitar.
E se tiver alguma dependência adicional, está toda aí no aplicativo, no GitHub.

Expressão Regular no SET FILTER

Enviado: 27 Set 2018 10:58
por clodoaldomonteiro
Continuando,

Já fiz a função para retornar uma array com os números de páginas a serem impressos.

Código: Selecionar todos

   /////////////////////////////////////////////////////////////////////////////
   //00010-00020,00030,00040-00045
Function cl_ParseNumero(cNumeros, nTamanho)
   Local i, ii, aTokens:={}, aCol:={}, aRetorno:={}

   aTokens := HB_ATokens( Alltrim(cNumeros), ",", .F., .F. )
   For i=1 To Len(aTokens)
      aCol := HB_ATokens( aTokens[i], "-", .F., .F. )
      aSort(aCol,,,{ |x, y| x[1] < y[1]} )
      If Len(aCol) > 1
         mIni:= Val(Alltrim(aCol[1]))
         mFim:= Val(Alltrim(aCol[2]))
         For ii = mIni To mFim
            AAdd(aRetorno, StrZero(ii, nTamanho) )
         Next
      Else
         AAdd(aRetorno, StrZero(Val(Alltrim(aCol[1])), nTamanho) )
      Endif
   Next

   Return aRetorno
   
Falta agora VALIDAR o campo Getado para que seja aceito somente caracteres válidos para esta rotina, que seriam: {0123456789-,}

Expressão Regular no SET FILTER

Enviado: 27 Set 2018 11:11
por JoséQuintas

Código: Selecionar todos

FUNCTION ExtraiDeAte( cTexto, nTamanho )


   LOCAL aIntervalos, aItem, oDeAte, oNumero

   aIntervalos := {}
   FOR EACH oDeAte IN hb_regExSplit( cTexto, "," )
      aItem := {}
      FOR EACH oNumero IN hb_RegExSplit( oDeAte , "-" )
         Aadd( aItem, StrZero( Val( oNumero ), nTamanho )
      NEXT
      AAdd( aIntervalos, aItem )
   NEXT
   ASort( aIntervalos,,, {| a, b | a[ 1 ] < b[ 1 ] } )

   RETURN aIntervalos