Oppure

Loading
13/08/11 10:55
vankraster
Io avrei la necessità di esportare dati da un db Paradox a un file Excel versione 2003, il problema è che ci sono riuscito ma siccome il db paradox ne ha 50.000 records e 15 campi per l'esportazione ci vogliono 3 ore. Tutto risolto tramite codice da vb 2010. Prima spiego il concetto che ho usato poi mettero il codice:
Apro il db Paradox lo interrogo con la query, apro il file excel e poi dal risultato per ogni riga inserisco nel file excel i vari campi. Quello che vi chiedo a voi e se posso migliorare il programma in modo che l'esportazione mi duri al massimo 1 ora.

 Dim sExcelPath, sdbPath, sLog As String
        sExcelPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath)
        sdbPath = "C:\db_From"
        sLog = sExcelPath & "\logs"

        Dim sFIle As System.IO.StreamWriter


        sFIle = System.IO.File.CreateText(sLog & "\" & Date.Now.DayOfYear & ".txt")

        ' Add some information to the file.
        sFIle.WriteLine(DateTime.Now.TimeOfDay.ToString & "Creazione del db")

        Dim tblmy As DataTable
        Dim oledbParadoxconn As New OleDb.OleDbConnection
        'EXCEL######################################
        Dim xlApp As Excel.Application
        Dim xlWorkBook As Excel.Workbook
        Dim xlWorkSheet As Excel.Worksheet
        'variabili memmorizazione dalla query#############################################
        Dim ShopCOde, DelDate, StockCode, ShrtDesc, WEBDESC, BRAND, VarDesc, Varcode, VarAltCode, PurchCost, Purchvat, UnitPrice, PriceVat, Desc As String
        Dim DescFrom, DescTo, AdoCOst1, AdoCost2, InvtryDate, Stock, Gruppo, sGruppo, TMisura, GMisura, Misura, Stagione, Anno, Sesso, Colore, Materiale, Box, PICFile As String


        'COSTANTI#####################################
        ShopCOde = "011"
        DelDate = DateTime.Now.Date



        Try
            sFIle.WriteLine(DateTime.Now.TimeOfDay.ToString & "Inizio query db paradox")
            lblProc.Text = "Query database Paradox"
            Dim Sqltext As String = "SELECT A.[Articolo Fornitore], A.Descrizione, A.MARCA, A.[ARTICOLO ETICHETTA], A.[CATEGORIA MERCEOLOGICA], A.[TIPO ARTICOLO], V.[DENOMINAZIONE VARIANTE 1], L.[PREZZO IVATO E], G.[DATA ULTIMO MOVIMENTO], G.[QTA INIZIALE]-G.[QTA SCARICO]+G.[QTA CARICO] AS TOT,U.UBICAZIONE, V.[VARIANTE 2], V.[VARIANTE 1] FROM ARTICOLI A, ARTBASE V, UBICAZIONE U, GIACENZA G,LISTINO L WHERE V.[ARTICOLO INTERNO]=A.[ARTICOLO] AND  A.[UBICAZIONE]=U.[CODICE]  AND G.[ARTICOLO]=V.[ARTICOLO ETICHETTA] AND L.[ARTICOLO]=A.[ARTICOLO]"
            Dim oledbconnstr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sdbPath & ";Extended Properties=Paradox 5.x;"
            oledbParadoxconn.ConnectionString = oledbconnstr
            oledbParadoxconn.Open()

            Dim myDataAdapter As New OleDb.OleDbDataAdapter(Sqltext, oledbParadoxconn)
            Dim dtgetdata As New DataSet


            myDataAdapter.Fill(dtgetdata, "aaaa")

            '   Me.dataGrid1.DataSource = dtgetdata
            '   Me.dataGrid1.DataMember = "aaaa"
            tblmy = dtgetdata.Tables("aaaa")

            '#####COPIARE DALLA COPIA AL NUOVO 
            'backupXLS.xls -copia 
            'fogl.xls = nuovo 
            'cancella file se esiste già
            MsgBox("fine query")
            sFIle.WriteLine(DateTime.Now.TimeOfDay.ToString & "fine della query")

            If System.IO.File.Exists(sExcelPath & "\fogl.xls") Then System.IO.File.Delete(sExcelPath & "\fogl.xls")

            System.IO.File.Copy(sExcelPath & "\backupXLS.xls", sExcelPath & "\fogl.xls")

            'EXCEL ##################
            xlApp = New Excel.Application
            xlWorkBook = xlApp.Workbooks.Open(sExcelPath & "\fogl.xls")
            xlWorkSheet = xlWorkBook.Worksheets("Foglio1")
            MsgBox("fine copia xls")


            'Progress bar###########################################
            Progress.Maximum = tblmy.Rows.Count
            Dim i As Integer = 0
            lblProc.Text = "Inserimento nel file di EXCEL i dati"
            sFIle.WriteLine(DateTime.Now.TimeOfDay.ToString & "fine della copia del file excel - inizio della scrittura nel file excel")
            WEBDESC = ""
            PurchCost = "0"
            Purchvat = "0"
            PriceVat = "20"
            Desc = "0"
            DescFrom = ""
            DescTo = ""
            AdoCOst1 = "0"
            AdoCost2 = "0"
            Materiale = ""
            Box = ""
            PICFile = ""

            MsgBox(tblmy.Rows.Count)

            For Each x In tblmy.Rows
                StockCode = x("Articolo Fornitore")
                ShrtDesc = x("Descrizione")
                BRAND = x("Marca")
                VarDesc = ShrtDesc & " " & x("Variante 2")
                Varcode = StockCode & "." & x("Variante 2")
                VarAltCode = x("Articolo etichetta")
                UnitPrice = x("PREZZO IVATO E")
                InvtryDate = x("DATA ULTIMO MOVIMENTO")
                Stock = x("TOT")
                Gruppo = x("CATEGORIA MERCEOLOGICA")
                sGruppo = x("Tipo Articolo")
                If IsDBNull(x("Denominazione Variante 1")) Then
                    TMisura = ""
                Else
                    TMisura = x("Denominazione Variante 1")
                End If
                GMisura = x("TIPO ARTICOLO")
                If IsDBNull(x("Variante 1")) Then
                    Misura = "UNICA"
                Else
                    Misura = x("Variante 1")
                End If
                Stagione = x("UBICAZIONE")
                Anno = Stagione
                Sesso = Gruppo
                If IsDBNull(x("Variante 2")) Then
                    Colore = "."
                Else
                    Colore = x("Variante 2").ToString
                End If

                'SCrivi sul foglio Excel
                xlWorkSheet.Cells(i + 2, 1).value = ShopCOde
                xlWorkSheet.Cells(i + 2, 2).value = DelDate
                xlWorkSheet.Cells(i + 2, 3).value = StockCode
                xlWorkSheet.Cells(i + 2, 4).value = ShrtDesc
                xlWorkSheet.Cells(i + 2, 5).value = WEBDESC
                xlWorkSheet.Cells(i + 2, 6).value = BRAND
                xlWorkSheet.Cells(i + 2, 7).value = VarDesc
                xlWorkSheet.Cells(i + 2, 8).value = Varcode
                xlWorkSheet.Cells(i + 2, 9).value = VarAltCode
                xlWorkSheet.Cells(i + 2, 10).value = PurchCost
                xlWorkSheet.Cells(i + 2, 11).value = Purchvat
                xlWorkSheet.Cells(i + 2, 12).value = UnitPrice
                xlWorkSheet.Cells(i + 2, 13).value = PriceVat
                xlWorkSheet.Cells(i + 2, 14).value = Desc
                xlWorkSheet.Cells(i + 2, 15).value = DescFrom
                xlWorkSheet.Cells(i + 2, 16).value = DescTo
                xlWorkSheet.Cells(i + 2, 17).value = AdoCOst1
                xlWorkSheet.Cells(i + 2, 18).value = AdoCost2
                xlWorkSheet.Cells(i + 2, 19).value = InvtryDate
                xlWorkSheet.Cells(i + 2, 20).value = Stock
                xlWorkSheet.Cells(i + 2, 21).value = Gruppo
                xlWorkSheet.Cells(i + 2, 22).value = sGruppo
                xlWorkSheet.Cells(i + 2, 23).value = TMisura
                xlWorkSheet.Cells(i + 2, 24).value = GMisura
                xlWorkSheet.Cells(i + 2, 25).value = Misura
                xlWorkSheet.Cells(i + 2, 26).value = Stagione
                xlWorkSheet.Cells(i + 2, 27).value = Anno
                xlWorkSheet.Cells(i + 2, 28).value = Sesso
                xlWorkSheet.Cells(i + 2, 29).value = Colore
                xlWorkSheet.Cells(i + 2, 30).value = Materiale
                xlWorkSheet.Cells(i + 2, 31).value = Box
                xlWorkSheet.Cells(i + 2, 32).value = PICFile

                'indicazione
                Progress.Value = i
                i += 1
            Next
            sFIle.WriteLine(DateTime.Now.TimeOfDay.ToString & "fine della scrittura file excel")

            'chiudi foglio EXCEL#####################################
            xlWorkBook.Close()
            xlApp.Quit()

            releaseObject(xlApp)
            releaseObject(xlWorkBook)
            releaseObject(xlWorkSheet)
            lblProc.Text = "Fine Inserimento - Inizion trasfero dati FTP"
Ultima modifica effettuata da Il Totem 14/08/11 10:07
aaa
14/08/11 10:14
Il Totem
50k record non sono tanti e mi sembra assurdo che ti ci vogliano tre ore. Mi sarebbe parso strano anche se ti avesse preso più di 10 minuti.
Per iniziare puoi usare un DataReader al posto del DataSet. E' molto meglio se leggi un risultato e lo scrivi piuttosto che leggerli tutti e scriverli tutti in blocco.
msdn.microsoft.com/it-it/library/…(v=vs.80).aspx
Puoi anche evitare di dichiarare tutte quelle variabili usando semplicemente degli indici per riferirti a un certo attributo di un record.
aaa