]> git.llucax.com Git - z.facultad/75.06/emufs.git/commitdiff
* ADDED : Buscar siguiente clave en un arbol a partir de otra clave,
authorRicardo Markiewicz <gazer.arg@gmail.com>
Thu, 27 May 2004 21:22:31 +0000 (21:22 +0000)
committerRicardo Markiewicz <gazer.arg@gmail.com>
Thu, 27 May 2004 21:22:31 +0000 (21:22 +0000)
 para poder recorrer el arbol de forma ordenada (al parecer no anda,tengo
 que revisar)
 * Agrego busqueda de facturas por rango de fechas y filtro de estado

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

index eba1739c90603b4cc67b89f275aede57d43fadc8..89a5b7715e8792c7670db4e0e1914269e6faa983 100644 (file)
@@ -1132,3 +1132,84 @@ CLAVE emufs_indice_b_obtener_mayor_clave(INDICE *idx)
        return k;
 }
 
+CLAVE emufs_indice_b_obtener_sig_clave(INDICE *idx, CLAVE k)
+{
+       int i;
+       B_NodoHeader header;
+       B_NodoEntry *claves;
+       char *nodo, *tmp;
+       int nodo_id;
+       CLAVE salida;
+       
+       /* Primero busco la clave pasada por parametro */
+       nodo = b_leer_nodo(idx, 0);
+       nodo_id = 0;
+       while (nodo) {
+               b_leer_header(nodo, &header);
+               claves = b_leer_claves(nodo, &header);
+               i=0;
+               while ((i<header.cant) && (emufs_indice_es_menor(idx, claves[i].clave, k))) i++;
+               if ((i<header.cant) && (emufs_indice_es_igual(idx, claves[i].clave, k))) {                              
+                               /* LA ENCONTRE! , ahora busco la siguiente clave!! */           
+                               if ((i+1)<header.cant) {
+                                       if (claves[i].hijo_derecho == -1) {
+                                               /* Joya!, fue facil, la siguiente va en camino! */
+                                               salida = claves[i].clave;
+                                               free(nodo);
+                                               return salida;
+                                       }
+
+                                       /* Mmmmm ... la siguiente esta en uno de mis hijo */
+                                       /* Necesito la mas chica de las siguientes, para eso
+                                        * me voy a mi hijo derecho y de ahi bajo siempre
+                                        * hacia la izquierda hacia una hoja */
+                                       i = claves[i].hijo_derecho;
+                                       free(nodo);
+                                       nodo = b_leer_nodo(idx, i);
+                                       b_leer_header(nodo, &header);
+                                       while (header.hijo_izquierdo != -1) {
+                                               free(nodo);
+                                               nodo = b_leer_nodo(idx, header.hijo_izquierdo);
+                                               b_leer_header(nodo, &header);
+                                       }
+                                       claves = b_leer_claves(nodo, &header);
+                                       salida = claves[0].clave;
+                                       free(nodo);
+                                       return salida;
+                               }
+
+                               /* Fuck, la siguiente clave la tengo que sacar de padre */
+                               /* Busco al mi padre, perdido en un maremoto hace mucho,muchos
+                                * años
+                                */
+                               free(nodo);
+                               nodo = b_leer_nodo(idx, header.padre);
+                               b_leer_header(nodo, &header);
+                               claves = b_leer_claves(nodo, &header);
+                               i = 0;
+                               while ((i<header.cant) && (emufs_indice_es_menor(idx, claves[i].clave, k))) i++;
+                               if (i<header.cant)
+                                       salida = claves[i].clave;
+                               else
+                                       /* No hay mas claves! */
+                                       salida.i_clave = -1;
+                               return salida;
+               } else {
+                       tmp = nodo;
+                       b_grabar_nodo(idx, nodo_id, nodo);
+                       if (i == 0) {
+                               nodo = b_leer_nodo(idx, header.hijo_izquierdo);
+                               nodo_id = header.hijo_izquierdo;
+                       } else {
+                               nodo = b_leer_nodo(idx, claves[i-1].hijo_derecho);
+                               nodo_id = claves[i-1].hijo_derecho;
+                       }
+                       free(tmp);
+               }
+       }
+
+       /* No encontre la clave pasada, no existe */
+       salida.i_clave = -1;
+       return salida;
+}
+
index 535c2e96b00f7c72046fcb66a2ed22f2b5956b66..b60e48ca8b79d82a85d3f54d9f56f018682a9e89 100644 (file)
@@ -58,5 +58,7 @@ void b_leer_header(char *src, B_NodoHeader *header);
  */
 B_NodoEntry *b_leer_claves(char *src, B_NodoHeader *header);
 
+CLAVE emufs_indice_b_obtener_sig_clave(INDICE *idx, CLAVE k);
+
 #endif
 
index a09bdc3f8aa649f294f2c57394187f891e645467..c570894b2259694e30353351d624fc46627a9512 100644 (file)
@@ -63,6 +63,7 @@ INDICE *emufs_indice_crear(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, IND
                        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;
+                       tmp->obtener_sig_clave = emufs_indice_b_obtener_sig_clave;
                break;
                case IND_B_ASC:
                        /* llenar metodos */
index f38a63a0cf4b9a7f11148ad7d4b9625fc7a11df3..73231d5bfbb96f5a05dc3face4c83aee93fcb37a 100644 (file)
@@ -76,6 +76,8 @@ typedef struct _indices_h_ {
        CLAVE (*obtener_menor_clave)(struct _indices_h_ *idx);
        CLAVE (*obtener_mayor_clave)(struct _indices_h_ *idx);
 
+       CLAVE (*obtener_sig_clave)(struct _indices_h_ *idx, CLAVE k);
+
        char *nombre;   /**< Nombre único de busqueda del indice */
        char *filename; /**< nombre del archivo de indice */
 
index c69927858accb680fa6933e09ad0bca17e0bba73..6e38afb4f49ac3918eff7dfeacdb3aa6acbf5f2c 100644 (file)
@@ -1038,10 +1038,8 @@ void fact_consultas_codigos(char *s)
 
 void fact_consultas_fechas(char *s)
 {
-       EMUFS_REG_ID dummy;
        char desde_fecha[10], hasta_fecha[10];
-       int i;
-       t_Factura *factura;
+       char estado[6];
        t_Lista *lista;
        t_Form *form;
        WINDOW *win, *win1;
@@ -1058,11 +1056,12 @@ void fact_consultas_fechas(char *s)
        form = form_crear(win1);
        form_agregar_widget(form, INPUT, "Desde Fecha", 8, "");
        form_agregar_widget(form, INPUT, "Hasta Fecha", 8, "");
-
+       form_agregar_widget(form, RADIO, "Estado", 7, "Todos,PN,CD,CM,SF,PM,NC");
        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"));
+       strcpy(estado, form_obtener_valor_char(form, "Estado"));
 
        form_destruir(form);
        werase(win1);
@@ -1095,22 +1094,40 @@ void fact_consultas_fechas(char *s)
        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) {
+       while (k.i_clave != -1) {
+               t_Factura fact;
+               int error, cant, i;
+               char *leo;
+               EMUFS_REG_SIZE size;
+               INDICE_DATO *datos;
+               CLAVE k1;
+               datos = idx->buscar_entradas(idx, k, &cant);
+               for(i=0; i<cant; i++) {
+                       error = 1;
+                       k1.i_clave = datos[i].id;
+                       leo = lst_facturas->fp->leer_registro(lst_facturas->fp, k1, &size, &error);
+                       if (leo != NULL) {
+                               procesar_leer_factura(&fact, leo, size, lst_facturas);
+                               free(leo);
+                               /*k.i_clave = fact->reg_nota;
+                               error = 0;
+                               fact->nota = lst->fp_texto->leer_registro(lst->fp_texto, k, &size, &error);
+                               */
+                       }
                        lista_agregar_fila(lista,
-                               factura->numero,
-                               factura->emision,
-                               get_estado(factura->estado),
-                               get_forma_pago(factura->fp)
+                               fact.numero,
+                               fact.emision,
+                               get_estado(fact.estado),
+                               get_forma_pago(fact.fp)
                        );
                }
+               if (datos) free(datos);
+               k = idx->obtener_sig_clave(idx, k);
        }
 
        curs_set(0);
        lista_ejecutar(lista);
        curs_set(1);
-       */
        wrefresh(win1);
        wrefresh(win);
        werase(win1);