PDA

Ver la Versión Completa : Funcion Delphi en SQL


raverri
16-07-2007, 17:03:00
Cordial saludo, Quisiera saber como utilizar una función personalizada hecha en Delphi dentro de una instrucción SQL de un componente TQuery.

Por ejemplo algo como:

"SELECT FuncionPropia(Campo) FROM..."


Donde FuncionPropia es una función construida en Delphi

function FuncionPropia(Texto:String) : String:
begin
...
end;


Muchas Gracias por la ayuda.

ContraVeneno
16-07-2007, 17:10:04
Hasta donde tengo entendido, no creo que puedas utilizar una función de delphi dentro de una función de sql, ya que estas se ejecutan en lugares distintos, es decir, la función de delphi se ejecutará el la computadora donde se ejecute tu programa, y la instrucción SQL se ejecutará en el servidor.

Así que veo muy difícil que puedas combinar una cosa con la otra.

Tal vez sería mejor que nos explicaras un poquito que es lo que haces con la función en delphi para poderte ofrecer otras opciones.

raverri
16-07-2007, 17:23:19
Gracias por responder.

Basicamente lo que necesito es que en un Tquery me devuelva un campo (campo origen) con una longitud total de 5 caracteres (rellenando con ceros a la derecha).

Por ejemplo:

Campo Origen Valor Requerido
1 10000
123 12300
1234 12340
12345 12345

En VBA Access puedo hacer una función propia en un módulo e invocarla en el SQL, pero no se como hacerlo dentro de una consulta SQL en Delphi.

Espero haberme hecho entender.


Muchas Gracias.

jhonny
16-07-2007, 17:24:54
De todas maneras, si estas usando FireBird o InterBase puedes crear una UDF o usar una existente (Todo depende de la función que necesites). En muchos casos las funciones que necesitamos ya vienen en las UDFs por defecto.

jhonny
16-07-2007, 17:28:32
Gra
Basicamente lo que necesito es que en un Tquery me devuelva un campo (campo origen) con una longitud total de 5 caracteres (rellenando con ceros a la derecha).


Lo dicho, en el archivo ib_udf se describe una función llamada lpad y otra rpad que seguramente te servirán. Pero aun no nos dices ¿Que Motor usas?

raverri
16-07-2007, 17:29:29
Cabe anotar que la base de datos que estoy utilizando es Microsoft Access 2000.

Dentro de las funciones de SQL para Access no hay una función rellenar, completar o algo parecido.

Se que es algo muy sencillo pero no se como hacerlo.


Gracias nuevamente.

Neftali [Germán.Estévez]
16-07-2007, 17:29:42
Algunos servidores de SQL tienen métodos para programar funciones externas (UDF's - User defined Function) normalmente a través de DLL's.
¿Qué Servidor del SQL estás utilizando?

EDITO: Veo que ya se me adelantaron... :o
Que yo sepa Access no posee esta característica.:(

ContraVeneno
16-07-2007, 17:33:34
var CampoConCeros: string;
...
with TuQuery do begin
If active then close;
SQL.Clear;
SQL.Add('Select Campo');
SQL.Add('From Tabla');
SQL.Add('Where campo = 1');
Open;
if Not IsEmpty then begin //sí se encontró el campo
CampoConCeros := Trim(FieldByName('Campo').AsString);
While Length(CampoConCeros) < 5 do begin
CampoConCeros := CampoConCeros+'0';
end; //while
end; //if not isempty
end; //with

raverri
16-07-2007, 17:38:52
Gracias "Contra Veneno". Pero necesito aplicar la función a todo el recordset (aprox. 180000 registros) para exportarlo como un archivo de Texto.

He contemplado hacerlo uno a uno pero antes quisiera averiguar si lo puedo hacer todo dentro de un TQuery (SQL) en un solo paso.


Gracias otra vez.

jhonny
16-07-2007, 17:46:41
Como no se de access, pues modificare un poquito la función de Contraveneno:

var
CampoConCeros: string;
begin
with TuQuery do
begin
If active then
close;
SQL.Clear;
SQL.Add('Select Campo');
SQL.Add('From Tabla');
SQL.Add('Where campo = 1');
Open;
if Not IsEmpty then begin //sí se encontró el campo
CampoConCeros := StringOfChar('0', 5 - Length(FieldByName('Campo').AsString))+FieldByName('Campo').AsString;
end; //with
end;

raverri
16-07-2007, 18:07:47
Ya lo he logrado.


Add('SELECT LEFT(campo + '00000',5)');


Le agrego 5 ceros al final del campo pero tomo solo los cinco primeros caracteres.

Muchas Gracias a todos por la ayuda.