Página 1 de 1

Converter carcteres maiusculos por minusculos

Enviado: 05 Jun 2009 10:52
por kristo
Bom dia a todos os amigos,
Preciso da ajuda de vcs, não sei programar em clipper, estou pegando o bond andando, tenho apenas uma leve noção.
Tenho um banco de dados que no campo "nome" e "endereço" os caracteres estão todos em maiúsculos, estou precisando colocar apenas as inicias em maiusculo EX. PAULO EDUARDO, preciso que fique Paulo Eduardo, e assim no campo endereço também.
Alguem poderia por gentileza montar uma PRG para eu executar aqui.
O nome da DBF é CADASSO, e tenho apenas 3 campos nele, NOME, ENDEREÇO, TELEFONE, preciso alterar somente o campo NOME e ENDEREÇO.
Fico no aguardo e desculpe o abuso em pedir para montar a PRG, pois não encontrei outra saída.

Grato Kristo

Re: Converter carcteres maiusculos por minusculos

Enviado: 05 Jun 2009 12:37
por Toledo
Kristo, eu não testei, mas acho que vai dar certo... faz um teste ai!

Código: Selecionar todos

use CADASSO New
GO TOP
DO WHILE !EOF()
 vNome:=ConvMin(NOME)
 vEndereco:=ConvMin(ENDERECO)
 CADASSO->NOME:=vNome
 CADASSO->ENDERECO:=vEndereco
 SKIP
ENDDO
CLOSE ALL
RETU

FUNC ConvMin(vCmp)
LOCAL ret:=ALLTRIM(vCmp)
ret:=LEFT(ret,1)+LOWER(SUBS(ret,2))
FOR i=97 TO 122
 ret:=STRTRAN(ret," "+CHR(i)," "+CHR(i-32))
NEXT
ret:=STRTRAN(ret," Da ", " da ")
ret:=STRTRAN(ret," Dos ", " dos ")
ret:=STRTRAN(ret," E ", " e ")
RETU (ret)
Atenção: por segurança, faça um teste com uma copia do arquivo CADASSO.DBF.

Abraços,

Re: Converter carcteres maiusculos por minusculos

Enviado: 05 Jun 2009 23:15
por alxsts
Olá amigos,

confesso que tambem não testei mas, olhando a rotina construida pelo Toledo, creio que vá gerar um run time error "Lock Required", pois o arquivo foi aberto sem se especificar o modo SHARED ou EXCLUSIVE (e não há nenhum SET EXCLUSIVE ON ativo) e não foi feito um RLock() antes de gravar cada registro. É melhor abrir o arquivo com EXCLUSIVE (USE CADASSO EXCLUSIVE NEW).
Creio tambem que os replaces poderiam ser feitos de forma direta:

Código: Selecionar todos

use CADASSO EXCLUSIVE New

GO TOP

DO WHILE !EOF()
//   vNome:=ConvMin(NOME)
//   vEndereco:=ConvMin(ENDERECO)
   CADASSO->NOME:=ConvMin(NOME)
   CADASSO->ENDERECO:=ConvMin(ENDERECO)
   SKIP
ENDDO

CLOSE ALL

RETU

Ao longo dos meus quase 20 anos de Clipper, tambem precisei criar uma rotina para capitalizar frases, batizada de InitCap():

Código: Selecionar todos

//---------------------------------------------------------------------------
Function InitCap( cString )

   Local cRet := "", nLen := Len( cString ), nAt, cVar
   Local aExcept := { "da", "de", "do", "dos", "das", "a","e","o" }

   If Valtype( cString ) == "C"
      cString := Lower( AllTrim( cString ) )

      While Len( cString ) > 0

         If ( nAt := At( " ", cString ) ) > 0
            cVar := Substr( cString, 1, nAt )
            If ( Ascan( aExcept, Trim( cVar ) ) ) == 0
              cRet += Upper( Left( cVar, 1 ) ) + Substr( cVar, 2 )
            Else
               cRet += cVar
            Endif
         Else
            cRet += Upper( Left( cString, 1 ) ) + Substr( cString, 2 )
            EXIT
         Endif

         cString := Substr( cString, ++nAt )

      Enddo
   Endif

   Return cRet
//------------------------------------------------------------------------------
O Clipper é realmente uma linguagem fantástica! Vejam outra forma de se fazer a rotina acima. Usei InitCap() mas poderia ser a ConvMin() do Toledo:

Código: Selecionar todos

   USE CADASSO EXCLUSIVE NEW

   CADASSO->( DbGoTop(), ;
              DBEval( { || CADASSO->NOME     := InitCap( NOME), ;
                           CADASSO->ENDERECO := InitCap( ENDERECO ) ;
                      } ;
                    ),
              DBCloseArea() ;
            )
   __Quit()
Grandes []'s a todos
AlxSts

Re: Converter carcteres maiusculos por minusculos

Enviado: 06 Jun 2009 08:27
por Toledo
Amigos, se na abertura de um arquivo de dados não for especificado as cláusulas SHARED ou EXCLUSIVE, e nem utilizado o comando SET EXCLUSIVE, o arquivo sempre será aberto em modo EXCLUSIVE. Então provavelmente o exemplo que dei vai ser executado sem problema algum. Mas claro que é sempre bom se preocupar com a abertura e tratamento correto de um banco de dados.

Bom, eu ainda não tinha nada pronto, então montei a função na hora, apenas para dar ao nosso amigo Kristo um caminho a seguir.

Para completar minha função, não lembrei de verificar as palavras "de", "do" e "das", que pode ocorrer em Nome e Endereços.

Código: Selecionar todos

FUNC ConvMin(vCmp)
LOCAL ret:=ALLTRIM(vCmp)
ret:=LEFT(ret,1)+LOWER(SUBS(ret,2))
FOR i=97 TO 122
 ret:=STRTRAN(ret," "+CHR(i)," "+CHR(i-32))
NEXT
ret:=STRTRAN(ret," Da ", " da ")
ret:=STRTRAN(ret," De ", " de ")
ret:=STRTRAN(ret," Do ", " do ")
ret:=STRTRAN(ret," Das ", " das ")
ret:=STRTRAN(ret," Dos ", " dos ")
ret:=STRTRAN(ret," E ", " e ")
RETU (ret)
Abraços,

Re: Converter carcteres maiusculos por minusculos

Enviado: 26 Ago 2009 09:43
por kristo
obrigado a todos, deu tudo certinho sim, muito grato a ajuda de vcs.
Que Deus abençõe a todos, paz