Newsgroup: it.comp.appl.access
Titolo: Come esportare riga db su file di testo?

C'e' chi ha il terrore di eliminare le cose inutili, e scoprire dopo un 
microsecondo che in realta' non erano inutili
Bon, traslando il ragionamento nel nostro ambito, la domanda e':
come realizzare una funzione che, dando in pasto unicamente il nome di 
una tabella ed una selezione che permetta di identificare univocamente 
il record, permetta di esportare in un file di testo il record?
L'obiettivo e' realizzare una sorta di log dei record eliminati, log 
pero' che consenta di ripristinare quel record nella malaugurata ipotesi 
che 'porca paletta mi serviva'
So che normalmente queste cose si fanno a bordo del db server a colpi di 
trigger e stored procedure, ma questa volta non vale andare di db
In sostanza, data una qualsiasi 'forma' di tabella sul db, e fornita la 
selezione che identifichi un record, cosa ci mettereste nel codice per 
consentire l'esportazione in formato testo delle informazioni contenute 
nella riga?
Andreste di campo in campo o c'e' modo di fare una cosa piu' rapida?
Esclusi campi memo, blob et affini
 

Se crei una Query con il/i records da cancellare e la esporti in un file di testo cosa succede...?
 
DoCmd.TransferText (TransferType, SpecificationName, TableName, FileName, HasFieldNames, HTMLTableName, CodePage)
 
@Alex


Succede che non c'e' uno SpecificationName pronto da usare
 


ammesso che sia fattibile
se il record che vuoi cancellare ha record correlati su altre tabelle?
mi immagino la classica fatture->righe fatture->altri dati riga 
fatture->scadenze fatture...
i txt inizia a diventare complesso da gestire
 
forse per la tabellina semplice può anche andare...ti salvi direttamente 
nel txt l'istruzione insert... per ripristinarla nel db.
ma in casi complessi mi pare un gran casino
 
BFS

 paletta mi serviva'
 
ma a questo punto crea una tabella gemella (vuota) e sposta 
semplicemente i record cancellati
 
-- 
/-\ /\/\ /\/\ /-\ /\/\ /\/\ /-\ T /-\
-=- -=- -=- -=- -=- -=- -=- -=- - -=-
........... [ al lavoro ] ...........

 
 
Vorrei esportare su file di testo
Li puoi aprire con qualsiasi editor al mondo, su qualsiasi pc al mondo, 
senza nessun software preinstalalto, se non i tools base sul pc
Un file db no

Il punto focale lo ha centrato BSF... la cosa è fattibile, ma devi contestualizzare il perimetro altrimenti crei un mostro.
Se le relazioni sono varie e molteplici, ed hai attivato il DELETE CASCADE, è ovviamente indispensabile prevedere l'export dei Record Correlati e questo in cascata...
Questa situazione rende chiaro che non sia facilmente generalizzabile un codice che passi il NomeTabella e fa il magheggio...!
 
Scrivere codice di questo tipo significa gestire in modo RICORSIVO l'attività di EXPORT:
1) Analizzare la Tabella, identificare la PK
2) Esportare il/I records da eliminare;
3) Analizzare la Collection Relations e vedere dove la PK entra come FK, ed iniziare il ciclo tra le Tabelle della Relations interessate
4) Filtrare per FK i Records che sarebbero oggetto di DELETE CASCADE ed Esportarli...
5) Ripetere dal punto 1 passando come origine la Tabella di Livello n+1 e riprocessare...
 
Non è impossibile ma a mio avviso il rischio è di costruire un codice talmente critico, che poi ne viene meno l'affidabiltà.
 
Questo va fatto anche se non hai abilitato il DELETECASCADE... in quanto i Records correlati senza una corrispondenza non possono sussistere, quindi verrebbe solo spostato il problema obbligandoti a cancellare prima i Record Relazionati lato M, fino a liberare i vincoli relazionali con il Record iniziale.
 
Ci penserei...
@Alex


State mettendo, tu e Bfs, il classico "..carro davanti ai buoi.."
Relazioni, Delete Cascade,scadenze fatture, non sono problemi cui porre 
attenzione in questa fase
La richiesta mi sembra chiara, si tratta di una tabella qualsiasi del db 
le cui righe vorrei esportare in formato testo
 
L'obiettivo e' avere traccia delle cancellazioni eseguite e, volendo, 
poter ripristinare le righe cancellate
Questo e' il problema, mi chiedevo anzi in verita' vi chiedevo, se ci 
fosse un sistema piu' efficiente ed elegante del classico ciclo per 
scorrere i campi tabella per rilevarne il tipo, e ciclo su tutti i campi 
per esportarne il contenuto, metodo sicuramente fattibile ma barboso ed 
immagino poco efficente
Stavo quindi cercando un qualcosa tipo il TransferText che pero' non 
avesse bisogno dello SpecificationName da fornire, perche' non so che 
tabella sara' ed avere centinaia di specifiche per l'esportazione, 
potendo eviterei
 
Ecco, appunto, il magheggio stavo cercando


permettimi...
se scrivi
 
"...volendo, poter ripristinare le righe cancellate "
 
non puoi non considerare da subito i record correlati..altrimenti come 
ripristini un record correlato a quello eliminato?
 
quindi o stiamo parlando del db monotabella della lista della spesa e/o 
di cazzeggiamenti su db per passare il tempo,
oppure in questa prima fase devi capire se è fattibile il "meccanismo" 
di ripristino in toto a mio avviso.
 
ad ogni modo, senza usare trigger non vedo altre soluzioni che ciclare 
il record che stai eliminando per i nomi campi/tipo di dato/relativo valore
 
BFS


Monotabella o no, non e' questo che ho chiesto
Ma una procedura piu' efficiente del classico ciclare tra i campi ed 
esportali uno dopo l'altro su file di testo
Se non c'e' pazienza
 

 Se non c'e' pazienza
 
La soluzione più semplice è usare una Query di appoggio da creare via codice ed usarla per l'Export.
Esempio hai selezionato 27000 Records da cancellare...?
 
Ipotiziamo che la selezione sia data da un FLAG o da una LISTBOX, costruirai il tuo predicato SQL lo sbatti nella Query e la usi.
1° Caso il FLAG
Dim sSQLExport As String
sSQLExport="SELECT * FROM TuaTabellaGenerica WHERE FLAG=True"
DbEngine(0)(0).QueryDefs("NomeTuaQueryExport").SQL=sSQLExport
DoCmd.TransferText....
 
2° Caso la ListBox a selezione multipla estesa, il predicato da ricostruire è del tipo:
SELECT * FROM TuaTabellaGenerica WHERE NomeIDPK IN (elenco degli ID della ListBox)
Poi come sopra.
 
@Alex