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
por
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