// >>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // Reporte: AUXILIAR DE MOVIMIENTOS POR CONCEPTO, CLIENTES/PROVEDORES AuxMovPorCpto.rpt // // Sistema: ADMINPAQ Versión v1.0 Windows // // Descripcion: El auxiliar de movimientos imprime todos los documentos registrados para un // cliente de acuerdo al rango de fechas seleccionado. // Este reporte imprime totales, agrupados Por Concepto, Por Cliente y un Total General. // // Consideraciones : // Creación : Felix de la Cruz S. 10/Septiembre/2001 // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // Historia de modificaciones // Fecha Nombre IDLotus Descripcion // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // ************************************************************************************************* // INCLUSION DE ARCHIVOS // ************************************************************************************************* Incluye LibAdminPaq.rpt Incluye LibCliProv.rpt // ************************************************************************************************* // INICIO PARAMETROS // ************************************************************************************************* Parametro pDeLaFecha = '20010101' // Inicio del periodo actual. Parametro pAlaFecha = '20011231' // Fin del periodo actual Parametro pDelCliente = ' ' // clave del primer cliente en el rango Parametro pAlCliente = ' ' // clave del ultimo cliente en el rango Parametro pIdListaCptos = '5,11,13,14' // Para Clientes, Lista de conceptos de cargo // Para Proveedores, Lista de conceptos de Abonos Parametro pSoloConDoctos = 0 // 1 = Si, 0 = No Parametro pCualesClientes = 0 // 0 =todos, 1= Activos, 2= InActivos Parametro pIdMoneda = 1 // 1 = ID moneda Peso mexicano Parametro pQueTipo = 1 // 0 = Clientes, 1 = Proveedores Parametro pIdClase1 = 0 // por omisión deben recibir 0 = ninguna Parametro pIdClase2 = 0 Parametro pIdClase3 = 0 Parametro pIdClase4 = 0 // deben ser el ID de la clasificacion Parametro pIdClase5 = 0 Parametro pIdClase6 = 0 // por omisión deben recibir 0 = ninguna // ************************************************************************************************* // INICIO APERTURA TABLAS // ************************************************************************************************* // Nombres terminados en Lib, indican que la tabla fue abierta explicitamente para alguna Fx de libreria UsaEmpresa tEmpresa;'CONTPAQ I Facturacion' // Parametros de la empresa UsaTabla tParametros = tEmpresa['mgw10000'] // Usa el indice primario // Clientes y Provedores UsaTabla tClientes = tEmpresa['mgw10002'] tClientes.Usaindice['iCodigoTipo'] // cCodigoCliente + cTipoCliente // Conceptos de los documentos UsaTabla tConceptos = tEmpresa['mgw10006'] tConceptos.UsaIndice['cIdConceptoDocumento'] // Documentos UsaTabla tDocumentos = tEmpresa['mgw10008'] Alias 'tDoctos1' tDocumentos.Usaindice['iClienteProvCptoFecha'] //IdClienteProveedor+cIdCpto+cFecha+cSerie+cFolio UsaTabla tDoctoslib = tEmpresa['mgw10008'] Alias 'tDoctos2' tDoctosLib.UsaIndice['iClienteProveedorFecha'] //IdClienteProveedor+cFecha+cSerie+cFolio // Acumulados por periodo UsaTabla tAcumuladosLib = tEmpresa['mgw10018'] // cIdTipoAcumulado + cIdOwner1 + cIdOwner2 tAcumuladosLib.Usaindice['iAcumImpteOwnerEjerMoneda'] // + cIdEjercicio + cIdMoneda // Valores de clasificaciones, UsaTabla tValoresDeClasif = tEmpresa['mgw10020'] tValoresDeClasif.UsaIndice[''] // Periodos UsaTabla tPeriodos = tEmpresa['mgw10031'] // Usa el indice primario, cIDEjercicio tPeriodos.UsaIndice['cNumeroEjercicio'] // tabla de monedas y su tipo de cambio UsaTabla tMonedas = tEmpresa['mgw10034'] tMonedas.Usaindice[''] // Usa el índice primario, por cIdMoneda // TiposCambio Usatabla tTiposCambioLib = tEmpresa['mgw10035'] tTiposCambioLib.Usaindice['iMonedaFecha'] // cIdMoneda + cFecha // ************************************************************************************************* // DEFINICION DE COLUMNAS // ************************************************************************************************* // C0 C2 C4 C6 C8 C10 C12 C14 Columnas 15; 1.65,0.15,0.75,0.15,1.2,0.15,2.1,0.15,2.1,0.15,2.1,0.15,1.95,0.15,1.2,1 UsaLetra 'Arial' Altura 9 [C0,C2,C4,C12].Decimales 0 [C0,C2,C4,C12].Blanco ' ' [C6,C8,C10,C14].Coma tMonedas.Busca[@Str(pIdMoneda;0)] gDecimales = tMonedas(cDecimalesMoneda) [C6,C8,C10].Decimales gDecimales [C6,C8,C10].Blanco '0.00' [C14].Decimales 4 [C14].Blanco '0.0000' [C6,C8,C10,C14].Corchete True // ************************************************************************************************* // VARIABLES GLOBALES // ************************************************************************************************* gHoy = fFormateaFecha(@Hoy();0) gDelaFecha = '' gAlaFecha = '' gPeriodo = 0 gIdEjercicio = 0 gNombreMoneda = tMonedas(cNombreMoneda) gNombresCptos = '' // guardará una lista con los nombres de los cptos seleccionados gSaldoCliente = 0.0 // Tiene el saldo inicial originalmente, pero se modifica con cada // importe adicional gGranTotalCargos = 0.0 // variables para los totales generales gGranTotalAbonos = 0.0 gYaSeImprimioCliente = 0 // ************************************************************************************************* // FUNCIONES <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // ************************************************************************************************* // ================================================================================================= // Función área sensible al contexto // ================================================================================================= DefFunc ContextoDetalleDocto(aNumeroColumna; aValor) Local lTipo Si pQueTipo = 0 // Clientes lTipo = 1 // Ventas Sino lTipo = 0 // Compras FinSI EJECUTA tEmpresa->SysDirDatos & '\Reportes\Facturacion\ImpDoctos.RTW';@Escoge(aValor;1),@Escoge(aValor;1),@Escoge(aValor;2),@Escoge(aValor;3),@Escoge(aValor;3),@Escoge(aValor;0),' ',' ',' ',' ',' ',0,1,0,0,2,1,lTipo;tEmpresa->Directorio FinFunc // ************************************************************************************************* Deffunc fColumnas(aTipo) Si aTipo = 1 // C0 C2 C4 C6 C8 C10 C12 C14 Columnas 15; 1.65,0.15,0.75,0.15,1.2,0.15,2.1,0.15,2.1,0.15,2.1,0.15,1.95,0.15,1.2,1 Sino // C0 C2 C4 C6 C8 C10 C12 C14 Columnas 15; 2.3,0.15,0.1,0.15,1.2,0.15,2.1,0.15,2.1,0.15,2.1,0.15,1.95,0.15,1.2,1 Finsi FinFunc // ************************************************************************************************* // Esta función recupera y guarda en una lista, los nombres de los conceptos, para tenerlos en // memoria y evitar lectura con cada cliente. // ************************************************************************************************* Deffunc fCargaNombresCptos() Local lPosicion lPosicion = 0 Mientras @Escoge(pIdListaCptos;lPosicion)!= '' tConceptos.Busca[@Escoge(pIdListaCptos;lPosicion)] Si lPosicion = 0 gNombresCptos = tConceptos(cNombreConcepto) Sino gNombresCptos = gNombresCptos & ','&tConceptos(cNombreConcepto) Finsi lPosicion = lPosicion +1 FinMientras FinFunc // ************************************************************************************************* // Descripcion : Busca algun registro que coincida con el campo aIDBuscado, y alguna de las // fechas que sea menor o igual que aFechaFin. // Salida : modifica el argumento aFechaIni, para regresar la fecha en que se encontro el 1er. // registro que coincide // Posicion : tiene la posición dentro de la lista, que corresponde al concepto // ************************************************************************************************* Deffunc BuscaAlgunReg(aFechaIni;aFechaFin;aIdBuscado;aTblDeBusqueda:TABLA;aListaCptos) Local lpos, lFechaIni lFechaIni = aFechaIni lpos = 0 Mientras @Escoge(aListaCptos;lpos) != '' aTblDeBusqueda.BUSCA[aIdBuscado &':'& @Escoge(aListaCptos;lpos)] Si aTblDeBusqueda->Encontro aFechaIni = lFechaIni // Busca la llave completa, de otra forma nunca entraria al ciclo aTblDeBusqueda.BUSCA[aIdBuscado &':'& @Escoge(aListaCptos;lpos)&':' &aFechaIni] // si lo encontro en la primer fecha, ya no entra Mientras aFechaIni <= aFechaFin Y !aTblDeBusqueda->ENCONTRO aTblDeBusqueda.BUSCA[aIdBuscado &':'& @Escoge(aListaCptos;lpos)&':' &aFechaIni] Si !aTblDeBusqueda->Encontro aFechaIni = fFechaSiguiente(aFechaIni) Finsi FinMientras // Si lo encontro se sale del ciclo para dejar a lPos en la pos. del primer Cpto encontrado Si aTblDeBusqueda->Encontro Finciclo Sino lpos = lpos + 1 Finsi Sino lpos = lpos + 1 Finsi FinMientras Retorna lpos Finfunc // ************************************************************************************************* // ************************************************************************************************* Deffunc fDefineNaturaleza(atDocto:TABLA;aCargo;aAbono;aSaldo) Local lNaturaleza // Se verifica la naturaleza por aquellos doctos de Utilidad O perdida Cambiaria lNaturaleza = atDocto(cNaturaleza) // 28. Utilidad Cambiaria Cliente (cargo) // 29. Perdida Cambiaria Cliente (abono) // 30. Utilidad Cambiaria Provedor(abono) // 31. Perdida Cambiaria Proveedor(cargo) Si atDocto(cIdDocumentoDe) = 28 O atDocto(cIdDocumentoDe)= 30 lNaturaleza = 0 // son cargos Finsi Si atDocto(cIdDocumentoDe) = 29 O atDocto(cIdDocumentoDe)= 31 lNaturaleza = 1 // son abonos Finsi Si lNaturaleza = 0 aCargo = fCambiarMonedaDoctoAReporte(atDocto; tTiposCambioLib; atDocto(cTotal); pIdMoneda; tClientes(cIdMoneda)) aAbono = 0.0 Sino aAbono = fCambiarMonedaDoctoAReporte(atDocto; tTiposCambioLib; atDocto(cTotal); pIdMoneda; tClientes(cIdMoneda)) aCargo = 0.0 Finsi //Se actualiza el saldo del cliente Si pQueTipo = 0 aAbono = -aAbono sino aCargo = -aCargo Finsi aSaldo =aSaldo + aCargo + aAbono FinFunc // ************************************************************************************************* // Descripcion : Imprime los datos del cliente, como encabezado para despues imprimir el detalle // Obtiene el saldo inicial ya que es parte de los datos del cliente // Entrada : La tabla de clientes, con el cliente a imprimir abierto // Salida : No regresa valor, // pero imprime los renglones de 1.- Datos del cliente; 1.- Saldo inicial el cliente // ************************************************************************************************* DefFunc fImpDatosCliente(aTCliente:TABLA;aSaldo;aTipo) local lRenglon lRenglon = '' NEGRITAS TRUE Si aTipo = 0 Texto 'Cliente: ' & fMascarilla(atCliente(cCodigoCliente);tParametros(cMascarillaClientes)) Sino Texto 'Proveedor: ' & fMascarilla(atCliente(cCodigoCliente);tParametros(cMascarillaClientes)) Finsi Imprime Texto 'Nombre: ' & atCliente(cRazonSocial) Imprime 1 NEGRITAS FALSE fColumnas(2) lRenglon[0] = 'Saldo Inicial' lRenglon[10]= aSaldo Imprime lRenglon fColumnas(1) FinFunc // ************************************************************************************************* // ************************************************************************************************* Deffunc fImprimeDocumento(atDocto:TABLA; aSaldo; aNombreCpto; aCargo; aAbono) Local lRenglon Local lSerieDocto Si aNombreCpto != '' Negritas True Texto 'Concepto: ' & aNombreCpto Imprime Negritas False FinSi lRenglon = '' lRenglon[0] = fFormateaFecha(atDocto(cFecha);0) lRenglon[2] = atDocto(cSerieDocumento) lRenglon[4] = atDocto(cFolio) DEFREGION ContextoDetalleDocto Si atDocto(cSerieDocumento) = '' lSerieDocto = ' ' Sino lSerieDocto = atDocto(cSerieDocumento) FinSi [C4].REGIONINFO atDocto(cIdDocumentoDe) & ',' & atDocto(cFecha) & ',' & lSerieDocto & ',' & atDocto(cFolio) Si atDocto(cNaturaleza) = 0 O atDocto(cIdDocumentoDe) = 28 O atDocto(cIdDocumentoDe) = 30 // Si se trata de un docto de cargo // si es un cliente el docto debe tener fecha de venc. lRenglon[12] = (pQueTipo = 0 ? fFormateaFecha(atDocto(cFechaVencimiento);0): ' ') lRenglon[6] = aCargo Sino // Entonces es un abono // si es un proveedor al docto debe tener fecha venc. lRenglon[12] = (pQueTipo = 1 ? fFormateaFecha(atDocto(cFechaVencimiento);0): ' ') lRenglon[8] = aAbono FInsi lRenglon[10] = aSaldo lRenglon[14] = atDocto(cTipoCambio) Imprime lRenglon FinFunc // ************************************************************************************************* // Salidas: 1 = indica que el cliente no aplica, debe descartarse // 0 = indica que el cliente no debe descartarse. // ************************************************************************************************* DefFunc fDiscriminaCliente(aCliente:TABLA) Local lRegresa lRegresa = 0 // Se salta el Cliente NINGUNO Si aCliente(cIdClienteProveedor) = 0 lRegresa = 1 Finsi // Si se requieren los clientes y no se trata de un cliente:(1=cliente,2=cliente/provedor,3= proveedor) Si pQueTipo = 0 Y (aCliente(cTipoCliente) > 2) lRegresa = 1 Finsi // Si se requieren los Proveedores y no se trata de un Proveedor Si pQueTipo = 1 Y (aCliente(cTipoCliente) < 2) lRegresa = 1 Finsi // Si Estado solicitado no es Todos y No Coincide el tipo de cliente con el parametro // pCualesClientes = 2(inactivos) aplicando %2 = 0, 0 = inactivos en la tabla de clientes Si (pCualesClientes != 0) Y (aCliente(cEstatus) != pCualesClientes%2) lRegresa = 1 Finsi // Se Revisan las CLASIFICACIONES, solo en el caso de haber seleccionado al menos una Si gNumDeClases > 0 Si !fMiembroDeUnaClase(aCliente;gNumDeClases;gListIdDeClases;pQueTipo) // Sa salta el cliente actual, por no pertenecer a alguna de las clasificaciones lRegresa = 1 Finsi Finsi Retorna lRegresa FinFunc // ************************************************************************************************* // Salidas: 1 = indica que el Docto no aplica, debe descartarse // 0 = indica que el Docto no debe descartarse. // ************************************************************************************************* DefFunc fDiscriminaDocumento(atDocumento:TABLA) Local lRegresa lRegresa = 0 // Si no es cargo o abono y no es docto de utilidad o perdida cambiaria) Si atDocumento(cNaturaleza) = 2 Y !(atDocumento(cIDDocumentoDe) >= 28 Y atDocumento(cIDDocumentoDe) <= 31) lRegresa =1 Finsi // Si no esta afectado se lo brinca Si atDocumento(cAfectado) != 1 lRegresa =1 Finsi // Los documentos de utilidad perdida cambiaria solo se incluyen si su moneda corresponde a la del reporte Si atDocumento(cIdDocumentoDe) >= 28 Y atDocumento(cIdDocumentoDe) <= 31 Si atDocumento(cIdMoneda) != pIdMoneda lRegresa = 1 FinSi FinSi // CASO Clientes/Proveedores : se descartan los cargos que no son de clientes y los abonos // que no son de proveedores, solo imprime los doctos de acuerdo a el tipo de reporte pedido Si pQueTipo = 0 y atDocumento(cUsaCliente) = 0 // cargo pero no es docto de cliente lRegresa =1 Finsi Si pQueTipo = 1 y atDocumento(cUsaProveedor) = 0 // abono pero no es docto de proveedor lRegresa =1 Finsi Retorna lRegresa FinFunc // ************************************************************************************************* // ************************************************************************************************* Deffunc fImprimeTotalConcepto(aSaldo;aTotalCargos;aTotalAbonos) Local lRenglon Columnas 15; 3.50,0.15,0.15,0.15,0.05,0.05,2.1,0.15,2.1,0.15,2.1,0.15,1.95,0.15,1.2,1 [C6,C8].Subrayacol '-' lRenglon[6] = aTotalCargos lRenglon[8] = aTotalAbonos Imprime lRenglon Imprime 1 fcolumnas(2) FinFunc // ************************************************************************************************* // Recibe le saldo por parámetro, los cargos y abonos los toma de variable globales // ************************************************************************************************* Deffunc fImprimeTotalesCliente(aSaldo) Local lRenglon Columnas 15; 3.50,0.15,0.15,0.15,0.05,0.05,2.1,0.15,2.1,0.15,2.1,0.15,1.95,0.15,1.2,1 [C6,C8].Subrayacol '-' Si pQuetipo = 0 lRenglon[0] = ' Total cliente' Sino lRenglon[0] = ' Total proveedor' FinSi lRenglon[6] = gTotalCargosCliente lRenglon[8] = gTotalAbonosCliente Imprime lRenglon Imprime 1 // Acumula Totales generales gGranTotalCargos = gGranTotalCargos + gTotalCargosCliente gGranTotalAbonos = gGranTotalAbonos + gTotalAbonosCliente FinFunc // ************************************************************************************************* // Solo imprimie totales generales, son varoables de alcance global // ************************************************************************************************* Deffunc fImprimeGranTotal() Local lRenglon,lSubRaya lSubRaya = '' lSubRaya = '================'[C6,C8] Saltalin 1 Imprime lSubRaya Columnas 15; 3.50,0.15,0.15,0.15,0.05,0.05,2.1,0.15,2.1,0.15,2.1,0.15,1.95,0.15,1.2,1 lRenglon[0] = ' Total General' lRenglon[6] = gGranTotalCargos lRenglon[8] = gGranTotalAbonos Imprime lRenglon FinFunc // ************************************************************************************************* // ENCABEZADO // ************************************************************************************************* Encab Texto '@TC{156;0;89}@S{8}Factura Electrónica' Hoja '"@TC{0,0,0}@S{8}Hoja: ' Imprime Texto '@TC{0,0,0}@S{8}Moneda: ' & gNombreMoneda Texto '"@TC{0,0,0}@S{8}Fecha: ' & gHoy Imprime Texto '^@TC{0,0,0}@S{22}' & tEmpresa->Nombre Imprime Si pQueTipo = 0 Texto '^@TC{0,0,0}@S{16}' & 'AUXILIAR DE MOVIMIENTOS POR CLIENTE' Sino Texto '^@TC{0,0,0}@S{16}' & 'AUXILIAR DE MOVIMIENTOS POR PROVEEDOR' FinSi Imprime gDelaFecha = fFormateaFecha(pDelaFecha;0) gAlaFecha = fFormateaFecha(pAlaFecha;0) Texto '^@TC{0,0,0}@S{16}'& 'Del: ' & gDelaFecha & ' Al: ' & gAlaFecha Imprime // ===== Se Revisan las clasificaciones, para recuperarlas e imprimirlas en el encabezado fRevisaClases(tValoresDeClasif) // ===== Fin de la revision de clasificaciones NEGRITAS TRUE Altura 9 Texto '@TC{0,0,0}@L{-1}' Imprime Texto C10;'^Saldo' Texto C14;'^Tipo' Imprime Texto C0; 'Fecha' Texto C2; 'Serie' Texto C4; 'Folio' Texto C6; '^Cargos' Texto C8; '^Abonos' Si pQueTipo = 0 Texto C10;'^Cliente' Sino Texto C10;'^Proveedor' Finsi Texto C12;'Vence' Texto C14;'^Cambio' Imprime 1 Texto '@TC{0,0,0}@L{-1}' Imprime NEGRITAS FALSE FinEncab // ************************************************************************************************* // PRINCIPAL <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // ************************************************************************************************* Si pDelCliente = ' ' tClientes.Busca Primero pDelCliente = tClientes(cCodigoCliente) Finsi Si pAlCliente = ' ' tClientes.Busca Ultimo pAlCliente = tClientes(cCodigoCliente) Finsi tParametros.Busca Primero // primeto carga todos los nombres de los conceptos, solo una vez fCargaNombresCptos() // Esta función se debe ejecutar antes del cuerpo del reporte, para inicializar algunas valores // Globales para la biblioteca LibAdminPAQ.rpt fIniFechasHistoria(tPeriodos) // Obtener el Ejercicio y el Periodo que le corresponde a pFechaIni, para calcular saldo inicial // Se calculan al inico y se pasan como parametros, para calcularlos solo una vez. fEjercicioPeriodo(pDelaFecha;&gPeriodo;&gIdEjercicio;tPeriodos) Mientras[tClientes.Busca[pDelCliente & '..' & pAlCliente ]; tClientes->Encontro ; tClientes.Busca Siguiente[1]] Si fDiscriminaCliente(tClientes) =1 Continua Finsi Si pIdMoneda != 1 Y pIdMoneda != tClientes(cIdMoneda) Continua FinSi // Se inicializa la fecha con la que se realizaran las busquedas en el rango de fechas gFechaBusqueda = pDeLaFecha gPosicion = 0 gTotalCargosCliente = 0.0 gTotalAbonosCliente = 0.0 gYaSeImprimioCliente = 0 // busca Algun docto , debe estar afectado y dentro del rango // Si encontro tDocumentos queda en el registro encontrado y gFechaBusqueda en la fecha en que se encontro gPosicion = BuscaAlgunReg(&gFechaBusqueda;pAlaFecha;tClientes(cIdClienteProveedor);&tDocumentos;pIdListaCptos) // gPosicion tiene la posicion del Primer ID que encontro // si no encontró, tiene una posicion mayor que el numero de elementos y debe regresar NULL // Todos aun sin Doctos O el Cliente si tiene Doctos Si (pSoloConDoctos = 0) O (tDocumentos->ENCONTRO ) // se le pasa la tabla de tDoctoslib, por que tiene un indice diferente a la tDocumentos gSaldoCliente = fSaldoInicial(tClientes;gIdEjercicio;gPeriodo;pIdMoneda;pDelaFecha;pQueTipo;tAcumuladosLib;tDoctoslib;tTiposCambioLib) // Se barre cada uno de los conceptos, iniciando por el primero que encontro Mientras @Escoge(pIdListaCptos ; gPosicion) != '' // Se obtine el nombre del concepto en proceso y se inicializa el contador de doctos por Cpto gNombreCpto = @Escoge(gNombresCptos;gPosicion) gAlMenosUnDocto = 0 // Totales por concepto gTotalCargosCpto = 0.0 gTotalAbonosCpto = 0.0 // Se buscan movtos asociados a el concepto en todo el rango de fechas Mientras gFechaBusqueda <= pAlaFecha // Ahora si barre todos los movimientos a partir del primero que ya habia encontrado // la Llave base se refiere al IdCliente y el IdConcepto, solo cambiaria la fecha gLlaveBase = @Str(tClientes(cIdClienteProveedor);0)&':'&@Escoge(pIdListaCptos ; gPosicion) Mientras [tDocumentos.BUSCA[ gLlaveBase & ':' & gFechaBusqueda]; tDocumentos->ENCONTRO; tDocumentos.BUSCA SIGUIENTE[3]] // Se saltan los doctos que no deben aplicar Si fDiscriminaDocumento(tDocumentos) = 1 Continua Finsi Si gYaSeImprimioCliente = 0 fImpDatosCliente(tClientes; gSaldoCliente; pQueTipo) gYaSeImprimioCliente = 1 FinSi // Se define si es saldo o abono, y se afecta el saldo inicial fDefineNaturaleza(tDocumentos; &gCargo; &gAbono; &gSaldoCliente) // Se imprime el Documento. El nombre del concepto solo se imprime la primera vez. gAlMenosUnDocto = gAlMenosUnDocto +1 fImprimeDocumento(tDocumentos; gSaldoCliente; gNombreCpto; gCargo; gAbono) // Solo la primera vez se imprime el nombre gNombreCpto = '' // Afectar los Totales por Concepto gTotalCargosCpto = gTotalCargosCpto + gCargo gTotalAbonosCpto = gTotalAbonosCpto + gAbono // Afectar los totales por Cliente / Proveedor gTotalCargosCliente = gTotalCargosCliente + gCargo gTotalAbonosCliente = gTotalAbonosCliente + gAbono FinMientras // Fin del mientras Documentos.busca gFechaBusqueda = fFechaSiguiente(gFechaBusqueda) FinMientras // mientras la fecha es menor // se imprime los totales de concepto Si gAlMenosUnDocto > 0 fImprimeTotalConcepto(gSaldoCliente; gTotalCargosCpto; gTotalAbonosCpto) FinSi // reinicia la fecha para seguir con la busqueda desde la fecha inicial gFechaBusqueda = pDeLaFecha gPosicion = gPosicion + 1 FinMientras // se imprimen los totales del cliente Si gYaSeImprimioCliente = 1 fImprimeTotalesCliente(gSaldoCliente) FinSi Finsi // Fin del Si solo con documentos FinMientras // Fin del mientras tClientes.busca // se imprimen los totales generales fImprimeGranTotal() // FIN DEL REPORTE