From 83b33806037419edc2911f80c6bdf328676678e2 Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Sun, 30 May 2004 07:09:12 +0000 Subject: [PATCH] * Mas hacks al codigo :-) ... Agrego un miembro INDICE externo a EMUFS para poder indexar las facturas por NroArticulo para cumplir con el enunciado. * Me aseguro que para borrar una articulo no exista factura que lo referencia --- emufs/emufs.h | 5 +++++ emufs_gui/articulos.c | 19 +++++++++++++++---- emufs_gui/facturas.c | 36 +++++++++++++++++++++++++++++++++++- emufs_gui/facturas.h | 2 ++ 4 files changed, 57 insertions(+), 5 deletions(-) diff --git a/emufs/emufs.h b/emufs/emufs.h index 0b8255a..7c4e693 100644 --- a/emufs/emufs.h +++ b/emufs/emufs.h @@ -125,7 +125,12 @@ struct _emu_fs_t { void (*compactar)(struct _emu_fs_t *); /**< Método para compactar el archivo reorganizándolo físicamente */ char *nombre; /**< Nombre del archivo */ + /* Lista de Indices */ INDICE *indices; + /* Indice externo para utilizar con Facturas + * e indexar por NroArticulo + */ + INDICE *externo; }; /** Crea un archivo auxiliar. */ diff --git a/emufs_gui/articulos.c b/emufs_gui/articulos.c index 84357dc..c042bfb 100644 --- a/emufs_gui/articulos.c +++ b/emufs_gui/articulos.c @@ -5,6 +5,7 @@ #include "common.h" #include "lista.h" #include "menu.h" +#include "facturas.h" static t_LstArticulos *lst_articulos; @@ -360,10 +361,20 @@ void art_eliminar(char *s) getch(); } else { INDICE_DATO dummy; - k = emufs_indice_generar_clave_desde_valor(lst_articulos->fp->indices, (char *)&(articulo->numero)); - PERR("Borrando ARTICULO") - lst_articulos->fp->borrar_registro(lst_articulos->fp, k, dummy); - PERR("LISTO BORRADO"); + + /* Antes de borrar veo si existe alguna factura que contenga este articulo */ + if (fact_hay_con_item(articulo->numero) == 0) { + k = emufs_indice_generar_clave_desde_valor(lst_articulos->fp->indices, (char *)&(articulo->numero)); + PERR("Borrando ARTICULO") + lst_articulos->fp->borrar_registro(lst_articulos->fp, k, dummy); + PERR("LISTO BORRADO"); + } else { + wattron(win, COLOR_PAIR(COLOR_YELLOW)); + mvwaddstr(win, 6, 4, "No se pudo eliminar Articulo porque hay una factura que lo referencia."); + wattroff(win, COLOR_PAIR(COLOR_YELLOW)); + wrefresh(win); + getch(); + } free(articulo); } diff --git a/emufs_gui/facturas.c b/emufs_gui/facturas.c index 48ff1c9..de17769 100644 --- a/emufs_gui/facturas.c +++ b/emufs_gui/facturas.c @@ -238,6 +238,10 @@ t_LstFacturas *fact_cargar(t_Parametros *param) emufs_agregar_indice(tmp->fp, "vto", IND_SELECCION, param->ind_fac[2].tipo_arbol, IDX_STRING, STRUCT_OFFSET(factura, emision), param->ind_fac[2].tam_bloque, 1); emufs_agregar_indice(tmp->fp, "emision", IND_EXAHUSTIVO, param->ind_fac[1].tipo_arbol, IDX_STRING, STRUCT_OFFSET(factura, emision), param->ind_fac[1].tam_bloque, 0); emufs_agregar_indice(tmp->fp, "numero", IND_PRIMARIO, param->ind_fac[0].tipo_arbol, IDX_INT, 0, param->ind_fac[0].tam_bloque, 0); + + /* Creo el indice externo por Nro Articulo */ + tmp->fp->externo = emufs_indice_crear(tmp->fp, "articulo", IND_SELECCION, IND_B, IDX_INT, 0, 512, 0); + tmp->fp_texto = emufs_crear("notas", param->tipo_arch_nota, param->tam_bloque_nota, 100); for (node=inicio ; node ; node = node->next) { if (node->type == XML_ELEMENT_NODE) { @@ -273,8 +277,21 @@ t_LstFacturas *fact_cargar(t_Parametros *param) fact.reg_nota = id; save = procesar_guardar_factura(&fact, lst_facturas, &size); if (save != NULL) { + int i; error = 0; - tmp->fp->grabar_registro(tmp->fp, save, size, &error); + id = tmp->fp->grabar_registro(tmp->fp, save, size, &error); + + /* Agrego los Items al indice externo */ + for(i=0; ifp->externo->agregar_entrada(tmp->fp->externo, _k, _dato); + } + } + if (fact.items) { free(fact.items); fact.items = NULL; @@ -1478,3 +1495,20 @@ void fact_recorrer() } } +int fact_hay_con_item(int numero) +{ + INDICE *idx; + CLAVE k; + INDICE_DATO dato; + /* Busco si existe alguna factura que contenga al articulo "numero" */ + idx = lst_facturas->fp->externo; + + k.i_clave = numero; + dato = idx->existe_entrada(idx, k); + + if (dato.id == -1) + return 0; /* No existe factura que contenga este articulo!! */ + + return 1; /* Hay alguna factura que contiene el articulo */ +} + diff --git a/emufs_gui/facturas.h b/emufs_gui/facturas.h index 777fb56..db3561f 100644 --- a/emufs_gui/facturas.h +++ b/emufs_gui/facturas.h @@ -80,4 +80,6 @@ int fact_exportar_xml(const char *filename); void fact_recorrer(); +int fact_hay_con_item(int numero); + #endif -- 2.43.0