SSIS Nomedi un file contenuti in una cartella...

domenica 12 luglio 2009 - 18.24

Evander Profilo | Newbie

Salve a tutti .
Ringrazio in anticipo chiunque avrà la pazienza di darmi una mano
Sono un principiante dell'argomento .
Sto sviluppando un piccolo pakage SSIS e mi ritrovo davanti a un piccolo problma che mi blocca:

Ho una sorgente di dati consistente in un file e fin qui tutto ok.
Tale file é inserito in una cartella precisa e non variabile, fin qui tutto ok, ma il nome del file che viene immesso periodicamente da altre fonti cambia .
Vorrei fare in modo di poter leggere il noe del file contenuto (o contenunti ) e assegnare tale nome a una variabile globale
Successivamente lo "salderò " a un indirizzo ma non é un problema .

Sto "armeggiando" con "Foreach Loop Container" e "File System Task" ma non ne sono ancora venuto a capo ; sono sulla retta via? consigli ?

Grazie .

alx_81 Profilo | Guru

>Salve a tutti .
Ciao!

>Tale file é inserito in una cartella precisa e non variabile,
>fin qui tutto ok, ma il nome del file che viene immesso periodicamente
>da altre fonti cambia.
>Vorrei fare in modo di poter leggere il noe del file contenuto
>(o contenunti ) e assegnare tale nome a una variabile globale
>Successivamente lo "salderò " a un indirizzo ma non é un problema.

>Sto "armeggiando" con "Foreach Loop Container" e "File System
>Task" ma non ne sono ancora venuto a capo ; sono sulla retta
>via? consigli ?
Io eviterei il filesystem task perchè ti serve solo se devi rinominare file o cartelle, spostarli, cancellarli, crearli. Se non devi effettuare operazioni di questo tipo per scorrere alcuni file in una cartella ti consiglio di usare solo il for each loop container, definendo come enumeratore il for each File Enumerator. A questo punto, siccome la cartella è fissa, la imposti nel campo apposito, definisci il pattern di ricerca (usando la sintassi DOS, ad esempio *.txt "tutti i file con l'estensione txt") e sei a posto.
Ora, ad ogni ciclo il for each sarà in grado di mappare il nome del file (fully qualified o meno, in base a quanto scelto nelle impostazioni) in una variabile che andrai a definire nella sezione "variable mappings". Tutto quello che metti all'interno del for each loop container potrà leggere ed utilizzare questa variabile. Nel tuo caso immagino che ti serva come membro di una EXPRESSION definita a livello di connection manager, per fare in modo di mappare un file diverso per ogni ciclo. Ma vediamo di definire i passi:

1) definisci un connection manager File Flat come ti serve, puntando ad uno dei file che, attenzione, possono avere nome diverso ma DEVONO avere la medesima struttura.
2) definisci una variabile, chiamata ad esempio vFileSource di tipo stringa, inizializzata al percorso di uno dei file, per comodità.
3) definisci un'expression sul ConnectionManager che passa alla proprietà ConnectionString la variabile definita al punto 2
4) trascina il foreach loop container e dichiara l'iteratore, mettendolo a For Each File Enumerator.
5) definisci un eventuale pattern di ricerca dei file e imposta Fully Qualified (così hai l'intero percorso del file che userai come connectionstring dell'espressione)
6) imposta nel variable mappings del for each loop la variabile che hai creato in modo che ad ogni ciclo essa sarà valorizzata col nome del file corrente
7) a questo punto sei in grado di utilizzare un data flow e come sorgente un file flat source con il connection manager definito al punto 1

Attenzione, che se dopo aver definito il file flat connection manager hai impostato un'expression con la variabile non inizializzata ad un percorso corretto ti si potrebbe rompere tutto. Quindi evita di riaprire il connection manager a meno che tu non faccia puntare ancora un file esistente. Ad ogni modo consiglio di mettere la proprietà DelayValidation = true per il connection manager stesso.
Prova e fammi sapere

>Grazie .
Di nulla!
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Evander Profilo | Newbie

Ti ringrazio immensamente !!
Sei davvero un grande !
Oggi per vari motivi ho avuto solo tempo di iniziare a implemenare la tua soluzione, ma entro domani penso di saperti dire se funge o meno .
Grazie davvero !

se poso però ti butterei lì un altro problema che sicuramente agli occhi di molti sembrerà stupido ma invece mi sta facendo dannare ...ed é una s....cavolata.
Io conosco abbastanza C# ma quasi per nulla VisualBasic e da quel poco che ho visto non mi aggradagran che ma mi tocca usarlo ....

Sempre nel Pakage SSIS che sto creando ho uno Script Task che prende alcun vlori di stringa da variabili globali (e fino qui tutto ok )
li fonde , unisce le stringhe contenute ( fin qui tutto ok ) e dovrebbe mettere il risultato in una terza variabile globale gia esistente ed inizializata (qui il problema ).

Tramite MsgBox visualizzo i contenuti delle varie variabili menre il Package fluisce nella sua corsa e mi sembra tutto corretto ....peccato che uscito dal blocco "Script task" la variabile che avevo aggiornato .... é vuota , mentre finche rimango nel "blocchetto " il valore é esistente .

Come faccio ad aggiornare una variabile Globale dall'interno di uno "Script Task"?

Grazie ancora


alx_81 Profilo | Guru

>se poso però ti butterei lì un altro problema che sicuramente
>agli occhi di molti sembrerà stupido ma invece mi sta facendo
>dannare ...ed é una s....cavolata.
>Io conosco abbastanza C# ma quasi per nulla VisualBasic e da
>quel poco che ho visto non mi aggradagran che ma mi tocca usarlo....
Con SSIS 2008 finalmente possiamo utilizzare il nostro amato C#

>Tramite MsgBox visualizzo i contenuti delle varie variabili menre
>il Package fluisce nella sua corsa e mi sembra tutto corretto
>....peccato che uscito dal blocco "Script task" la variabile
>che avevo aggiornato .... é vuota , mentre finche rimango nel
>"blocchetto " il valore é esistente .
>Come faccio ad aggiornare una variabile Globale dall'interno
>di uno "Script Task"?
Ora per dire che è vuota che fai per valorizzarla? In fondo, basta passarla come read write variable e poi scrivere al suo interno il valore con la seguente sintassi:

Dts.Variables("namespace::nomevar").Value = <tuo valore>

Comunque leggi qui per alcune regole che mi sono dato per scrivere codice all'interno di Script Task:
http://blogs.dotnethell.it/suxstellino/SSIS-Scrittura-del-codice-su-Script-Task__11518.aspx
e poi
http://blogs.dotnethell.it/suxstellino/Come-scrivere-codice-con-gli-Script-task-e-component__15462.aspx

>Grazie ancora
di nulla!
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Evander Profilo | Newbie

Ciao !
Grazie per la tempestiva risposta davvero!

Ho applicato entrambe le soluzioni che mi hai proposto e fungono !
per lla prima ho dovuto fare una pisccola modifica a causa della natura delle sorgenti dei dati sulle connessioni , in ogni caaso funge tutto ALLA GRANDE!

Grazie !

alx_81 Profilo | Guru

>per lla prima ho dovuto fare una pisccola modifica a causa della
>natura delle sorgenti dei dati sulle connessioni , in ogni caaso
>funge tutto ALLA GRANDE!
Bene, allora accetta la risposta se ritieni che ti abbia aiutato

>Grazie !
di nulla!
ciao!

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Evander Profilo | Newbie

Ti ringrazio , avevo postato un problema , ma era causato da un errore banale ...

Ho accettato , perdona se non l'ho fatto prima , ma essendo nuovo non sapevo fosse necessario .

alx_81 Profilo | Guru

>Ho accettato , perdona se non l'ho fatto prima , ma essendo nuovo
>non sapevo fosse necessario .
E' solo una corretta politica per dare visibilità di risoluzione a chi naviga sul post e non ha interagito con noi.
Metti che fra un mese poi cerchi la risoluzione ad un problema analogo a questo, vedi la banda verde e ti fidi di più nel seguire la soluzione non trovi?

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Evander Profilo | Newbie

Concordo .
Solo non lo sapevo , in effetti é sensato ed utile.
Grazie ancora davvero .
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