HOW TO: Consente di implementare una classe di supporto JOIN di DataSet in Visual C# .NET

Traduzione articoli Traduzione articoli
Identificativo articolo: 326080 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

In questo articolo viene descritto come implementare e come utilizzare una classe DataSetHelper che include codice di esempio per creare un oggetto DataTable da due o pi¨ definizioni di DataTable correlate e per copiare i record vengono ordinati e filtrati gli oggetti DataTable di origine nella destinazione DataTable .

Per effettuare questa operazione, Ŕ possibile utilizzare i seguenti metodi pubblici:
  • CreateJoinTable
  • InsertJoinInto
  • SelectJoinInto
Il metodo di SelectJoinInto chiama il CreateJoinTable e i metodi InsertJoinInto . ╚ anche possibile utilizzare un helper privati i membri di metodo e i dati per memorizzare l'elenco dei campi analizzato.

La classe di DataSetHelper include una variabile membro di DataSet . Facoltativamente, Ŕ possibile assegnare un DataSet di esistente alla variabile membro di DataSet . Se la variabile membro fa riferimento a un DataSet in valido, tutti gli oggetti DataTable il CreateJoinTable o il metodo SelectJoinInto crea vengono aggiunti al DataSet . In entrambi i casi, la chiamata al metodo restituisce un riferimento all'oggetto DataTable . Il metodo InsertJoinInto richiede una DataTable di destinazione esistente e non restituisce alcun valore.

Per ulteriori informazioni sugli oggetti DataSet , fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito:
313485INFO: Roadmap for ADO.NET DataSet, DataView e DataViewManager

Requisiti

Nell'elenco seguente sono indicati hardware, software, infrastruttura di rete e i service pack necessari:
  • Microsoft Windows XP, Windows 2000 o Windows NT 4.0 Service Pack 6a
  • Microsoft Visual Studio .NET
In questo articolo si presume la conoscenza dei seguenti argomenti:
  • Sintassi di Visual C# .NET
  • Nozioni fondamentali e sintassi di ADO.NET

Classe DataSetHelper Shell

Il codice in questa sezione dichiara la classe della shell in cui tutti gli articoli DataSetHelper aggiungere metodi e le variabili membro.
  1. Avviare Visual Studio NET..
  2. Scegliere Nuovo dal menu file , quindi progetto .
  3. Nella finestra di dialogo Nuovo progetto , fare clic su Progetti di Visual C# in Tipi progetto e scegliere Libreria di classi in modelli .
  4. Nella casella nome , digitare DataSetHelper .
  5. Sostituire il codice di classe con il codice riportato di seguito:
    public class DataSetHelper
    {
        public DataSet ds;
    
        public DataSetHelper(ref DataSet DataSet)
        {
    	ds = DataSet;
        }
        public DataSetHelper()
        {
    	ds = null;
        }
    }
    					
    Ŕ possibile utilizzare due overload del costruttore per creare un'istanza della classe con o senza un riferimento a un DataSet di valido. Per una classe che contiene un riferimento a un DataSet in valido, gli oggetti DataTable i metodi restituiscono inoltre vengono aggiunti automaticamente al DataSet .

Parser di campo elenco

In questa sezione contiene il codice per un parser di elenco del campo. La struttura analizzata viene utilizzata in modo che il CreateJoinTable e i metodi InsertJoinInto non debbano per l'elenco dei campi di analisi. Se viene chiamati dal metodo SelectJoinInto o dal proprio codice di questi metodi devono analisi l'elenco dei campi. L'elenco dei campi analizzato e l'elenco dei campi non analizzata sono memorizzati nelle variabili private di membro della classe DataSetHelper .
  1. Aggiungere la seguente definizione di classe private nella classe DataSetHelper che si Ŕ creato nella sezione "":
    private class FieldInfo
    {
        public string RelationName;
        public string FieldName;	//source table field name
        public string FieldAlias;	//destination table field name
        public string Aggregate;
    }
    					
    Nota : questa classe Ŕ comune a altri articoli DataSetHelper e contiene alcuni campi che non viene utilizzato in questo articolo.

  2. Aggiungere le seguenti variabili membro private alla definizione della classe immediatamente dopo la dichiarazione di DataSet :
    private System.Collections.ArrayList m_FieldInfo; private string m_FieldList; 
    					
  3. Aggiungere il seguente metodo private alla definizione di classe. Questo metodo Ŕ identico al metodo utilizzato in altri articoli DataSetHelper .
    private void ParseFieldList(string FieldList, bool AllowRelation)
    {
        /*
         * This code parses FieldList into FieldInfo objects  and then 
         * adds them to the m_FieldInfo private member
         * 
         * FieldList systax:  [relationname.]fieldname[ alias], ...
        */ 
        if (m_FieldList == FieldList) return;
        m_FieldInfo = new System.Collections.ArrayList();
        m_FieldList = FieldList;
        FieldInfo Field; string[] FieldParts;
        string[] Fields=FieldList.Split(',');
        int i;
        for (i=0; i<=Fields.Length-1; i++)
        {
            Field=new FieldInfo();
            //parse FieldAlias
            FieldParts = Fields[i].Trim().Split(' ');
            switch (FieldParts.Length)
            {
                case 1:
                    //to be set at the end of the loop
                    break;
                case 2:
                    Field.FieldAlias=FieldParts[1];
                    break;
                default:
                    throw new Exception("Too many spaces in field definition: '" + Fields[i] + "'.");	                        
            }
            //parse FieldName and RelationName
            FieldParts = FieldParts[0].Split('.');
            switch (FieldParts.Length)
            {
                case 1: 
                    Field.FieldName=FieldParts[0];
                    break;
                case 2:
                    if (AllowRelation==false)
                        throw new Exception("Relation specifiers not permitted in field list: '" + Fields[i] + "'.");
                    Field.RelationName = FieldParts[0].Trim();
                    Field.FieldName=FieldParts[1].Trim();
                    break;
                default:
                    throw new Exception("Invalid field definition: " + Fields[i] + "'.");
            }
            if (Field.FieldAlias==null) 
                Field.FieldAlias = Field.FieldName;
            m_FieldInfo.Add (Field);
        }
    }
    					

Metodo CreateJoinTable

In questa sezione contiene il codice per il metodo CreateJoinTable .

Le seguenti operazioni sono la convenzione di chiamata per il metodo CreateJoinTable :
dt = dsHelper.CreateJoinTable("TestTable", ds.Tables["Employees"],
    "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department");
				
l'esempio di chiamata crea un nuovo DataTable con un TableName di TabellaProva e tre campi (FName, LName e reparto). Questi tre campi avere lo stessi tipo come nome e i cognome campi della tabella Impiegati (Employees) e il campo DepartmentName nella tabella padre cui si accede tramite l'oggetto DepartmentEmployee DataRelation di dati.

Utilizzare la seguente sintassi per specificare i campi nell'elenco dei campi:
[relationname.]fieldname[ alias], ...
				
notare i seguenti per la seguente sintassi:
  • ProprietÓ DataType e il ColumnName sono le proprietÓ di sola che vengono copiate nella destinazione DataTable .
  • Per i campi contenenti un'espressione viene copiato il risultato ottenuto.
  • ╚ possibile rinominare un campo di destinazione DataTable specificando un nome di alias.
  • L'elenco di campo pu˛ contenere un sottoinsieme di nomi di campo elencati in un ordine diverso rispetto l'ordine in DataTable di origine. Se l'elenco dei campi Ŕ vuoto, viene generata un'eccezione.
  • La DataRelation deve correlare le tabelle padre. Ad esempio, se si desidera creare una tabella che combina i campi di clienti, dipendenti e le tabelle Ordini, Ŕ necessario utilizzare questa tabella come tabella di origine e fare quindi riferimento a campi nelle tabelle Impiegati e i clienti di relazioni.
Per chiamare il metodo CreateJoinTable , aggiungere il seguente metodo alla classe DataSetHelper creato nella sezione "":
public DataTable CreateJoinTable(string TableName, DataTable SourceTable, string FieldList)
{
    /*
     * Creates a table based on fields of another table and related parent tables
     * 
     * FieldList syntax: [relationname.]fieldname[ alias][,[relationname.]fieldname[ alias]]...
    */ 
    if (FieldList==null)
    {
        throw new ArgumentException("You must specify at least one field in the field list.");
        //return CreateTable(TableName, SourceTable);
    }
    else
    {
        DataTable dt = new DataTable(TableName);
        ParseFieldList(FieldList, true);
        foreach(FieldInfo Field in m_FieldInfo)
        {
            if(Field.RelationName==null)
            {
                DataColumn dc = SourceTable.Columns[Field.FieldName];
                dt.Columns.Add(dc.ColumnName, dc.DataType, dc.Expression);
            }
            else
            {
                DataColumn dc = SourceTable.ParentRelations[Field.RelationName].ParentTable.Columns[Field.FieldName];
                dt.Columns.Add(dc.ColumnName, dc.DataType, dc.Expression);
            }
        }
        if (ds!=null)
            ds.Tables.Add(dt);
        return dt;
    }
}
				

Metodo InsertJoinInto

In questa sezione contiene codice il metodo InsertJoinInto . Il metodo di InsertJoinInto copia i record vengono ordinati e filtrati dalla tabella di origine e correlate alla tabella di destinazione tabelle. Quando si chiama la proprietÓ ParseFieldList , Ŕ possibile analizzare gli elenchi che sono stati analizzati in precedenza, se questi elenchi sono disponibili. Se l'elenco dei campi Ŕ vuoto, viene generata un'eccezione.

Le seguenti operazioni sono la convenzione di chiamata per il metodo InsertJoinInto :
dsHelper.InsertJoinInto(ds.Tables["TestTable"], ds.Tables["Employees"], 
    "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department", 
    "EmployeeID<5", "BirthDate");
				
nell'esempio di chiamata copia i record di impiegati DataTable (e il campo DepartmentName di DataTable correlate) al TabellaProva DataTable , che viene filtrato in "EmployeeID < 5" ed Ŕ ordinata per data di nascita.

Nota : il filtro e le espressioni di ordinamento si applicano soltanto la tabella di origine e non a tutte le tabelle correlate.

Per chiamare il metodo InsertJoinInto , aggiungere il seguente metodo alla classe DataSetHelper creato nella sezione "":
public void InsertJoinInto(DataTable DestTable, DataTable SourceTable, 
    string FieldList, string RowFilter, string Sort)
{
    /*
    * Copies the selected rows and columns from SourceTable and inserts them into DestTable
    * FieldList has same format as CreatejoinTable
    */ 
    if (FieldList==null)
    {
        throw new ArgumentException("You must specify at least one field in the field list.");
        //InsertInto(DestTable, SourceTable, RowFilter, Sort);
    }
    else
    {
    ParseFieldList(FieldList, true);
    DataRow[] Rows = SourceTable.Select(RowFilter, Sort);
    foreach(DataRow SourceRow in Rows)
    {
            DataRow DestRow = DestTable.NewRow();
            foreach(FieldInfo Field in m_FieldInfo)
            {
                if(Field.RelationName==null)
                {
                    DestRow[Field.FieldName] = SourceRow[Field.FieldName];
                }
                else
                {
                    DataRow ParentRow = SourceRow.GetParentRow(Field.RelationName);
                    DestRow[Field.FieldName] = ParentRow[Field.FieldName];
                }
            }
            DestTable.Rows.Add(DestRow);
        }
    }
}
				

Metodo SelectJoinInto

In questa sezione contiene il codice per il metodo SelectJoinInto . Questo metodo Ŕ una combinazione del CreateJoinTable e i metodi InsertJoinInto . Il metodo SelectJoinInto consente di creare un nuovo DataTable basato su DataTable copie e gli oggetti record esistenti che vengono ordinati e filtrati in un nuovo DataTable .

Le seguenti operazioni sono la convenzione di chiamata per il metodo SelectJoinInto :
dt = dsHelper.SelectInto("TestTable", ds.Tables["Employees"], 
    "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department", "EmployeeID<5", "BirthDate");
				
chiamata esempio crea un DataTable di nome TabellaProva con tre campi. Questi tre campi sono basati sul nome e i campi di cognome della DataTable dipendenti e campo DepartmentName del DataTable viene fatto riferimento tramite la DepartmentEmployee DataRelation . Quindi in questo esempio copia i record da dipendenti DataTable TabellaProva DataTable , che viene filtrato in "EmployeeID < 5" ed Ŕ ordinata per data di nascita.

Nota : il filtro e le espressioni di ordinamento si applicano soltanto la tabella di origine e non alle tabelle correlate.

Per chiamare il metodo SelectJoinInto , aggiungere il seguente metodo alla classe DataSetHelper creato nella sezione "":
public DataTable SelectJoinInto(string TableName, DataTable SourceTable, string FieldList, string RowFilter, string Sort)
{
    /*
     * Selects sorted, filtered values from one DataTable to another.
     * Allows you to specify relationname.fieldname in the FieldList to include fields from
     *  a parent table. The Sort and Filter only apply to the base table and not to related tables.
    */ 
    DataTable dt = CreateJoinTable(TableName, SourceTable, FieldList);
    InsertJoinInto(dt, SourceTable, FieldList, RowFilter, Sort);
    return dt;
}
				

Verificare l'applicazione

  1. Salvare e quindi compilare la classe DataSetHelper creata nella sezione precedente.
  2. Attenersi alla seguente procedura per creare una nuova applicazione Windows in Visual C#:
    1. Avviare Visual Studio NET..
    2. Scegliere Nuovo dal menu file , quindi progetto .
    3. Nella finestra di dialogo Nuovo progetto , fare clic su Progetti di Visual C# in Tipi progetto e scegliere Applicazione Windows in modelli .
  3. In Esplora soluzioni, fare clic con il pulsante destro del mouse la soluzione e quindi fare clic su Aggiungi progetto esistente . Aggiungere il progetto DataSetHelper.
  4. Scegliere Aggiungi riferimento dal menu progetto .
  5. Nella finestra di dialogo Aggiungi riferimento , fare clic sulla scheda progetti e quindi aggiungere un riferimento al progetto DataSetHelper all'applicazione Windows Form.
  6. Nella finestra di progettazione form trascinare tre controlli Button e un controllo di DataGrid dalla casella degli strumenti al form. Nomi dei pulsanti btnCreateJoin , btnInsertJoinInto e btnSelectJoinInto di. Consente di mantenere il nome predefinito per il controllo DataGrid (dataGrid1).
  7. Nel codice del modulo, aggiungere la seguente istruzione Using all'inizio della finestra del codice:
    using System.Data;
    					
  8. Aggiungere le seguenti dichiarazioni di variabile alla definizione del modulo:
    DataSet ds; DataSetHelper.DataSetHelper dsHelper;
    					
  9. Aggiungere il codice riportato di seguito all'evento Form_Load :
    ds = new DataSet();
    dsHelper = new DataSetHelper.DataSetHelper(ref ds);
    //Create source tables
    DataTable dt = new DataTable("Employees");
    dt.Columns.Add("EmployeeID",Type.GetType("System.Int32") );
    dt.Columns.Add("FirstName", Type.GetType("System.String"));
    dt.Columns.Add("LastName", Type.GetType("System.String"));
    dt.Columns.Add("BirthDate", Type.GetType("System.DateTime"));
    dt.Columns.Add("JobTitle", Type.GetType("System.String"));
    dt.Columns.Add("DepartmentID", Type.GetType("System.Int32"));
    dt.Rows.Add(new object[] {1, "Tommy", "Hill", new DateTime(1970, 12, 31),  "Manager", 42});
    dt.Rows.Add(new object[] {2, "Brooke", "Sheals", new DateTime(1977, 12, 31), "Manager", 23});
    dt.Rows.Add(new object[] {3, "Bill", "Blast", new DateTime(1982, 5, 6), "Sales Clerk", 42});
    dt.Rows.Add(new object[] {1, "Kevin", "Kline", new DateTime(1978, 5, 13), "Sales Clerk", 42});
    dt.Rows.Add(new object[] {1, "Martha", "Seward", new DateTime(1976, 7, 4), "Sales Clerk", 23});
    dt.Rows.Add(new object[] {1, "Dora", "Smith", new DateTime(1985, 10, 22), "Trainee", 42});
    dt.Rows.Add(new object[] {1, "Elvis", "Pressman", new DateTime(1972, 11, 5), "Manager", 15});
    dt.Rows.Add(new object[] {1, "Johnny", "Cache", new DateTime(1984, 1, 23), "Sales Clerk", 15});
    dt.Rows.Add(new object[] {1, "Jean", "Hill", new DateTime(1979, 4, 14), "Sales Clerk", 42});
    dt.Rows.Add(new object[] {1, "Anna", "Smith", new DateTime(1985, 6, 26), "Trainee", 15});
    ds.Tables.Add(dt);
    
    dt = new DataTable("Departments");
    dt.Columns.Add("DepartmentID", Type.GetType("System.Int32"));
    dt.Columns.Add("DepartmentName", Type.GetType("System.String"));
    dt.Rows.Add(new object[] {15, "Men's Clothing"});
    dt.Rows.Add(new object[] {23, "Women's Clothing"});
    dt.Rows.Add(new object[] {42, "Children's Clothing"});
    ds.Tables.Add(dt);
    
    ds.Relations.Add("DepartmentEmployee",     ds.Tables["Departments"].Columns["DepartmentID"], 
        ds.Tables["Employees"].Columns["DepartmentID"]);
    					
  10. Aggiungere il codice riportato di seguito all'evento btnCreateJoin_Click :
    dsHelper.CreateJoinTable("EmpDept",ds.Tables["Employees"], 
        "FirstName FName,LastName LName,BirthDate,DepartmentEmployee.DepartmentName Department");
    dataGrid1.SetDataBinding(ds, "EmpDept");
    					
  11. Aggiungere il codice riportato di seguito all'evento btnInsertJoinInto_Click :
    dsHelper.InsertJoinInto(ds.Tables["EmpDept"], ds.Tables["Employees"], 
        "FirstName FName,LastName LName,BirthDate,DepartmentEmployee.DepartmentName Department",
        "JobTitle='Sales Clerk'", "DepartmentID");
    dataGrid1.SetDataBinding(ds, "EmpDept");
    					
  12. Aggiungere il codice riportato di seguito all'evento btnSelectJoinInto_Click :
    dsHelper.SelectJoinInto("EmpDept2", ds.Tables["Employees"],
        "FirstName,LastName,BirthDate BDate,DepartmentEmployee.DepartmentName Department", 
        "JobTitle='Manager'", "DepartmentID");
    dataGrid1.SetDataBinding(ds, "EmpDept2");
    					
  13. Eseguire l'applicazione e quindi fare clic su ciascuno dei pulsanti. Si noti che il DataGrid viene popolata con le tabelle e i dati dal codice.

    Nota : ╚ possibile fare clic solo sul btnCreateJoin e i pulsanti di btnSelectJoinInto una sola volta. Se si sceglie uno di questi pulsanti pi¨ volte, riceverai un messaggio di errore che si sta tentando di aggiungere la stessa tabella due volte. Inoltre, Ŕ necessario scegliere btnCreateJoin prima di scegliere btnInsertJoinInto ; in caso contrario, la destinazione DataTable non Ŕ creato. Se si fa clic sul pulsante btnInsertJoinInto pi¨ volte, Ŕ necessario popolare il DataGrid con i record duplicati.

Suggerimenti di miglioramento

  • ProprietÓ DataType e il ColumnName sono le proprietÓ di sola che vengono copiate nella destinazione DataTable . ╚ possibile estendere il metodo CreateTable per copiare le proprietÓ aggiuntive, ad esempio la proprietÓ MaxLength , oppure Ŕ possibile creare nuove colonne di chiave.
  • La proprietÓ Expression non viene copiata; al contrario, viene copiato il risultato ottenuto. Di conseguenza, non Ŕ necessario aggiungere campi a cui fa riferimento l'espressione per la tabella di destinazione. Inoltre, la colonna di destinazione pu˛ trovarsi prima nell'elenco dei risultati rispetto a qualsiasi delle colonne che questa colonna dipende in caso contrario. ╚ possibile modificare il metodo CreateTable copiare Expression (la colonna InsertInto Ignora le colonne con un' espressione ), sebbene sia soggetti alle limitazioni descritte precedentemente in questo paragrafo.
  • ╚ possibile unire le funzionalitÓ del CreateJoinTable , il InsertJoinInto e i metodi SelectJoinInto il CreateTable , il InsertInto e i metodi SelectInto . Per ulteriori informazioni sul CreateTable , il InsertInto e i metodi SelectInto , fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito:
    326009HOWTO: Consente di implementare una classe di supporto DataSet SELECT INTO in Visual C# .NET
    Se non desidera unire questi metodi, in caso di entrambi gli insiemi di metodi in una singola classe, Ŕ possibile attivare il CreateJoinTable e i metodi InsertJoinInto gestire un elenco del campo vuoto, rimuovendo le istruzioni throw e rimuovendo le chiamate a metodi InsertInto nelle seguenti righe di codice e il CreateTable :
        if (FieldList==null)
        {
            throw new ArgumentException("You must specify at least one field in the field list.");
            //return CreateTable(TableName, SourceTable);
        }
    					
    - e -
        if (FieldList==null)
        {
            throw new ArgumentException("You must specify at least one field in the field list.");
            //InsertInto(DestTable, SourceTable, RowFilter, Sort);
        }
    					

Risoluzione dei problemi

  • Parti alias dell'elenco dei campi e fieldname devono essere conforme con le convenzioni di denominazione DataColumn . Il parser limita anche i nomi, in quanto il nome non deve contenere un punto (.), una virgola (,) o uno spazio ().
  • Se si sceglie un pulsante pi¨ volte, due volte verrÓ verrÓ aggiunta al DataSet , che genera un'eccezione nella stessa tabella. Per risolvere questo problema, Ŕ possibile aggiungere codice all'applicazione di test per verificare se un DataTable dello stesso nome esiste giÓ. In alternativa, Ŕ possibile creare la classe DataSetHelper senza un riferimento a un DataSet e quindi associare la proprietÓ di DataGrid.DataSource direttamente alla variabile dt anzichÚ mediante la chiamata al metodo SetDataBinding .
  • Se la tabella di origine utilizza tipi di dati personalizzati (vale a dire una classe), Ŕ necessario aggiungere codice al metodo InsertJoinInto per eseguire una copia completa dei dati. In caso contrario, viene copiato solo un riferimento.

ProprietÓ

Identificativo articolo: 326080 - Ultima modifica: mercoledý 3 settembre 2003 - Revisione: 2.3
Le informazioni in questo articolo si applicano a:
  • Microsoft ADO.NET 1.1
  • Microsoft ADO.NET 1.0
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Chiavi:á
kbmt kbhowtomaster kbsystemdata KB326080 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 326080
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com