jueves, 28 de octubre de 2010

MYSQL: Modificar el tipo de datos de un campo

ALTER TABLE tabla
CHANGE COLUMN nombre_columna nombre_nuevo_columna tipo_datos atributos;

jueves, 14 de octubre de 2010

VISUAL BASIC 6: Leer de un archivo Excel 2003

Primero añadimos la referencia al Microsoft Excel 11.0 Object Library en Proyecto -> Referencias.

A continuación con el siguiente código abrimos la ruta a un fichero excel y leemos o escribimos en él con:

'Variable de tipo Aplicación de Excel
Dim objExcel As Excel.Application

'Una variable de tipo Libro de Excel
Dim xLibro As Excel.Workbook
Dim Col As Integer, Fila As Integer

'creamos un nuevo objeto excel
Set objExcel = New Excel.Application

'Usamos el método open para abrir el archivo que está en el directorio del programa llamado archivo.xls
Set xLibro = objExcel.Workbooks.Open(Path)

'Hacemos referencia a la Hoja

Dim i As Integer

Fila = 5
Col = 3
MsgBox xLibro.Sheets("Hoja1").Cells(Fila, Col)


xLibro.Close (True)

VISUAL BASIC 6: interfaz para elegir un archivo.

En nuestro proyecto Visual Basic 6 debemos añadir en Project -> Components el Microsoft Common Dialog Control 6.0 que nos permitirá abrir diálogos para elegir archivos. Veremos que aparece un botón nuevo en nuestra barra de componentes y arrastramos uno hasta nuestro form. El nombre por defecto es CommonDialog1.

Una vez añadido, el siguiente código nos abre una ventana para seleccionar un archivo con un filtro determinado:

'Añadir un filtro al dialog de elegir archivo
Private Sub AddFilter(ByVal dlg As CommonDialog, ByVal _
filter_title As String, ByVal filter_value As String)

Dim txt As String

txt = dlg.Filter
If Len(txt) > 0 Then txt = txt & "|"
txt = txt & filter_title & " (" & filter_value & ")|" & _
filter_value
dlg.Filter = txt

End Sub

Después, asociamos a un evento el siguiente código:

AddFilter CommonDialog1, "Excel files", "*.xls"
CommonDialog1.ShowOpen
Path = CommonDialog1.FileName

En la variable path tendremos la ruta al archivo.

lunes, 27 de septiembre de 2010

MS SQL 2005: Crear un disparador (TRIGGER) sobre una vista (VIEW) que mande un e-mail al DBA

Supongamos que queremos que nuestro gestor de bases de datos nos avise cuando se modifiquen ciertos datos. En este caso concreto, quiero recibir un email a mi cuenta cuando los datos de una tabla no concuerden con los datos de otra (es decir, que la cantidad de un artículo que hay en una tabla sea diferente a la cantidad de ese mismo artículo en otra tabla). Parece lioso, pero se ve rápido con un ejemplo:

TABLA datos_almacen

Codigo_articulo varchar(16)
Cantidad decimal(12,3)

TABLA datos_almacen_2

Codigo_articulo varchar(16)
Cantidad decimal(12,3)

Entonces, si la cantidad del mismo artículo es diferente para las dos tablas, quiero que me avise. Supongamos que tengo la siguiente vista que muestra todos los artículos con diferencias:

CREATE VIEW mi_vista AS
SELECT *
FROM datos_almacen a inner join datos_almacen_2 b
on a.codigo_articulo = b.codigo_articulo
and a.cantidad <> b.cantidad

Correcto, esta vista muestra las diferencias (recuerda que estamos suponiendo que ambas tablas tienen los mismos códigos de artículo, si en uno hubiese más que en otro habría que hacer un JOIN lateral). Ahora el trigger para que salte cuando aparezca alguna diferencia:

MS SQL 2005: Crear una vista

Lo que hace una vista es devolver el resultado de una consulta de selección como si se tratase de un select, pero de forma que podemos impedir al usuario el acceso a las tablas sobre las que se ejecuta la consulta.

Un ejemplo:

CREATE VIEW mi_vista AS
select *
from mi_tabla

Ahora podemos quitarle permisos a un usuario sobre la tabla 'mi_tabla' pero darle permisos sobre la vista 'mi_vista' y el usuario podría consultar los datos de la tabla (los que nosotros, DBAs, queramos, jeje) sin tener acceso directo a la misma.

martes, 27 de julio de 2010

MYSQL: dar permisos a usuarios

GRANT [SELECT | UPDATE | etc.. ] ON [basedatos | *].[nombretabla | *] TO nombreUsuario

MYSQL: crear y borrar usuarios

Crear:

CREATE USER nombreUsuario IDENTIFIED BY 'password';

Eliminar:

DROP USER nombreUsuario;

MS SQL 2005: importar datos de una hoja excel a una bbdd

Microsoft explica en esta página varios métodos para hacerlo. El que yo he seguido y me ha funcionado a la primera ha sido el siguiente:

Utilizar un servidor vinculado

Después de haber vinculado un servidor ya podemos hacer una consulta del tipo:

SELECT * FROM nombreAsignado...[nombreHoja$]

miércoles, 21 de julio de 2010

PHP: conexión a base datos MICROSOFT SQL

Conseguir las DLLs

Lo primero que nos hace falta es conseguir las DLLs para conectarnos a un SQL Server, por defecto estas DLLs no van en el paquete de instalación automática, así que tendrás que bajar, si no lo tienes ya, el paquete con la instalación completa.

Descomprime el paquete con la distribución completa y busca el fichero "php_mssql.dll" que está dentro del directorio "extensions", copia este fichero al directorio "dlls" en donde tengas instalado el PHP.

Editar el PHP.ini

Ahora hay que decirle al PHP que tiene una librería nueva y que la debe usar. Así que editaremos el PHP.ini con el Notepad, normalmente el PHP.ini está en el directorio C:\WINNT.

Busca la línea en la que pone "extension_dir = " y modifícala para que apunte al directorio donde hemos copiado la DLL. Con esto le indicamos al PHP donde están las DLL de extensión.

Ahora busca la línea ";extension=php_mssql.dll" y modifícala quitándole el ";" del principio.

Graba el fichero PHP.ini y ya está.

Ejemplo de conexión

Solo nos queda probar que funciona la conexión con el servidor SQL Server, para ello vamos a conectarnos con la base de datos “Northwind” que viene como ejemplo en la instalación de SQL Server. Listaremos el nombre del producto y el precio de la tabla productos.

$conectID = mssql_connect("NombreServidor","SA","");
mssql_select_db("Northwind");
$result=mssql_query("select * from products",$numero );
while ($row=mssql_fetch_array($result)) {
$counter++; $c1=$row["ProductName"];
$c2=$row["UnitPrice"];
echo ("$counter c1: $c1 c2: $c2\n");
}
mssql_close($conectID);

Gracias a http://www.webestilo.com/php/articulo.phtml?art=19

martes, 6 de julio de 2010

PHP: conocer los índices y los contenidos de un array

Dada una variable cualquiera $mi_array, sabemos que es un array pero no sabemos más. Para conocer los índices y los valores almacenados en cada uno de estos índices, podemos usar el siguiente bucle que recorrerá todos los índices del array:

foreach ($mi_array as $key => $value) {

// Sentencias

}

En $key tendremos el valor del índice, mientras que en $value tendremos el valor almacenado en dicho índice.

martes, 29 de junio de 2010

UBUNTU: modem HUAWEI K3765 en Lucid Lynx (10.04)

En principio basta con instalar el paquete "usb-modeswitch" (usando Synaptic, aptitude, apt o tu método favorito) y luego irse a Sistema -> Preferencias -> Conexiones de red -> Banda ancha móvil -> Agregar y metemos los datos que obtendremos de nuestro proveedor de servicios de red.

Gracias a digital nomad y a My brain is here.

Actualización 16/07/2010: Pues no ha resultado tan fácil... A las dos semanas me ha venido el comercial para decirme que no consigue conectarse usando el módem usb y efectivamente, al pincharlo lo reconoce como dispositivo de almacenamiento pero no como módem.. :S

lunes, 21 de junio de 2010

MYSQL: importar una tabla CSV en nuestra BBDD

mysql> LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name
-> FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
-> LINES TERMINATED BY '\n';

Gracias a deadlykyo.

jueves, 17 de junio de 2010

UBUNTU: instalar adobe flash plugin para Chrome

Para la versión Ubuntu 10.04 (imagino que para anteriores y posteriores no debe ser muy difícil) lo que he hecho para instalar el plugin de Adobe Flash Player (el que usa youtube para mostrar vídeos, por ejemplo) ha sido lo siguiente:

1) Ir a la página de descargas de Adobe Flash Player PLugin

2) Descargar el plugin (el paquete para Ubuntu debería valer, pero yo no conseguí descargarlo. En vez de eso descargué el .tar.gz para linux).

3) Descomprimir el fichero libflashplayer.so en la carpeta /opt/google/chrome/plugins (si la carpeta /plugins no existe la creamos).

4) Hay que decirle a Chrome que busque plugins al iniciar. Para ello hacemos click derecho en el botón Aplicaciones, Editar los menús, Internet -> Google Chrome, Propiedades y en comando tiene que decir lo siguiente:

/opt/google/chrome/google-chrome --enable-plugins %U

Con esto debería estar instalado. Gracias a Howtoforge.com

miércoles, 16 de junio de 2010

MYSQL: nombres de campo con espacios

Podemos referenciar un nombre de campo con espacios en MySQL metiendo el nombre del campo entre acento invertido.

Ej: SELECT `nombre del campo con espacios` FROM miTabla

MYSQL: TRABAJAR CON STRINGS

Hoy vamos con dos funciones curiosas para trabajar con cadenas de texto que ofrece MySQL:

Substring(cadena, indice_Inicial, indice_Final) nos devuelve la subcadena contenida en 'cadena' entre las posiciones indice_Inicial e indice_Final.

Ej: Substring('Buenos dias',3,5) nos devuelve la cadena 'enos '.

InStr(cadena, subcadena) nos devuelve el índice en el que 'subcadena' aparece por primera vez dentro de 'cadena'.

Ej: InStr('Buenos dias','dias') nos devuelve el valor entero 8 mientras que InStr('Buenos dias','oreja') nos devuelve 0.

martes, 15 de junio de 2010

MS SQL: Tamaño ocupado por las tablas de una BBDD

Muchas gracias a http://www.textil.org/sistemas/index.php/2009/02/tamanyo-tablas-y-vistas-indexadas-en-sql-server/ por colgar en su web un script para ver el tamaño que ocupa en disco las tablas de una base de datos:

-- Cursor que contiene todos los objetos que ocupan espacio

DECLARE objects_cursor CURSOR LOCAL FAST_FORWARD READ_ONLY FOR

SELECT name

FROM sysobjects o

WHERE

o.xtype = 'U'

CREATE TABLE #results (

name SYSNAME, rows CHAR(11),

reserved VARCHAR(18), data VARCHAR(18),

index_size VARCHAR(18),Unused VARCHAR(18))

--Recorremos el cursor obteniendo la información de espacio ocupado

DECLARE @object_name AS SYSNAME

OPEN objects_cursor



FETCH NEXT FROM objects_cursor

INTO @object_name;

WHILE @@FETCH_STATUS = 0

BEGIN

INSERT INTO #results

EXEC sp_spaceused @object_name

FETCH NEXT FROM objects_cursor

INTO @object_name;

END;

CLOSE objects_cursor;

DEALLOCATE objects_cursor;

UPDATE #results
SET
reserved = LEFT(reserved,LEN(reserved)-3),
data = LEFT(data,LEN(data)-3),
index_size = LEFT(index_size,LEN(index_size)-3),
Unused = LEFT(Unused,LEN(Unused)-3)

viernes, 11 de junio de 2010

HTML: pasar variables entre formularios

Una vez que hemos declarado un formulario usando la etiqueta:


<form action="pagina.php" id="idformulario" method="get" nombre="nombreformulario">


y dentro del formulario elementos de captura de datos, como un campo de texto o un desplegable:

Nombre: <input id="nombre" name="nombre" type="text" />

Creamos un botón para enviar los datos:

<input id="enviar" name="enviar" type="submit" value="enviar" />

Al darle al botón, nos enviará a la página que hayamos determinado en el atributo action del form, y desde esta página podemos recuperar las variables con el código:

$_GET['nombre_variable']

Para nuestro ejemplo capturaríamos el valor del campo de texto usando:

$_GET['nombre']

miércoles, 9 de junio de 2010

DRUPAL: comprobar el rol de un usuario

Para saber si un usuario tiene un rol determinado, se puede usar la siguiente sentencia:


if (in_array('rol', array_values($user->roles))) {
   /*
      código
   */
}

DRUPAL: deserializar datos personalizados de usuario

Al crear un usuario en DRUPAL, tenemos la opción de guardar datos adicionales además de los estrictamente necesarios. Estos datos se guardan en el campo 'data' de la tabla 'users'. Para extraer estos datos, usaríamos:


$datos = unserialize($registro['data']);

En $registro['data'] obviamente tenemos ese campo adicional extraído de una consulta (ver http://diariosbinarios.blogspot.com/2010/06/drupal-ejecutar-una-consulta-contra-la.html).

Tendríamos un array en $datos al que accederíamos, como siempre, por sus índices. Por ejemplo:

$edad = $datos['edad'];

DRUPAL: ejecutar una consulta contra la base de datos

Un sitio Drupal forzosamente está ligado a una base de datos MySQL, que utiliza para almacenar datos de los usuarios, de las páginas, etc. Aunque se puede conectar a bases de datos externas yo voy a explicar cómo ejecutar consultas sobre la base de datos vinculada a Drupal.

Si queremos ejecutar una consulta que no devuelve datos (por ejemplo, un CREATE, INSERT, UPDATE, DELETE...) simplemente podemos ejecutar:

db_query($consulta)

donde $consulta es un string que contiene la consulta. Ej:

$consulta = "DELETE FROM paises WHERE nombre_pais = 'Pandora'";

db_query($consulta);

Ojo con las comillas, lo aconsejable es usar comillas dobles para el string que contiene la consulta y comillas simples para la propia consulta.

Si la consulta devuelve valores (típicamente un SELECT) para acceder a los valores que nos devuelve haremos lo siguiente:

$consulta = 'SELECT nombre_pais FROM paises';

$resultado = db_query($consulta);

while ($fila = db_fetch_array($resultado)) {
   /*
      Nos devuelve en $fila un array con los valores de cada fila.
      A estos valores accedemos mediante su índice.
   */
   echo $fila['nombre_pais'] . '
';
}

Nos imprimiría todos los nombres de países en líneas separadas.

DRUPAL: cómo enviar correo

La forma más sencilla (aunque no la más correcta) de enviar un correo en Drupal 6.x es utilizando la función:

drupal_mail_send($message)

La variable $message es un array con los siguientes índices:

$message = array(
'from' => 'direccion.de.correo@del.remitente',
'to' => 'direccion.de.correo@del.destinatario',
'body' => 'contenido del mail',
'subject' => 'asunto del mail'
);

Para ello debemos haber configurado antes correctamente un servidor SMTP. Yo sólo he configurado un servidor SMTP con autenticación TLS para lo cuál he instalado el módulo SMTP Authentication http://drupal.org/project/smtp

Si no fuera necesaria la autenticación, creo que sólo sería necesario configurar los parámetros en el archivo php.ini en la sección smtp.

martes, 8 de junio de 2010

PHP: Trabajar con cadenas

Digamos que tengo algo como esto:

$cadena = 'esto es una cadena de caracteres en php';

La funcion substr($cadena, 3, 7) devolvería el string 'o es un'. Es decir, la cadena que empieza en la posición 3 con longitud 7. Esto es así porque en PHP los arrays empiezan en la posición 0.

Para concatenar strings en php, usamos el operador "." (sí, el punto de final de sentencia).

Por ejemplo:

$cadena1 = 'Hola ';
$cadena2 = 'Mundo.';

El valor de $cadena1 . $cadena2 sería 'Hola Mundo.'

MYSQL: DIFERENCIA ENTRE DATETIME Y TIMESTAMP

Datetime almacena fechas en formato '1000-01-01 00:00:00' a '9999-12-31 23:59:59'.

Timestamp almacena un número enorme que es el número de segundos transcurridos desde el 1-1-1970 en el primer segundo, y sólo llega hasta el año 2038.

http://www.forosdelweb.com/f86/diferencias-entre-timestamp-datetime-590772/

MYSQL: DIFERENCIA ENTRE CHAR Y VARCHAR

A la hora de definir un tipo CHAR o VARCHAR en una columna de una tabla en MySQL tenemos que especificar la longitud máxima que tomarán los valores de esa columna (hasta 255 para CHAR, VARCHAR admite hasta 65535 en mySQL 5.0.3 y posterior).

La diferencia es que en CHAR siempre se ocuparán en memoria tantos byes como hayamos especificado, añadiendo espacios al final, mientras que VARCHAR no almacena aquellos bytes que no sean necesarios, a cambio de usar un byte adicional (dos si la longitud es mayor de 255) para definir la longitud.

Por eso para longitudes fijas será mejor usar CHAR, pero para longitudes variables es mejor VARCHAR.

Más detalle en http://dev.mysql.com/doc/refman/5.0/es/char.html

MYSQL: CREAR UNA TABLA CON INDICE AUTO INCREMENTAL

Para crear una tabla con una columna con un valor numérico que sea clave primaria y que además se vaya autoincrementando con cada inserción, usar:

CREATE TABLE ("nombre de la tabla" "tipo de la columna" AUTO_INCREMENT PRIMARY KEY);