public override void LastAction(ref DBHelper2 cm, DBHelper2 sage)
        {
            //
            //controllo che gli OPR siano associati a ODV aperti
            //

            string chk_query = @"SELECT OPR.[C_CODE]
      ,OPR.[C_CORDER_CODE]
      ,OPR.[C_ITEM_CODE]
	  ,SOH.C_CODE
  FROM [CyberPlanFrontiera].[dbo].[CYB_ORDER] OPR
  full join [CyberPlanFrontiera].[dbo].[CYB_CORDER] SOH
  on OPR.C_CORDER_CODE= SOH.C_CODE
  where (OPR.C_CODE like 'OPR%' or OPR.C_CODE like 'ODP%') and OPR.C_CORDER_CODE not like '000000000000' and SOH.C_CODE is null ";

            string       testo_mail = "";
            DbDataReader dtr        = cm.GetReaderSelectCommand(chk_query);

            object[] row = new object[dtr.FieldCount];

            while (dtr.Read())
            {
                dtr.GetValues(row);
                testo_mail += "OPR =" + getDBV <string>(row[0], "C_CODE") + "  ODV =" + getDBV <string>(row[1], "C_CORDER_CODE") + "  articolo " + getDBV <string>(row[2], "C_ITEM_CODE") + "; OPR aperto con ordine di vendita non presente (forse già chiuso)" + Utils.NewLineMail();
            }



            //
            //controllo che gli OPR abbiano codici presenti in anagrafica articoli
            //

            chk_query = @"SELECT OPR.[C_CODE]
              ,OPR.[C_CORDER_CODE]
              ,OPR.[C_ITEM_CODE]
	          ,ITM.[C_CODE]
              FROM[CyberPlanFrontiera].[dbo].[CYB_ORDER] OPR
              left join[CyberPlanFrontiera].[dbo].[CYB_ITEM] ITM
              on OPR.[C_ITEM_CODE]= ITM.C_CODE
              where OPR.C_CODE like 'OPR%' --and OPR.C_CORDER_CODE not like '000000000000' 
              and ITM.[C_ITEM_GROUP] not like '__TOOL__'
              and ITM.C_CODE is null ";

            dtr.Close();
            dtr = cm.GetReaderSelectCommand(chk_query);
            row = new object[dtr.FieldCount];

            while (dtr.Read())
            {
                dtr.GetValues(row);
                testo_mail += "OPR =" + getDBV <string>(row[0], "C_CODE") + "  ODV =" + getDBV <string>(row[1], "C_CORDER_CODE") + "  articolo " + getDBV <string>(row[2], "C_ITEM_CODE") + "; OPR aperto con articolo non rilasciato" + Utils.NewLineMail();
            }


            //
            //invio mail
            //

            Utils.SendMail_Plan(Settings.GetSettings(), testo_mail, "OPR");
        }
예제 #2
0
        static public void GetFileImport_YMFG_Sage()
        {
            string    libreriaAs400 = "MBM41LIB_M";
            DBHelper2 sage          = DBHelper2.getAs400DBHelper(libreriaAs400);

            _logger.Debug(System.Reflection.MethodBase.GetCurrentMethod().Name + " start...");

            string       qry = GetSelectQuery_opr_CON_ODV(libreriaAs400);
            DbDataReader dtr = sage.GetReaderSelectCommand(qry);

            object[] row = new object[dtr.FieldCount];
            OrdiniAcq_OPR_As400_FIRSTIMPORT opr = null;

            string pathfile = @"\\srvx3app1\S$\Sage\SAGEX3\folders\SAURO\YSAURO\IMPEXP\Import_Iniziale_OPR_Da_As400_CON_ODV.txt";

            pathfile = @"Import_Iniziale_OPR_Da_As400_CON_ODV.txt";
            using (System.IO.StreamWriter fs = new System.IO.StreamWriter(pathfile, false))
            {
                while (dtr.Read())
                {
                    opr = new OrdiniAcq_OPR_As400_FIRSTIMPORT();
                    dtr.GetValues(row);
                    opr.Init(row);
                    fs.Write(opr.getSageImportString());
                }
            }
            dtr.Close();


            qry = GetSelectQuery_opr_SENZA_ODV(libreriaAs400);
            dtr = sage.GetReaderSelectCommand(qry);
            row = new object[dtr.FieldCount];
            opr = null;

            pathfile = @"\\srvx3app1\S$\Sage\SAGEX3\folders\SAURO\YSAURO\IMPEXP\Import_Iniziale_OPR_Da_As400_SENZA_ODV.txt";
            pathfile = @"Import_Iniziale_OPR_Da_As400_SENZA_ODV.txt";
            using (System.IO.StreamWriter fs = new System.IO.StreamWriter(pathfile, false))
            {
                while (dtr.Read())
                {
                    opr = new OrdiniAcq_OPR_As400_FIRSTIMPORT();
                    dtr.GetValues(row);
                    opr.Init(row);
                    fs.Write(opr.getSageImportString());
                }
            }
            dtr.Close();

            _logger.Debug(System.Reflection.MethodBase.GetCurrentMethod().Name + " end");
            return;
        }
        static private Dictionary <string, decimal> Init_List_AccantonamentiRigheORV(string libreria)
        {
            Dictionary <string, decimal> ret = new Dictionary <string, decimal>(1500);

            string __libreriaAs400 = libreria;
            string _tabORR         = __libreriaAs400 + ".ORR00PF";
            string _tabORV         = __libreriaAs400 + ".ORV00PF";

            //recupero totali accantonamenti per ogni articolo presente in ORR
            string query = "SELECT "
                           + _tabORR + ".ORRCART, Sum( " + _tabORR + ".ORRQACA) AS QTAALLOC "
                           + " FROM " + _tabORR
                           + " WHERE " + _tabORR + ".ORRSTAT ='RI' "
                           //+ " and " + _tabORR + ".ORRTORD<>'ORC' "
                           + " and " + _tabORR + ".ORRCART not like 'WU%'    \n"
                           + " GROUP BY ORRCART "
                           + " HAVING Sum(" + _tabORR + ".ORRQACA)<>0 "
                           + " order by  ORRCART ";

            DBHelper2    db  = DBHelper2.getAs400DBHelper(libreria);
            DbDataReader dtr = db.GetReaderSelectCommand(query);

            object[] row = new object[dtr.FieldCount];

            while (dtr.Read())
            {
                dtr.GetValues(row);
                ret.Add(Item.GetDBV <string>(row[0], "ORRCART"), Item.GetDBV <decimal>(row[1], "Sum(ORRQACA)"));
            }
            return(ret);
        }
예제 #4
0
        public static int?GetMinTaskNumber()
        {
            int?task_number = null;

            string qry =
                @"      select * from (select top 1 TASK_NUMBER from [CyberPlanFrontiera].[dbo].EXP_CORDER order by TASK_NUMBER asc) A
union select * from (select top 1 TASK_NUMBER from [CyberPlanFrontiera].[dbo].EXP_ORDER order by TASK_NUMBER asc) B
union select * from (select top 1 TASK_NUMBER from [CyberPlanFrontiera].[dbo].EXP_OPERATION order by TASK_NUMBER asc) C
union select * from (select top 1 TASK_NUMBER from [CyberPlanFrontiera].[dbo].EXP_DEMAND order by TASK_NUMBER asc) D ";



            DBHelper2    db  = DBHelper2.getCyberDBHelper();
            DbDataReader dtr = db.GetReaderSelectCommand(qry);

            object[] row = new object[dtr.FieldCount];

            if (dtr.HasRows)
            {
                while (dtr.Read())
                {
                    dtr.GetValues(row);
                    task_number = (int)row[0];
                    _logger.Debug(System.Reflection.MethodBase.GetCurrentMethod().Name + " Refresh min task number=" + task_number);
                    break;
                }
            }
            else
            {
                _logger.Debug(System.Reflection.MethodBase.GetCurrentMethod().Name + " task number = null");
            }
            dtr.Close();
            return(task_number);
        }
예제 #5
0
        public string WriteToFile(string dossier, int taskNumberToExport) //where T : ExportItem, new()
        {
            _logger.Debug(this.GetType().Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + " dossier=" + dossier + " NrTask=" + taskNumberToExport.ToString() + "    start...");
            string pathfile  = null;
            string startedAt = DateTime.Now.ToString();

            //_logger.Debug("Oggetto: " + this.GetType().ToString());

            string       qry = GetSelectQuery(taskNumberToExport);
            DbDataReader dtr = _db.GetReaderSelectCommand(qry);

            object[] row = new object[dtr.FieldCount];

            int i = 0;

            if (dtr.HasRows)
            {
                string timing = string.Format("{0:yyMMdd_hhmmss}", System.DateTime.Now);
                //pathfile = @"S:\Sage\SAGEX3\folders\" + dossier + @"\YSAURO\IMPEXP\MRP\" + _file_prefix + "_task" + _task_number + "_" + timing + ".txt";
                pathfile = @"\\srvx3app1\S$\Sage\SAGEX3\folders\" + dossier + @"\YSAURO\IMPEXP\MRP\" + _file_prefix + "_task" + taskNumberToExport + "_" + timing + ".txt";
                using (System.IO.StreamWriter fs = new System.IO.StreamWriter(pathfile, false))
                {
                    while (dtr.Read())
                    {
                        i++;
                        dtr.GetValues(row);
                        Init(row);
                        fs.WriteLine(getSageImportString());
                        //_logger.Info(i + " items... [" + tmp.GetID() + "]");
                    }
                }
            }
            dtr.Close();


            //if (thereIsMessage)
            //{
            //    Utils.SendMail("*****@*****.**", "*****@*****.**", message_error);
            //    //Utils.SendMail("*****@*****.**", "[email protected],[email protected]", message_error);
            //}
            if (pathfile == null)
            {
                _logger.Info(this.GetType().Name + " TaskNumber=" + taskNumberToExport + " - nulla da esportare");
            }
            else
            {
                _logger.Info("TaskNumber=" + taskNumberToExport + " - esportato file " + pathfile);
            }

            _logger.Debug(this.GetType().Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "  end");
            return(pathfile);
        }
예제 #6
0
        static private void FinalCheck_Ordini_di_Articoli_senza_cicli()
        {
            DBHelper2 db      = DBHelper2.getCyberDBHelper();
            string    command = @"  Select C_CODE,C_CORDER_CODE,C_ITEM_CODE,C_M_B --,ope.C_OPNUM, ope.C_USER_STRING01 AS Attrezzatura, ope.C_USER_STRING02 as Macchina
  from [CyberPlanFrontiera].[dbo].[CYB_ORDER] od
  left join [CyberPlanFrontiera].[dbo].[CYB_OPERATION] ope
  on od.C_CODE = ope.C_ORDER_CODE
  where C_M_B in ('M','D') and ope.C_OPNUM is null 
  order by C_ITEM_CODE ";


            _logger.Info("start execution");

            string       testo_mail = "";
            DBHelper2    cyber      = DBHelper2.getCyberDBHelper();
            DbDataReader dtr        = cyber.GetReaderSelectCommand(command);

            object[] row = new object[dtr.FieldCount];

            string prec_articolo = "";
            string articolo      = "";

            while (dtr.Read())
            {
                dtr.GetValues(row);
                articolo = (string)row[2];

                string C_M_B = (string)row[3];
                if (C_M_B != "D")  //se è di contolavoro non lo segnalo: devono avere il ciclo solo gli articolo di CL a capacità Finita, ma da qui non si riesce a suddividere in base al Cdl_MRP, quindi non riesco a fare il controllo
                {
                    if (articolo != prec_articolo)
                    {
                        prec_articolo = articolo;
                        testo_mail   += Utils.NewLineMail() + " codice =" + articolo + "  non ha ciclo ma ha degli ordini di produzione " + Utils.NewLineMail();
                        if (articolo == "WM0662-03")
                        {
                            testo_mail += articolo + ": questo articolo non ha attrezzatura in As400, quindi non viene creato il ciclo; OK" + Utils.NewLineMail();
                        }
                    }
                    testo_mail += (string)row[0] + " " + Utils.NewLineMail();
                }
            }

            Utils.SendMail_Anag(Settings.GetSettings(), testo_mail, "Ordini di articoli senza ciclo");
            _logger.Info("end execution");
        }
예제 #7
0
        static private void FinalCheck_ARTICOLI_con_reparto_non_coerente(string dossier)
        {
//            DBHelper2 db = DBHelper2.getSageDBHelper("SAURO");
//            string command = @" select F.YWCR_0, F.ITMREF_0, AM.MACREP_0, AM.MAC_0 from SAURO.ITMFACILIT F
//join SAURO.ITMMASTER M on F.ITMREF_0=M.ITMREF_0
//left join SAURO.YPRDITM P on P.ITMREF_0=F.ITMREF_0
//left join SAURO.YPRDAM AM on P.YATTCOD_0=AM.YCONATT_0
//where F.STOFCY_0='ITS01' and F.YWCR_0<>AM.MACREP_0 and MACREP_0<>'CL' and ITMSTA_0=1
//order by F.YWCR_0, AM.MACREP_0 ";

            DBHelper2 db      = DBHelper2.getSageDBHelper(dossier);
            string    command = @" select F.YWCR_0, F.ITMREF_0, AM.MACREP_0, AM.MAC_0 "
                                + " from " + dossier + ".ITMFACILIT F "
                                + " join " + dossier + ".ITMMASTER M on F.ITMREF_0=M.ITMREF_0 "
                                + " left join " + dossier + ".YPRDITM P on P.ITMREF_0=F.ITMREF_0 "
                                + " left join " + dossier + ".YPRDAM AM on P.YATTCOD_0=AM.YCONATT_0 "
                                + " where F.STOFCY_0='ITS01' and F.YWCR_0<>AM.MACREP_0 and MACREP_0<>'CL' and ITMSTA_0=1 "
                                + " order by F.YWCR_0, AM.MACREP_0 ";



            _logger.Info("start execution");

            string       testo_mail = "";
            DbDataReader dtr        = db.GetReaderSelectCommand(command);

            object[] row = new object[dtr.FieldCount];

            string reparto_articolo = "", articolo = "";
            string reparto_macchina = "", macchina = "";

            while (dtr.Read())
            {
                dtr.GetValues(row);
                reparto_articolo = (string)row[0];
                articolo         = (string)row[1];
                reparto_macchina = (string)row[2];
                macchina         = (string)row[3];
                testo_mail      += articolo.PadRight(40) + " ha reparto " + reparto_articolo.PadRight(10) + " ma la macchina " + macchina.PadRight(20) + " ha reparto " + reparto_macchina + Utils.NewLineMail();
            }

            Utils.SendMail_Anag(Settings.GetSettings(), testo_mail, "Articoli ATTIVI con reparto non coerente con reparto macchina");
            _logger.Info("end execution");
        }
        static private List <string> Get_Lista_Articoli_RI_Sage(bool mode, string dossier, string codice_like)
        {
            List <string> _lista_articoli_rilasciati_in_sage = new List <string>(30000);

            //recupero totali accantonamenti per ogni articolo presente in ORR
            string query = Articolo.SelectQuery(true, dossier, codice_like, null);

            DBHelper2    db  = DBHelper2.getSageDBHelper(dossier);
            DbDataReader dtr = db.GetReaderSelectCommand(query);

            object[] row = new object[dtr.FieldCount];

            while (dtr.Read())
            {
                dtr.GetValues(row);
                _lista_articoli_rilasciati_in_sage.Add(Item.GetDBV <string>(row[0], "articolo"));
            }
            return(_lista_articoli_rilasciati_in_sage);
        }
        static protected DataTable InitTable_ConfigAttrezzura_ConMacchina(string dossier)
        {
            //recupero dati Configurazione Attrezzature Macchine dove c'è la macchina, non solo il gruppo
            DataTable ret = new DataTable();

            init_data_table(ret);

            string query = @"SELECT
                      C.YCONATT_0
                     ,C.YCONGRP_0
                     ,C.YCONCDL_0 as WST_0
                     ,C.YCONLOTSIZ_0
                     ,C.YCONCAD_0
                     ,C.YCONCADTIM_0
                     ,C.YCONENAFLG_0
                     ,C.YCONDATRIA_0
                     ,W.WCR_0
                      from SAURO.YPRDCONF C
                     join SAURO.WORKSTATIO W  on C.YCONCDL_0 = W.WST_0
                     left join SAURO.YPRDATT A on A.YATTCOD_0= C.YCONATT_0
                      where YCONCDL_0 <> '' " +
                           //and W.WCR_0 <> 'ASSE'
                           @" and A.YATTENAFLG_0=2
                      order by YCONATT_0, YCONCDL_0 desc";

            DBHelper2    db  = DBHelper2.getSageDBHelper(dossier);
            DbDataReader dtr = db.GetReaderSelectCommand(query);

            object[] row = new object[dtr.FieldCount];

            //MEGA accrocchio per velocità: uso lo stesso oggetto
            Std_Op_Machine tmp = null;

            while (dtr.Read())
            {
                dtr.GetValues(row);
                tmp = new Std_Op_Machine();
                tmp.Init(row);

                ret.Rows.Add(tmp.GetCyberRow(ret));//accrocchio per evitare che la riga derivi dall'altra tabella
            }
            return(ret);
        }
예제 #10
0
        static private Dictionary <string, string> Get_Lista_Articoli_Fornitori_Sage(string dossier)
        {
            string db = "x3." + dossier;

            Dictionary <string, string> _lista_articoli_fornitori_sage = new Dictionary <string, string>(1500);

            //questa query va bene anche se non filtro gli articoli RILASCIATI
            //perchè poi duplico solo le distinte base già filtrate per articoli rilasciati
            string query = "select ITMREF_0, BPSNUM_0 from " + db + ".ITMBPS where BPSNUM_0 <> 'A000818' ";

            DBHelper2    dbh = DBHelper2.getSageDBHelper(dossier);
            DbDataReader dtr = dbh.GetReaderSelectCommand(query);

            object[] row = new object[dtr.FieldCount];

            while (dtr.Read())
            {
                dtr.GetValues(row);
                _lista_articoli_fornitori_sage.Add(Item.GetDBV <string>(row[0], "ITMREF_0"), Item.GetDBV <string>(row[1], "BPSNUM_0"));
            }
            return(_lista_articoli_fornitori_sage);
        }
예제 #11
0
        public override void LastAction(ref DBHelper2 cm, DBHelper2 sage)
        {
            //CONTROLLO che il terzo dell'ODV sia presente nell'anagrafica terzi
            string testo_mail = "";
            string chk_query  =
                @"SELECT distinct O.C_CODE
, O.C_CUSTOMER_CODE
FROM [CyberPlanFrontiera].[dbo].[CYB_CORDER] O
left join CyberPlanFrontiera.dbo.CYB_COMPANY T on O.C_CUSTOMER_CODE=T.C_CODE
where T.C_CODE is null ";

            DbDataReader dtr = cm.GetReaderSelectCommand(chk_query);

            object[] row = new object[dtr.FieldCount];

            while (dtr.Read())
            {
                dtr.GetValues(row);
                testo_mail += "ODV =" + getDBV <string>(row[0], "C_CODE") + "  non caricato; manca codice cliente =" + getDBV <string>(row[1], "C_CUSTOMER_CODE") + Utils.NewLineMail();
            }

            Utils.SendMail_IT(Settings.GetSettings(), testo_mail, "ODV");
        }
예제 #12
0
        static private void FinalCheck_ATTR_senza_macchina(string dossier)
        {
//            DBHelper2 db = DBHelper2.getSageDBHelper("SAURO");
//            string command = @" select YATTCOD_0, YATTDES_0 from SAURO.YPRDATT A
//left join SAURO.YPRDCONF C on A.YATTCOD_0=C.YCONATT_0 and C.YCONENAFLG_0=2
//where A.YATTENAFLG_0=2 and C.YCONATT_0 is null
//order by YSTACOD_0 ";

            DBHelper2 db      = DBHelper2.getSageDBHelper(dossier);
            string    command = @" select YATTCOD_0, YATTDES_0 from "
                                + dossier + ".YPRDATT A "
                                + " left join " + dossier + ".YPRDCONF C on A.YATTCOD_0=C.YCONATT_0 and C.YCONENAFLG_0=2 "
                                + " where A.YATTENAFLG_0=2 and C.YCONATT_0 is null "
                                + " order by YSTACOD_0 ";



            _logger.Info("start execution");

            string       testo_mail = "";
            DbDataReader dtr        = db.GetReaderSelectCommand(command);

            object[] row = new object[dtr.FieldCount];

            string attrezzatura = "", desc = "";

            while (dtr.Read())
            {
                dtr.GetValues(row);
                attrezzatura = (string)row[0];
                desc         = (string)row[1];
                testo_mail  += "attrezzatura senza macchine associate: " + attrezzatura.PadRight(40) + desc + Utils.NewLineMail();
            }

            Utils.SendMail_Plan(Settings.GetSettings(), testo_mail, "Attrezzature ATTIVE senza macchine associate");
            _logger.Info("end execution");
        }
예제 #13
0
        protected void LastAction_CheckCoerenzaDB(ref DBHelper2 cm)
        {
            string testo_mail = "";

            //verifico che tutti i componenti in distinta base siano presenti in anagrafica
            string chk_query =
                @"SELECT [C_BOM_CODE], [C_COMPONENT_CODE]
  FROM [CyberPlanFrontiera].[dbo].[CYB_COMPONENT] C
  left join [CyberPlanFrontiera].[dbo].[CYB_ITEM] I
  on C.C_COMPONENT_CODE=I.[C_CODE ] and [C_ITEM_GROUP ]<> '__TOOL__'
  where I.C_CODE is null ";

            DbDataReader dtr = cm.GetReaderSelectCommand(chk_query);

            object[] row = new object[dtr.FieldCount];

            while (dtr.Read())
            {
                dtr.GetValues(row);
                testo_mail += "codice =" + getDBV <string>(row[0], "C_BOM_CODE") + "  componente =" + getDBV <string>(row[1], "C_COMPONENT_CODE") + ";  il componente non è presente in anagrafica o non è rilasciato" + Utils.NewLineMail();
            }

            //--verifico che tutti i codici con distinta base siano presenti in anagrafica
            chk_query = @"SELECT [C_BOM_CODE],[C_COMPONENT_CODE]
  FROM [CyberPlanFrontiera].[dbo].[CYB_COMPONENT] C
  left join [CyberPlanFrontiera].[dbo].[CYB_ITEM] I
  on C.[C_BOM_CODE]=I.[C_CODE ] and [C_ITEM_GROUP ]<> '__TOOL__'  
  where I.C_CODE is null";
            dtr.Close();

            dtr = cm.GetReaderSelectCommand(chk_query);
            row = new object[dtr.FieldCount];

            while (dtr.Read())
            {
                dtr.GetValues(row);
                testo_mail += "codice =" + getDBV <string>(row[0], "C_BOM_CODE") + " ha distinta base ma non è presente in anagrafica o non è rilasciato" + Utils.NewLineMail();
            }



            //  --verifico che tutti i codici in anagrafica siano presenti con distinta base
            //NB: and [C_M_B ] ='M' --make, prodotti in Sauro
            chk_query = @"SELECT I.[C_CODE ],[C_BOM_CODE],[C_COMPONENT_CODE]
  FROM [CyberPlanFrontiera].[dbo].[CYB_COMPONENT] C
  right join [CyberPlanFrontiera].[dbo].[CYB_ITEM] I
  on C.[C_BOM_CODE]=I.[C_CODE ]   
  where C.[C_BOM_CODE] is null 
  and [C_ITEM_GROUP ]<> '__TOOL__'
  and [C_M_B ] ='M' 
  order by I.[C_CODE ]";

            dtr.Close();
            dtr = cm.GetReaderSelectCommand(chk_query);
            row = new object[dtr.FieldCount];

            while (dtr.Read())
            {
                dtr.GetValues(row);
                string articolo = getDBV <string>(row[0], "C_CODE");
                if (!articolo.StartsWith("WR000"))
                {
                    testo_mail += "codice =" + articolo + " ha come in Sage 'tipo proposta'=Produzione ma non ha distinta base" + Utils.NewLineMail();
                }
            }
            Utils.SendMail_Anag(Settings.GetSettings(), testo_mail, "BOM");
        }
예제 #14
0
        static private void FinalCheck_PLAS_senza_cicli()
        {
            DBHelper2 db      = DBHelper2.getCyberDBHelper();
            string    command = @"SELECT
      distinct D.[C_ITEM_CODE]

      ,D.[C_ORDER_CODE]
      /*,D.[C_QTY]
      ,D.[C_WAREHOUSE_CODE]
      ,I.[C_DESCR ]
      ,I.[C_M_B ]
      ,I.[C_ITEM_GROUP ]
      ,I.[C_USER_STRING01 ]*/
      ,CICLI.C_CODE

  FROM[CyberPlanFrontiera].[dbo].[CYB_DEMAND] D
left join[CyberPlanFrontiera].[dbo].[CYB_ITEM] I on D.C_ITEM_CODE=I.[C_CODE]
left join
(
  --query indicata da Savietto per recuperare i cicli; qui serve per recuperare Articoli PLAS che non hanno cicli
  SELECT T.C_CODE FROM[CyberPlanFrontiera].[dbo].FiltroCicliPlastica T
                  LEFT JOIN [CyberPlanFrontiera].[dbo].CYB_STD_OP_MACHINE PO_MAC
                  ON T.ATTREZZATURA  = PO_MAC.C_ROUTING_CODE
                  left join [CyberPlanFrontiera].[dbo].cyb_machine mac on mac.c_code = PO_MAC.machine_code
                  where CHARINDEX(TIPO_P, mac.c_user_string04) > 0 -- verifico tipo plastica
                  and ((T.DIVISORE = 1 and mac.[C_USER_FLAG01] = 1) or T.DIVISORE = 0) -- Devo verificare: se il divisore è richiesto solo macchine con divisore, altrimenti tutte
                  and((T.PESO_MATER + T.PESO_ITEM) * (CASE WHEN cast(T.IMPRONTE_FORZ as int) = 0 THEN COALESCE(cast(t.IMPRONT_DEFAULT as int), 1) ELSE COALESCE(cast(t.IMPRONTE_FORZ as int), 1) END))  >= MAC.C_USER_REAL01
                 and((T.PESO_MATER + T.PESO_ITEM)*(CASE WHEN cast(T.IMPRONTE_FORZ as int) = 0 THEN COALESCE(cast(t.IMPRONT_DEFAULT as int), 1) ELSE COALESCE(cast(t.IMPRONTE_FORZ as int), 1) END))  <= MAC.C_USER_REAL02  -- Verifico il peso tra il min e il max della macchina
      GROUP BY T.C_CODE, T.C_PLANT_CODE, PO_MAC.C_OPNUM, PO_MAC.C_ALT_OPNUM, COALESCE(MAC.C_WORKCENTER,'TRASH')
  
  ) CICLI on D.C_ITEM_CODE= CICLI.C_CODE
  where I.[C_USER_STRING01]='PLAS' and CICLI.C_CODE is null 
order by D.C_ITEM_CODE ";


            _logger.Info("start execution");

            string       testo_mail = "";
            DBHelper2    cyber      = DBHelper2.getCyberDBHelper();
            DbDataReader dtr        = cyber.GetReaderSelectCommand(command);

            object[] row = new object[dtr.FieldCount];

            string prec_articolo = "";
            string articolo      = "";

            while (dtr.Read())
            {
                dtr.GetValues(row);
                articolo = (string)row[0];
                if (articolo != prec_articolo)
                {
                    prec_articolo = articolo;
                    testo_mail   += Utils.NewLineMail() + " codice =" + articolo + "  non è producibile ma questi Ordine di produzione lo richiedono " + Utils.NewLineMail();
                }
                testo_mail += (string)row[1] + " " + Utils.NewLineMail();
            }


            Utils.SendMail_Anag(Settings.GetSettings(), testo_mail, "WP senza ciclo");
            _logger.Info("end execution");
        }