Posted by touzas on sep 17, 2009 in
Programación
PHP Patterns – VO & DAO
Como encuentro poca información por internet acerca del patrón de diseño que utilizo yo, voy a relatar la forma de usarlo y por qué lo uso.
Comenzé a utilizar patrones de diseño hace ya unos añitos, cuando alguien me hablo de ellos, o leí en alguna parte que existian, me llamo la atención y quise saber más.
Encontré el patrón VO DAO.
Que significa esto:
1.- VO => Value Objects.
2.- DAO => Data Access Objects.
Creo que todo esto se verá muchísimo mejor con un ejemplo. Vamos con ello.
Imaginemos que tenemos la siguiente estructura en una tabla de nuestra base de datos:
CREATE TABLE `pruebas`.`probando` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`nombre` VARCHAR( 250 ) NOT NULL ,
`Observaciones` VARCHAR( 250 ) NOT NULL ,
`borrado` TINYINT( 1 ) NOT NULL DEFAULT ‘0'
)) ENGINE = InnoDB
Yo tengo el costumbre (no sé si bueno o malo) de tener mi propia clase para la capa de datos.
————————————— Capa de Datos —————————
class dbClass {
public $conexion;
private $server = “localhost”;
private $user = “user”;
private $password = “pass”;
private $database = “pruebas”;
public function getServer(){
return $this->server;
}
public function getUser(){
return $this->user;
}
public function getPassword(){
return $this->password;
}
public function getDB(){
return $this->database;
}
function conecta() {
$this->conexion = mysql_connect ( $this->server, $this->user, $this->password ) or die ( “No se puede establecer la conexión: ” . mysql_error () );
if ($this->conexion != null) {
mysql_select_db ( $this->database );
}
}
function desconecta() {
mysql_close ( $this->conexion );
}
function selectFromSQL($sql) {
$this->conecta ();
$resultado = mysql_query ( $sql, $this->conexion ) or die ( “Error: ” . mysql_error () . ” <br/> ” . $sql );
$this->desconecta ();
return $resultado;
}
function countReg($sql) {
$this->conecta ();
$query = mysql_query ( $sql, $this->conexion ) or die ( “Error: ” . mysql_error () . ” <br/> ” . $sql );
$data = mysql_fetch_array ( $query );
$resultado = $data [0];
$this->desconecta ();
return $resultado;
}
function setReturn($sql) {
$this->conecta ();
$result = mysql_query ( $sql, $this->conexion ) or die ( “Error: ” . mysql_error () . ” <br/> ” . $sql );
$lastId = 0;
if (! $result) {
echo mysql_error ();
die ();
}else{
$sql = “SELECT @@IDENTITY as lastId”;
$ridentity = mysql_query($sql, $this->conexion) or die(”Identity Error: “. mysql_error(). “<br/>”);
if ($ridentity){
$row = mysql_fetch_row ( $ridentity );
$lastId = $row [0];
}
}
return $lastId;
}
function set($sql) {
$this->conecta ();
$result = mysql_query ( $sql, $this->conexion ) or die ( “Error: ” . mysql_error () . ” <br/> ” . $sql );
if (! $result) {
return mysql_error ();
echo mysql_error ();
die ();
}
return true;
}
}
?>
————————-
Una vez tenemos Base de Datos y Clase para trabajar con ella vamos con lo que nos ocupa, los objetos para poder trabajar:
<?php
class probandoVO{
var $Id;
var $Nombre;
var $Observaciones;
var $Borrado;
public function probandoVO($Id = “”, $Nombre= “”, $Observaciones = “”, $Borrado = “0?) {
$this->Id = $Id;
$this->Nombre = $Nombre;
$this->Observaciones = $Observaciones;
$this->Borrado = $Borrado;</span>
<span style="font-size: 8pt; font-family: 'Verdana'; color: #0000ff;">}
}
class probandoDAO {
var $tableName = “probando”;
public function getItem($id) {
$sql = “select * from ” . $tablename . ” where id=” . $id . ” and borrado = 0?;
$data = new dbClass ( );
$result = $data->selectFromSQL ( $sql );
while ( $row = mysql_fetch_array ( $result ) ) {
$item = new probandoVO ( $row ["Id"], $row ["Nombre"], $row ["Observaciones"], $row ["Borrado"] );
return $item;
}
return null;
}
public function get() {
$sql = “select Id, Nombre, Observaciones, Borrado from ” . $tablename . ” where borrado = 0?;
$data = new dbClass ( );
$result = $data->selectFromSQL ( $sql );
$datos = array ();
while ( $row = mysql_fetch_array ( $result ) ) {
$item = new probandoVO ( $row ["Id"], $row ["Nombre"], $row ["Observaciones"], $row ["Borrado"] );
$datos [] = $item;
}
return $datos;
}
public function insert($vo) {
$sql = sprintf ( “insert into ” . $tablename . ” (Nombre, Observaciones, Borrado) values (’%s’, ‘%s’, ‘%s’, ‘%s’)”,
addslashes ( $vo->Nombre ), addslashes ( $vo->Observaciones ), addslashes ( $vo->Borrado ) );
$data = new dbClass ( );
$result = $data->setReturn($sql);
return $result;
}
public function update($vo) {
$sql = sprintf ( “update ” . $tablename . ” set Nombre=’%s’, Observaciones=’%s’, Borrado=’%s’ where id=’%s’”,
addslashes ( $vo->Nombre ), addslashes ( $vo->Observaciones ), addslashes ( $vo->Borrado ), $vo->Id );
$data = new dbClass ( );
$result = $data->set ( $sql );
return $result;
}
}
?>
————————–
Una vez tenemos nuestros objectos creados solo tenemos que trabajar con ellos.
Para pintar:
$dao = new probandoDAO();
$arr = $dato->get();
foreach($arr as $data){
echo “Id: ” . $data->Id;
echo “Nombre: ” . $data->Nombre;
echo “Observaciones: ” . $data->Observaciones;
}
Para guardar, se supone que con un formulario y tal…:
$vo = new probandoVO();
$vo->Id = $_POST["Id"];
$vo->Nombre = $_POST["Nombre"];
$vo->Observaciones = $_POST["Observaciones"];
$dao = new probandoDAO();
if ($vo->Id > 0){
$dao->insert($vo);
}else{
$dao->update($vo);
}
Espero que os sirva de ayuda. Para mí fue un mundo nuevo, sobre todo pensando que lo más dificil de una aplicación es el mantenimiento, y generando todo el código de esta forma es muy sencillo realizar cualquier cambio.
Etiquetas: Pattern, PHP, VO-DAO
Posted by touzas on abr 21, 2009 in
Programación
En un post anterior los enlaces a las descargas de las Dll no funcionan, así que aquí os posteo el código que utilizo:
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
namespace confVars {
public class validaciones {
public static Boolean validaNIFCIF(string data) {
if (data == null) return false;
if (data == String.Empty) return false;
if (Char.IsLetter(data, 0) && data.Substring(0, 1).ToUpper() == “X”)
data = data.Substring(1, data.Length – 1);
if (data.Length <
return false;
if (Char.IsLetter(data, 0)) {
if (new Regex(“[A-Za-z][0-9]{7}[A-Za-z0-9]{1}$”).Match(data).Success) {
return true;
//return validadCIF(data);
} else
return false;
} else if (Char.IsLetter(data, data.Length – 1)) {
//Valida NIF
if (new Regex(“[0-9]{8}[A-Za-z]“).Match(data).Success || new Regex(“[0-9]{7}[A-Za-z]“).Match(data).Success)
return validarNIF(data);
else
return false;
}
return true;
}
private static string getLetra(int id) {
Dictionary<int, String> letras = new Dictionary<int, string>();
letras.Add(0, “T”);
letras.Add(1, “R”);
letras.Add(2, “W”);
letras.Add(3, “A”);
letras.Add(4, “G”);
letras.Add(5, “M”);
letras.Add(6, “Y”);
letras.Add(7, “F”);
letras.Add(8, “P”);
letras.Add(9, “D”);
letras.Add(10, “X”);
letras.Add(11, “B”);
letras.Add(12, “N”);
letras.Add(13, “J”);
letras.Add(14, “Z”);
letras.Add(15, “S”);
letras.Add(16, “Q”);
letras.Add(17, “V”);
letras.Add(18, “H”);
letras.Add(19, “L”);
letras.Add(20, “C”);
letras.Add(21, “K”);
letras.Add(22, “E”);
return letras[id];
}
private static bool validarNIF(string data) {
if (data == String.Empty)
return false;
try {
String letra;
letra = data.Substring(data.Length – 1, 1);
data = data.Substring(0, data.Length – 1);
int nifNum = int.Parse(data);
int resto = nifNum % 23;
string tmp = getLetra(resto);
if (tmp.ToLower() != letra.ToLower())
return false;
} catch (Exception ex) {
Console.WriteLine(ex.Message);
return false;
}
return true;
}
private static bool validadCIF(string data) {
try {
int pares = 0;
int impares = 0;
int suma;
string ultima;
int unumero;
string[] uletra = new string[] { “A”, “B”, “C”, “D”, “E”, “F”, “G”, “H”, “I”, “J”, “K”, “L”, “M”, “N”, “0″ };
string[] fletra = new string[] { “A”, “B”, “C”, “D”, “E”, “F”, “G”, “H”, “I”, “J” };
int[] fletra1 = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
string xxx;
/*
* T P P N N N N N C
Siendo:
T: Letra de tipo de Organización, una de las siguientes: A,B,C,D,E,F,G,H,K,L,M,N,P,Q,S.
P: Código provincial.
N: Númeración secuenial dentro de la provincia.
C: Dígito de control, un número ó letra: Aó1,Bó2,Có3,Dó4,Eó5,Fó6,Gó7,Hó8,Ió9,Jó0.
*
*
A. Sociedades anónimas.
B. Sociedades de responsabilidad limitada.
C. Sociedades colectivas.
D. Sociedades comanditarias.
E. Comunidades de bienes y herencias yacentes.
F. Sociedades cooperativas.
G. Asociaciones.
H. Comunidades de propietarios en régimen de propiedad horizontal.
I. Sociedades civiles, con o sin personalidad jurídica.
J. Corporaciones Locales.
K. Organismos públicos.
L. Congregaciones e instituciones religiosas.
M. Órganos de la Administración del Estado y de las Comunidades Autónomas.
N. Uniones Temporales de Empresas.
O. Otros tipos no definidos en el resto de claves.
*/
data = data.ToUpper();
ultima = data.Substring(8, 1);
int cont = 1;
for (cont = 1; cont < 7; cont++) {
xxx = (2 * int.Parse(data.Substring(cont++, 1))) + “0″;
impares += int.Parse(xxx.ToString().Substring(0, 1)) + int.Parse(xxx.ToString().Substring(1, 1));
pares += int.Parse(data.Substring(cont, 1));
}
xxx = (2 * int.Parse(data.Substring(cont, 1))) + “0″;
impares += int.Parse(xxx.Substring(0, 1)) + int.Parse(xxx.Substring(1, 1));
suma = pares + impares;
unumero = int.Parse(suma.ToString().Substring(suma.ToString().Length – 1, 1));
unumero = 10 – unumero;
if (unumero == 10) unumero = 0;
if ((ultima == unumero.ToString()) || (ultima == uletra[unumero - 1]))
return true;
else
return false;
} catch (Exception ex) {
Console.WriteLine(ex.Message);
return false;
}
}
}
}
Espero que os sirva,
Etiquetas: cif, nie, nif, validar
Posted by touzas on ene 13, 2009 in
Linux,
Programación
Yo trabajo con .NET y con Visual Studio 2005 y 2008 en cuanto a WinForms se refiere, y tenía siempre el problema de librerias que ahora tengo, y que ahora ya no. Problemas que cuando guardabas una copia de seguridad se te había olvidado una dll del Office que tenías,… todos estos problemas han quedado resueltos gracias a Linux y a VirtualBox.
Que maravilla. Ahora simplemente se hace una copia de seguridad del disco de VirtualBox y listo.
Aquí os dejo una captura

Etiquetas: Linux, virttualbox, windows
Posted by touzas on nov 11, 2008 in
Programación
Este código lo utilizo para que cuando tengo un textbox el cual quiero que tenga scroll automático hacia el final del contenido del mismo.
using System.Runtime.InteropServices;
private void setStatus(string data){
this.tbLog.Text += data + Environment.NewLine;
ScrollTextBoxEnd(this.tbLog);
}
private void ScrollTextBoxEnd(TextBox tb) {
const int WM_VSCROLL = 277;
const int SB_BOTTOM = 7;
IntPtr ptrWparam = new IntPtr(SB_BOTTOM);
IntPtr ptrLparam = new IntPtr(0);
SendMessage(tb.Handle, WM_VSCROLL, ptrWparam, ptrLparam);
}
[DllImport("User32.dll", CharSet = CharSet.Auto, EntryPoint = "SendMessage")]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
Espero que os sirva…
Posted by touzas on nov 3, 2008 in
Programación
Este código se utiliza para comprobar que hay una sóla instancia de la aplicación arrancada en el sistema
—————————————————————————-
public class instance {
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static bool estaArrancado() {
Process currentProcess = Process.GetCurrentProcess();
string fileName = currentProcess.ProcessName
Process[] procesos = Process.GetProcesses();
foreach (Process process in procesos) {
if (process.ProcessName != fileName) { return true; }
}
return false;
}
}
Posted by admin on sep 23, 2008 in
Programación
Antes de hacer pruebas con los datos existentes en una tabla es recomendado hacer una copia de seguridad, otra forma muy útil que es crear un duplicado de la tabla con la que vayamos a trabajar:
SELECT * INTO newTable FROM oldTable WHERE 1=1
Posted by admin on sep 23, 2008 in
Programación
Esto me ha pasado trabajando con SQL Server.He importado las numerosas y bases de datos de las que disponemos en mi trabajo de clientes, y claro cada una es de su madre y de su padre, con lo que me encuentro que tengo miles de registros duplicados. En mi caso me interesa eliminar los registros duplicados, donde el nombre y el teléfono sean iguales para lo cual utilizo:
delete from clientes where Id > (
Select min(Id) from clientes Tbl1 where
clientes.nombre = Tbl1.nombre and
clientes.telefono = Tbl1.telefono)
Posted by admin on jul 4, 2008 in
Programación
Estos son algunos de los patrones para pintar la fecha con un formato concreto:
Los nombres de los días y meses aparecerán en el idioma en que este el ordenador donde se esté ejecutando el programa.
All the patterns:
| 0 |
MM/dd/yyyy |
08/22/2006 |
| 1 |
dddd, dd MMMM yyyy |
Tuesday, 22 August 2006 |
| 2 |
dddd, dd MMMM yyyy |
HH:mm Tuesday, 22 August 2006 06:30 |
| 3 |
dddd, dd MMMM yyyy |
hh:mm tt Tuesday, 22 August 2006 06:30 AM |
| 4 |
dddd, dd MMMM yyyy |
H:mm Tuesday, 22 August 2006 6:30 |
| 5 |
dddd, dd MMMM yyyy |
h:mm tt Tuesday, 22 August 2006 6:30 AM |
| 6 |
dddd, dd MMMM yyyy HH:mm:ss |
Tuesday, 22 August 2006 06:30:07 |
| 7 |
MM/dd/yyyy HH:mm |
08/22/2006 06:30 |
| 8 |
MM/dd/yyyy hh:mm tt |
08/22/2006 06:30 AM |
| 9 |
MM/dd/yyyy H:mm |
08/22/2006 6:30 |
| 10 |
MM/dd/yyyy h:mm tt |
08/22/2006 6:30 AM |
| 10 |
MM/dd/yyyy h:mm tt |
08/22/2006 6:30 AM |
| 10 |
MM/dd/yyyy h:mm tt |
08/22/2006 6:30 AM |
| 11 |
MM/dd/yyyy HH:mm:ss |
08/22/2006 06:30:07 |
| 12 |
MMMM dd |
August 22 |
| 13 |
MMMM dd |
August 22 |
| 14 |
yyyy’-'MM’-'dd’T'HH’:'mm’:'ss.fffffffK |
2006-08-22T06:30:07.7199222-04:00 |
| 15 |
yyyy’-'MM’-'dd’T'HH’:'mm’:'ss.fffffffK |
2006-08-22T06:30:07.7199222-04:00 |
| 16 |
ddd, dd MMM yyyy HH’:'mm’:'ss ‘GMT’ |
Tue, 22 Aug 2006 06:30:07 GMT |
| 17 |
ddd, dd MMM yyyy HH’:'mm’:'ss ‘GMT’ |
Tue, 22 Aug 2006 06:30:07 GMT |
| 18 |
yyyy’-'MM’-'dd’T'HH’:'mm’:'ss |
2006-08-22T06:30:07 |
| 19 |
HH:mm |
06:30 |
| 20 |
hh:mm tt |
06:30 AM |
| 21 |
H:mm |
6:30 |
| 22 |
h:mm tt |
6:30 AM |
| 23 |
HH:mm:ss |
06:30:07 |
| 24 |
yyyy’-'MM’-'dd HH’:'mm’:'ss’Z’ |
2006-08-22 06:30:07Z |
| 25 |
dddd, dd MMMM yyyy HH:mm:ss |
Tuesday, 22 August 2006 06:30:07 |
| 26 |
yyyy MMMM |
2006 August |
| 27 |
yyyy MMMM |
2006 August |
The patterns for DateTime.ToString ( ‘d’ ) :
The patterns for DateTime.ToString ( ‘D’ ) :
| 0 |
dddd, dd MMMM yyyy |
Tuesday, 22 August 2006 |
The patterns for DateTime.ToString ( ‘f’ ) :
| 0 |
dddd, dd MMMM yyyy HH:mm |
Tuesday, 22 August 2006 06:30 |
| 1 |
dddd, dd MMMM yyyy hh:mm |
tt Tuesday, 22 August 2006 06:30 AM |
| 2 |
dddd, dd MMMM yyyy H:mm |
Tuesday, 22 August 2006 6:30 |
| 3 |
dddd, dd MMMM yyyy h:mm |
tt Tuesday, 22 August 2006 6:30 AM |
The patterns for DateTime.ToString ( ‘F’ ) :
| 0 |
dddd, dd MMMM yyyy HH:mm:ss |
Tuesday, 22 August 2006 06:30:07 |
The patterns for DateTime.ToString ( ‘g’ ) :
| 0 |
MM/dd/yyyy HH:mm |
08/22/2006 06:30 |
| 1 |
MM/dd/yyyy hh:mm |
tt 08/22/2006 06:30 AM |
| 2 |
MM/dd/yyyy H:mm |
08/22/2006 6:30 |
| 3 |
MM/dd/yyyy h:mm tt |
08/22/2006 6:30 AM |
The patterns for DateTime.ToString ( ‘G’ ) :
| 0 |
MM/dd/yyyy HH:mm:ss |
08/22/2006 06:30:07 |
The patterns for DateTime.ToString ( ‘m’ ) :
The patterns for DateTime.ToString ( ‘r’ ) :
| 0 |
ddd, dd MMM yyyy HH’:'mm’:'ss ‘GMT’ |
Tue, 22 Aug 2006 06:30:07 GMT |
The patterns for DateTime.ToString ( ‘s’ ) :
| 0 |
yyyy’-'MM’-'dd’T'HH’:'mm’:'ss |
2006-08-22T06:30:07 |
The patterns for DateTime.ToString ( ‘u’ ) :
| 0 |
yyyy’-'MM’-'dd HH’:'mm’:'ss’Z’ |
2006-08-22 06:30:07Z |
The patterns for DateTime.ToString ( ‘U’ ) :
| 0 |
dddd, dd MMMM yyyy HH:mm:ss |
Tuesday, 22 August 2006 06:30:07 |
The patterns for DateTime.ToString ( ‘y’ ) :
fuente: http://www.geekzilla.co.uk
Posted by admin on mar 25, 2008 in
General,
Programación
La mayor parte del software actual es muy parecido a una pirámide egipcia: millones de ladrillos puestos unos encima de otros, sin una estructura integral, simplemente realizada a base de fuerza bruta y miles de esclavos.
– Alan Kay, pionero de la informática
Los ordenadores tienen un problema: Siempre hacen lo que les mandas, pero… a veces lo que les mandas no es lo que quieres hacer.
– Miguel. Antiguo profesor.
El diseño UML es una pérdida de tiempo y recursos de la empresa. Si eres programador te pones a programar.
– “analista”, Antiguo jefecillo mío.
…
Posted by admin on feb 21, 2008 in
Programación
<condición> ? <trueValue> : <falseValue>
Por ejemplo:
string msg = (str.Trim() = String.Empty ? “Hola” : “Adios”);
Etiquetas: c#, csharp, Programación