private List <AsistSps.CDelete> AgregaDelete(AsistSps.CDelete cmd, Controladores_DB.IDataBase DB, bool modo) { List <AsistSps.CDelete> comandos = new List <Visor_sql_2015.AsistSps.CDelete>(); AsistSps.CDelete Comando = new Visor_sql_2015.AsistSps.CDelete(); //copio el comando para que por cada hijo le agrere sus porpios datos Comando.CpoiaComando(cmd); Comando.Delete = Eliminar; Comando.Mensage = Mensage; //agrego mi propia tabla int nt; nt = Comando.AddFrom(Tabla); int ntp; //numero de tabla padre //me traigo los campos involucrados en mi llave foranea List <Objetos.CCampoFK> llaves; llaves = DB.DameCamposFK(name); //agrego la tabla padre para obtener su numero de tabla ntp = Comando.AddFrom(llaves[0].maestra); //ahora agrego los where foreach (Objetos.CCampoFK cfk in llaves) { string s = "T" + nt.ToString() + "." + cfk.columnahija + "=T" + ntp.ToString() + "." + cfk.columnaMaestra; Comando.AddWhere(s); } //ahora reviso si tengo hijos if (Hijas == null) { //no tengo, por lo que termino if (modo == Eliminar) { comandos.Add(Comando); } return(comandos); } //tengo hijos, por lo que recorro cada uno para que agregen su codigo al comando foreach (CLLaveForanea hija in Hijas) { //que agrege los demas comandos List <AsistSps.CDelete> l; l = hija.AgregaDelete(Comando, DB, modo); //agrego todos los comandos a mi comando principal foreach (AsistSps.CDelete cd in l) { comandos.Add(cd); } } //agrego mi comando al final de la lista if (modo == Eliminar) { comandos.Add(Comando); } return(comandos); }
private void FormPropFkDelete_Load(object sender, EventArgs e) { //cargo los datos para mostralos TNombre.Text = FK.name; RBEliminar.Checked = FK.Eliminar; TBExcepcion.Checked = FK.GenerarExcepcion; TError.Text = FK.Mensage; System.Collections.Generic.List <Objetos.CCampoFK> lista = DB.DameCamposFK(FK.name); TTablaPadre.Text = lista[0].hija; FK.Tabla = TTablaPadre.Text; if (FK.Hijas != null) { //muestro las llaves foraneas hijas foreach (Objetos.CLLaveForanea obj in FK.Hijas) { ListaParametros.Items.Add(obj); } } //me traigo la lista de llaves foraneas hijas List <Objetos.CLLaveForanea> lista2 = DB.DameLLavesForaneasHijas(TTablaPadre.Text); foreach (Objetos.CLLaveForanea obj in lista2) { bool encontrado = false; foreach (Objetos.CLLaveForanea obj2 in ListaParametros.Items) { if (obj.name == obj2.name) { encontrado = true; break; } } if (encontrado == false) { ListaCampos.Items.Add(obj); } } }
public override void BSiguiente() { //genera el codigo del SP bool primero; Codigo = ""; CargaDatos(); // primero genero el cabecero del SP Add("create procedure " + NombreSP); //veo si tiene parametros if (Parametros.Count > 0) { //genero lalista de parametros Add("("); primero = true; foreach (Objetos.CParametro parametro in Parametros) { if (primero == false) { Add(","); } else { primero = false; } Add("@" + parametro.nombre + " " + parametro.TipoSP); } Add(")"); } Add(" as\n"); AddLine("begin"); //veo si le pucieron comentarios string comentario = (string)DameValor("ComentarioNombreSP"); string cmt = ""; int ni, nn; nn = comentario.Length; string s = ""; for (ni = 0; ni < nn; ni++) { if (comentario[ni] == '\n' || comentario[ni] == '\r') { //se encontro un comentario if (cmt.Trim() != "") { s = "\t--" + cmt.Trim(); AddLine(s); cmt = ""; } } else { cmt = cmt + comentario[ni]; } } if (cmt.Trim() != "") { s = "\t--" + cmt; AddLine(s); } //veo si hay campos que van a tener valores fijos if (ValoresFijos.Count > 0) { AddLine("\t--Declaración de variables que se requieren "); foreach (Objetos.CParametro variable in ValoresFijos) { AddLine("\tdeclare @" + variable.nombre + " " + variable.TipoSP); } } if (GenerarLLave == true) { //declaro la variable que va a tener el nombre de la llave AddLine("\tdeclare @" + CampoLLave.nombre + " " + CampoLLave.TipoSP + " --variable utilizada para generar la llave"); } //veo si le asignaron comentarios a los parametros if (Parametros.Count > 0) { //genero lalista de parametros foreach (Objetos.CParametro parametro in Parametros) { if (parametro.Descripcion != null && parametro.Descripcion.Trim() != "") { Add("\t--" + parametro.nombre + " " + parametro.Descripcion + "\n"); } } } //ahora agrego validaciones a los parametros if (Parametros.Count > 0) { primero = true; foreach (Objetos.CParametro parametro in Parametros) { if (parametro.Vacios == false) { if (primero == true) { AddLine("\t--Validando que no sean vacios"); primero = false; } AddLine("\tif(ltrim(@" + parametro.nombre + ")=\'\')"); AddLine("\tbegin"); //Version sim tiene comentarios if (parametro.Descripcion.Trim() != "") { AddLine("\t\t--" + parametro.Descripcion); } AddLine("\t\tRAISERROR(\'" + parametro.ExcepcionVacios + "\', 16, 1)"); AddLine("\t\treturn"); AddLine("\tend"); } } } //ahora valido que no se repitan los campos if (Parametros.Count > 0) { primero = true; foreach (Objetos.CParametro parametro in Parametros) { if (parametro.ValidarUnicidad == true) { if (primero == true) { AddLine("\t--Validando que no se pueden repetir"); primero = false; } AddLine("\tif exists(select * from " + Tabla + " where " + parametro.nombre + "=@" + parametro.nombre + ")"); AddLine("\tbegin"); //Version sim tiene comentarios if (parametro.Descripcion.Trim() != "") { AddLine("\t\t--" + parametro.Descripcion); } AddLine("\t\tRAISERROR(\'" + parametro.ExcepcionNoRepetibles + "\', 16, 1)"); AddLine("\t\treturn"); AddLine("\tend"); } } } //ahora me traigo los valores que son fijos if (ValoresFijos.Count > 0) { foreach (Objetos.CParametro variable in ValoresFijos) { if (variable.SelectedValor == true) { AddLine("\tselect @" + variable.nombre + "= " + variable.Valor); } else { //hay que obtenerlo desde una tabla s = ""; primero = true; foreach (Objetos.CParametro p in variable.Filtros) { if (primero == true) { primero = false; } else { s = s + " and "; } s = s + p.nombre; switch (p.Filtro) { case Visor_sql_2015.Objetos.TIPO_FILTRO.DIFERENTE: s = s + "!="; break; case Visor_sql_2015.Objetos.TIPO_FILTRO.IGUAL: s = s + "="; break; case Visor_sql_2015.Objetos.TIPO_FILTRO.LIKE: s = s + " like "; break; case Visor_sql_2015.Objetos.TIPO_FILTRO.MAYOR_IGUAL: s = s + ">="; break; case Visor_sql_2015.Objetos.TIPO_FILTRO.MAYOR_QUE: s = s + ">"; break; case Visor_sql_2015.Objetos.TIPO_FILTRO.MENOR_IGUAL: s = s + "<="; break; case Visor_sql_2015.Objetos.TIPO_FILTRO.MENOR_QUE: s = s + "<"; break; } s = s + p.Campo; } //veo los ordenamientos string s2 = ""; primero = true; foreach (Objetos.CParametro o in variable.Ordenamientos) { if (primero == true) { primero = false; s2 = " order by "; } else { s2 = s2 + ","; } s2 = s2 + o.nombre; if (o.Descendente == true) { s2 = s2 + " desc "; } else { s2 = s2 + " asc "; } } AddLine("\tselect @" + variable.nombre + "=" + variable.Campo + " from " + variable.Tabla + " where " + s + s2); } } } //ahora valido las llaves foraneas para impedir que truene if (LLavesForaneas.Count > 0) { AddLine("\t--Validando llaves foráneas"); foreach (Objetos.CLLaveForanea fk in LLavesForaneas) { //veo si tiene algun comentario if (fk.Comentarios != null && fk.Comentarios.Trim() != "") { AddLine("\t--" + fk.Comentarios); } //me traigo los campos y la tabla de la llave List <Objetos.CCampoFK> fks = DB.DameCamposFK(fk.name); //genero elselect s = ""; primero = true; foreach (Objetos.CCampoFK ofk in fks) { if (primero == true) { primero = false; } else { s = s + " and "; } s = s + ofk.columnaMaestra + "=@" + ofk.columnahija + " "; } AddLine("\tif not exists( select * from " + fks[0].maestra + " where " + s + ")"); AddLine("\tbegin"); if (fk.Mensage != null && fk.Mensage.Trim() != "") { AddLine("\t\tRAISERROR(\'" + fk.Mensage + "\', 16, 1)"); } else { //no asignaron texto para la excepcion, por lo que genero uno automatico AddLine("\t\tRAISERROR(\'No se encontró la relación con la tabla " + fks[0].maestra + "\', 16, 1)"); } AddLine("\t\treturn"); AddLine("\tend"); } } //verifico si hay que generar una llave automaticamente if (GenerarLLave == true) { s = ""; primero = true; foreach (Objetos.CParametro pk in LLavesPrimarias) { if (pk.nombre != CampoLLave.nombre) { if (primero == true) { primero = false; s = " where "; } else { s = s + " and "; } s = s + pk.nombre + "=@" + pk.nombre; } } AddLine("\tif not exists( select * from " + Tabla + s + ")"); AddLine("\tbegin"); AddLine("\t\tselect @" + CampoLLave.nombre + "=1"); AddLine("\tend"); AddLine("\telse"); AddLine("\tbegin"); AddLine("\t\tselect @" + CampoLLave.nombre + "=max(" + CampoLLave.nombre + ")+1 from " + Tabla + s + " "); AddLine("\tend"); } //ya termine de hacer todas las validaciones, por lo que procedo a hacer el insert List <Objetos.CParametro> lista; lista = new List <Visor_sql_2015.Objetos.CParametro>(); //le agrego los parametros foreach (Objetos.CParametro parametro in Parametros) { lista.Add(parametro); } foreach (Objetos.CParametro parametro in ValoresFijos) { lista.Add(parametro); } if (GenerarLLave == true) { lista.Add(CampoLLave); } AddLine("\t--agregando el registro"); primero = true; string ss = ""; string ss2 = ""; foreach (Objetos.CParametro obj in lista) { if (DB.ExisteCampoTabla(Tabla, obj.nombre)) { if (primero == true) { ss = "("; ss2 = " values("; primero = false; } else { ss = ss + ","; ss2 = ss2 + ","; } ss = ss + obj.nombre; ss2 = ss2 + "@" + obj.nombre; } } ss = ss + ")"; ss2 = ss2 + ")"; AddLine("\tinsert into " + Tabla + ss); AddLine("\t " + ss2); AddLine("end"); // cTextColor1.AnalizaTexto(); CodigoSP(NombreSP, Codigo); CloseEvent(); }
private void ValidaLLaveForanea(Objetos.CLLaveForanea fk, string tabs) { string s = ""; bool primero = true; string tab2 = tabs + "\t"; string tab3 = tab2 + "\t"; //me traigo los campos y la tabla de la llave List <Objetos.CCampoFK> fks = DB.DameCamposFK(fk.name); List <Objetos.CParametro> campos; AddLine(tabs + "--Genero unbucle para recorrer todos los registros de la tabla"); AddLine(tabs + "declare @" + fk.name + " int"); AddLine(tabs + "select @" + fk.name + " =1"); AddLine(tabs + "while(@" + fk.name + " =1)"); AddLine(tabs + "begin"); AddLine(tab2 + "--vero si existen registros en la tabla " + fks[0].hija); s = "if exists(select * from " + fks[0].hija + " where "; foreach (Objetos.CCampoFK obj in fks) { if (primero == true) { primero = false; } else { s = s + " and "; } s = s + obj.columnahija + "=@" + obj.columnaMaestra; } AddLine(tab2 + s + ")"); AddLine(tab2 + "begin"); //veo si hay que generar una excepcion if (fk.GenerarExcepcion == true) { //como hay que generar una excepcion, ya no valido las tablas hijas //agrego el codigo para generar dicha excepcion if (fk.Mensage != null && fk.Mensage.Trim() != "") { AddLine(tab3 + "RAISERROR(\'" + fk.Mensage + "\', 16, 1)"); } else { AddLine(tab3 + "RAISERROR(\'No se puede eliminar el registro de la tabla " + fks[0].maestra + " porque la tabla " + fks[0].hija + " contiene información\', 16, 1)"); } AddLine(tab3 + "return"); } else { //me traigo el primer registro encontrado con la llave foranea //me traigo los campos de lllave primaria que no esten dentro de la llave foranea campos = DB.DameCamposTabla(fks[0].hija); bool tienecampos = false; s = "select top 1 "; primero = true; foreach (Objetos.CParametro campo in campos) { if (campo.LLavePrimaria == true) { //veo si no esta dentro de los campos de llave foranea bool encontrado = false; foreach (Objetos.CCampoFK objfk in fks) { if (objfk.columnahija == campo.nombre) { encontrado = true; break; } } if (encontrado == false) { tienecampos = true; if (primero == true) { primero = false; } else { s = s + ","; } s = s + "@" + campo.nombre + "=" + campo.nombre; } } } s = s + " from " + fks[0].hija + " where "; primero = true; foreach (Objetos.CCampoFK obj in fks) { if (primero == true) { primero = false; } else { s = s + " and "; } s = s + obj.columnahija + "=@" + obj.columnaMaestra; } if (tienecampos == true) { AddLine(tab3 + s); } //hay que borar en cascada if (fk.Hijas != null) { foreach (Objetos.CLLaveForanea obj in fk.Hijas) { ValidaLLaveForanea(obj, tab3); } } //ahora borro mi registro //ahora borro el olos registros hijos primero = true; s = "delete " + fks[0].hija + " where "; foreach (Objetos.CParametro campo in campos) { if (campo.LLavePrimaria == true) { if (primero == true) { primero = false; } else { s = s + " and "; } s = s + campo.nombre + "=@" + campo.nombre; } } AddLine(tab3 + s); } AddLine(tab2 + "end"); AddLine(tab2 + "else"); AddLine(tab2 + "begin"); AddLine(tab3 + "break"); AddLine(tab2 + "end"); AddLine(tabs + "end"); }
public bool raiz; //indica si es en nodo raiz public List <AsistSps.CDelete> ComandoDelete(List <Objetos.CParametro> variables, Controladores_DB.IDataBase DB, bool modo) { List <AsistSps.CDelete> comandos = new List <Visor_sql_2015.AsistSps.CDelete>(); AsistSps.CDelete comando = new Visor_sql_2015.AsistSps.CDelete(); comando.Delete = Eliminar; comando.Mensage = Mensage; string tablapadre; //agrego la tabla al comando int nt; //numero de tabla int ntp; //numero de tabla padre List <Objetos.CCampoFK> llaves; llaves = DB.DameCamposFK(name); tablapadre = llaves[0].maestra; ntp = comando.AddFrom(tablapadre); nt = comando.AddFrom(llaves[0].hija); //ahora agrego mi seccion de where //como es la primer tabla, //me traigo mis llave primaria de la tabla padre foreach (Objetos.CParametro p in variables) { //veo si el campo esta en la tabla if (DB.ExisteCampoTabla(tablapadre, p.nombre)) { //si esta, por lo que la agrego a la lista del where string cadena = "T" + ntp.ToString() + "." + p.nombre + "=@" + p.nombre; comando.AddWhere(cadena); } } //ahora agrego la llave con la tabla padre //ahora agrego los where foreach (Objetos.CCampoFK cfk in llaves) { string s = "T" + nt.ToString() + "." + cfk.columnahija + "=T" + ntp.ToString() + "." + cfk.columnaMaestra; comando.AddWhere(s); } //ahora reviso si tengo hijos if (Hijas == null) { //no tengo, por lo que termino if (modo == Eliminar) { comandos.Add(comando); } return(comandos); } //tengo hijos, por lo que recorro cada uno para que agregen su codigo al comando foreach (CLLaveForanea hija in Hijas) { //que agrege los demas comandos List <AsistSps.CDelete> l; l = hija.AgregaDelete(comando, DB, modo); //agrego todos los comandos a mi comando principal foreach (AsistSps.CDelete cd in l) { comandos.Add(cd); } } //agrego mi comando al final de la lista if (modo == Eliminar) { comandos.Add(comando); } return(comandos); }