Domanda

Voglio esportare il contenuto di diverse tabelle da MSAccess2003. Le tabelle contengono caratteri giapponesi unicode. Voglio salvarli come file di testo delimitati da tilde.

Posso farlo manualmente usando File / Esporta e, nella finestra di dialogo 'Avanzate', selezionando tilde come Delimitatore di campo e Unicode come Pagina di codice.

Posso archiviarlo come specifica di esportazione, ma questo sembra essere specifico della tabella.

Voglio esportare molte tabelle usando il codice VBA.

Finora ho provato:

Sub ExportTables ()

Dim lTbl As Long
Dim dBase As Database
Dim TableName As String

Set dBase = CurrentDb

For lTbl = 0 To dBase.TableDefs.Count
     'If the table name is a temporary or system table then ignore it
    If Left(dBase.TableDefs(lTbl).Name, 1) = "~" Or _
    Left(dBase.TableDefs(lTbl).Name, 4) = "MSYS" Then
         '~ indicates a temporary table
         'MSYS indicates a system level table
    Else
      TableName = dBase.TableDefs(lTbl).Name
      DoCmd.TransferText acExportDelim, "UnicodeTilde", TableName, "c:\" + TableName + ".txt", True
    End If
Next lTbl
Set dBase = Nothing

End Sub

Quando eseguo questo ottengo un'eccezione:

Errore di runtime "3011": Il motore di database Microsoft Jet non è riuscito a trovare l'oggetto " Allowance1 # txt '. Assicurarsi che l'oggetto esista e che si scriva correttamente il nome e il nome del percorso.

Se debug a questo punto, TableName è 'Allowance1', come previsto.

Suppongo che la mia specifica di esportazione UnicodeTilde sia specifica della tabella, quindi non posso usarla per più tabelle.

Qual è la soluzione? Dovrei usare qualcos'altro, diverso da TransferText, o forse creare programmaticamente le specifiche di esportazione?

Qualsiasi aiuto apprezzato.

È stato utile?

Soluzione

Alla fine l'ho risolto. (Ora sto usando Access 2007 ma ho avuto gli stessi problemi di Access 2003.)

Innanzitutto, ciò che non ha funzionato:

TransferText renderebbe delimitati solo la riga di intestazione e la tilde, anche con uno schema.ini formattato correttamente. (No, non ho messo tutto su una riga, era solo un problema di formattazione con l'html su stackoverflow.)

[MyTable.txt]
CharacterSet = Unicode
Format = Delimited(~)
ColNameHeader = True
NumberDigits = 10
Col1= "Col1" Char Width 10
Col2= "Col2" Integer
Col3= "Col3" Char Width 2

Basta usare un'istruzione select:

SELECT * INTO [Text;DATABASE=c:\export\;FMT=Delimited(~)].[MyTable.txt] FROM [MyTable]

Totalmente ignorato FMT. Ho trovato molto difficile trovare la documentazione sul formato dei parametri. Qualunque cosa io abbia digitato nel parametro FMT, le uniche cose che sono riuscito a far funzionare sono state Fixed. Tutto il resto è stato trattato come CSVDelimited. Potrei chech questo come l'istruzione select ha creato un file schema.ini come questo:

[MyTable.txt]
ColNameHeader=True
CharacterSet=1252
Format=CSVDelimited
Col1=Col1 Char Width 10
Col2=Col2 Integer
Col3=Col3 Char Width 2

La mia eventuale soluzione era quella di creare il mio schema.ini personale quindi utilizzare l'istruzione select. Il mio codice del modulo è simile al seguente:

Option Compare Database
Option Explicit

    Public Function CreateSchemaFile(bIncFldNames As Boolean, _
                                       sPath As String, _
                                       sSectionName As String, _
                                       sTblQryName As String) As Boolean


         Dim Msg As String
         On Local Error GoTo CreateSchemaFile_Err
         Dim ws As Workspace, db As Database
         Dim tblDef As TableDef, fldDef As Field
         Dim i As Integer, Handle As Integer
         Dim fldName As String, fldDataInfo As String
         ' -----------------------------------------------
         ' Set DAO objects.
         ' -----------------------------------------------
         Set db = CurrentDb()
         ' -----------------------------------------------
         ' Open schema file for append.
         ' -----------------------------------------------
         Handle = FreeFile
         Open sPath & "schema.ini" For Output Access Write As #Handle
         ' -----------------------------------------------
         ' Write schema header.
         ' -----------------------------------------------
         Print #Handle, "[" & sSectionName & "]"
         Print #Handle, "CharacterSet = Unicode"
         Print #Handle, "Format = Delimited(~)"
         Print #Handle, "ColNameHeader = " & _
                         IIf(bIncFldNames, "True", "False")
         Print #Handle, "NumberDigits = 10"
         ' -----------------------------------------------
         ' Get data concerning schema file.
         ' -----------------------------------------------
         Set tblDef = db.TableDefs(sTblQryName)
         With tblDef
            For i = 0 To .Fields.Count - 1
               Set fldDef = .Fields(i)
               With fldDef
                  fldName = .Name
                  Select Case .Type
                     Case dbBoolean
                        fldDataInfo = "Bit"
                     Case dbByte
                        fldDataInfo = "Byte"
                     Case dbInteger
                        fldDataInfo = "Short"
                     Case dbLong
                        fldDataInfo = "Integer"
                     Case dbCurrency
                        fldDataInfo = "Currency"
                     Case dbSingle
                        fldDataInfo = "Single"
                     Case dbDouble
                        fldDataInfo = "Double"
                     Case dbDate
                        fldDataInfo = "Date"
                     Case dbText
                        fldDataInfo = "Char Width " & Format$(.Size)
                     Case dbLongBinary
                        fldDataInfo = "OLE"
                     Case dbMemo
                        fldDataInfo = "LongChar"
                     Case dbGUID
                        fldDataInfo = "Char Width 16"
                  End Select
                  Print #Handle, "Col" & Format$(i + 1) _
                                  & "= """ & fldName & """" & Space$(1); "" _
                                  & fldDataInfo
               End With
            Next i
         End With
         CreateSchemaFile = True
CreateSchemaFile_End:
         Close Handle
         Exit Function
CreateSchemaFile_Err:
         Msg = "Error #: " & Format$(Err.Number) & vbCrLf
         Msg = Msg & Err.Description
         MsgBox Msg
         Resume CreateSchemaFile_End
      End Function

Public Function ExportATable(TableName As String)
Dim ThePath As String
Dim FileName As String
Dim TheQuery As String
Dim Exporter As QueryDef
ThePath = "c:\export\"
FileName = TableName + ".txt"
CreateSchemaFile True, ThePath, FileName, TableName
On Error GoTo IgnoreDeleteFileErrors
FileSystem.Kill ThePath + FileName
IgnoreDeleteFileErrors:
TheQuery = "SELECT * INTO [Text;DATABASE=" + ThePath + "].[" + FileName + "] FROM [" + TableName + "]"
Set Exporter = CurrentDb.CreateQueryDef("", TheQuery)
Exporter.Execute
End Function


Sub ExportTables()

    Dim lTbl As Long
    Dim dBase As Database
    Dim TableName As String

    Set dBase = CurrentDb

    For lTbl = 0 To dBase.TableDefs.Count - 1
         'If the table name is a temporary or system table then ignore it
        If Left(dBase.TableDefs(lTbl).Name, 1) = "~" Or _
        Left(dBase.TableDefs(lTbl).Name, 4) = "MSYS" Then
             '~ indicates a temporary table
             'MSYS indicates a system level table
        Else
          TableName = dBase.TableDefs(lTbl).Name
          ExportATable (TableName)
        End If
    Next lTbl
    Set dBase = Nothing
End Sub

Non pretendo che sia elegante, ma funziona. Nota anche che il formattatore del codice stackoverflow non mi piace il mio \ " quindi non stampa il mio codice molto bene.

Altri suggerimenti

In relazione a questo thread mi sono imbattuto in una soluzione incredibilmente semplice per essere in grado di utilizzare una specifica in tutte le esportazioni di tabelle mentre normalmente dovresti crearne una separata per ciascuna; o utilizzare la sub routine fornita da Richard A.

Il processo è il seguente:

Crea una specifica, ad esempio Pipe | delimitata con qualsiasi tabella, quindi apri una query dynaset in accesso utilizzando SQL SELECT * FROM MSysIMEXColumns e quindi elimina semplicemente tutte le righe risultanti. Questa specifica non genererà l'errore 3011 quando si tenta di utilizzare una tabella diversa da quella utilizzata per creare la specifica originale ed è essenzialmente una specifica di esportazione Pipe universale per qualsiasi tabella / query desiderata.

Questo è stato scoperto / testato in Access 2003, quindi presumo funzionerà anche per le versioni successive.

Cordiali saluti,

Matt Donnan

Ho due suggerimenti per te:

  1. Assicurati di inserire ciascuna impostazione nel tuo file [schema.ini] su una nuova riga. (L'hai elencato qui tutto su una riga, quindi ho pensato di esserne sicuro.)

  2. Non dimenticare di fornire l'argomento CodePage (ultimo) quando chiami TransferText. Ecco un elenco di valori supportati se ne hai bisogno:

http://msdn.microsoft.com/en-us/library /aa288104.aspx

A parte questo, sembra che il tuo approccio dovrebbe funzionare.

Ho una parte della risposta:

Sto scrivendo un file schema.ini con VBA, quindi eseguo il mio TransferText. Questo sta creando un formato di esportazione al volo. L'unico problema è, sebbene il mio schema.ini contenga:

ColNameHeader = True
CharacterSet = Unicode
Format = Delimited(~)

Solo la riga di intestazione esce in unicode con i delimitatori tilde. Il resto delle righe è ANSI con virgole.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top