Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
SQL Server 2000/2005/2008, Express, Access, MySQL, Oracle
For Each Row SSIS
venerdì 03 aprile 2009 - 14.37
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
Pongo
Profilo
| Senior Member
274
messaggi | Data Invio:
ven 3 apr 2009 - 14:37
Ciao a tutti,
sono in fase di analisi di un problema. In pratica devo estrarre da un db delle "testate", una per agenzia, poi tutte delle righe associate a tale agenzia.
Per adesso la soluzione che vedo è questa: SSIS che estrae le testate e le butta su excel, estrae le righe e le butta su excel--> apro il documento excel con un applicativo appositamente creato con VS (c#), e mi creo il file.
In pratica per ogni riga di testata vorrei avere di seguito tutte le righe di dettaglio.
Con SSIS posso fare qualcosa in modo da usare c# solo per i lavori di "limatura" finale?
Ciao e grazie.
alx_81
Profilo
| Guru
8.814
messaggi | Data Invio:
ven 3 apr 2009 - 14:43
>Ciao a tutti,
Ciao!
>Per adesso la soluzione che vedo è questa: SSIS che estrae le
>testate e le butta su excel, estrae le righe e le butta su excel-->
>apro il documento excel con un applicativo appositamente creato
>con VS (c#), e mi creo il file.
>In pratica per ogni riga di testata vorrei avere di seguito tutte
>le righe di dettaglio.
>Con SSIS posso fare qualcosa in modo da usare c# solo per i lavori
>di "limatura" finale?
Potresti usare come source una bella join tra le due tabelle di partenza, e poi, con una script destination (Script transformation usato come destinazione), usare il modello ad oggetti di excel per creare il file xls.
Così useresti solo SSIS.
>Ciao e 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
Pongo
Profilo
| Senior Member
274
messaggi | Data Invio:
ven 3 apr 2009 - 14:54
Ciao Alessandro, cosa intendi per join tra le tabelle iniziali?
Tieni conto che i due file che ottengo in excel sono già il frutto di query con join, convert e chi più ne ha più ne metta.
Avevo pensato di costruire due viste e metterle in join, ma avrei duplicazione di informazioni.
Cioè per farvi capire ho:
testate
1
2
3
righe
a
s
d
f
g
h
j
k
nelle righe ho aggiunto una FK alle testate. Quel che voglio (vorrei) è
1
a
s
d
2
f
g
h
j
k
3
z
x
c
Qualche idea?
alx_81
Profilo
| Guru
8.814
messaggi | Data Invio:
ven 3 apr 2009 - 15:00
>Ciao Alessandro, cosa intendi per join tra le tabelle iniziali?
>Tieni conto che i due file che ottengo in excel sono già il frutto
>di query con join, convert e chi più ne ha più ne metta.
>Avevo pensato di costruire due viste e metterle in join, ma avrei
>duplicazione di informazioni.
Quello che intendevo è che secondo me non dovresti fare gli excel.
Se parti da DB, fai una bella join che estrapola tutto e poi fai tutto con uno script destination, che salta ogni intestazione ripetuta andando a scrivere il dettaglio.
Usando il modello a oggetti di excel potrai creare in quel punto il tuo excel finale.
--
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
Pongo
Profilo
| Senior Member
274
messaggi | Data Invio:
ven 3 apr 2009 - 15:15
Ah, ok, non so di cosa tu stia parlando con script destination e oggetti excel ma adesso cerco un po' !
Vedo se riesco ad andarne fuori!
Ripasso in ogni caso!
Intanto grazie!
Pongo
Profilo
| Senior Member
274
messaggi | Data Invio:
ven 3 apr 2009 - 15:51
Alessandro eccomi qui.
Allora con il mio ssis ho fatto uno script che crea le viste, poi un data flow.
Nel data flow c'è per adesso solo una select sulle due viste in join.
Cosa posso fare adesso?
E poi come posso riuscire a creare il file excel avendo valori diversi in colonna?
Cioè se fa la mia testata è aaaa aa aaaaaaaaaaaa e le mie righe sono fatte da xx XXXXXXXX hhhhhhhhhhhhhhhh, come posso riuscire a metterli in colonna?
Nella mia idea iniziale, il file prodotto alla fine è un file di testo che per ogni riga del fogli excel delle testate prende tutte le righe.
Essendo appunto un txt non ha nessun senso parlare di colonne e tipo dati.
alx_81
Profilo
| Guru
8.814
messaggi | Data Invio:
ven 3 apr 2009 - 15:54
>Ah, ok, non so di cosa tu stia parlando con script destination
>e oggetti excel ma adesso cerco un po' !
>Vedo se riesco ad andarne fuori!
Allora, quando metti un DataFlow, al suo interno, definisci sorgenti, trasformazioni e destinazioni. Lo script component è un componente che può essere usato sia come source che come trasformazione e destinazione.
Se lo usi come destinazione, si aspetta degli input e puoi lavorare riga per riga per aggiungere al tuo excel le righe. E in quel caso devi conoscere il modello ad oggetti di excel..
--
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
Pongo
Profilo
| Senior Member
274
messaggi | Data Invio:
ven 3 apr 2009 - 16:13
OK, ma non capisco cosa io debba usare.
Come ti dicevo ho questa tabella con tutti i dati.
Se l'excel è un problema posso creare direttamente un file di testo, mi risparmierebbe l'elaborazione con C#. Ma non so come procedere per far fare all' SSIS questa cosa.
alx_81
Profilo
| Guru
8.814
messaggi | Data Invio:
ven 3 apr 2009 - 16:14
>Essendo appunto un txt non ha nessun senso parlare di colonne
>e tipo dati.
se devi fare un txt ancora meglio, usa lo script component come destinazione e poi vedrai che sarà facile capire come usare le colonne
Hai completo controllo sulle colonne che arrivano proprio come vere e proprie proprietà di un oggetto buffer
Qui hai un esempio di sorgente, giusto per capire come si può usare lo script component.
http://blogs.dotnethell.it/suxstellino/DataFlow-%E2%80%93-Script-Component-come-sorgente__7477.aspx
--
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
Pongo
Profilo
| Senior Member
274
messaggi | Data Invio:
ven 3 apr 2009 - 17:09
Alessandro ho conosciuto un nuovo componente, ma non riesco a capire come possa essermi utile.
Ok, prende in input queste colonne, poi?
Io devo avere come prima riga il contenuto concatenato delle colonne da 1 a 5 per esempio e nelle altre righe la concatenazione delle colonne da 6 a 20 che hanno il nodo= a quello contenuto nella prima stringa di intestazione.
Forse sono io che sono duro, ma non riesco a capire come procedere....
alx_81
Profilo
| Guru
8.814
messaggi | Data Invio:
ven 3 apr 2009 - 17:27
>Ok, prende in input queste colonne, poi?
poi puoi scrivere lo script e fare ciò che vuoi
usando il metodo "Input0_ProcessInputRow(Input0Buffer Row)" (quello di default se non rinomini il buffer di input).
In poche parole, crei un dataflow, metti la tua sorgente (la join con le viste in un OLEDB Source), poi posizioni uno script transformation selezionando "destinazione".
Leghi il source al tuo script, fai doppio click sullo script e selezioni le colonne di input che ti arrivano dal source. Le colonne selezionate riempiono un buffer in automatico, utilizzabile dallo script (sezione script --> design script). Nel metodo "Input0_ProcessInputRow(Input0Buffer Row)" potrai accedere a Row, le cui proprietà sono le colonne.
Da qui, basta creare un file se non esiste (File.Create o classe FileInfo) e appendere le colonne in base alle tue considerazioni.
Sai quali sono i campi della testata no? Quindi in caso di testata scrivi una cosa, in caso di dettaglio scrivi un'altra cosa..
Appena hai il cambiamento di testata, crei una nuova riga, ecc.. in base alle tue logiche.
Alla fine avrai il tuo file.
--
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
Pongo
Profilo
| Senior Member
274
messaggi | Data Invio:
ven 3 apr 2009 - 17:39
Ah, ok.
Lunedì provo.
Intanto grazie per i consigli e l'aiuto!
Ciao.
alx_81
Profilo
| Guru
8.814
messaggi | Data Invio:
ven 3 apr 2009 - 18:11
>Ah, ok.
>Lunedì provo.
>Intanto grazie per i consigli e l'aiuto!
di nulla!
Facci sapere come ti va
--
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
Pongo
Profilo
| Senior Member
274
messaggi | Data Invio:
lun 6 apr 2009 - 10:44
Alessandro ho un problema:
Ho creato un oledb reader che non fa altro che una select su due viste in join. Poi ho creato appunto uno script component come destinazione.
Ho inserito tutte le colonne delle mie viste.
Nello script ho messo del codice semplice:
If (File.Exists("c:\\Reports\\ProgettoIri1.0\\TracciatoVendite.txt")) Then
System.IO.File.Delete("c:\\Reports\\ProgettoIri1.0\\TracciatoVendite.txt")
End If
Dim wr As StreamWriter
wr = File.CreateText("c:\\Reports\\ProgettoIri1.0\\TracciatoVendite.txt")
Dim str As String
str = "Pippo Pluto e paperino"
wr.Write(str)
wr.Close()
IL problema è che il mio ssis non termina. I componenti restano sempre gialli nonostante il file venga creato senza nessun problema e sia disponibile.
E' normale? Di solito doventano verdi una volta ultimati....
alx_81
Profilo
| Guru
8.814
messaggi | Data Invio:
lun 6 apr 2009 - 11:02
>IL problema è che il mio ssis non termina. I componenti restano
>sempre gialli nonostante il file venga creato senza nessun problema
>e sia disponibile.
>E' normale? Di solito doventano verdi una volta ultimati....
C'è un messagebox?
--
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
Pongo
Profilo
| Senior Member
274
messaggi | Data Invio:
lun 6 apr 2009 - 11:12
No, sta lì giallo e basta.
Adesso provo a rilanciarlo e aspettare.
POi già che ci siamo:
con row. nomecampo entro nel valore e ci lavoro, ma come faccio a ciclare tutte le righe?
La creazione del mio file di out put può stare dentro questo metodo:
Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer) ?
EDIT: se non si fosse capito non conosco VB.
alx_81
Profilo
| Guru
8.814
messaggi | Data Invio:
lun 6 apr 2009 - 11:17
>No, sta lì giallo e basta.
deve esserci qualcosa che blocca.. a meno che tu non abbia tantissime righe e allroa devi solo aspettare..
>Adesso provo a rilanciarlo e aspettare. POi già che ci siamo:
>con row. nomecampo entro nel valore e ci lavoro, ma come faccio
>a ciclare tutte le righe?
Lo fa lui nel metodo ProcessInputRow. Con questo metodo tutte le righe che arrivano all'input dello script vengono ciclate e la logica nel metodo viene applicata a tutte le righe.
>La creazione del mio file di out put può stare dentro questo
>metodo:
>Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)?
Non ha molto senso, in quanto quello è il metodo che elabora le righe.
Che ne dici invece di gestire la creazione del file nel control flow prima che inizi l'importazione?
--
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
Pongo
Profilo
| Senior Member
274
messaggi | Data Invio:
lun 6 apr 2009 - 11:25
Ok, allora adesso provo ad aspettare.
Il file lo creo con uno script prima.
Poi ho trovato i metodi Row.nextrow e Row.EndOfRowset.
Ho fatto un while not endofrowset
fai quel che devi
nextrow.
Va bene o ci sono altri metodi? In c# per l'elaborazione dei file excel facico così.
alx_81
Profilo
| Guru
8.814
messaggi | Data Invio:
lun 6 apr 2009 - 11:33
>Va bene o ci sono altri metodi? In c# per l'elaborazione dei
>file excel facico così.
Leggi attentamente questo link:
http://msdn.microsoft.com/en-us/library/ms135939.aspx
e vedrai che basta implementare il metodo.. c'è anche l'esempio per il flat file
--
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
Pongo
Profilo
| Senior Member
274
messaggi | Data Invio:
lun 6 apr 2009 - 15:05
Proprio quello che mi serviva!
Grazie della tua disponibilità Alessandro. All'inizio restava bloccato perchè la sola select delle due viste impiega 17 minuti per estarrre 60.000 righe.
Ci sono un bel po' si substring e concatenazioni. Oltre a tabelle in join da circa 6.000.000 di record. E' normale come tempo?
Ultima cosa: io in vb non sono molto skillato. E' possibile fare gli script in c#? Penso di si visto che si sono degli esempi, ma come faccio a settare il linguaggio?
Ciao.
alx_81
Profilo
| Guru
8.814
messaggi | Data Invio:
lun 6 apr 2009 - 15:20
>Grazie della tua disponibilità Alessandro. All'inizio restava
>bloccato perchè la sola select delle due viste impiega 17 minuti
>per estarrre 60.000 righe.
Di nulla!
>Ci sono un bel po' si substring e concatenazioni. Oltre a tabelle
>in join da circa 6.000.000 di record. E' normale come tempo?
Dipende da come hai normalizzato, dagli indici, da come fai le query.. sono tanti 17 minuti.. troppi direi.
>Ultima cosa: io in vb non sono molto skillato. E' possibile fare gli script in c#? Penso di si visto che si sono degli esempi,
>ma come faccio a settare il linguaggio?
Se hai SSIS 2008 sì, sennò solo VB.Net.
>Ciao.
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
Torna su
Stanze Forum
Elenco Threads
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 !