domingo, septiembre 30, 2012

Más sobre la corrupción política...


Artículo de Stefanie Claudia Müller, corresponsal alemana en Madrid y economista, publicado el jueves en Alemanía                             
                                                                                                                                   
    Traducción de un artículo publicado el jueves en varios periódicos     
    económicos alemanes, por su corresponsal en España       
               
                                                                            
    Hoy, 6 de septiembre, se encuentran en Madrid los gobiernos de Alemania 
    y España, acompañados de un nutrido grupo de empresarios, y donde       
    seguro hablarán sobre las condiciones para poder otorgar más ayudas     
    financieras a España o a su sistema bancario. En los dos lados se ha    
    elevado el tono en los últimos meses y es con gran expectación que      
    España espera ahora la decisión que va a tomar el Tribunal              
    Constitucional alemán, que esa sí es crucial, el día 12, sobre la       
    conformidad o no del rescate europeo y las obligaciones derivadas para  
    los alemanes.                                                           
                                                                            
    En Alemania crece la critica contra la supuesta "mentalidad de fiesta"  
    de los españoles; en España los medios cada vez son más negativos con   
    la supuesta dureza de la canciller Merkel. Pensamos que la situación es 
    mucho más compleja de lo que presentan ambos gobiernos y la mayoría de  
    los medios. España no es Grecia, pero España puede ser un paciente      
    crónico si Alemania, junto con Europa, no contribuye a solucionar sus   
    verdaderos problemas.                                                   
                                                                            
    España no debería recibir más dinero sin que se cambie a fondo el       
    sistema político y económico, hoy en manos de una oligarquía política   
    aliada con la oligarquía económica y financiera, y sin que se aumente   
    la participación ciudadana real en las decisiones políticas. Para no    
    perpetuar la crisis y endeudar a los españoles durante generaciones, el 
    Gobierno español debe reformar a fondo la administración de las         
    comunidades autónomas y los ayuntamientos, en su mayoría en bancarrota  
    y completamente fuera de control, sometiendo a referéndum el modelo de  
    Estado.                                                                 
                                                                            
    Este tema es la clave del futuro de España, porque las regiones,        
    ayuntamientos y diputaciones son los responsables de los dos tercios    
    del gasto público -234.000 millones frente a 118.000 el Estado en       
    2011-, excluyendo la Seguridad Social -23.000 millones-, y este gasto   
    se realiza en condiciones de descontrol, despilfarro y corrupción       
    totalmente inaceptables. Las razones verdaderas de la crisis del país,  
    en consonancia con lo dicho, nada tienen que ver con salarios demasiado 
    altos -un 60 % de la población ocupada gana menos de 1.000 euros/mes-,  
    pensiones demasiado altas -la pensión media es de 785 euros, el 63% de  
    la media de la UE-15- o pocas horas de trabajo, como se ha trasmitido a 
    veces desde Alemania. A España tampoco le falta talento, ni capacidad   
    empresarial ni creatividad. Tiene grandes pensadores, creativos,        
    ingenieros, médicos excelentes y gestores de primer nivel.              
    La razón de la enfermedad de España es un modelo de Estado inviable,    
    fuente de todo nepotismo y de toda corrupción, impuesto por una         
    oligarquía de partidos en connivencia con las oligarquías financiera y  
    económica, y con el poder judicial y los organismos de control a su     
    servicio. En España no existe separación de poderes, ni independencia   
    del poder judicial, ni los diputados representan a los ciudadanos, solo 
    a los partidos que los ponen en una lista. Todo esto lleva también a    
    una economía sumergida que llega al 20% del PIB y que frena la          
    competencia, la eficacia y el desarrollo del país. Además, detrae       
    recursos con los que podrían financiarse educación y sanidad.           
                                                                            
    Las ayudas para España, igual que para otros posible candidatos de      
    rescates, no deben ir a bancos ya casi en bancarrota y fuertemente      
    politizados. En la CAM, el Gobierno ha comprometido 16.000 millones de  
    dinero público en lugar de cerrarla; en Bankia, 23.000, y el Ejecutivo  
    acaba de darle 5.000 millones urgentemente para cubrir pérdidas en vez  
    de cerrarla, y además de forma tan extraña que despierta todo tipo de   
    recelos. ¿Por qué se ha utilizado el dinero de los españoles (FROB) en  
    vez de esperar los fondos de la UE? Es lícito suponer que la razón es   
    la siguiente: los bancos no quieren que la UE investigue sus cuentas.   
                                                                            
    Control estricto y duras condiciones. Ya el caso de Grecia ha           
    demostrado que las ayudas europeas tienen que estar vinculadas a un     
    control estricto y condiciones duras. Esas condiciones no pueden        
    solamente representar recortes sociales o subidas brutales de           
    impuestos, como hace ahora el Gobierno de Mariano Rajoy con la excusa   
    de Europa . Se tiene que cambiar más en España que cortar gasto social, 
    que de todos modos es mucho más bajo que en Alemania, y hay otros       
    gastos infinitamente más relevantes que se pueden eliminar. Además, los 
    casos de corrupción resultan tan escandalosos, incluso en el propio     
    Gobierno, que uno solo puede llegar a una conclusión: el dinero de      
    Europa no puede ser manejado por personas tan increíblemente venales.   
                                                                            
    La pasada semana el ministro de Industria Soria -imputado también por   
    corrupción urbanística en Canarias- acusó al ministro de Hacienda en el 
    Consejo de Ministros de favorecer descaradamente a la empresa líder de  
    renovables, Abengoa, de la que había sido asesor, en la nueva           
    regulación de estas energías, que reciben más de 7.000 millones de      
    euros de subvenciones anualmente. Y Rajoy, al que entregó una carta     
    probatoria, ni dijo ni hizo absolutamente nada.                         
                                                                            
    No puede permitirse por más tiempo este nivel de corrupción, y menos    
    aún a 17 regiones funcionando como estados independientes, con todos    
    los organismos multiplicados por 17, desde 17 servicios meteorológicos  
    a 17 defensores del pueblo, con 200 embajadas, 50 canales de TV         
    regionales en pérdida, 30.000 coches oficiales o 4.000 empresas         
    públicas que emplean a 520.000 personas, creadas específicamente para   
    ocultar deuda y colocar a familiares y amigos sin control ni            
    fiscalización alguna. En conjunto, unos 120.000 millones, equivalentes  
    al 11,4% del PIB, se despilfarran anualmente en un sistema de           
    nepotismo, corrupción y falta de transparencia.                         
                                                                            
    Y con esto se tiene que acabar, entre otras cosas, porque ya no hay     
    dinero. Los últimos datos de las cuentas públicas conocidos la pasada   
    semana son escalofriantes. El déficit del Estado a julio ascendió al    
    4,62% del PIB, frente a un déficit del 3,5% comprometido con la UE para 
    todo el año (del 6,3% incluyendo regiones y ayuntamientos). Pero lo     
    realmente inaudito es que España está gastando el doble de lo que       
    ingresa. 101.000 millones de gasto a julio frente a 52.000 millones de  
    ingresos, y precisamente para poder financiar el despilfarro de         
    regiones y ayuntamientos, que no están en absoluto comprometidos con la 
    consolidación fiscal.                                                   
                                                                            
    El tema del déficit público es algo que roza la ciencia ficción, y que  
    ilustra perfectamente la credibilidad de los dos últimos gobiernos de   
    España. En noviembre de 2011, el Gobierno dijo que el déficit público   
    era del 6% del PIB; a finales de diciembre, el nuevo Gobierno dijo que  
    le habían engañado y que el déficit era superior al 8%, y que se tomaba 
    tres meses para calcularlo con toda precisión. A finales de marzo, se   
    dijo que definitivamente era del 8,5%, y ésta fue la cifra que se envió 
    a Bruselas. Dos semanas después, la Comunidad de Madrid dijo que sus    
    cifras eran erróneas y el Ayuntamiento de la capital igual… el déficit  
    era ya del 8,7%.                                                        
                                                                            
    Sin embargo, la semana pasada el INE dijo que el PIB de 2011 estaba     
    sobrevalorado y, con la nueva cifra, el déficit era del 9,1%; dos días  
    después, Valencia dijo que su déficit era de 3.000 millones más; o sea, 
    que estamos en el 9,4% y las otras 15 CCAA y 8.120 ayuntamientos aún no 
    han corregido sus cifras de 2011. Lo único que sabemos es que están     
    todas infravaloradas. El déficit real de 2011 puede estar por encima    
    del 11%, y en 2012 se esta gastando el doble de lo que se ingresa. Como 
    dice el Gobierno de Rajoy, “estamos en la senda de convergencia”. Y es  
    verdad… de convergencia hacia Grecia.                                   
                                                                            
    Claramente, la joven democracia española tiene todavía muchos déficits  
    de representatividad y de democracia que deberían interesar a la        
    canciller Merkel y también a Europa, si queremos evitar una Grecia      
    multiplicada por cinco y salvar el euro. Esto es lo que ha hecho        
    posible el despilfarro masivo de las ayudas europeas, con una           
    asignación disparatada de las mismas, a pesar de que estas ayudas han   
    supuesto una cifra mayor que la del Plan Marshall para toda Europa.     
                                                                            
    Es frustrante que a causa de este sistema oligárquico nepotista y       
    corrupto se destroce talento y creatividad y que ahora muchos jóvenes   
    se vean forzados a trabajar fuera, muchos en Alemania. Esa situación    
    nos ha llevado a una distribución de riqueza que es de las más injustas 
    de la OECD. La antaño fuerte clase media española está siendo           
    literalmente aniquilada.                                                
                                                                            
    Resumiendo: no es una falta de voluntad de trabajo, como se piensa tal  
    vez en algunos países del norte de Europa, lo que hace que España sufra 
    la peor crisis económica de su Historia. Es un sistema corrupto e       
    ineficiente. La crítica del Gobierno alemán y sus condiciones para un   
    rescate de España se deberían concentrar en la solución de esos         
    problemas. En caso contrario, solo conseguirán que una casta política   
    incompetente y corrupta arruine a la nación para varias generaciones.   
                                                                            
    *Stefanie Claudia Müller es corresponsal alemana en Madrid y            
    economista;

viernes, septiembre 28, 2012

Oracle, lista de accesos a objetos


¿Cómo obtener una lista de usuarios ORACLE que acceden a tablas de otro usuario ORACLE?

SELECT a.object, a.type, a.sid, b.username, b.osuser, b.program
FROM   v$access a
JOIN   v$session b ON (a.sid = b.sid)
AND    a.owner = UPPER('USUARIO-ACCEDIDO')
ORDER BY a.object;

Fuente aquí.

Saludos,

jueves, septiembre 27, 2012

Oracle, calcular el espacio ocupado

Podemos ordenar los tablespaces por tamaño ocupado:

select tablespace_name, Sum(bytes)/1024/1024 from dba_segments group by tablespace_name order by sum(bytes) desc;

Y luego por ejemplo ver lo que ocupa cada tabla del tablespace:

select table_name, blocks from dba_tables where tablespace_name ='zzzzzz' order by blocks desc;

Saludos,

lunes, septiembre 24, 2012

Más privilegios medievales...



Cómo son estos políticos. Hay que ver lo que se sacrifican por el pueblo.

A veces tienen que ir a toda velocidad o aparcar donde no se debe. Por eso necesitan el dinerito extra para las multas. ¡¡¡Claro que sí!!! Si te ponen una multa que la pague el Congreso.

Si tienen que aparcar en el aeropuerto, aunque sea por un viaje particular, pues nada, se paga y a vivir que son dos días. Que ustedes lo disfruten.

Fuentes aquí y aquí.


viernes, septiembre 21, 2012

Oracle: modo archivelog

Nuestras base de datos de producción deberían estar en modo archivelog. Voy a enumerar los pasos a seguir para ponerlo en este modo:

1.-Comprobar los parámetros actuales:

Importante: El directorio donde se van a generar los ficheros de archivado debe existir antes de cambiar al modo archivelog.


SQL> archive log list;
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     233
Current log sequence           235

En "Archive destination" puede venir el directorio destino de los archives, o puede venir el parámetro "use_db_recovery_file_dest" como en mi caso.

SQL> show parameter recovery

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest                string      /oracle10g/flash_recovery_area
db_recovery_file_dest_size           big integer 2G
recovery_parallelism                 integer     0
SQL>

En db_recovery_file_dest_size indicamos el límite máximo de espacio para los archives. Podemos aumentarlo:

SQL> alter system set db_recovery_file_dest_size = 20G scope=both;

Ahora vamos a ver el formato de los ficheros que se van a generar. Eso viene definido por el parámetro log_archive_format.


SQL> show parameter archive

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
archive_lag_target                   integer     0
log_archive_config                   string
log_archive_dest                     string
log_archive_dest_state_1             string      enable
log_archive_dest_state_10            string      enable
log_archive_dest_state_2             string      enable
log_archive_dest_state_3             string      enable
log_archive_dest_state_4             string      enable
log_archive_dest_state_5             string      enable
log_archive_dest_state_6             string      enable
log_archive_dest_state_7             string      enable

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_state_8             string      enable
log_archive_dest_state_9             string      enable
log_archive_dest_1                   string
log_archive_dest_10                  string
log_archive_dest_2                   string
log_archive_dest_3                   string
log_archive_dest_4                   string
log_archive_dest_5                   string
log_archive_dest_6                   string
log_archive_dest_7                   string
log_archive_dest_8                   string

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_9                   string
log_archive_duplex_dest              string
log_archive_format                   string      %t_%s_%r.dbf
log_archive_local_first              boolean     TRUE
log_archive_max_processes            integer     2
log_archive_min_succeed_dest         integer     1
log_archive_start                    boolean     FALSE
log_archive_trace                    integer     0
remote_archive_enable                string      true
standby_archive_dest                 string      ?/dbs/arch


2.-Activar la generación del archivado:

Paramos la base de datos:


SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

Montar la base de datos:


SQL> startup mount;
ORACLE instance started.

Total System Global Area 1610612736 bytes
Fixed Size                  2096632 bytes
Variable Size             503317000 bytes
Database Buffers         1090519040 bytes
Redo Buffers               14680064 bytes
Database mounted.

Poner la base de datos en modo archivelog:

SQL> alter database archivelog;

Abrir la base de datos:

SQL> alter database open;

3.-Revisar el ALERT.LOG para ver se ha generado algún error durante el cambio.

4.-Forzar la generación de un fichero de archivado para ver que funciona OK:

SQL> alter system archive log current;

SQL> alter system switch logfile;

5.-Implementar la liberación de ficheros de archivado (archives):

Si en algún momento se llega al 100% del límite que hemos especificado, o se llena el filesystem donde se dejan los archivados, la base de datos no permitirá hacer nuevas actualizaciones. Se parará y los usuarios llamarán porque Oracle no funciona.

Tenemos que ir liberando espacio periódicamente. Lo más normal es que un script de RMAN se dedique a salvar los archivados a cinta, y vaya borrándolos del directorio a medida que lo hace.

6.-Comprobar que todas las tablas de usuarios, índices, objetos LOB y tablespaces estén en modo logging.

Para que los cambios en los objetos vayan a los redolog, es necesario que estén en estado LOGGING y no en estado NOLOGGING. Es normal que haya objetos del sistema (SYS, SYSTEM, SYSAUX,...) en estado NOLOGGING. Los tablespaces temporales también suelen ser NOLOGGING.

TABLAS:


select owner, table_name
from dba_tables
where LOGGING = 'NO'
order by owner, table_name;

TABLAS PARTICIONADAS:


select table_owner, table_name, partition_name
from dba_tab_partitions
where LOGGING = 'NO'
order by table_owner, table_name, partition_name;


ÍNDICES:


select owner, index_name
from dba_indexes
where LOGGING = 'NO'
order by owner, index_name;


ÍNDICES PARTICIONADOS:


select index_owner, index_name, partition_name
from dba_ind_partitions
where LOGGING = 'NO'
order by index_owner, index_name, partition_name;


OBJETOS LOB:


select owner, table_name, index_name
from dba_lobs
where LOGGING = 'NO'
order by owner, table_name;


TABLESPACES:


select tablespace_name
from dba_tablespaces
where LOGGING = 'NOLOGGING'
order by tablespace_name;


7.-Cambiar estado de objetos de NOLOGGING A LOGGING:

TABLAS:

ALTER TABLE owner.tabla LOGGING;

TABLAS PARTICIONADAS:

ALTER TABLE owner.tabla MODIFY PARTITION particion LOGGING;

ÍNDICES:

ALTER INDEX owner.indice LOGGING;

ÍNDICES PARTICIONADOS:

ALTER INDEX owner.indice MODIFY PARTITION particion LOGGING;

OBJETOS LOB:

ALTER TABLE owner.tabla_con_campo_lob LOGGING;

TABLESPACES:


ALTER TABLESPACE tablespace LOGGING;





jueves, septiembre 20, 2012

más de lo mismo...


La noticia aquí.

domingo, septiembre 16, 2012

¡Corrupción en forma de privilegios!

Si en Agosto las Cortes decidían por el sueldo "por la jeta" a 55 exparlamentarios (privilegio medieval en el siglo XXI), ahora les toca a los exdiputados y exsenadores.


Aquí la noticia completa 

En mi entorno más cercano, para no quedarse atrás, también se han querido dar un homenaje en forma de nuevas tecnologías que ahora está de moda. Se ve que el ordenador y móvil que reciben gratis no es suficiente.


La noticia aquí.

¡¡¡Pedazo Jetas!!! ya se ve que la crisis no va con vosotros.


martes, septiembre 11, 2012

Freepascal y Lazarus: existe el fichero?


Función FileExists

FileExists nos indicar si un fichero existe o no. Pero OJO, busca en el mismo directorio que el ejecutable del programa.

He creado un formulario en Lazarus. Le he agregado un botón, y este es el código que se ejecuta cuando hacemos clic en él:


procedure TfrmPrincipal.btnIniciarClick(Sender: TObject);
type Tprogramas = Array[0..2] of string;
var
   prog : Tprogramas;
   s : string;
   fichero : Text;
begin
    prog[0]:='toad.exe';
    prog[1]:='gpg.exe';
    prog[2]:='r.exe';
    system.Assign(fichero,'programas.txt');
    Rewrite(fichero);
    for s in prog do begin
        if FileExists(s) then begin
           Writeln(fichero, s);
        end
    end;
    system.Close(fichero);
end;

¿Por qué he puesto system.Assign en lugar de invocar Assign a secas?

Assign asigna un nombre a un fichero.

Si ponemos Assign(fichero,'programa.txt') nos saldrá el siguiente error de compilación:
ERROR: Wrong number of parameters specified for call to "Assign".

El problema es que el compilador interpreta que queremos utilizar el método Assign de la clase del formulario (TfrmPrincipal en mi caso). Se soluciona indicando que llamamos al método Assign de la clase System: System.Assign.

Lo mismo ocurre con System.Close.

Saludos.

Cambio de hora en Linux

Como cambiar la fecha/hora en Linux:

Iniciar sesión como root


# date MMDDhhmmAAAA

Por ejemplo, el 8 de noviembre de 2011 a las 10:15:

# date 110810152011



sábado, septiembre 08, 2012

Guerra Oracle-HP-Intel resolución del caso


Bueno, parece que por fin se acaba el culebrón este, y que los clientes de Oracle con un servidor Itanium vamos a poder respirar.
Recordemos que el asunto empieza el 22 de Marzo de este año, con el anuncio de ORACLE de que paraliza los desarrollos para Itanium. Eso suponía que no iba a haber Oracle12 para servidores con procesador INTEL Itanium, cuyo principal fabricante en el mundo es HP.

En Agosto los tribunales daban la razón al fabricante HP, y ahora por fin, ORACLE anuncia que reanuda el desarrollo para dicha plataforma, y su lanzamiento coincidirá con el de la plataforma de IBM.


Oracle Issues Statement
REDWOOD SHORES, Calif., September 4, 2012
Oracle issued the following statement today:
Previously, Oracle announced that it would stop developing new versions of its software on Itanium microprocessors. For example, that meant version 12c of the Oracle database due out in early 2013 would not be available on Itanium. However, a judge recently ruled that Oracle has a contract to continue porting its software to Itanium computers for as long as HP sells Itanium computers. Therefore, Oracle will continue building the latest versions of its database and other software covered by the judge's ruling to HP Itanium computers. Oracle software on HP's Itanium computers will be released on approximately the same schedule as Oracle software on IBM's Power systems.



Saludos.

jueves, septiembre 06, 2012

Oracle, lista de usuarios

Consulta para obtener los nombres de usuarios de la base de datos excluyendo los propios usuarios del Sistema de Gestión de Base de Datos ORACLE:


select username from dba_users where username not in('QS_CB','PERFSTAT','QS_ADM','PM','SH','HR','OE','ODM_MTR','WKPROXY','ANONYMOUS','OWNER','SYS','SYSTEM','SCOTT','SYSMAN','XDB','DBSNMP','EXFSYS','OLAPSYS','MDSYS','WMSYS','WKSYS','DMSYS','ODM','EXFSYS','CTXSYS','LBACSYS','ORDPLUGINS','SQLTXPLAIN','OUTLN','TSMSYS','XS$NULL','TOAD','STREAM','SPATIAL_CSW_ADMIN','SPATIAL_WFS_ADMIN','SI_INFORMTN_SCHEMA','QS','QS_CBADM','QS_CS','QS_ES','QS_OS','QS_WS','PA_AWR_USER','OWBSYS_AUDIT','OWBSYS','ORDSYS','ORDDATA','ORACLE_OCM','MGMT_VIEW','MDDATA','FLOWS_FILES','FLASHBACK','AWRUSER','APPQOSSYS','APEX_PUBLIC_USER','APEX_030200');

martes, septiembre 04, 2012

vi, eliminar todas las líneas desde el principio hasta la línea actual

Editor de textos VI

Borrar todas las líneas desde el principio, hasta la línea actual:
:1,.d

Borrar todas las líneas desde el principio, hasta la anterior a la actual:
:1,.-1d

Borrar desde la primera línea que se ve en pantalla hasta la actual:
dH

Saludos.

lunes, septiembre 03, 2012

ORA-27492 en Oracle





ORA-27492: no se ha podido ejecutar el trabajo "SYS.AQ_JOB$_977": Planificador no disponible


Me ha ocurrido al arrancar los servicios de Streams.
Solucionado con:

$sqlplus "/as sysdba"
SQL> exec dbms_ijob.set_enabled(true);

dbms_ijob permite a los usuarios sys y system gestionar jobs de otros usuarios. Más información en http://www.db-source.com/disabling-and-enabling-oracle-jobs-with-dbms_job/

Saludos.

martes, agosto 28, 2012

Abrir formularios en Lazarus-FreePascal



Como en un lenguaje de programación moderno (con extensión para orientación a objetos), en Lazarus - FreePascal tenemos dos formas de abrir formularios:



  1. De forma estática. Diseñas los formularios. Luego, al iniciar la aplicación se crean todos los formularios, aunque están ocultos. Cuando quieras lo haces visible en tiempo de ejecución.
  2. De forma dinámica. Cuando abres una aplicación como el Microsoft Word, tú no sabes cuantos formularios "de documento" vas a tener que abrir. El usuario puede abrir 1 documento o 20. Cada vez que haga clic en "Nuevo documento" hay que abrir un formulario.
1.-FORMA ESTÁTICA DE CREAR FORMULARIOS.

Diseñamos los formularios que necesitemos con Lazarus. Para crear un nuevo formulario vamos al MENÚ ARCHIVO, Opción NUEVO FORMULARIO.

Hay que tener en cuenta que cada formulario gráfico que hemos creado está descrito en una unidad (UNIT). Para verlo seleccionamos el formulario y vamos al MENÚ VER, Opción "EDITOR DE CÓDIGO FUENTE". El nombre de la unidad se encuentra en la primera línea del código fuente del formulario. Por ejemplo:

unit Unit1;

Si desde este form1 que está definido en Unit1, queremos llamar al form2, tenemos que incluir la definición de form2 dentró de la sección uses:

uses: 
xxxxx, xxxxxx, xxxxxx, xxxxxx, unit2;

Ahora ya podemos "llamar" al form2 desde form1. Realmente la invocación sólo consiste en hacer visible el formulario. Eso es así porque al arrancar se crean todos los formularios que hemos diseñado.

form2.show;

2.-FORMA DINÁMICA DE CREAR FORMULARIOS.

Tenemos que pensar que cada formulario es un objeto. Nuestro programa puede necesitar abrir varios objetos de ese tipo (formularios de entrada, informes, etc.), aunque cada uno tenga datos diferentes.

Vamos al MENÚ PROYECTO, Opción OPCIONES DEL PROYECTO, y elegimos FORMULARIO. Saldrá esta ventana:


Pasamos los formularios que haya que abrir dinámicamente, de la columna "CREAR FORMULARIOS AUTOMÁTICAMENTE" a la de "FORMULARIOS DISPONIBLES".

En los eventos OnClose de los formularios tenemos que añandir lo siguiente para que libere la memoria:
CloseAction:= caFree;

Lo único que hay que hacer ahora para abrir el form2 desde el form1 es instanciar el objeto form2:

procedure Tform1.Button1Click(Sender: TObject);
var
   frmDocumento: Tform2;
begin
   frmDocumento:= Tform2.Create(Application);
   frmDocumento.Show;
end;  

Saludos.

lunes, agosto 27, 2012

Lazarus (freepascal), acceso a Oracle, segunda parte




El otro día explicaba cómo acceder a la base de datos desde FreePascal, aunque realmente sólo hacía una SELECT.
Hoy toca una update que es muy parecido.






Es muy similar a la SELECT del otro día. Hay estas diferencias:

  • En la SELECT se hace SQLQuery1.Open.
  • En la UPDATE SQLQuery1.ExecSQL.
  • En la UPDATE hay que hacer COMMIT de la transacción con SQLTransaction1.Commit.
Luego hay que tener en cuenta unos detalles para que no se generen errores:

ORACLE espera que indiquemos los valores VARCHAR2 (equivalentes al tipo String) entre comillas simples. El problema es que si ponemos comillas simples dentro de SQLquery1.SQL.Text, se corta el string y nos salta un error que indica que el String está mal construido.

La solución es incluir dos comillas simples. FreePascal entiende que la primera comilla es un caracter de escape y en el String que se forma tiene que haber una comilla simple.


El código fuente para el copia-pega:



procedure TfrmPrincipal.Button2Click(Sender: TObject);
var
  OracleConnection1: TOracleConnection;
  SQLquery1: TSQLQuery;
  SQLtransaction1: TSQLTransaction;
begin
  OracleConnection1 := TOracleConnection.Create(nil);
  SQLquery1 := TSQLQuery.Create(nil);
  SQLtransaction1 := TSQLTransaction.Create(nil);
  try
    try
      with OracleConnection1 do begin
           DatabaseName:='entradaTNS-ORACLE';
           UserName:='usuario';
           Password:='password';
           Transaction := SQLtransaction1;
      end;
      OracleConnection1.Connected:=true;
      SQLtransaction1.Active:=true;
      SQLquery1.DataBase := OracleConnection1;
      SQLquery1.SQL.Text := 'update TABLA set CAMPO=''C'' where CAMPO2=''D''';
      SQLQuery1.ExecSQL;
      SQLTransaction1.Commit;
      ShowMessage ('Campo actualizado');
      SQLquery1.Close;
      OracleConnection1.Close;
    finally
      SQLtransaction1.Free;
      SQLquery1.Free;
      OracleConnection1.Free;
    end;
  except
    on E: Exception do
      writeln(E.message);
  end;
end;

Saludos,

viernes, agosto 24, 2012

Formulario MDI en Lazarus - FreePascal

Quiero iniciar una aplicación en Lazarus. Lo primero es el formulario MDI principal (Multiple Document Interface). Si abrimos el Word por ejemplo, hay un formulario principal MDI que contiene los menús, las barras de herramientas, etc. Y luego podemos abrir múltiples documentos Word, cada uno de ellos en formularios "hijos" que se pueden minimizar, maximizar, hacer un mosaico, pero dentro del formulario MDI principal.

Como el otro día, reina la confusión. En este foro de freePascal de Enero de 2010, una persona pregunta por los formularios MDI y por las respuestas, todo parece indicar que no existe la implementación.

En el Club Delphi una persona recomienda utilizar la propiedad FormStyle. Dice que pongamos el formulario principal como fsnormal y los formularios hijos como fsStayOnTop.

En los Wiki de FreePascal y de Lazarus, indican que no hay formularios MDI, pero que tenemos algo similar que denominan MultiDoc (MultiDoc en FreePascal y MultiDoc en Lazarus). Sin embargo, es un desarrollo de un tercero, y los enlaces a la descarga de la última versión (0.3.1) están rotos.

Llegados a este punto desisto de los formularios MDI. Ya me he hecho a la idea que habrá que usar el truco del FormStyle. Voy a la propiedad FormSyle de mi formulario principal y SORPRESA!!! LA PROPIEDAD ADMITE LOS SIGUIENTES VALORES:


  1. fsNormal
  2. fsSplash
  3. fsStayOnTop
  4. fsSystemStayOnTop
  5. fsMDIForm
  6. fsMDIChild
Bueno, pues salvo nuevas sorpresas parece que ya hay formularios MDI en freePascal/Lazarus.

Saludos.

jueves, agosto 23, 2012

Lazarus (freepascal), acceso a Oracle

 ACCESO A ORACLE DESDE LAZARUS (FREE PASCAL):

Desarrollar en Lazarus tiene un grave problema: Hoy en día se utiliza Google como herramienta de documentación para el desarrollo de aplicaciones. En el caso de Lazarus no hay más remedio ya que no hay ninguna ayuda integrada en el IDE. Sin embargo en Internet no hay muchos ejemplos de código freePascal cuando toca hacer algo en el entorno de trabajo (conexión a Oracle por ejemplo).

Digo esto en comparación con otros lenguajes o plataformas como C# o VB.NET por ejemplo. En estos casos el problema suele ser las diferencias que hay entre los diferentes framework, pero ese es otro asunto.

 1.-Forma gráfica: añadir control TORACLECONNECTION de la pestaña SQLdb de la barra de herramientas.

El problema es que no hay una ayuda clara para saber lo que hay que poner en los campos principales. Esto es lo que yo he necesitado:
  1. En DatabaseName ponemos la entrada TNS del fichero TNSNAMES.ORA del cliente Oracle.
  2. En UserName ponemos el usuario Oracle.
  3. En Password la password de ese usuario Oracle.
y nada más. En cuanto pongamos la propiedad CONNECTED a TRUE veremos si conecta bien o no.

2.-Forma no gráfica de hacer la conexión y una ejecución de una instrucción SQL.

NOTA IMPORTANTE: como antes he metido en control gráfico TORACLECONNECTION, este objeto se ha creado en la carga del formulario. Si no agregamos el control de forma gráfica, tendremos que declara la variable en la zona de VAR, y crearla después del BEGIN:

var
OracleConnection1: TOracleConnection;
...
begin
OracleConnection1 := TOracleConnection.Create(nil);
...



El código fuente para copia-pega:

procedure TForm1.Button1Click(Sender: TObject);
var
  SQLquery1: TSQLQuery;
  SQLtransaction1: TSQLTransaction;
begin
  SQLquery1 := TSQLQuery.Create(nil);
  SQLtransaction1 := TSQLTransaction.Create(nil);
  try
    try
      with OracleConnection1 do begin
           DatabaseName:='instancia.host.es';
           UserName:='xxxxxxx';
           Password:='xxxxxxx';
           Transaction := SQLtransaction1;
      end;
      OracleConnection1.Connected:=true;
      SQLtransaction1.Active:=true;
      SQLquery1.DataBase := OracleConnection1;
      SQLquery1.SQL.Text := 'select * from tabla1';
      SQLquery1.Open;
      SQLquery1.Last;
      ShowMessage (intToStr(SQLquery1.RecordCount));
      SQLquery1.First;
      while not SQLquery1.EOF do
      begin
        ShowMessage (SQLquery1.FieldByName('campo1').AsString);
        SQLquery1.Next;
      end;
    finally
      SQLtransaction1.Free;
      SQLquery1.Free;
      OracleConnection1.Free;
    end;
  except
    on E: Exception do
      writeln(E.message);
  end;
end;

Más información, aunque más orientada a la base de datos Firebird en el wiki de FreePascal, tema: SQLdb Tutorial.

Saludos.

jueves, agosto 16, 2012

Lazarus 1.0 ya disponible


En Febrero de 2011 me preguntaba si ya era el momento de Lazarus, el IDE multiplataforma y software libre para desarrollar con el lenguaje Pascal (la alternativa libre de Delphi).

La noticia ahora es que han lanzado la versión 1.0 RC que ya está disponible en http://sourceforge.net/projects/lazarus/files/

Características destacables de Lazarus:

  • Genera binarios directamente ejecutables, sin máquinas virtuales ni frameworks intermedios, por lo que el despliegue de aplicaciones y la resolución de problemas se simplifica.
  • Software libre.
  • Multiplataforma (Windows, GNU/Linux, Mac OSX). Su lema es "Write once, compile anywhere".
  • Lenguaje Pascal: elegante y potente.
  • IDE con muchas facilidades gráficas, similar en apariencia al del Visual Studio
Saludos.

domingo, agosto 12, 2012

Seguimos con los privilegios del señor. Antes era uno y ahora un montón.

Igual que con el sistema feudal de la edad media. Antes había que pagar tributos al señor feudal y el diezmo a la iglesia. Ahora no hay señor, pero están los políticos (no todos, pero si los más caraduras).



Esto es peor de lo que cualquiera puede imaginar (ir a la noticia por favor). Resulta que las mesas del parlamento y del congreso deciden estos sueldos según su propio criterio y de forma secreta. Si les caes mal te quedarás sin él. Si eres muy majo para el grupo de privilegiados te pondrán unos 2.000 euros al mes. Si te condenaron por algún delito grave pero te deben algún favor, pues también tendrás los 2.000 euros mensuales. ¡¡¡INAUDITO!!!

Hablamos del "desvío" de 635.000 euros anuales de dinero público que como todo privilegio medieval es heredable. En estos momentos 65 viudas cobran la graciosa ayuda. Lo peor es que si se lo comentas a algún político (inténtalo) mostrará su asombro por la queja, y no tardará en explicarte que es una virtud de la democracia y bla bla bla.

Con tanta corrupción no sé si saldremos de esta.
Saludos.

sábado, agosto 11, 2012

Mi experiencia con Apple (de momento)

En este interesante artículo titulado CINCO DETALLES QUE APPLE NO QUIERE QUE CONOZCAS, enumeran cinco prácticas de Apple que quería comentar.

1.-"Su producto no será puntero por mucho tiempo".
Bien, ¿y a quien le importa eso? Cuando compramos un coche ocurre lo mismo. Esto sólo puede importar a los snob. No compres tecnología por imagen. Para el tema de la imagen cómprate una gafas bonitas.

Más me preocupa mi caso particular:
En Diciembre de 2008 compré un MAC Mini. Bastante barato por cierto (unos 800 euros). Venía con el S.O. OSX Leopard. Al poco tiempo lanzaron el Snow Leopard por unos 35 euros. Pensé que ya lo compraría cuando me hiciera falta. Ha pasado el tiempo y empieza a haber aplicaciones que no se van a actualizar más para Leopard (el Chrome por ejemplo). Es algo grave porque afecta a la seguridad. Voy a comprar el Snow Leopard... SORPRESA. No se puede adquirir en el MAC Store. Lo han retirado. Tampoco puedo comprar el Mountain Lion porque hay que comprarlo desde el Mac App Store. No hay Mac App Store para Snow Leopard. Estoy atrapado en un S.O. obsoleto sin que sea un problema de hardware ¿Esto tiene algún sentido?

2.-"Con Apple se gasta más".
Al leer este punto verás que habla del iPhone y del iPad y dice que se gasta más que con otros dispositivos móviles (un 10% más). No tengo el iPhone (tengo un Samsung baratito). Mi gasto exceptuando la operadora telefónica es cero. El 10% de cero es cero. Con el iPad sí es verdad que compré un ajedrez electrónico. Fueron menos de 5 euros porque era de lo mejorcito.

3.-"Los inversores dudan de nuestra capacidad de innovación".
Hablan de que al morir Steve Jobs puede que no sepan que cosas nuevas hacer. Mencionan también que el entorno móvil es muy cambiante y Apple podría ser el siguiente en caer. Mi opinión es que esto para la prensa rosa. El futuro ya vendrá y en informática 5 años es toda una vida.

4.-"El iPhone está muy sobrepreciado".
Si se vende no veo el problema. Será que el comprador considera que lo vale. Mayor problema me parece que sea su producto estrella, esto es, la que más beneficios le reporta. Esto podría perjudicar al desarrollo del resto de familias de productos (ordenadores y portátiles básicamente). No será la primera vez que algo bueno desaparece por el éxito de otra línea de producto.

5.-"Te engancharemos de por vida".
Precisamente han dejado en último lugar lo más importante para el usuario. Restricciones a la libertad del uso de nuestros propios contenidos. El riesgo de verse atrapado por una marca concreta. Si compramos un coche, es razonable que en algunos elementos como la centralita electrónica, la radio integrada, la llave electrónica, etc. dependamos totalmente de la marca, pero las ruedas, el aceite, los arreglos de carrocería, etc. etc. los haré donde me dé la gana. Si a lo largo de un largo viaje compro unos CD-s de música, no sería razonable que sólo funcionaran en mi coche. Al parecer es lo que ocurre en la actualidad con el iTunes (eso dicen en el artículo, aunque que yo sepa hay iTunes para Windows). Respecto a la nube de Apple, el iCloud , según indica sólo es accesible desde dispositivos Apple. Entiendo que esta no es una situación deseable para el usuario y tiene que ser debidamente valorada.

Saludos.

jueves, agosto 02, 2012

Guerra ORACLE - HP - INTEL

Publiqué el 5 de Mayo de 2011 que empezaba una importante guerra entre gigantes, cuya resolución va a ser importante para casos similares que puedan ocurrir en el futuro.

ORACLE no iba a desarrollar más sobre la plataforma Itanium de Intel. Teniendo en cuenta que el mayor fabricante que trabaja con Itanium es HP, y que el 30% de las bases de datos ORACLE corren en esas máquinas HP Itanium, estaba claro que HP (e INTEL) no se iban a quedar de brazos cruzados.

En este caso además ocurren dos circunstancias que hacen sospechar mala fe por parte de ORACLE:


  1. En abril de 2009 ORACLE compra SUN y pasa a ser fabricante de servidores. Tal vez las ventas no iban todo lo bien que querían y su mayor competidor es HP. Dejar de desarrollar ORACLE para HP le quita competencia y aumenta su ración de tarta.
  2. El ex-presidente de HP Mark Hurd, que fue despedido después de un escándalo sexual, con un indemnización de 40 millones de dólares que incluía un acuerdo de confidencialidad, fue contratado por ORACLE para sustituir a Charles Phillips como copresidente y miembro del consejo de administración de ORACLE, que a su vez también fue despedido por un escándalo con su amante. Yo me pierdo con tanto escándalo, aquí lo explican mejor. Un vengativo Mark Hurd en su nombramiento debió decir: “Creo que con su estrategia de combinar software y hardware, Oracle podrá batir a IBM tanto en servidores de empresas como en almacén de datos”. Claro que para eso primero tiene que comerse la tajada de HP. Esta historia ocurrió por el mes de Septiembre de 2010.
Pues la primera batalla parece que la gana HP, ya que la noticia hoy es que "LOS TRIBUNALES DAN LA RAZÓN A HP EN UN MILLONARIO JUICIO CONTRA ORACLE".

Lo que está claro es que para clientes de HP con un Itanium de última generación a nuestro cargo, es una buena noticia el poder migrar un día a ORACLE 12 cuando se estime conveniente.

Saludos.