Creare flusso dati in txt

domenica 08 giugno 2008 - 14.23

Mau67 Profilo | Expert

Salve, ho costruito un applicazione in visual studio 2005 e il database in SQLserver2005, adesso dovrei
generare un flusso dati in un unico file txt di alcune tabelle in base al parametro codice fiscale per inviarlo
ad altra azienda in caso di trasferimento del dipendente e quindi permettere all'azienda che riceve il
dipendente, di poter caricarsi i dati dal flusso inviato.

Unico problema in fase di caricamento dei dati il programme deve controllare se quel codice fiscale è
già presente o meno, se è gia presente deve modificare i dati già esistenti e aggiungere quelli che
mancano.
Se non esiste aggiungere tutti i dati nelle varie tabelle.

Non ho alcun idea di come fare se qualcuno gentilmente può aiutarmi ne sarei immensamente grato.

Ciao e grzie in anticipo.
Mau67

alx_81 Profilo | Guru

>Salve,
Ciao!

>Non ho alcun idea di come fare se qualcuno gentilmente può aiutarmi
>ne sarei immensamente grato.
Che edizione di SQL Server hai?
Perchè in teoria si può fare tutto coi SSIS, e quindi generare i file di testo, spedirli e ricaricarli..
Però hai anche altre soluzioni, come ad esempio fare direttamente la generazione del file da codice, usare la bcp utility, ecc..

Quella che tu definisci "altra azienda" è sempre sullo stesso database vero? Si tratta di una update di un id/codice oppure devi inviare fisicamente i file ad un'azienda la quale poi caricherà sul suo database il dipendente? E quindi, il database è centralizzato o è distribuito sulle tue aziende?
Mi sfugge qualcosa..

>Ciao e grzie in anticipo.
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

Mau67 Profilo | Expert

Il server è SqlServer2005, il programma è uguale per tutte le aziende e lavora in locale e quindi il trasferimento dei dati deve avvenire tramite flusso.

Cioè io trasferisco il dipendente genero il flusso txt con un button prendendo i dati da circa 4 o 5 tabelle, invio il flusso tramite email l'altra azienda tramite button carica i dati.

Grazie
Mau67

alx_81 Profilo | Guru

>Il server è SqlServer2005,
forse non mi sono spiegato, mi serve l'edizione, quindi Standard, Express, ecc..
In base a quello possiamo seguire soluzioni diverse

>Cioè io trasferisco il dipendente genero il flusso txt con un
>button prendendo i dati da circa 4 o 5 tabelle, invio il flusso
>tramite email l'altra azienda tramite button carica i dati.
Questa parte manca interamente?
--

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

Mau67 Profilo | Expert

Scusa

SQL server 2005 express
Mau67

alx_81 Profilo | Guru

>SQL server 2005 express
questo cambia tutto

Allora, obbligati ad abbandonare la soluzione SSIS, dobbiamo agire programmaticamente.
L'esportazione su TXT te la puoi fare in vari modi:

- utilizzando il namespace System.IO e produrre l'output desiderato ciclando sul resultset ottenuto da una select su tabella (magari una stored procedure ).
- lanciando la bcp utility (http://msdn.microsoft.com/en-us/library/ms162802.aspx) e definendo un Format File di output (http://msdn.microsoft.com/en-us/library/ms191516.aspx)

Anche l'importazione può utilizzare i suddetti metodi.. Nel primo caso apri uno streamreader per leggere riga per riga e importare i dati e nel secondo caso puoi usare la bcp per importare i dati direttamente su database.

Forse seguendo la prima, puoi farti tutto lato applicativo e più "programmatico". Si tratterebbe di due pulsanti IMPORTA ed ESPORTA.
Per quanto riguarda l'inserimento "differenziale" (inserimento nuovi e aggiornamento vecchi) ti consiglio di farti una stored procedure (visto che agirai record per record) che prima di inserire utilizza la funzione EXISTS di SQL Server per controllare l'effettiva esistenza del record. Se c'è già aggiorni le informazioni, se non c'è inserisci.

EXISTS (transact-SQL)
http://msdn.microsoft.com/en-us/library/ms188336.aspx

Qui la usa nella WHERE, ma tu puoi usarla anche come condizione di una IF.

Attenzione anche alla sorgente dalla quale esporti i dati, come devi gestirli? devi cancellarli? In tal caso (e ti consiglio una cancellazione logica, e quindi un flag che lo segni come cancellato ma che non lo elimini veramente) devi farti una stored procedure alla fine dell'esportazione, che segni l'elenco dei record esportati come "cancellati".


--

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

Mau67 Profilo | Expert

Grazie
Ma per me sono paroloni, programmo da poco, e non so da dove cominciare ti creerei dei problemi se mi aiutassi nel codice e se mi indirizzassi dove scriverlo?

Grazie
Mau67

alx_81 Profilo | Guru

>Ma per me sono paroloni, programmo da poco, e non so da dove
>cominciare ti creerei dei problemi se mi aiutassi nel codice
>e se mi indirizzassi dove scriverlo?
Non mi creeresti problemi, ma forse sarebbe meglio che ti mettessi a studiarci un pochino su . E lo dico per te non perchè non voglio darti un aiuto.
Comunque posso aiutarti, ma prima dimmi in che linguaggio ti servirebbe, C# o VB.Net?
Poi ti passo una semplicissima applicazione che fa export ed import, ok? Ovviamente dovrai fare tu le stored procedure, e ti potrò aiutare anche per quello, ma procediamo per gradi. Prima cosa, definiamo il linguaggio di programmazione e poi facciamo una semplice applicazione per esportare un file di testo ed importarlo su db.
Magari, allegami la CREATE di una delle tabelle che devi esportare e qualche insert, per utilizzare gli stessi oggetti.

La risposta non sarà immediata, ti avverto subito

>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

Mau67 Profilo | Expert

Grazie della disponibilità

linguaggio vb.net 2005
Mau67

alx_81 Profilo | Guru

>linguaggio vb.net 2005
mi passi anche la create e la insert di una tabella?

--

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

Mau67 Profilo | Expert

scusa non so se ho capito, comunque la tabella è "Anagrafica" il Campo ID è "CodiceFiscale" e le altre
tabelle che devo usare per l'esportazione hanno tutte come parametro "CodiceFiscale".

Era questo quello che volevi?
Mau67

alx_81 Profilo | Guru

>scusa non so se ho capito, comunque la tabella è "Anagrafica"
>il Campo ID è "CodiceFiscale" e le altre
>tabelle che devo usare per l'esportazione hanno tutte come parametro
>"CodiceFiscale".
>
>Era questo quello che volevi?
No .
Allora, apri SQL Server Management Studio, e poi scendi la treeview fino ad arrivare alla tua tabella, poi destro --> Script table as --> New Window


691x485 22Kb


>Mau67

--

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

Mau67 Profilo | Expert

Scusa stò istallando SQL Server Management Studio ci aggiorniamo appena fatto

intanto grazie
Mau67

Mau67 Profilo | Expert

Ecco il codice che ho trovato:

USE [C:\PROGRAMMI\TRATECO\TABELLE.MDF]
GO
/****** Object: Table [dbo].[Anagrafica] Script Date: 06/08/2008 18:08:20 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Anagrafica](
[CodiceFiscale] [varchar](16) COLLATE Latin1_General_CI_AS NOT NULL,
[Categoria] [varchar](20) COLLATE Latin1_General_CI_AS NULL,
[Grado] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
[Cognome] [varchar](30) COLLATE Latin1_General_CI_AS NULL,
[Nome] [varchar](30) COLLATE Latin1_General_CI_AS NULL,
[LuogoNascita] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
[ProvNascita] [varchar](2) COLLATE Latin1_General_CI_AS NULL,
[DataNascita] [smalldatetime] NULL,
[Indirizzo] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
[Comune] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
[ProvResidenza] [varchar](2) COLLATE Latin1_General_CI_AS NULL,
[Cap] [varchar](5) COLLATE Latin1_General_CI_AS NULL,
[DataArruolamento] [smalldatetime] NULL,
[DataCongedo] [smalldatetime] NULL,
[DataRiarrulamento] [smalldatetime] NULL,
[DataArrulamentoViertuale] [smalldatetime] NULL,
[Banca] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
[Agenzia] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
[IndirizzoBanca] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
[Città] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
[CapBanca] [varchar](5) COLLATE Latin1_General_CI_AS NULL,
[Paese] [varchar](2) COLLATE Latin1_General_CI_AS NULL,
[CinEur] [varchar](2) COLLATE Latin1_General_CI_AS NULL,
[Abi] [varchar](5) COLLATE Latin1_General_CI_AS NULL,
[Cab] [varchar](5) COLLATE Latin1_General_CI_AS NULL,
[Cin] [varchar](1) COLLATE Latin1_General_CI_AS NULL,
[CC] [varchar](12) COLLATE Latin1_General_CI_AS NULL,
[Sospendi] [varchar](2) COLLATE Latin1_General_CI_AS NULL,
[DataAssegnazione] [smalldatetime] NULL,
[Ente] [varchar](max) COLLATE Latin1_General_CI_AS NULL,
[NominaUfficiale] [smalldatetime] NULL,
[NominaVirtualeUfficiale] [smalldatetime] NULL,
[DecorrenzaLavagnini] [smalldatetime] NULL,
[AnniNu] [int] NULL,
[MesiNu] [int] NULL,
[GiorniNu] [int] NULL,
[AnniCa] [int] NULL,
[MesiCa] [int] NULL,
[GiorniCa] [int] NULL,
[AnniSc] [int] NULL,
[MesiSc] [int] NULL,
[GiorniSc] [int] NULL,
[AnniAl] [int] NULL,
[MesiAl] [int] NULL,
[GiorniAl] [int] NULL,
[AnniPa] [int] NULL,
[MesiPa] [int] NULL,
[GiorniPa] [int] NULL,
[AnniMu] [int] NULL,
[MesiMu] [int] NULL,
[GiorniMu] [int] NULL,
[AnniServ] [int] NULL,
[MesiServ] [int] NULL,
[GiorniServ] [int] NULL,
[DataServ] [smalldatetime] NULL,
CONSTRAINT [PK_Anagrafica] PRIMARY KEY CLUSTERED
(
[CodiceFiscale] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
Mau67

alx_81 Profilo | Guru

Ok, ti ho allegato un'applicazione di prova..
cerca di estrarre quanto ti serve e di capire i meccanismi..

Per aprirla, fai doppio click sul file sln, ti si aprirà con VS2005..
ciao!

ti allego anche le stored procedure che dovrai cambiare come ti servono:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

CREATE PROCEDURE dbo.proc_LeggiAnagrafica ( @CodiceFiscale varchar(16) ) AS BEGIN SET NOCOUNT ON; SELECT CodiceFiscale , Categoria , Grado , Cognome , Nome , LuogoNascita , ProvNascita , DataNascita , Indirizzo , Comune , ProvResidenza , Cap , DataArruolamento , DataCongedo FROM dbo.Anagrafica WHERE CodiceFiscale = @CodiceFiscale END
--

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

Mau67 Profilo | Expert

Grazie del tuo prezzioso aiuto domani lo provo e poi ti faccio sapere.

Ciao e ancora grazie
Mau67

Mau67 Profilo | Expert

Ciao il tuo aiuto è stato prezioso riesco ad esportare i dati in formato txt è fantastico, c'è solo un problema anzi due in fase di importazione dei dati:

1) Mi solleva un eccezione dei valori nulli e non riesco a gestirli ci ho provato ma non ci riesco,

2) Mi solleva un eccezzione anche senza valori nulli.

Ti allego un file in word dove vedi le eccezzioni che mi solleva per entrambi i problemi.

Grazie e ancora aiuto!

Ciao


Mau67

alx_81 Profilo | Guru

>1) Mi solleva un eccezione dei valori nulli e non riesco a gestirli
>ci ho provato ma non ci riesco,
>
>2) Mi solleva un eccezzione anche senza valori nulli.
>
>Ti allego un file in word dove vedi le eccezzioni che mi solleva
>per entrambi i problemi.
Intanto, ti allego il file che ho usato per l'importazione. Così vedi come è formattato il file.
Poi, per risolvere il secondo problema, devi utilizzare il metodo String.IsNullOrEmpty(valore) che torna true se è vuoto o nullo il valore che gli passi (quello che leggi dal file quindi). Nel caso in cui tu abbia un valore nullo, puoi inserire nel database il valore DBNull.Value oppure un default (consigliato, ad esempio per le date 19000101, per gli interi -1, ecc).
L'eccezione indicata nel primo caso, è perchè il file non ha l'esatto numero di colonne e quindi quando splitti per il carattere "|" non ricavi l'esatto numero di colonne. Ricorda che servono TUTTE, io ne ho indicate solo alcune. Ad esempio, se valorizzi solo i primi tre campi, avrai:

aaa|aaa|aa|||||||||||||||||||... fino al numero effettivo delle colonne.

>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

Mau67 Profilo | Expert

Ti chiedo ancora aiuto perchè la gestione dei valori nulli non riesco a venirne fuori, soprattutto con i campi data.

Aiutami grazie
Mau67

alx_81 Profilo | Guru

>Ti chiedo ancora aiuto perchè la gestione dei valori nulli non
>riesco a venirne fuori, soprattutto con i campi data.
Allora, tutto ciò che leggi dal file, tramite lo streamreader è una STRINGA all'inizio.
Di conseguenza, prima di assegnare il valore all'elemento tipizzato della classe (ad esempio la data di congedo) devi controllare se la stringa è NULL o blank (stringa vuota).
Il metodo String.IsNullOrEmpty fa al caso tuo:

String.IsNullOrEmpty() Method
http://msdn.microsoft.com/en-us/library/system.string.isnullorempty.aspx

Di conseguenza ti devi mettere nel metodo GetRow che ti ho scritto nella classe e controllare cosa hai letto prima di assegnare il valore alla classe. Qui ti indico un paio di righe di codice che gestiscono la colonna Grado, la Cognome, la Categoria e la DataNascita.
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Come vedi creo variabili di appoggio inizializzate ad un valore di DEFAULT e le rivalorizzo solo se la stringa che leggo è effettivamente valorizzata.
Inoltre ti allego il file nuovo usato per l'importazione.

Ciao!

>Aiutami grazie
Provaci di più, che questo era uno scoglio sormontabile
--

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

Mau67 Profilo | Expert

Funziona perfettamente grazie.

Ultima cosa, come ti ho detto all'inizio del post io devo esportare più tabelle e quindi con la procedura che mi hai scritto posso esportare una tabella alla volta!
mi chiedevo se si può creare un form come quello allegato dove in automatico carica il nome delle tabelle e con il tasto esporta le esporta in sequenza avendo anche una grafica simile, anche per l'importazione usare lo stesso metodo in automatico?
Se come al solito mi dai una mano è l'ultima cosa che ti chiedo e poi il progetto è finito

Ti ringrazio immensamente
Mau67

alx_81 Profilo | Guru

>Funziona perfettamente grazie.
>
>Ultima cosa, come ti ho detto all'inizio del post io devo esportare
>più tabelle e quindi con la procedura che mi hai scritto posso
>esportare una tabella alla volta!
>mi chiedevo se si può creare un form come quello allegato dove
>in automatico carica il nome delle tabelle e con il tasto esporta
>le esporta in sequenza avendo anche una grafica simile, anche
>per l'importazione usare lo stesso metodo in automatico?
Eh.. la cosa si complica..
per farlo dinamicamente c'è da cambiare tutto.

Anche perchè non puoi sapere quante tabelle devi esportare importare e nemmeno quale sia il db..
Se l'elenco delle tabelle è statico PER SEMPRE puoi farti le tue classi, una per tabella.. ma non lo farei.. MAI

Piuttosto, ti consiglio di lavorare con SMO, e interrogare gerarchicamente l'oggetto SERVER, la collection DATABASES e la collection TABLES.
Così puoi listare tutte le tabelle su di una interfaccia:

Creating SMO Programs
http://msdn.microsoft.com/en-us/library/ms162202.aspx

Poi ti segnalo una classe che ho scritto su un post nel blog:
http://blogs.dotnethell.it/suxstellino/Classe-Sql-Server-Management-Objects-SMO-per-la-gestione-degli-oggetti-di-un-database__11662.aspx

Quando hai la lista delle tabelle, in base a quelle scelte puoi accedere alla collection delle COLUMNS puoi crearti il mapping di import export e l'eventuale statement SQL per l'esportazione.. Non è facile, anche perchè stai cercando di riscrivere l'Import Export Wizard, che già c'è su SQL Server a partire dalal versione Workgroup..
Quindi in realtà, questo è un enorme passo, ti devi studiare SMO e scrivere un vero e proprio programma per creare dinamicamente import ed export.
In alternativa, hai anche la bcp utility, come ti indicavo nei primi post. Puoi pensare di lanciare quella, se non vuoi usare SMO..

>Ti ringrazio immensamente
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
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