Tratativa de Campos

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Paulo Gomes
Usuário Nível 1
Usuário Nível 1
Mensagens: 2
Registrado em: 29 Out 2012 10:04
Localização: Sao Paulo, SP

Tratativa de Campos

Mensagem 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
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Tratativa de Campos

Mensagem 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.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Tratativa de Campos

Mensagem 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 )
//----------------------------------------------------        
Editado pela última vez por Toledo em 29 Out 2012 19:58, em um total de 1 vez.
Razão: Mensagem editada para corrigir nome da variável cField para cString, conforme orientação (mensagem abaixo) do autor da função.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Tratativa de Campos

Mensagem 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
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Tratativa de Campos

Mensagem 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.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Tratativa de Campos

Mensagem 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... :%
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Tratativa de Campos

Mensagem 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.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Tratativa de Campos

Mensagem 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.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Tratativa de Campos

Mensagem 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
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Tratativa de Campos

Mensagem 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...
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Tratativa de Campos

Mensagem 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
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Tratativa de Campos

Mensagem 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.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Tratativa de Campos

Mensagem 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
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Tratativa de Campos

Mensagem por alxsts »

Olá!

Creio estar havendo um engano:

Código: Selecionar todos

? Valtype( "12345" ) ---> "C"  <br/>? Valtype( 12345 ) ---> "N"
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Tratativa de Campos

Mensagem 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
Responder