} //agregar grids

        public void insercion(String tabla, String columnas, String valores, String tabla_detalle, String clave_detalle, Boolean detalle, List <String> val_detalle)
        {
            DataTable fragmentos = dame_fragmentos_de(tabla);
            int       indx_fsec  = dame_indice_fragmento_principal(fragmentos);
            String    clave      = "";

            if (indx_fsec > -1) //Si hay secuencia
            {
                DataRow fragmento_ppal = fragmentos.Rows[indx_fsec];
                Sitio   sitio          = dame_sitio_del_fragmento(fragmento_ppal);
                DataSet data_set       = new DataSet();

                sitio.dame_clave_secuencia(fragmento_ppal[SEC].ToString(), ref clave);
                sitio.inserta(fragmento_ppal[NOM].ToString(), columnas, "", valores);
                fragmentos.Rows.RemoveAt(indx_fsec);
            }

            if (clave != "")
            {
                clave += ",";
            }

            if (clave_detalle != "")
            {
                clave = clave_detalle + ",";
            }

            if (detalle)
            {
                insercion_detalle(tabla_detalle, clave, val_detalle);
            }

            inserta_dependientes(fragmentos, columnas, clave, valores);
            llena_superGrid_de(tabla);
        }
        private void inserta_fragmento_V(Sitio sitio, DataRow fragmento, String columnas, String clave, String valores)
        {
            List <String> columnas_FV        = enlista_columnas_FV(fragmento[NOM].ToString());
            List <String> valores_entrada    = enlista_valores(valores, true);
            List <String> columnas_completas = enlista_valores(columnas, true);
            String        cad_col            = formatea_cadena_columnas(columnas_FV);
            String        cad_val            = "";

            clave = clave.Remove(clave.Length - 1, 1);
            valores_entrada.Insert(0, clave);

            for (int i = columnas_FV.Count - 1; i >= 0; i--)
            {
                if (!columnas_completas.Contains(columnas_FV[i]))
                {
                    columnas_completas.Insert(0, columnas_FV[i]);
                }
            }

            cad_val = empareja_datos_FV(columnas_completas, columnas_FV, valores_entrada);

            if (columnas_FV.Count == enlista_valores(cad_val, true).Count)
            {
                sitio.inserta(fragmento[NOM].ToString(), cad_col, "", cad_val);
            }
            else
            {
                MessageBox.Show("Error al emparejar columnas con valores!");
            }
        }
        private void inserta_fragmento_H(Sitio sitio, DataRow fragmento, String clave, String valores)
        {
            String        condicion = fragmento[COND].ToString();
            String        dependencia = fragmento[DEP].ToString();
            List <String> items = dame_elementos_condicion(condicion);
            int           PIZQ = 0, OPERADOR = 1, PDER = 2;
            Boolean       cumple_condicion = false;
            String        valor_entrada;
            List <String> columnas = new List <string>();

            sitio.dame_columnas_de(fragmento[NOM].ToString(), columnas);
            valor_entrada = dame_valor_entrada(items[PIZQ], columnas, enlista_valores(valores, false));

            if (dependencia == "")
            {
                cumple_condicion = evalua_condicion(items[OPERADOR], valor_entrada, items[PDER]);
            }
            else
            {
                List <String> col_dep = new List <string>();
                sitio.dame_columnas_de(dependencia, col_dep);
                cumple_condicion = valida_dependencia(sitio, dependencia, col_dep[0], valor_entrada);
            }

            if (cumple_condicion)
            {
                sitio.inserta(fragmento[NOM].ToString(), "", clave, valores);
            }
            else
            {
                //MessageBox.Show("No se realizó la inserción en " + fragmento[NOM].ToString());
            }
        }
        private void insercion_detalle(String tabla_detalle, String clave, List <String> val_detalle)
        {
            DataTable fragmentos = dame_fragmentos_de(tabla_detalle);

            foreach (DataRow f in fragmentos.Rows)
            {
                Sitio sitio = dame_sitio_del_fragmento(f);
                foreach (String valor in val_detalle)
                {
                    sitio.inserta(f[NOM].ToString(), "", clave, valor);
                }
            }
        }
        } //agregar las demas grids

        private void inserta_dependientes(DataTable fragmentos, String columnas, String clave, String valores)
        {
            foreach (DataRow fragmento in fragmentos.Rows)
            {
                Sitio sitio = dame_sitio_del_fragmento(fragmento);
                switch (fragmento[TIPO].ToString())
                {
                case "N":
                case "R":
                    sitio.inserta(fragmento[NOM].ToString(), "", clave, valores);
                    break;

                case "H":
                    inserta_fragmento_H(sitio, fragmento, clave, valores);
                    break;

                case "V":
                    inserta_fragmento_V(sitio, fragmento, columnas, clave, valores);
                    break;
                }
            }
        }
        private void inserta_fragmento_V(Sitio sitio, DataRow fragmento, String columnas, String clave, String valores)
        {
            List<String> columnas_FV = enlista_columnas_FV(fragmento[NOM].ToString());
            List<String> valores_entrada = enlista_valores(valores,true);
            List<String> columnas_completas = enlista_valores(columnas,true);
            String cad_col = formatea_cadena_columnas(columnas_FV);
            String cad_val = "";

            clave = clave.Remove(clave.Length - 1, 1);
            valores_entrada.Insert(0, clave);

            for (int i = columnas_FV.Count-1; i >= 0; i--)
                if(!columnas_completas.Contains(columnas_FV[i]))
                    columnas_completas.Insert(0,columnas_FV[i]);

            cad_val = empareja_datos_FV(columnas_completas, columnas_FV, valores_entrada);

            if (columnas_FV.Count == enlista_valores(cad_val,true).Count)
                sitio.inserta(fragmento[NOM].ToString(), cad_col, "", cad_val);
            else
                MessageBox.Show("Error al emparejar columnas con valores!");
        }
        private void inserta_fragmento_H(Sitio sitio, DataRow fragmento, String clave, String valores)
        {
            String condicion = fragmento[COND].ToString();
            String dependencia = fragmento[DEP].ToString();
            List<String> items = dame_elementos_condicion(condicion);
            int PIZQ = 0, OPERADOR = 1, PDER = 2;
            Boolean cumple_condicion = false;
            String valor_entrada;
            List<String> columnas = new List<string>();

            sitio.dame_columnas_de(fragmento[NOM].ToString(), columnas);
            valor_entrada = dame_valor_entrada(items[PIZQ], columnas, enlista_valores(valores,false));

            if (dependencia == "")
                cumple_condicion = evalua_condicion(items[OPERADOR], valor_entrada, items[PDER]);
            else
            {
                List<String> col_dep = new List<string>();
                sitio.dame_columnas_de(dependencia, col_dep);
                cumple_condicion = valida_dependencia(sitio, dependencia, col_dep[0], valor_entrada);
            }

            if (cumple_condicion)
                sitio.inserta(fragmento[NOM].ToString(), "", clave, valores);
            else
            {
                //MessageBox.Show("No se realizó la inserción en " + fragmento[NOM].ToString());
            }
        }