File:Facturas - pruebas (funciona).odt
Facturas_-_pruebas_(funciona).odt (file size: 15 KB, MIME type: application/vnd.oasis.opendocument.text)
Warning: This file type may contain malicious code. By executing it, your system may be compromised.
Descripción
Macros with LibreOffice Writer
Como usar los campos de usuario para calcular fórmulas complejas en tablas dentro de Writer. Después de investigar mucho no he localizado información al respecto, motivo por el cuál escribo este pequeño tutorial que espero ayude a mucha gente que como yo, le gusta programar, trata de hacerse pequeñas herramientas pero no es un experto, y quizas le resulte muy confuso y tedisoso lidiar con la ayuda de las apis.
El objetivo de este fichero es muy sencillo: Crear una factura que haga los cálculos de forma automática para no "meter la pata" al transcribir datos y hacer los cálculos. De tal forma los datos a introducir son mínimos:
Valor a facturar (como valor) Valor del IVA vigente (como porcentaje)(Este valor se conserva entre facturas) Valor de la retención del IRPF (como porcentaje) (Este valor se conserva entre facturas) Valor de otros gastos suplidos a incluir en el cobro (como valor)
Presionando un boton, una macro realiza los cálculos y los redondeos, asignando los valores en la tabla de fórma automática y reduciendo la posibilidad de errores a la hora de crear la factura.
El problema al que me he enfrentado es que no he conseguido localizar información sobre cómo manejar los campos (de entrada de variables, denominados internamente como "SetExpression", y los de ususario, denominados internamente como "User", que son los únicos en los que podemos volcar información a posteriori una vez realizados los cálculos. Por lo menos yo no he conseguido hacerlo en los otros tipos de campos).
Una vez localizas cómo hay que obtener los datos de la compleja estructura del api y cómo se vuelven a actualiar una vez realizados los cálculos como funciones dentro del Basic, el único misterio es saber cómo definimos la entrada de datos en nuestro formulario (tabla protegida). Los campos en los que introducimos datos hay que declararlos (en el fichero que hacemos en Writer, dentro de "Insertar Campos") como "Campo de entrada" (habiendo definido primero la variable en "Establecer Variable"). Los campos en los que queremos "volcar" los calculos que hemos realizado, hay que declaralos como "Campos de usuario". Los nombres de los campos deben corresponderse concienzudamente con los que declaremos en el Basic.
Estoy tratando de vincular un "ejemplo" de esto. https://wiki.documentfoundation.org/File:Facturas_-_pruebas_(funciona).odt
El fichero BASIC tiene lo siguiente: REM ***** BASIC ***** rem CAMPOS DE ESTABLECER VARIABLE rem factura_base rem factura_iva_porcentaje rem retencion_porcentaje rem otros_valor REM ("com.sun.star.text.fieldmaster.User.factura_base")
REM CAMPOS DE USUARIO rem factura_iva_valor rem factura_total rem retencion_valor rem liquido_percibir
OPTION EXPLICIT
REM DECLARACIONES DIM sfactura_base as string DIM sfactura_iva_porcentaje as string DIM sretencion_porcentaje as string DIM sotros_valor as string
DIM sfactura_iva_valor as string DIM sfactura_total as string DIM sretencion_valor as string DIM sliquido_percibir as string
REM ########################################## Sub calcular DIM dfactura_base as double DIM dfactura_iva_porcentaje as double DIM dretencion_porcentaje as double DIM dotros_valor as double
DIM dfactura_iva_valor as double DIM dfactura_total as double DIM dretencion_valor as double DIM dliquido_percibir as double
DIM oDoc as Object Dim oCampo as Object Dim vValor as Variant
REM ASIGNACION VALORES FIJOS sfactura_base = "com.sun.star.text.fieldmaster.SetExpression."&"factura_base" sfactura_iva_porcentaje = "com.sun.star.text.fieldmaster.SetExpression."&"factura_iva_porcentaje" sretencion_porcentaje = "com.sun.star.text.fieldmaster.SetExpression."&"retencion_porcentaje" sotros_valor = "com.sun.star.text.fieldmaster.SetExpression."&"otros_valor"
sfactura_iva_valor = "com.sun.star.text.fieldmaster.User."&"factura_iva_valor" sfactura_total = "com.sun.star.text.fieldmaster.User."&"factura_total" sretencion_valor = "com.sun.star.text.fieldmaster.User."&"retencion_valor" sliquido_percibir = "com.sun.star.text.fieldmaster.User."&"liquido_percibir"
dfactura_base = ThisComponent.TextFieldMasters.getByName(sfactura_base).DependentTextFields(0).getPropertyValue ("Value") dfactura_iva_porcentaje = ThisComponent.TextFieldMasters.getByName(sfactura_iva_porcentaje).DependentTextFields(0).getPropertyValue ("Value") dretencion_porcentaje = ThisComponent.TextFieldMasters.getByName(sretencion_porcentaje).DependentTextFields(0).getPropertyValue ("Value") dotros_valor = ThisComponent.TextFieldMasters.getByName(sotros_valor).DependentTextFields(0).getPropertyValue ("Value")
REM Calculos dfactura_iva_valor = fix (100 * dfactura_base * dfactura_iva_porcentaje) / 100 dfactura_total = dfactura_base + dfactura_iva_valor dretencion_valor = fix (100 * dfactura_base * dretencion_porcentaje) / 100 dliquido_percibir = dfactura_total + dretencion_valor + dotros_valor
REM actualizar los campos del formulario ThisComponent.TextFieldMasters.getByName(sfactura_iva_valor).setPropertyValue ("Value", dfactura_iva_valor) ThisComponent.TextFieldMasters.getByName(sfactura_total).setPropertyValue ("Value", dfactura_total) ThisComponent.TextFieldMasters.getByName(sretencion_valor).setPropertyValue ("Value", dretencion_valor) ThisComponent.TextFieldMasters.getByName(sliquido_percibir).setPropertyValue ("Value", dliquido_percibir)
End Sub
Copyright status:
Licensing
Source:
File history
Click on a date/time to view the file as it appeared at that time.
Date/Time | Dimensions | User | Comment | |
---|---|---|---|---|
current | 19:51, 19 October 2016 | (15 KB) | IvanMM (talk | contribs) | Macros with LibreOffice Writer |
You cannot overwrite this file.
File usage
There are no pages that use this file.