#include "menu.h"
#include "lista.h"
#include "articulos.h"
+#include "base.h"
+#include "extsort.h"
static t_LstFacturas *lst_facturas;
int eliminar_nodo_factura(t_LstFacturas *lst, t_Reg_Factura *nodo);
#endif
+/* Tipo de dato a meter en el archivo para un ord. externo */
+typedef struct _ord_data_ {
+ int numero;
+ char emision[9];
+ char estado[3];
+ char fp[3];
+ float importe;
+} t_OrdExt_Data;
+
+int comparar_externo(void *it1, void *it2);
+
/* Funciones para carga desde el XML */
static t_Item *leer_items(xmlNode *, int *cant, int size);
static char *leer_nota(xmlNode *, int max);
WINDOW *win, *win1;
INDICE *idx;
CLAVE k_menor, k_mayor;
+ int todo=0;
win = newwin(LINES-4, COLS-2, 2, 1);
win1 = derwin(win, LINES-6, COLS-4, 1, 1);
/* 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!!");
+
+ /* XXX Politica de seleccion de uso de ord externo
+ *
+ * Se usa ordenamiento externo en alguno de estos 2 casos :
+ * * Se requiere un listado de todo el rango de fechas
+ * * Se requiere un listado de todos los Estados
+ *
+ * Para cualquier otro caso, se ordena directamente
+ * en la lista
+ */
if (strlen(desde_fecha) == 0) {
k_menor = idx->obtener_menor_clave(idx);
emufs_indice_obtener_valor_desde_clave(idx, k_menor, desde_fecha);
PERR("OBTUVE MENOR CLAVE DESDE EL INDICE");
PERR(desde_fecha);
+ todo++;
}
if (strlen(hasta_fecha) == 0) {
k_mayor = idx->obtener_mayor_clave(idx);
emufs_indice_obtener_valor_desde_clave(idx, k_mayor, hasta_fecha);
PERR("OBTUVE MAYOR CLAVE DESDE EL INDICE");
PERR(hasta_fecha);
+ todo++;
+ }
+
+ if (strcmp(estado, "Todos") == 0) todo = 2;
+
+ if (todo == 2) {
+ /* Debo utilizar un ord, externo!! */
+ FILE *fp;
+ /* Creo el archivo a ordenar */
+ fp = fopen("tmp_ord.xxx", "w");
+ while (k_menor.i_clave != -1) {
+ t_Factura fact;
+ int error, cant, i;
+ char *leo;
+ t_OrdExt_Data ord;
+ EMUFS_REG_SIZE size;
+ INDICE_DATO *datos;
+ CLAVE k1;
+ datos = idx->buscar_entradas(idx, k_menor, &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);
+ ord.numero = fact.numero;
+ strcpy(ord.emision, fact.emision);
+ strcpy(ord.estado, fact.estado);
+ strcpy(ord.fp, fact.fp);
+ ord.importe = get_importe_factura(fact.items, fact.cant_items, fact.procdoi);
+ fwrite(&ord, sizeof(t_OrdExt_Data), 1, fp);
+ }
+ }
+ if (datos) free(datos);
+ if (fact.items) free(fact.items);
+ k_menor = idx->obtener_sig_clave(idx, k_menor);
+ }
+ fclose(fp);
+ /* Mando a ordenar */
+ /* XXX TODO XXX TODO XXX */
+ /* ORDENAR */
+ extsort("tmp_ord.xxx", 5*sizeof(t_OrdExt_Data), sizeof(t_OrdExt_Data), comparar_externo);
}
-
/* Creo la lista donde mostrar la consulta*/
/* Muestro solo info relevante */
lista = lista_crear(4, win1, COLS-4, LINES-6);
lista_agregar_columna(lista, "Importe", DATO_FLOAT, 50, 8); /* importe */
/* Leo los datos desde el archivo */
- while (k_menor.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_menor, &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);
- */
- }
- if (strcmp(estado, "Todos") != 0) {
+ if (todo != 2) {
+ while (k_menor.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_menor, &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);
+ }
if (strcmp(estado, fact.estado) == 0) {
fprintf(stderr, "Agrego factura num=%d con %d items\n", fact.numero, fact.cant_items);
lista_agregar_fila_ordenada(lista,
);
}
}
+ if (datos) free(datos);
+ if (fact.items) free(fact.items);
}
- if (datos) free(datos);
- if (fact.items) free(fact.items);
k_menor = idx->obtener_sig_clave(idx, k_menor);
+ } else {
+ /* Cargo la lista a partir del archivo ordenado externamente */
+ FILE *fp;
+ t_OrdExt_Data ord;
+ fp = fopen("tmp_ord.xxx", "r");
+ while (!feof(fp)) {
+ if (fread(&ord, sizeof(t_OrdExt_Data), 1, fp) != 1) continue;
+ lista_agregar_fila(lista,
+ ord.numero,
+ ord.emision,
+ get_estado(ord.estado),
+ get_forma_pago(ord.fp),
+ ord.importe
+ );
+ }
}
-
curs_set(0);
lista_ejecutar(lista);
curs_set(1);
return 1; /* Hay alguna factura que contiene el articulo */
}
+int comparar_externo(void *it1, void *it2)
+{
+ t_OrdExt_Data *d1, *d2;
+ d1 = (t_OrdExt_Data *)it1;
+ d2 = (t_OrdExt_Data *)it2;
+
+ /* Primero veo de ordenar por Estado */
+ if (strcmp(d1->estado, d2->estado) == 0) {
+ /* Tienen el mismo estado, los ordeno por numero de fatura */
+ return d1->numero - d2->numero;
+ }
+
+ /* como no son iguales, comparo los estados */
+ return strcmp(d1->estado, d2->estado);
+}
+