private void doRowsCheck(List <int> idList)
        {
            // atlieka eilutėse esančių kodų patikrinimą ir rezultatų atvaizdavimą
            string    sqlstring        = constructSqlStatement(idList);
            DataTable rowsToCheckTable = createDataTable(sqlstring);

            if (rowsToCheckTable.Rows.Count == 0)
            {
                return;
            }
            LGIF.loadData(obtainLgifxmlFileName());
            DataTable rowsCheckResult = checkRows(rowsToCheckTable);

            outputCheckResult(rowsCheckResult);
        }
        private List <AtaskaitosEilute> darytiAtaskaita(DateTime bottomDate, DateTime topDate)
        {
            DataTable suvirinimaiTable;

            string where = string.Empty;

            if (bottomDate == null && topDate != null)
            {
                where = string.Format("WHERE Aktai.aktas_data <= {0} ", DbHelper.FormatDateValue(topDate));
            }
            else if (bottomDate != null && topDate == null)
            {
                where = string.Format("WHERE Aktai.aktas_data >= {0} ", DbHelper.FormatDateValue(bottomDate));
            }
            else if (bottomDate != null && topDate != null)
            {
                if (bottomDate <= topDate)
                {
                    where = string.Format("WHERE Aktai.aktas_data >= {0} AND Aktai.aktas_data <= {1} ", DbHelper.FormatDateValue(bottomDate), DbHelper.FormatDateValue(topDate));
                }
                else
                {
                    where = string.Format("WHERE Aktai.aktas_data >= {0} OR Aktai.aktas_data <= {1} ", DbHelper.FormatDateValue(bottomDate), DbHelper.FormatDateValue(topDate));
                }
            }

            List <List <Suvirinimas> > sarasai = new List <List <Suvirinimas> >();
            StringBuilder sb = new StringBuilder("SELECT ");

            // sb.Append("Aktai.*, Suvirintojai.*, Operatoriai.*, PadaliniaiSuvirintoju.*, PadaliniaiKelininku.*, Vadovai.*, BegiuTipai.* ");
            sb.Append("Aktai.aktas_data, Aktai.aktas_padalinysId, ");
            sb.Append("Aktai.k11, Aktai.k12, Aktai.k21, Aktai.k22, Aktai.k23, Aktai.k24, Aktai.k31, Aktai.k32, Aktai.k41, Aktai.k42, Aktai.k51, ");
            sb.Append("Aktai.id, Aktai.aktas_Nr, Aktai.salyg_begioTemp, Aktai.begis_protarpisMm, ");
            sb.Append("PadaliniaiSuvirintoju.pavadinimas AS suvirintojo_įmonė, Suvirintojai.vardas AS suvirintojo_vardas, Suvirintojai.pazymNr AS suvirintojo_kodas, ");
            sb.Append("Operatoriai.vardas AS operatoriaus_vardas, Operatoriai.id AS operatoriaus_kodas, ");
            sb.Append("KMFilialo.vardas AS kelio_meistro_vardas, KMFilialo.meistrija AS kelio_meistro_meistrija, ");
            sb.Append("BegiuTipai.pavadinimas AS bėgio_tipas ");
            sb.Append("FROM ");
            sb.Append("((((Aktai LEFT JOIN PadaliniaiSuvirintoju ON Aktai.suvirint_padalinysId=PadaliniaiSuvirintoju.id) ");
            sb.Append("LEFT JOIN Suvirintojai ON Aktai.suvirint_suvirintojasId=Suvirintojai.id) ");
            sb.Append("LEFT JOIN Operatoriai ON Aktai.tikrin_operatoriusId=Operatoriai.id) ");
            sb.Append("LEFT JOIN KMFilialo ON Aktai.aktas_pasiraseKMId=KMFilialo.id) ");
            sb.Append("LEFT JOIN BegiuTipai ON Aktai.begis_tipasId=BegiuTipai.id ");
            sb.Append("{0}");
            sb.Append("ORDER BY Aktai.aktas_data, Aktai.aktas_padalinysId, Aktai.k11, Aktai.k12, Aktai.k21, Aktai.k22, Aktai.k23, Aktai.k24, Aktai.k31, Aktai.k32, Aktai.k41, Aktai.k42, Aktai.k51;");
            string suvirinimaiSql = sb.ToString();

            suvirinimaiTable = new DataTable();
            try
            {
                suvirinimaiTable = DbHelper.FillDataTable(string.Format(suvirinimaiSql, where));
            }
            catch (DbException e)
            {
                Msg.ErrorMsg(Messages.DbErrorMsg);
                throw e;
            }
            List <AtaskaitosEilute> ataskaita = new List <AtaskaitosEilute>();

            if (suvirinimaiTable.Rows.Count == 0)
            {
                return(ataskaita);
            }


            // Kartojasi veiksmas - kaskart, kai gaminama nauja ataskaita.
            // Bet taip pat tai leidžia pakeisti lgif.xml failą neuždarius programos.
            LGIF.loadData(obtainLgifxmlFileName());

            // Imama pirmoji iš DB partempta eilutė, ji tampa cmpRow
            // ir lyginama su toliau einančiomis.
            // Kiek laukų lyginti, nustatoma pagal k21 reikšmę:
            // jeigu k21 yra 9, lyginama 10 laukų, t.y. vietos kodas imamas iki k32 imtinai,
            // jeigu k21 nėra 9, lyginami 8 laukai, t.y. vietos kodas imamas iki k42 imtinai.
            // Panašios eilutės grupuojamos į grupeSuvirinimu.
            // Kada randama nebetinkama eilutė, grupeSuvirinimu įrašoma į sarasai,
            // pradedama nauja grupeSuvirinimu, paskutinioji (netikusi) eilutė tampa ta, su kuria
            // lyginamos visos toliau einančios, t.y. cmpRow,
            // ir ji lyginama su toliau einančiomis.
            // Resultatas - List sarasai, kuris sudarytas iš List<suvirinimaiTable.Row>
            DataRow            cmpRow          = suvirinimaiTable.Rows[0];
            int                kiekLyginti     = kiek(cmpRow);
            List <Suvirinimas> grupeSuvirinimu = new List <Suvirinimas>();

            grupeSuvirinimu.Add(new Suvirinimas(suvirinimaiTable.Rows[0]));

            // suvirinimai suskirstomi į grupes pagal [data + kas virino + vieta]
            for (int r = 1; r < suvirinimaiTable.Rows.Count; r++)
            {
                if (lygiosEilutės(cmpRow, suvirinimaiTable.Rows[r], kiekLyginti))
                {
                    grupeSuvirinimu.Add(new Suvirinimas(suvirinimaiTable.Rows[r]));
                }
                else
                {
                    sarasai.Add(grupeSuvirinimu);
                    grupeSuvirinimu = new List <Suvirinimas>();
                    grupeSuvirinimu.Add(new Suvirinimas(suvirinimaiTable.Rows[r]));
                    cmpRow      = suvirinimaiTable.Rows[r];
                    kiekLyginti = kiek(cmpRow);
                }
            }
            if (grupeSuvirinimu.Count != 0)
            {
                sarasai.Add(grupeSuvirinimu);
            }

            // iš kiekvienos suvirinimų grupės padaroma viena ataskaitos eilute ir pridedama prie ataskaitos
            foreach (List <Suvirinimas> suvirinimuGrupe in sarasai)
            {
                try
                {
                    ataskaita.Add(new AtaskaitosEilute(suvirinimuGrupe));
                }
                catch (Exception e)
                {
                    List <Suvirinimas> weldingGroup = suvirinimuGrupe;
                    Msg.ErrorMsg(e.Message);
                }
            }
            return(ataskaita);
        }
        private void tsmiGamintiAktusDoc_Click(object sender, EventArgs e)
        {
            // patikrinti, ar parinkta eilučių
            // patikrinti, ar yra šablonas
            // parinkti outputfolder
            // iš parinktų eilučių surinkti id
            // pagal turimus id užpildyti datatable
            // pasiruošti gaminti aktus:
            // užkrauti infrastruktūros duomenis LGIF (VietosKodasClasses.cs)
            // sukurti Logger objektą ir log failą output aplanke (Logger.cs)
            // paleisti formą su progressbaru
            // iš kiekvienos datatable eilutės
            // sukonstruoti failo vardą (reikėtų nukelti į vėliau, kai bus žinoma vieta
            // iš DataRow gaminti Dictionary<string, string>
            // iš Dictionary<string, string> gaminti .doc failą
            // įrašyti į duombazę, kad failas sukurtas // nereikia
            // įraštyti į log failą apie sukūrimą
            // jeigu nesėkmingai
            // log failą įrašyti nesėkmę ir jos priežastį
            // bet kokiu atveju
            // padidinti progressbaro užpildymą
            // išmesti pranešimą, kiek užsakyta ir kiek pagaminta

            // patikrinti, ar parinkta eilučių
            int selected = dgvAktai.SelectedRows.Count;

            if (selected == 0)
            {
                Msg.InformationMsg("Aktai gaminami iš parinktų eilučių.");
                return;
            }

            // patikrinti, ar yra šablono failas
            object docTemplateFileName;

            try
            {
                docTemplateFileName = obtainAktasdotFileName();
            }
            catch
            {
                Msg.ErrorMsg(Settings.Default.DotTemplateFileNotChosenError);
                return;
            }

            // parinkti outputfolder
            string outputFolder = getOutputDirectoryName();

            if (outputFolder == "***")
            {
                return;
            }

            // iš parinktų eilučių surinkti id ir pagaminti WHERE sąlygą SQL užklausai
            List <string> selectedIds = new List <string>();

            foreach (DataGridViewRow rw in dgvAktai.SelectedRows)
            {
                selectedIds.Add(rw.Cells["id"].Value.ToString());
            }
            string whereCondition = string.Format("Aktai.id IN ({0})", string.Join(", ", selectedIds));

            // pagal turimus id užpildyti datatable
            string sqlSt = "SELECT ";

            sqlSt += "Aktai.id, Aktai.aktas_Nr, Aktai.aktas_data, ";
            sqlSt += "Aktai.k11, Aktai.k12, Aktai.k21, Aktai.k22, Aktai.k23, Aktai.k24, Aktai.k31, Aktai.k32, Aktai.k41, Aktai.k42, Aktai.k51, ";
            sqlSt += "Aktai.begis_protarpisMm, Aktai.medz_formaGamMetai, Aktai.medz_misinGamMetai, Aktai.medz_misinPartNr, Aktai.medz_misinPorcNr, ";
            sqlSt += "Aktai.salyg_arSausa, Aktai.salyg_oroTemp, Aktai.salyg_begioTemp, ";
            sqlSt += "Aktai.tikrin_nelygumaiVirsausMm, Aktai.tikrin_nelygumaiSonoMm, Aktai.tikrin_arDefektas, Aktai.tikrin_defKodas, Aktai.tikrin_sanduruCharakter, ";
            sqlSt += "Padaliniai.oficPavadinimas AS padalinys, Padaliniai.arRangovas, PadaliniaiSuvirintoju.pavadinimas AS virino_padalinys, ";
            sqlSt += "PadaliniaiKelininku.pavadinimas AS sutvarke_padalinys, Suvirintojai.vardas AS suvirintojas, Suvirintojai.pazymNr AS suvirintojas_kodas, ";
            sqlSt += "Operatoriai.id AS operatorius_kodas, Operatoriai.vardas AS operatorius, ";
            sqlSt += "Vadovai.vardas AS sutvarke_vadovas, Vadovai.pareigos AS sutvarke_vadovasPareigos, ";
            sqlSt += "Defektoskopai.id AS df_kodas, Defektoskopai.gamyklNr AS df_nr, Defektoskopai.tipas AS df_tipas, ";
            sqlSt += "BegiuTipai.pavadinimas AS begio_tipas, Misiniai.pavadinimas AS misinys, ";
            sqlSt += "KMFilialo.vardas AS KM_vardas ";
            sqlSt += "FROM ";
            sqlSt += "(((((((((Aktai LEFT JOIN Padaliniai ON Aktai.aktas_padalinysId=Padaliniai.id) ";
            sqlSt += "LEFT JOIN PadaliniaiSuvirintoju ON Aktai.suvirint_padalinysId=PadaliniaiSuvirintoju.id) ";
            sqlSt += "LEFT JOIN PadaliniaiKelininku ON Aktai.sutvark_padalinysId=PadaliniaiKelininku.id) ";
            sqlSt += "LEFT JOIN Suvirintojai ON Aktai.suvirint_suvirintojasId=Suvirintojai.id) ";
            sqlSt += "LEFT JOIN Operatoriai ON Aktai.tikrin_operatoriusId=Operatoriai.id) ";
            sqlSt += "LEFT JOIN Defektoskopai ON Aktai.tikrin_defektoskopasId=Defektoskopai.id) ";
            sqlSt += "LEFT JOIN Vadovai ON Aktai.sutvark_vadovasId=Vadovai.id) ";
            sqlSt += "LEFT JOIN BegiuTipai ON Aktai.begis_tipasId=BegiuTipai.id) ";
            sqlSt += "LEFT JOIN Misiniai ON Aktai.medz_misinKodasId=Misiniai.id) ";
            sqlSt += "LEFT JOIN KMFilialo ON Aktai.aktas_pasiraseKMId=KMFilialo.id ";
            sqlSt += "WHERE " + whereCondition;
            sqlSt += "ORDER BY Aktai.id;";
            DataTable tableAktai;

            try
            {
                tableAktai = DbHelper.FillDataTable(sqlSt);
            }
            catch (DbException)
            {
                Msg.ErrorMsg(Messages.DbErrorMsg);
                return;
            }

            // pasiruošti gaminti aktus:
            Dictionary <string, string> aktoDuomenys;

            //užkrauti infrastruktūros duomenis LGIF
            LGIF.loadData(obtainLgifxmlFileName());

            //sukurti Logger objektą ir log failą output aplanke
            Logger logger = new Logger(Path.Combine(outputFolder, "log.txt"));

            logger.Open();
            // parodyti progressbar
            lblStatus.Visible = lblStatusFilter.Visible = false;
            int created = 0;

            progressbar.Visible = true;
            progressbar.Value   = created;
            progressbar.Maximum = selected;
            string fileExtension = "doc";

            // paleidžiama word programa
            Word._Application wordApp = new Word.Application();
            wordApp.Visible = false;
            string outputFileName = "phony";

            foreach (DataRow dr in tableAktai.Rows)
            {
                try
                {
                    // sukonstruoti failo vardą (reikėtų nukelti į vėliau, kai bus žinoma vieta
                    outputFileName = Path.Combine(outputFolder, string.Format("{0} {1} {2} {3}.{4}",
                                                                              Settings.Default.AktasOutputFileNamePrefix,
                                                                              dr["id"],
                                                                              dr["aktas_Nr"],
                                                                              Convert.ToDateTime(dr["aktas_data"]).ToString("yyyyMMdd"),
                                                                              fileExtension));

                    // iš DataRow gaminti XmlDocument
                    aktoDuomenys = generateDicByDataRow(dr);
                    // iš XmlDocument gaminti .doc failą
                    createAndSaveAktasDoc(wordApp, aktoDuomenys, outputFileName, docTemplateFileName);
                    // įrašyti į duombazę, kad failas sukurtas
                    //DbHelper.ExecuteNonQuery(string.Format("UPDATE Aktai SET aktas_arAtspausdintas=True WHERE id={0};", dr["id"]));
                    // įraštyti į log failą apie sukūrimą
                    logger.Log(string.Format("sukurtas failas {0}", Path.GetFileName(outputFileName)));
                }
                catch (Exception exc)
                {
                    // log failą įrašyti nesėkmę ir jos priežastį
                    logger.Log(string.Format("nepavyko sukurti failo {0}, priežastis: {1}", Path.GetFileName(outputFileName), exc.Message));
                    continue;
                }
                finally
                {
                    // padidinti progressbaro užpildymą
                    created++;
                    progressbar.Value = created;
                }
            }
            object dontSaveChanges = Word.WdSaveOptions.wdDoNotSaveChanges;
            object missing         = System.Reflection.Missing.Value;

            wordApp.Quit(ref dontSaveChanges, ref missing, ref missing);
            wordApp = null;
            logger.Close();
            progressbar.Visible = false;
            progressbar.Value   = 0;
            lblStatus.Visible   = lblStatusFilter.Visible = true;
            Msg.InformationMsg("Aktai sukurti, išsaugoti.");
        }