Skip to main content

pysage50e

Libreria Python para conectar con bases de datos de Sage 50 (SQL Server), construir consultas por ejercicio y transformar resultados de forma sencilla.

Esta version expone como API principal la clase apiSAGE50.

Que hace el codigo

  • Carga y mantiene configuracion de conexion en config.ini.
  • Lee datos del entorno Sage50 (terminal, cfgclisrv.xml, comunes, empresa, ejercicios).
  • Conecta a SQL Server con autenticacion SQL o Windows (con fallback).
  • Genera consultas multi-ejercicio con placeholders de Sage (#, COMUNES!, etc.).
  • Ejecuta SQL y devuelve resultados en varios formatos:
    • diccionario indexado (sql_to_dict)
    • lista (sql_to_list)
    • objeto tipo namespace (sql_to_namespace)
  • Incluye logging y excepciones especificas de dominio (Sage50Error, Sage50ConnectionError, etc.).
  • Incluye UI con PySimpleGUI para asistentes de configuracion cuando faltan datos.

Instalacion

Con pip:

pip install pysage50e

Con uv:

uv pip install pysage50e

Requisitos

  • Windows
  • Python 3.10 a 3.14
  • Instalacion de Sage50 operativa
  • SQL Server accesible desde el equipo
  • Driver ODBC configurado por Sage (cfgclisrv.xml)

Dependencias runtime del paquete:

  • pyodbc>=5.0.0
  • sqlparse>=0.4.0
  • pysimplegui-4-foss>=4.60.4

Nota de distribucion binaria:

  • Este paquete se distribuye en wheels binarios (.pyd) por version de Python.
  • Para cubrir 3.10, 3.11, 3.12, 3.13 y 3.14 hay que generar/publicar un wheel por cada version.

Uso rapido

from pysage50e import apiSAGE50

api = apiSAGE50()

if not api.lconecto:
    print(f"Error de conexion: {api.lasterror}")
else:
    print(f"Comunes: {api.comunes}")
    print(f"Empresa: {api.NomEmpresa}")
    print(f"Ejercicio actual: {api.tbyear[-1]}")

Consultas SQL

1) Consulta simple con build_query

from pysage50e import apiSAGE50

api = apiSAGE50()
sql = api.build_query("SELECT TOP 10 CODIGO, NOMBRE FROM #articulo")
datos = api.sql_to_list(sql)
print(datos)

2) Resultado como diccionario indexado

sql = api.build_query("SELECT CODIGO, NOMBRE FROM #cliente")
clientes = api.sql_to_dict(sql, key_field="CODIGO")
print(clientes.get("00001"))

3) Resultado como objeto (namespace)

sql = api.build_query("SELECT TOP 1 CODIGO, NOMBRE FROM #cliente")
cli = api.sql_to_namespace(sql)
print(cli.CODIGO, cli.NOMBRE)

Especificación de ejercicios (years)

El query builder soporta selección por ejercicios con SAGE50year:

  • "*" o "@": Todos los ejercicios disponibles
  • "+": Último ejercicio
  • "+2023": Ejercicios desde 2023 en adelante
  • "-": Primer ejercicio
  • "-2022": Ejercicios hasta 2022
  • [2021, 2022, 2023]: Lista explícita de Python (int, str o mixto)
  • "2024" o 2024: Ejercicio único (funciona con string o entero)

⚠️ Nota sobre años de cierre: Los ejercicios de cierre (identificados con XQ, ej: 2026XQ) se filtran automáticamente. Esto evita errores al consultar tablas vacías o inexistentes. Si necesitas acceder a un año de cierre específico, usa la sintaxis de lista: [2026, 2025].

Ejemplos de uso

# Todos los ejercicios
aprocesar = api.SAGE50year("*")
# Resultado: ['2020EJ', '2021EJ', '2022EJ', '2023EJ', '2024EJ']

# Último ejercicio
aprocesar = api.SAGE50year("+")
# Resultado: '2024EJ'

# Desde 2023 en adelante
aprocesar = api.SAGE50year("+2023")
# Resultado: ['2023EJ', '2024EJ']

# Primer ejercicio
aprocesar = api.SAGE50year("-")
# Resultado: '2020EJ'

# Hasta 2022
aprocesar = api.SAGE50year("-2022")
# Resultado: ['2020EJ', '2021EJ', '2022EJ']

# Lista explícita (int, str o mixto)
aprocesar = api.SAGE50year([2021, "2022", 2023])
# Resultado: ['2021EJ', '2022EJ', '2023EJ']

# Ejercicio único (string o int)
aprocesar = api.SAGE50year("2024")
# Resultado: '2024EJ'

aprocesar = api.SAGE50year(2024)
# Resultado: '2024EJ'

# Uso en query
sql = api.build_query("SELECT * FROM #facturas", aprocesar)
rows = api.sql_to_list(sql)

Recargar comunes/empresa

Puedes recargar el contexto activo:

api.recargar(codcomun="COMU0001", codempre="01")

Logging y errores

El paquete exporta utilidades de logging y excepciones:

from pysage50e import (
    log_info,
    log_warning,
    Sage50Error,
    Sage50ConnectionError,
)

try:
    api = apiSAGE50()
except Sage50ConnectionError as e:
    log_warning(str(e), context="conexion")
except Sage50Error as e:
    log_warning(str(e), context="general")

Configuracion

La libreria usa config.ini para persistir configuracion local. Si faltan datos (terminal, servidor, autenticacion), puede abrir asistentes GUI para completarlos.

API publica principal

  • apiSAGE50

Soporte

  • Email: pysage50e@pablomalo.es

Licencia

Ver archivo LICENSE.

Metadata

Release files for pysage50e 0.1.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for pysage50e 0.1.5
File
pysage50e-0.1.5-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details
pysage50e-0.1.5-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
pysage50e-0.1.5-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
pysage50e-0.1.5-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
pysage50e-0.1.5-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details

Total release size: 3.0 MB

Release files / pysage50e-0.1.5-cp314-cp314-win_amd64.whl

Download URL pysage50e-0.1.5-cp314-cp314-win_amd64.whl
Size 601.2 kB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
e73bac617bf33416102a17a44a64730beb68fa941caa3b1015438fb95b06d805
BLAKE2b-256 checksum
How to use checksums
be7dca1bd1f9a7efa64a7312b073d044019786dc7e37eaa8e4d3ae723238a1dd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.10.11 {"installer":{"name":"uv","version":"0.10.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / pysage50e-0.1.5-cp313-cp313-win_amd64.whl

Download URL pysage50e-0.1.5-cp313-cp313-win_amd64.whl
Size 588.8 kB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
a9732313dd52f8c4185fb4d14e2dd6acf8655ee98f70a34822638d45add44a99
BLAKE2b-256 checksum
How to use checksums
ca406100a7208f933c4915bc7727474d9f7abc99e6db619ae9527a69f5823645
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.10.11 {"installer":{"name":"uv","version":"0.10.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / pysage50e-0.1.5-cp312-cp312-win_amd64.whl

Download URL pysage50e-0.1.5-cp312-cp312-win_amd64.whl
Size 591.5 kB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
9b9b02002847618e7beb11fcfd3433a67c562c5acbbc27a495cb10c5a663eb48
BLAKE2b-256 checksum
How to use checksums
8fe5c81564ecd294674a0aefd50b5eba00e5cb317299340ca8085504c63515f7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.10.11 {"installer":{"name":"uv","version":"0.10.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / pysage50e-0.1.5-cp311-cp311-win_amd64.whl

Download URL pysage50e-0.1.5-cp311-cp311-win_amd64.whl
Size 607.4 kB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
989aebeec8a9ef9dbdd32d99586085631ce6d9e58d5c3c6c252845a6da3cc054
BLAKE2b-256 checksum
How to use checksums
5d890cb71699ffb72fbc7f867d46bfa058d4ef9118f5ff9f4c6f66db7ef9e132
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.10.11 {"installer":{"name":"uv","version":"0.10.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / pysage50e-0.1.5-cp310-cp310-win_amd64.whl

Download URL pysage50e-0.1.5-cp310-cp310-win_amd64.whl
Size 604.7 kB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
9cf5ecca0af15b09b0ab8e4559ea69533e2a0ed8f165e482d4b834d9e0f66873
BLAKE2b-256 checksum
How to use checksums
77e7d9908568b04bc4fad2d46b0a48568b4809920fd98cb7030de5106159461d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.10.11 {"installer":{"name":"uv","version":"0.10.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

This release

0.1.5 This release

5 release files

0.1.4

5 release files

0.1.3

5 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page