Newsgroup: it.comp.appl.access
Titolo: Importazione da csv

Buongiorno a tutti,
vorrei sapere se è possibile durante l'importazione di un file valorizzare contemporaneamente un campo, per tutti i record importati,  con un dato che non è presente nel file oggetto dell'importazione.
 
Grazie
 
Alfio


Se importi in una Tabella già esistente, si definendo la proprietà DefaultValue del campo in oggetto..., altrimenti no, ma puoi effettuare una Query UPDATE e forzare il Valore su titti i Records con 1 riga di comando...
 
Dim strQRY  As String
strQRY="UPDATE NomeTab SET [NomeCampo]=TuoValore"  ' Attenzione alla sintassi per Valori Testo/Numeri e Date
 
Poi lanci con il metodo Execute membro dell'Oggetto Database, magari in gestione Transazionale e gestione errori.
 
Public Sub TransactionQuery()
    On Error GoTo tran_Err
    Dim strQRY  As String
    strQRY="UPDATE NomeTab SET [NomeCampo]=TuoValore"  ' Attenzione alla sintassi per Valori Testo/Numeri e Date
 
    DAO.DBEngine.BeginTrans  
    CurrentDb.Execute strQRY, dbFailOnError
    DAO.DBEngine.CommitTrans
 
Exit Sub
 
tran_Err:
 
    DAO.DBEngine.Rollback
    MsgBox "Transaction failed. Error: " & Err.Description
End Sub
 
@Alex

 gestione Transazionale e gestione errori.
 
Quanta prosopopea!
 
Bruno

> Se importi in una Tabella già esistente, si definendo la proprietà defaultValue del campo in oggetto..., 
 
Grazie Alex,
in effetti devo importare tutto in una tabella esistente per cui, nell'ipotetico DoCmd.TransferText acImportDelim,.ecc ecc ....
quale sarebbe la sintassi per il DefaultValue del campo X che dovrebbe ricevere il valore Y?
 
Grazie


Se il valore è fisso, vai in struttura Tabella ed inserisci il Valore di DEFAULT nel campo di cui parli.
 
Se il valore è dinamico su condizione, prima di Importare, ti basta accederer alla Tabella da DAO con l'oggetto Tabledef ed andare nel Campo sempre con DAO alla proprietà DefaultValue.
 
Quì trovi un discreto esempio:
 
https://docs.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/field-defaultvalue-property-dao
 
 
A te bastano 2 righe...
 
Dim tdfEmployees As TableDef 
 
Set tdfEmployees = CurrentDb.TableDefs("NomeTabella") 
tdfEmployees.Fields("NomeCampo").DefaultValue = "98052" 
 
Set tdfEmployees =Nothing
 
.... quì poi inserisci il resto...
 
@Alex

 @Alex
 
Grazie mille Alex... ;)
 
Alfio

 
 
Ciao Alex,
tutto bene, importo il file e tramite TableDef passo la stringa che mi deve valorizzare il campo. L'unica cosa che non mi torna è che il testo passato (tramite inputbox) pur se impostato a stringa (campo in tabella=testo)  me lo trasforma nell'esito della divisione essendo inserito nel formato 9999/99, ma se è una stringa perché mi esegue la divisione? Dove sbaglio?
 
Alfio

messa...@gmail.com
 brought next idea :

Prova questa:
========================================
Dim tDef As TableDef, SF As String, TD As String, TT As String
Dim SQL As String, Y As String, Fld As Object, NewField As String
Dim db As Database
 
' --- Definizioni ------------------------------------
SF = "D:\aa0.csv"          ' File sorgente
TD = "DestinationTable"    ' Tabella di destinazione
TT = "TempTab"             ' Tabella temporanea
'-----------------------------------------------------
 
NewField = "Y"
Y = InputBox("Value for X field in DestinationTable")
Set db = CurrentDb
On Error Resume Next
DoCmd.DeleteObject acTable, TT
On Error GoTo 0
DoCmd.TransferText acImportDelim, , TT, SF
Set tDef = db.TableDefs(TT)
Set Fld = tDef.CreateField(NewField, dbText, 255)
tDef.Fields.Append Fld
SQL = "INSERT INTO DestinationTable ( Field1, Field2, Field3, X ) "
SQL = SQL & "SELECT F1, F2, F3, '" & Y & "' AS X FROM TempTab;"
CurrentDb.Execute SQL
 
End Sub
========================================
 
Bruno
 
PS
Sarebbe più opportuno avere il TransferText completo
delle specifiche ImportSpecs:
 
DoCmd.TransferText acImportDelim, ImportSpecs, TT, SF

 Alfio
 
Se il Campo è stringa serve la sintassi differente, basta aggiungere il CHR(34)
 
tdfEmployees.Fields("NomeCampo").DefaultValue = chr/34) & strDaInputBox & chr(34)
 
@Alex


Vorrei proprio che tu provassi tale versione completamente
automatizzata. Basta infatti unicamente definire SF e DT
come sotto indicato.
 
=======================================
Private Sub Command22_Click()
Dim tDef As TableDef, SF As String, DT As String, TT As String
Dim SQL As String, Y As String, Fld As Object, NewField As String
Dim db As Database, i As Integer
 
' --- Definizioni ------------------------------------
SF = "D:\aaa.csv"          ' File sorgente
'    Da Excel il foglio salvato in formato CSV (Comma delimited)(*.csv)
'    non viene regolarmente importato da Access 2019; occorre
'    salvarlo nel formato CSV (MSDOS)(*.csv)
DT = "DestinationTable"    ' Tabella di destinazione
'    Deve avere, nello stesso ordine, gli stessi campi di SF, ed 
inoltre
'    un campo supplementare (X) che verrà compilato ad ogni 
importazione
'    con riferimento all'InputBox
'------------------------------------------------------
 
TT = "TempTab"     ' Tabella temporanea
NewField = "X"     ' Nuovo campo da creare in TT
 
Y = InputBox("Value for X field in " & DT)
Set db = CurrentDb
On Error Resume Next
DoCmd.DeleteObject acTable, TT
On Error GoTo 0
DoCmd.TransferText acImportDelim, , TT, SF
Set tDef = db.TableDefs(TT)
Set Fld = tDef.CreateField(NewField, dbText, 255)
tDef.Fields.Append Fld
SQL = "UPDATE TempTab SET TempTab.X = '" & Y & "'"
db.Execute SQL
For i = 0 To db.TableDefs(TT).Fields.Count - 1
    db.TableDefs(TT).Fields(i).Name = _
    db.TableDefs(DT).Fields(i).Name
Next
SQL = "INSERT INTO " & DT & " SELECT " & TT & ".* FROM " & TT
db.Execute SQL
 
End Sub
==============================================
 
Grazie
Bruno

 @Alex
 
Infatti ho fatto così, ma quello che chiedevo è se è normale se una valore impostato come testo divenga numerico o trattato come tale... ;)
 
Saluti
 
PS: Ringrazio anche Bruno per la soluzione prospettata, ma ho adottato quella più semplice come proposto da Alex.... ;)

È normale... il carattere chr(34) serve proprio ad imporre il casting del dato prima dell'applicazione del valore...
Se non lo indichi il valore viene calcolato e poi applicato in quanto originariamente lo vede come numero.
 
Per le date stessa cosa sintassi dedicata.
 
Ciao
@Alex

 più semplice come proposto da Alex.... ;)
 
Capisco.
Una domanda, poi mi taccio per sempre:
 
Il dato da inserire nel campo X della tabella di destinazione
durante il TranferText è sempre e solo data, sempre e solo
numero, etc?
 
O può avvenire che per un TarnsferText sia una data,
per un altro TransferText sia un numero, etc?
 
Bruno

 
 Ciao Bruno,
si è sempre nello stesso formato, in pratica è un nr di fattura, 9999/99.
 
Ciao