24 febrero 2016

Cómo seleccionar un valor concreto de un objeto Select y un Input Radio (HTML) utilizando PHP


En esta ocasión les enseñaré cómo podemos seleccionar un valor concreto de un objeto Select (HTML) utilizando PHP a partir del valor guardado en una variable de sesión. En el ejemplo la variable es $_SESSION["NumeroGenero"].

En este ejemplo en particular el objeto Select (conocido por ComboBox en otros lenguajes de programación) tiene por valores los dos géneros sexuales, y un punto. En su origen, antes de introducirle las lineas PHP (código programado entre las palabras clave y ?>), el valor que se cargaba cada vez que la página se refrescaba era el punto. Sin embargo, un cliente me pidió que realizara cambios para ahorrarle tiempo, y después de pensar y buscar en Internet llegué a esta conclusión.

Pero si en un fichero anteriormente (en nuestro caso se llama check_anonimo.php) se procesaba la variable $_SESSION["NumeroGenero"] cuando por segunda vez se llegara a la página del formulario  (ubicada en el archivo llamado anonimo.php) dibujando cada objeto (inclusive el objeto Select que tratamos), por cada uno de los valores a agregar sería necesario leer la variable $_SESSION["NumeroGenero"] para comparar. Es decir,  el código quedaría así:

<tr>
                   <td>Género:</td>
                   <td><select name="genero" class="Estilo2" id="select222">
                     <option value="." <?php if($_SESSION["NumeroGenero"] == 0) echo 'selected="selected"'; ?>>.</option>
                     <option value="Masculino" <?php if($_SESSION["NumeroGenero"] == 1) echo 'selected="selected"'; ?>>Masculino</option>
                     <option value="Femenino" <?php if($_SESSION["NumeroGenero"] == 2) echo 'selected="selected"'; ?>>Femenino</option>
                                      </select></td>
 </tr>


Mi fuente en este caso, fue https://codex.wordpress.org/Function_Reference/selected



Para finalizar les enseñaré cómo podemos seleccionar un valor concreto de un objeto Input Radio (HTML) utilizando PHP a partir del valor guardado en una variable de sesión. En el ejemplo la variable es $_SESSION["NumeroGeografico"].

En este ejemplo en particular el objeto Input Radio tiene por valores los tres valores que se corresponden con tres zonas geográficas. En su origen, antes de introducirle las lineas PHP (código programado entre las palabras clave ?>)el valor que se cargaba cada vez que la página se refrescaba era el punto. Sin embargo, con este código y con el anterior se cargará el valor que en el anterior usó se estableció. 


Porque si en un fichero anteriormente (en nuestro caso se llama check_anonimo.php) se procesaba la variable $_SESSION["NumeroGeografico"] cuando por segunda vez se llegara a la página del formulario  (ubicada en el archivo llamado anonimo.php) dibujando cada objeto (inclusive el objeto Input Radio que tratamos), por cada uno de los valores a agregar sería necesario leer la variable $_SESSION["NumeroGeografico"] para comparar. Es decir,  el código quedaría así:

<tr>
               <td height="352" valign="top">                 <div align="left">
                 <p>GEOGRÁFICO:</p>
                 <table width="670" border="0" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF">
                   <tr valign="top">
                     <td width="209" height="50"><input name="zona" type="radio" value="ZONA A" <?php if ($_SESSION["NumeroGeografico"] == 1 ) echo 'checked="checked"'; ?>>
                       <span class="Estilo6"> ZONA A</span> (La Estrella. La Milagosa, S. Antón) </td>
                     <td width="235"><input name="zona" type="radio" value="ZONA B" <?php if ($_SESSION["NumeroGeografico"] == 2 ) echo 'checked="checked"'; ?>>
                       <span class="Estilo6"> ZONA B </span> (Carretas, Hnos. Falcó;, Hospital, Universidad) </td>
                     <td width="226"><input name="zona" type="radio" value="ZONA C" <?php if ($_SESSION["NumeroGeografico"] == 3 ) echo 'checked="checked"'; ?>>
                       <span class="Estilo6"> ZONA C </span> (Fátima, Franciscanos, Parque Sur, Pedro Lamata, San Pedro Mortero, Santa Teresa, Sepulcro Bolera, Vereda) </td>

                   </tr>
                   </table>
                   </div>
                   </td>
                   </tr>

22 mayo 2015

¿Cómo solventar los problemas con los apostrofes al guardar registro en mysql con php?


Hoy, trabajando con un archivo PHP, tuve un problema al guardar una cadena que contenía varios apostrofes en una base de datos MySQL, y esta fue la solución que vi por Internet en  este foro.

Para empezar a la hora de insertar la variable que los contenga hay que hacer uso de la función addslashes. En cambio para leer ese dato,  habrá que usar stripslashes.

Un ejemplo para addslashes:  $algo = addslashes($_POST['algo']);

Un ejemplo para stripslashes:  stripslashes($theValue);

Saludos.

26 marzo 2015

Cómo solventar el problema de las tildes y las eñes pronto al programar con PHP y HTML



Qué hacer cuando trabajando con PHP / HTML tienes un texto con tildes o eñes y no quieres pasar media hora reemplazando caracteres.


Si estás en HTML, yendo a la sección META puedes indicar que el valor de la propiedad charset valga iso-8859-1, quedando así la sentencia completa: . Abajo un ejemplo:

. . .
// mostramos los resultados
echo $row["campo1"];
?>
. . .


En cambio si estas en PHP, el proceder es diferente. Aquí se utiliza una función en las primeras lineas de código PHP. El ejemplo a continuación:


header('Content-Type: text/html; charset=ISO-8859-1');
?>

Y hasta aquí es todo.

05 diciembre 2013

Instalando Ubuntu 12.10


Esta semana la empecé con el desafió de instalar Ubuntu 12.10 en mi ordenador portátil. Así que tan alegre me fui a la página oficial y descargué la versión Desktop para la arquitectura de 32 bits (que es la recomendada). Después, cuando ya la tenía en mi posesión, la grabé en un CD con un quemador de imágenes ISO y creyendo que pronto llegaría el fin metí el CD en el lector, encendí el portátil, cambié en la BIOS el orden de arranqué y cruzando los dedos para lograr mi objetivo, reinicié el ordenador. Pero, no fue tan fácil y el ordenador no era capaz de arrancar el CD. Enton
ces escuché a mi amigo Andros y seguí su consejo:

Mi amigo me dijo que buscase un programa para montar en un pen drive discos de arranque para Linux y buscando en Internet localicé LiLi USB Creator. Lo descargué, instalé y usé.

El programa me pide como primer paso insertar un pen drive formateado (su tamaño tiene que ser obligatoriamente de 4 Ggs). En segundo lugar me pide la selección de un tipo de fuente. Si ya se cuenta con la distribución de Linux requerida, directamente seleccionamos ISO o CD. Sino pues la podemos descargar de entre la gran variedad que hay. El tercer paso nos pide que demos un tamaño de persistencia, después en el cuarto paso marcamos las opciones y en el quinto pulsamos el rayo para que finalmente nos cree un pen drive booteable.

Cruzando los dedos volví a encender el portátil, cambiar la BIOS para que me dejase arrancar desde el pen drive y volví a reiniciar el ordenador. Y fue entonces cuando me aparecieron las primeras lineas de código típicas de las instalaciones de Ubuntu.

Ubuntu se instala cada vez con mayor facilidad para los usuarios que como yo sólo tenemos buenas intenciones porque carecemos de bastos conocimientos. Y desde el primer momento aparece una interfaz gráfica donde paso a paso nos solicita instrucciones para instalarsecasi sola en menos de media hora.

Luego una vez instalada solo nos queda explorarla. Mas esto se verá en el futuro.

1 abrazo.

16 diciembre 2012

Acciones básicas de Python manejando una base de datos SQLite3


Buenas tardes!

Después de día y medio programando he llegado a terminar esta muestra sencilla muestra de cómo interactuar con Python en una base de datos SQLite3

Para esto cree la clase AccionesSQL. Dentro de ella, la primera linea importa la librería que necesitaremos para funcionar : import sqlite3

El segundo trozo de código relevante está en el constructor de la clase, función __init__(self): Aquí se crea un objeto conexión que se conectara con la base de dato que queramos. Después se crea   un cursor, que es propio de la conexión creada.

La función insertarTelefonoBD es el tercer trozo importante. Aquí se hace una inserción. Para esto usamos una sentencia SQL ejecutada sobre el cursor. Y al punto se realiza un commit porque sino  la inserción no se  hace efectiva.

Poco más abajo tenemos la función  modificarTelefonoBD. Aquí, se desarrolla una actualización de un campo existente y salvo la sentencia SQL todo es igual a caso anterior. Lo mismo pasa con la función suprimirTelefonoBD. Mas esta, suprime.

La penúltima función es listarTelefonosBD y en ella se cargan y muestran todos los registros de la tabla indicada. Se puede añadir una clausula WHERE y también una ORDER BY, y así acotaríamos u ordenaríamos.

La función buscarTelefonosBDxNumero busca teléfonos dependiendo de la opción indicada. Me apeteció hacer 4 tipos de búsqueda: coincidencia total, coincidencia parcial, que empezase por un valor determinado o que acabase según un valor. Luego, para finalizar recorrí el cursor donde se guardaron los registros resultantes, y mostré los datos guardados.

A continuación, el código integro:

import sqlite3 
import sys
class AccionesSQL:
    def __init__(self): 
        self.conexion=sqlite3.connect('listinTelefonico.sqlite')
        self.cursor=self.conexion.cursor()

    def insertarTelefonoBD(self,nombre1,numero1, notas1):
        SQL='insert into Telefonos (Nombre, NumeroTelefono, Notas) values("'+nombre1+'","'+numero1+'","'+notas1+'")'
        self.cursor.execute(SQL)
        self.conexion.commit()
        print 'se ha insertado exitosamente'

    def modificarTelefonoBD(self,id1, nombre1, numero1, notas1):
        SQL='update Telefonos set Nombre="'+ nombre1 + '",NumeroTelefono="' + numero1 + '", Notas="'+notas1 +'" where id='+str(id1)
        self.cursor.execute(SQL)
        self.conexion.commit()
        print 'modificacion exitosa'

    def suprimirTelefonoBD(self, id):
        SQL='delete from Telefonos where ID='+str(id)
        self.cursor.execute(SQL)
        self.conexion.commit()

    def listarTelefonosBD (self):
        SQL = 'select * from Telefonos order by nombre '
        self.cursor.execute(SQL)
        for row in self.cursor:
            print "%s --> %s --> %s" % (row[0],row[1],row[2])

    def buscarTelefonosBDxNumero(self, numero, opcion):
        SQL='HOLA'
        if opcion==1:
            print 'Numeros que terminan por ' + numero
            SQL = 'select * from Telefonos where NumeroTelefono like "%'+numero +'"'
            self.cursor.execute(SQL)
        elif opcion==2:
              print 'Numeros que contienen el numero ' + numero
              SQL = 'select * from Telefonos where NumeroTelefono like "%'+numero +'%"'
              self.cursor.execute(SQL)
        elif opcion==3:
            print 'Numeros que empieza exactamente son el numero ' + numero
            SQL = 'select * from Telefonos where NumeroTelefono = "'+numero +'"'
            self.cursor.execute(SQL)
        elif opcion==4:
            print 'Numeros que empizan por ' + numero
            SQL = 'select * from Telefonos where NumeroTelefono like "'+numero + '%"'
            self.cursor.execute(SQL)
        for row in self.cursor:
            print "%s --> %s --> %s" % (row[0],row[1],row[2])

Esta parrafada que se gestiona en diferentes funciones la llamo desde otra clase según procede. Se llama Telefonos y su código es este:


from AccionesSQL import AccionesSQL
        
class Telefonos:

    def __init__(self,nmb1,tlf1,nts1):
        self.Nombre = nmb1
        self.NumTelefono = tlf1
        self.Notas = nts1
        self.ID=0    
        
    def imprimir(self):
        print self.Nombre + " --> " + self.NumTelefono
        
    def insertar(self):
        a1=AccionesSQL()
        a1.insertarTelefonoBD(self.Nombre,self.NumTelefono,self.Notas)
        
    def modificar(self, id1, nombre1, numeroTelefono1, notas1):
        a1=AccionesSQL()
        a1.modificarTelefono(id1, nombre1, numeroTelefono1, notas1)
        
    def suprimir (self, id1):
        a1=AccionesSQL()
        a1.suprimirTelefonoBD(id1)
    
    def listar(self):
       a1=AccionesSQL()
       a1.listarTelefonosBD()
       
    def buscarPorNumero (self, numero1, op1):
        a1=AccionesSQL()
        a1.buscarTelefonosBDxNumero(numero1,op1) 

La sentencia from AccionesSQL import AccionesSQL sirve para importar el código creado en la clase anterior. De esta manera podremos funcionar con las funciones anteriores llamándolas desde u objeto de esa clase.

Así por ejemplo en la función  insertar podremos utilizar la función insertarTelefonoBD después de haber cread un objeto. Y en las diferentes funciones, el funcionamiento es igual.

Si he creado dos clases no ha sido por ir de listo, sino porque así todo funciona mejor. Es más sencillo y eficiente.


Saludos.

El zen de Python



Estos son los principios que todo buen programador de Python debe cumplir para considerarse tal, fueron redactados por el padre del lenguaje: Tim Peters:


1. Bello es mejor que feo.
2. Explícito es mejor que implícito.
3. Simple es mejor que complejo.
4. Complejo es mejor que complicado.
5. Plano es mejor que anidado.
6. Disperso es mejor que denso.
7. La legibilidad cuenta.
8. Los casos especiales no son tan especiales como para quebrantar las reglas.
Aunque lo práctico gana a la pureza.
9. Los errores nunca deberían dejarse pasar silenciosamente.
10. A menos que hayan sido silenciados explícitamente.
11. Frente a la ambigüedad, rechaza la tentación de adivinar.
12. Debería haber una -y preferiblemente sólo una- manera obvia de hacerlo.
13. Aunque esa manera puede no ser obvia al principio a menos que usted sea holandés.
Ahora es mejor que nunca.
14. Aunque nunca es a menudo mejor que ya mismo.
15. Si la implementación es difícil de explicar, es una mala idea.
16.Si la implementación es fácil de explicar, puede que sea una buena idea.
17. Los espacios de nombres (namespaces) son una gran idea ¡Hagamos más de esas cosas!


06 noviembre 2012

Diferentes lecturas de un fichero rsx según el lenguaje de programación


En mi caso he usado este tipo de ficheros para las traducciones a diversos idiomas de un sitio web, mas tienen otros usos.En esta circunstancia el código se pone en la propiedad Text (o Caption valga la diferencia) de cada objeto a traducir.

Desde código ASP:
"<%$resources:fichero, columna%>"

Desde código Javascript:
'<%=GetGlobalResourceObject("fichero","columna")%>'

Desde el código de un archivo Sitemap:
"resources:fichero, columna"


Saludos

26 junio 2012

SQL Server: Solución para ignorar lois acentos en una búsqueda

 En este sencillo ejemplo que muestro a continuación, muestro lo fácil que resulta evitar que en una búsqueda con where no haya distinciones entre las palabras con tildes o sin ellas

Así, por ejemplo me mostrará de igual modo el registro si busco por ALCALA DE GUADAIRA' como por ALCALÁ DE GUADAIRA'.

La solución está en po ner esto COLLATE SQL_LATIN1_GENERAL_CP1_CI_AI al final de la sentencia WHERE. 
 

declare @clipo1_origen varchar(40)

set @clipo1_origen='ALCALÁ DE GUADAIRA'
 
select IntIdMunicipio, StrNombre from [bd_prueba].[dbo].[municipios] where upper(StrNombre) = upper(@clipo1_origen) COLLATE SQL_LATIN1_GENERAL_CP1_CI_AI


Sin embaargo si lo que se quiere es ignorar las acentuaciones en toda la base de  datos (de modo pernanente o hasta que usted quiera desactivarlo), haga esto:

ALTER DATABASE [nombrebasededatos] COLLATE Modern_Spanish_CI_AI

Así afectará a toda la base de datos.


Saludos


21 mayo 2012

SQL Server: Sentencia que de un dato de tipo datetime nos extrae el dia, el mes, el año, la hora, el minuto y el segundo

Aparentemente resultaba complicado, pero nada más lejos de la realidad. Con esta breve sentencia, saco en diferentes columnas el día, el mes, el año, la hora, el minuto y el segundo.

select dtpfecha, day(dtpfecha) "dia", month(dtpfecha)"mes", year(dtpfecha) "año", datepart(hour,dtpfecha)"hora", datepart(minute,dtpfecha) "minutos", datepart(second,dtpfecha) "segundos"
from [basededatos].[dbo].[tabla]

No me rompí mucho la cabeza, la solución la encontré aquí.
Aquí os dejo una foto del resultado al ejecutar la sentencia.



Saludos.

10 mayo 2012

Mejora del articulo hecho para C Sharp: Función que acorta una cifra decimal para sólo mostrar dos números. Y ahora además, pone puntos de separación

  Este código es una mejora del que escribí aquí. Pero esta vez, también puntua los miles.

   private string FormatearNumero(decimal cifra )
        {
             string strCifra = Convert.ToString(cifra);
             int dondeestalacoma = strCifra.IndexOf(',');
             string partedecimal="";
             string parteentera="";
             if (dondeestalacoma != -1)
             {
                 if (strCifra.Length > (dondeestalacoma + 2))
                 {
                     partedecimal = strCifra.Substring(dondeestalacoma + 1, 2);
                     parteentera = strCifra.Substring(0, dondeestalacoma);
                 }

             }
             else
             {
                 parteentera = Convert.ToString(cifra);
                 partedecimal = ",00";
               
             }

             /*colocación de los puntos de miles*/
            /*1º Creo un arraylist. En él se introcunen los numeros y los puntos de separación. Empiezo la extración desde el último dígito de la variable parte entera.
             2º En la var. nuevonumero voy metiendo los trozos que en el paso 1 metí en el arraylist
             3 Colocación de los primeros numeros de la cifra parteentera*/
            
             ArrayList diferentespartesnumero = new ArrayList();
             int numerodepuntos = 0;
             if (parteentera.Length > 3)
             {
                 for (int i = parteentera.Length; i > 3; i -= 3)
                 {
                     string trozo = parteentera.Substring(i - 3, 3);
                     diferentespartesnumero.Add(trozo);
                     diferentespartesnumero.Add(".");
                     numerodepuntos++;
                 }

                 string nuevonumero = "";

                 for (int j = diferentespartesnumero.Count - 1; j >= 0; j--)
                     nuevonumero += diferentespartesnumero[j].ToString();

                 int resto = (parteentera.Length + numerodepuntos) - nuevonumero.Length;
                 if (resto > 0 & resto <= 3)
                 {

                     string aux2 = parteentera.Substring(0, resto);
                     parteentera = aux2 + nuevonumero;
                 }
                 else
                     parteentera = nuevonumero.Substring(1, nuevonumero.Length - 1);

                 /**/
                 
             }
            return strCifra = parteentera + "," + partedecimal;
        }
   

04 mayo 2012

C#: Función que devuelve la primera letra de un string en mayuscula

Sencillo y eficaz código que devuelve un string con el primer caracter en mayuscula. Así por ejemplo, metiendo como parámetro el string víctor está loco, nos devolverá Víctor está loco.
 
        private string UppercaseFirst(string s)
        {
            // Check for empty string.
            if (string.IsNullOrEmpty(s))
            {
                return string.Empty;
            }
            // Return char and concat substring.
            return char.ToUpper(s[0]) + s.Substring(1);
        }
Saludos.

25 abril 2012

SQL SERVER: Cómo activar/desactivar que la clave primaria de una tabla sea autoincrementada.


Tras una breve y éxitosa búsqueda por Google, encontré que esta es la sintaxis:

SET IDENTITY_INSERT [ database. [ owner. ] ] { table } { ON | OFF }

Por ejemplo:

set identity_insert [mibasededatos].[dbo].[clientes] on
insert into clientes(IntIdCliente, strRazonSocial, intMunicipio,DtpFechaAlta) values (124,'Probando1',534, '6/10/1982 10:00:15')
set identity_insert [klevinmig].[dbo].[clientes] off

Donde la primera linea del ejemplo desactiva el incremento automatico del campo IntIdCliente, la segunda realiza la acción de inserción y la tercera vuelve a activar el autoincremento.

Adiós.

23 abril 2012

SQL Server: ejemplo con funciones de extraccion de dadtos

Sentencia SQL que a partir de clinom (campo donde se guarda el nombre de la empresa clienta y su código) nos extrae la longitud del campo clinom, la primera ocurrencia del campo separador (en este caso el parentesis de apertura), el tamaño del código, y el código.


select clinom,  len(clinom) as 'longitud', charindex('(',clinom) as 'primera ocurrencia', len(clinom)- charindex('(',clinom) -1 as 'tamaño del codigo',
substring(clinom, charindex('(',clinom)+1, len(clinom)- charindex('(',clinom) -1) as 'codigo'
from [klevinmig].[dbo].[clientesmig] where clinom like 'SUB. NEVERO -CSE BADAJOZ (%'



Este seria el resultado: 


09 abril 2012

C#: Función que acorta una cifra decimal para sólo mostrar dos números

Hola. He creado esta función (cuyo nombre es pelín desastroso, y de hecho solicito que me sugerais ideas), porque me pidieron que debia acortar el precio mostrado en el report factura para sólo imprimir dos decimales.
Habra otros modos de hacerlo, pero a mi este me resulta muy útil.


private string AcortarCifra(decimal cifra)

{


string strCifra = Convert.ToString(cifra);

int dondeestalacoma = strCifra.IndexOf(',');
string partedecimal;
string parteentera;
if (dondeestalacoma != -1)
{
if (strCifra.Length > (dondeestalacoma + 2))
{
partedecimal = strCifra.Substring(dondeestalacoma + 1, 2);
parteentera = strCifra.Substring(0, dondeestalacoma);
strCifra = parteentera + "," + partedecimal;
}

}
else
strCifra = strCifra + ",00";
return strCifra;

}

20 marzo 2012

Diferencias entre Convert.ToString(valor) y valor.ToString()

Acabo de aprender que es mejor usar Convert.ToString(valor) habitualmente en lugar de valor.ToString() porque con la primera opción si valor vale NULL lo transforá en blanco. Y en otro lugar, no. Daria error. La segunda opción es solo rentable cuando el valor nunca valga NULL.

Entonces es aconsejable olvidarnos de la segunda opción usando siempre la primera. Para prevenir.

15 marzo 2012

Cómo escribir el texto en un control verticalmente

Revisando las propiedades del control descubriremos Angle, pues ahí ponemos un 90 y listo. Ya tenemos el texto escrito verticalmente.

Saludos desde Telesoft Soluciones.

13 marzo 2012

Solución al problema: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)


Después de instalar Wampserver 2.0, al querer acceder a su base de datos MySQL, me encontré con este error: Solución al problema: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO). Entonces busqué por Internet y encontré esta solución:

1. Detenemos el servicio de MySQL.

2. Esribimos en una terminal: mysql.

3. Ya estando dentro de la base de datos usaremos la tabla mysql tras escribir: use mysql.

4. Actualizmos el campo Password del usuario root dela siguiente manera: update user set password=PASSWORD('nuestro_password') WHERE user='root';

5. Salimos: exit.

6. Iniciamos nueva sesión en la base de datos de otra terminal escribiendo: mysql -u root -p. Metemos nuestro password y listo.

Saludos.


Configurar Wanmpserver 2.0: cambiar el puerto por defecto

Hace un tiempo que vengo arrastrando un error al abrir Wampserver. Investigué y resultó ser que la solución estaba en cambiar de puerto, del 80 al 82.

1. paso: Se debe iniciar el servicio de Wampserver de manera que en la barra de tareas aparezca su icono.

2º paso: Abrimos el archivo httpd.conf (ubicado en C:\wamp\bin\apache\Apache2.2.11\conf).

3º paso: Navegamos a la linea 46 y la editamos. Cambiamos el 80 por el 82.

4º paso: Después naveganmos a la linea 171 y cambiamos el número del puerto. En lugar de 80 ahora, 82.

5º paso: Guardar los cambios efectuados en el archivo.

6º paso: Abrimos el archivo wampmanager.tpi (c:\wamp).

7º paso: Ahora modificaremos las lineas 120, 121 y 122. Los cambios consisten en agregar el puerto 82 a las rutas.

8º paso: Cerramos y guardamos los cambios,.

9º paso: Reiniciamos el servicio Wampserver y con esto podremos escribir en la brra URL de navegador http://localhost:82, que todo irá perfecto.

Más información aquí.

Saludos.

12 marzo 2012

SQL: Diferencias entre los 5 tipos de Join



Diferencias entre los 5 tipos de Join:
  • INNER JOIN: es el caso de unión interna clásico, combina dos o más tablas descartando todas las filas resultados que no se correspondan en ambas.
  • LEFT OUTER JOIN (o LEFT JOIN): combina dos tablas con la diferencia que selecciona todas las filas de la primer tabla sin importar tengan o no coincidencia en la segunda. RIGHT OUTER JOIN (o RIGHT OUTER): es la opción inversa a la anterior. En la mayoría de las bases de datos actuales se puede omitir OUTER.
  • FULL OUTER JOIN: combina los resultados de dos o más tablas, tengan o no coincidencia entre sí.
  • CROSS JOIN: retorna el producto cartesiano de dos o más tablas, es decir, combina cada fila de una tabla con cada fila de otra tabla. CROSS JOIN no debería llevar la clausula ON.
  • NATURAL JOIN: Es un caso especial de INNER JOIN que compara por cuenta propia la equivalencia de columnas con el mismo nombre y tipo de dato entre dos o más tablas para hacer la combinación de ambas. Hay que tener especial cuidado con su uso, pues puede producir resultados ambiguos o generar problemas si se añaden, quitan, o renombran las columnas.


Aquí os dejo un enlace a una página web donde aparcen ejemplos visuales: A Visual Explanation of SQL Joins


Saludos

27 febrero 2012

Once mandamientos del diseño web

1. reeune información: haz preguntas
2 conoce el objetivo del sitio: para qué será usado.
3. conoce los objetivos del cliente: el contexto.
4. conoce el público al que se destina: edad, sexo, intereses, singo del zoodiaco.
5. crea un mapa del sitio: convierte la investigación en acción.

Aprobación del cliente por escrito.


6. Crea o reúne contenido atractivo. El contenido es lo primero. Asegúrate de que está optimizado para SEO
7. Una planificación adecuada te evitará problemas. Esquema y borrador.
Aprobación del cliente por escrito.
8. Diseña. Es inevitable. Preferencias del cliente más un buen diseño igual a cojonudo.

Aprobación del cliente por escrito.

9. Crea. No hay medias tintas. Haz las cosas bien.
10. Test y entrega. Haz pruebas de todo.

Aprobación del cliente por escrito.

11. Mantén la web. Di no a 404s. Actualízala.

Para ver el articulo en formato video: pinchando aquí.

Saludos

23 febrero 2012

6 pasos para desactivar la opción Onboard Lan

1. Entré en la BIOS.
2. Navegué a la pestaña ADVANCED.
3. Fuí hasta CHIPSET CONFIGURATION.
4. Busqué y encontré ONBOARD LAN, que por defecto vale Enabled.
5. Entonces le cambié el valor a Disabled.
6. Por último salí de la BIOS guardando los cambios.

10 febrero 2012

Monodevelop y MySQL:Inserción



Utilizando Monodevelop he creado un formulario simple y con él, en una base de datos llamada probatura, hice un simple ejrcicio para insertar registros en una tabla.

string cadenaDeConexion = "Server=localhost;Database=mono_prueba;User ID=admin;Password=123;Pooling=false;";

MySql.Data.MySqlClient.MySqlConnection conexion = new MySql.Data.MySqlClient.MySqlConnection(cadenaDeConexion);

conexion.Open();

MySql.Data.MySqlClient.MySqlCommand oComando = conexion.CreateCommand();

string sql ="INSERT INTO probatura(cadena) VALUES ('"+txtCadena.Text+"')";

oComando.CommandText=sql;

oComando.ExecuteNonQuery();

conexion.Close();

Viendo este ejemploo creo que hay poco que explicar. Aún así haré un breve resumen.

Por supuesto, lo primero es descargar el conector para MySQL. Yo descargué este: mysql-connector-net-5.2.7.zip. Que está aquí
Tras instalarlo, marché a referencias y me agregué las nuevas referencias.
Luego, ya en el archivo .cs escribí:
using System.Data;
y
using System.Data.SqlClient;
para invocar a los nuevos componentes.

Volviendo al código Ya en la función insertar, lo primero que hago es inicializar una conxión, qu seguidamente abro.
Segundo paso, me creo un comano que inicializo con una función de la conexión.
Tercero, preparo la instrucción SQL para insertar en la cuarta linea.
En el cuarto paso, ejecuto el comendo.
Y para finalizar cierro la conexión.

Saludos

06 febrero 2012

Planes de futuro con Linux


Otro día sin ir a trabajar. Esta mañana, abrigado por mi edredón, pensé que será buena idea instalarme una versión de Linux para aventurarme en ese sistema operativo al tiempo que programo en Python y con MySQL. Así hago todo con Software libre algo qu siempre será una buena opción. No obstante esperaré a que me reparen mi querido ordenador "don me reinicio tantas veces me sale de los cojones". Pedazo hioputa está hecho!!

17 enero 2012

Truco para los reports hechos con DevExpress para evitar que las filas cortadas aparezcan sin linea superior

Tras este titulo tan largo se esconde una explicación breve pero muy valiosa.

Vereis, harto de que mis informes (tan bien hechos) se destrozasen por el salto inevitable de cambio de página, pensé y descubrí como arreglarlo.

Y la solución es poner una linea lo más fina posible y tan ancha como la tabla donde se cargan los datos, y colocarla en el HeaderPage del report.

Y hasta aquí todo.

Cálculo para obtener el IVA de una cantidad

Esta entrada no es muy clasificable en el ámbito que me muevo de programación, no obstante como de una vez para otra me olvido, he decidido escribirla:

cantidadIVA = ((cantidad_sin_iva * 18) / 100);

Agur.

08 enero 2012

Objetivo logrado: instalar Whatsapp en un ordenador


Fue tedioso pero yo resulté constante y al final lo logré.

Empezaré desde el principio:

1. Para utilizar whatsapp desde una computadora hay que saber una cosa: se necesita un número de teléfono nuevo. ¿Por qué? Porque no se permite usar el mismo número de teléfono para el whatsapp del ordenador y del móvil al mismo tiempo.
En mi caso para este proposito utilicé los servicios de Fonyou donde gratuitamente te creas un nuevo número.



2. Android se debe correr en una máquina virtual. Yo usé YouWave de Android. La desventaja que tiene es que es de pago y te deja un breve tiempo para su uso gratuito. Pero bueno, siempre se puede gastar uno el dinero en comprar la licencia, o hacer uso de aplicacions Open source que sirvan para lo mismo.

3. Asi que se tiene instalado Youwave, nos descargamos Whatsapp. Para esto o entramos en la páagina web utilizando el navegador de Android o lo hacemos con nuestro ordenador. El sitio oficial es http://www.whatsapp.com/
Con la aplicación descargada y dependiendo de cómo la hayamos obtenido procedemos a instalarla. Si la descargamos utilizando la segunda opción debemos guardarlo en C:\User\\youwave\android.apps.
Luego ejecuamos el instalador. De esta operación tengo que destacar que el número de teléfono a intreoducir tiene que ser el nuevo.

Después ya podremos agregar a nuestros contactos.



Para ver un manual más detallado pinchen aquí o aquí.

05 enero 2012

¿Qué es el Modelo Vista Controlador?

Según la amiga Wikipedia se definiria así:
Modelo Vista Controlador (MVC) es un patrón de arquitectura de software que separa los datos de una aplicación, la interfaz de usuario, y la lógica de negocio en tres componentes distintos. El patrón de llamada y retorno MVC (según CMU), se ve frecuentemente en aplicaciones web, donde la vista es la página HTML y el código que provee de datos dinámicos a la página. El modelo es el Sistema de Gestión de Base de Datos y la Lógica de negocio, y el controlador es el responsable de recibir los eventos de entrada desde la vista.Enlace
Luego un compañero del trabajo me pasó este enlace y me quedó más claro porque se incluye un ejemplo hecho en Java.

Ver enlace de la Wikipedia.

Saludos.

Ahora solo falta ponerlo en practica.

22 diciembre 2011

Python: Script que me abre una página web u otra según un numero al azar

Este es un programita breve y que se podría abreviar más, que elige al azar una emisora de radio para abrirla en un navegador.

En el primer import importo la función shuffle que es propia de la libreria random. En la segunda importo la libreria webbrowser.
En la tercera creo una lista con los nombres de las tres emisoras.
En la cuarta llamo a la función shuffle. Esta función reorganiza el listado al azar.
En las quinta y sexta imprimo la lista y el primer elemento de la lista respectivamente. Estas lineas de código las escribí para verificar el exito del la función shuffle. Pero bien podrian quitarse,... ¿para lo quéd hacen?
Luego, abro una ruta u otra dependiendo del nombre de emisora seleccionado utilizado la función open_new de la libreria webbrowser.

from random import shuffle
import webbrowser
listaDeEmisoras=["Kiss fm","M 80","Europa fm"]
shuffle(
listaDeEmisoras)
print
listaDeEmisoras
print
listaDeEmisoras[0]
if (listaDeEmisoras[0]=="Kiss fm"):
  webbrowser.open_new("http://www.kissfm.es/player/kissplayer/index.php") elif (listaDeEmisoras[0]=="Europa fm"):
  webbrowser.open_new("www.europafm.com/directo/")
elif (
listaDeEmisoras[0]=="M 80"):
  webbrowser.open_new("http://www.m80radio.com/multimedia/radios.html")


Y hasta aquí todo. Solo falta poner el .exe de este programa en Inicio para que al iniciarse Windows se ejecute.

Saludos.

¡Y FELIZ NAVIDAD!

19 diciembre 2011

C#: ¿Cómo se ordena una TList ?

Es muy sencillo. De tan fácil como es hasta cavilé demasiado.

Teniendo una lista:
TList listaDePersonasDeContacto = DataRepository.PersonsContacto.GetAll();
y esta se ordena así:
listaDePersonasDeContacto.Sort(PersonasContactoColumn.StrApellido1.ToString());

Por cierto, PersonasContactoColumn.StrApellido1.ToString() devuelve la columna por la que queremos ordenar. En este caso el primer apellido del contacto.

Saludos!

Gracias Edwin por explicarmelo porque yo me calenté mucho la cabeza. ¡Con lo tirao que está!

P.D.: Haciendo esto, indico que en caso de que haya coincidencia, mire el segundo apellido
listaDePersonasDeContacto.Sort(PersonasContactoColumn.StrApellido1.ToString() + ", " + PersonasContactoColumn.StrApellido2.ToString());

18 diciembre 2011

Ejemplo básico de interface gráfca de usuario con Python

Para hacer interfaces gráficas utilizando Python existen muchas librerias que se pueden descargar e instalar en el equipo. Aquí hay un listado http://wiki.python.org/moin/GuiProgramming. No obstante para este ejemplo se usa Tkinter. Siendo está ya la integrada al instalar Python.

En elejemplo de hoy vamos a utilizar Tkinter para crer un botón que al ppulsarlo nos escriba la palabra "Hola".

En primer lugar hacemos la importación de la libreria para tener todos sus componentes disponibles:
from Tkinter import *

En segundo lugar creamos la ventana principal. Para ello usamos Frame, que es uno de los componentes de la libreria Tkinter. Frame es la ventana principal.
frame=Frame()

Para visualizar el texto utilizaremos el componente Entry de Python porque este componente sirve para meter o visualizar una linea. En cambio si fuesen varias utilizariamos Text.

Para crear nuestro cmpo de texto necesitamos crear una variable del tipo StringVar. Esta variable simplemente contiene una caja de texto le diremos a nuestra caja de texto que en ella guarde el texto. La forma de hacerlo es así de sencilla:
v = StringVar() campoTexto = Entry(frame, textvariable=v )
Con esto hemos creado la variable v de tipo StringVar y luego hemos creado campoTexto de tipo Entry. Los parametros: frame indica donde queremos que vaya el campo de texto y con textvariable=v indicamos cual es la StringVar donde queremos que deje el texto escrito por el usuario o en el que queremos dejr nosotros el texto que se muestre. Los métodos v.get() y v.set() nos van a permitir obtener o fijar el texto.

Para el botón, usaremos el componente Button de Python.
boton=Button(frame, text="Saludar",command=saludando)
Aquí de nuevo, frame, indica donde queremos que aparezca el botón. Con text indicamos que la propiedad text valga "Saludar" y que la función qu se ejecute al pulsar el botón se llame Saludando. Por supuesto esta función se debe de definir antes de escribir este código:
def saludando():
  v.set("Hola")
Esta función simplemente pone Hola dentro del StringVar que asociamos previamente al campo de texto Entry. Cuando se ejecute esta función, se meterá dentro de v un texto "Hola" y este se mostrará en el campo Entry de la ventana.

El código completo es este:

from Tkinter import *

def saludando():
  v.set("Hola")

frame=Frame()
v=StringVar()
campo=Texto=Entry(frame,textvariable=v)
boton=Button(frame,text="Saludar",command=saludando)
buton.pack(side=LEFT)

v = StringVar()
text = Entry(frame, textvariable=v )
text.pack(side=LEFT)

frame.pack()
frame.mainloop()

Nos quedan por explicar algunos detalles:
Para cada widguet (button, entry, frame,...) necesitaremos llamar a su método pack() el cual se encarga de colocar cadda elemento de la ventana dándole el tamaño adecuado. Podemos dejar los parametros vacios, dejando que elija, o bien, indicar la ubicación nosotros mismos. En estas lineas lo pusimos nosotros mismos: text.pack(side=LEFT) y text.pack(side=LEFT). Asi aparecerán en horizontal.

Una vez terminado el programa, para siga activo y la ventana funcionando, debemos meternos en el bucle principal de tratamiento de eventos de frame. Es decir, hacemos la llamada a frame.mainloop(). Si no lo hacemos así, el programa termina inmediatamente y no veremos nada (salvo que escribamos línea a línea en el intérprete de python). Esta llamada lo único que tiene dentro es un bucle infinito, en el que va recogiendo los eventos de teclado o ratón para "despacharlos" a los componentes de la ventana y que estos puedan tratarlos, por ejemplo, el click sobre el botón.



Est articulo lo he sacado de http://chuwiki.chuidiang.org/index.php?title=Ejemplo_b%C3%A1sico_de_interface_gr%C3%A1fica_de_usuario_con_Python.


Saludos. Y mañana mas






12 diciembre 2011

C #; Cómo crear checkbox en tiempo de ejecución.

En este caso he subido código que crea checkbox en tiempo de ejecución. Porque el report que lo utiliza requiere que por cada archivo localizado en un directorio (incluyendo subdirectorios) se añada así al informe, en lugar de como texto normal en una label normal. Supongo que es un pijotada pero me ha servido para aprender una cosa nueva. Asique ya me podria ir a la cama sino fuese porque son las 9:20.


private void CrearCheckbox(string texto)

{



posicionY += 23; /*incremento la posicionY (esta variabled dtermina donde se va a ubicar el checkbox)*/
try
{
Detail.HeightF = posicionY; /*aumento la longitud del detalle*/
DevExpress.XtraReports.UI.XRCheckBox chkNombreFichero1 = new XRCheckBox(); /*creo el checkbox*/
chkNombreFichero1.Name = "chk" + numeroDeFicheros.ToString(); /*le doy nombre*/
chkNombreFichero1.WidthF = 615; /*le doy ancho */
chkNombreFichero1.HeightF = 23; /*le doy altura*/
chkNombreFichero1.Text = texto; /*le doy el mismo valor que el nombre del fichero*/
chkNombreFichero1.TopF = posicionY - 23; /*lo coloco en la posición*/
chkNombreFichero1.Checked = true; /*lo activo*/
chkNombreFichero1.Visible = true;
numeroDeFicheros += 1; //incremento el valor para que los nombres no se repitan
Detail.Controls.Add(chkNombreFichero1);
}
catch (Exception ex)
{
}
}

Saludos desde Albacete.

08 diciembre 2011

En C#: listado de todos los archivos encontrados en un directorio (incluyendo subdirectorios)

Para desarrollar este código utilizo un botón (llamado btnVer) y una caja de texto (llamada txtContenido).
En la caja de texto cargo los nombres de todos los ficheros contenidos en la ruta donde está el proyecto (no olvidemos que este código nació para probar un algoritmo que en el trabajo no me salia, y en casa sí). El botón hace la llamada a los procesos.

Así es el resultado del formulario al ejecutar el programa:


Código del botón:
private void btnVer_Click(object sender, EventArgs e)
{
txtContenedor.Text = "";
ExtraerFicherorDelSubDirectorio(Application.StartupPath);
}

Ahora el código de ExtraerFicherorDelSubDirectorio (string ruta) que es una función recursiva:

private void ExtraerFicherorDelSubDirectorio(string ruta)
{
DirectoryInfo oDirectorio = new DirectoryInfo(ruta);

//obtengo ls ficheros contenidos en la ruta
foreach (FileInfo file in oDirectorio.GetFiles())
{
txtContenedor.Text += file.Name+"\n";

}
//obtego los subdirectorios que cuelgan de la ruta
foreach (DirectoryInfo subdirectorios in oDirectorio.GetDirectories())
{
ExtraerFicherorDelSubDirectorio(subdirectorios.FullName);
}

}


Saludos.

26 noviembre 2011

5 habilidades que debes de desarrollar para ser mejor programador.


Para ser un buen programador lo menos importante es saber muchos lenguajes de programación. Lo esencial, y a lo que hay que aprender, es a plantear y diseñar las mejores soluciones ante un problema. Por esta razón vamos a apreder 5 habilidades con el fin de ser mejores programando:

1. CREATIVIDAD:
Esta habilidad de suma importancia consiste en tener la imaginación para ver mentalmente la solución a un problema planteándola como algoritmo.

2. ORGANIZACIÓN MENTAL:
Ser despistado y no tener bien organizadas las ideas es un gran inconveniente. Es importante tener las ideas claras porque así se sabrá qué pasos seguir sin perderse por el camino.

3. TENER MENTE ABIERTA:
No hay que tener la mente cuadrada pensando que para conseguir un objetivo sólo hay una solución. Al contrario, siempre hay varias.

4. SER AMBICIOSO:
No hay que agobiarse por obtener errores. Ni mucho menos abandonar. Al contrario hay que ser constante. En informática lo más probable es que obtengas un error así que hay que estar preparado para solventarlo.

5. SER CURIOSO:
Si te quedas con lo que ya sabes sin tener la sana curiosidad de aprensder más no serás buen programador. Aquí lo ideal es estar abierto, querer mejorar aprendiendo metodologíaas más eficientes, y escuchar siempre consejos que ayuden.

Saludos, Victor

P.D.: La idea la saque de aquí: http://www.vidamrr.com

18 noviembre 2011

Cálculo de la diferencia en horas y minutos de dos horarios




Estaba meditando como resolver un código que me calculase la diferencia entre dos horas cuando se terminó la jornada laboral. Entonces decidí que tal código lo haría en Python como práctica de un aprendizaje.

Y cómo no, tras un ratejo en el que he disfrutado con Python (ese lenguaje que no gusta a mis compañeros de trabajo al punto del que no le ven ni uso ni futuro), he resuelto el código necesario.








Perdonen por haber puesto en una imagen el códigio fuente pero lo hice por causas mayores: El operador de comparativa (>) era confundido con los delimitadores de las etiquetas de HTML.

El código podria tener más complejidad, pero por hoy esta perfecto. Mañana más.

Saludos!

08 octubre 2011

Ejercicio hecho en C # que carga en una combo subcadeenas escritas en un textbox y separadas por ;

Este ejercicio, como reza el titulo del articulo, consiste en cargar en la combo cmbDatos, las palabras delimitadas por ; que se escriben en txtString.
El uso del ArrayList lista es puramente para mi comodidad porque así, cuando probaba la aplicación iba corroborado que subcadenas se extraian.

private void btnCargar_Click(object sender, EventArgs e)
{
cmbDatos.Items.Clear();
ArrayList lista = new ArrayList();
string subcadena;
string cadena = txtString.Text;
while (cadena.Length > 0)
{
int indice = cadena.IndexOf(';');
if (indice > 0)
subcadena = cadena.Substring(0, indice);
else
{
subcadena = cadena;
cadena = "";
}
lista.Add(subcadena);
int numeroDeCararteres= (cadena.Length-1) - indice;
if (numeroDeCararteres>-1)
cadena = cadena.Substring(indice+ 1,numeroDeCararteres);


}
for (int i = 0; i < lista.Count; i++)
{
cmbDatos.Items.Add(lista[i].ToString());
}
}

Saludos.