PDA

Visualizza la versione completa : Query Sql: Insert Su Excel


pmaggio
21-04-2004, 10:08
Ho implementato alcune maschere con Access per leggere e scrivere dati su un file Excel.

Con la lettura non c'è problema, mentre quando eseguo una query SQL per inserire delle righe, l'esecuzione termina senza errori, ma dopo non riesco più ad aprire il file Excel: quando faccio doppio click sul file, viene visualizzato l'errore:

DDE Server Window: EXCEL.EXE - Errore di applicazione
L'istruzione a "0x3004c359" ha fatto riferimento alla memoria a "0xffffffffc". La memoria non poteva essere "read".

Mentre se apro Excel con altri file, si apre correttamente. In pratica, l'esecuzione dell'SQL di scrittura danneggia irrimediabilmente il file Excel.

Sto lavorando con Office 2000 - Windows 2000, ma sul mio PC ho installato anche l'Office 2003 che uso per leggere altre applicazioni.


Nella maschera Access ho linkato le librerie:
Microsoft Access 9.0 Object Library
Microsoft Office 11.0 Object Library
Microsoft Excel 9.0 Object Library
Microsoft ActiveX Data Object 2.8 Library

Il codice che ho utilizzato nella maschera Access è il seguente:
Private Sub CB_Esporta_Fatture_Click()
Dim Conn As ADODB.Connection
Dim Rs As ADODB.Recordset

Set fs = CreateObject("Scripting.FileSystemObject")
If Not fs.FileExists(DLookup("PERCORSO_IMPORTAZIONE_FATTURE", "GESTIONE_PERCORSI")) Then
MsgBox "Il file configurato per l'importazione / esportazione delle fatture: " & DLookup("PERCORSO_IMPORTAZIONE_FATTURE", "GESTIONE_PERCORSI") & " NON risulta presente," & vbNewLine & _
"è necessario configurarne il percorso in modo corretto", vbExclamation, CurrentDb.Properties!AppTitle
Exit Sub
End If

Set Conn = New ADODB.Connection
Set Rs = New ADODB.Recordset
Screen.MousePointer = 11 ' Metto la clessidra
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & DLookup("PERCORSO_IMPORTAZIONE_FATTURE", "GESTIONE_PERCORSI") & "; Extended properties=Excel 8.0;"
SQL = "SELECT * FROM FATTURA ORDER BY DATA "
Set Rs_Access = CurrentDb.OpenRecordset(SQL)
Cont = 0
Do While Not Rs_Access.EOF
DATA_FATTURA = Rs_Access!DATA
N_FATTURA = Rs_Access!N_FATTURA
CODICE_CLIENTE = DLookup("CODICE_CLIENTE", "COMMESSE", "CODICE_COMMESSA = " & Rs_Access!CODICE_COMMESSA)
Rs.Open "SELECT * FROM [Fatture emesse$] WHERE [N] = " & N_FATTURA & " AND Data = #" & DATA_FATTURA & "#", Conn
If Rs.EOF Then
Cont = Cont + 1
SQL = "INSERT INTO [Fatture emesse$] ([N], Commessa, Data, Cliente, [Totale], [Scadenza], [N trasf], [Costo trasf], Documento) "
SQL = SQL & "SELECT " & Rs_Access!N_FATTURA & ", " & Rs_Access!CODICE_COMMESSA & ", #" & Rs_Access!DATA
SQL = SQL & "#, '" & CODICE_CLIENTE & "', " & Rs_Access!IMPORTO_FATTURATO & ", #" & Rs_Access!DATA_SCADENZA
SQL = SQL & "#, " & Nz(Rs_Access!N_TRASFERTE, "NULL") & ", " & Rs_Access!IMPORTO_TRASFERTE
SQL = SQL & ", '" & Rs_Access!DESCRIZIONE_FATTURA & "' "
'MsgBox SQL
Conn.Execute SQL
End If
Rs.Close
Rs_Access.MoveNext
Loop
On Error Resume Next
Rs_Access.Close
Conn.Close
On Error GoTo 0
Screen.MousePointer = 0 ' Tolgo la clessidra
MsgBox "L'esportazione è terminata, sono state esportate: " & Cont & " fatture che NON erano presenti sul foglio Excel", vbInformation, CurrentDb.Properties!AppTitle
End Sub

pmaggio
21-04-2004, 14:54
Ho verificato che il problema sta in una particolare formattazione di una parte di foglio..

Ho provato ad eseguire l'INSERT su un foglio nuovo e vuoto, copiando solo l'intestazione dei campi, e funziona...

Evidentemente, in alcune righe del foglio Excel c'è un tipo di formattazione che il Jet 4 non è in grado di salvare correttamente, una volta inserita la riga...

Sarebbe però interessante riuscire a captare la formattazione che lo manda in errore!! Mah....