Dicas ABAP / ABAP tips
Os tipos de dados influenciam no comportamento das variáveis, podendo gerar um erro (Dump) que não tinha sido previsto anteriormente no desenvolvimento e nos testes. Por algumas vezes me deparei com essas situações, especialmente quando precisava calcular valores, alguns com casas decimais, outros não, estouro no tamanho da variável decimal, etc. Alguns nomes dos erros que me deparei até então são: COMPUTE_BCD_OVERFLOW, CONVT_OVERFLOW, CONVT_NO_NUMBER.
Analisando as soluções que identifiquei e algumas propostas de alguns colegas, acredito que a mais correta seria declarar a variável como tipo float (TYPE f), não correndo risco dos valores estourarem o tamanho da variável decimal ou mesmo o valor perder sua integridade. Mas como fazer pra mostrar o valor da variável float em uma mensagem, por exemplo?
Para executar esta conversão, desenvolvi uma função que formata o valor da variável Float para decimal e String, podendo ser definido o tipo de formatação e símbolo monetário desejádo (R$, $, etc):
No exemplo abaixo vou utilizar os elementos de dados WKURS (máximo de 9 posições com até 5 casas decimais) e BPREI (máximo 11 posições com até 2 casas decimais), onde a variável l_netpr estará preenchida completamente, não podendo ocorrer a adição de mais nenhuma casa decimal. No caso, estou forçando um possível estouro da variável, que não ocorrerá pelo fato de estar usando um tipo de variável float para receber o valor, fazendo utilização da função para conversão em decimal e String para a utilização do programador. A variável decimal receptora tem que ser do tipo LONG_CURR (30 posições, sendo duas posições decimais).
Vamos ao exemplo:
The data types influences the variables' behavior, which can raise an error (dump) that had not been foreseen earlier during development process and testing. For a few times I came across these situations, especially when needed to calculate values, some with decimal places, some others not, the overflow of the decimal variable, etc.. Some names of the errors I encountered so far are: COMPUTE_BCD_OVERFLOW, CONVT_OVERFLOW, CONVT_NO_NUMBER.
Analyzing the solutions I identified and some proposals of some colleagues, I believe the best option would be to declare the variable as a float type (TYPE f) having no risk of overflow the decimal variables value or even lose their integrity. But how to show the value of the float variable in a message, for example?
To convert this, I developed a function to format the variable value from Float to Decimal and String types, turning it possible to define the format type and the currency symbol you want (R$, $, etc):
In the following example I used the data elements WKURS (maximum of 9 positions to 5 decimal places) and BPREI (up to 11 positions with 2 decimals), where the variable L_NETPR will be completely filled and may not occur any more addition of decimal places. Here I am forcing a possible variable overflow, which will not happen because I'm using a float type variable to receive the value, making use of the function to convert it in decimal and String so the developer can use it. The decimal variable that receives the value must be type LONG_CURR (length of 30 positions, having two decimals positions).
Here comes the example:
Nenhum comentário:
Postar um comentário