Página 1 de 2

Tratativa de Campos

Enviado: 29 Out 2012 11:28
por Paulo Gomes
Bom dia

Tenho em uma tabela com diversos campos e preciso dar uma tratativa diferenciada ao campo “Numero do Pedido” alfanumérico tamanho de 6 caracteres, quando em qualquer uma de suas seis posições contiverem caracteres diferentes de números. Existe alguma função ou algum código que eu possa utilizar para esta verificação?

Pela atenção, obrigado.

Paulo Gomes

Tratativa de Campos

Enviado: 29 Out 2012 12:21
por Pablo César
Paulo, seja bem vindo ao fórum !

Para edição, você utilizar o picture no seus Gets. Uma forma de limitar esse seu caso seria:

Código: Selecionar todos

cPedido:=Space(6)
@ 12,00 Say "Numero do Pedido" Get Cpedido Picture "999999"
read
Agora, se você refere-se a acertar no seu banco de dados o campo referente ao Numero do Pedido você vai precisar varrer o dbf todo e verificar se existe algum caracter do tipo alfa. Mais ou menos seria algo assim:

Código: Selecionar todos

Use Pedidos
SET ALTERNATE TO Repetido.txt
SET ALTERNATE ON
Do While !Eof()
   nRecno:=Recno()
   cPedido:=(Num_Pedido)
   cNew_Num:=""
   nLen:=Len(cPedido)
   For nP = 1 to nLen
       If IsDigit( SubStr( cPedido, nP, 1 ) )
          cNew_Num:=cNew_Num+SubStr( cPedido, nP, 1 )
      Endif
   Next
   Locate All for Num_Pedido=cNew_Num .and. !(Recno()=nRecno) // verifica se o novo numero estaria em duplicidade
   lEncontrou:=Found()
   nEncontrou:=Recno()
   Goto nRecno
   If lEncontrou
      ? "Número "+cNew_Num+" encontrado no registro: "+AllTrim(Str(nEncontrou))+". Deve mudar para outro número."
   Else
      Replace Num_Pedido with Strzero(Val(cNew_Num),6,0)
   Endif
   Skip
Enddo
SET ALTERNATE OFF
SET ALTERNATE TO
Este código simula o seu banco de dados como Pedidos.dbf e o campo Num_Pedido como sendo nome do campo que contém o Numero do Pedido. Cria-se um arquivo onde contém os números que poderia estar em duplicidade.

Sugiro que o armazenamento do Numero do Pedido seja gravado com zeros em lugar de espaços.

Tratativa de Campos

Enviado: 29 Out 2012 12:25
por alxsts
Olá!

Seja bem-vindo ao Fórum Paulo!

Construí o exemplo abaixo. Veja se te ajuda de alguma forma.

Código: Selecionar todos

Function Main()

   LOCAL cNrPedido := "12345X"
   
   IF IsNumeric( cNrPedido )
      // Tratamento normal
   ELSE
      // Tratamento especial
   ENDIF
   
   RETURN NIL        

//----------------------------------------------------
//   Verificar se uma string contem somente dígitos
//----------------------------------------------------
FUNCTION IsNumeric( cString )

   LOCAL nPos, nLen, nCount := 0
   
   cString:= AllTrim( cString )
   nLen   := Len( cString )
   
   FOR nPos := 1 TO nLen
      IF IsDigit( Substr( cString, nPos, 1 ) )
         nCount++
      ELSE
         EXIT   
      ENDIF
   NEXT      
   
   RETURN ( nCount == nLen )
//----------------------------------------------------        

Tratativa de Campos

Enviado: 29 Out 2012 13:17
por Jairo Maia
Alexandre, a função IsNumeric() para Clipper está em qual Lib?

Existe uma função da CT que retorna apenas os caracteres numéricos de uma variavel Alfanumérica, mas não lembro qual.

Paulo, veja também o exemplo abaixo:

Código: Selecionar todos

Local i, cCodigo

Clear Screen

For i = 1 To 2

 If i = 1
  cCodigo := "123456"
 Else
  cCodigo := "123X56"
 Endi

 nCodigo := Val( cCodigo )
 lSoNumeros := Len( LTrim( Str( nCodigo ) ) ) = Len( cCodigo )

 If lSoNumeros
  Alert( cCodigo + ";Codigo apenas com caracteres numericos" )
 Else
  Alert( cCodigo + ";Codigo misto com letras e caracteres numericos" )
 Endi

Next

Tratativa de Campos

Enviado: 29 Out 2012 13:26
por alxsts
Olá!

A função IsNumeric() não existe em Clipper, Jairo. É o nome que dei à função que criei (veja no post acima). Talvez fosse até melhor colocar outro nome para não confundir com alguma função reservada de alguma lib. O que existe é a IsDigit(), que leva em consideração apenas o carácter mais à esquerda na string.

Tratativa de Campos

Enviado: 29 Out 2012 13:33
por Jairo Maia
Puxa Alexandre,

Entendi. Desculpe. Você já havia resolvido. Mas realmente não percebi que era uma função que você criou. Foi Mal... :%

Tratativa de Campos

Enviado: 29 Out 2012 14:42
por alxsts
Olá!

Sem problemas Jairo. Isso acontece.

Só uma correção: trocar a linha

Código: Selecionar todos

cField := AllTrim( cString )
por

Código: Selecionar todos

cString:= AllTrim( cString )
Troquei o nome dessa variável e esqueci de trocar nessa linha.

Tratativa de Campos

Enviado: 29 Out 2012 20:18
por Eolo
Uma outra sugestão, mais simples (acho):
VAL(CAMPO) -> X

. se só houver caracteres numéricos em CAMPO (além de "-" e/ou "."), X retorna o valor numérico correspondente (diferente de zero)
. se houver alguma letra e/ou outro caracter em CAMPO, x retorna ZERO.

Tratativa de Campos

Enviado: 29 Out 2012 20:45
por Pablo César
Eu também já pensei apenas utilizar a função Val(), mas em alguns casos fica deficiente. Na utilização destes casos, por exemplo:

? Val("123X4") // irá retornar 123
? Val("8987") // irá retornar 8987
? Val("89x87") // irá retornar 89
? Val("a8987") // irá retornar 0

Tratativa de Campos

Enviado: 29 Out 2012 20:55
por Eolo
Estranho, testei aqui e deu outro resultado:

? Val("123X4") // 0
? Val("8987") // 8987
? Val("89x87") // 0
? Val("a8987") // 0

Se fizer ? Val("123*4") // dá 123 multiplicado por 4... mas o X ou x é alpha...

Tratativa de Campos

Enviado: 29 Out 2012 21:00
por Eolo
ops, Pablo, desculpe, vc tem razão.
to ficando caduco...

a função não é a VAL e sim a VALTYPE()
(pensei numa e me referi à outra)

apaga tudo o que eu falei :-(

? Valtype("123X4") // C
? Valtype("8987") // N
? Valtype("89x87") // C
? Valtype("a8987") // C

Tratativa de Campos

Enviado: 29 Out 2012 21:12
por Pablo César
Ahhh sim, estou vendo que bastaria apenas usar com ValType(), sem necessidade de checar caracter a caracter. Se bem que a função que postei também elimina o resto que não for números. No entanto, não sei se seria correto apenas eliminá-lo, digamos numa sequência assim por exemplo:

cPedido:=12 // retornaria 12
cPedido:=12A1 // retornaria 121
cPedido:=12A2 // retornaria 122
cPedido:=13 // retornaria 13

Por isso que se contiver alguma caracter alfa, deveria não repassar simplesmente, nem verificar se ja existe. Teria que ser listado para ser estudado e chegado a um consenso do quê fazer com esses códigos com caracter alfa.

Tratativa de Campos

Enviado: 29 Out 2012 21:19
por Eolo
Tenho em uma tabela com diversos campos e preciso dar uma tratativa diferenciada ao campo “Numero do Pedido” alfanumérico tamanho de 6 caracteres, quando em qualquer uma de suas seis posições contiverem caracteres diferentes de números.
Voltando ao fio da meada.

Código: Selecionar todos

if valtype(numerodopedido)="N"
  * normal
else
  * "tratamento diferenciado"
endi

Tratativa de Campos

Enviado: 29 Out 2012 23:07
por alxsts
Olá!

Creio estar havendo um engano:

Código: Selecionar todos

? Valtype( "12345" ) ---> "C"  <br/>? Valtype( 12345 ) ---> "N"

Tratativa de Campos

Enviado: 30 Out 2012 10:56
por Eolo
Tem razão, Alexandre. Ficou capenga.

Vamos lá: se CAMPO é C e vc quer identificar os registros que contêm só números, é usar VAL e VALTYPE.

Código: Selecionar todos

if valtype(val(campo)="N"
  * só tem números
else
  * tem outros caracteres não conversíveis em N
endi