/**Funciión Hash, implementada con el modulo*/ public int FuncionHash(CBloque b) { //Aplicando modulo Object clave = b.dameClavePrim(); int pos, c = 0; pos = -1; switch (b.getTipoCA()) { case 3: //Entero pos = (int)clave % TAM_CUBETA; break; case 5: //Long pos = (int)((long)clave)%TAM_CUBETA; break; case 7: //Cadena pos = Math.Abs(((string)clave).GetHashCode())%TAM_CUBETA; break; } return (pos); }
/**Implemeta un función hash con la tecnica del plegamiento para obtener la posición * donde se insertara la nueva deirección del registro en la cubeta y la tabla hash*/ public void FuncionHash(CBloque b, ref int fH, ref int fC) { Object clave = b.dameClavePrim(); int c = 0; switch (b.getTipoCA()) { case 3: //Entero c = (int)clave; break; case 5: //Long c = (int)((long)clave); break; case 7: //Cadena c = Math.Abs(((string)clave).GetHashCode()); break; } while (c / 10 != 0) c = plegamiento(c); fC = fH = c; if (fC >= TAM_CUBETA) { fC = (fC - TAM_CUBETA) - 2; if (fC < 0) fC = 0; } if (fH >= TAM_HASH) fH -= TAM_HASH; }
/**Médoto principal para eliminar un registro*/ public void eliminaABplus(CNodoEntidad e, CBloque b) { long dirCabNueva = -1; if (eliminaClaveRec(e.getApCabDatos(), b.dameClavePrim(), ref dirCabNueva)) { e.setApCabDatos(dirCabNueva); getArchivo().escribeEntidad(e, e.getDir()); } }
/**\brief Modificacion de algun registro*/ public bool actualizaRegistro(CBloque nuevo, long posN) { bool res = true; int b = -1; List<CNodoEntidad> lR; List<CBloque> lB; // El registro que se modifico no altero la CP, por lo tanto // se sobreescribe el nuevo registro en la direccion correspondiente if (nuevo.ComparateTo(bloqueOriginal) == 0) { getArchivo().EscribeBloque(nuevo, dirBO); res = false; } else { //La clave primaria se ha modificado if (!(res = buscaBloqueRep(ent.getApCabDatos(), bloqueOriginal.dameClavePrim(), nuevo.dameClavePrim(),ref b))) { eliminaABplus(ent, bloqueOriginal); AltaArbolBplus(ent, nuevo, getArchivo().ENDF()); lR = new List<CNodoEntidad>(); lR = buscaRelacionesEnt(ent); if (lR.Count > 0) foreach (CNodoEntidad nE in lR) { lB = new List<CBloque>(); dameBloques(ref lB, nE, bloqueOriginal, ent); foreach (CBloque nB in lB) { nB.setClaveExt(nuevo.dameClave()); getArchivo().EscribeBloque(nB, nB.getDir()); } } } } return (res); }
/**Metodo principal para la inserción de la clave junto con su bloque de datos*/ public bool AltaArbolBplus(CNodoEntidad e, CBloque b, long posB) { CNodo nuevo = null; Object clave; bool res = true; long dirClave = -1; clave = b.dameClavePrim(); if (e.getApCabDatos() == -1)//Si no hay algun arbol se crea la primera pagina { nuevo = new CNodo(RAIZHOJA, GRADO); nuevo.setDir(getArchivo().ENDF()); nuevo.setTipoClave(b.getTipoCA()); getArchivo().escribeNodo(nuevo); e.setApCabDatos(nuevo.getDir()); getArchivo().escribeEntidad(e, e.getDir()); } else { bool bandera = false; res = EmpujaDato(e.getApCabDatos(), ref clave, ref dirClave, b, posB, ref nuevo, ref bandera); if (bandera == true)//La raiz se partido { CNodo nuevaRaiz; nuevaRaiz = new CNodo(RAIZ, GRADO); nuevaRaiz.setAtClave(0, clave); nuevaRaiz.setAtDirClaves(0, dirClave); nuevaRaiz.setAtDirNodo(0, ent.getApCabDatos()); nuevaRaiz.setAtDirNodo(1, nuevo.getDir()); nuevaRaiz.setDir(getArchivo().ENDF()); nuevaRaiz.setNumElemnt(1); nuevaRaiz.setTipoClave(b.getTipoCA()); getArchivo().escribeNodo(nuevaRaiz); e.setApCabDatos(nuevaRaiz.getDir()); getArchivo().escribeEntidad(e, e.getDir()); } } return (res); }
private void tablaDatos_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e) { posReg = e.RowIndex; if (edicion == false) dirBO = -1; for (int i = 0; i < tablaDatos.Rows.Count; i++) if (i != e.RowIndex) { tablaDatos.Rows[i].ReadOnly = true; for (int j = 0; j < tablaDatos.Columns.Count; j++) tablaDatos.Rows[i].Cells[j].Style.BackColor = Color.Gray; } if (tablaDatos.Rows[e.RowIndex].Cells[e.ColumnIndex].Value == null && nuevoReg != true && edicion == false) nuevoReg = true; if (nuevoReg == false && tablaDatos.Rows[e.RowIndex].Cells[e.ColumnIndex].Value != null && edicion != true) { bloqueOriginal = creaBloqueDatos(e.RowIndex); getArchivo().AbrirArchivo(); buscaDirBloqueRec(ent.getApCabDatos(), bloqueOriginal.dameClavePrim()); edicion = true; getArchivo().CerrarArchivo(); } }