Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - DataTable senza db
Forum - C# / VB.NET - DataTable senza db

Avatar
Nikitto46 (Normal User)
Pro


Messaggi: 61
Iscritto: 27/12/2007

Segnala al moderatore
Postato alle 21:18
Domenica, 05/04/2009
Ciao a tutti i programmatori c# spero riuscite a darmi 1 aiuto come al solito ,
devo effettuare una stampa di dati che non sono inseriti nel db e utilizzo Crystal Report .
Quello che ho fatto è copiare dei dati in 1 file di testo separati da ";" e agganciare questo file di testo come origine dati in crystal report .
Considerate che i dati sono molti e che non posso inserirli nel db nel server perchè più utenti contemporaneamente devono poter lanciare la stampa e non posso creare una Tabella "fittizia" che utilizzo solo per popolarla al momento della stampa, per questo motivo ho utilizzato la tecnica del file di testo locale.
Però c'è un problema:
una colonna ha molti dati che sono solo numeri ed alcuni numeri con testo .. in automatico crystal report non considera quelle poche righe dove c'è numeri con testo in questa specifica colonna perchè è come se la considera 1 campo numerico.
Spero sono riuscito a spiegarmi .
Allora pensavo che ho 2 strade per risolvere questo problema :

1. Capire come poter far considerare a Crystal Report questo campo come alfanumerico e non solo numerico (e non ci sono riuscito)

2. Non utilizzare la tecnica del file di testo ma bensì creare un DataTable da passare come origine dati al report così il DataTable ha i campi con il tipo determinato. Però non riesco a capire come posso creare un DataTable che non è in alcun modo agganciato al db e popolarlo , da qui il titolo del post

Spero che qualcuno possa aiutarmi , vi ringrazio anticipatamente e se qualcuno non ha capito il mio problema (cosa probabile dato che credo di essere stato poco chiaro) rispondete che posso cercare di chiarirlo meglio

PM Quote
Avatar
andrea.b89 (Ex-Member)
Pro


Messaggi: 129
Iscritto: 03/03/2009

Segnala al moderatore
Postato alle 22:56
Domenica, 05/04/2009
Allora è possibilissimo creare un DataTable e lavorarci in maniera disconnessa.

Sarebbe lungo spiegare passo per passo come aggiungere righe e colonne e trattare i relativi metodi compresi gli overloading.

Mi sembri una persona capace motivo per cui ti lascio un esempio scritto appositamente per te che ti mostra come aggiungere righe, colonne e dati ad un DataTable, scritto rigorosamente in C#.

Eventualmente potrai farmi delle domande dove trovi problemi :)

Codice sorgente - presumibilmente C++

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4.  
  5. namespace DatatableEs
  6. {
  7.     class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             //creazione DataTable assegnando un nome alla tabella
  12.             DataTable dt = new DataTable("Prova01");
  13.             DataRow dr;
  14.             DataColumn dc;
  15.             //creazione di 2 colonne ID e NOME
  16.            
  17.             //creazione di una colonna ID
  18.  
  19.             dc = new DataColumn("ID");
  20.             dt.Columns.Add(dc);
  21.  
  22.             //creazione di una colonna NOME
  23.  
  24.             dc = new DataColumn("NOME");
  25.             dt.Columns.Add(dc);
  26.  
  27.             //creazione di 2 righe
  28.             dr = dt.NewRow();
  29.             dt.Rows.Add(dr);
  30.             dr = dt.NewRow();
  31.             dt.Rows.Add(dr);
  32.            
  33.             //inserimento valori
  34.  
  35.             for(int row = 0; row < dt.Rows.Count; row++)
  36.                 for (int col = 0; col < dt.Columns.Count; col++)
  37.                 {
  38.                     Console.WriteLine("Inserisci il valore della colonna [{0}]", dt.Columns[col].ColumnName);
  39.                     dt.Rows[row][col] = Console.ReadLine();
  40.                 }
  41.  
  42.             //stampa intestazioni
  43.  
  44.             for (int col = 0; col < dt.Columns.Count; col++)
  45.                 Console.Write("{0,-10}", dt.Columns[col].ColumnName);
  46.  
  47.             Console.WriteLine();
  48.  
  49.             //stampa delle righe e delle relative colonne
  50.  
  51.             for (int i = 0; i < dt.Rows.Count; i++)
  52.             {
  53.                 for (int j = 0; j < dt.Columns.Count; j++)
  54.                     Console.Write("{0,-10}",dt.Rows[i][j]);
  55.                 Console.WriteLine();
  56.             }
  57.  
  58.             Console.ReadLine();
  59.         }
  60.     }
  61. }



Spero di essere stato chiaro e di aiuto :k:

PM Quote
Avatar
Nikitto46 (Normal User)
Pro


Messaggi: 61
Iscritto: 27/12/2007

Segnala al moderatore
Postato alle 10:04
Lunedì, 06/04/2009
Grazie per la risposta ...
Allora nella schermata che mi visualizza il DataSet (il file .xsd) ho fatto tasto destro -> Aggiungi -> DataTable e ho creato il mio DataTable inserendo le varie colonne .. così nella progettazione del report posso agganciare questa origine dati e trascinare con il mouse facilmente i campi del DataTable nel report .
Nella form che mi gestisce la stampa ho scritto questo codice per popolare il DataTable

Codice sorgente - presumibilmente C# / VB.NET

  1. MioDataSet.StampaDataTable dtStampa = new MioDataSet.StampaDataTable();
  2. dtStampa.AddStampaRow(flagColore, NumerazioneRigheInStampa, TipoRiga, DataRif, Matricola);
  3. dtStampa.AcceptChanges();



e per avviare la stampa ho creato una form dove visualizzo l'anteprima di stampa

Codice sorgente - presumibilmente C# / VB.NET

  1. AnteprimaStampaDlg dlgAnteprimaStampa = new AnteprimaStampaDlg();
  2. ProvaStampa sProvaStampa = new ProvaStampa(); // il Report
  3. dlgAnteprimaStampa.crystalReportViewer.ReportSource = sProvaStampa;
  4. dlgAnteprimaStampa.ShowDialog();



ma il report è vuoto !!!

effettuando il debug dopo la riga dtStampa.AddStampaRow vedo che il dtStampa.Count viene incrementato quindi effettivamente aggiungo delle righe al DataTable ma se faccio il debug nella Load della form che mi visualizza l'anteprima il dtStampa.Count è 0 .. come se non "mantiene" i dati .. ma sicuramente sono io che sto sbagliando.
Ho pure inserito l'anteprima di stampa nella stessa form pensando che era il passaggio da form a form ma il risultato è lo stesso

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 15:25
Lunedì, 06/04/2009
Codice sorgente - presumibilmente Plain Text

  1. dlgAnteprimaStampa.crystalReportViewer.ReportSource = sProvaStampa;


Spiegami questa riga di codice, utilizzando anche i congiuntivi.

PM Quote
Avatar
Nikitto46 (Normal User)
Pro


Messaggi: 61
Iscritto: 27/12/2007

Segnala al moderatore
Postato alle 17:01
Lunedì, 06/04/2009
dlgAnteprimaStampa è la form dove ho messo il controllo crystalReportViewer che mi visualizza l'anteprima del report sProvaStampa che ho creato con CrystalReport ..

Questa riga di codice la utilizzo perchè non ho 1 unica stampa nel mio progetto e così posso cambiare il report da visualizzare in anteprima sul crystalReportViewer a runtime

Spero di essere stato chiaro , se ci sono altri dubbi ti invito a chiedere perchè è di mio interesse risolvere il problema
Grazie comunque

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 15:35
Martedì, 07/04/2009
Ora, io non sono pratico di crystal report, ma se il suddetto report lo crei la riga prima, non dovrebbe essere giustamente vuoto? In caso contrario, non si potrebbe vedere il codice del costruttore?

PM Quote
Avatar
Nikitto46 (Normal User)
Pro


Messaggi: 61
Iscritto: 27/12/2007

Segnala al moderatore
Postato alle 16:52
Martedì, 07/04/2009
ti posso confermare che funziona perchè adesso sto utilizzato un file xml e funziona .. il report anche se è creato la riga prima è formato da campi che sono collegati all'orige dati (nel mio caso il file xml che vorrei sostituire con 1 DataTable non collegato al db)

PM Quote