Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di abellos
    Registrato dal
    Feb 2002
    Messaggi
    330

    Esportare da access su csv

    Ciao a tutti,
    ho la necessità di esportare da un db access su un file csv parecchi record variabili da 100.000 al milione.


    Ho scoperto il metodo getstring di ado che funziona molto bene, ma se ho troppi record mi esce l'errore Superato il limite del buffer delle risposte.
    Non ho trovato modo di usare response.flush al suo interno.


    Ho trovato questa query per esportare un numero specifico di record
    codice:
    SELECT * FROM (SELECT TOP 50 tab2.* FROM (SELECT TOP 300 tab1.* FROM gest_arch AS tab1 ORDER BY coddoc ASC) AS tab2 ORDER BY coddoc DESC) ORDER BY coddoc ASC;

    e nella mia procedura ho un ciclo che ad ogni passaggio mi genera queste query
    codice:
    SELECT * FROM (SELECT TOP 10000 tab2.* FROM (SELECT TOP 10000 tab1.* FROM gest_arch AS tab1 ORDER BY coddoc ASC) AS tab2 ORDER BY coddoc DESC) ORDER BY coddoc ASC;
    SELECT * FROM (SELECT TOP 10000 tab2.* FROM (SELECT TOP 20000 tab1.* FROM gest_arch AS tab1 ORDER BY coddoc ASC) AS tab2 ORDER BY coddoc DESC) ORDER BY coddoc ASC;
    SELECT * FROM (SELECT TOP 10000 tab2.* FROM (SELECT TOP 30000 tab1.* FROM gest_arch AS tab1 ORDER BY coddoc ASC) AS tab2 ORDER BY coddoc DESC) ORDER BY coddoc ASC;
    SELECT * FROM (SELECT TOP 10000 tab2.* FROM (SELECT TOP 40000 tab1.* FROM gest_arch AS tab1 ORDER BY coddoc ASC) AS tab2 ORDER BY coddoc DESC) ORDER BY coddoc ASC;
    SELECT * FROM (SELECT TOP 10000 tab2.* FROM (SELECT TOP 50000 tab1.* FROM gest_arch AS tab1 ORDER BY coddoc ASC) AS tab2 ORDER BY coddoc DESC) ORDER BY coddoc ASC;
    SELECT * FROM (SELECT TOP 10000 tab2.* FROM (SELECT TOP 60000 tab1.* FROM gest_arch AS tab1 ORDER BY coddoc ASC) AS tab2 ORDER BY coddoc DESC) ORDER BY coddoc ASC;
    SELECT * FROM (SELECT TOP 10000 tab2.* FROM (SELECT TOP 70000 tab1.* FROM gest_arch AS tab1 ORDER BY coddoc ASC) AS tab2 ORDER BY coddoc DESC) ORDER BY coddoc ASC;
    SELECT * FROM (SELECT TOP 10000 tab2.* FROM (SELECT TOP 80000 tab1.* FROM gest_arch AS tab1 ORDER BY coddoc ASC) AS tab2 ORDER BY coddoc DESC) ORDER BY coddoc ASC;
    SELECT * FROM (SELECT TOP 10000 tab2.* FROM (SELECT TOP 90000 tab1.* FROM gest_arch AS tab1 ORDER BY coddoc ASC) AS tab2 ORDER BY coddoc DESC) ORDER BY coddoc ASC;
    SELECT * FROM (SELECT TOP 10000 tab2.* FROM (SELECT TOP 100000 tab1.* FROM gest_arch AS tab1 ORDER BY coddoc ASC) AS tab2 ORDER BY coddoc DESC) ORDER BY coddoc ASC;
    SELECT * FROM (SELECT TOP 10000 tab2.* FROM (SELECT TOP 110000 tab1.* FROM gest_arch AS tab1 ORDER BY coddoc ASC) AS tab2 ORDER BY coddoc DESC) ORDER BY coddoc ASC;
    SELECT * FROM (SELECT TOP 10000 tab2.* FROM (SELECT TOP 120000 tab1.* FROM gest_arch AS tab1 ORDER BY coddoc ASC) AS tab2 ORDER BY coddoc DESC) ORDER BY coddoc ASC;
    SELECT * FROM (SELECT TOP 3906 tab2.* FROM (SELECT TOP 123906 tab1.* FROM gest_arch AS tab1 ORDER BY coddoc ASC) AS tab2 ORDER BY coddoc DESC) ORDER BY coddoc ASC;

    soltanto che non mi sembra molto ottimizzato come metodo, dato che sull'ultima query prendo tutti i record per poi prenderne soltanto 3906


    Sapete se e' possibile usare la paginazione di ado ed esportare, sempre con getstring, una pagina per volta?
    Non sono riuscito a capire come fare.


    Avete altre idee?
    Da un grande potere derivano grandi responsabilità

  2. #2
    Amministratore L'avatar di Vincent.Zeno
    Registrato dal
    May 2003
    residenza
    Emilia-Romagna (tortellini und cappelletti land!)
    Messaggi
    20,455
    ciao,
    con una normale paginazione dovresti risolvere.
    qui un esempio di buon livello:
    http://www.creamweb.it/script/mostra...t/?id_script=9
    per applicarlo e integrarlo non dovresti avere particolari problemi

    fai sapere se ti aggrada

  3. #3
    Utente di HTML.it L'avatar di abellos
    Registrato dal
    Feb 2002
    Messaggi
    330
    Ciao Vincent,
    grazie della risposta ma mi sa che non mi sono spiegato bene.
    Io la paginazione sono capace a farla, a me servirebbe qualcosa per esportare i dati in un file csv con getstring.
    Mi chiedevo se era possibile usare un recordset con paginazione ed usare getstring ciclando le pagine in modo da esportare tutto il recordset senza usare le query che ho scritto sopra che prendono anche dati che non mi servono.
    il codice che uso e' questo
    codice:
    Server.ScriptTimeOut = 200
    
    
    path = server.mappath("../db/037/cap037.mdb")
    
    
    Set Conn = Server.CreateObject("ADODB.Connection")
    Conn.Open("Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & path)
    
    
    record_per_ciclo = 10000
    
    
    SQLC = "SELECT COUNT(coddoc) as record_count FROM gest_arch"
    set RSCount = conn.execute(SQLC)
    record_totali = RSCount("record_count")
    RSCount.close
    set RSCount = Nothing
    
    
    numero_cicli = record_totali / record_per_ciclo
    
    
    'Response.ContentType = "text/csv"
    'Response.AddHeader "Content-Disposition", "attachment; filename=Export.csv"
    'Response.AddHeader "Content-Disposition", "inline; filename=Export.csv"
    
    
    SQL = "SELECT TOP 1 coddoc, pratica FROM gest_arch"
    
    
    Set RS = conn.Execute( SQL )
    
    
    If RS.EOF Then Response.End
    
    
    'testata nome campi
    For f = 0 To RS.Fields.Count-1
        hdr = hdr & "," & QT & RS.Fields(f).Name & QT
    Next
    
    
    hdr = hdr & vbNewLine
    
    
    'testata tipo campi
    For f = 0 To RS.Fields.Count-1
        tipo = tipo & QT & adoTipoVar( RS.Fields(f).type ) & QT & ","
    Next
    
    
    tipo = left(tipo, len(tipo) - 1)
    
    
    hdr = hdr & tipo
    
    
    CONST QT = """"
    
    
    K = 1
    for A = 1 to RoundUp(numero_cicli)
        indiceA = record_per_ciclo
        indiceB = A * record_per_ciclo
        
        
        if k = RoundUp(numero_cicli) then        
            indiceA = record_totali - ((A-1) * record_per_ciclo)
            indiceB = record_totali
            
        end if
    
    
        'response.write indiceA & "<br>"
        'response.write indiceB & "<br>"
    
    
        SQLgs = "SELECT * FROM (SELECT TOP "& indiceA &" tab2.* FROM (SELECT TOP "& indiceB &" tab1.* FROM gest_arch AS tab1 ORDER BY coddoc ASC) AS tab2 ORDER BY coddoc DESC) ORDER BY coddoc ASC;"
        response.write SQLgs & "<br>"
    
    
        k = k + 1
    
    
        set RSgs = conn.execute( SQLgs )
        prefix = QT
        midfix = QT & "," & QT
        suffix = QT & vbNewLine
        rows = RSgs.getString( , , midfix, suffix & prefix )
        Response.Write prefix & Left(rows, Len(rows) - Len(prefix) )
        RSgs.Close
        set RSgs = Nothing
    
    
        Response.Flush
    next
    
    
    conn.close
    set conn = nothing
    con la paginazione continua ad esportarmi tutto il recorset e si impalla il buffer.
    Non ho capito come filtrare i dati

    -edit-
    la funzione RoundUp arrotonda al numero superiore senza decimali
    Da un grande potere derivano grandi responsabilità

  4. #4
    ma se devi esportare su csv perché fai response.write? non dovresti scrivere su un file?
    ARTRIPE

  5. #5
    Amministratore L'avatar di Vincent.Zeno
    Registrato dal
    May 2003
    residenza
    Emilia-Romagna (tortellini und cappelletti land!)
    Messaggi
    20,455
    forse il mio approccio non coincide ancora con il tuo, ma il mio pensiero è questo (dimmi se può essere corretto):
    -creo un paginazione dei risultati (la tabella reale dove ci sono tutti i record)
    --e singolarmente passo i risultati al file csv

    giunto alla fine delle pagina 1 (N risultati per pagina), imposto il redirect alla pagina 2.
    dovrò solo fare attenzione di non passare alla pagine 2 troppo velocemente altrimenti potrei perdermi qualche trascrizione.

    può andare come ragionamento?

  6. #6
    Utente di HTML.it L'avatar di abellos
    Registrato dal
    Feb 2002
    Messaggi
    330
    @optime uso response.write cosi con gli header che ho commentato in alto lo faccio scaricare quando clicco sul link

    @vincent uhm, si potrebbe andare ma tieni conto che non visualizzo nessun dato, come ho scritto a optime li sparo al browser per farlo scaricare

    ho visto che esistono le proprietà filter e getrows forse potrebbero fare al caso mio? specialmente getrows
    Da un grande potere derivano grandi responsabilità

  7. #7
    ma se fai response.write il rischio è di riempire il buffer, cosa che effettivamente fai: prova a scrivere direttamente su file
    ARTRIPE

  8. #8
    Amministratore L'avatar di Vincent.Zeno
    Registrato dal
    May 2003
    residenza
    Emilia-Romagna (tortellini und cappelletti land!)
    Messaggi
    20,455
    Quote Originariamente inviata da abellos Visualizza il messaggio
    @optime uso response.write cosi con gli header che ho commentato in alto lo faccio scaricare quando clicco sul link

    @vincent uhm, si potrebbe andare ma tieni conto che non visualizzo nessun dato, come ho scritto a optime li sparo al browser per farlo scaricare

    ho visto che esistono le proprietà filter e getrows forse potrebbero fare al caso mio? specialmente getrows
    che tu stampi a video i dati o meno è una scelta di opportunità
    magari potresti scegliere di farlo per tenere sott'occhio il processo.
    getrows prende l'intera riga e si usa per questioni di comodità se il contesto lo consente.
    quindi: se per te va bene.. va bene!

    non ho capito che intendi con "li sparo al browser per farlo scaricare"***
    EDIT: leggendo la risposta ho capito

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2022 vBulletin Solutions, Inc. All rights reserved.