Archivio per febbraio 2012

Nascondere una proprietà in datagridview – hide property in datagridview – C#

Nota: Articoli etichettati come Snippet non contengono codice completo ma solo parti di esso, recuperate da appunti. Per cui, potrebbe essere necessario modificarne alcuni nomi o indici. Per ogni chiarimento, lasciate un commento all’articolo.

Quando si effettua un binding diretto tra una IList (risultato da una query su database) di oggetti ed una Datagridview, automaticamente tutte le proprietà pubbliche della classe di cui gli oggetti fanno parte vengono visualizzate come colonne della dgv stessa.

In alcuni casi può essere necessario nascondere alcune colonne. I metodi sono due anche se personalmente preferisco il secondo.

//dgvElenco è il nome della DataGridView e “id” è la proprietà da nascondere
dgvElenco.Columns[“id”].Visible = false;  

Questo primo metodo porta l’impostazione di una colonna del controllo a visible = false e quando la uso, inserisco questo codice subito dopo la procedura di binding. In tal modo, però, la definizione di colonna “nascosta” viene portata nel codice, nella logica dell’applicazione, piuttosto che nella definizione della classe. Questa è invece la seconda strada percorribile.

[Browsable(false)]
public bool nonPersistente { get; set; }

Utilizzando l’attributo “Browsable” del namespace System.ComponentModel è possibile definire all’interno della classe stessa il “nascondimento” (!!!) della specifica proprietà

 

Annunci

,

Lascia un commento

Aggiornare la sorgente dati – Update data source fields – Crystal Reports

Situazione: Si ha un report impostato ed associato ad una fonte dati (tabella o query). E’ necessario aggiungere/modificare campi nella fonte dati e si vuole che tale variazione si rifletta sul report. In automatico, Crystal Reports non è in grado di riflettere le modifiche effettuate sulla sorgente, neanche se si utilizza il tasto “Aggiorna”.

Vi sarebbe la possibilità di disconnettere e riconnettere la fonte dati dal report, perdendo numerose impostazioni e formattazioni.

Oppure, consigliato, è sufficiente utilizzare la funzione “Verifica Database”, accessibile dal menu “Database”. In tal modo vengono aggiornati automaticamente tutti i fields ed è poi possibile importarli sul report in modo corretto.

Nella maggior parte dei casi sarà necessario inserire le credenziali di accesso al db per avviare l’aggiornamento, a meno che il vostro database manager non lo preveda (cfr: Microsoft Access).

, ,

Lascia un commento

Visualizzare le query effettuate da un report Crystal Reports e da tutti i suoi sottoreport

Nota: Articoli etichettati come Snippet non contengono codice completo ma solo parti di esso, recuperate da appunti. Per cui, potrebbe essere necessario modificarne alcuni nomi o indici. Per ogni chiarimento, lasciate un commento all’articolo.

Per visualizzare le query esatte che un report .rpt (creato in Crystal Reports) e tutti i suoi sottoreport generano sul database è sufficiente utilizzare all’interno dell’applicazione (Visual Basic 6, nello specifico), il seguente codice.

Nota: questo snippet è utile qualora non si disponga dell’accesso ai log del DBMS o esso non li generi (es: DB Access).

Private Sub cmdAnteprimaLibretto_Click()
Dim crAPP As CRAXDRT.Application
Dim myReport As CRAXDRT.Report
On Error GoTo err_cmdAnteprimaLibretto_Click
   
    Set crAPP = New CRAXDRT.Application
    Set myReport = crAPP.OpenReport(gen.rptLibretto)
    myReport.DiscardSavedData
    myReport.FormulaSyntax = 0
    myReport.RecordSelectionFormula = “{0Frontespizio.Matricola} = ‘” + gen.personaAttiva.Matricola
    myReport.ParameterFields.GetItemByName(“versioneApp”).AddCurrentValue gen.versioneApp
    
    ‘STAMPA DELLA QUERY PRINCIPALE <<<<<<<<
    Debug.Print myReport.SQLQueryString
    
    Dim crxSections As CRAXDRT.Sections
    Dim crxSection As CRAXDRT.Section
    Dim CRXReportObject As Object
    Dim crxSubreportObject As SubreportObject
    Dim crxSubreport As CRAXDRT.Report
     
    Set crxSections = myReport.Sections
    For Each crxSection In crxSections
        For Each CRXReportObject In crxSection.ReportObjects
           If CRXReportObject.Kind = crSubreportObject Then
             Set crxSubreportObject = CRXReportObject
             Set crxSubreport = crxSubreportObject.OpenSubreport
             ‘STAMPA DELLA SOTTOQUERY <<<<<<<<
             Debug.Print crxSubreport.SQLQueryString
             Set crxSubreport = Nothing
           End If
        Next
    Next

    Set myReport = Nothing
    Set crAPP = Nothing
    Exit Sub

err_cmdAnteprimaLibretto_Click:
    errDescr = Err.Description
    Set myReport = Nothing
    Set crAPP = Nothing
    MsgBox “Problemi durante la visualizzazione del documento” + vbCrLf + errDescr, vbCritical, gen.titolo
End Sub

, ,

Lascia un commento

Passare il contenuto di un file in standard input -stdin- ad un’applicazione

Qualche tempo fa, quando il DOS e la riga di comando la facevano ancora da padrone, era frequente l’uso del reindirizzamento dello standard input/output/error (stdin, stdout, stderr) per passare il contenuto di un file ad un applicativo e farlo elaborare.

Mi capita ancora di utilizzare questa tecnica con i tool da riga di comando del database MySql.

Per esempio, per importare un dump o uno script sql in un db, è sufficiente digitare (da cmd.exe) il seguente testo

mysql -h 192.168.1.1 -u user -ppwd dbname < C:\updateDb.sql

Questo fa si che lo script contenuto nel file updateDb.sql venga interpretato dal mysql come se immesso a mano da tastiera.

Qualche giorno fa, invece, ho avuto la necessità di automatizzare questo processo all’interno di un’applicazione C#.

Di seguito riporto il codice utilizzato ed al suo interno i commenti necessari

            //Aggiornamento db
            try
            {               
                FileInfo file = new FileInfo(Config.sqlUpdateScript); //sqlUpdateScript è il percorso di updateDb.sql
                if (file.Exists)
                {

                    //Config.applicazioneDbUpdate rappresenta il file dell’applicazione da eseguire: mysql.exe
                    ProcessStartInfo appDump = new ProcessStartInfo(Config.applicazioneDbUpdate);
                    appDump.WindowStyle = ProcessWindowStyle.Hidden;
                    appDump.UseShellExecute = false;
                    appDump.RedirectStandardError = true;
                    appDump.RedirectStandardOutput = true;
                    appDump.RedirectStandardInput = true;
                    //Le credenziali vengono passate come stringhe e concatenate da string.Format
                    appDump.Arguments = string.Format(“-h {0} -u {1} -p{2} {3}”, server, userid, password, database);
                    Process p = Process.Start(appDump);

                    //Apro lo StreamReader verso il file di script sql
                    using (var streamReader = new StreamReader(Config.sqlUpdateScript))
                    {
                       //QUESTA E’ LA PARTE PRINCIPALE: passo il file allo StandardInput del processo “p”
                        p.StandardInput.Write(streamReader.ReadToEnd());
                        p.StandardInput.Flush();
                        p.StandardInput.Close();
                    }

                   //Verifico eventuali output del programma o messaggi di errore
                    string output = p.StandardOutput.ReadToEnd();   //Lettura prima di WaitForExit, altrimenti si blocca
                    string outerr = p.StandardError.ReadToEnd();
                    p.WaitForExit(60000); //60 secondi

                    if (p.ExitCode != 0)
                    {
                        //LogMe.log(…) è un metodo di una -mia- classe di log
                        LogMe.log(LogLevel.Error, outerr);
                        LogMe.log(LogLevel.Error, appDump.Arguments);
                        MessageBox.Show(“Impossibile completare il backup\n” + outerr, Config.titolo, MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return false;
                    }
                }
                else
                {
                    LogMe.log(LogLevel.Error, “Script di aggiornamento non trovato!”);
                    MessageBox.Show(“Script di aggiornamento non trovato!\nAggiornamento non riuscito.”, Config.titolo, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }
            }
            catch (Exception exe)
            {
                LogMe.log(LogLevel.Error, exe);
                MessageBox.Show(“Errore generico\n” + exe.Message, Config.titolo, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

, , ,

Lascia un commento