|
il_muflone
|
 |
« inserita: 30 Agosto, 2009, 19:29:36 » |
|
Ciao a tutti questa volta mi butto su un progetto` un po' piu` complesso ma e` una grave carenza attualmente esistente nel mondo Linux. OpenOffice.org Base su Windows consente la connessione a files MDB Access, la versione per Linux invece non provvede questa possibilita`, non e` mai stata implementata. Il plugin sdbc-mdb e` stato abbandonato alla versione 1.x di OpenOffice e non e` compatibile con le versioni moderne. Il supporto ODBC attraverso unixodbc non funziona, insomma siamo ad un punto morto, apparentemente invalicabile. Ci sono migliaia di persone al mondo che chiedono una cosa simile e ad oggi nessuna soluzione che non implichi avviare OO.o da Windows.  Il progetto sara` sviluppare un'interfaccia grafica che consenta l'apertura dei files mdb e l'esportazione dei dati su OpenOffice, preferibilmente in un database, se non dovesser esser possibile, in un foglio di calcolo. Naturalmente per gli mdb non sara` reinventata la ruota, c'e` il preziosissimo lavoro di mdbtools discretamente funzionante. Inoltre data la documentazione scadente, qualcuno ha esperienza su python-uno? Cerco anche collaboratori per colmare questa grave lacuna nel parco software, avendo appena approcciato python-uno non son certo dei suoi limiti fissati, spero di poter superare questo brutto scoglio. Qualcuno e` interessato ad un progetto simile? EDIT: l'ultima versione scaricabile si trova quiSorgente e pacchetti di tutte le versioni sono disponibili qui.
|
|
|
|
« Ultima modifica: 08 Ottobre, 2009, 01:23:20 da il_muflone »
|
Registrato
|
|
|
|
Alkatron
Coraggioso Chiacchierone
Non Connesso
Messaggi: 814
Media messaggi
|
 |
« Risposta #1 inserita: 31 Agosto, 2009, 12:10:13 » |
|
Mi sembra un ottima idea, io sono uno di quelli che apre una macchina virtuale per lavorare su access.
Ho una buona esperienza sulla programmazione e sui database, e su access in particolare (ho molti lavori basati su di lui purtroppo) e una rudimentale conoscenza di python.
Se ti posso aiutare in qualunque modo saro felicissimo di farlo.
Ciao
|
|
|
|
|
Registrato
|
|
|
|
|
il_muflone
|
 |
« Risposta #2 inserita: 31 Agosto, 2009, 13:25:43 » |
|
ciao Alkatron
ieri ho effettuato qualche esperimento rudimentale e credo che sia fattibile la cosa. la connessione al database di openoffice funziona, la lettura dati pure, la lettura dei campi di un database esistente
la logica quasi sicuramente verrà strutturata così: 1- ciclo principale per tutte le tabelle scelte dall'utente 2- con mdbtools analisi di una tabella per estrarre le informazioni sui tipi di dato 3- esportazione della tabella in csv (o altro formato se mdbtools consente) 4- rigenerazione della tabella su openoffice via python-uno 5- alimentazione della tabella. questo può esser fatto in due maniere: con le text tables di hsqldb supportato tranquillamente da Oo oppure scorrendo le righe del csv e reimportandole nella tabella dell'odb
gli ostacoli attualmente sono python-uno che io non conosco e la scarsa documentazione di openoffice scritta esclusivamente per java di python per ora c'è molto poco, la parte sostanziale sarà la lettura del file csv, che oggi non ho ben chiaro come dovrà esser fatta, se hai qualche idea ci terrei a conoscerla
grazie e ciao
|
|
|
|
« Ultima modifica: 31 Agosto, 2009, 13:27:25 da il_muflone »
|
Registrato
|
|
|
|
|
|
Alkatron
Coraggioso Chiacchierone
Non Connesso
Messaggi: 814
Media messaggi
|
 |
« Risposta #4 inserita: 01 Settembre, 2009, 11:35:48 » |
|
la logica quasi sicuramente verrà strutturata così: 1- ciclo principale per tutte le tabelle scelte dall'utente 2- con mdbtools analisi di una tabella per estrarre le informazioni sui tipi di dato 3- esportazione della tabella in csv (o altro formato se mdbtools consente) 4- rigenerazione della tabella su openoffice via python-uno 5- alimentazione della tabella. questo può esser fatto in due maniere: con le text tables di hsqldb supportato tranquillamente da Oo oppure scorrendo le righe del csv e reimportandole nella tabella dell'odb
Ho fatto un po di prove rifacendomi ai tuoi 5 punti 1 con mdb-tables si possono esportare i nomi delle tabelle da presentare all'utente per la scelta 2 con mdb-schema si puo estrarre una query sql di tipo ddl con la quale con poche modifiche si ricrea la tabella in openoffice lanciandola (punto 4) 3 con mdb-export si estrae ogni tabella in formato csv 5 Giustamente come hai notato tu il problema sta qui, googolando un po ho visto che non è possibile farlo direttamente, il massimo disponibile sembra essere il passare prima per calc e poi un "copia e incolla". La cosa migliore secondo me e quella di scorrere il file csv e aggiungere una riga per volta, cosi si mantiene anche il controllo completo sul dato, faccio macro continuamente in access per importare files dalle + disparate sorgenti, il problema ora, almeno per me, è capire le funzioni e le procedure per farlo in python, ma se python permette di lanciare una query su OO il resto del problema e facilmente risolvibile.... Mi cimento e ti faccio sapere
|
|
|
|
|
Registrato
|
|
|
|
|
il_muflone
|
 |
« Risposta #5 inserita: 01 Settembre, 2009, 11:43:39 » |
|
ho effettuato anche un test di copia e incolla (nascosto) ma le prestazioni sono davvero umilianti, meglio lasciar perdere l'idea e proseguire sui dati semplici, almeno non si freeza tutto in attese indefinite io sto lavorando al lato python-uno, sto cercando di capire come creare una tabella. la scrittura su una tabella preesistente funziona poi dopo mi manca la creazione di un nuovo db e un qualche sistema di mapping tra i tipi di dato di access e quelli di openoffice. L'importazione del csv manualmente lascia all'utente l'onere di definire i tipi di campo, sto cercando di evitarlo. se ti cimenti nel csv, non rifare la procedura da zero, c'è il modulo csv nativo di python che aiuta nella lettura  ciao
|
|
|
|
|
Registrato
|
|
|
|
Alkatron
Coraggioso Chiacchierone
Non Connesso
Messaggi: 814
Media messaggi
|
 |
« Risposta #6 inserita: 01 Settembre, 2009, 11:54:40 » |
|
io sto lavorando al lato python-uno, sto cercando di capire come creare una tabella.
se provi a estrarre una query ddl con mdb-schema vedrai che basta lanciarla in oo e ti ricrea la tabella con le stesse definizioni, c'è solo da modificare un po la stringa prima di lanciarla come query, e quello non è un problema dato che si basa su definizioni standard e non è necessario l'intervento dell'utente la scrittura su una tabella preesistente funziona
e vai  poi dopo mi manca la creazione di un nuovo db e un qualche sistema di mapping tra i tipi di dato di access e quelli di openoffice.
non ho capito spiegati meglio, che intendi? L'importazione del csv manualmente lascia all'utente l'onere di definire i tipi di campo, sto cercando di evitarlo.
L'utente al massimo dovra solo scegliere da quale file importare, il resto, a occhio, è abbastanza semplice, avendo a disposizione sia la tabella gia creata che le definizioni dei campi (dalla query ddl) Ed è questo quello su cui mi sto cimentando, una volta capito un po meglio le routine e le funzioni necessarie in python non credo di avere grossi problemi Il mio dubbio, dovuto anche alla scarsa esperienza di programmazione in ambiente linux, è se conviene fare una routine esterna o una supermacro interna a oo....tu che dici? ciao
|
|
|
|
« Ultima modifica: 01 Settembre, 2009, 11:59:42 da Alkatron »
|
Registrato
|
|
|
|
|
il_muflone
|
 |
« Risposta #7 inserita: 01 Settembre, 2009, 13:51:18 » |
|
io sto lavorando al lato python-uno, sto cercando di capire come creare una tabella.
se provi a estrarre una query ddl con mdb-schema vedrai che basta lanciarla in oo e ti ricrea la tabella con le stesse definizioni ottimo, non avevo ancora provato mdb-schema poi dopo mi manca la creazione di un nuovo db e un qualche sistema di mapping tra i tipi di dato di access e quelli di openoffice.
non ho capito spiegati meglio, che intendi? devo vedere come creare da zero il file odb, se non riesco se ne crea un vuoto all'inizio e poi lo si duplica. alcuni tipi di campo non esistono su hsql, ad esempio il TEXT, non è un problema, ma va fatta l'associazione tra il formato di access e quello oo Ed è questo quello su cui mi sto cimentando, una volta capito un po meglio le routine e le funzioni necessarie in python non credo di avere grossi problemi su python non dovrebbero esserci problemi con quel modulo csv che si occupa da solo di dividere le righe in campi, senza doversi trovare le posizioni delle virgole, anche se ci sono stringhe in mezzo. Il mio dubbio, dovuto anche alla scarsa esperienza di programmazione in ambiente linux, è se conviene fare una routine esterna o una supermacro interna a oo....tu che dici? entrando più nel dettaglio, il csv fornisce un metodo iteratore, ottimo anche per tabelle di grosse dimensioni, senza precaricare i dati in memoria. ricordando che bisogna mettere assieme analisi delle tabelle, gui ed esportazione è strettamente necessario separare le tre questioni. più in particolare, faremo un metodo ad esempio def listTables(filename): proc = subprocess.Popen(['mdb-tables', '-t', 'table', '-1', filename], stdout=subprocess.PIPE) return proc.communicate()[0].split('\n') Questo primo metodo richiama mdb-tables e riporta su ciascuna riga una tabella, restituendo una lista di tabelle quindi, anche se ci sono spazi in mezzo non importa. Dalla gui si ciclerà l'elenco e si proporranno le tabelle in fase di esportazione servirà una prima funzione che generi lo schema di una singola tabella, lo si fa alla stessa maniera con subprocess.Popen ma richiamando mdb-schema. il risultato andrà trattato con una funzione che effettui le dovute conversioni dei campi che quindi sarà passata via python-uno a Oo per la ricreazione della singola tabella. per i dati ci metteremo d'accordo, basta una funzione di poche righe che sfrutti l'iteratore fornito dal modulo csv, ci sono esempi qui http://docs.python.org/library/csv.htmlfor row in reader: values = [] for field in row: values.append(field) scrittura con pyuno(values) il resto andrà infarcito della gui e dell'avanzamento, non mi pare serva altro. ciao
|
|
|
|
« Ultima modifica: 01 Settembre, 2009, 14:01:30 da il_muflone »
|
Registrato
|
|
|
|
Alkatron
Coraggioso Chiacchierone
Non Connesso
Messaggi: 814
Media messaggi
|
 |
« Risposta #8 inserita: 05 Settembre, 2009, 16:15:42 » |
|
Sai dove posso trovare della documentazione sugli oggetti di openoffice utilizzabili, tipo lista delle proprieta dei metodi ecc.
|
|
|
|
|
Registrato
|
|
|
|
|
|
|
il_muflone
|
 |
« Risposta #10 inserita: 06 Settembre, 2009, 18:29:56 » |
|
lettura del csv e scrittura nella tabella eseguito  e` anche accettabilmente rapido una tabella di 2300 records per 50 campi richiede 50 secondi per l'incameramento
|
|
|
|
|
Registrato
|
|
|
|
Alkatron
Coraggioso Chiacchierone
Non Connesso
Messaggi: 814
Media messaggi
|
 |
« Risposta #11 inserita: 07 Settembre, 2009, 09:58:19 » |
|
io sono riuscito a
- Creare il file odb - Creare la tabella all'interno del file - Caricarla
usando jaunty, oo 3.1, python 2.6.1 (quello di oo), sono diversi da quelli che ti avevo detto in precedenza in quanto alla fine stremato dai problemi di configurazione, mi sono creato una vm e ci ho installato tutto nuovo. Essendo al prime armi con python il codice è molto rozzo....pero funziona.
|
|
|
|
|
Registrato
|
|
|
|
|
il_muflone
|
 |
« Risposta #12 inserita: 07 Settembre, 2009, 13:18:43 » |
|
mi passi quello che hai realizzato?
|
|
|
|
|
Registrato
|
|
|
|
Alkatron
Coraggioso Chiacchierone
Non Connesso
Messaggi: 814
Media messaggi
|
 |
« Risposta #13 inserita: 07 Settembre, 2009, 20:46:30 » |
|
Eccolo, spero sia comprensibile.....e anche utile... :-)
Intanto pensavo di proseguire sulla creazione della tabella, corrispondenze dei tipi, ciclo per varie tabelle, come input considero un array di nomitabella in formato testo, e il relativo file tirato fuori da mdb.schema con lo stesso nome.
Se pensi sia meglio faccia altro fammi sapere
|
|
|
|
« Ultima modifica: 07 Settembre, 2009, 20:50:19 da Alkatron »
|
Registrato
|
|
|
|
|
il_muflone
|
 |
« Risposta #14 inserita: 07 Settembre, 2009, 21:03:14 » |
|
di buono e` buono ma ci siamo sovrapposti  tutta quella parte l'ho fatta pure io, mi mancava solo la creazione del file odb  il backend e` tutto finito: lettura delle tabelle, dello schema, rigenerazione della tabella con sostituzione dei tipi di campo (single, double, memo e text), lettura del csv e importazione sulla tabella sto lavorando all'interfaccia grafica che riceve l'elenco delle tabelle, per ora e` abbastanza scarna
|
|
|
|
|
Registrato
|
|
|
|
Alkatron
Coraggioso Chiacchierone
Non Connesso
Messaggi: 814
Media messaggi
|
 |
« Risposta #15 inserita: 07 Settembre, 2009, 21:12:21 » |
|
Ammazza che scheggia  Rimandami i tuoi sorgenti cosi me li studio, e imparo dalla tua esperienza :-)
|
|
|
|
|
Registrato
|
|
|
|
|
il_muflone
|
 |
« Risposta #16 inserita: 07 Settembre, 2009, 23:49:38 » |
|
allora.. ho apportato un paio di modifiche, allo stato attuale:
a) avvia openoffice con l'accept, la routine va rivista, mi sa che la tua e` migliore b) legge l'mdb ed elenca le tabelle b) ti fa scegliere quelle da esportare c) per ogni tabella scelta rigenera lo schema ottenuto da getSchema. nella generazione dello schema aggiunge un campo mdb2odb_id usato come chiave primaria. senza PK non si possono inserire righe nelle tabelle d) esporta la tabella in csv sul file /tmp/mdb2odb.csv (da rivedere) e) reimporta le righe dal csv. sul campo mdb2odb_id inserisce il numero di riga f) elimina il campo chiave primaria mdb2odb_id
cosa manca? a) ora punta a un db registrato chiamato articoli, devo presentare una maschera di scelta tra i db esistenti (vedi UnoBase.listDB) e con la possibilita` di crearne uno nuovo. b) rivedere l'interfaccia grafica, lo sto gia` facendo. alcune parti sono di un altro mio programma c) testare tutti i tipi di campo esistenti, ho fatto le prove con alcuni miei mdb e quelli su fieldTypeMap sono i tipi che finora ho riscontrato da sostituire d) vedere se si puo` fare a meno della PK ma temo di no, non lo consente nemmeno da interfaccia e) velocizzare un po' dove possibile
intanto allego. per provarlo ricordati di registrare su base un db col nome articoli ho fatto la prova con un db di 5 MB di una decina di migliaia di righe e impiega 4 minuti forse togliendo i vari byName e sostituendoli con un dizionario statico precaricato si puo` migliorare. discorso simile anche il file csv, precaricato in memoria
se hai notizie fammi sapere
|
|
|
|
|
Registrato
|
|
|
|
Alkatron
Coraggioso Chiacchierone
Non Connesso
Messaggi: 814
Media messaggi
|
 |
« Risposta #17 inserita: 08 Settembre, 2009, 13:46:18 » |
|
mi da un errore su unobase.py sull'istruzione from com.sun.star,sdb.CommandType import TABLE
ImportError: type com.sun.star,sdb.CommandType.TABLE is unknown
non riesco a capire xke, tu hai qualche idea di cosa devo controllare..... P.S. gli altri from...import non sembrano dare problemi
|
|
|
|
« Ultima modifica: 08 Settembre, 2009, 13:48:50 da Alkatron »
|
Registrato
|
|
|
|
|
il_muflone
|
 |
« Risposta #18 inserita: 08 Settembre, 2009, 13:54:53 » |
|
ho provato anche su un'altra macchina e non riporta errori hai installato openoffice.org-java-common ?
posta qui il traceback completo naturalmente stai eseguendo il file mdb2odb.py?
|
|
|
|
« Ultima modifica: 08 Settembre, 2009, 13:57:01 da il_muflone »
|
Registrato
|
|
|
|
Alkatron
Coraggioso Chiacchierone
Non Connesso
Messaggi: 814
Media messaggi
|
 |
« Risposta #19 inserita: 08 Settembre, 2009, 14:06:40 » |
|
Tra pochi minuti ho da fare, stasera ti faccio sapere meglio, cmq sono quasi sicuro che l'impiccio sta nei path, che ancora non mi sono molto chiari......
Hai qualcosa da consigliarmi di leggere sullo specifico argomento, che sono ancora abbastanza confuso sul come e quali path vengono usati da python e come.
Perdonami se ti affliggo....ma da come avrai capito sto imparando adesso il python, e mi piace. Sei liberissimo di non rispondermi o di rispondermi quando ti va,non ci rimango male. L'informatica l'ho sempre imparata e insegnata cosi, partendo da esempi e facendomeli spiegare (ovviamente leggendo anche tutto il possibile) o spiegandoli.
Grazie della pazienza
|
|
|
|
|
Registrato
|
|
|
|
|