Ticket #11 (closed melhoria: fixed)

Opened 2 years ago

Last modified 10 months ago

Função para escrever um valor por extenso

Reported by: noelson Assigned to: gbpacheco, noelson
Priority: normal Milestone:
Component: BrooCalc Version: 2.0.4
Severity: normal Keywords: Função Extenso Calc Writer Extensão
Cc:

Description

Função para valor extenso

Em 07/06/2006, Vitorio Y. Furusho sugeriu uma função com suporte a várias moedas.

Já temos uma função e a adaptação não deve ser complicada.

Devemos decidir:

1) aplicativos (hoje uma mesma função base é utilizada na criação do extenso para o Writer e Calc).

2) moedas e como obtê-las do usuário, o comportamento é diferente para textos / células. No caso de texto, podemos exibir um diálogo com as opções de moedas ou obtê-la diretamente do texto selecionado (na ausência do símbolo, o diálogo para a seleção será exibido). Para células, o usuário será obrigado a passar um segundo argumento, na omissão o padrão será usado (não tem como usar diálogo).

Não vejo necessidade de estender para o draw / impress.

Attachments

Alternativa_funcao_extenso_writer.odt (43.5 kB) - added by gbpacheco on 22-06-2006 00:53:42.
Extenso_BrOffice.org2.0.x.zip (9.9 kB) - added by gbpacheco on 22-06-2006 00:55:45.
broo_sw_valor_extenso.odt (19.4 kB) - added by noelson on 03-07-2006 18:49:08.
alterações em extenso_writer e nextenso
broo_extenso_1b.zip (37.9 kB) - added by noelson on 10-07-2006 00:35:33.
versão inicial do suplemento e funcao p/ Calc
broo_extenso_1b1.zip (38.2 kB) - added by noelson on 12-07-2006 22:15:22.
pequenas correções no suplemento

Change History

16-06-2006 12:19:10 changed by anonymous

1) Sobre essa questão, concordo que é bem adequado termos como foco o Writer e o Calc.

2) Penso que, nesta primeira etapa, o foco deve ser a implementação da função para valores em extenso apenas em reais. O valor por extenso em reais é o diferencial valioso enquanto que a implementação para diversas moedas dificultaria a implementação da funcionalidade e teria um número de usuários muito menor. Podemos implementar a função por extenso para outras moedas mais adiante, depois de termos algo concreto em reais.

16-06-2006 12:21:53 changed by gbpacheco

A propósito, o último comentário foi meu (Gustavo Pacheco). Não estava logado no Trac. :)

16-06-2006 23:01:14 changed by noelson

Já existe a rotina em reais para o Calc/Writer.

17-06-2006 12:34:04 changed by gbpacheco

Sim, perfeito Noelson, no entanto, as funcionalidades são implementadas através de macros que são armazenadas no documento. Ou seja, quando você escreve numa célula =NEXTENSO(12,50) ele aciona a macro que está dentro do arquivo de planilha para a geração de 'doze reais e cinquenta centavos'. Está correto, porque a função deverá acompanhar o documento para que o conteúdo das células por extenso seja sempre apresentado corretamente, em qualquer lugar onde o documento for aberto.

Caso a função fosse executada chamando uma macro dentro de 'Macros do BrOffice.org' ou 'Minhas Macros', haveria o problema de enviar o arquivo para um computador com alguma outra versão do BrOffice.org/OpenOffice.org e a função não funcionar pela falta dessa rotina.

Além disso, nos testes que fiz, não é possível fazer a chamada de =NEXTENSO(X) a partir de 'Minhas Macros' sem que a biblioteca seja lida anteriormente. Não terminei todos os testes, por isso, ainda é necessário algum estudo. Colocar as rotinas na biblioteca Standard, por exemplo. No entanto, não acho que essa seja uma solução 'elegante'.

Por isso, acho que as funções de inserção do número por extenso devem ser vinculadas na aplicação, sem gerarmos dependência de versão. Podemos usar a mesma rotina que é usada na função extenso, mas não acredito que possamos fazer com que a fórmula =NEXTENSO(X) seja incorporada nesse desenvolvimento. O que acho mais adequado é a criação de um item 'Valor por Extenso' no menu 'Inserir' onde, a partir de um diálogo, o usuário é perguntado sobre qual número deseja incluir como extenso. Ao clicar OK, o valor por extenso é colocado na célula ou na posição do cursor..

17-06-2006 13:38:28 changed by filhocf

  • keywords set to Função Calc.
  • status changed from new to assigned.
  • version set to 2.0.3.

Sugestão: buscar a moeda configurada no sistema (Ferramentas > Opções > Configurações do Idioma). Daí, busca a moeda configurada no sistema e usa aquela variável.

Pacheco, pode gerar um diff disto? preferencialmente "diff -Nup arquivo.original arquivo.modificado", e anexar aqui?

17-06-2006 22:06:26 changed by noelson

Bom,

No caso de macros, a função atual (não a do Cambion, a que alterei) é instalada em Minhas Macros, na biblioteca Standard (automaticamente inicializada). De qq maneira é necessário a instalação.

Realmente, a melhor solução é integrar ao pacote (uso universal). Neste caso, temos três alternativas: 1) como uma macro na Standard do usuário. Será acrescentada na instalação, para isto precisamos: a) que o pessoal que cria os pacotes saiba como fazer.

2) como um add-in; a) no Basic não é possível. b) "know-how" para integração (inclusive, inclusão de novos tópicos na ajuda)

3) como uma função do Calc. a) direto no código fonte (Roberto citou algo no ENBrO ?) b) idem (add-in)

No caso do Calc, se possível (integração), devemos partir logo pró add-in ou, se existir "know-how", para a escrita de uma nova função. A meu ver, qualquer outra solução é paliativa, pois o usuário espera inserir funções em ...

No Writer, é possível solucionar até com macros.

A generalização escrever o extenso de acordo com as definições do sistema é *muito* complicada. Não para obter a moeda, para escrever o extenso conforme a moeda.

Concordo com o Gustavo, vamos resolver primeiro em (R$).

Quem pode verificar os requisitos para a integração em cada caso?

22-06-2006 00:51:26 changed by gbpacheco

  • keywords changed from Função Calc to Função Extenso Calc.

Fiz uma implementação daquilo que havia comentado no meu tópico anterior, que seria algo como a alternativa 1)a) citada pelo Noelson, com algumas diferenças. É uma implementação da função por extenso através do menu Inserir > Valor por extenso, que utiliza uma biblioteca chamada BrO dentro do container 'Macros do BrOffice.org' e que pode ser integrada na compilação normal do BrOffice.org.

Essa implementação foi feita para o Writer. O detalhamento está nos arquivos anexados (a explicação está no arquivo .odt).

Quanto ao Calc, sem dúvida, para essa aplicação, o melhor seria termos a função =NEXTENSO(X) diretamente no Assistente de Funções. No entanto, a partir do comentário do Noelson, de que há como executar a função =NEXTENSO(X) a partir da biblioteca Standard, inclui o conjunto de macros na biblioteca BrO (dentro do módulo 'Noelson') e a função funcionou sem problemas no Calc.

A implementação direta do Noelson para o Writer (com a seleção do número pelo usuário e a execução da macro Extenso_Writer), também funcionou dentro da biblioteca BrO, embora eu não tenha feito o vínculo a nenhuma tecla de atalho ou ícone (poderá ser feito logo a seguir).

Neste pacote, temos, então, duas implementações para o Writer (via menu e execução direta) e uma para o Calc(=nextenso(x)), com boas possibilidades de ampliação. Com alguns refinamentos, acredito que teremos para logo, uma boa implementação da função para as duas aplicações.

De imediato, vou eliminar as redundâncias da função Extenso, apontando as chamadas para a função revisada do Noelson. Aguardo comentários.

22-06-2006 00:53:42 changed by gbpacheco

  • attachment Alternativa_funcao_extenso_writer.odt added.

22-06-2006 00:55:45 changed by gbpacheco

  • attachment Extenso_BrOffice.org2.0.x.zip added.

23-06-2006 15:04:32 changed by noelson

Gustavo, a função do Calc, na versão 2.0.1 e anteriores só funciona adequadamente a partir da bib Standard. Noutras bibs, após fechar o BrOo? e reabrir o documento ocorre um erro de função não encontrada. Em qual versão você testou ?

Se isto foi corrigido nas novas versões vai facilitar por demais a escrita de fórmulas para planilhas.

Se não foi corrigido será preciso integrar esta função durante a instalação do usuário na biblioteca Standard do mesmo.

Agora, sobre as demandas (Writer / Calc):

Para uma ferramenta do BrOo? o tratamento de erro é fundamental.

A questão do intervalo aceito esbarra na codificação usada pelo Camboin. Para valores muito grandes, a rotina deve ser reescrita tratando o valor como uma string e não como número. Assim, poderemos escrever o valor por extenso até de um “gugol”.

Outro ponto é a correção ortográfica. A função original do Camboim não está de acordo com alguns autores. Aliás não existe concordância nem mesmo entre autores de manuais da língua portuguesa. A minha alteração incluiu várias modificações para melhorar este aspecto. Mesmo assim, devemos ir mais fundo.

Devemos analisar também a usabilidade da ferramenta. A opção do diálogo é mais “à prova de erro”, um usuário será obrigado a usar a ferramenta com o que ela oferece e ponto. Porém, creio que bons digitadores vão detestar ter que ativar uma caixa de diálogo, digitar o valor num controle e depois clicar em OK. O ideal é digitar o valor no próprio documento e uma combinação de teclas (ou um clique num ícone) para inserir o valor por extenso. Para isto temos que tentar, via código, advinhar o que o usuário fez. Por exemplo: Macro disparada; a palavra anterior ao cursor (ou sob) é um valor numérico ? Sim, insere símbolo da moeda, formata o valor adequadamente e escreve o extenso entre parênteses; Não, exibe o diálogo. Com mais código, pode ser feito.

Desenhar ícones específicos para a ferramenta.

28-06-2006 22:33:59 changed by gbpacheco

Oi Noelson!

Você tem razão. Infelizmente, a execução do =nextenso(x) dentro da biblioteca BrO foi um equívoco meu. O erro permanece depois, da forma como você testou. Isso retrocede um pouco o nosso trabalho, mas acho que podemos aproveitar um pouco dessa experiência.

Estou em Brasília durante toda essa semana e conversei com o Salomon na segunda-feira sobre esse assunto. Discutimos bastante a implementação da função =nextenso(x) no Calc e concluímos que seria bastante complicado implementarmos e mantermos esse recurso na forma de uma função. Alguns motivos:

  • caso o desenvolvimento fosse feito através do código, precisaríamos do domínio do conhecimento para fazê-lo, o que, hoje, é mínimo; além disso, estaríamos fazendo um fork do projeto original;
  • a implementação da função =nextenso(x) causaria erro no documento ao ser aberto nas versões do OpenOffice.org 2.x, na versão 2.0.1 do BrOffice.org, na versão do OpenOffice.org 1.x (salvamento em formato SXC) e no Excel (salvamento em formato XLS), já que essas versões não tem a função implementada. Isso seria um problema sério para usuários com uso frequente da função que trocassem documentos com outros usuários;
  • ao implementarmos a função na biblioteca Standard, estaríamos colocando uma funcionalidade do BrOffice.org que pode ser alterada pelo usuário, fazendo com que qualquer modificação equivocada por parte do mesmo na biblioteca Standard fizesse com que a função deixasse de funcionar ou funcionasse de forma errada.

Por causa de tudo isso, concluímos que a implementação do valor por extenso não é adequada através de uma fórmula do tipo =nextenso(x) no Calc.

A partir disso e do que você comentou, o que sugiro que façamos a definição da implementação da função no Writer e no Calc através do menu Inserir e de uma combinação de teclas, gerando como resultado um string. Seria para o Calc da mesma forma como estamos fazendo no Writer, ou seja, o resultado seria uma string com o valor por extenso dentro de uma célula.

Com isso, não criamos um fork, já que alteramos somente os recursos da interface (menus e teclas de atalho). Também não prejudicamos o salvamento e a troca de documentos entre formatos e versões, já que estamos escrevendo uma string dentro da célula, e não acionando uma função. Para implementarmos, usaríamos uma biblioteca dentro de Macros do BrOffice.org, para que seja minimizado o problema de acesso do usuário ao código fonte da implementação, como é a biblioteca BrO que propus anteriomente.

Indo de acordo com o que você observou, por um critério de usabilidade, deveremos ter tanto a macro no menu Inserir quanto como uma tecla de atalho. Ou seja, como são diversas funções do BrOffice.org: existe uma tecla de atalho ou ícone de barra, com a funçào praticamente definida com um padrão de uso, e o uso opcional através do menu que, invariavelmente, apresenta opções que flexibilizam o resultado.

Nesse momento, devido a proximidade do lançamento da versão 2.0.3, proponho que façamos a implementação da função somente através das teclas de atalho e do diálogo, sem ícones. Ícones e outras implementações podemos fazer nas próximas versões.

Em relação a questão do tratamento de erro, das mudanças da função e da correção ortográfica, concordo com todas as observações. Em relação a questão da correção ortográfica, poderíamos, imediatamente, ter mais uma opção no diálogo da função, algo como "Primeiras letras em maiúsculas".

O que tu achas deste encaminhamento?

28-06-2006 22:37:37 changed by gbpacheco

  • owner changed from filhocf to gbpacheco, noelson.
  • status changed from assigned to new.

01-07-2006 11:28:42 changed by noelson

noelson -> gbpacheco, algumas sugestões:

P/ Writer:


1) oferecer a ferramenta, mas, por enquanto, sem alterar a GUI. O usuário decide onde e como instalar. Se decidir alterar a GUI, sugiro uma opção de menu em ferramentas com um sub-menu para as funções locais (Ex: Ferramentas :: Projeto BrOfice?.org :: <submenu> contendo Valor por Extenso). Assim, à medida que formos implementando mais funções teremos um lugar específico;

2) desenhar e distribuir os ícones da ferramenta, sem instalar;

3) transformar o teu documento numa especificação, com informações sobre a instalação e oferecer aos usuários.

P/ Calc:

1) na próxima atualização teremos no mínimo um add-in. Assim, creio que a melhor alternativa é instalar na biblioteca Standard do usuário. A solução inserir uma string na célula não me agrada (ao implementarmos a função definitiva teremos que eliminá-la). Se a instalação não for possível, podemos oferecer ambas as funções (sw/sc), para o usuário baixar e instalar. A integração fica para a próxima atualização.

Fiz algumas alterações no código de Extenso_Writer():

1) aumentar a facilidade de uso, validação básica (se quiser, podemos usar as duas abordagens);

2) nextenso() recebendo uma string;

Existe algum consenso para a ortografia (usar ou não vírgulas) ? Acho a opção capitalizar desnecessária, o melhor é tudo em minúsculas.

03-07-2006 18:49:08 changed by noelson

  • attachment broo_sw_valor_extenso.odt added.

alterações em extenso_writer e nextenso

03-07-2006 18:53:45 changed by noelson

noelson -> gbpacheco

Segue arquivo com alterações nas funções. Se possível, teste antes da reunião.

05-07-2006 18:49:09 changed by anonymous

  • owner changed from gbpacheco, noelson to anonymous.
  • status changed from new to assigned.
  • version changed from 2.0.3 to 2.0.4.

05-07-2006 18:57:19 changed by anonymous

  • owner changed from anonymous to gbpacheco, noelson.
  • status changed from assigned to new.

10-07-2006 00:33:16 changed by noelson

Segue a primeira versão de teste do suplemento.

Expandir o arquivo e ler as instruções.

A verificar:

- Interface gráfica (entrada de menu e barra de ferramenta)

- Correção do funcionamento (nas mais diversas situações)

- Correção gramatical

Testes básicos foram feitos no XP + BrOo? 2.0.1, portanto devemos testar na nova versão, sob os mais variados ambientes.

A partir de agora, sugiro trabalharmos apenas com os arquivos de broo_extenso_1b.zip.

Após testes e correções, podemos informar o andamento na hp do prj.

10-07-2006 00:35:33 changed by noelson

  • attachment broo_extenso_1b.zip added.

versão inicial do suplemento e funcao p/ Calc

12-07-2006 22:15:22 changed by noelson

  • attachment broo_extenso_1b1.zip added.

pequenas correções no suplemento

17-02-2008 13:27:52 changed by gbpacheco

  • keywords changed from Função Extenso Calc to Função Extenso Calc Writer Extensão.
  • status changed from new to closed.
  • resolution set to fixed.

Correção do menu do suplemento e do título do diálogo chamado pela função via menu ou ícone. Já publicada em http://www.broffice.org/macros.