Verifica esistenza di un file in SQL Server 2000

lunedì 29 maggio 2006 - 12.51

isotopo75 Profilo | Newbie

Ciao a tutti,

ho realizzato un DTS che prende un file txt come origine dati, inserisce i suoi valori in una tabella, modifica la tabella e infine esporta i dati in un altro file txt.

Tutto funziona a modo, ma siccome devo pianificare il dts, vorrei fare in modo che la procedura venga eseguita solo se il file txt di origine esiste nella cartella!

In pratica quello che ho fatto (e che funziona già) è:

Ho un file 'origine.txt' nella cartella c:/import

Uso il file per generare la tabella 'orig'

Eseguo varie query sulla tabella e genero una tabella 'desti'

Esporto il contenuto della tabella 'desti' nella cartella C:/export



Una volta pianificato però, devo fare in modo che la procedura venga eseguita solo se esiste il file 'origine.txt' nella cartella C:/import altrimenti no.

Inoltre mi serve che, alla fine della procedura, lo stesso file 'origine.txt' venga eliminato dalla cartella c:/import

Qualcuno sa aiutarmi??

Grazie mille a tutti!!!!!

Iso75


lbenaglia Profilo | Guru

>Una volta pianificato però, devo fare in modo che la procedura
>venga eseguita solo se esiste il file 'origine.txt' nella cartella
>C:/import altrimenti no.
>
>Inoltre mi serve che, alla fine della procedura, lo stesso file
>'origine.txt' venga eliminato dalla cartella c:/import
>
>Qualcuno sa aiutarmi??

Ciao Iso75,

puoi eseguire entrambe le cose utilizzando un ActiveX Script Task ed il File System Object.
La classe FileSystemObject espone il metodo FileExists che ti permette di verificare al volo l'esistenza di un file; nel caso non esista fai fallire il task e termini di conseguenza il processo di importazione; per eliminare il file origine.txt ricorrerai al metodo DeleteFile.

Tutti i dettagli su MSDN:

"FileSystemObject Object"
http://msdn.microsoft.com/library/en-us/vbenlr98/html/vaobjfilesystemobject.asp

"FileExists Method"
http://msdn.microsoft.com/library/en-us/vbenlr98/html/vamthfileexists.asp

"DeleteFile Method"
http://msdn.microsoft.com/library/en-us/vbenlr98/html/vamthdeletefile.asp

>Grazie mille a tutti!!!!!
Prego.

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

isotopo75 Profilo | Newbie

Ciao

ho scritto questa cosa:

Function Main()
Main = DTSTaskExecResult_Success
Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.CreateTextFile("c:\testfile.txt", True)
Set b = fs.FileExists("c:\test2.txt")
if b="true" then a.WriteLine("This is a test.")
a.Close
b.Close
End Function

Ma mi da un errore... te lo posto di seguito:

Descrizione errore - codice errore: 0
Origine errore=Errore di run-time di Microsoft VBScript
Descrizione errore: Necessario oggetto: 'fs.FileExist(...)'

Errore nella riga 8

Il file test2.txt esiste perchè l'ho creato io... non so se è corretta la sintassi dell' if...then

Il problema è che io di VB non ne so praticamente nulla!!!!!!! :(


Iso75.

lbenaglia Profilo | Guru

>Ciao
>
>ho scritto questa cosa:
>
>Function Main()
>Main = DTSTaskExecResult_Success
> Set fs = CreateObject("Scripting.FileSystemObject")
> Set a = fs.CreateTextFile("c:\testfile.txt", True)
> Set b = fs.FileExists("c:\test2.txt")
> if b="true" then a.WriteLine("This is a test.")
> a.Close
> b.Close
>End Function
>
>Ma mi da un errore... te lo posto di seguito:
>
>Descrizione errore - codice errore: 0
>Origine errore=Errore di run-time di Microsoft VBScript
>Descrizione errore: Necessario oggetto: 'fs.FileExist(...)'
>
>Errore nella riga 8

Certo, Set si utilizza per referenziare le variabili oggetto.
Il metodo FileExist restituisce un valore boolean quindi se vuoi memorizzare il valore di ritorno in una variabile, non devi utilizzare il Set.

Ti allego un pezzo di codice di un mio ActiveX Script Task:

'****************************** ' Visual Basic ActiveX Script '****************************** Option Explicit Function Main() Dim oFSO Dim strLogFileName1 Dim strLogFileName2 strLogFileName1 = DTSGlobalVariables("LogFileName1").Value strLogFileName2 = DTSGlobalVariables("LogFileName2").Value ' Istanzio il FileSystemObject Set oFSO = CreateObject("Scripting.FileSystemObject") ' Verifico l'esistenza del primo file di log If oFSO.FileExists(strLogFileName1) Then ' Lo elimino oFSO.DeleteFile strLogFileName1 End If ' Verifico l'esistenza del secondo file di log If oFSO.FileExists(strLogFileName2) Then ' Lo elimino oFSO.DeleteFile strLogFileName2 End If ' Pulizia Set oFSO = Nothing ' Uscita Main = DTSTaskExecResult_Success End Function

Prendi spunto da quella routine.
Tieni presente che tu dovrai utilizzare 2 ActiveX Script Task: uno per la verifica del file di input e uno per la cancellazione.

Nel caso esista il file di input, Main dovrà essere uguale a DTSTaskExecResult_Success altrimenti DTSTaskExecResult_Failure.
Leggi questo tip:
http://www.sqldts.com/default.aspx?211

>Il problema è che io di VB non ne so praticamente nulla!!!!!!!
>:(

Bene, un'occasione per imparare il VBScript

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

isotopo75 Profilo | Newbie

Ciao, ho provato a scrivere questo... ma mi dà ancora errore
A me serve semplicemente che se il file c:\testfile.txt esiste allora esegue gli altri blocchi del pacchetto, altrimenti si ferma.


'******************************
' Visual Basic ActiveX Script
'******************************
Option Explicit

Function Main()
Dim oFSO
Dim strLogFileName1


strLogFileName1 = DTSGlobalVariables("c:\testfile.txt").Value

' Istanzio il FileSystemObject
Set oFSO = CreateObject("Scripting.FileSystemObject")

' Verifico l'esistenza del primo file di log
If oFSO.FileExists(strLogFileName1) Then

'il file esiste e quindi esegue il processo
Main=DTSTaskExecResult_Success
Else
Main = DTSTaskExecResult_Failure
End if

' Pulizia
Set oFSO = Nothing

End Function

' Nel caso esista il file di input, Main dovrà essere uguale a DTSTaskExecResult_Success altrimenti DTSTaskExecResult_Failure.


Mi restituisce questo errore:

Origine errore - Pacchetto Microsoft Data Transformation Services (DTS)

Descrizione errore: E' stato segnalato un errore durante l'esecuzione dell'attività

Sembra più un errore sul DTS però che non sullo script

Boh...

Grazie

Iso75

lbenaglia Profilo | Guru

> Dim strLogFileName1
>
>
>strLogFileName1 = DTSGlobalVariables("c:\testfile.txt").Value

Sicuramente non hai una variabile chiamata "c:\testfile.txt"!!!
Se il nome del file è costante puoi scrivere:

Option Explicit Function Main() Dim oFSO Set oFSO = CreateObject("Scripting.FileSystemObject") ' Check for file and return appropriate result If oFSO.FileExists("C:\testfile.txt") Then Main = DTSTaskExecResult_Success Else Main = DTSTaskExecResult_Failure End If Set oFSO = Nothing End Function

Se vuoi renderlo parametrico devi prevedere una global variable a livello di package e seguire passo passo quanto descritto nell'articolo di Darren che ti ho già segnalato:
http://www.sqldts.com/default.aspx?211

>Grazie
Prego.

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

isotopo75 Profilo | Newbie

Ciao,

il sistema ha funzionato :)

ti volevo chiedere un'altra cosa... sempre in VB

Esiste una funzione che modifica il nome di un file contenuto in una cartella?

Ad esempio:

ho questo file : "C:\test1.txt"

Vorrei fare uno script active x che cambi il nome in "C:\fine.txt", magari con la possibilità di scegliere il nome del file.

Grazie mille

Iso75

lbenaglia Profilo | Guru

>Esiste una funzione che modifica il nome di un file contenuto
>in una cartella?
>
>Ad esempio:
>
>ho questo file : "C:\test1.txt"
>
>Vorrei fare uno script active x che cambi il nome in "C:\fine.txt",

E' sufficiente valorizzare la proprietà Name dell'oggetto File.

"Name Property"
http://msdn.microsoft.com/library/en-us/vbenlr98/html/vaprofsoname.asp

>magari con la possibilità di scegliere il nome del file.
Da un DTS?!?!
Un Packege viene eseguito in modalità batch quindi non prevede interazione con l'utente.
Al massimo puoi prevedere un file di configurazione o una chiave di registry dove l'amministratore andrà ad inserire il nome del file...

>Grazie mille
Prego.

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

isotopo75 Profilo | Newbie

ciao,

come sempre i tuoi indizi sono andati a buon fine

Ora però mi sono accorto di un'altra cosa

Scrivendo questo script :

'******************************
' Visual Basic ActiveX Script
'******************************
Option Explicit

Function Main()
Dim oFSO,f,s


' Istanzio il FileSystemObject
Set oFSO = CreateObject("Scripting.FileSystemObject")

Set f = oFSO.GetFile("C:\test.txt")
Set s = oFSO.GetFile("C:\export\ditta01.txt")

f.Name=(s.Name)

Main=DTSTaskExecResult_Success

' Pulizia
Set oFSO = Nothing

End Function


riesco a cambiare il nome del file test.txt nel nome file ditta01.txt... il problema è che io in realtà il nome ditta01.txt NON lo conosco a priori!!

E' un nome che varia a seconda della ditta da analizzare... esiste un modo per inserire nella variabile s un nome file generico? Ad esempio ditta*.txt dove al posto dell'asterisco ci può essere 01, 23,154 ecc...?

Grazie

Ciao

Iso75

lbenaglia Profilo | Guru

>riesco a cambiare il nome del file test.txt nel nome file ditta01.txt...
>il problema è che io in realtà il nome ditta01.txt NON lo conosco
>a priori!!
>
>E' un nome che varia a seconda della ditta da analizzare... esiste
>un modo per inserire nella variabile s un nome file generico?
>Ad esempio ditta*.txt dove al posto dell'asterisco ci può essere
>01, 23,154 ecc...?

Programmando puoi fare quello che vuoi, l'importante è sapere che risultato che si intende ottenere.
Io non l'ho capito, e tu?

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5