lunes, 5 de mayo de 2008

EXECUTEREALSQL

La ejecución del Método EXECUTEREALSQL permite interactuar directamente con la Base de Datos física, para, por ejemplo, ejecución de PL/SQL o sentencias directatas contra objetos tales como INSERT, UPDATE y DELETE.

Para ello hay que crear un concepto llamado EXECUTEREALSQL de ámbito Nodo, Tipo Long. En las propiedades avanzadas ponemos “Argumentos variables” a “”. Como regla creamos una de tipo CPP y en su método le indicamos que vamos a usar es: “executerealsql”. Creamos un argumento llamado ID_CONN de tipo número y tamaño 4.

En un método aparte creamos una sentencia a lanzar contra la base de datos y lo ejecutamos de la siguiente forma:

MsSQL = "INSERT INTO NUESTRA_TABLA (PK,CAMPO1,CAMPO2,CAMPO3) VALUES ('" + STD_ID_PERSON+"','" + STD_N_FAMILY_NAME_1 + "," + STD_N_FIRST_NAME + "'," + ToString(EDAD,0) + ",'" + MsDate + "')"

EXECUTEREALSQL = MsSQL
MsRdo = EXECUTEREALSQL(0)


En este ejemplo metemos en una tabla un valor numérico: “EDAD” y una fecha como cadena “MsDate”; para componer la fecha podemos usar:

MdDate = Today()
MsDay = ToString(DxDay(MdDate),0)
MsMonth = ToString(DxMonth(MdDate),0)
MsYear = ToString(DxYear(MdDate),0)
MsDate = MsDay + "/" + MsMonth + "/" + MsYear


Si queremos usar varias sentencias seguidas podemos encapsularlas en un PL y entonces la llamada será:

MsSQL = "BEGIN NUESTRO_PL ('" + ARGUMENTO1+"', '" + ARGUMENTO2+"','");END;"

EXECUTEREALSQL = MsSQL
MsRdo = EXECUTEREALSQL(0)

O podemos hacer varias llamadas enlacadas:

MsSQL = "DELETE NUESTRA_TABLA"

EXECUTEREALSQL = MsSQL
MsRdo = EXECUTEREALSQL(0)

If MsRdo <> M4_ERROR Then
MsSQL = "INSERT INTO NUESTRA_TABLA (PK,CAMPO1,CAMPO2,CAMPO3) VALUES ('" + STD_ID_PERSON+"','" + STD_N_FAMILY_NAME_1 + "," + STD_N_FIRST_NAME + "'," + ToString(EDAD,0) + ",'" + MsDate + "')"

EXECUTEREALSQL = MsSQL
MsRdo = EXECUTEREALSQL(0)
EndIf
Tiene un problema y es que las cosas que controla la Base de Datos Lógica, digase, completitud, datos "no null", fechas,... las debemos controlar nosotros. Además sino lo hacemos nosotros los campos de control de ID_SECUSER, ID_APPROLE o DT_LAST_UPDATE no se actualizan.
Ojo con usarla de "mala manera" con entornos con AUDITORIA ya que tampoco se actualiza.

7 comentarios:

Anónimo dijo...

hola
antes de hace uso del ExecuteRealSql hay que tener en cuenta que el propio Meta4 los ha eliminado de su código.
¿el motivo? Que se salta al LOPD.
así que no es muy recomendable hacer un executeReal.

Un saludo.
SP11

Oscar López dijo...

Amigo SP11,

como bien dices este método se salta dicha ley. (LOPD = Ley Orgánica de Protección de Datos) Es que nos leen desde el otro lado del "cahrco" :-)

¿Puedes decirnos desde que versión ha sido eliminado este método?

Mucahas gracias!
Un saludo!
Oscar L.

Anónimo dijo...

hola
he intentado encontrar el caso en el que me lo comentaban, pero no lo he encontrado.
No recuerdo en que cliente salió el tema. Preguntamos a Soporte por un error que no veíamos y nos dijeron como se hacía, pero que no lo recomendaban.

Lo siento
Un saludo

Anónimo dijo...

Muchas gracias. Me ha sido muy útil.

Anónimo dijo...

Muchas gracias. Justo lo que buscaba.

Anónimo dijo...

Muchas gracias. Justo lo que buscaba.

Maxi dijo...

Hola, hay manera de capturar, en caso de error de base de datos, la información del error??? Muchas Gracias!