miércoles, 15 de agosto de 2018

Función SQL Server para calcular días hábiles,Contador De Dias Habiles

Sp Contador De Días Hábiles

CREATE FUNCTION [dbo].[DifDias](@fch_ini datetime, @fch_fin datetime)
RETURNS int
AS
BEGIN
DECLARE @TotalDias  DECIMAL(6,1) --Con esta variable calculamos cuantos dias "normales" hay en el rango de fechas
DECLARE @DiasNoLaborables INT --Con esta variable acumulamos los dias no laborables
DECLARE @DiasFeriados SMALLINT --Total dias feriados entre el rango de fechas
DECLARE @Cnt INT --esta variable nos sirve de contador para saber cuando lleguemos al ultimo dia del rango
DECLARE @EvalDate DATETIME --esta variable es la que comparamos para saber si el dia que esta calculando es sábado o domingo

SET @Cnt = 0
SET @DiasNoLaborables = 0
--Calculamos cuantos dias normales hay en el rango de fechas
SELECT @TotalDias = DATEDIFF(HOUR,@fch_ini,@fch_fin) / 24.0--Se maneja diferencia de dias a nivel horas
SELECT @DiasFeriados = COUNT(1) FROM Configuracion.DiasFestivos WHERE feFestiva >= @fch_ini AND feFestiva <= @fch_fin
WHILE @Cnt < @TotalDias
BEGIN
    SELECT @EvalDate = @fch_ini + @Cnt
    IF datepart(dw,@EvalDate) = 6 OR datepart(dw,@EvalDate) = 7
    BEGIN
        SET @DiasNoLaborables = @DiasNoLaborables + 1
    END
    SET @Cnt = @Cnt + 1
END
RETURN cast((@TotalDias - @DiasNoLaborables - @DiasFeriados) as int)
END

Leer Archivo Excel utilizando LinqToExcel



Ejemplo de implementacion:

        public int LeerDocumentoExcel(ref List<ComplementoPagoImportadoExcel> LCPIE, string RutaArchivo, out string MensajeError)
        {
            try
            {
                MensajeError = string.Empty;
                var book = new ExcelQueryFactory(RutaArchivo);
                var resultado = (from row in book.Worksheet("Hoja1")
                                 let item = new ComplementoPagoImportadoExcel
                                 {
                                     //ENCABEZADO DE DOCUMENTO
                                     Serie = row["SERIE"].Cast<string>(),
                                     Cliente = row["CLIENTE"].Cast<string>(),
                                     Bodega = row["BODEGA"].Cast<string>(),
                                     Fecha = row["FECHA"].Cast<DateTime>(),
                                     FormaPago = row["FORMAPAGO"].Cast<int>(),
                                     Expedido = row["EXPEDIDO"].Cast<string>(),
                                     FechaPago = row["FECHA DE PAGO"].Cast<DateTime>(),
                                     Moneda = row["MONEDA"].Cast<string>(),
                                     TipoCambio = row["TIPO DE CAMBIO"].Cast<int>(),
                                     CondicionesPago = row["CONDICIONES PAGO"].Cast<string>(),
                                     Referencia = row["REFERENCIA"].Cast<string>(),
                                     ExcentoIva = row["EXCENTO IVA"].Cast<string>(),
                                     TazaIva = row["TASA IVA"].Cast<decimal>(),
                                     TazarIva = row["TASAR IVA"].Cast<decimal>(),
                                     TipoRelacion = row["TIPO DE RELACION "].Cast<string>(),
                                     UsoDeCFDI = row["USO DE CFDI"].Cast<string>(),
                                     Notas = row["NOTAS"].Cast<string>(),
                                     Confirmacion = row["CONFIRMACIÓN"].Cast<string>(),
                                     MedioPago = row["MEDIO DE PAGO"].Cast<string>(),


                                     //COMPLEMENTO DE PAGO
                                     FechaPagoCP = row["FECHA DE PAGO"].Cast<DateTime>(),
                                     HoraPago = row["HORA PAGO"].Cast<DateTime>(),
                                     MonedaPago = row["MONEDA PAGO"].Cast<string>(),
                                     TipoPago = row["TIPO DE PAGO"].Cast<string>(),
                                     FormaPagoCP = row["FORMA DE PAGO"].Cast<string>(),
                                     Monto = row["MONTO"].Cast<decimal>(),
                                     NumeroOpera = row["NUMERO OPERACIÓN"].Cast<string>(),
                                     RFCEmisor = row["Rfc Emisor:"].Cast<string>(),
                                     NoBanco = row["Nom Banco:"].Cast<string>(),
                                     CuentaOrdenante = row["Cuenta Ordenante:"].Cast<string>(),
                                     RfcBeneficiario = row["Rfc Beneficiario:"].Cast<string>(),
                                     CuentaBeneficiaria = row["Cuenta Beneficiario:"].Cast<string>(),
                                     TipoCadenaPago = row["Tipo Cadena Pago:"].Cast<string>(),
                                     CertificadoPago = row["Certificado de Pago:"].Cast<string>(),
                                     CadenaPago = row["Cadena Pago:"].Cast<string>(),
                                     SelloPago = row["Sello Pago:"].Cast<string>(),


                                     //DETALLE COMPLEMENTO PAGO
                                     SerieDCP = row["SERIE"].Cast<string>(),
                                     FolioDCP = row["FOLIO"].Cast<string>(),
                                     UUIDDCP = row["UUID"].Cast<string>(),
                                     MonedaDCP = row["MONEDA"].Cast<string>(),
                                     TipoCambioDCP = row["TIPO CAMBIO"].Cast<int>(),
                                     ParcialidadCDP = row["PARCIALIDAD"].Cast<int>(),
                                     SaldoAnteriorDCP = row["SALDO ANTERIOR"].Cast<decimal>(),
                                     ImportePagadoDCP = row["IMPORTE PAGADO"].Cast<decimal>(),
                                     SaldoDCP = row["SALDO"].Cast<decimal>()
                                 }
                                 //where (item.Serie != null) || (item.Cliente != null) || (item.Bodega != null)
                                 select item).ToList();

                var aux = (from x in resultado
                           where (x.Serie != null) || (x.Cliente != null) || (x.Bodega != null)
                           select x).ToList();

                book.Dispose();
                LCPIE = aux;
                return 0;
            }
            catch (Exception e)
            {

                MensajeError = e.Message;
                return -1;
            }

        }

martes, 14 de agosto de 2018

Rellenar cadena con caracteres a la izquierda SQL SERVER



CREATE FUNCTION [Configuration].[fun_RellenaCadena] (@Cadena NVARCHAR(20), @CaraterRelleno AS NVARCHAR(1), @LongitudFinal INT)

RETURNS NVARCHAR(20) AS 
BEGIN

       WHILE (LEN(@Cadena) < @LongitudFinal)
       BEGIN
         SET @Cadena = @CaraterRelleno + @Cadena
       END

RETURN @Cadena

END



-------------------------

Ejemplo de ejecucion
select [Configuration].[fun_RellenaCadena] ('555','X',6)

Resultado:
XXX555

domingo, 12 de agosto de 2018

inhibir tecla de enter en aspx

Bloquear tecla enter ASP NET

<form runat="server" defaultbutton="DoNothing">
       
<asp:Button ID="DoNothing" runat="server" Enabled="false" style="display: none;" />




Resource multilenguaje c# ResXManager

 Los recursos pueden mostrarse en una aplicación como mensajes de error o como parte de la interfaz de usuario. Los recursos pueden contener datos con varios formatos, como objetos almacenados, cadenas e imágenes. Al almacenar los datos en un archivo de recursos, se pueden cambiar los datos sin volver a compilar toda la aplicación. Para poder escribir objetos almacenados en un archivo de recursos, los objetos deberán ser serializables.
.NET Framework proporciona numerosas prestaciones para la creación y localización de los recursos. Además, .NET Framework admite un modelo simple para el empaquetado y la implementación de estos recursos localizados.
Anteriormente se tenían que crear los recursos a mano, en la actualidad existen herramientas que nos facilitan la administración de los archivos resource.
En este caso utilizaremos ResXManager, es gratis se puede descargar desde aquí: 
una vez descargado se procede a la instalación.
una vez instalado podremos utilizarla desde visual studio en el menú Herramientas/ ResX Manager






La herramienta se ve de la siguiente manera 







La herramienta es muy intuitiva permite agregar idiomas nuevos, y por cada etiqueta te da la opción de traducción automática... aunque la verdad es mejor traducirlo manualmente.
Por cada idioma la herramienta crea un archivo resource.




Para utilizar estos registros en nuestro codigo ya sea en el cliente (html/ aspx) o en la clase se ocupa de la siguiente forma:
En aspx:
Ejemplo en un boton:
      <asp:Button  class="btn btn-primary" ID="btnOkLogOut"  runat="server" Text="<%$ Resources:Resource , Logout %>" OnClick="btnOkLogOut_Click"   />
en un Link
 <a class="nav-link" data-toggle="modal"    data-target="#exampleModal" onserverclick ="logOut_Click">              <i class="fa fa-fw fa-sign-out"></i>  <asp:Literal runat="Server"   Text="<%$ Resources:Resource , Logout %>" />
 </a>
En la clase vinculada:
lblLogOutTitle.Text = Resources.Resource.ReadytoLeave;

Como asignar idioma a pagina:
protected override void InitializeCulture()
    {    
        CultureInfo cultureInfo = new CultureInfo("es-MX");
        Thread.CurrentThread.CurrentCulture = cultureInfo;
        Thread.CurrentThread.CurrentUICulture = cultureInfo;
    }