X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/9b22193b1d22efa0d41a313096a62666eddfb629..43e1e27b378dcf40321063e8c200894d4f47bb7c:/emufs_gui/articulos.c diff --git a/emufs_gui/articulos.c b/emufs_gui/articulos.c index 3b0cefc..4c69770 100644 --- a/emufs_gui/articulos.c +++ b/emufs_gui/articulos.c @@ -13,16 +13,12 @@ static t_Articulo *art_form_buscar(WINDOW *win, EMUFS_REG_ID *id); static void *procesar_guardar_articulo(t_Articulo *src, EMUFS_REG_SIZE *size, t_LstArticulos *lst); static int procesar_leer_articulo(t_Articulo *dst, void *src, EMUFS_REG_SIZE size, t_LstArticulos *lst); +#ifdef TP_PRIMER_ENTREGA /* Manejo de la lista doble */ static t_Reg_Articulo *crear_nodo_articulo(EMUFS_REG_ID reg, unsigned int num); static int agregar_nodo_articulo(t_LstArticulos *lst, t_Reg_Articulo *nodo); static int eliminar_nodo_articulo(t_LstArticulos *lst, t_Reg_Articulo *nodo); -t_LstArticulos *art_get_lst() -{ - return lst_articulos; -} - int eliminar_nodo_articulo(t_LstArticulos *lst, t_Reg_Articulo *nodo) { if (nodo == NULL) return 0; @@ -68,8 +64,14 @@ int agregar_nodo_articulo(t_LstArticulos *lst, t_Reg_Articulo *nodo) } return 1; } +#endif /* TP_PRIMER_ENTREGA */ + +t_LstArticulos *art_get_lst() +{ + return lst_articulos; +} -t_LstArticulos *art_cargar(const char *filename, int tipo, int tam_bloque) +t_LstArticulos *art_cargar(t_Parametros *param) { xmlDocPtr document; xmlNode *node, *inicio; @@ -79,16 +81,15 @@ t_LstArticulos *art_cargar(const char *filename, int tipo, int tam_bloque) t_LstArticulos *tmp; t_Articulo *un_articulo; lst_articulos = NULL; - EMUFS_REG_ID id; tmp = (t_LstArticulos *)malloc(sizeof(t_LstArticulos)); if (tmp == NULL) return NULL; lst_articulos = tmp; tmp->primero = NULL; - if (filename != NULL) { + if (param != NULL) { PERR("Voy a crear desde un XML"); - document = xmlReadFile(filename, "ISO-8859-1",0); + document = xmlReadFile(param->xml_art, "ISO-8859-1",0); if (document == NULL) { free(tmp); lst_articulos = NULL; @@ -107,13 +108,11 @@ t_LstArticulos *art_cargar(const char *filename, int tipo, int tam_bloque) } node = node->next; } -#ifdef DEBUG - fprintf(stderr, "Articulos : Tipo=%d Bloque=%d\n", tipo-1, tam_bloque); -#endif /* Creo el FS */ - tmp->fp = emufs_crear("articulos", tipo-1, tam_bloque, sizeof(t_Articulo)); + tmp->fp = emufs_crear("articulos", param->tipo_arch_art, param->tam_bloque_art, sizeof(t_Articulo)); /* Agrego los indices */ PERR("Voy a agregar un indice"); + emufs_agregar_indice(tmp->fp, "presentacion", IND_EXAHUSTIVO, IND_B, IDX_STRING, STRUCT_OFFSET(un_articulo, presentacion), 512); emufs_agregar_indice(tmp->fp, "desc", IND_EXAHUSTIVO, IND_B, IDX_STRING, STRUCT_OFFSET(un_articulo, desc), 512); emufs_agregar_indice(tmp->fp, "codigo", IND_PRIMARIO, IND_B, IDX_INT, 0, 512); if (!tmp->fp) { @@ -148,8 +147,7 @@ t_LstArticulos *art_cargar(const char *filename, int tipo, int tam_bloque) save = procesar_guardar_articulo(&art, &size, lst_articulos); if (save != NULL) { error = 0; - id = tmp->fp->grabar_registro(tmp->fp, save, size, &error); - agregar_nodo_articulo(tmp, crear_nodo_articulo(id, art.numero)); + tmp->fp->grabar_registro(tmp->fp, save, size, &error); free(save); } } @@ -316,8 +314,10 @@ void art_modificar(char *s) /* Ya actualice los datos, ahora veo de grabarlos */ tmp = procesar_guardar_articulo(articulo, &size, lst_articulos); if (tmp) { + CLAVE k; error = 0; - lst_articulos->fp->modificar_registro(lst_articulos->fp, codigo, tmp, size, &error); + k = emufs_indice_generar_clave_desde_valor(lst_articulos->fp->indices, (char *)&articulo->numero); + lst_articulos->fp->modificar_registro(lst_articulos->fp, k, tmp, size, &error); free(tmp); } @@ -654,9 +654,9 @@ void art_consultas_old(char *s) lista = lista_crear(3, win1, COLS-4, LINES-6); /* Creo las columnas */ - lista_agregar_columna(lista, DATO_INT, 0, 8); - lista_agregar_columna(lista, DATO_STR, 10, 45); - lista_agregar_columna(lista, DATO_FLOAT, 60, 10); + lista_agregar_columna(lista, "Col1", DATO_INT, 0, 8); + lista_agregar_columna(lista, "Col2", DATO_STR, 10, 45); + lista_agregar_columna(lista, "Col3", DATO_FLOAT, 60, 10); /* Agrego unos datos a ver que pasa */ /* Pongo 100 y rezo */ @@ -675,24 +675,19 @@ void art_consultas_old(char *s) delwin(win); } -void art_consultas_codigos(char *s) +void art_consultas_codigos(char *s, t_Lista *lista) { EMUFS_REG_ID dummy; int desde_codigo, hasta_codigo; - int i; + CLAVE k, menor, mayor; t_Articulo *articulo; - t_Lista *lista; t_Form *form; - WINDOW *win, *win1; + INDICE *idx; + + idx = lst_articulos->fp->indices; - win = newwin(LINES-4, COLS-2, 2, 1); - win1 = derwin(win, LINES-6, COLS-4, 1, 1); - werase(win); - box(win, 0, 0); - wrefresh(win); - /* El usuario ingresa rango a listar */ - form = form_crear(win1); + form = form_crear(lista->win); form_agregar_widget(form, INPUT, "Desde Codigo", 8, "0"); form_agregar_widget(form, INPUT, "Hasta Codigo", 8, "99999999"); @@ -702,22 +697,22 @@ void art_consultas_codigos(char *s) hasta_codigo = form_obtener_valor_int(form, "Hasta Codigo"); form_destruir(form); - werase(win1); - wrefresh(win1); - - /* Creo la lista donde mostrar la consulta*/ - /* Muestro solo info relevante */ - lista = lista_crear(4, win1, COLS-4, LINES-6); - - /* Creo las columnas */ - lista_agregar_columna(lista, DATO_INT, 0, 8); /* numero */ - lista_agregar_columna(lista, DATO_STR, 10, 51); /* desc */ - lista_agregar_columna(lista, DATO_STR, 55, 9); /* existencia */ - lista_agregar_columna(lista, DATO_STR, 65, 9); /* enim */ + werase(lista->win); + wrefresh(lista->win); /* Leo los datos desde el archivo */ - for(i=desde_codigo; i<=hasta_codigo; i++) { - articulo = art_obtener(lst_articulos, i, &dummy); + k = emufs_indice_generar_clave_desde_valor(idx, (char *)&desde_codigo); + + menor = idx->obtener_menor_clave(idx); + mayor = idx->obtener_mayor_clave(idx); + + if (k.i_clave < menor.i_clave) + k = menor; + if (k.i_clave > mayor.i_clave) + hasta_codigo = mayor.i_clave; + fprintf(stderr, "k.i_clave = %d -- hasta_codigo = %d\n", k.i_clave, hasta_codigo); + while ((k.i_clave != -1) && (k.i_clave <= hasta_codigo)) { + articulo = art_obtener(lst_articulos, k.i_clave, &dummy); if (articulo != NULL) { lista_agregar_fila(lista, articulo->numero, @@ -725,68 +720,97 @@ void art_consultas_codigos(char *s) articulo->existencia, articulo->emin ); + free(articulo); } + k = idx->obtener_sig_clave(idx, k); + fprintf(stderr, "k.i_clave = %d -- hasta_codigo = %d\n", k.i_clave, hasta_codigo); } curs_set(0); lista_ejecutar(lista); curs_set(1); - - wrefresh(win1); - wrefresh(win); - werase(win1); - werase(win); - wrefresh(win); - delwin(win); } -void art_consultas_desc(char *s) +void art_consultas_stock(char *s, t_Lista *lista) +{ + EMUFS_REG_ID dummy; + int hasta_codigo; + CLAVE k, menor, mayor; + t_Articulo *articulo; + t_Form *form; + INDICE *idx; + float por; + + idx = lst_articulos->fp->indices; + + /* El usuario ingresa rango a listar */ + form = form_crear(lista->win); + form_agregar_widget(form, INPUT, "Ingrese %", 8, "0"); + + form_ejecutar(form, 2, 2); + + por = form_obtener_valor_float(form, "Ingrese %"); + + form_destruir(form); + werase(lista->win); + wrefresh(lista->win); + + menor = idx->obtener_menor_clave(idx); + mayor = idx->obtener_mayor_clave(idx); + + k = menor; + hasta_codigo = mayor.i_clave; + while ((k.i_clave != -1) && (k.i_clave <= hasta_codigo)) { + articulo = art_obtener(lst_articulos, k.i_clave, &dummy); + if (articulo != NULL) { + if (atof(articulo->existencia) <= (1.0f+por)*atof(articulo->emin)) { + lista_agregar_fila(lista, + articulo->numero, + articulo->desc, + articulo->existencia, + articulo->emin + ); + } + free(articulo); + } + k = idx->obtener_sig_clave(idx, k); + } + + curs_set(0); + lista_ejecutar(lista); + curs_set(1); +} + +void art_consultas_varias(char *nombre_indice, char *titulo, t_Lista *lista) { int i, cant, error; char *desc, *tmp; t_Articulo articulo; - t_Lista *lista; t_Form *form; INDICE_DATO *datos; - WINDOW *win, *win1; CLAVE k; EMUFS *fs; EMUFS_REG_SIZE size; fs = lst_articulos->fp; - win = newwin(LINES-4, COLS-2, 2, 1); - win1 = derwin(win, LINES-6, COLS-4, 1, 1); - werase(win); - box(win, 0, 0); - wrefresh(win); - /* El usuario ingresa rango a listar */ - form = form_crear(win1); - form_agregar_widget(form, INPUT, "Descripcion", 50, ""); + form = form_crear(lista->win); + form_agregar_widget(form, INPUT, titulo, 50, ""); + werase(lista->win); form_ejecutar(form, 2, 2); - tmp = form_obtener_valor_char(form, "Descripcion"); + tmp = form_obtener_valor_char(form, titulo); desc = malloc(sizeof(char)*(strlen(tmp)+1)); strcpy(desc, tmp); form_destruir(form); - werase(win1); - wrefresh(win1); - - /* Creo la lista donde mostrar la consulta*/ - /* Muestro solo info relevante */ - lista = lista_crear(4, win1, COLS-4, LINES-6); - - /* Creo las columnas */ - lista_agregar_columna(lista, DATO_INT, 0, 8); /* numero */ - lista_agregar_columna(lista, DATO_STR, 10, 51); /* desc */ - lista_agregar_columna(lista, DATO_STR, 55, 9); /* existencia */ - lista_agregar_columna(lista, DATO_STR, 65, 9); /* enim */ + werase(lista->win); + wrefresh(lista->win); /* Leo los datos desde el archivo */ - datos = emufs_buscar_registros(fs, "desc", desc, &cant); + datos = emufs_buscar_registros(fs, nombre_indice, desc, &cant); for(i=0; i