1

PHP Patterns – VO & DAO

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: , ,

 
9

Validación de CIF, NIF y NIE

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 < 8) 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: , , ,

 
4

Windows on linux.

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

Windows on Linux

Etiquetas: , ,

 
1

TextBox autoScroll to end.

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…

 
3

Una sola Instancia de la aplicación.

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;
}
}

 
4

Duplicar tablas. SQL Server

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 

 
164

¿Cómo borrar registros duplicados en SQL?

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)  

 
1

DateTime.ToString

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’ ) :

0 MM/dd/yyyy 08/22/2006

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’ ) :

0 MMMM dd August 22

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’ ) :

0 yyyy MMMM 2006 August

fuente: http://www.geekzilla.co.uk

 
4

Frases a tener en cuenta..

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.

 
3

Código útil para condiciones

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: , ,

Copyright © 2010 Javier Lema. All Rights Reserved.
Theme by Lorelei Web Design.