]> git.llucax.com Git - z.facultad/75.06/emufs.git/commitdiff
* Agrego a los indices 2 funciones para obtener la menor y mayor clave.
authorRicardo Markiewicz <gazer.arg@gmail.com>
Thu, 27 May 2004 15:34:01 +0000 (15:34 +0000)
committerRicardo Markiewicz <gazer.arg@gmail.com>
Thu, 27 May 2004 15:34:01 +0000 (15:34 +0000)
 * Agrego un metodo para convertir una clave en valor
 * Agrego busqueda por rando de fechas en las facturas.

emufs/emufs.c
emufs/emufs.h
emufs/indice_b.c
emufs/indice_b.h
emufs/indices.c
emufs/indices.h
emufs_gui/facturas.c

index 685f091795290b29135a3c7391f138f06056d18d..cc33ee38472b0bba99cb1c7df259ee3eef0a1278 100644 (file)
@@ -528,3 +528,16 @@ EMUFS_BLOCK_ID emufs_get_new_block_number(EMUFS *emu)
        fclose(fp);
        return num+1;
 }
        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;
+}
+
index ad28d7075f4d269c0356f768a24ece2148094ce8..b598f6981996560b41c043a72023a3f4228d45a9 100644 (file)
@@ -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_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);
 EMUFS_BLOCK_ID emufs_create_new_block(EMUFS *emu);
 
 EMUFS_BLOCK_ID emufs_get_new_block_number(EMUFS *emu);
index 2e1615b25fe2360d77b8933c126d32db80841107..eba1739c90603b4cc67b89f275aede57d43fadc8 100644 (file)
@@ -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;
+}
+
index 43249f2e98d438ab4fcdebbdb30ea0a984d38452..535c2e96b00f7c72046fcb66a2ed22f2b5956b66 100644 (file)
@@ -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);
 
 
 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);
 /* Private! */
 /** Lee un nodo desde el archivo */
 char *b_leer_nodo(INDICE *idx, int id);
index 370be6499c206ea3bf022782a7fa12ffb0dc18c2..a09bdc3f8aa649f294f2c57394187f891e645467 100644 (file)
@@ -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->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 */
                break;
                case IND_B_ASC:
                        /* llenar metodos */
@@ -215,3 +217,25 @@ int emufs_indice_es_igual(INDICE *idx, CLAVE c1, CLAVE c2)
        }
        return 0;
 }
        }
        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);
+       }
+}
+
index 5ed09c7df1cc3d687c502a164365a68b99a82216..f38a63a0cf4b9a7f11148ad7d4b9625fc7a11df3 100644 (file)
@@ -73,6 +73,9 @@ typedef struct _indices_h_ {
        
        INDICE_DATO *(*buscar_entradas)(struct _indices_h_ *idx, CLAVE k, int *cant);
 
        
        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 */
 
        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);
 
 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);
 
 /** Compara 2 claves de la forma c1 < c2 */
 int emufs_indice_es_menor(INDICE *idx, CLAVE c1, CLAVE c2);
 
index f1ce517e9bf71181859da6bc2a098559c6e6079f..c69927858accb680fa6933e09ad0bca17e0bba73 100644 (file)
@@ -1036,6 +1036,89 @@ void fact_consultas_codigos(char *s)
        delwin(win);
 }
 
        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;
 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(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;
        
                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);
                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_varias("emision", "Fecha");
                        break;
                        case 2:
+                               fact_consultas_fechas(s);
+                       break;
+                       case 3:
                                fact_consultas_varias("presentacion", "Presentacion");
                }
        }
                                fact_consultas_varias("presentacion", "Presentacion");
                }
        }