// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // Reporte: ESTADO DE CUENTA EN EXCEL // // Sistema: ADMINPAQ Versión v1.0 Windows // // Descripcion: En Caso de mostrar información de Clientes : // El Estado de Cuenta despliega los Documentos del Cliente en un rango // de Fechas seleccionados, el orden puede ser : // a)Si se trata de un cargo: en orden de acuerdo a la serie-folio. // b)Si se trata de un abono: Aparecera despues del cargo al que salda, // o al final ordenado por serie-folio si es que no salda ningun cargo o // le queda un saldo a favor. // // En Caso de mostrar información de Proveedores : // El Estado de Cuenta despliega los Documentos del Proveedor en un rango // de Fechas seleccionados, el orden puede ser : // a)Si se trata de un Abono: en orden de acuerdo a la serie-folio. // b)Si se trata de un Cargo: Aparecera despues del Abono al que salda, // o al final ordenado por serie-folio si es que no salda ningun Abono o // le queda un saldo a favor. // Consideraciones : // Creación : // Revisiones : // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // Historia de modificaciones // Fecha Nombre IDLotus Descripcion // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // 28/01/2002 MOFM SC 25 Se agregó el parámetro pSoloConSaldo, se // 29/10/2002 LAP N.D.1427 En el caso de clientes/proveedores, si se // imprime el Estado de Cuenta del Cliente con // el filtro "Solo con documentos" no debe de // considerar los documentos que tenga como // proveedor. // - fImpDatosCliente // - fImprimeResumen // - Cuerpo del reporte // 06/12/2002 LAP N.D.1672 Corrección a fin de que si el filtro de Solo // con documentos (pSoloConDoctos) este en Todos // realmente se impriman todos los clientes, ya que // actualmente solo imprime los que tienen documentos // - Cuerpo del reporte // 23/01/2003 LAP N.D.1739 Función para escribir las clasificaciones // en EXCEL // - fImprimeClasesExcel // 27/03/2003 LAP Los documentos asociados se imprimen identados // en la fecha // - fImprimeDocumento // - fImprimeAbonosCargosAsociados // - Cuerpo del reporte // 28/07/2003 CILA N.D.2335 Se cambio el numero de decimales de 2 a 4 // en la columna de Tipo de Cambio. // 18/06/2004 EGV N.D.2808 Se modificó: fImprimeDocumento. // 16/03/2005 HVA N.D.3023 Saldos con Revision entre colegas // 20/04/2005 LAP N.D.3023 Incluir los documentos de utilidad / perdida // cambiaria siempre y cuando correspondan a la // moneda del reporte. // - fImprimeAbonosCargosAsociados // Expresar los importes de los documentos en la moneda // del reporte. Considerando que los documentos en moneda // base tienen el tipo de cambio de la moneda del cliente // a la moneda base. Utilizar fCambiarMonedaDoctoAReporte de // LibAdminPAQ.rpt // - fImprimeDocumento // 06/07/2005 LAP N.D.3347 Incluir los documentos de utilidad / perdida cambiaria cuando // el documento de abono no se imprima. (LAP) // - Cuerpo del reporte // - fImprimeUtilidadesAsociadas (NUEVO) // 02/12/2005 LAP N.D.3010 Nuevo esquema de búsquedas parciales para agilizar los reportes // - Cuerpo del reporte // - BuscaAlgunReg (ELIMINADO) // 27/02/2009 ELVS N.D.5683 ERROR NO SE MUESTRA INFORMACION DE UN CLIENTE QUE TIENE MONEDA // DOLARES AL EJECUTAR EL REPORTE DE ESTADO DE CUENTA SELECIONANDO // MONEDA EN PESO MEXICANO. // Donde consideraba el pIdMoneda ahora será sustituido por el pIdMoneda1 // excepto para el caso del filtro de moneda del cliente. // 22/04/2009 JENL N.D.5759 ERROR NO EJECUTA CORRECTAMENTE EL REPORTE DE ESTADO DE CUENTA A // EXCEL CUANDO SE SELECCIONA EN EL FILTRO LA OPCION UN CLIENTE POR // HOJA DEL CAMPO FORMATO DE IMPRESION // Se modifico: Pricipal // Se agrego: xlSaltoPagina // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< //****************************************************************************** //Funciones de librería. Incluye LibAdminPaq.rpt Incluye LibCliProv.rpt //****************************************************************************** //Parámetros. Parametro pDeLaFecha = '20030101' Parametro pAlaFecha = '20031231' Parametro pDelCliente = ' ' // Espacio en blanco, clave del primer cliente en el rango Parametro pAlCliente = ' ' // Espacio en blanco, clave del ultimo cliente en el rango Parametro pSoloConDoctos = 0 // 1 = Si, 0 = No Parametro pSoloConSaldo = 0 // 0 = todos, 1 = Sólo con saldo Parametro pCualesClientes = 0 // 0 = todos, 1 = Activos, 2 = InActivos Parametro pIdMoneda = 1 // 1 = ID moneda Peso mexicano // N.D.5683 Este parámetro solo mostrará los proveedores o clientes // que en el catálogo tengan definida esta moneda en moneda // del cliente o proveedor. Parametro pFormato = 0 // 0 = Continuo, 1 = Cliente por Hoja Parametro pQueTipo = 1 // 0 = Clientes , 1 = Proveedores Parametro pConDoctosNoAfectados = 0 // 0 = No, 1 = Si Parametro pIdClase1 = 0 // Por omisión deben recibir 0 = ninguna Parametro pIdClase2 = 0 Parametro pIdClase3 = 0 Parametro pIdClase4 = 0 // Deben ser los ID´s de los valores de las clases seleccionadas Parametro pIdClase5 = 0 // Para cada tipo de clasificación. Parametro pIdClase6 = 0 // Por omisión deben recibir 0 = ninguna Parametro pIdMoneda1 = 1 // N.D.5683 Este parámetro de moneda mostrará en que // moneda se visualizará el estado de cuenta. //****************************************************************************** //Apertura de tablas. //Nombres terminados en Lib, indican que la tabla fue abierta explícitamente //para alguna Fx de librería UsaEmpresa tEmpresa;'CONTPAQ I Facturacion' //Periodos. //Índice: cNumeroEjercicio UsaTabla tPeriodos = tEmpresa['mgw10031'] tPeriodos.UsaIndice['cNumeroEjercicio'] //Parametros de la empresa. //Índice: primario. UsaTabla tParametros = tEmpresa['mgw10000'] //Tipos de cambio. //Índice: cIdMoneda + cFecha. Usatabla tTiposCambioLib = tEmpresa['mgw10035'] tTiposCambioLib.Usaindice['iMonedaFecha'] //Documentos. //Índice: IdClienteProveedor + cFecha + cSerie + cFolio. //Esta tabla se usa para que no se pierda el puntero del recorrido principal. UsaTabla tDocumentos = tEmpresa['mgw10008'] Alias 'tDoctos1' tDocumentos.Usaindice['iClienteProveedorFecha'] // //Documentos. //Índice: IdClienteProveedor + cFecha + cSerie + cFolio. UsaTabla tDoctosLib1 = tEmpresa['mgw10008'] Alias 'tDoctos2' tDoctosLib1.Usaindice['iClienteProveedorFecha'] //Documentos. //Índice: primario. UsaTabla tDoctosLib2 = tEmpresa['mgw10008'] Alias 'tDoctos3' tDoctosLib2.Usaindice[''] //Documentos. //Índice: primario. UsaTabla tDoctosLib3 = tEmpresa['mgw10008'] Alias 'tDoctos4' tDoctosLib3.Usaindice[''] //Clientes y Provedores. //Índice: cCodigoCliente + cTipoCliente. UsaTabla tClientes = tEmpresa['mgw10002'] tClientes.Usaindice['iCodigoTipo'] //Acumulados por periodo. //Índice: cIdTipoAcumulado + Importe modelo + cIdOwner1 + cIdOwner2 + cIdEjercicio + cIdMoneda UsaTabla tAcumuladosLib = tEmpresa['mgw10018'] tAcumuladosLib.Usaindice['iAcumImpteOwnerEjerMoneda'] //Cargos y Abonos. //Índice: IDDoctoCargo + IDDoctoAbono. UsaTabla tCargosAbonosLib = tEmpresa['mgw10009'] tCargosAbonosLib.UsaIndice['iDoctoCargoAbono'] //Conceptos de documento. //Índice: cIdConceptoDocumento. UsaTabla tConceptos = tEmpresa['mgw10006'] tConceptos.UsaIndice['cIdConceptoDocumento'] //Monedas. //Índice: primario. UsaTabla tMonedas = tEmpresa['mgw10034'] tMonedas.Usaindice[''] //Valores de clasificación. //Índice: primario. UsaTabla tValoresDeClasif = tEmpresa['mgw10020'] tValoresDeClasif.UsaIndice[''] //****************************************************************************** //Definición de columnas y atributos generales. //C0 C2 C4 C6 C8 C10 C12 C14 C16 C18 tMonedas.Busca[@Str(pIdMoneda1;0)] //N.D.5683 gDecimales = tMonedas(cDecimalesMoneda) //****************************************************************************** //Declaración de variables globales. gHoy = fFormateaFecha(@Hoy();0) gDelaFecha = '' gAlaFecha = '' gPeriodo = 0 gIdEjercicio = 0 gSaldoDocto = 0.0 gSoloConSaldo = 0 gSaldoInicialCliente = 0.0 gTotalCargosCliente = 0.0 gTotalAbonosCliente = 0.0 gTotalSaldosCliente = 0.0 gTotalCargosGral = 0.0 gTotalAbonosGral = 0.0 gTotalSaldosGral = 0.0 gNombreMoneda = tMonedas(cNombreMoneda) // ************************************* // Definicion de constantes de EXCEL // ************************************* constante xlCentrarEnSeleccion 7 constante xlAutomatico -4105 constante xlManual -4135 constante xlInferior -4107 constante xlSubrayadoDoble -4119 constante xlIzquierda -4131 constante xlMediano -4138 constante xlNinguno -4142 constante xlDerecha -4152 constante xlSuperior -4160 constante xlHojaCalculo -4167 constante xlLineaSimple 1 constante xlBordeSuperior 8 constante xlBordeInferior 9 constante xlBordeIzquierda 7 constante xlBordeDerecha 10 constante xlCentro -4108 constante xlSaltoPagina -4135//N.D.5759 // ************************************* // Inicializa EXCEL // ************************************* // Accesa objetos de excel. Crea un objeto de Excel con la funcion @CreaObjeto(). A esta funcion // se le pasa un identificador de OLE de la aplicacion que se desea crear. En este caso el identificador // es Excel.Application.5 Objeto Excel = @CreaObjeto('Excel.Application') // Invoca el metodo de EXCEL Libros y luego el metodo Agregar para crear un libro de hoja de calculo // representado por la constante de EXCEL (xlHojaCalculo). // Es importante notar que estos metodos NO LOS EJECUTA EL REPORTEADOR sino que los hace EXCEL // y estan documentados en el Help de EXCEL Objeto wb = Excel.WorkBooks.Add(xlHojaCalculo) // Accesa la hoja de calculo (HojasCalculo) numero 1 del Libro creado anteriormente // y representado por la variable wb, de la instruccion anterior Objeto ws = wb.Worksheets(1) // Hace visible a EXCEL. Para Excel, TRUE o VERDADERO es -1, FALSE o FALSO es 0 Excel.ActiveWindow.DisplayGridlines = FALSE[C0] Excel.Visible = -1[C0] RenActual = 1 // Pone la longitud de cada columna ws.Columns(1).ColumnWidth = 14[C0] ws.Columns(2).ColumnWidth = 5[C0] ws.Columns(3).ColumnWidth = 8[C0] ws.Columns(4).ColumnWidth = 25[C0] ws.Columns(5).ColumnWidth = 15[C0] ws.Columns(6).ColumnWidth = 15[C0] ws.Columns(7).ColumnWidth = 17[C0] ws.Columns(8).ColumnWidth = 12[C0] ws.Columns(9).ColumnWidth = 8[C0] ws.Columns(10).ColumnWidth = 22[C0] ws.Columns(11).ColumnWidth = 25[C0] lDigsDecimales = '0000000000' lDecs = @SUBSTR(lDigsDecimales;1;gDecimales) lFormato = '#,##0.' & lDecs & '_);(#,##0.' & lDecs & ')' ws.Columns(5).NumberFormat = lFormato[C0] ws.Columns(6).NumberFormat = lFormato[C0] ws.Columns(7).NumberFormat = lFormato[C0] // N.D.2335 Inicio ------------------------------ //ws.Columns(9).NumberFormat = lFormato[C0] lFormato = '#,##0.0000_);(#,##0.0000)' ws.Columns(9).NumberFormat = lFormato[C0] // N.D.2335 Fin --------------------------------- //****************************************************************************** //Funciones. // ========================================================================================== // fImpDatosCliente (Procedimiento) // 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 // ========================================================================================== // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // Historia de modificaciones // Fecha Nombre IDLotus Descripcion // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // 29/10/2002 LAP N.D.1427 Adición de la variable global gClienteImpreso // a fin de identificar si el encabezado del // cliente se ha impreso o no . // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< DefFunc fImpDatosCliente(aTblCliente:TABLA;aSaldo;aTipo) local lRenglon // N.D.1427 Inicio Si gClienteImpreso = 1 // Ya se imprimio el cliente Retorna Sino // No se ha impreso el cliente gClienteImpreso = 1 FinSi // N.D.1427 Fin lRenglon = '' Si aTipo = 0 ws.Range('A' & RenActual ).Value = 'Cliente:'[C0] Sino ws.Range('A' & RenActual ).Value = 'Proveedor:'[C0] Finsi ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0] ws.Range('C' & RenActual ).NumberFormat = '@'[C0] ws.Range('C' & RenActual ).Value = fMascarilla(aTblCliente(cCodigoCliente);tParametros(cMascarillaClientes)) ws.Range('C' & RenActual).Font.FontStyle = 'Negrita'[C0] RenActual = RenActual + 1 ws.Range('A' & RenActual ).Value = 'Nombre:'[C0] ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0] ws.Range('C' & RenActual ).NumberFormat = '@'[C0] ws.Range('C' & RenActual ).Value = aTblCliente(cRazonSocial)[C0] ws.Range('C' & RenActual).Font.FontStyle = 'Negrita'[C0] RenActual = RenActual + 1 ws.Range('D' & RenActual ).Value = 'Saldo Inicial'[C0] ws.Range('E' & RenActual ).Value = aSaldo[C0] ws.Range('E' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] RenActual = RenActual + 1 ws.Range('A' & RenActual & ':K' & RenActual ).Borders(xlSuperior).LineStyle = xlLineaSimple[C0] FinFunc // ========================================================================================== Deffunc fNaturaleza(atDocto:TABLA) 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(cargo) // 31. Perdida Cambiaria Proveedor(abono) 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 Retorna lNaturaleza FinFunc // ========================================================================================== // fImprimeDocumento (Procedimiento) // Descripcion : // Entrada :La tabla de clientes, con el cliente a imprimir abierto // Salida :aTblDocto = Documento que se va a imprimir // gSaldoDocto = Saldo final del documento // pIdMoneda = ID de la moneda del cliente definido en el catálogo // aNivel : 1 = Si es el docto inicial // 2 = Si es un docto de cargo o abono, asociado al docto inicial // 3 = CUando es un Abono a saldo a favor de un cliente // o un cargo con saldo a favor de un proveedor // aImpDocto = Este importe es que corresponde al docto. // aNaturaleza = NAturaleza del Docto que se imprime 0=Cargo, 1=Abono // // Historia de modificaciones // Fecha Nombre IDLotus Descripcion // 14/05/2002 CFAC N.C.0095 Se agregó bloque de código 'N.C.0095-14/05/2002' // para determinar el valor a imprimir del estado // del documento. // 27/03/2003 LAP Los documentos asociados se imprimen identados // 18/06/2004 EGV N.D.2808 Si se hizo una asociación entre ADM y CheqPAQ de // 1 Docto. en Pesos y uno en M.E. tomar el tipo // de cambio que guardó CheqPAQ en el Documento de Pesos. en la fecha // 20/04/2005 LAP N.D.3023 Expresar los importes de los documentos en la moneda // del reporte. Considerando que los documentos en moneda // base tienen el tipo de cambio de la moneda del cliente // a la moneda base. Utilizar fCambiarMonedaDoctoAReporte de // LibAdminPAQ.rpt // ========================================================================================== DEFFUNC fImprimeDocumento(aTblDocto:TABLA; aSaldoDocto;aIdMoneda;aTipo;aNivel;aImpDocto;aNaturaleza;aIdentarDocto) Local lSaldoMonedaRpt,lSaldoMonedaBase Local lRenglon Local lImpreso, lAfectado, lDevuelto Local lImporteDoctoMonedaRpt, lImporteDoctoMonedaBase, lTipoCambioRpt // N.D.3023 Inicio // Expresar los importes de los documentos en la moneda del reporte. // Utilizar fCambiarMonedaDoctoAReporte de LibAdminPAQ.rpt lSaldoMonedaRpt = fCambiarMonedaDoctoAReporte(aTblDocto; tTiposCambioLib; aSaldoDocto; pIdMoneda1; tClientes(cIdMoneda)) //N.D.5683 lImporteDoctoMonedaRpt = fCambiarMonedaDoctoAReporte(aTblDocto; tTiposCambioLib; aImpDocto; pIdMoneda1; tClientes(cIdMoneda)) //N.D.5683 // N.D.3023 Fin // N.D.3238 Redondear los importes antes de mostrarlos lSaldoMonedaRpt = fRedondeaImporteLib(lSaldoMonedaRpt; gDecimales) lImporteDoctoMonedaRpt = fRedondeaImporteLib(lImporteDoctoMonedaRpt; gDecimales) // La moneda del Reporte es distinta a la moneda del Docto // Si el documento es un cargo imprime en la columna Cargo, de lo contrario // imprime en la columna Abono. // Los cargos incrementan el saldo del cliente, los abonos lo decrementan // Los Abonos Incrementan el saldo del Proveedor, los cargos lo decrementan //*lRenglon = ''[C0..C18] ws.Range('B' & RenActual ).Value = aTblDocto(cSerieDocumento)[C0] ws.Range('C' & RenActual ).Value = aTblDocto(cFolio)[C0] // Identación del documento Si aIdentarDocto = 1 ws.Range('A' & RenActual ).Value = @CHR(39) & @CHR(32) & @CHR(32) & @CHR(32) & fFormateaFecha(aTblDocto(cFecha);0) Sino ws.Range('A' & RenActual ).Value = @CHR(39) & fFormateaFecha(aTblDocto(cFecha);0) Finsi ws.Range('J' & RenActual).HorizontalAlignment = xlDerecha[C0] tConceptos.Busca[@Str(aTblDocto(cIDConceptoDocumento);0)] Si tConceptos->Encontro ws.Range('D' & RenActual ).Value= tConceptos(cNombreConcepto)[C0] Finsi Si aNaturaleza = 0 // es un cargo ws.Range('E' & RenActual ).Value=lImporteDoctoMonedaRpt[C0] Si aNivel != -1 gTotalCargosCliente = gTotalCargosCliente + lImporteDoctoMonedaRpt FinSi Sino // es un abono ws.Range('F' & RenActual ).Value = lImporteDoctoMonedaRpt[C0] Si aNivel != -1 gTotalAbonosCliente = gTotalAbonosCliente + lImporteDoctoMonedaRpt FinSi Finsi Si (aNaturaleza = 0 Y aTipo = 0) O (aNaturaleza = 1 y aTipo = 1) ws.Range('H' & RenActual ).Value = @CHR(39) & fFormateaFecha(aTblDocto(cFechaVencimiento);0)[C0] Finsi Si aNivel > 1 ws.Range('G' & RenActual ).Value = (aNivel = 2 ? ' ' : lSaldoMonedaRpt)[C0] Sino ws.Range('G' & RenActual ).Value = (aNivel = -1 ? ' ' : lSaldoMonedaRpt)[C0] Finsi // se acumulan los saldos, gTotalSaldosCliente = gTotalSaldosCliente + lSaldoMonedaRpt ws.Range('I' & RenActual ).Value = aTblDocto(cTipoCambio)[C0] //Inicia 'N.C.0095-14/05/2002' //Se determina el estado del documento lImpreso = aTblDocto( cImpreso ) lAfectado= aTblDocto( cAfectado ) lDevuelto = aTblDocto( cDevuelto ) Si lImpreso = 1 ws.Range('J' & RenActual ).Value = @CHR(39) & '(1)'[C0] Si lDevuelto = 1 ws.Range('J' & RenActual ).Value = @CHR(39) &' (4)'[C0] Finsi Sino ws.Range('J' & RenActual ).Value = @CHR(39) & '(5)'[C0] Si lDevuelto = 1 ws.Range('J' & RenActual ).Value = @CHR(39) & '(3)'[C0] Sino Si lAfectado = 1 ws.Range('J' & RenActual ).Value = @CHR(39) & '(2)'[C0] Finsi Finsi Finsi //Termina 'N.C.0095-14/05/2002' ws.Range('K' & RenActual ).Value = aTblDocto(cReferencia)[C0] ws.Range('A' & RenActual & ':K' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual & ':K' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] RenActual = RenActual + 1 Finfunc // ========================================================================================== // fImprimeAbonosAsociados (Procedimiento) // Descripcion : Imprime los abonos asociados a un documento de cargo // Entrada :aTblDoctoActivo = Es el documento para el cual se buscaran los abonos/Cargos // aTblDoctosTmp = Tabla de documentos sobre la que se buscaran los abonos/Cargos // aTblCargos = la Tabla de asociación de Documentos -> Documentos // aFechaInicial = Incio del rango // aFechaFinal = Fin del rango // aTipo = (0 = Clientes buscar abonos, 1= Proveedores Buscar cargos) // Salida :Imprime un renglón por cada abono asociado al documento. // // Historia de modificaciones // Fecha Nombre IDLotus Descripcion // 27/03/2003 LAP Los documentos asociados se imprimen identados // en la fecha // 20/04/2005 LAP N.D.3023 Incluir los documentos de utilidad / perdida // cambiaria siempre y cuando correspondan a la // moneda del reporte. // ========================================================================================== DefFunc fImprimeAbonosCargosAsociados(aTblDoctoActivo:TABLA;aTblDoctosTmp:TABLA;aTblCargos:TABLA;aFechaInicial;aFechaFinal;aTipo) Local lsaldo, lImpDocto, lNat, lSaldoAjuste // Regresa al inicio de cargos y abonos para poder imprimir los abonos asociados al cargo lSaldo = 0.0 // Documentos de Cargo, se asegura que el indice sea el apropiado Si aTipo = 0 aTblCargos.UsaIndice['iDoctoCargoAbono'] aTblCargos.Busca Primero Sino aTblCargos.UsaIndice[''] // el indice primario es IDDoctoAbono+IDDoctoCargo aTblCargos.Busca Primero Finsi aTblCargos.BUSCA[@Str(aTblDoctoActivo(cIdDocumento);0)] Mientras aTblCargos->ENCONTRO Si (aTipo = 0) // si es para clientes, busca el abono // busca el documento de abono asociado, para obtener la fecha del docto,no la del CargoAbono aTblDoctosTmp.BUSCA[@Str(aTblCargos(cIdDocumentoAbono);0)] Sino // Si es para Proveedores, busca el cargo // busca el documento de abono asociado, para obtener la fecha del docto,no la del CargoAbono aTblDoctosTmp.BUSCA[@Str(aTblCargos(cIdDocumentoCargo);0)] Finsi Si aTblDoctosTmp->Encontro // Toma solo el importe abonado o cargado a el documento, ya que el Importe Total puede estár // divido en varios abonos a doctos diferentes. // Para clientes toma el importe cargo ;ya que es un abono asoc. a un cargo // Para Proveedore toma el importe de abono;ya que es un cargo asoc. a un abono // -ambos importes estan reflejados en la moneda del docto de la tabla aTblDoctosTmp- lImpDocto = (aTipo = 1? -aTblCargos(cImporteCargo):-aTblCargos(cImporteAbono)) // valida la fecha que este dentro del rango, o que solo se busquen a una fecha de corte Si (aFechaInicial = '' O aTblDoctosTmp(cFecha) >= aFechaInicial) Y (aTblDoctosTmp(cFecha) <= aFechaFinal) Si (pConDoctosNoAfectados = 1 O pConDoctosNoAfectados = 0 Y aTblDoctosTmp(cAfectado) = 1) // Indicar que se deben de identar los documento asociados fImprimeDocumento(aTblDoctosTmp; lSaldo; pIdMoneda1;aTipo;2;lImpDocto;aTblDoctosTmp(cNaturaleza);1) //N.D.5683 // N.D.3023 Incluir los documentos de utilidad / perdida cambiaria si la moneda de dichos // documentos corresponde a la del reporte Si aTblCargos(cIdUtilidadPerdidaCamb) > 0 aTblDoctosTmp.Busca[@Str(aTblCargos(cIdUtilidadPerdidaCamb);0)] Si aTblDoctosTmp->Encontro // N.D.3023 Incluir el documento solo si corresponden las monedas Si aTblDoctosTmp(cIdMoneda) = pIdMoneda1 //N.D.5683 lImpDocto = aTblDoctosTmp(cTotal) // Verifica la naturaleza del documento lNat = fNaturaleza(aTblDoctosTmp) Si pQueTipo = 0 Y lNat = 1 // Si es cliente y se trata de un abono lImpDocto = -lImpDocto Finsi Si pQueTipo = 1 y lNat = 0 // Si es proveedor y se trata de un cargo lImpDocto = -lImpDocto Finsi // Indicar que se deben de identar los documento asociados fImprimeDocumento(aTblDoctosTmp; lSaldo; pIdMoneda1;aTipo;4;lImpDocto;lNat;1) //N.D.5683 Finsi FinSi FinSi // S.C.264 Impresión del documento de Ajuste al IVA Si aTblCargos(cIdAjusIVA) > 0 aTblDoctosTmp.Busca[@Str(aTblCargos(cIdAjusIVA);0)] Si aTblDoctosTmp->Encontro Y aTblDoctosTmp(cIdDocumentoOrigen) = aTblDoctoActivo(cIdDocumento) lImpDocto = aTblDoctosTmp(cTotal) lNat = fNaturaleza(aTblDoctosTmp) Si pQueTipo = 0 Y lNat = 1 // Si es cliente y se trata de un abono lImpDocto = -lImpDocto Finsi Si pQueTipo = 1 y lNat = 0 // Si es proveedor y se trata de un cargo lImpDocto = -lImpDocto Finsi lSaldoAjuste = 0 //fSaldoDocumento(pDelaFecha; pAlaFecha; tCargosAbonosLib; aTblDoctosTmp; tDoctosLib2) fImprimeDocumento(aTblDoctosTmp; lSaldoAjuste; pIdMoneda1; aTipo; -1; lImpDocto; lNat; 1) //N.D.5683 //fImprimeAbonosCargosAsociados(aTblDoctosTmp; tDoctosLib2; tCargosAbonosLib; pDelaFecha; pAlaFecha; pQueTipo) FinSi FinSi FinSi // Finsi Finsi aTblCargos.Busca Siguiente[1] Finmientras FinFunc // ========================================================================================== // fImprimeUtilidadesAsociadas (Procedimiento) // Descripcion : Imprime los documentos de utilidad/perdida cambiaria asociados al documento de // abono (clientes) o cargo (proveedores) siempre y cuando el documento de // naturaleza contraria no se haya impreso // Entrada : aTblDoctoActivo = Es el documento para el cual se buscaran los abonos/Cargos // aTblDoctosTmp = Tabla de documentos sobre la que se buscaran los abonos/Cargos // aTblCargosAbonos = la Tabla de asociación de Documentos -> Documentos // Salida :Imprime un renglón por cada abono asociado al documento. // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // Historia de modificaciones // Fecha Nombre IDLotus Descripcion // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // 06/07/2005 LAP N.D.3347 Implementación inicial. // ========================================================================================== DefFunc fImprimeUtilidadesAsociadas(aTblDoctoActivo:TABLA; aTblDoctosTmp:TABLA; aTblCargosAbonos:TABLA) Local lImpDocto, lNat // Documentos de Cargo, se asegura que el indice sea el apropiado Si pQueTipo = 0 // Clientes Recibe el documento de abono, y debe de buscar si existe alguna asoción con un cargo aTblCargosAbonos.UsaIndice[''] // cIdDocumentotoAbono + cIdDocumentoCargo Sino // Proveedores Recibe el documento de cargo, y debe de buscar si existe alguna asoción con un abono aTblCargosAbonos.UsaIndice['iDoctoCargoAbono'] // cIdDocumentotoCargo + cIdDocumentoAbono Finsi aTblCargosAbonos.Busca Primero Mientras[aTblCargosAbonos.BUSCA[@Str(aTblDoctoActivo(cIdDocumento);0)]; aTblCargosAbonos->Encontro; aTblCargosAbonos.Busca Siguiente[1]] Si (pQueTipo = 0) // Clientes: Busqueda del documento de cargo [Factura, etc.] aTblDoctosTmp.BUSCA[@Str(aTblCargosAbonos(cIdDocumentoCargo);0)] Sino // Proveedores: Busqueda del documento de abono [Compra, etc.] aTblDoctosTmp.BUSCA[@Str(aTblCargosAbonos(cIdDocumentoAbono);0)] Finsi // Valida si existe documento de utilidad/perdida cambiaria Si aTblCargosAbonos(cIdUtilidadPerdidaCamb) = 0 Continua FinSi // Validar que el documento de cargo/abono asociado al documento principal no se imprimio debido al rango de fechas. Si aTblDoctosTmp->Encontro Si aTblDoctosTmp(cFecha) >= pDeLaFecha Y aTblDoctosTmp(cFecha) <= pAlaFecha // Si el documento asociado si se imprimio continuar con el siguiente cargo-abono Continua FinSi FinSi // Incluir los documentos de utilidad / perdida cambiaria si la moneda de dichos documentos corresponde a la del reporte aTblDoctosTmp.Busca[@Str(aTblCargosAbonos(cIdUtilidadPerdidaCamb);0)] Si aTblDoctosTmp->Encontro // Incluir el documento solo si corresponden las monedas Si aTblDoctosTmp(cIdMoneda) = pIdMoneda1 //N.D.5683 lImpDocto = aTblDoctosTmp(cTotal) // Verifica la naturaleza del documento lNat = fNaturaleza(aTblDoctosTmp) Si pQueTipo = 0 Y lNat = 1 // Si es cliente y se trata de un abono lImpDocto = -lImpDocto Finsi Si pQueTipo = 1 y lNat = 0 // Si es proveedor y se trata de un cargo lImpDocto = -lImpDocto Finsi // Identar los documentos asociados fImprimeDocumento(aTblDoctosTmp; lImpDocto; pIdMoneda1; pQueTipo; 4; lImpDocto; lNat; 1) //N.D.5683 Finsi Finsi Finmientras FinFunc // ========================================================================================== // fImprimeResumen (Procedimiento) // Descripcion : Imprime los totales por Cliente/Proveedor // Comentarios : asume la misma distribucion de columnas que el cuerpo principal del reporte // ========================================================================================== // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // Historia de modificaciones // Fecha Nombre IDLotus Descripcion // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // 29/10/2002 LAP N.D.1427 Adición de la variable global gClienteImpreso // a fin de identificar si el encabezado del // cliente se ha impreso o no. // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Deffunc fImprimeResumen(aTipo) Local lRenglon // N.D.1427 Inicio // Si el cliente no se ha impreso no se debe imprimir su resumen Si gClienteImpreso = 0 Retorna Sino gClienteImpreso = 1 FinSi // N.D.1427 Fin ws.Range('A' & RenActual & ':K' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual & ':G' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual & ':G' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual & ':G' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual ).Value = gTotalCargosCliente[C0] ws.Range('F' & RenActual ).Value = gTotalAbonosCliente ws.Range('G' & RenActual ).Value = gTotalSaldosCliente + gSaldoInicialCliente RenActual = RenActual + 1 ws.Range('C' & RenActual ).Value = 'Resumen' RenActual = RenActual + 1 ws.Range('D' & RenActual ).Value = 'Saldo Inicial' ws.Range('E' & RenActual ).Value = gSaldoInicialCliente ws.Range('E' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] RenActual = RenActual + 1 Si aTipo = 0 // Se trata de clientes ws.Range('D' & RenActual ).Value = '(+) Cargos' ws.Range('E' & RenActual ).Value = gTotalCargosCliente ws.Range('E' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] RenActual = RenActual + 1 ws.Range('D' & RenActual ).Value = '(-) Abonos' ws.Range('E' & RenActual ).Value = gTotalAbonosCliente ws.Range('E' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] RenActual = RenActual + 1 Sino ws.Range('D' & RenActual ).Value = '(-) Cargos' ws.Range('E' & RenActual ).Value = gTotalCargosCliente ws.Range('E' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] RenActual = RenActual + 1 ws.Range('D' & RenActual ).Value = '(+) Abonos' ws.Range('E' & RenActual ).Value = gTotalAbonosCliente ws.Range('E' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] RenActual = RenActual + 1 Finsi RenActual = RenActual + 1 ws.Range('D' & RenActual ).Value = '(=) Saldo Final' // todos los totales se suman por que son negativos o positivos según correspondas. Si aTipo = 0 // se trata de clientes ws.Range('E' & RenActual ).Value = gSaldoInicialCliente + gTotalCargosCliente + gTotalAbonosCliente Sino ws.Range('E' & RenActual ).Value = gSaldoInicialCliente + gTotalCargosCliente + gTotalAbonosCliente Finsi ws.Range('E' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] RenActual = RenActual + 2 gTotalCargosGral = gTotalCargosGral + gTotalCargosCliente gTotalAbonosGral = gTotalAbonosGral + gTotalAbonosCliente gTotalSaldosGral = gTotalSaldosGral + gTotalSaldosCliente + gSaldoInicialCliente FinFunc // ========================================================================================== // fImprimeGranTotal (Procedimiento) // Descripcion : Imprime los totales generales del reporte // Comentarios : asume la misma distribucion de columnas que el cuerpo principal del reporte // ========================================================================================== Deffunc fImprimeGranTotal() Local lRenglon, lSubRaya ws.Range('E' & RenActual ).Value = gTotalCargosGral ws.Range('E' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] ws.Range('F' & RenActual ).Value = gTotalAbonosGral ws.Range('F' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0] ws.Range('F' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] ws.Range('F' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('F' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] ws.Range('G' & RenActual ).Value = gTotalSaldosGral ws.Range('G' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0] ws.Range('G' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] ws.Range('G' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('G' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] RenActual = RenActual + 1 FinFunc // ========================================================================================== // fBuscaAlgunReg // 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 // ========================================================================================== // N.D.3010 Nuevo esquema de Busquedas Parciales po lo cual este metodo queda fuera de uso //!Deffunc BuscaAlgunReg(aFechaIni;aFechaFin;aIdBuscado;aTblDeBusqueda:TABLA) //! Mientras aFechaIni <= aFechaFin Y !aTblDeBusqueda->ENCONTRO //! aTblDeBusqueda.BUSCA[aIdBuscado &':'&aFechaIni] //! Si !aTblDeBusqueda->Encontro //! aFechaIni = fFechaSiguiente(aFechaIni) //! Finsi //! FinMientras //!Finfunc // ========================================================================================== // fDiscriminaCliente() // 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 // ============================================================================= // fDiscriminaDocto() // Salidas: 1 = indica que el Docto no aplica, debe descartarse // 0 = indica que el Docto no debe descartarse. // Historia de revisiones: // // Fecha ID-LOTUS Descripción //------------------------------------------------------------------------------ // 07/05/2002 N.D.389 De acuerdo al parámetro pConDoctosNoAfectados // se verifica que en caso de quererse incluir // Documentos no afectados en el reporte, dichos // Documentos no estén cancelados. (EGV) // ============================================================================= DefFunc fDiscriminaDocto(atDocumento:TABLA) Local lRegresa lRegresa = 0 // si no es cargo o abono Si atDocumento(cNaturaleza) = 2 lRegresa =1 Finsi // Si se despliegan Doctos. sin afectar, verificar que el Docto. no esté cancelado. Si pConDoctosNoAfectados = 1 Si atDocumento(cCancelado) = 1 lRegresa = 1 FinSi FinSi // Si no esta afectado se lo brinca. Solo cuando pConDoctosNoAfectados = 0. Si pConDoctosNoAfectados = 0 Si atDocumento(cAfectado) != 1 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 // S.C.264 Discriminar los ajustes con documento origen //Si atDocumento(cIdConceptoDocumento) = gIdConceptoAjuste Y atDocumento(cIdDocumentoOrigen) > 0 // lRegresa = 1 //FinSi Retorna lRegresa FinFunc // ========================================================================================== // fImprimeNotaEstadoDocto (Procedimiento) // Descripcion: Imprime la nota de especificaciones del estado del documento. // ========================================================================================== Deffunc fImprimeNotaEstadoDocto() RenActual = RenActual +1 ws.Range('A' & RenActual).Value = '(1) Impreso' ws.Range('A' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] RenActual = RenActual +1 ws.Range('A' & RenActual).Value = '(2) Afectado' ws.Range('A' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] RenActual = RenActual +1 ws.Range('A' & RenActual).Value = '(3) Devuelto' ws.Range('A' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] RenActual = RenActual +1 ws.Range('A' & RenActual).Value = '(4) Devuelto e Impreso' ws.Range('A' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] RenActual = RenActual +1 ws.Range('A' & RenActual).Value = '(5) Sin Afectar' ws.Range('A' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] RenActual = RenActual +1 Finfunc // ========================================================================================== // Nombre: fImprimeClasesExcel // Proceso: Imprime los nombres de las clasificaciones justificados al centro en Excel // Entrada: // aListaNombreClases El número total de clases seleccionadas,contando todas las // clasificaciones // aNumPorClase Lista que tiene como elementos el numero de clases // seleccionadas para cada clasificación // aColumnaInicial Columna en Excel a partir de la cual se imprimiran // justificadas al centro las clasificaciones (Ejemplo 'A') // aColumnaFinal Columna en Excel hasta la cual se imprimiran justificadas // al centro las clasificaciones (Ejemplo 'K') // aRenglon Renglón de Excel a patrir del cual se imprimirán las // clasificaciones. Este valor se pasa Por referencia. // Salidas: // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // Historia de modificaciones // Fecha Nombre IDLotus Descripcion // 23/01/2003 LAP N.D.1739 Implementación inicial // ========================================================================================== Deffunc fImprimeClasesExcel(aListaNombreClases; aNumPorClase; aColumnaInicial; aColumnaFinal; aRenglon) Local lLeyenda, lNumeroClase, lNumElmentos, lContador, lDesplazamiento lDesplazamiento = 0 lNumeroClase = 0 lLeyenda = '' // Se barren las seis listas de ID´s Mientras lNumeroClase < 6 // solo se imprimen los que si tuvieron al menos un ID Si @Escoge(aNumPorClase; lNumeroClase) != '' // Obtengo el número de elementos para la clase lNumElmentos = @Val(@Escoge(aNumPorClase; lNumeroClase)) lContador = 0 // Barre todos los elementos de esta clase Mientras lContador < lNumElmentos lLeyenda = lLeyenda & ',' & @Escoge(aListaNombreClases; lDesplazamiento+lContador) lContador = lContador +1 FinMientras lDesplazamiento = lDesplazamiento + lNumElmentos // Se imprime la clase y sus valores seleccionados // Avanza de renglon aRenglon = aRenglon + 1[C0] ws.Range(aColumnaInicial & aRenglon).Font.Size = 10[C0] ws.Range(aColumnaInicial & aRenglon).Font.FontStyle = 'Negrita'[C0] // Lo centra en las columnas ws.Range(aColumnaInicial & aRenglon & ':' & aColumnaFinal & aRenglon).HorizontalAlignment = xlCentrarEnSeleccion[C0] ws.Range(aColumnaInicial & aRenglon).Value = 'CLASIFICACIÓN No.' & @Str(lNumeroClase+1; 0) & ' : ' & @SubStr(lLeyenda; 1; @Len(lLeyenda)-1) lLeyenda = '' Finsi lNumeroClase = lNumeroClase + 1 FinMientras aRenglon = aRenglon + 2[C0] FinFunc // Fin método: fImprimeClasesExcel //****************************************************************************** //Encabezado. Encab // Pone el nombre del sistema ws.Range('A' & RenActual).Font.Color = @RGB(156;0;89)[C0] ws.Range('A' & RenActual).Font.Size = 8[C0] ws.Range('A' & RenActual).Value = 'Factura Electrónica'[C0] RenActual = RenActual + 1 ws.Range('A' & RenActual).Value = @CHR(39) & gHoy[C0] ws.Range('K' & RenActual).Value = 'Moneda: ' & gNombreMoneda[C0] RenActual = RenActual + 1 // Pone el nombre de la empresa ws.Range('C' & RenActual).Font.Size = 14[C0] ws.Range('C' & RenActual).Font.FontStyle = 'Negrita'[C0] // Lo centra en las columnas A a la K ws.Range('C' & RenActual & ':L' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0] ws.Range('C' & RenActual ).Value = tEmpresa->Nombre // Avanza de renglon RenActual = RenActual + 1[C0] // Pone el titulo del reporte en EXCEL ws.Range('A' & RenActual).Font.Size = 12[C0] ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0] si pQueTipo = 0 ws.Range('A' & RenActual ).Value = 'E S T A D O D E C U E N T A D E C L I E N T E S'[C0] Sino ws.Range('A' & RenActual ).Value = 'E S T A D O D E C U E N T A D E P R O V E E D O R E S'[C0] FinSi // Lo centra en las columnas A a la M ws.Range('A' & RenActual & ':M' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0] // Avanza de renglon RenActual = RenActual + 1[C0] // Pone el titulo del reporte en EXCEL ws.Range('A' & RenActual).Font.Size = 12[C0] ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0] gDelaFecha = fFormateaFecha(pDelaFecha;0) gAlaFecha = fFormateaFecha(pAlaFecha;0) ws.Range('A' & RenActual ).Value = 'Del: ' & gDelaFecha & ' Al: ' & gAlaFecha[C0] // Lo centra en las columnas A a la M ws.Range('A' & RenActual & ':M' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0] // Avanza de renglon RenActual = RenActual + 1[C0] // N.D.1739 Inicio //! ===== Se Revisan las clasificaciones, para recuperarlas e imprimirlas en el encabezado //!fRevisaClases(tValoresDeClasif) //!// ===== Fin de la revision de clasificaciones // ===== Se Revisan las clasificaciones, para recuperarlas e imprimirlas en el encabezado // ===== se arman los ID en una LIsta para poder recorrerlos en una iteración gClasesRecibidas = fCuentaClases(&gNumClasesPorTipo; pIdClase1; pIdClase2; pIdClase3; pIdClase4; pIdClase5; pIdClase6) // se cargan las clasificaciones validas y se obtiene el número de clases validas gNumDeClases = fCargaClases(tValoresDeClasif; &gListNombreDeClases; &gListIdDeClases; gClasesRecibidas) Si gNumDeClases > 0 // solo si hubo al menos una clase seleccionada fImprimeClasesExcel(gListNombreDeClases; gNumClasesPorTipo; 'A'; 'M'; &RenActual) FinSi // N.D.1739 Fin //NEGRITAS TRUE // Altura 9 // Texto '@TC{0,0,0}@L{-1}' // Imprime // // Texto C12;'^Saldo' // Texto C16;'Tipo' // Texto C18;'Estado' // Imprime // Texto C0;'Fecha' // Texto C2;'Serie' // Texto C4;'Folio' // Texto C6;'Concepto' // Texto C8;'^Cargos' // Texto C10;'^Abonos' // Texto C12;'^Documento' // Texto C14;'Vence' // Texto C16;'Cambio' // Texto C18;'Docto.' // Imprime 1 // Texto '@TC{0,0,0}@L{-1}' // Imprime // NEGRITAS FALSE // Pone el titulo de cada columna en EXCEL ws.Range('A' & RenActual & ':K' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual & ':K' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual & ':K' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual & ':K' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual & ':K' & RenActual).Interior.ColorIndex = 55[C0] ws.Range('A' & RenActual & ':K' & RenActual).Font.FontStyle = 'Negrita'[C0] ws.Range('A' & RenActual & ':K' & RenActual).Font.Color = @RGB(255;255;255)[C0] ws.Range('J' & RenActual).HorizontalAlignment = xlDerecha[C0] ws.Range('A' & RenActual).Value = 'Fecha' ws.Range('B' & RenActual).Value = 'Serie' ws.Range('C' & RenActual).Value = 'Folio' ws.Range('D' & RenActual).Value = 'Concepto' ws.Range('E' & RenActual).Value = 'Cargos' ws.Range('F' & RenActual).Value = 'Abonos' ws.Range('G' & RenActual).Value = 'Saldo Documento' ws.Range('H' & RenActual).Value = 'Vence' ws.Range('I' & RenActual).Value = 'Cambio' ws.Range('J' & RenActual).Value = 'Estado del Documento' ws.Range('K' & RenActual).Value = 'Referencia' ws.Range('A' & RenActual & ':K' & RenActual).HorizontalAlignment = xlCentro[C0] RenActual = RenActual + 1 // N.D.1739 // Ajustar el Panel a congelar de acuerdo con RenActual Excel.Rows(RenActual & ':' & RenActual).Select Excel.ActiveWindow.FreezePanes = True ws.Range('A' & RenActual).Select // N.D.5759 Como es un cliente por hoja los encabezados los repetirá para cada hoja Si pFormato = 1 // (Impresión de Cliente por hoja) ws.PageSetup.PrintTitleRows = '$1:$6' Finsi FinEncab //****************************************************************************** //Cuerpo principal. // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // Historia de modificaciones // Fecha Nombre IDLotus Descripcion // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // 28/01/2002 MOFM SC 25 Se valida el parámetro pSoloConSaldo para // determinar si imprimir el cliente o no. // 29/10/2002 LAP N.D.1427 En el caso de clientes/proveedores, si se // imprime el Estado de Cuenta del Cliente con // el filtro "Solo con documentos" no debe de // considerar los documentos que tenga como // proveedor. // Adición de la variable global gClienteImpreso // a fin de identificar si el encabezado del // cliente se ha impreso o no . // 27/03/2003 LAP Los documentos asociados se imprimen identados // en la fecha // 01/12/2005 LAP N.D.3010 Nuevo esquema de búsquedas parciales para agilizar los reportes // 22/04/2009 JENL N.D.5759 Se cambia Saltahoj por instrucciones adecuadas para excel y se // copia el encabezado para cada cliente // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Si pDelCliente = ' ' tClientes.Busca Primero pDelCliente = tClientes(cCodigoCliente) Finsi Si pAlCliente = ' ' tClientes.Busca Ultimo pAlCliente = tClientes(cCodigoCliente) Finsi tParametros.Busca Primero // Obtener el Ejercicio y el Periodo que le corresponde a pFechaIni, para calcular saldo inicial // Se calculan al inicio y se pasan como referencia, para calcularlos solo una vez. fEjercicioPeriodo(pDelaFecha; &gPeriodo; &gIdEjercicio; tPeriodos) // Esta función se debe ejecutar antes del cuerpo del reporte, para inicializar algunas valores // Globales para la biblioteca LibAdminPAQ.rpt fIniFechasHistoria(tPeriodos) // S.C.264 Recuperación del concepto de Ajuste al IVA tConceptos.UsaIndice['CCODIGOC01'] Si pQueTipo = 0 // 0 = Clientes tConceptos.Busca['AJUSTE_IVA_CTE_CARGO_2010'] Sino tConceptos.Busca['AJUSTE_IVA_PRV_CARGO_2010'] FinSi // 1 = Proveedores gIdConceptoAjuste = 0 Si tConceptos->Encontro gIdConceptoAjuste = tConceptos(cIdConceptoDocumento) FinSi tConceptos.UsaIndice[''] gRangoValido = pDeLaFecha <= pAlaFecha ? 1:0 Mientras[tClientes.Busca[pDelCliente & '..' & pAlCliente ];(gRangoValido Y tClientes->Encontro) ; tClientes.Busca Siguiente[1]] Si fDiscriminaCliente(tClientes) = 1 Continua Finsi //N.D.5683 Este código queda igual solo se hace la observación que este pIdMoneda es el filtro //solo para mostrar los que clientes o proveedores que tengan definida esta moneda en el catálogo. //Si pIdMoneda != 1 Y pIdMoneda != tClientes(cIdMoneda) Si pIdMoneda != tClientes(cIdMoneda) //RCVG ND 5384 Continua FinSi //Si la moneda del cliente es pesos y requiere un reporte en moneda extranjera nose visualizará este documento //no es posible obtener un tipo de cambio con exactitud para convertir a moneda extranjera Si pIdMoneda = 1 Y pIdMoneda1 != 1 continua FinSi //Fin N.D.5683 // Inicializar para cada cliente su bandera de impresión. gClienteImpreso = 0 // Se inicializan las variables de totales por cliente gTotalAbonosCliente = 0.0 gTotalCargosCliente = 0.0 gTotalSaldosCliente = 0.0 // N.D.3010 Inicio // Búsqueda de un documento del cliente/proveedor a la fecha inicial del reporte // Se inicializa la fecha con la que se realizaran las busquedas en el rango de fechas gFechaBusqueda = pDeLaFecha // NOTA: Es obligatorio volver a fijar el índice a fin de que las búsquedas parciales funcionen correctamente tDocumentos.Usaindice['iClienteProveedorFecha'] tDocumentos.Busca[tClientes(cIdClienteProveedor) & ':' & gFechaBusqueda] Si !tDocumentos->ENCONTRO // Busquedas parciales: Cursor en el registro más cercano que cumple con la llave // NOTA: La propiedad Llave de la tabla nos regresa la llave más cercana que cumple con el criterio de la búsqueda // La llave está en formato cadena y no tiene ningún separador entre los campos, por lo que es necesario revisar // en FoxPro la definición del índice para descomponer los elementos de la Llave // Revisar si la llave actual corresponde al Producto / Almacén y al Rango de Fechas. Si tClientes(cIdClienteProveedor) = @Val(@SUBSTR(tDocumentos->Llave;0;11)) Si @SUBSTR(tDocumentos->Llave;11;8) >= pDeLaFecha Y @SUBSTR(tDocumentos->Llave;11;8) <= pAlaFecha // Realizar nuevamente la búsqueda a fin de posicionarnos en el registro y activar la propiedad Encontro gFechaBusqueda = @SUBSTR(tDocumentos->Llave;11;8) tDocumentos.Busca[tClientes(cIdClienteProveedor) & ':' & gFechaBusqueda] FinSi FinSi FinSi // Todos aun sin Doctos o el Cliente si tiene Doctos Si (pSoloConDoctos = 0) O tDocumentos->ENCONTRO gSaldoInicialCliente = fSaldoInicial(tClientes; gIdEjercicio; gPeriodo; pIdMoneda1; pDelaFecha; pQueTipo; tAcumuladosLib; tDoctosLib1; tTiposCambioLib) //N.D.5683 // Imprime los datos del cliente sólo cuando se selecciona que todos, sin importar si tiene saldo o no Si pSoloConSaldo = 0 gSoloConSaldo = 0 Sino gSoloConSaldo = 1 FinSi // En caso de que el cliente no tenga documentos en el rango de fechas, pero se desean imprimir todos los clientes imprimir sus datos Si pSoloConDoctos = 0 // Imprime datos del cliente que tiene saldo y su saldo inicial fImpDatosCliente(tClientes;gSaldoInicialCliente;pQueTipo) gSoloConSaldo = 0 FinSi // La tabla de documentos ya está posicianada en el primer documento del cliente en el rango de fechas // Recorrer los documentos hasta que sea diferente cliente/proveedor o se rompa el rango de fechas Mientras tDocumentos->Encontro Y (tDocumentos(cFecha) <= pAlaFecha) Si fDiscriminaDocto(tDocumentos) = 1 // Búsqueda del siguiente registro que cumpla con el cliente tDocumentos.BUSCA SIGUIENTE[1] Continua Finsi // Calcula el Saldo del Documento es igual tanto para cargos, como para abonos gSaldoDocto = fSaldoDocumento(pDelaFecha; pAlaFecha; tCargosAbonosLib; tDocumentos; tDoctosLib2) // Se verifica para no imprimir documentos saldados. Si (pSoloConSaldo = 1) Y (gSaldoDocto < 0.001) // Búsqueda del siguiente registro que cumpla con el cliente tDocumentos.BUSCA SIGUIENTE[1] Continua Finsi // Imprime los datos del cliente sólo cuando se selecciona que todos, sin importar si tiene saldo o no Si pSoloConSaldo = 0 // Imprime datos del cliente y su saldo inicial fImpDatosCliente(tClientes; gSaldoInicialCliente; pQueTipo) FinSi Si (pSoloConSaldo = 1) Y (gSoloConSaldo = 1) // Imprime datos del cliente que tiene saldo y su saldo inicial fImpDatosCliente(tClientes; gSaldoInicialCliente; pQueTipo) gSoloConSaldo = 0 FinSi Si pQueTipo = 0 // REPORTE PARA CLIENTES Si tDocumentos(cNaturaleza) = 0 // Imprime el Documento de Cargo y luego sus abonos asociados fImprimeDocumento(tDocumentos; gSaldoDocto; pIdMoneda1; pQueTipo; 1; tDocumentos(cTotal); 0; 0) //N.D.5683 // Ajuste por saldo //SI tDocumentos(cIdMonedCa) != 0 // tDoctosLib3.BUSCA[@STR(tDocumentos(cIdMonedCa);0)] // SI tDoctosLib3->ENCONTRO // lSaldoAjuste = fSaldoDocumento(pDelaFecha; pAlaFecha; tCargosAbonosLib; tDoctosLib3; tDoctosLib2) // fImprimeDocumento(tDoctosLib3; lSaldoAjuste; pIdMoneda1; pQueTipo; 4; tDoctosLib3(cTotal);0; 1 ) // fImprimeAbonosCargosAsociados(tDoctosLib3; tDoctosLib2; tCargosAbonosLib; pDelaFecha; pAlaFecha; pQueTipo) // FINSI //FINSI fImprimeAbonosCargosAsociados(tDocumentos; tDoctosLib2; tCargosAbonosLib; pDelaFecha; pAlaFecha; pQueTipo) Sino // Si el abono todavía tiene importe Pendiente deberá imprimirse nuevamente con el saldo pendiente por cubrir. Si gSaldoDocto > 0.001 fImprimeDocumento(tDocumentos; -gSaldoDocto; pIdMoneda1; pQueTipo; 3; -gSaldoDocto; 1; 0) //N.D.5683 // En caso de los abonos se deben de imprimir las utilidad / perdidas cambiarias siempre y cuando el cargo no se haya impreso fImprimeUtilidadesAsociadas(tDocumentos; tDoctosLib2; tCargosAbonosLib) Finsi Finsi Sino // REPORTE PARA PROVEEDORES Si tDocumentos(cNaturaleza) = 1 // Imprime el Documento de Abono y luego sus Cargos asociados fImprimeDocumento(tDocumentos; gSaldoDocto; pIdMoneda1; pQueTipo; 1; tDocumentos(cTotal); 1; 0) //N.D.5683 // Ajuste por saldo //SI tDocumentos(cIdMonedCa) != 0 // tDoctosLib3.BUSCA[@STR(tDocumentos(cIdMonedCa);0)] // SI tDoctosLib3->ENCONTRO // lSaldoAjuste = fSaldoDocumento(pDelaFecha; pAlaFecha; tCargosAbonosLib; tDoctosLib3; tDoctosLib2) // fImprimeDocumento(tDoctosLib3; lSaldoAjuste; pIdMoneda1; pQueTipo; 4; tDoctosLib3(cTotal);0; 1 ) // fImprimeAbonosCargosAsociados(tDoctosLib3; tDoctosLib2; tCargosAbonosLib; pDelaFecha; pAlaFecha; pQueTipo) // FINSI //FINSI fImprimeAbonosCargosAsociados(tDocumentos; tDoctosLib2; tCargosAbonosLib; pDelaFecha; pAlaFecha; pQueTipo) Sino // Si el cargo todavía tiene importe Pendiente deberá imprimirse nuevamente con el saldo pendiente por cubrir Si gSaldoDocto > 0.001 fImprimeDocumento(tDocumentos; -gSaldoDocto; pIdMoneda1; pQueTipo; 3; -gSaldoDocto; 0; 0) //N.D.5683 // En caso de los abonos se deben de imprimir las utilidad / perdidas cambiarias siempre y cuando el cargo no se haya impreso fImprimeUtilidadesAsociadas(tDocumentos; tDoctosLib2; tCargosAbonosLib) Finsi Finsi Finsi // Búsqueda del siguiente registro que cumpla con el cliente tDocumentos.BUSCA SIGUIENTE[1] FinMientras Si gSoloConSaldo = 0 fImprimeResumen(pQueTipo) FinSi Si pFormato = 1 // (Impresión de Cliente por hoja) //N.D.5759 Inicio //Saltahoj //ws.Range('1:6').Copy //ws.Range('A' & RenActual).Insert ws.rows(RenActual).PageBreak = xlSaltoPagina //RenActual = RenActual + 6 //N.D.5759 Fin Finsi Finsi // N.D.3010 Fin FinMientras fImprimeGranTotal() fImprimeNotaEstadoDocto() // FIN DEL REPORTE