Questo pacchetto fornisce diversi strumenti per semplificare lo sviluppo di automazioni in Python per l'applicativo gestionale "Danea Easyfatt".
- Lettura file
.DefXml
esportati da Easyfatt (ordini cliente, vendite banco, preventivi, ecc..) - Download driver firebird (necessario per la connessione al DB di Easyfatt)
- Connessione al database di Easyfatt
Il modulo easyfatt_db_connector.xml
espone la classe EasyfattXML
e la funzione read_xml
(una funzione "utility" che restituisce un'istanza di EasyfattXML
).
Sia i metodi EasyfattXML.from_xml*()
che la funzione read_xml()
accettano il parametro convert_types
(di default impostato a True
) che permette di convertire i valori dei tag in tipi Python nativi (es. int
, float
, bool
, ecc..). Se disabilitato i valori dei tag saranno sempre stringhe o None
.
In questo esempio lo script leggerĂ l'esportazione di una serie di ordini cliente e stamperĂ a schermo l'indirizzo di spedizione di ogni documento:
from pathlib import Path
from easyfatt_db_connector.xml import read_xml
xml_file = Path("OrdiniCliente.DefXml").expanduser()
# Questa istruzione...
xml_object = read_xml(xml_file, convert_types=True)
# ... si può scrivere anche così
xml_object = EasyfattXML.from_xml_string(xml_file.read_bytes(), convert_types=True)
for doc in xml_object.documents:
print(f"Document n°{doc.number}{doc.numbering} will be shipped at '{doc.delivery.address}'")
L'output sarĂ il seguente:
Document n°1 will be shipped at ''
Document n°2 will be shipped at ''
Document n°3 will be shipped at ''
Document n°1/A will be shipped at ''
Document n°2/A will be shipped at ''
Document n°4 will be shipped at ''
Document n°5 will be shipped at ''
Document n°6 will be shipped at 'Via Facciolati, 546'
Document n°3/A will be shipped at 'Via Catania, sn'
Document n°7 will be shipped at ''
Document n°8 will be shipped at 'Via Rodolfo Manganaro'
Document n°9 will be shipped at 'Via Enrico Berlinguer,75'
Document n°10 will be shipped at ''
Document n°11 will be shipped at 'Via C. Colombo, 632'
Document n°12 will be shipped at ''
Document n°13 will be shipped at ''
Document n°1/B will be shipped at ''
Document n°14 will be shipped at 'Via G. Di Vittorio, 56'
Document n°15 will be shipped at 'Via Cavour, 152'
Document n°16 will be shipped at 'Via N.S. degli Angeli, 28'
Per connettersi al DB di Easyfatt è necessario scaricare il driver Firebird Firebird-{version}-embed.zip
(versione 2.5.8 o 2.5.9) e specificarne il percorso.
from easyfatt_db_connector.core.connection import EasyfattFDB
database = EasyfattFDB(archive_path=database_path, firebird_path="./firebird-driver")
Questa procedura può essere automatizzata impostando il parametro download_firebird
a True
(di default è False
). E' possibile controllare il percorso di download del driver tramite il parametro firebird_path
(di default ~/.cache/firebird-driver/
).
from easyfatt_db_connector import EasyfattFDB
database = EasyfattFDB(archive_path=database_path, download_firebird=True)
ATTENZIONE
L'opzione
download_firebird
è impostata di default aFalse
per evitare che il programma effettui download in ambienti di Produzione.Se questo è il comportamento desiderato impostare il parametro a
True
.
In fase di connessione al DB l'istanza EasyfattFDB
provvederà a fare una copia del database in una cartella temporanea (ed alla sua eliminazione ad operazioni terminate) così da permettere l'utilizzo anche con Easyfatt in esecuzione.
from easyfatt_db_connector.core.connection import EasyfattFDB
database = EasyfattFDB(archive_path=database_path, download_firebird=True)
with database.connect() as connection:
customers = [dict(item) for item in connection.cursor().execute('''
SELECT anag."CodAnagr", ANAG."Nome", ANAG."Indirizzo", ANAG."Cap", ANAG."Citta", ANAG."Prov", ANAG."Regione", IIF(naz."NomeNazionePrint" IS NULL, 'Italia', naz."NomeNazionePrint") AS Nazione
FROM "TAnagrafica" AS anag
LEFT JOIN "TNazioni" naz ON ANAG."Nazione" = naz."NomeNazione";
''').fetchallmap()]
print(customers)
In fase di build con PyInstaller (sia in modalitĂ --onefile
che --onedir
) è necessario tenere in considerazione le seguenti note:
-
Non usare mai UPX se disponibile (a causa di un bug che porta la DLL
fbclient.dll
a crashare in modo randomico impedendo la connessione al DB). Se possibile includere sempre--noupx
tra gli argomenti di build. - Aggiungere
--collect-all sqlalchemy_firebird
tra gli argomenti di build per evitare che PyInstaller non includa il modulofdb
efirebird-driver
(che non vengono rilevato automaticamente).
poetry config virtualenvs.prefer-active-python true
poetry env use $(pyenv which python)
- Installare Firebird SQL 2.5.9 (selezionare la versione "64-bit Classic, Superclassic & Superserver")
- Assicurarsi di selezionare "Run as service"
Per controllare l'avvenuta installazione:
- Aprire un terminale Powershell nella cartella di installzione (nel mio caso
C:\Program Files\Firebird\Firebird_2_5
) - Lanciare il comando
cd bin
- Lanciare il comando
./isql.exe "{PERCORSO_DATABASE}\{NOME_DATABASE}.eft" -u sysdba -p masterkey
- Ora è possibile eseguire query SQL (assicurandosi che finiscano SEMPRE con
;
)
-
Installare ed aprire DBeaver:
-
Cliccare su "File > Nuovo":
-
Cliccare su "DBeaver > Connessione a Database" e cliccare "Avanti":
-
Nel campo di ricerca scrivere "Firebird", selezionare il primo risultato e cliccare "Avanti":
-
Compilare i dati richiesti:
-
Generale:
- Host:
localhost
(default) - Porta:
3050
(default) - Percorso: adeguare alla posizione del database nel proprio sistema
- Host:
-
Autenticazione:
- Nome utente:
SYSDBA
(default) - Password:
masterkey
- Nome utente:
-
Generale:
-
Terminare la configurazione del driver cliccando su "Fine"