miércoles, 1 de noviembre de 2023

plsql split string by comma and pivot to column

Oracle Database PLSQL

Convertir una cadena en filas mediante split y pasarlo a columnas:

  

DECLARE
 V_CADENA VARCHAR(1000):= 'f1_col1|f1_col2|f1_col3,f2_col1|f2_col2|f2_col3,f3_col1|f3_col2|f3_col3,f4_col1|f4_col2|f4_col3';
 
CURSOR C_FILAS IS
  select regexp_substr (
           V_CADENA,
           '[^,]+',
           1,
           level
         ) as valor
  from   dual
  connect by level <= 
    length ( V_CADENA ) - length ( replace (V_CADENA, ',' ) ) + 1;

/***DECLARAMOS LAS COLUMNAS QUE TIENE LA CADENA***/

COL1 VARCHAR(100);    
COL2 VARCHAR(100);
COL3 VARCHAR(100);
BEGIN
 /***RECORREMOS LAS FILAS DEL 1ER CURSOR***/   
  FOR C_FILAS_REC 
   IN C_FILAS
   LOOP
      DBMS_OUTPUT.put_line (C_FILAS_REC.valor);

      /***SEPARAMOS EN ORDEN LAS COLUMNAS DE LA CADENA DE CADA FILA***/
        select columna_1,columna_2,columna_3 
            INTO COL1,COL2,COL3 from 
          (select regexp_substr (
                   C_FILAS_REC.valor,
                   '[^|]+',
                   1,
                   level
                 ) value, rownum columna
          from   DUAL
          connect by level <= 
            length ( C_FILAS_REC.valor ) - length ( replace ( C_FILAS_REC.valor, '|' ) ) + 1)
            PIVOT (max(value)
                FOR columna IN (1 AS columna_1, 2 AS columna_2, 3 AS columna_3));
         
        DBMS_OUTPUT.put_line (COL1);
         DBMS_OUTPUT.put_line (COL2);
         DBMS_OUTPUT.put_line (COL3);

         
   END LOOP;
END;

  

miércoles, 22 de abril de 2020

Estado HTTP 500 - Handler processing failed; nested exception is java.lang.NoClassDefFoundError: org/springframework/ui/jasperreports/JasperReportsUtils

Estado HTTP 500 - Handler processing failed; nested exception is java.lang.NoClassDefFoundError: org/springframework/ui/jasperreports/JasperReportsUtils

POM.XML

<dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
                <version>${springframework.version}</version>
  </dependency>

martes, 7 de abril de 2020

arcgis con javascript

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no">
     <link rel="stylesheet" href="https://js.arcgis.com/4.14/esri/themes/light/main.css">
    <script src="https://js.arcgis.com/4.14/"></script>

    <title>ArcGIS JavaScript Tutorials: Create a JavaScript starter app</title>
    <style>
      html, body, #viewDiv {
        padding: 0;
        margin: 0;
        height: 100%;
        width: 100%;
      }
    </style>
  </head>
  <body>
    <div id="viewDiv"></div>
     <div id="basemapGalleryDiv"></div>
     <script>

    require([
      "esri/Map",
      "esri/views/MapView",
      "esri/layers/FeatureLayer",
      "esri/widgets/Search"
    ], function(Map, MapView, FeatureLayer,Search) {

    var map = new Map({
       basemap: "hybrid"//"streets-navigation-vector"
    });
 

    var trailheadsRenderer = {
        type: "simple",
        symbol: {
          type: "picture-marker",
          url: "http://static.arcgis.com/images/Symbols/NPS/npsPictograph_0231b.png",
          width: "18px",
          height: "18px"
        }
      }
       var trailheadsLabels = {
        symbol: {
          type: "text",
          color: "#FFFFFF",
          haloColor: "#5E8D74",
          haloSize: "2px",
          font: {
            size: "12px",
            family: "Noto Sans",
            style: "italic",
            weight: "normal"
          }
        },
        labelPlacement: "above-center",
        labelExpressionInfo: {
          expression: "$feature.TRL_NAME"
        }
      };
      var trailheads = new FeatureLayer({
        url:
          "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Trailheads/FeatureServer/0",
        renderer: trailheadsRenderer,
        labelingInfo: [trailheadsLabels]
      });

      map.add(trailheads);

    var view = new MapView({
      container: "viewDiv",
      map: map,
      center: [-76.04394531249994, -9.98489014142105], // longitude, latitude
      zoom: 5
    });

    const searchWidget = new Search({
      view: view
    });

    view.ui.add(searchWidget, {
      position: "top-left",
      index: 2
    });

    view.on("click", function(event){
      // event is the event handle returned after the event fires.
      console.log(event.mapPoint);
    });
    //
    searchWidget.on("select-result", function(event){
      console.log(event);
      console.log("Search input textbox was cleared.");
    });

  });
  </script>
  </body>
</html>

miércoles, 7 de agosto de 2019

FILE UPLOAD IN DATABASE JAVA SPRING JDBC

En el proyecto maven de java con spring MVC, tenemos que crear un controller para el fileupload de forma async mediante ajax.

@Controller
@RequestMapping("/upload")
public class FileUploadController {

   @Autowired
   DocumentoAdjuntoService documentoAdjuntoService;
   @Autowired
    ParametroValorService parametroValorService;
 
   @PostMapping("/changefile")
   public @ResponseBody Message fileUpload(MultipartHttpServletRequest request)
         throws IOException {
       String url = System.getProperty("user.home");
           
       Util _util = new Util();
        List<ParametroValor> lstResult = parametroValorService.list(Constantes.Parametros.URL);
        for (ParametroValor oItem : lstResult) {
            url += File.separator + oItem.getValor() +File.separator;
        }
       Message msj = _util.sendFileServer(request,url);
       return msj;
   }
 
   @RequestMapping(value = "/savefile", method = RequestMethod.POST)
   public @ResponseBody Message sendFileUpload(@RequestBody DocumentoAdjunto item)
   {
       Message  msj = documentoAdjuntoService.set(item);
       return msj;
   }
 
}

En esta clase observamos que existen dos funciones, el primero fileUpload que es invocado cuando se carga por primera vez el documento desde el cliente y la otra función sendFileUpload cuando se el cliente confirma guardar el documento.
La linea de codigo System.getProperty("user.home") obtiene una ruta base del servidor de aplicaciones donde se va almacenar el documento de forma temporal. La función sendFileServer se detalla a continuación:

public Message sendFileServer(MultipartHttpServletRequest request, String urlServidor) throws IOException{
        Message msj = new Message();
        File f = new File(urlServidor);
        if(!f.exists()){
           f.mkdirs();
        }
        DocumentoAdjunto obj = new DocumentoAdjunto();
        Iterator<String> itr = request.getFileNames();
       MultipartFile mpf = null;
        while(itr.hasNext()){
                mpf = request.getFile(itr.next());
                String nameFile = new SimpleDateFormat("ddMMyyHHmmss").format(new Date());
                nameFile = nameFile + mpf.getOriginalFilename().replace(" ", "-");
                obj.setURLDOC(urlServidor+ "-"+nameFile);
            try{
                FileCopyUtils.copy(mpf.getBytes(), new FileOutputStream(urlServidor+ nameFile));
                obj.setNOMDOC(nameFile);                
                msj.setSuccess(true);
                msj.setData(obj);
                msj.convert(Constantes.Mensajes.MensajeFileUploadExito);
                
            }
            catch(Exception ex){
                msj.setSuccess(false);
                msj.setData(obj);
                msj.setException(ex.getMessage());
                msj.setType(Constantes.Mensajes.typeError);
                msj.convert(Constantes.Mensajes.MensajeErrorExcepcion);
            }
        }
        return msj;
    }

Dicha función copia el documento del cliente al la ruta base que recibe como parámetro "urlServidor", asimismo se almacena con un nombre generado (parámetro nameFile) con el formato de ddMMyyHHmmss y nombre del archivo.

En la clase tambien observamos la funcion sendFileUpload, evento que se activa cuando el cliente decide guardar el documento en la base de datos. Por lo tanto, en el repositorio DocumentoAdjuntoDataImplement.java debe tener la siguiente estructura:

@Repository("documentoAdjuntoData")
public class DocumentoAdjuntoDataImplement implements DocumentoAdjuntoData {
    
    private SimpleJdbcCall insertarDocumentoAdjuntoBrechaIndicador;
    
    @Autowired
    public void setDataSource(DataSource dataSource) {

        this.insertarDocumentoAdjuntoBrechaIndicador = new SimpleJdbcCall(dataSource)
                .withSchemaName(Constantes.BDContext.Schema)
                .withCatalogName(Constantes.BDContext.PKG_ADMINISTRACION)
                .withProcedureName("USP_INS_DOCUMENTADJUNTO");
       
    }

   @Override
    public Integer set(DocumentoAdjunto item) {
          String oCodigo = "";
        SqlParameterSource in = new MapSqlParameterSource()
        .addValue("V_URLDOC", item.getURLDOC())
        .addValue("V_NOMDOC", item.getNOMDOC())
        .addValue("B_BYTEDOC",  new SqlLobValue(new ByteArrayInputStream(item.getByteDOC()), 
        item.getByteDOC().length, new DefaultLobHandler()), Types.BLOB)
        .addValue("V_USUCREACIO", item.getUsucreacio());

        Map map = insertarDocumentoAdjuntoBrechaIndicador.execute(in);
        List<Map> result = (List<Map>) map.get("CV");
        for (Map obj : result) {
            oCodigo = Format.toString(obj.get("MSG"));
        }

        return Integer.parseInt(oCodigo);
    }


}

GENERATE FILE FROM ARRAY BYTE USING JAVA SPRING JDBC

En el proyecto de java ubicamos nuestra clase DAOImplement para obtener los datos del documento a generar a través de un array de byte.

DocumentoAdjuntoDataImplement.java

@Repository("documentoAdjuntoData")
public class DocumentoAdjuntoDataImplement implements DocumentoAdjuntoData {

private SimpleJdbcCall getDocumentoAdjunto;

 @Autowired
public void setDataSource(DataSource dataSource) {

       
        this.getDocumentoAdjunto = new SimpleJdbcCall(dataSource)
                .withSchemaName(Constantes.BDContext.Schema)
                .withCatalogName(Constantes.BDContext.PKG_ADMINISTRACION)
                .withProcedureName("USP_GET_DOCUMENADJUNTO")
                .returningResultSet("CV", new DocumentoAdjuntoRowMapper());
       
    }

@Override
    public DocumentoAdjunto get(DocumentoAdjunto item) {
        DocumentoAdjunto doc = new DocumentoAdjunto();
        try {
            SqlParameterSource in = new MapSqlParameterSource()
                    .addValue("V_NOMDOC", item.getNOMDOC());
           Map<String, Object> out = getDocumentoAdjunto.execute(in);
           List<DocumentoAdjunto> result = (List<DocumentoAdjunto>) out.get("CV");
           return result.get(0);

        } catch (Exception e) {
            System.out.println(e);
        }
        return doc;
    }

private static class DocumentoAdjuntoRowMapper implements RowMapper<DocumentoAdjunto> {
        @Override
        public DocumentoAdjunto mapRow(ResultSet resultSet, int rowNum) throws SQLException {
            DocumentoAdjunto doc = new DocumentoAdjunto();
            doc.setIDDOCUMENT(resultSet.getInt(("IDDOCUMENT")));
            doc.setNOMDOC(resultSet.getString("NOMDOC"));
            doc.setDESCDOC(resultSet.getString("DESCDOC"));
            doc.setURLDOC(resultSet.getString("URLDOC"));
            doc.setFeccreacio(resultSet.getString("FECCREACIO"));
            doc.setUsucreacio(resultSet.getString("USUCREACIO"));
            doc.setDESCPROCACTUAL(resultSet.getString("VALOR"));
            doc.setPROCACTUAL(resultSet.getInt("PROCACTUAL"));

            Blob blob = resultSet.getBlob("ARCHIVO");
            byte[] bytes = blob.getBytes(1, (int) blob.length());
            doc.setByteDOC(bytes);
            return doc;
        }
    }



En esta clase observamos que en el constructor setDataSource instancia la conexión a la base de datos declarando al StoredProcedure con su respectivo esquema y paquete, asimismo se declara un resultset que invocará a la función DocumentoAdjuntoRowMapper que se va disparar cuando se obtenga los resultado del execute. Es importante resaltar que dentro de la clase RowMapper se hace la conversión del BLOB a un array de byte[], para la creación del archivo mas adelante.


Luego, tenemos una clase controller llamado FileDownloadController.java  que tiene una función de tipo POST que realiza la descarga mediante la url .../file/{nombreArchivo} tal como se declara en el @RequestMapping.

@Controller
@RequestMapping("/download")
public class FileDownloadController {

    @Autowired
    ParametroValorService parametroValorService;
    @Autowired
    DocumentoAdjuntoService  _DocumentoAdjuntoService;

@RequestMapping("/file/{fileName:.+}")
    public void downloadPDFResource(HttpServletRequest request,
            HttpServletResponse response,
            @PathVariable("fileName") String fileName) {
       
        List<ParametroValor> lstResult = parametroValorService.list(Constantes.Parametros.URL);
        for (ParametroValor oItem : lstResult) {
            
            //OBTENEMOS EL ARREGLO DE BYTE COMO ATRIBUTO DEL OBJETO DocumentoAdjunto
            DocumentoAdjunto item = new DocumentoAdjunto();
            item.setNOMDOC(fileName);
            item = _DocumentoAdjuntoService.getDocumento(item);
            
            //GENERAMOS EL DOCUMENTO DESDE ARRAY BYTE
            String urlWriteFile = System.getProperty("user.home");
            urlWriteFile += File.separator + oItem.getValor() +File.separator + fileName;
            Util.writeBytesToFile(item.getByteDOC(), urlWriteFile);
            Path pathfileOrigen = Paths.get(urlWriteFile);
            
            //DESCARGAMOS EL ARCHIVO SEGUN LA EXTENSION    
            File newfile = new File(urlWriteFile);
            String extension = Util.getFileExtension(newfile);
            switch (extension) {
                case "doc":
                    response.setContentType("application/msword");
                    break;
                case "docx":
                    response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
                    break;
                default:
                    response.setContentType("application/"+extension+"");
                    break;
            }
            response.setHeader("Content-Disposition","attachment;filename="+newfile.getName());
         
            try {
                Files.copy(pathfileOrigen, response.getOutputStream());
                response.getOutputStream().flush();
                Util.deleteFile(urlWriteFile);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
           
        }

    }
}


En esta clase observamos los siguientes parámetros:
lstResult: Obtener un parámetro de la base de datos para utilizar como nombre del archivo donde pondremos documentos de forma temporal. 
item: Objeto que filtra los datos del documento mediante el nombre del archivo y a la vez devuelve el arreglo de bytes desde la base de datos.
urlWriteFile: Se genera una ruta especifica donde se van alojar los archivos, ya sea en windows o linux, al fin a cabo será de forma temporal. Por ejemplo para linux genera una ruta "/home/oracle/[lstResult]/[item.filename]".
writeBytesToFile: La función que genera el documento:
public static void writeBytesToFile(byte[] bFile, String fileDest) {
        try (FileOutputStream fileOuputStream = new FileOutputStream(fileDest)) {
            fileOuputStream.write(bFile);
        } catch (IOException e) {
            e.printStackTrace();
        }


    }
response.setContentType: Tipo de extensión del archivo a descargar.
deleteFile: Función que elimina el archivo una vez descargado:
public static void deleteFile(String urlFile) throws IOException{
        
        try
        { 
            Files.deleteIfExists(Paths.get(urlFile)); 
        } 
        catch(NoSuchFileException e) 
        { 
            System.out.println("No such file/directory exists"); 
        } 
        catch(DirectoryNotEmptyException e) 
        { 
            System.out.println("Directory is not empty."); 
        } 
        catch(IOException e) 
        { 
            System.out.println("Invalid permissions."); 
        } 

    }
getFileExtension: Función que devuelve la extensión de un documento:
public static String getFileExtension(File file) {
        String fileName = file.getName();
        if(fileName.lastIndexOf(".") != -1 && fileName.lastIndexOf(".") != 0)
        return fileName.substring(fileName.lastIndexOf(".")+1);
        else return "";

    }



viernes, 29 de septiembre de 2017

WebService CustomBinding

Ejemplo de invocación de un servicio web de tipo customBindig.

Posibles mensajes de Error si estuviese mal configurado:
InnerExceptionMessage
The message with Action '' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndPointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g.Message, Transport, None).

 public static void Metodo_Configura_customBinding()
        {
            Uri epUri = new Uri("https://[URL WebService].svc");
            CustomBinding binding = new CustomBinding();
            binding.Name = "[NombreInterfaceWebService]";
            binding.Elements.Add(new TextMessageEncodingBindingElement(MessageVersion.Soap12, System.Text.Encoding.UTF8));
            binding.Elements.Add(new HttpsTransportBindingElement());
            EndpointAddress endPoint = new EndpointAddress(epUri);

            using (var service = new NombreServiceClient(binding, endPoint))
            {
                try
                {
                    service.NombreDelMetodo(Parametros);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }

jueves, 31 de agosto de 2017

Web.config Upload File POST size .NET

 <httpRuntime targetFramework="4.5" maxRequestLength="61440" executionTimeout="60000" />
Donde:
maxRequestLength = [MB]*1024

<requestFiltering>        <requestLimits maxAllowedContentLength="62914560" /> </requestFiltering>

Donde:maxAllowedContentLength =  [MB]*1024*1024


jueves, 30 de marzo de 2017

GENERAR ARCHIVO TXT DESDE SQL SERVER

Para generar un archivo txt desde el SQL Server, se tiene que ejecutar la siguiente sentencia con la estructura:


DECLARE @Cmd AS VARCHAR(1000)
SET @Cmd ='bcp "SELECT DATA FROM [NOMBRE_TABLA] [WHERE CONDICION1]" queryout [RUTA_DIRECTORIO_DESTINO]/[NOMBRE_ARCHIVO].txt -c -T -S [NOMBRE_SERVIDOR_BD] -U [USUARIO_BD] -P [CLAVE_USUARIO_BD] -d  [NOMBRE_BD]'
EXECUTE Master.dbo.xp_CmdShell  @Cmd

Ejemplo:

DECLARE @Cmd AS VARCHAR(1000)
SET @Cmd ='bcp "SELECT DATA FROM TRN.PROCESO_SALIDA_DETALLE WHERE CODIGO_PROCESO_SALIDA=63" queryout D:\UNIQUE\Documentos\ejemplo\query01_out.txt -c -T -S uni010028021249 -U usr_app_sfc -P u$r_@pp_$fc -d  FINANCIERO_PUENTE'
EXECUTE Master.dbo.xp_CmdShell  @Cmd


jueves, 1 de diciembre de 2016

Enviar correo desde SQL Server

Para enviar correo por SQL Server es a través de la sentencia:

EXEC [msdb].[dbo].[sp_send_dbmail]
@profile_name = 'NombrePerfilCorreo',
@recipients = 'correoDestino@gmail.com',
@copy_recipients = 'otroCorreo@gmail.com',
@body = 'TEST2',
@body_format='html',
@subject = 'NombreDelAsunto'


jueves, 13 de octubre de 2016

Cookies en ASP.NET C#

Para crear una Cookies en .NET se necesita colocarle un nombre propio. En C# sería:

private void createUserInformationCookie(string username, TokenSecurityGeneratedResponseTypeProxy tokenSecurity, string cookieName)
        {
            try
            {
                UserInformation userInformation = new UserInformation();
                userInformation.userName = username;
                userInformation.tokenSecurityId = tokenSecurity.tokenSecurity.TokenSecurityId;
                userInformation.businessUnitCode = tokenSecurity.tokenSecurity.BusinessUnity;
                String json = JsonConvert.SerializeObject(userInformation);
                HttpCookie cookie = new HttpCookie(cookieName);
                cookie.Expires = DateTime.Now.AddHours(Common.cookieExpirationTime);
                cookie.Value = json;
                cookie.HttpOnly = true;
                HttpContext.Response.Cookies.Add(cookie);

            }
            catch (Exception ex)
            {

            }
        }

sábado, 8 de octubre de 2016

No se puede cargar el archivo o ensamblado (Excepción de HRESULT: 0x80070020)

Cuando tengan un error en visual studio de tipo "No se puede cargar el archivo o ensamblado (Excepción de HRESULT: 0x80070020)" es probable que otro puerto está siendo usado por el mismo puerto que usa visual studio .net 80 y 443.

miércoles, 5 de octubre de 2016

SQL Service Broker

Los Service Brocker es un servicio que se activa en la base de datos del servidor del SQL Server para realizar una comunicación de Servidor a Cliente.

https://msdn.microsoft.com/es-es/library/bb522893.aspx

Las sentencias en base de datos para activar este servicio son:


ALTER DATABASE [db nameSET ENABLE_BROKER WITH ROLLBACK IMMEDIATE

ALTER AUTHORIZATION ON DATABASE::[db name] TO [sa];

jueves, 7 de abril de 2016

SQL Server estructura de tablas

DECLARE @NAME_TABLE VARCHAR(100) = '[GRL].[COLABORADOR_CIERRE]'

--********************** CONSULTA DE COLUMNAS INDEXADAS *******************************
SELECT 
     --TableName = t.name,
     IndexName = ind.name,
     --IndexId = ind.index_id,
     --ColumnId = ic.index_column_id,
     ColumnName = col.name
     --ind.*,
     --ic.*,
     --col.*
FROM
     sys.indexes ind
INNER JOIN
     sys.index_columns ic ON  ind.object_id = ic.object_id and ind.index_id = ic.index_id
INNER JOIN
     sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_id
INNER JOIN
     sys.tables t ON ind.object_id = t.object_id
WHERE
     ind.is_primary_key = 0
     AND ind.is_unique = 0
     AND ind.is_unique_constraint = 0
     AND t.is_ms_shipped = 0
 AND t.object_id  = OBJECT_ID(@NAME_TABLE)
ORDER BY
     t.name, ind.name, ind.index_id, ic.index_column_id

--********************** CONSULTA DE COLUMNAS *******************************
SELECT
    c.name 'Columna',
    t.Name 'Tipo',
    c.max_length 'Tamaño',
    --c.precision ,
    --c.scale ,
    CASE WHEN c.is_nullable = 0 THEN 'N' ELSE 'Y' END 'Nulo',
    CASE WHEN ISNULL(i.is_primary_key, 0) = 0 THEN 'N' ELSE 'Y' END 'PK' ,
i.object_id, c.column_id,
CASE WHEN (SELECT COUNT(1) FROM  sys.foreign_key_columns WHERE parent_object_id = i.object_id
AND parent_column_id = c.column_id ) > 0 THEN 'Y'
ELSE 'N' END 'FK'
,PP.VALUE 'DESCRIPCION'
FROM  
    sys.columns c
INNER JOIN
    sys.types t ON c.user_type_id = t.user_type_id
LEFT OUTER JOIN
    sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id
LEFT OUTER JOIN
    sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
INNER JOIN sys.extended_properties PP ON PP.major_id = C.object_id AND PP.minor_id = C.column_id
WHERE
    c.object_id = OBJECT_ID(@NAME_TABLE)


Resultado:


martes, 23 de febrero de 2016

SQL SERVER convertir números a letras

Varios nos preguntamos cómo convertir números decimales o enteros en texto (Ejm: DIEZ con 00/100 soles) en base de datos SQL Server.

Aquí tengo una función donde podría ayudar a resolver este problema.

--TEST:
--select [dbo]].[CantidadConLetra](50580.25)
CREATE FUNCTION [dbo].[CantidadConLetra]
(
    @Numero             Decimal(18,2)
)
RETURNS Varchar(180)
AS
BEGIN
    DECLARE @ImpLetra Varchar(180)
        DECLARE @lnEntero INT,
                        @lcRetorno VARCHAR(512),
                        @lnTerna INT,
                        @lcMiles VARCHAR(512),
                        @lcCadena VARCHAR(512),
                        @lnUnidades INT,
                        @lnDecenas INT,
                        @lnCentenas INT,
                        @lnFraccion INT
        SELECT  @lnEntero = CAST(@Numero AS INT),
                        @lnFraccion = (@Numero - @lnEntero) * 100,
                        @lcRetorno = '',
                        @lnTerna = 1
  WHILE @lnEntero > 0
  BEGIN /* WHILE */
            -- Recorro terna por terna
            SELECT @lcCadena = ''
            SELECT @lnUnidades = @lnEntero % 10
            SELECT @lnEntero = CAST(@lnEntero/10 AS INT)
            SELECT @lnDecenas = @lnEntero % 10
            SELECT @lnEntero = CAST(@lnEntero/10 AS INT)
            SELECT @lnCentenas = @lnEntero % 10
            SELECT @lnEntero = CAST(@lnEntero/10 AS INT)
            -- Analizo las unidades
            SELECT @lcCadena =
            CASE /* UNIDADES */
              WHEN @lnUnidades = 1 THEN 'UN ' + @lcCadena
              WHEN @lnUnidades = 2 THEN 'DOS ' + @lcCadena
              WHEN @lnUnidades = 3 THEN 'TRES ' + @lcCadena
              WHEN @lnUnidades = 4 THEN 'CUATRO ' + @lcCadena
              WHEN @lnUnidades = 5 THEN 'CINCO ' + @lcCadena
              WHEN @lnUnidades = 6 THEN 'SEIS ' + @lcCadena
              WHEN @lnUnidades = 7 THEN 'SIETE ' + @lcCadena
              WHEN @lnUnidades = 8 THEN 'OCHO ' + @lcCadena
              WHEN @lnUnidades = 9 THEN 'NUEVE ' + @lcCadena
              ELSE @lcCadena
            END /* UNIDADES */
            -- Analizo las decenas
            SELECT @lcCadena =
            CASE /* DECENAS */
              WHEN @lnDecenas = 1 THEN 
                CASE @lnUnidades
                  WHEN THEN 'DIEZ '
                  WHEN THEN 'ONCE '
                  WHEN THEN 'DOCE '
                  WHEN THEN 'TRECE '
                  WHEN THEN 'CATORCE '
                  WHEN THEN 'QUINCE '
                  WHEN THEN 'DIEZ Y SEIS '
                  WHEN THEN 'DIEZ Y SIETE '
                  WHEN THEN 'DIEZ Y OCHO '
                  WHEN THEN 'DIEZ Y NUEVE '
                END 
              WHEN @lnDecenas = 2 THEN 
              CASE @lnUnidades
                WHEN THEN 'VEINTE '
                ELSE 'VEINTI' + @THEN 
              END 
              WHEN @lnDecenas = 3 THEN 
              CASE @lnUnidades
                WHEN THEN 'TREINTA '
                ELSE 'TREINTA Y ' + @lcCadena
              END 
              WHEN @lnDecenas = 4 THEN 
                CASE @lnUnidades
                    WHEN THEN 'CUARENTA'
                    ELSE 'CUARENTA Y ' + @lcCadena
                END 
              WHEN @lnDecenas = 5 THEN 
                CASE @lnUnidades
                    WHEN THEN 'CINCUENTA '
                    ELSE 'CINCUENTA Y ' + @lcCadena
                END 
              WHEN @lnDecenas = 6 THEN 
                CASE @lnUnidades
                    WHEN THEN 'SESENTA '
                    ELSE 'SESENTA Y ' + @lcCadena
                END 
              WHEN @lnDecenas = 7 THEN 
                 CASE @lnUnidades
                    WHEN THEN 'SETENTA '
                    ELSE 'SETENTA Y ' + @lcCadena
                 END 
              WHEN @lnDecenas = 8 THEN 
                CASE @lnUnidades
                    WHEN THEN 'OCHENTA '
                    ELSE 'OCHENTA Y ' + @lcCadena
                END 
              WHEN @lnDecenas = 9 THEN 
                CASE @lnUnidades
                    WHEN THEN 'NOVENTA '
                    ELSE 'NOVENTA Y ' + @lcCadena
                END 
              ELSE @lcCadena
            END /* DECENAS */
            -- Analizo las centenas
            SELECT @lcCadena =
            CASE /* CENTENAS */
              WHEN @lnCentenas = 1 THEN 'CIENTO ' + @lcCadena
              WHEN @lnCentenas = 2 THEN 'DOSCIENTOS ' + @lcCadena
              WHEN @lnCentenas = 3 THEN 'TRESCIENTOS ' + @lcCadena
              WHEN @lnCentenas = 4 THEN 'CUATROCIENTOS ' + @lcCadena
              WHEN @lnCentenas = 5 THEN 'QUINIENTOS ' + @lcCadena
              WHEN @lnCentenas = 6 THEN 'SEISCIENTOS ' + @lcCadena
              WHEN @lnCentenas = 7 THEN 'SETECIENTOS ' + @lcCadena
              WHEN @lnCentenas = 8 THEN 'OCHOCIENTOS ' + @lcCadena
              WHEN @lnCentenas = 9 THEN 'NOVECIENTOS ' + @lcCadena
              ELSE @lcCadena
            END /* CENTENAS */
            -- Analizo la terna
            SELECT @lcCadena =
            CASE /* TERNA */
              WHEN @lnTerna = 1 THEN  @lcCadena
              WHEN @lnTerna = 2 THEN @lcCadena + 'MIL '
              WHEN @lnTerna = 3 THEN @lcCadena + 'MILLONES '
              WHEN @lnTerna = 4 THEN @lcCadena + 'MIL '
              ELSE ''
            END /* TERNA */
            -- Armo el retorno terna a terna
            SELECT @lcRetorno = @lcCadena  + @lcRetorno
            SELECT @lnTerna = @lnTerna + 1
   END 
   IF @lnTerna = 1
       SELECT @lcRetorno = 'CERO'
   DECLARE @sFraccion VARCHAR(15)
   SET @sFraccion = '00' + LTRIM(CAST(@lnFraccion AS varchar))
   SELECT @ImpLetra = RTRIM(@lcRetorno) +' con '+ SUBSTRING(@sFraccion,LEN(@sFraccion)-1,2) + '/100 soles'

   RETURN @ImpLetra
END 




Para comprobar el resultado de la función, invocaremos lo siguiente:

select [dbo].[CantidadConLetra](150.60)

quedando como resultado:

viernes, 7 de marzo de 2014

AJAX - File Upload

AJAX - FILE UPLOAD

1.- Importar las librerias o Pluggin a utilizar, en la pagina Index de tu Vista (donde vas a cargar tu archivo).



2. Luego, en mi PartView le agrego mi Form y demás controles.

<form name="ajaxform" id="ajaxform" action="./Home/ObtenerRutaArchivo/" method="POST">        Archivo :<input type="file" name="photo" accept="xls" /><br/>    <input type="submit" id="btn" value="Enviar" />
                                        <div id="progress">                                            <div id="bar"></div>                                            <div id="percent">0%</div>                                        </div>
</form>

3. En la misma página, Pego mi JavaScript

<script type="text/javascript">

    //callback handler for form submit

    $('#ajaxform').ajaxForm(function () {

       alert("Form is submitted");
    });
    function uploadFiles(event) {
        var formObj = $(this);
        var formURL = formObj.attr("action");
        var formData = new FormData(this);
        $.ajax({
            url: formURL,
            type: 'POST',
            data: formData,
            mimeType: "multipart/form-data",
            contentType: false,
            cache: false,
            processData: false,
            success: function (data, textStatus, jqXHR) {
                $("#div_listWBS").html(data);
            },
            error: function (jqXHR, textStatus, errorThrown) {
            }
        });
        //event.preventDefault(); //Prevent Default action. 
        //event.unbind();
    }
    $('#ajaxform').on('submit', uploadFiles);
</script>

4. En mi Controller "Home": Metodo "ObtenerRutaArchivo"

[HttpPost]
        public ActionResult ObtenerRutaArchivo()
        {
            DataTable dt = new DataTable();
            var file = Request.Files[0];
            VMWBS BE = new VMWBS();

            string momentImport = DateTime.Now.ToString(Constantes.Formaters.datePatt);
            
            try
            {
                var fileName = Path.GetFileName(file.FileName);
                string nombre = momentImport + "_" +file.FileName;
                var path = Path.Combine(Server.MapPath("~/xlsx/"), nombre);
                file.SaveAs(path);

                //Listado.Add(new Cronograma
                //{
                //    cronograma = 1,
                //    descripcion = "prueba"
                //});
                dt = CargarExcel(path);
                BE.ListCronograma  = InsertarExcel(dt);
            }
            catch (Exception ex)
            {
                throw ex;
            }


            return PartialView("_ListWBS", BE);

        }



Eso es Todo!!

Referencias URL : Otra solucion aquí