miércoles, 26 de septiembre de 2018

Instrucción GOTO en T-SQL

A partir de SQL Server 2008 existe la instrucción GOTO que altera el flujo de ejecución y lo dirige a una área de código marcada por una etiqueta. Las instrucciones Transact-SQL que siguen a una instrucción GOTO se pasan por alto y el procesamiento continúa en el punto que marca la etiqueta. Las instrucciones GOTO y las etiquetas se pueden utilizar en cualquier punto de un procedimiento, lote o bloque de instrucciones. Las instrucciones GOTO se pueden anidar. Para nuestro ejemplo de uso del GOTO usemos el siguiente script:

DECLARE @Contador int; 
SET @Contador = 1; 
WHILE @Contador < 10 
BEGIN  
    SELECT @Contador 
    IF @Contador = 4 GOTO Opcion_Uno --Jumps to the first branch. 
    IF @Contador = 5 GOTO Opcion_Dos--This will never execute. 
    SET @Contador = @Contador + 1 
END 
Opcion_Uno: 
    SELECT 'Eligio opción uno.' 
    GOTO Salida; --Esto evitará que las opciones se ejecuten una despues de la otra
Opcion_Dos: 
    SELECT 'Eligio opción dos.' 
    GOTO Salida; --Esto evitará que las opciones se ejecuten una despues de la otra
Opcion_Tres: 
    SELECT 'Eligio opción tres.'; 
    GOTO Salida; --Esto evitará que las opciones se ejecuten una despues de la otra
Salida:
    SELECT 'Adios';

Vemos ahora como funciona en la siguiente imágen: goto2

martes, 21 de agosto de 2018

Path de imágenes de los catálogos en Magento 2.2


Estos días me tocado trabajar con Magento uno de los mejores ecomerce del mercado y he podido constatar la robusta herramienta que es, hemos migrado de la versión 1.6 a la 2.2.
Resulta que en este proceso de migración es necesario extraer las imágenes de los catálogos de productos de manera manual y colocarlas en el nuevo sitio, mi pregunta inmediata fue donde coloco estas imágenes, hay que hacer mención que de Magento no hay tanta documentación como de otros productos, luego de un rato de googlear encontré la ubicación y copie mis imágenes en este path C:\xampp\htdocs\magento-junio\pub\media\catalog y listo, los productos ya contaban con sus imágenes en el sitio.





miércoles, 23 de mayo de 2018

Archivo de Información a Conexión a Datos de Magento 2.2

El archivo donde se encuentra la información de conexión a datos de la plataforma de magento es el archivo env.php, ubicado en el folder  app\etc.



 Editando este documento podemos re direccionar la base de datos o cambiar el usuario y contraseña.



martes, 22 de mayo de 2018

Problemas con iconos al instalar Magento 2.2

He instalado Magento 2.2 en XAMPP la instalación a funcionado correctamente y es posible acceder al sitio creado, pero cuando intento acceder al panel de administración, tarda mucho tiempo y no me carga correctamente los iconos, no responde si intento acceder a algún apartado.
Por lo que para resolver este error es necesario realizar los siguientes pasos.


1. Borrar dentro del sitio en la carpeta pub\static todas las carpetas y archivos solo dejar el .htaccess
2. solo el archivo .htaccess

3. Modificar el archivo di.xml ubicado en en la carpeta app\etc
4. Editar el archivo con algún editor de XML como por ejemplo Dreamweaver.

5. Cambiar la linea de código 
<item name="view_preprocessed" xsi:type="object">Magento\Framework\App\View\Asset\MaterializationStrategy\Symlink</item>

por:

<item name="view_preprocessed" xsi:type="object">Magento\Framework\App\View\Asset\MaterializationStrategy\Copy</item>





martes, 24 de abril de 2018

ComboBox filtrado por otro ComboBox

Es frecuente que necesitemos que al elegir un elemento de una lista desplegable o combo box una segunda lista desplegable o combo box se filtre con datos de acuerdo a la elección tomada en el primer combo box.
En este ejemplo usamos programación con JavaScript usando departamentos y municipios de Guatemala, al elegir un departamento la segunda lista desplegable mostrará los municipios de este departamento, el código completo de la pagina se pone a continuación


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Documento sin título</title>
<script>
function cargardepartamentos() {
    var array = ["GUATEMALA","EL PROGRESO","SACATEPEQUEZ","CHIMALTENANGO","ESCUINTLA","SANTA ROSA","SOLOLA","TOTONICAPAN","QUETZALTENANGO","SUCHITEPEQUEZ","RETALHULEU","SAN MARCOS","HUEHUETENANGO","QUICHE","BAJA VERAPAZ","ALTA VERAPAZ","PETEN","IZABAL","ZACAPA","CHIQUIMULA","JALAPA","JUTIAPA"];
    array.sort();
    addOptions("departamento", array);
}
//Función para agregar opciones a un <select>.
function addOptions(domElement, array) {
    var selector = document.getElementsByName(domElement)[0];
    for (departamento in array) {
        var opcion = document.createElement("option");
        opcion.text = array[departamento];
        // Añadimos un value a los option para hacer mas facil escoger los municipios
        opcion.value = array[departamento].toLowerCase()
        selector.add(opcion);
    }
}
function cargarmunicipios() {
    // Objeto de departamentos con municipios
    var listamunicipios = {
  guatemala: ["GUATEMALA","SANTA CATARINA PINULA","SAN JOSE PINULA","SAN JOSE DEL GOLFO","PALENCIA","CHINAUTLA","SAN PEDRO AYAMPUC","MIXCO","SAN PEDRO SACATEPEQUEZ","SAN JUAN SACATEPEQUEZ","SAN RAYMUNDO","CHUARRANCHO","FRAIJANES","AMATITLAN","VILLA NUEVA","VILLA CANALES","SAN MIGUEL PETAPA"],
  'el progreso': ["GUASTATOYA","MORAZAN","SAN AGUSTIN ACASAGUASTLAN","SAN CRISTOBAL ACASAGUASTLAN","EL JICARO","SANSARE","SANARATE","SAN ANTONIO LA PAZ"],
  sacatepequez: ["ANTIGUA","JOCOTENANGO","PASTORES","SUMPANGO","SANTO DOMINGO XENACOJ","SANTIAGO SACATEPEQUEZ","SAN BARTOLOME MILPAS ALTAS","SAN LUCAS SACATEPEQUEZ","SANTA LUCIA MILPAS ALTAS","MAGDALENA MILPAS ALTAS","SANTA MARIA DE JESUS","CIUDAD VIEJA","SAN MIGUEL DUENAS","ALOTENANGO","SAN ANTONIO AGUAS CALIENTES","SANTA CATARINA BARAHONA"],
  chimaltenango: ["CHIMALTENANGO","SAN JOSE POAQUIL","SAN MARTIN JILOTEPEQUE","SAN JUAN COMALAPA","SANTA APOLONIA","TECPAN GUATEMALA","PATZUN","SAN MIGUEL POCHUTA","PATZICIA","SANTA CRUZ BALANYA","ACATENANGO","SAN PEDRO YEPOCAPA","SAN ANDRES ITZAPA","PARRAMOS","ZARAGOZA","EL TEJAR"],
  escuintla: ["ESCUINTLA","SANTA LUCIA COTZUMALGUAPA","LA DEMOCRACIA","SIQUINALA","MASAGUA","TIQUISATE","LA GOMERA","GUANAGAZAPA","SAN JOSE","IZTAPA","PALIN","SAN VICENTE PACAYA" ],
  'santa rosa': ["CUILAPA","BARBERENA","SANTA ROSA DE LIMA","CASILLAS","SAN RAFAEL LAS FLORES","ORATORIO","SAN JUAN TECUACO","CHIQUIMULILLA","TAXISCO","SANTA MARIA IXHUATAN","GUAZACAPAN","SANTA CRUZ NARANJO","municipio NUEVO VIÑAS","NUEVA SANTA ROSA"],
  solola: ["SOLOLA","SAN JOSE CHACAYA","SANTA MARIA VISITACION","SANTA LUCIA UTATLAN","NAHUALA","SANTA CATARINA IXTAHUACAN","SANTA CLARA LA LAGUNA","CONCEPCION","SAN ANDRES SEMETABAJ","PANAJACHEL","SANTA CATARINA PALOPO","SAN ANTONIO PALOPO","SAN LUCAS TOLIMAN","SANTA CRUZ LA LAGUNA","SAN PABLO LA LAGUNA","SAN MARCOS LA LAGUNA","SAN JUAN LA LAGUNA","SAN PEDRO LA LAGUNA","SANTIAGO ATITLAN"],
  totonicapan: ["TOTONICAPAN","SAN CRISTOBAL TOTONICAPAN","SAN FRANCISCO EL ALTO","SAN ANDRES XECUL","MOMOSTENANGO","SANTA MARIA CHIQUIMULA","SANTA LUCIA LA REFORMA","SAN BARTOLO AGUAS CALIENTES"],
  quetzaltenango: ["QUETZALTENANGO","SALCAJA","OLINTEPEQUE","SAN CARLOS SIJA","SIBILIA","CABRICAN","CAJOLA","SAN MIGUEL SIGUILA","SAN JUAN OSTUNCALCO","SAN MATEO","CONCEPCION CHIQUIRICHAPA","SAN MARTIN SACATEPEQUEZ","ALMOLONGA","CANTEL","HUITAN","ZUNIL","COLOMBA COSTA CUCA","SAN FRANCISCO LA UNION","EL PALMAR","COATEPEQUE","GENOVA COSTA CUCA","FLORES COSTA CUCA","LA ESPERANZA","PALESTINA DE LOS ALTOS"],
  suchitepequez: ["MAZATENANGO","CUYOTENANGO","SAN FRANCISCO ZAPOTITLAN","SAN BERNARDINO","SAN JOSE EL IDOLO","SANTO DOMINGO SUCHITEPEQUEZ","SAN LORENZO","SAMAYAC","SAN PABLO JOCOPILAS","SAN ANTONIO SUCHITEPEQUEZ","SAN MIGUEL PANAM","SAN GABRIEL","CHICACAO","PATULUL","SANTA BARBARA","SAN JUAN BAUTISTA","SANTO TOMAS LA UNION","ZUNILITO","municipio NUEVO","RIO BRAVO"],
  retalhuleu: ["RETALHULEU","SAN SEBASTIAN","SANTA CRUZ MULUA","SAN MARTIN ZAPOTITLAN","SAN FELIPE","SAN ANDRES VILLA SECA","CHAMPERICO","NUEVO SAN CARLOS","EL ASINTAL"],
  'san marcos': ["SAN MARCOS","SAN PEDRO SACATEPEQUEZ","SAN ANTONIO SACATEPEQUEZ","COMITANCILLO","SAN MIGUEL IXTAHUACAN","CONCEPCION TUTUAPA","TACANA","SIBINAL","TAJUMULCO","TEJUTLA","SAN RAFAEL PIE DE LA CUESTA","NUEVO PROGRESO","EL TUMBADOR","SAN JOSE EL RODEO","MALACATAN","CATARINA","AYUTLA (TECUN UMAN)","OCOS","SAN PABLO","EL QUETZAL","LA REFORMA","PAJAPITA","IXCHIGUAN","SAN JOSE OJETENAN","SAN CRISTOBAL CUCHO","SIPACAPA","ESQUIPULAS PALO GORDO","RIO BLANCO","SAN LORENZO"],
  huehuetenango: ["HUEHUETENANGO","CHIANTLA","MALACATANCITO","CUILCO","NENTON","SAN PEDRO NECTA","JACALTENANGO","SAN PEDRO SOLOMA","SAN ILDEFONSO IXTAHUACAN","SANTA BARBARA","LA LIBERTAD","LA DEMOCRACIA","SAN MIGUEL ACATAN","SAN RAFAEL LA INDEPENDENCIA","TODOS SANTOS CUCHUMATAN","SAN JUAN ATITAN","SANTA EULALIA","SAN MATEO IXTATAN","COLOTENANGO","SAN SEBASTIAN HUEHUETENANGO","TECTITAN","CONCEPCION HUISTA","SAN JUAN IXCOY","SAN ANTONIO HUISTA","SAN SEBASTIAN COATAN","SANTA CRUZ BARILLAS","AGUACATAN","SAN RAFAEL PETZAL","SAN GASPAR IXCHIL","SANTIAGO CHIMALTENANGO","SANTA ANA HUISTA","UNIÓN CANTINIL"],
  quiche: ["SANTA CRUZ DEL QUICHE","CHICHE","CHINIQUE","ZACUALPA","CHAJUL","STO TOMAS CHICHICASTENANGO","PATZITE","SAN ANTONIO ILOTENANGO","SAN PEDRO JOCOPILAS","CUNEN","SAN JUAN COTZAL","JOYABAJ","NEBAJ","SAN ANDRES SAJCABAJA","SAN MIGUEL USPANTAN","SACAPULAS","SAN BARTOLOME JOCOTENANGO","CANILLA","CHICAMAN","IXCAN","PACHALUN","PLAYA GRANDE"],
  'baja verapaz': ["SALAMA","SAN MIGUEL CHICAJ","RABINAL","CUBULCO","GRANADOS","SANTA CRUZ EL CHOL","SAN JERONIMO","PURULHA"],
  'alta verapaz': ["COBAN","SANTA CRUZ VERAPAZ","SAN CRISTOBAL VERAPAZ","TACTIC","TAMAHU","SAN MIGUEL TUCURU","PANZOS","SENAHU","SAN PEDRO CARCHA","SAN JUAN CHAMELCO","LANQUIN","SANTA MARIA CAHABON","CHISEC","CHAHAL","FRAY BARTOLOME DE LAS CASAS","LA TINTA","RAXRUHÁ"],
  peten: ["FLORES","SAN JOSE","SAN BENITO","SAN ANDRES","LA LIBERTAD","SAN FRANCISCO","SANTA ANA","DOLORES","SAN LUIS","SAYAXCHE","MELCHOR DE MENCOS","POPTUN"],
  izabal: ["PUERTO BARRIOS","LIVINGSTON","EL ESTOR","MORALES","LOS AMATES"],
  zacapa: ["ZACAPA","ESTANZUELA","RIO HONDO","GUALAN","TECULUTAN","USUMATLAN","CABANAS","SAN DIEGO","LA UNION","HUITE"],
  chiquimula: ["CHIQUIMULA","SAN JOSE LA ARADA","SAN JUAN LA ERMITA","JOCOTAN","CAMOTAN","OLOPA","ESQUIPULAS","CONCEPCION LAS MINAS","QUEZALTEPEQUE","SAN JACINTO","IPALA"],
  jalapa: ["JALAPA","SAN PEDRO PINULA","SAN LUIS JILOTEPEQUE","SAN MANUEL CHAPARRON","SAN CARLOS ALZATATE","MONJAS","MATAQUESCUINTLA"],
  jutiapa: ["JUTIAPA","EL PROGRESO","SANTA CATARINA MITA","AGUA BLANCA","ASUNCION MITA","YUPILTEPEQUE","ATESCATEMPA","JEREZ","EL ADELANTO","ZAPOTITLAN","COMAPA","JALPATAGUA","CONGUACO","MOYUTA","PASACO","SAN JOSE ACATEMPA","QUESADA"]
    }
   
    var departamentos = document.getElementById('departamento')
    var municipios = document.getElementById('municipio')
    var departamentoSeleccionada = departamentos.value
   
    // Se limpian los municipios
    municipios.innerHTML = '<option value="">SELECCIONE UN MUNICIPIO...</option>'
   
    if(departamentoSeleccionada !== ''){
      // Se seleccionan los municipios y se ordenan
      departamentoSeleccionada = listamunicipios[departamentoSeleccionada]
      departamentoSeleccionada.sort()
   
      // Insertamos los municipios
      departamentoSeleccionada.forEach(function(municipio){
        opcion = document.createElement('option')
        opcion.value = municipio
        opcion.text = municipio
        municipios.add(opcion)
      });
    }
   
  }
 
 // Iniciar la carga de departamentos solo para comprobar que funciona
</script>
</head>
<body onload="cargardepartamentos();">
<table>
   <tr>
      <td align=right>departamento:</td>
      <td align=left colspan=3>
          <!-- Añadido onchange para cargar los municipios -->
          <select name="departamento" id="departamento" onchange="cargarmunicipios();" class="form-control">
              <option value="">SELECCIONE UN DEPARTAMENTO...</option>
          </select>
      </td>
  </tr>
  <tr>                   
      <td align=right>municipio:</td>
      <td align=left colspan=3>
          <select name="municipio" id="municipio" class="form-control">
              <option value="">SELECCIONE UN MUNICIPIO...</option>
          </select>
      </td>
  </tr>
</table>
</body>
</html>

sábado, 7 de abril de 2018

Busqueda en todas las tablas de la base de datos en SQL Server

En este ejemplo buscaremos un valor en todas las tablas de la base de datos, para esto consultaremos la metada de la base de datos con vistas de esquema de información

Una vista de INFORMATION_SCHEMA es uno de varios métodos de SQL Server que permite obtener metadatos, sin consultar directamente tablas del sistema, y además es un estándar ISO es decir que las vistas de INFORMATION_SCHEMA también se tienen en otros gestores de base de datos.

Usando estas vistas vamos consultar todas las tablas que tiene la base de datos, esto con la vista INFORMATION_SCHEMA.TABLES y a cada tabla le consultaremos los campos que posee con la vista INFORMATION_SCHEMA.COLUMNS, esto recalco para buscar un valor que no sabemos en que tabla de la base de datos se encuentra.

Declare @StrParametroBusqueda varchar(150)
Set @StrParametroBusqueda='Paris' -- <----Aquí agregamos el valor a buscar
CREATE TABLE #Resultado (NombreColumna nvarchar(500), ValorColumna nvarchar(3630))
SET NOCOUNT ON
DECLARE @NombreTabla varchar(300), @NombreColumna varchar(300), @StrValorABuscar varchar(300)
SET @NombreTabla = ''
SET @StrValorABuscar = QUOTENAME('%' + @StrParametroBusqueda + '%','''')
WHILE @NombreTabla IS NOT NULL
       BEGIN
             SET @NombreColumna = ''
             SET @NombreTabla =
                    (SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
                    FROM INFORMATION_SCHEMA.TABLES
                    WHERE TABLE_TYPE = 'BASE TABLE'
                    AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @NombreTabla
                    AND OBJECTPROPERTY(
                    OBJECT_ID(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)), 'IsMSShipped') = 0)
                           WHILE (@NombreTabla IS NOT NULL) AND (@NombreColumna IS NOT NULL)
                           BEGIN
                                  SET @NombreColumna =
                                  (SELECT MIN(QUOTENAME(COLUMN_NAME))
                                  FROM INFORMATION_SCHEMA.COLUMNS
                                  WHERE TABLE_SCHEMA = PARSENAME(@NombreTabla, 2)
                                  AND TABLE_NAME = PARSENAME(@NombreTabla, 1)
                                  AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar')
                                  AND QUOTENAME(COLUMN_NAME) > @NombreColumna)
                                  IF @NombreColumna IS NOT NULL
                                        BEGIN
                                               INSERT INTO #Resultado
                                               EXEC
                                               ('SELECT ''' + @NombreTabla + '.' + @NombreColumna + ''', LEFT(' + @NombreColumna + ', 3630)
                                               FROM ' + @NombreTabla + ' (NOLOCK) ' + ' WHERE ' + @NombreColumna + ' LIKE ' + @StrValorABuscar)
                                        END
                           END
       END
SELECT NombreColumna, ValorColumna FROM #Resultado
Drop table #Resultado

lunes, 29 de enero de 2018

Activar números de línea en el SQL Server Management Studio

1.  Para activar la numeración de línea en tu SQL Server Management Studio debes de elegir en el menú de Tools, Options.

2. Dentro de las opciones a la izquierda de la ventana emergente localiza "Text Editor" y allí "Transac-SQL" y finalmente eliges "General", donde encontraras la casilla a activar de "Line Numbers"

 3. Finalmente se activa la numeración de línea en tu editor del management studio.