Página 1 de 1

hb_RegEx

Enviado: 19 Dez 2019 18:49
por JoséQuintas
Estou querendo fazer validações nos meus fontes, mas não tenho idéia se hb_regex poderia ajudar.

Exemplo:

Tenho lá a função ADOField( "CAMPO", "C", "TABELA"..... ou ADOField( "CAMPO", "N", "TABELA"...

Esse segundo parâmetro indica o tipo de campo, mas vira e mexe eu esqueço de colocar.
Queria validar os fontes, se tem algum sem isso.
Dá pra fazer?

hb_RegEx

Enviado: 20 Dez 2019 10:23
por Kapiaba
Não entendi muito bem o queres fazer, veja se esse código ajuda.

Veja também: HB_ISREGEX().

Código: Selecionar todos

FUNCTION Main()

   Local s := "ClaAbrok aBbey", n1, n2
 
   ? hb_isregex( hb_regexcomp( "a+b+" ) )                // .T.

   n1 := 1
   n2 := Len( s )

   ? hb_atx( "a+b+", s, .f., @n1, @n2 ), n1, n2          // aAb      3     3

   ? hb_regexhas( "a+b+", s, .f. )                       // .T.
   ? hb_regexhas( "a+b+", s )                            // .F.

   ? hb_regexlike( "a+b+", s, .f. )                      // .F.
 
   PrintArray( hb_regex( "a+b+",s,.f. ) )                // { aAb }
   PrintArray( hb_regex( "(a+)(b+)",s,.f. ) )            // { aAb aA b }
 
   PrintArray( hb_regexSplit( "a+b+",s,.f. ) )           // { Cl rok  ey }
 
   PrintArray( hb_regexAtx( "a+b+",s,.f. ) )             // { { aAb 3 5 } }
   PrintArray( hb_regexAtx( "(a+)(b+)",s,.f. ) )         // { { aAb 3 5 } { aA 3 4 } { b 5 5 } }
 
   PrintArray( hb_regexAll( "a+b+",s,.f. ) )             // { { aAb aBb } }
   PrintArray( hb_regexAll( "(a+)(b+)",s,.f. ) )         // { { aAb aA b } { aBb a Bb } }
   PrintArray( hb_regexAll( "(a+)(b+)",s,.f.,,,1 ) )     // { aAb aBb }
   PrintArray( hb_regexAll( "(a+)(b+)",s,.f.,,,2 ) )     // { aA a }
   PrintArray( hb_regexAll( "(a+)(b+)",s,.f.,,,0,.f. ) ) 

   // { { { aAb 3 5 } { aA 3 4 } { b 5 5 } } { { aBb 10 12 } { a 10 10 } { Bb 11 12 } } }
   PrintArray( hb_regexAll( "(a+)(b+)",s,.f.,,,1,.f. ) ) // { { aAb 3 5 } { aBb 10 12 } }
 
Return Nil
 
Function PrintArray( arr, lNoNewLine )

   Local i
 
   IF lNoNewLine == Nil .OR. !lNoNewLine
      ?
   ENDIF

   ?? " {"

   FOR i := 1 TO Len( arr )

      IF Valtype( arr[i] ) == "A"
         PrintArray( arr[i], .T. )
      ELSE
         ?? " " + Iif( Valtype( arr[i] ) == "N", Ltrim(Str(arr[i])), arr[i] )
      ENDIF

   NEXT

   ?? " }"

Return Nil

hb_RegEx

Enviado: 20 Dez 2019 13:05
por JoséQuintas
Quero pegar cada linha, procurar ADOField(, e confirmar se tem "N" ou "C", ou "D"

Talvez aplicar um filtro do hb_RegEx() que já separe todas as linhas erradas.

Mas agora que fui explicar, talvez consiga pelo prompt, só não sei como indicar texto com aspas entre aspas.... rs

COPY *.PRG LIXO.TXT
TYPE LIXO.TXT ! find /i /n "adofield" | find /i ""N"" | find /i ""D"" | find /i ""C""

hb_RegEx

Enviado: 20 Dez 2019 13:32
por JoséQuintas
Fiz do jeito antigo....
Procura aonde tem ADOFIELD(, e verifica se "C" vém antes do fim de linha chr(13)

Código: Selecionar todos

   cText := Upper( MemoRead( cFile ) )
   DO WHILE nKey != K_ESC .AND. "ADOFIELD(" $ cText
      nKey := Inkey()
      cText := Substr( cText, At( "ADOFIELD(", cText ) )
      IF At( ["C"], cText ) < At( Chr(13), cText )
      //ELSEIF At( ["X"], cText  ) < At( Chr(13), cText )
      //ELSEIF At( ["X"], cText ) < At( Chr(13), cText )
      ELSE
         SayScroll( cFile + "*** ERRO ADOField ***" )
         SayScroll( Substr( cText, 1, At( Chr(13), cText ) - 1 ) )
      ENDIF
      cText := Substr( cText, At( Chr(13), cText ) )
   ENDDO
Fiz de propósito apenas "C", e sobraram os com "N", e, lógico... o programa de teste que foge da regra.
adofield.png

hb_RegEx

Enviado: 20 Dez 2019 13:50
por JoséQuintas
Então... tem casos aonde eu pegava um texto pra mostrar.
em DBF:

Código: Selecionar todos

Encontra( nota->cliente, "jpcadastro", "numlan" )
@ Row(), 32 SAY jpcadastro->cdNome
Em ADO, transformei isso em

Código: Selecionar todos

@ Row(), 32 SAY ADOField( "CDNOME", "C", "JPCADASTRO", "IDCADASTRO=" + StringSql( nota->cliente ) )
é que o conteúdo poderia ser nulo, então indico o tipo de resultado que quero, por isso o "C", ou "N", ou "D", ou o que precisar.

Acontece que corre o risco de na hora de digitar, eu esquecer de indicar o tipo, e poderia acontecer erro em run-time.
É uma rotina pra conferir minha digitação nos fontes.

Foi o quebra-galho em ADO que encontrei: passo o campo que quero, qual a tabela pesquisar, qual a chave de pesquisa, e também o tipo de retorno que espero.
Isso economiza muito fonte, seja híbrido dbf+MySQL ou seja MySQL sozinho.

Vários deles vão sumir, quando o SELECT principal trouxer tudo pronto, mas por enquanto foi meu quebra-galho.
Troquei duas linhas usando DBF por uma usando ADO... tá bom por enquanto...

Mas como estou mexendo rápido nessas coisas... fico na dúvida se esqueci de indicar o tipo em algum lugar.

A rotina deste post vai conferir se esqueci em algum fonte.

hb_RegEx

Enviado: 20 Dez 2019 14:30
por JoséQuintas
Faltou completar...
O que queria com hb_RegEx() era procurar ADOField( "any", "C" )
Se o segundo parâmetro estava devidamente preenchido com N ou C ou D

À primeira vista, seria parecido com isto (não está em formato hb_RegEx)

*ADOField("*", "?", *

* = qualquer coisa
? = um caractere específico