Browse, codeblock para ajustar Picture da coluna?

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Browse, codeblock para ajustar Picture da coluna?

Mensagem por clodoaldomonteiro »

Tenho um rotina de Browse para consulta de Arrays e numa determinada coluna tenho o valor de um CPF ou CNPJ, preciso então ajustar automaticamente a mascara de edição "picture" para o CPF ou CNPJ, tentei assim:
Array com o cabeçalho:

Código: Selecionar todos

      aCab := {;
       {'Data NF'        , 19, ''},;
       {'CPF/CNPJ Emitente'  , 18, {|m| ccr_maskCpfCnpj(m) } },;
       {'RazÆo Social'   , 65, ''},;
       {'Resumo'         , 06, ''},;
       {'S‚rie'          , 03, ''},;
       {'N. NF'          , 09, ''},;
       {'Estado'         , 02, ''},;
       {'Valor NFe'      , 14, '@E 999,999,999.99'},;
       {'Chave de acesso', 44, ''},;
       {'ID'             , 36, ''};
       }

For no Browse para processar o cabeçalho:

Código: Selecionar todos

   For i := 1 To Len(aAcab)
      bBlock := ArrayBlock( oBrowse, i )

      If i = 3
         mTitulo := PadR(aAcab[i, 1], aACab[ i, 2 ] -2) + ' ' + Chr(26)
      Else
         mTitulo := aAcab[i, 1]
      Endif

      oTBColumn := TBColumn():New( mTitulo, bBlock )
      oTBColumn:width   := aACab[ i, 2 ]

      oTBColumn:picture := aACab[ i, 3 ]
      //IF ValType(aACab[i, 3]) = 'B'
      //   oTBColumn:picture := aACab[i, 3]
      //ELSEIF ValType(aACab[i, 3]) = 'C' .AND. !Empty(aACab[i, 3])
      //   oTBColumn:picture := {|x| Transform(x, aACab[i, 3])}
      //ENDIF

      oBrowse:AddColumn( oTBColumn )

      If i = 3
         oBrowse:getcolumn(i):cargo   := 1
      Else
         oBrowse:getcolumn(i):cargo   := 0
      Endif

   Next

Desde já agradeço a todos.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Browse, codeblock para ajustar Picture da coluna?

Mensagem por JoséQuintas »

Código: Selecionar todos

FUNCTION FormatCnpj( xValue )

DO CASE
CASE Len( xValue ) == 11
   xValue := Transform( xValue, "@R 999.999.999-99" )
CASE Len( xValue ) == 14
   xValue := Transform( xValue, "@R 99.999.999/9999-99" )
ENDCASE

RETURN Pad( xValue, 18 )
A partir daí, pode fazer o browse usando FormatCnpj( xValue )
Ou validar o GET e já formatar
E outros

Eu prefiro já salvar formatado.
E pra obter só números, uma função do tipo SoNumero( xValue )
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Browse, codeblock para ajustar Picture da coluna?

Mensagem por clodoaldomonteiro »

Já tenho essa função, o que quero é aplicar ela no objeto tbcolumn, sendo q a cada linha, o picture se ajustará automaticamente, dependendo do length da coluna.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Browse, codeblock para ajustar Picture da coluna?

Mensagem por JoséQuintas »

Não use como picture, use como campo.

Código: Selecionar todos

{ "titulo", { || FormatCnpj( campo ) } }
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Browse, codeblock para ajustar Picture da coluna?

Mensagem por clodoaldomonteiro »

Tive q colocar na origem de coleta dos dados, onde pego o XML da NFe e verifico de o Emitente é pessoa física ou jurídica.

No objeto TBColumn(), a variável "picture" recebe somente uma string, como é de fato: {Character string holding a PICTURE format. }

Outras libs devem ter melhorado a mascara de edição, ou não.

Abraços.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Browse, codeblock para ajustar Picture da coluna?

Mensagem por JoséQuintas »

Tá usando pra editar no próprio browse, é isso ?
Assim fica limitado aos recursos da biblioteca para o browse, tanto no harbour quanto em outras bibliotecas.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Browse, codeblock para ajustar Picture da coluna?

Mensagem por clodoaldomonteiro »

Não, Quintas.
É uma consulta NFe que estou fazendo do Ambiente Nacional da Receita Federal, de um projeto para o controle de NFe emitidas às Prefeituras.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Browse, codeblock para ajustar Picture da coluna?

Mensagem por alxsts »

Olá!

Vejam:
Captura de tela 2024-09-11 173548.png

Código: Selecionar todos

// Salvar como  : Teste.Prg
// Compilar     : hbmk2 teste -w3 -es2 -run
// Código fonte original publicado em "xHarbour Language Reference Guide (Version 1.1)
// Copyright © 2006-2007 xHarbour.com Inc
//
// Adaptado por :Alexandre Santos - 11/09/2024
//
#include "tbrowse.ch"
#include "setcurs.ch"
#include "inkey.ch"

#xtrans  :data   =>   :cargo\[1]
#xtrans  :recno  =>   :cargo\[2]

PROCEDURE Main

   LOCAL i, nKey, bBlock, oTBrowse, oTBColumn
   LOCAL aHeading := { "Código", "Nome", "CPF / CNPJ" }
   LOCAL aWidth := { 9, 40, 20 }, nRet

   // Create TBrowse object
   oTBrowse := TBrowse():new( 2, 2, MaxRow()-2, MaxCol()-2 )
   oTBrowse:cargo := { SetDataSource(), 1 }

   oTBrowse:headSep       := Chr(196) + Chr(194) + Chr(196)
   oTBrowse:colSep        := " " + Chr(179) + " "
   oTBrowse:footSep       := Chr(196) + Chr(193) + Chr(196)
   oTBrowse:colorSpec     := "N/BG,W+/R"

   // Navigation code blocks for array
   oTBrowse:goTopBlock    := { || oTBrowse:recno := 1 }
   oTBrowse:goBottomBlock := { || oTBrowse:recno := Len( oTBrowse:data ) }

   // Adicionei este parâmetro opcional: { |o| SetPict( o ) }.
   // Caso contenha um codeblock, executa o mesmo a cada registro çido na fonte de dados
   oTBrowse:skipBlock     := { |nSkip| ArraySkipper( nSkip, oTBrowse, { |o| SetPict( o ) } ) }

   // create TBColumn objects and add them to TBrowse object
   FOR i:=1 TO Len( aHeading )
      // code block for individual columns of the array
      //
      // As configurações de coluna feitas aqui são estáticas. Ou seja:
      // as colunas são criadas e adicionadas ao objeto TBrowse enquanto ele ainda não
      // está "vivo". Ele só será ativado no loop DO WHILE ( ! oTBrowse:stabilize() ) ... ENDDO
      //
      // A necessidade do caso presente, é uma picture dinâmica, conforme o Len() da coluna 3.
      // Assim, não adianta setar a picture aqui. Se fizer isto, todas as linhas do TBrowse serão
      // exibidas no mesmo formato...
      //
      bBlock    := ArrayBlock( oTBrowse, i )

      oTBColumn := TBColumn():new( aHeading[i], bBlock )
      oTBColumn:width := aWidth[i]
      oTBrowse:addColumn( oTBColumn )
   NEXT

   oTBrowse:goTop()

   // display browser and process user input
   DO WHILE .T.
      DO WHILE ( ! oTBrowse:stabilize() )
         // Executa ArraySkipper() repetidamente, lendo os registros da fonte de dados
         // e pintando o conteúdo dos mesmos na tela...
      ENDDO

      nKey := Inkey(0)

      IF ( nRet := oTBrowse:applyKey( nKey ) ) == TBR_EXIT // -1 --> User request for the browse to lose input focus
         EXIT
      ELSEIF nRet == TBR_CONTINUE // 0 --> Code block associated with <nInkey> was evaluated
         //
      ELSEIF nRet == TBR_EXCEPTION // 1 --> <nInkey> is unknown, key was not processed
         IF nKey == K_ENTER
            IF hb_Alert( PadC( " == Registro selecionado  == ", 45 ) + ;
                      PadR( ";;Código  : " + LTrim( Str( Eval( oTbrowse:getColumn(1):block ) ) ), 45 ) + ;
                      PadR( ";Nome    : " + Eval( oTbrowse:getColumn(2):block ), 45 ) + ;
                      PadR( ";CPF/CNPJ: " + Transform( Eval( oTbrowse:getColumn(3):block ), oTbrowse:getColumn(3):picture ), 45 ), { "   Ok   ", " Fechar "}, "W+/B*" ) == 2
               EXIT
            ENDIF
         ENDIF
      ENDIF
   ENDDO

   CLS

RETURN
//--------------------------------------------------------------------------------

// This code block uses detached LOCAL variables to
// access single elements of a two-dimensional array.
//
FUNCTION ArrayBlock( oTBrowse, nSubScript )
   RETURN {|| oTBrowse:data[ oTBrowse:recno, nSubScript ] }
//--------------------------------------------------------------------------------

// This function navigates the row pointer of the the data source (array)
// Adicionei o parâmetro opcional bCargo
FUNCTION ArraySkipper( nSkipRequest, oTBrowse, bCargo )

   LOCAL nSkipped
   LOCAL nLastRec := Len( oTBrowse:data ) // Length of array

   // Esta função é executada repetidamente durante a estabilização, até que
   // toda a área de dados do TBrowse (linhas) esteja preenchida ( oTBrowse:stable() == .T. ).
   // Cada execução recupera um registro, quando existem registros na fonte de dados, que
   // é pintado em uma linha da tela.
   IF oTBrowse:recno + nSkipRequest < 1
      // skip requested that navigates past first array element
      nSkipped := 1 - oTBrowse:recno
   ELSEIF oTBrowse:recno + nSkipRequest > nLastRec
      // skip requested that navigates past last array element
      nSkipped := nLastRec - oTBrowse:recno
   ELSE
      // skip requested that navigates within array
      nSkipped := nSkipRequest
   ENDIF

   // adjust row pointer
   oTBrowse:recno += nSkipped

   // Neste ponto, já recuperou um registro mas ainda não pintou na tela...
   // Se bCargo é um codeblock, executa
   // o codeblock passado, e que será executado, vai analisar o conteúdo da
   // coluna 3 (CPF ou CNPJ) e definir a picture de exibição, visto que o
   // conteúdo tem tamanho variável.
   //
   // Para que funcione corretamente, o conteúdo de CPF/CNPJ tem que ser do tipo
   // caracter. Testei com numérico mas a picture não formata corretamente.
   // Parece que ele usa internamente a função Transform(), que não formata
   // corretamente valores numéricos com a picture "@R...":

   // ? Transform( 93985196238, "@R 999.999.999-99" )    -->  "***.***.***-* "  Numeric
   // ? Transform( "93985196238", "@R 999.999.999-99" )  -->  "939.851.962-38"  Character
   //
   If hb_IsBlock( bCargo )
      Eval( bCargo, oTBrowse )
   Endif

// tell TBrowse how many rows are actually skipped.
RETURN nSkipped
//--------------------------------------------------------------------------------

FUNCTION SetDataSource()
   // Coluna 3 do tio Character...
RETURN { ;
         { 1054  , "PAULO ROBERTO DE MATOS"    	     , "35343000159"  }, ;
         { 23453 , "ROCHA LAVANDERIA LTDA"	        , "21435343000159" }, ;
         { 1066  , "VALDIR SOUZA"	                 , "04675000160" }, ;
         { 1067  , "SAMAR SOUZA"	                    , "45357000185" }, ;
         { 118	  , "ROMILDA STAUDT JAHNKE"           , "21078246068809" }, ;
         { 23312 , "ODONTOPEDIATRIA MILANO"          , "01297750000130" }, ;
         { 23413 , "CLINICA DENTARIA PAULISTA LTDA"  , "12404246000108" }, ;
         { 265	  , "SERGIO SEVERINO SILVA"	        , "89390319400" }, ;
         { 458	  , "AMAZONAS DENTAL"                 , "08010000102" }, ;
         { 463	  , "ANTONIO CARLOS PEREIRA"  	     , "25331000122" }, ;
         { 481	  , "SULINA VIVADENT LTDA"	           , "04004675000160" }, ;
         { 486	  , "MORUMBI PRODUTOS DENTARIOS LTDA" , "73345357000185" }, ;
         { 55	  , "DENTAL SOUTH AMERICA LTDA"       , "48708010000102" }, ;
         { 745	  , "DAIANA LIMA VENTURINI"	        , "78246068809" }, ;
         { 806	  , "LUIZ ANTONIO MARTINS"	           , "12974808302" }, ;
         { 807	  , "EDUARDO SILVEIRA"	              , "04246000108" }, ;
         { 832	  , "CAROLINA VIIRA"	                 , "97750000130" }, ;
         { 88	  , "DENTAL SA IND.COM."	           , "33425331000122" } ;
       }
//--------------------------------------------------------------------------------

STATIC FUNCTION SetPict( oTBrowse )

   LOCAL cPict

   // No momento desta execução, um registro foi lido na fonte de dados mas ainda
   // não foi exibido na tela. Define a picture conforme o tamanho do conteúdo.
   //
   // Poderia escrever este código dentro da função ArraySkipper() mas preferi
   // escrever separado e em ArraySkipper() adicionar apenas um parâmetro de entrada,
   // que pode ser usado para executar qualquer coisa, inclusive esta função...
   //
   If Len( Eval( oTBrowse:getColumn(3):block ) ) <= 11
      cPict := "@R 999.999.999-99"
   Else
      cPict := "@R 99.999.999/9999-99"
   Endif

   //Ajusta a picture na coluna 3 do TBrowse ...
   // No próximo ciclo de estabilização, o registro será pintado na tela, com a picture correta....
   oTBrowse: getColumn(3):picture := cPict

RETURN NIL
//--------------------------------------------------------------------------------
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Browse, codeblock para ajustar Picture da coluna?

Mensagem por clodoaldomonteiro »

Bom mesmo, Alexandre, valeu pela ajuda.
Abraços.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
SOSSOFT
Usuário Nível 3
Usuário Nível 3
Mensagens: 118
Registrado em: 23 Out 2024 10:04

Browse, codeblock para ajustar Picture da coluna?

Mensagem por SOSSOFT »

Eu mudo para texto todos os campos, aí fica mais fácil, usando transform()
Responder