PDA

Ver la Versión Completa : Problemas con funcion


bbjb
27-09-2004, 16:37:16
Disculpen mi ignorancia (que es inconmensurable), pero es que procedo de la programación en 4gl, donde la declaración de una función te permite el retorno de multiples valores.

Sin embargo, desconozco si esto es posible en delphi, aunque creo que no, ya que solo se puede asociar un valor a la variable Result ¿me equivoco?.

Posdata : Ni que decir que soy principiante en esto.

roman
27-09-2004, 16:45:44
ya que solo se puede asociar un valor a la variable Result ¿me equivoco?.


Pues no te equivocas pero una función puede tener como valor de regreso un tipo de datos estructurado, un record por ejemplo, de manera que esto puede solventar la falta de valores de regreso múltiple.

// Saludos

bbjb
27-09-2004, 16:54:47
¿La definicion de la misma sería algo asi como?

Function devuelve_valores ( s_cadena:String) :Record;

roman
27-09-2004, 17:02:17
¿La definicion de la misma sería algo asi como?

Function devuelve_valores ( s_cadena:String) :Record;

No. Tienes que especificar qué tipo de record vas a usar. Por ejemplo:


type
TPersona = record
Nombre: ShortString;
Edad: Integer;
end;

function UnaPersona: TPersona;
begin
Result.Nombre := 'roman';
Result.Edad := 65;
end;


// Saludos

bbjb
27-09-2004, 17:05:09
Millon de gracias, te debo una.

roman
27-09-2004, 17:11:20
te debo una.

¡Ah! Pues me la puedes pagar fácilmente :p explicándome esto:

¿Qué viene a ser una función que regresa múltiples valores? En mis tiempos, matemáticamente hablando, regresar un sólo valor es un requisito para que una relación entre dos conjuntos sea una función.

// Saludos

bbjb
27-09-2004, 17:33:41
Quiero construir una sql dependiendo del campo seleccionado en un formulario, de tal manera que si este campo es coche obtendre:

If campo = 'automovil' Then
s_tabla := 'automovil'
s_campo := 'aut_descri'
s_where := 'aut_codigo'
Else If campo = 'camion' Then ...

Con estas tres variables puedo construir la sql de la siguiente manera:

s_sql := ' Select ' + s_campo + ' From ' + s_tabla + ' Where ' + s_where + ' = 1'

Este metodo lo puedo utilizar para el resto de tablas utilizadas en el programa.

Esta función la he incluido en un módulo general donde están todas las funciones y procedimientos genéricos.
Entre las diversas y múltiples opciones que existan, está la de crear variables globales y un sinfin más que harán de este método el menos adecuado, pero recuerda que vengo de programar en 4gl y estoy algo atrofiado, así que no te me riñas por favor.

roman
27-09-2004, 17:41:17
así que no te me riñas por favor.

Je, je, si no te estoy riñendo :) Mi pregunta era genuina, quiero saber qué significa en 4GL una función que devuelva múltiples valores. ¿Cómo se especifica algo así? ¿Como escoges cuál valore de regreso usar? Etc.

// Saludos

bbjb
27-09-2004, 17:51:17
Es muy diferente la programación.

En la definición de la función no tienes que indicas el número de valores que devuelve la misma, simplemente devuelves los que te sean necesario .

Y a la hora de obtener los valores es tan simple como, poner en el mismo orden las variables que los valores retornados, de esta manera si en la variable 1 quieres guardar el retorno 1 solo habrá que hacer...

Main
Define p_var1,p_var2,p_var3 Integer;

Call devuelve_valores Returning p_var1,p_var2,p_var3

End Main

Function devuelve valores

Return 4,6,7

End Function

La variable p_var1 recoge el valor 4 , p_var2 = 6 y p_var3 = 7

Por eso, el cambio de una programación a otra es más que ostensible y uno va a base de tropezarse.

Si no fuera por gente como vosotros... :D

roman
27-09-2004, 18:01:27
:eek: Interesante.

Pero entonces ¿quiere decir que no puedes usar la llamada a una función como parte de una expresión? Por ejemplo en un lenguaje como Delphi puedes poner la expresión

3*MiFuncion + 4;

En 4GL, ¿debes recoger primero los valores antes de poder usarlos?

// Saludos

bbjb
27-09-2004, 18:08:19
También puedes hacer ese uso de la función, solo que te he puesto como ejemplo algo similar a lo que intento hacer en delphi.