private void _bwEsportazione_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                MessageBox.Show(e.Error.Message);
                btnAvviaEsportazione.Text = etichettaStart;
            }
            else if (e.Cancelled)
            {
                AggiornaMessaggio("*** OPERAZIONE CANCELLATA ***");
                btnAvviaEsportazione.Text = etichettaStart;
            }
            else
            {
                WorkerDTO dto = (WorkerDTO)e.Result;
                _fasiExport       = dto.FasiExport;
                _componentiExport = dto.ComponentiExport;

                PopolaGrigliaComponenti();
                PopolaGrigliaFasi();
                PopolaGrigliaDistinte();
                PopolaGrigliaCicli();

                AggiornaMessaggio("*** OPERAZIONE COMPLETATA ***");
                pbEsportazione.Value      = pbEsportazione.Maximum;
                btnAvviaEsportazione.Text = etichettaStart;
            }
        }
        private void _bwEsportazione_DoWork(object sender, DoWorkEventArgs e)
        {
            DateTime         dataRiferimento = new DateTime(2000, 1, 1);
            BackgroundWorker worker          = sender as BackgroundWorker;
            WorkerDTO        dto             = (WorkerDTO)e.Argument;

            worker.ReportProgress(0, string.Format("Inizio esportazione componenti"));
            if (worker.CancellationPending)
            {
                e.Cancel = true;
                return;
            }

            List <string> distinte = dto.ComponentiExport.Select(x => x.DistintaPadre).Distinct().ToList();
            List <string> cicli    = dto.FasiExport.Select(x => x.CodiceCiclo).Distinct().ToList();

            int elementiTotali = distinte.Count + cicli.Count;
            int contatore      = 0;

            esportaCicli(cicli, worker, e, ref contatore);

            esportaDistinte(distinte, worker, e, ref contatore);

            e.Result = dto;
        }
        private void btnAvviaEsportazione_Click(object sender, EventArgs e)
        {
            if (btnAvviaEsportazione.Text == etichettaStart)
            {
                List <string> distinte = _componentiExport.Select(x => x.DistintaPadre).Distinct().ToList();
                List <string> cicli    = _fasiExport.Select(x => x.CodiceCiclo).Distinct().ToList();

                int elementi = distinte.Count + cicli.Count;

                if (elementi <= 0)
                {
                    MessageBox.Show("Non ci sono elementi da esportare", "ATTENZIONE", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                lblElementi.Text = elementi.ToString();

                btnAvviaEsportazione.Text = etichettaStop;

                pbEsportazione.Value = 0;
                txtEsportazione.Text = string.Empty;
                PulisciGriglie();

                if (_bwEsportazione.IsBusy != true)
                {
                    WorkerDTO dto = new WorkerDTO();
                    dto.ComponentiExport = _componentiExport;
                    dto.FasiExport       = _fasiExport;

                    _bwEsportazione.RunWorkerAsync(dto);
                    return;
                }
            }
            else
            {
                if (_bwEsportazione.WorkerSupportsCancellation == true && _bwEsportazione.IsBusy)
                {
                    // Cancel the asynchronous operation.
                    _bwEsportazione.CancelAsync();
                }
                btnAvviaEsportazione.Text = etichettaStart;
            }
        }
        private void esportaDistinte(List <string> distinte, BackgroundWorker worker, DoWorkEventArgs e, ref int contatore)
        {
            BCServices bc = new BCServices();

            bc.CreaConnessione();
            WorkerDTO dto = (WorkerDTO)e.Argument;

            foreach (string distinta in distinte)
            {
                worker.ReportProgress(contatore, string.Format(string.Empty, distinta));
                worker.ReportProgress(contatore, string.Format("Distinte {0}", distinta));

                contatore++;
                try
                {
                    TestataDIBA testata = bc.EstraiTestataDIBA(distinta);
                    if (testata != null)
                    {
                        bc.CambiaDescrizioneDB(distinta, testata.Description);
                        testata = bc.EstraiTestataDIBA(distinta);
                        if (testata.Status != Stato.InSviluppo)
                        {
                            string messaggio = string.Format("Distinta {0} ignorata perchè in stato {1}", distinta, testata.Status);
                            worker.ReportProgress(contatore, messaggio);

                            if (worker.CancellationPending)
                            {
                                e.Cancel = true;
                                return;
                            }
                            continue;
                        }

                        List <RigheDIBA> righe = bc.EstraiRigheDIBA(distinta);
                        foreach (RigheDIBA riga in righe)
                        {
                            bc.RimuoviComponente(distinta, string.Empty, riga.Line_No, riga.No, false);
                        }

                        bc.Salva();

                        int numeroRiga = 0;
                        foreach (ExpComponenteDistintaBusinessCentral c in dto.ComponentiExport.Where(x => x.DistintaPadre == distinta))
                        {
                            try
                            {
                                c.Errore = string.Empty;
                                decimal quantita       = (decimal)c.Quantita;
                                decimal scarto         = (decimal)c.Scarto;
                                decimal arrotondamento = (decimal)c.Arrotondamento;
                                numeroRiga += 1000;
                                bc.AggiungiComponente(distinta, string.Empty, numeroRiga, c.Tipo, c.Anagrafica, c.Descrizione, c.CodiceUM, quantita, c.Collegamento, scarto, arrotondamento);
                                c.Esito = "OK";
                            }
                            catch (Exception ex)
                            {
                                string messaggio = string.Format("Distinta {0} componente {1} non esportata per il seguente errore: {2}", distinta, c.Anagrafica, ex.Message);
                                {
                                    c.Errore = ex.Message;
                                    c.Esito  = "KO";
                                }
                                worker.ReportProgress(contatore, messaggio);
                            }
                        }
                        worker.ReportProgress(contatore, string.Format("Distinta {0} terminata", distinta));
                    }
                    else
                    {
                        string messaggio = string.Format("La distinta {0} non è stata trovata", distinta);
                        foreach (ExpComponenteDistintaBusinessCentral c in dto.ComponentiExport.Where(x => x.DistintaPadre == distinta))
                        {
                            c.Errore = messaggio;
                            c.Esito  = "KO";
                        }
                        worker.ReportProgress(contatore, messaggio);
                    }
                }
                catch (Exception ex)
                {
                    string messaggio = string.Format("Distinta {0} non esportata per il seguente errore: {1}", distinta, ex.Message);
                    foreach (ExpComponenteDistintaBusinessCentral c in dto.ComponentiExport.Where(x => x.DistintaPadre == distinta))
                    {
                        c.Errore = "Eccezione";
                        c.Esito  = "KO";
                    }
                    worker.ReportProgress(contatore, messaggio);
                }
                finally
                {
                    bc.CreaConnessione();
                }

                if (worker.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }
            }
        }
        private void esportaCicli(List <string> cicli, BackgroundWorker worker, DoWorkEventArgs e, ref int contatore)
        {
            BCServices bc = new BCServices();

            bc.CreaConnessione();
            WorkerDTO dto = (WorkerDTO)e.Argument;

            foreach (string ciclo in cicli)
            {
                worker.ReportProgress(contatore, string.Format(string.Empty, ciclo));
                worker.ReportProgress(contatore, string.Format("Ciclo {0}", ciclo));

                contatore++;
                try
                {
                    Cicli testata = bc.EstraiTestataCiclo(ciclo);
                    if (testata != null)
                    {
                        bc.CambiaDescrizioneCiclo(ciclo, testata.Description);

                        testata = bc.EstraiTestataCiclo(ciclo);

                        if (testata.Status != Stato.InSviluppo)
                        {
                            string messaggio = string.Format("Ciclo {0} ignorato perchè in stato {1}", ciclo, testata.Status);
                            worker.ReportProgress(contatore, messaggio);

                            if (worker.CancellationPending)
                            {
                                e.Cancel = true;
                                return;
                            }
                            continue;
                        }

                        List <RigheCICLO> righe = bc.EstraiRigheCICLO(ciclo);
                        foreach (RigheCICLO riga in righe)
                        {
                            bc.RimuoviCommento(ciclo, string.Empty, riga.Operation_No, false);
                            bc.RimuoviFase(ciclo, string.Empty, riga.Operation_No, false);
                        }
                        bc.Salva();

                        foreach (ExpFaseCicloBusinessCentral f in dto.FasiExport.Where(x => x.CodiceCiclo == ciclo).OrderBy(x => x.Operazione))
                        {
                            try
                            {
                                f.Errore = string.Empty;
                                bc.AggiungiFase(ciclo, string.Empty, f.Operazione.ToString(), f.Tipo, f.AreaProduzione, f.Task, (decimal)f.TempoSetup, f.UMSetup, f.SchedaProcesso,
                                                (decimal)f.TempoLavorazione, f.UMLavorazione,
                                                (decimal)f.TempoAttesa, f.UMAttesa, (decimal)f.TempoSpostamento, f.UMSpostamento,
                                                (decimal)f.DimensioneLotto, f.Collegamento, f.Condizione, f.LogicheLavorazione, f.Caratteristica, f.Descrizione);
                                bc.AggiungiCommento(ciclo, string.Empty, f.Operazione.ToString(), f.CommentiConcatenati());
                                f.Esito = "OK";
                            }
                            catch (Exception ex)
                            {
                                string messaggio = string.Format("Ciclo {0} operazione {1} non esportato per il seguente errore: {2}", ciclo, f.Operazione, ex.Message);
                                {
                                    f.Errore = ex.Message;
                                    f.Esito  = "KO";
                                }
                                worker.ReportProgress(contatore, messaggio);
                            }
                        }
                        worker.ReportProgress(contatore, string.Format("Ciclo {0} terminato", ciclo));
                    }
                    else
                    {
                        string messaggio = string.Format("Il ciclo {0} non è stato trovato", ciclo);
                        foreach (ExpFaseCicloBusinessCentral c in dto.FasiExport.Where(x => x.CodiceCiclo == ciclo))
                        {
                            c.Errore = messaggio;
                            c.Esito  = "KO";
                        }
                        worker.ReportProgress(contatore, messaggio);
                    }
                }
                catch (Exception ex)
                {
                    string messaggio = string.Format("Ciclo {0} non esportato per il seguente errore: {1}", ciclo, ex.Message);
                    foreach (ExpFaseCicloBusinessCentral f in dto.FasiExport.Where(x => x.CodiceCiclo == ciclo).OrderBy(x => x.Operazione))
                    {
                        f.Errore = "Eccezione";
                        f.Esito  = "KO";
                    }
                    worker.ReportProgress(contatore, messaggio);
                }
                finally
                {
                    bc.CreaConnessione();
                }

                if (worker.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }
            }
        }