Escolher campo(field)

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

braz
Usuário Nível 2
Usuário Nível 2
Mensagens: 53
Registrado em: 08 Jan 2011 17:39
Localização: piracicaba

Escolher campo(field)

Mensagem por braz »

Ola Pessoal, boa tarde.

Estou com dificuldade para criar uma rotina para um relatorio que só contenha os campos que eu escolher.

Por exemplo, criei uma rotina para eu imprimir ao os campos selecionados pelo usuario de um arquivo tambem selecionado pelo usuario.

Tipo assim:

Qual arquivo voce quer listar? CLIENTES

Entao criei um arquivo que conterá os campos desse arquivo, no caso CLIENTES.

O usuario irá marcar com um 'x' quais os campos que ele quer listar deste arquivo.

Até aqui tudo bem.

Como faço para listar os registros somente desses campos que foram selecionados do arquivo CLIENTES ?

Desde ja agradeço a sempre boa vontade de voces, abraços
Avatar do usuário
HASA
Colaborador
Colaborador
Mensagens: 1088
Registrado em: 01 Set 2003 19:50
Localização: São Paulo
Contato:

Escolher campo(field)

Mensagem por HASA »

Boa tarde pode ser assim:

cCAMPO = "RAZAO" && campo escolhido.

e imprima

@ 10, 10 say FIELD->&cCAMPO

HASA
Avatar do usuário
billy1943
Usuário Nível 4
Usuário Nível 4
Mensagens: 570
Registrado em: 12 Mai 2009 17:33
Localização: Bauru-SP

Escolher campo(field)

Mensagem por billy1943 »

Para o que você quer, precisará do seguinte:

a) saber trabalhar bem com matrizes para criar o arquivo temporário que terá os campos escolhidos

b) usar algumas funções não-Clipper, tais como: AFIELDSX, AFTYPESX, AFLENSX e AFDECIX, que estão na SUPER.LIB

c) usar também a função AFIELDS, do Clipper;

d) dominando as funções citadas, você poderá criar o arquivo desejado,com os campos escolhidos

e) não esquecer que também terá de pensar nos índices para acessar esse arquivo
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Escolher campo(field)

Mensagem por ANDRIL »

Tenho esta rotina em anexo onde escolho em um DBF os campos para o relatorio. Veja se te serve, possivelmente sera necessario algumas adaptações mais já da para ter uma idéia.

Abraços.
Anexos
teste.prg
(3.28 KiB) Baixado 176 vezes
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
braz
Usuário Nível 2
Usuário Nível 2
Mensagens: 53
Registrado em: 08 Jan 2011 17:39
Localização: piracicaba

Escolher campo(field)

Mensagem por braz »

Ola Andril, obrigado por responder, sou iniciante em programação então não consegui utilizar a sua rotina.

Eu fiz uma, so que não consigo achar o tamanho do campo para dar o espaço necessario para impressão do proximo campo, veja se pode me ajudar:

Código: Selecionar todos

funct re_persona
SAVE SCREEN TO TELA_anterior
core=setcolor()
do while .t.
  tela_fol()
  xcodigo='   '
  xnome=space(35)
  titu=space(40)
   CCC='S'
  arq='                   '
  MESANO=SPACE(7)
  fonte=0
  @4,2 say 'Tecle <enter> p/ visualizar '
  @06,10 to 16,75
  @06,26 say ' Impressao de Relatorio Personalizado '
   set escape on
   @08,12 SAY 'COD.EMPRESA..:'GET xcodigo PICT '999' valid cad_empr_fol()
   @10,12 get xnome pict '@!s35' when empt(xNOME)
   @11,12 say 'Nome Arquivo:'GET arq PICT '@!'
   @12,12 say 'Titulo do Relatorio:'get titu pict '@!'
   @13,12 say 'Fonte da letra(18/19/80/140/160):'get fonte pict '999' valid(fonte>0)
   @15,24 SAY 'Confirma a Emissao<S/N>'GET CCC PICT '@!'valid(ccc='S' .or. ccc='N')
   READ
        if lastkey()=27
          exit
        endif
        IF CCC = 'N'
           loop
        ENDIF

           ordem=1



           SET DEVICE TO PRINT
           if xcodigo = '001'
              set print to relajl1.rtf
           elseif xcodigo = '002'
              set print to relajl2.rtf
           elseif xcodigo = '003'
               set print to relatk1.rtf
           elseif xcodigo = '011'
               set print to relatk2.rtf
           endif

       *    dbcloseall()
           sele 61
           go top
           locate for alltrim(nome)=alltrim(arq)
           if !found()
              loop
           endif

           arq=val(area)


           sele (arq)

         nomarq1 := {}
     if !file( 'persona.DBF' )
        aadd( nomarq1, { 'campo', 'C',   10, 0 } )
        aadd( nomarq1, { 'sn', 'C',  1, 0 } )
        aadd( nomarq1, { 'posicao', 'n',  2, 0 } )
        dbcreate( 'persona.DBF', nomarq1 )
     endi
         sele 223
           use persona
           zap



           l=10
          x=1
         sele (arq)
         go top
         f=fcount()
         do while x < f
         a=field(x)
            sele 223
            dbappend()
            repl campo with a, posicao with x
            sele (arq)
            skip
            x++
         enddo
         sele 223
  go top
  CR=SETCOLOR()
  SETCOLOR('')

    browse(1,10,20,40)

           SETCOLOR(CR)



           L=1
           @l,1 say chr(fonte)
           @L,1 SAY dono
           @L+1,1 SAY xCOdigo+space(2)+substr(xNOme,1,35)+' '+' '+' '+empresas->cgc
           @L+2,01 SAY 'ENDERECO:'+SPACE(2)+substr(empresas->endereco,1,30)+SPACE(2)+substr(empresas->cidade,1,12)+' Data: '+dtoc(date())
           @L+3,1 SAY REPLICATE('=',78)
           @L+4,30 SAY 'RELACAO DE EMPREGADOS'
           @L+5,1 SAY REPLICATE('-',78)
           *@l+5,1 say chr(15)




           *@L+6,01 SAY CHR(15)
         *SETPRC(9,1)
         @l+7,1 say ''
         SELE 223
         GO TOP
         DO WHILE !EOF()
              IF sn $ 'xX'
                  @l+7,pCOL()+1 SAY CAMPO+'  '
              ENDIF
              SKIP
           ENDDO

         x=1
         sele 223
         set filter to sn='x'
         go top

          DECLARE VETOR_CAMPOS[fcount()]
          for x=1 to fcount()
            vetor_campos[x]:=field(x)
            skip
          next

         do while !eof()


            if alltrim(field(x))=alltrim(persona->campo)
                  @l+1,pcol()+1 say &campo
                  x++
              endif

          sele 223
          skip
          enddo

         sele 223
         set filter to sn='x'
         go top
         *col():=1

         l=4
         sele (arq)
         go top
         do while !eof()
         c=1
         x=1
         setpos(1,1)
           sele 223
            go top
            do while !eof()
               sele (arq)
              

               if field(x)=alltrim(persona->campo)
                  p=persona->posicao
                    @l,col()+1 SAY fieldget(p)

                else
                p=1
                endif
                c=c+? <--- aqui preciso saber tamanho do campo
               sele 223
               skip
               x++

             enddo

         sele (arq)

         skip
         l++
         enddo
fclose('relacao.rtf')
set print to
set device to screen
if xcodigo = '001'
   run ("wordpad relajl1.rtf")
elseif xcodigo = '002'
   run ("wordpad relajl2.rtf")
elseif xcodigo = '003'
   run ("wordpad relatk1.rtf")
   elseif xcodigo = '011'
   run ("wordpad relatk2.rtf")
endif
quit
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Escolher campo(field)

Mensagem por ANDRIL »

Substitua a linha por esta aqui e coloque esta funcao no seu prg.
c= c + largCmp(p) + 1

Código: Selecionar todos

Function largCmp(p)
cmp=fieldput(p)
if valtype(fieldput(p) )=="C"
  tamCmp=len(&cmp)
elseif valtype(fieldput(p))=="N"
  tamCmp=len(str(&cmp))
else //logico
  tamCmp+=1
endif
return tamCmp
Caso nao de certo tente ver os parametros mais creio que funfa normal.
Abraços
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
braz
Usuário Nível 2
Usuário Nível 2
Mensagens: 53
Registrado em: 08 Jan 2011 17:39
Localização: piracicaba

Escolher campo(field)

Mensagem por braz »

Ola Andril obrigado novamente pela atenção, mas o largCmp(p) do campo está caindo no ELSE. Fica sempre como sendo largura do campo = 1.

Se nao me engano o valtype está dando 'U' = indefinido.

Caso tenha alguma outra forma de ver a largura do campo, eu agradeço. :{
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Escolher campo(field)

Mensagem por ANDRIL »

Acho que me perdi nos seus Do Whiles, tente colocar o x que representa cada campo no seu loop.
c= c + largCmp(x) + 1

Corrigi a funcao abaixo:

Código: Selecionar todos

Function largCmp(p) 
 cmp=fieldput(p) 
 if valtype(fieldput(p) )=="C" 
   tamCmp=len(&cmp) 
 elseif valtype(fieldput(p))=="N" 
   tamCmp=len(str(&cmp)) 
 else //logico 
   tamCmp=1 
 endif 
 return tamCmp 
Ate+
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
braz
Usuário Nível 2
Usuário Nível 2
Mensagens: 53
Registrado em: 08 Jan 2011 17:39
Localização: piracicaba

Escolher campo(field)

Mensagem por braz »

Ola Andril,

Coloquei um wait'' na rotina Function largCmp(p), para parar a execução e a variavel CMP está ficando sempre NIL.
Porisso naõ funciona.
Abração
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Escolher campo(field)

Mensagem por ANDRIL »

braz escreveu:CMP está ficando sempre NIL
OK, acho que seja devido estar em outra area, alem do mais errei na função coloquei fieldput() quando na verdade era fieldget() "PRESSA!". Modifiquei a função novamente, vamos ver se vai...

Código: Selecionar todos

Function largCmp(p) 
sele(area) 
cmp=fieldget(p) 
 if valtype(fieldget(p) )=="C" 
 tamCmp=len(&cmp) 
 elseif valtype(fieldget(p))=="N" 
 tamCmp=len(str(&cmp)) 
 else //logico 
 tamCmp=1 
 endif 
sele 223
 return tamCmp 
ou tente assim

Código: Selecionar todos

Function largCmp() 
parameters cmp
sele(area) 
 if valtype(&cmp )=="C" 
 tamCmp=len(&cmp) 
 elseif valtype(&cmp)=="N" 
 tamCmp=len(str(&cmp)) 
 else //logico 
 tamCmp=1 
 endif 
sele 223
 return tamCmp 
Continuamos tentando...
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
braz
Usuário Nível 2
Usuário Nível 2
Mensagens: 53
Registrado em: 08 Jan 2011 17:39
Localização: piracicaba

Escolher campo(field)

Mensagem por braz »

:)) :)) :)) :)) :)) :)) :)) :)) :))
Aewww, agora sim

Eu não coloquei como função, eu coloquei direto na rotina e retirei os '&' , usei o primeiro codigo.

:D :D :D :D :D :D :D :D :D

Valeu Andril, muito obrigado, se alguem quizer a rotina completa é so pedir.

Abraços
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Escolher campo(field)

Mensagem por alxsts »

Olá!

Se você le o campo

Código: Selecionar todos

cmp=fieldget(p)
por que não testar a variável, ao invés de chamar novamente (e várias vezes) FieldGet()? Poderia testar

Código: Selecionar todos

if valtype(cmp )=="C"
E se o campo for date ou memo?
[]´s
Alexandre Santos (AlxSts)
braz
Usuário Nível 2
Usuário Nível 2
Mensagens: 53
Registrado em: 08 Jan 2011 17:39
Localização: piracicaba

Escolher campo(field)

Mensagem por braz »

Quanto a primeira indagação nao sei responder.

Mas a segunda, poderia colocar mais testes IF VALTYPE=='D' e 'M'. Bem lembrado :-Y
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Escolher campo(field)

Mensagem por ANDRIL »

braz escreveu:Aewww, agora sim
Upa que bom. Só ia tentar mais umas 1000 vezes.
alxsts escreveu:por que não testar a variável, ao invés de chamar novamente (e várias vezes) FieldGet()?
Concordo. A pressa é mesmo inimiga da perfeição! Ainda mais usando Ctrl+C e Ctrl+V.
alxsts escreveu:E se o campo for date ou memo?
Como não uso campo date e memo em meus sistemas, acabei por esquecer. Cabe ao colega ver essa necessidade.

Ate+
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Escolher campo(field)

Mensagem por alxsts »

Olá!
ANDRIL escreveu:Como não uso campo date e memo em meus sistemas, acabei por esquecer.
Nossa! Em se tratando de xBase, isso é inédito para mim. Mas seria só testar e converter para caracter. Por exemplo (dependendo de SET DATE)

Código: Selecionar todos

Transform( cmp, "@E" )
No caso de campo memo, poderia imprimir um preview do campo, por exemplo, os 15 primeiros caracteres:

Código: Selecionar todos

Left( Memoread( cmp ), 15 ) + " ..."
Isso tornaria a rotina genérica.
[]´s
Alexandre Santos (AlxSts)
Responder