From 376814ea9f4cd3e7dda91f6afa435a6b0d1190b8 Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Thu, 27 May 2004 15:34:01 +0000 Subject: [PATCH] * Agrego a los indices 2 funciones para obtener la menor y mayor clave. * Agrego un metodo para convertir una clave en valor * Agrego busqueda por rando de fechas en las facturas. --- emufs/emufs.c | 13 +++++++ emufs/emufs.h | 2 + emufs/indice_b.c | 49 ++++++++++++++++++++++++ emufs/indice_b.h | 4 ++ emufs/indices.c | 24 ++++++++++++ emufs/indices.h | 5 +++ emufs_gui/facturas.c | 89 +++++++++++++++++++++++++++++++++++++++++++- 7 files changed, 185 insertions(+), 1 deletion(-) diff --git a/emufs/emufs.c b/emufs/emufs.c index 685f091..cc33ee3 100644 --- a/emufs/emufs.c +++ b/emufs/emufs.c @@ -528,3 +528,16 @@ EMUFS_BLOCK_ID emufs_get_new_block_number(EMUFS *emu) fclose(fp); return num+1; } + +INDICE *emufs_buscar_indice_por_nombre(EMUFS *emu, const char *nombre) +{ + INDICE *tmp; + + tmp = emu->indices; + while (tmp) { + if (strcmp(tmp->nombre, nombre) == 0) break; + tmp = tmp->sig; + } + return tmp; +} + diff --git a/emufs/emufs.h b/emufs/emufs.h index ad28d70..b598f69 100644 --- a/emufs/emufs.h +++ b/emufs/emufs.h @@ -177,6 +177,8 @@ int emufs_agregar_indice(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, INDIC INDICE_DATO *emufs_buscar_registros(EMUFS *emu, char *indice, char *data, int *cant); +INDICE *emufs_buscar_indice_por_nombre(EMUFS *emu, const char *nombre); + EMUFS_BLOCK_ID emufs_create_new_block(EMUFS *emu); EMUFS_BLOCK_ID emufs_get_new_block_number(EMUFS *emu); diff --git a/emufs/indice_b.c b/emufs/indice_b.c index 2e1615b..eba1739 100644 --- a/emufs/indice_b.c +++ b/emufs/indice_b.c @@ -1083,3 +1083,52 @@ static void b_partir_dos_nodos_en_tres(INDICE* idx, int nodo_izq, int nodo_der, */ } +CLAVE emufs_indice_b_obtener_menor_clave(INDICE *idx) +{ + B_NodoHeader header; + B_NodoEntry *claves; + CLAVE k; + char *nodo; + + nodo = b_leer_nodo(idx, 0); + b_leer_header(nodo, &header); + /* Tengo que ir siempre a la izquierda hasta una hora */ + while (header.hijo_izquierdo != -1) { + free(nodo); + nodo = b_leer_nodo(idx, header.hijo_izquierdo); + b_leer_header(nodo, &header); + } + + /* Listo, ahora solo leo la primer clave */ + claves = b_leer_claves(nodo, &header); + k = claves[0].clave; + free(nodo); + return k; +} + +CLAVE emufs_indice_b_obtener_mayor_clave(INDICE *idx) +{ + B_NodoHeader header; + B_NodoEntry *claves; + CLAVE k; + int i; + char *nodo; + + nodo = b_leer_nodo(idx, 0); + b_leer_header(nodo, &header); + claves = b_leer_claves(nodo, &header); + /* Tengo que ir siempre a la izquierda hasta una hora */ + while (claves[header.cant-1].hijo_derecho != -1) { + i = claves[header.cant-1].hijo_derecho; + free(nodo); + nodo = b_leer_nodo(idx, i); + b_leer_header(nodo, &header); + claves = b_leer_claves(nodo, &header); + } + + /* Listo, ahora solo leo la primer clave */ + k = claves[header.cant-1].clave; + free(nodo); + return k; +} + diff --git a/emufs/indice_b.h b/emufs/indice_b.h index 43249f2..535c2e9 100644 --- a/emufs/indice_b.h +++ b/emufs/indice_b.h @@ -42,6 +42,10 @@ INDICE_DATO emufs_indice_b_buscar(INDICE *idx, CLAVE clave); INDICE_DATO *emufs_indice_b_buscar_muchos(INDICE *idx, CLAVE clave, int *cant); +CLAVE emufs_indice_b_obtener_menor_clave(INDICE *idx); + +CLAVE emufs_indice_b_obtener_mayor_clave(INDICE *idx); + /* Private! */ /** Lee un nodo desde el archivo */ char *b_leer_nodo(INDICE *idx, int id); diff --git a/emufs/indices.c b/emufs/indices.c index 370be64..a09bdc3 100644 --- a/emufs/indices.c +++ b/emufs/indices.c @@ -61,6 +61,8 @@ INDICE *emufs_indice_crear(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, IND tmp->borrar_entrada = emufs_indice_b_borrar; tmp->existe_entrada = emufs_indice_b_buscar; tmp->buscar_entradas = emufs_indice_b_buscar_muchos; + tmp->obtener_menor_clave = emufs_indice_b_obtener_menor_clave; + tmp->obtener_mayor_clave = emufs_indice_b_obtener_mayor_clave; break; case IND_B_ASC: /* llenar metodos */ @@ -215,3 +217,25 @@ int emufs_indice_es_igual(INDICE *idx, CLAVE c1, CLAVE c2) } return 0; } + +void emufs_indice_obtener_valor_desde_clave(INDICE *idx, CLAVE k, void *dst) +{ + int error; + char *leido; + EMUFS_REG_SIZE dummy; + + switch (idx->tipo_dato) { + case IDX_FLOAT: + (*((float *)dst)) = k.f_clave; + break; + case IDX_INT: + (*((int *)dst)) = k.f_clave; + break; + case IDX_STRING: + error = 0; + leido = idx->emu_string->leer_registro(idx->emu_string, k, &dummy, &error); + strcpy((char *)dst, leido); + free(leido); + } +} + diff --git a/emufs/indices.h b/emufs/indices.h index 5ed09c7..f38a63a 100644 --- a/emufs/indices.h +++ b/emufs/indices.h @@ -73,6 +73,9 @@ typedef struct _indices_h_ { INDICE_DATO *(*buscar_entradas)(struct _indices_h_ *idx, CLAVE k, int *cant); + CLAVE (*obtener_menor_clave)(struct _indices_h_ *idx); + CLAVE (*obtener_mayor_clave)(struct _indices_h_ *idx); + char *nombre; /**< Nombre Ășnico de busqueda del indice */ char *filename; /**< nombre del archivo de indice */ @@ -127,6 +130,8 @@ INDICE_DATO emufs_indice_buscar(INDICE *primero, char *data); CLAVE emufs_indice_generar_clave(INDICE *idx, char *data); CLAVE emufs_indice_generar_clave_desde_valor(INDICE *idx, char *data); +void emufs_indice_obtener_valor_desde_clave(INDICE *idx, CLAVE k, void *dst); + /** Compara 2 claves de la forma c1 < c2 */ int emufs_indice_es_menor(INDICE *idx, CLAVE c1, CLAVE c2); diff --git a/emufs_gui/facturas.c b/emufs_gui/facturas.c index f1ce517..c699278 100644 --- a/emufs_gui/facturas.c +++ b/emufs_gui/facturas.c @@ -1036,6 +1036,89 @@ void fact_consultas_codigos(char *s) delwin(win); } +void fact_consultas_fechas(char *s) +{ + EMUFS_REG_ID dummy; + char desde_fecha[10], hasta_fecha[10]; + int i; + t_Factura *factura; + t_Lista *lista; + t_Form *form; + WINDOW *win, *win1; + INDICE *idx; + CLAVE k; + + 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, "Desde Fecha", 8, ""); + form_agregar_widget(form, INPUT, "Hasta Fecha", 8, ""); + + form_ejecutar(form, 2, 2); + + strcpy(desde_fecha, form_obtener_valor_char(form, "Desde Fecha")); + strcpy(hasta_fecha, form_obtener_valor_char(form, "Hasta Fecha")); + + form_destruir(form); + werase(win1); + wrefresh(win1); + + /* Si el usuario no ingreso alguno de los datos, lo obtengo del indice */ + idx = emufs_buscar_indice_por_nombre(lst_facturas->fp, "emision"); + if (idx==NULL) PERR("INDICE EMISION NO SE ENCUENTRA!!"); + if (strlen(desde_fecha) == 0) { + k = idx->obtener_menor_clave(idx); + emufs_indice_obtener_valor_desde_clave(idx, k, desde_fecha); + PERR("OBTUVE MENOR CLAVE DESDE EL INDICE"); + PERR(desde_fecha); + } + if (strlen(hasta_fecha) == 0) { + k = idx->obtener_mayor_clave(idx); + emufs_indice_obtener_valor_desde_clave(idx, k, hasta_fecha); + PERR("OBTUVE MAYOR CLAVE DESDE EL INDICE"); + PERR(hasta_fecha); + } + + /* 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, "Numero", DATO_INT, 0, 8); /* numero */ + lista_agregar_columna(lista, "Fecha", DATO_STR, 10, 9); /* emision */ + lista_agregar_columna(lista, "Estado", DATO_STR, 20, 19); /* estado */ + lista_agregar_columna(lista, "Forma de Pago", DATO_STR, 40, 19); /* fp */ + + /* Leo los datos desde el archivo */ +/* for(i=desde_codigo; i<=hasta_codigo; i++) { + factura = fact_buscar(lst_facturas, i, &dummy, &dummy); + if (factura != NULL) { + lista_agregar_fila(lista, + factura->numero, + factura->emision, + get_estado(factura->estado), + get_forma_pago(factura->fp) + ); + } + } + + curs_set(0); + lista_ejecutar(lista); + curs_set(1); + */ + wrefresh(win1); + wrefresh(win); + werase(win1); + werase(win); + wrefresh(win); + delwin(win); +} + void fact_consultas_varias(char *nombre_indice, char *titulo) { int i, cant, error; @@ -1118,12 +1201,13 @@ void fact_consultas(char *s) MENU(mi_menu) { MENU_OPCION("por Codigos", "Consulta de Articulos por rango de codigo."), MENU_OPCION("por Fecha de Emision", "Consulta por fecha unica"), + MENU_OPCION("por Rango de Fecha", "Consulta por rando de fecha de emision"), MENU_OPCION("por Presentacion", "Consulta por Presentacion"), MENU_OPCION("Volver", "Volver al menu anterior.") }; int opt; - while ((opt = menu_ejecutar(mi_menu, 4, "Consulta de Articulos")) != 3) { + while ((opt = menu_ejecutar(mi_menu, 5, "Consulta de Articulos")) != 4) { switch (opt) { case 0: fact_consultas_codigos(s); @@ -1132,6 +1216,9 @@ void fact_consultas(char *s) fact_consultas_varias("emision", "Fecha"); break; case 2: + fact_consultas_fechas(s); + break; + case 3: fact_consultas_varias("presentacion", "Presentacion"); } } -- 2.43.0