Página 1 de 2

[Resolvido] Alinha dados no banco de dados

Enviado: 30 Out 2009 15:42
por gilsonpaulo
Ola a todos.
Estou precisando alinhar a direita e centralizar os dados no banco de dados (dbf).

Alguem poderia me dar uma luz?


---
Nota da Moderação (Maligno):
O presente tópico, apesar do assunto tratar de manipulação de banco de dados, teve de ser movido da seção "Banco de dados", uma vez que, na realidade, o âmago da questão está relacionado apenas à aplicação da linguagem XBase, supostamente vinculada à ferramenta Clipper.

Re: Alinha dados no banco de dados

Enviado: 30 Out 2009 15:49
por Maligno
Não entendi exatamente o que você pretende. Poderia explicar melhor? Alinhar onde? Algum relatório? Textos dentro do banco de dados?

Re: Alinha dados no banco de dados

Enviado: 30 Out 2009 15:52
por gilsonpaulo
Dentro do banco, ao gravar os dados eles devem ficar alinhado a diretira.

É que estou fazendo uma rotina de conversão de um sistema clipper para outro sistema, e os dados tem que estar alinhados a direita no banco de dados.

Os campos são caracateres, por padrão ficam alinhados a esquerda.

Re: Alinha dados no banco de dados

Enviado: 30 Out 2009 16:03
por Maligno
Entendi. Nesse caso você só precisa de uma rotina simples que "varra" todo o banco de dados para a troca das strings. Um exemplo simples:

Código: Selecionar todos

dbEval(||<nome_campo> := PadL(RTrim(<nome_campo>),<tamanho_campo>)})
Sendo <nome_campo> e <tamanho_campo> dados conhecidos, fica bem fácil: primeiro ele remove os espaços à direita e em seguida, preenche a string com espaços à esqueda, até a largura do campo. Se não for exatamente o que quer, ainda assim o conceito é esse. Basta ajustar para suas necessidades.

Re: Alinha dados no banco de dados

Enviado: 30 Out 2009 16:08
por gilsonpaulo
Ok, Vou testar. Muito Obrigado.

Re: Alinha dados no banco de dados

Enviado: 30 Out 2009 18:17
por gilsonpaulo
Maligno, testei com sua função mas não deu certo.

Vai um trecho do código:

Código: Selecionar todos

select fornec
go top

do while .not. eof()
   select forbas
   go top
   seek fornec->cgc
   if found()
      if rlock()
         forbas->nr_cgcpf:=   strtran(strtran(strtran(fornec->cgc,"."),"-"),"/")
         bla bla bla
         unlock
      endif
   else
      append blank
      if rlock()
         forbas->nr_cgcpf:=   strtran(strtran(strtran(fornec->cgc,"."),"-"),"/")
         bla bla bla
         unlock
      endif
   endif
   select fornec
   skip
enddo

Re: Alinha dados no banco de dados

Enviado: 30 Out 2009 18:20
por Maligno
Só com esse código não dá pra entender nada.

Re: Alinha dados no banco de dados

Enviado: 30 Out 2009 18:24
por gilsonpaulo
Ja arrumado, falha humana.

Fiz assim para teste com sua função.

Código: Selecionar todos

select forbas
do while .not. eof()
   dbEval({||forbas->nr_cgcpf := PadL(RTrim(forbas->nr_cgcpf),15)})
enddo
Mas não funcionou

Re: Alinha dados no banco de dados

Enviado: 30 Out 2009 18:33
por Maligno
E qual o efeito do teste que fez? O que exatamente deu errado?

Re: Alinha dados no banco de dados

Enviado: 30 Out 2009 18:55
por gilsonpaulo
Continua alinhado a esquerda.

Re: Alinha dados no banco de dados

Enviado: 30 Out 2009 19:26
por gilsonpaulo
Resolvido,

Código: Selecionar todos

select fornec
go top

do while .not. eof()
   select forbas
   go top
   seek fornec->cgc
   if found()
      if rlock()
         forbas->nr_cgcpf:=   pdal(strtran(strtran(strtran(fornec->cgc,"."),"-"),"/"),15," ")
         bla bla bla
         unlock
      endif
   else
      append blank
      if rlock()
         forbas->nr_cgcpf:=   pdal(strtran(strtran(strtran(fornec->cgc,"."),"-"),"/"),15," ")
         bla bla bla
         unlock
      endif
   endif
   select fornec
   skip
enddo

Se não fosse pelos caracteres ".", "/" e "-" que estou retirando pelo strtran ficaria assim.:

Código: Selecionar todos

select fornec
go top

do while .not. eof()
   select forbas
   go top
   seek fornec->cgc
   if found()
      if rlock()
         forbas->nr_cgcpf:=   pdal(fornec->cgc),15," ")
         bla bla bla
         unlock
      endif
   else
      append blank
      if rlock()
         forbas->nr_cgcpf:=   pdal(fornec->cgc),15," ")
         bla bla bla
         unlock
      endif
   endif
   select fornec
   skip
enddo
Para funcionar com o seu exemplo Maligno, ficaria assim.:

Código: Selecionar todos

select forbas
go top

do while .not. eof()
   dbEval({||forbas->nr_cgcpf := PadL(RTrim(forbas->nr_cgcpf),15," ")})
enddo
help do vfp 5

Retorna uma seqüência de uma expressão preenchida com espaços ou caracteres até o comprimento especificado no lado direito, esquerdo ou nos dois lados.

Sintaxe

PADL(eExpressão, nTamanhoResultado [, cCaracterePreenchimento])
– Ou –
PADR(eExpressão, nTamanhoResultado [, cCaracterePreenchimento])
– Ou –
PADC(eExpressão, nTamanhoResultado [, cCaracterePreenchimento])

Tipos de retorno

Caractere

Argumentos

eExpressão Especifica a expressão a ser preenchida. Esta expressão pode ser de qualquer tipo, exceto expressão lógica ou um campo de figura ou geral.

nTamanhoResultado Especifica o número total de caracteres na expressão depois que ela foi preenchida.

cCaracterePreenchimento Especifica o valor a ser utilizado no preenchimento. Este valor é repetido, de acordo com a necessidade, para preencher a expressão até o número especificado de caracteres.

Se você omitir cCaracterePreenchimento, espaços (caractere ASCII 32) serão utilizados no preenchimento.

Comentários

PADL( ) insere preenchimento à esquerda, PADR( ) insere preenchimento à direita e PADC( ) insere preenchimento nos dois lados.

Exemplo.:

Código: Selecionar todos

m.campo = ' 1'
m.campo = padl(alltrim(campo),8,'0')
campo ficara assim '00000001'

Fonte.: http://www.vfpbrasil.com.br/modules/new ... ic_id=1926

Valeu Maligno pela ajuda

Re: Alinha dados no banco de dados

Enviado: 30 Out 2009 19:26
por Toledo
Tenta desta forma:

Código: Selecionar todos

dbEval({||forbas->nr_cgcpf := PadL(RTrim(forbas->nr_cgcpf),15," ")})
Abraços

Re: Alinha dados no banco de dados

Enviado: 30 Out 2009 19:27
por gilsonpaulo
Obrigado Toledo, mas ja resolvi.

Valeu a juda de todos.

Tem como colocar resolvido no topíco?

Re: Alinha dados no banco de dados

Enviado: 30 Out 2009 19:28
por Toledo
Postamos ao mesmo tempo... 18:26

Re: [Resolvido] Alinha dados no banco de dados

Enviado: 30 Out 2009 19:38
por Maligno
O código que fez com DBEval() está certo. Fiz até um teste aqui, bem semelhante:

Código: Selecionar todos

use ("d:\nome.dbf") exclusive
dbEval({||field->nome := PadL(RTrim(field->nome),35)})
Usei um arquivo de clientes qualquer, com um campo NOME. Alinhou os nomes à direita perfeitamente, como esperado.

A única coisa que vejo errada no seu código é essa malha DO. Ela é desnecessário, e se mantida, ficará num loop infinito. Se testou, deve ter travado.

Curiosidade: porque alinhar à direita um campo de CNPJ se esse número é muito mais útil alinhado à esquerda?