Tratativa de Campos
Moderador: Moderadores
-
Paulo Gomes
- Usuário Nível 1

- Mensagens: 2
- Registrado em: 29 Out 2012 10:04
- Localização: Sao Paulo, SP
Tratativa de Campos
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
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
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Tratativa de Campos
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: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:
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.
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"
readCó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 TOSugiro 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.
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

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Tratativa de Campos
Olá!
Seja bem-vindo ao Fórum Paulo!
Construí o exemplo abaixo. Veja se te ajuda de alguma forma.
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.
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)
Alexandre Santos (AlxSts)
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Tratativa de Campos
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:
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
NextAbraç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)
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

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Tratativa de Campos
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.
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)
Alexandre Santos (AlxSts)
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Tratativa de Campos
Puxa Alexandre,
Entendi. Desculpe. Você já havia resolvido. Mas realmente não percebi que era uma função que você criou. Foi Mal... :%
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)
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

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Tratativa de Campos
Olá!
Sem problemas Jairo. Isso acontece.
Só uma correção: trocar a linhapor Troquei o nome dessa variável e esqueci de trocar nessa linha.
Sem problemas Jairo. Isso acontece.
Só uma correção: trocar a linha
Código: Selecionar todos
cField := AllTrim( cString )Código: Selecionar todos
cString:= AllTrim( cString )[]´s
Alexandre Santos (AlxSts)
Alexandre Santos (AlxSts)
Tratativa de Campos
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.
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.
- Pablo César
- Usuário Nível 7

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

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Tratativa de Campos
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.
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.
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.
Tratativa de Campos
Voltando ao fio da meada.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.
Código: Selecionar todos
if valtype(numerodopedido)="N"
* normal
else
* "tratamento diferenciado"
endi-
alxsts
- Colaborador

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Tratativa de Campos
Olá!
Creio estar havendo um engano:
Creio estar havendo um engano:
Código: Selecionar todos
? Valtype( "12345" ) ---> "C" <br/>? Valtype( 12345 ) ---> "N"[]´s
Alexandre Santos (AlxSts)
Alexandre Santos (AlxSts)
Tratativa de Campos
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.
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