Página 1 de 2

Source con retorno de más de un valor

Publicado: Vie Feb 11, 2011 11:09 pm
por danielnelsonrivarola
Estimados, necesito retornar más de un valor en mi source, como se hace para recuperarlo

Retorno = SourceMio(Par1,Par2)

Desde ya muchas gracias

Re: Source con retorno de más de un valor

Publicado: Sab Feb 12, 2011 7:51 am
por LeoPalomares
Hola Daniel,

No podés retornar más de un valor desde una función pero lo que si podés hacer es pasarle variables por referencia para que tu función las pueda actualizar.

Explicaciones:
Hay dos métodos de parametrización de variables en las funciones y/o procedimientos, por valor o por referencia (esto no es exclusivo de Clarion). Cuando pasás un parámetro por valor la función está recibiendo una copia de lo que se le haya pasado mientras que cuando pasás un parámetro por referencia la función está recibiendo un "puntero" a la dirección de memoria en donde reside la variable que se le está pasando en la llamada.

Ejemplo:

Loc:ApeNom CSTRING(101)
Loc:FechaAlta LONG

CODE

IF InfoCliente(10, Loc:ApeNom, Loc:FechaAlta) = True
!Error al recuperar la info del cliente
ELSE
DISPLAY()
END



InfoCliente(LONG pIdCliente, *CSTRING pOutApeNom, *LONG pOutFechaAlta),BYTE
Loc:Error BYTE

CODE

Loc:Error = True
CLEAR(pOutApeNom)
CLEAR(pOutFechaAlta)

IF pIdCliente
DO OpenTables

Cli:IdCliente = pIdCliente
GET(Clientes, Cli:PKClientes)
IF ERRORCODE()
MESSAGE('Error bla,bla,bla')
ELSE
Loc:Error = False
pOutApeNom = Cli:Apellido & ', ' & Cli:Nombre
pOutFechaAlta = Cli:FechaAlta
END

DO CloseTables
END

RETURN(Loc:Error)


Saludos!!!

Leo Palomares

Re: Source con retorno de más de un valor

Publicado: Sab Feb 12, 2011 7:52 am
por LeoPalomares
Hey!!! yo había indentado todo el código del ejemplo con espacios!!!
Cómo hay que hacer para indentar y que lo respete? alguien sabe?

Saludos!!!

Leo Palomares

Re: Source con retorno de más de un valor

Publicado: Sab Feb 12, 2011 8:23 am
por Mauricio
Averiguo sobre la indentación del código. Aún tengo muchos items por mejorar, mañana creo que actualizaré la versión del phpBB y se van a encontrar con ciertos cambios (si es que todo funciona :) ).
Saludos.

Re: Source con retorno de más de un valor

Publicado: Sab Feb 12, 2011 11:58 pm
por danielnelsonrivarola
Leo, gracias por responder.
En el Prototype del source pongo
(ULONG,ULONG,ULONG,*REAL,*REAL,*REAL,*REAL),BYTE

al llamar la función

if SourceStockHacienda(Recate,Renspa,CategoriaOrigen,StockIni,Ingresos,Egresos,Stock)
message('Error al Calcular Stock|Verifique y reintente',icon:exclamation)
end

y al compilar me da el error
No matching prototype available, en la linea del if, revisé todo y no encuentro el error.

Re: Source con retorno de más de un valor

Publicado: Dom Feb 13, 2011 8:40 am
por Mauricio
Las variables que estás pasando como parámetros son del mismo tipo?
Podés postear la función así la vemos?

Re: Source con retorno de más de un valor

Publicado: Lun Feb 14, 2011 12:40 am
por danielnelsonrivarola
Mauricio, gracias por responder!
Las variables *REAL son todas DECIMAL.
Este es el código que llama la función, el cual da error

CalculoStock ROUTINE

if (REC:Renspa and REC:Renspa <> Loc:RenspaAnt) or |
(REC:CategoriaOrigen and REC:CategoriaOrigen <> Loc:CatOriAnt)

Loc:RenspaAnt = REC:Renspa
Loc:CatOriAnt = REC:CategoriaOrigen
Loc:StockIni = 0
Loc:Ingresos = 0
Loc:Egresos = 0
Loc:Stock = 0

! Loc:Stock = SourceStockHacienda(REC:Recate,REC:Renspa,REC:CategoriaOrigen)
if SourceStockHacienda(REC:Recate,REC:Renspa,REC:CategoriaOrigen,Loc:StockIni,Loc:Ingresos,Loc:Egresos,Loc:Stock)
Message('Error Cálculo de Stock','Error de Cálculo',icon:exclamation)
end

! Loc:StockIni = Glo:StockIni
! Loc:Ingresos = Glo:Ingresos
! Loc:Egresos = Glo:Egresos

display
end


Además te adjunto el TXA de la función

Gracias!

Re: Source con retorno de más de un valor

Publicado: Lun Feb 14, 2011 6:51 am
por LeoPalomares
Ya dijiste el problema vos mismo en la segunda linea.
O bien definis el parametro como *DECIMAL o, sino, definis las variables locales como REAL.
Cuando pasás variables por referencia siempre debés respetar los tipos.

Saludos!!!

Leo Palomares

Re: Source con retorno de más de un valor

Publicado: Lun Feb 14, 2011 4:23 pm
por danielnelsonrivarola
Leo, creía que lo tomaba igual, pq como DECIMAL no lo acepta en el prototype y en su lugar REAL funciona, asumí un compatibilidad erronea. Gracias, aprendo y lo pruebo.

Re: Source con retorno de más de un valor

Publicado: Mar Feb 15, 2011 5:25 am
por dlopez
danielnelsonrivarola escribió:Leo, creía que lo tomaba igual, pq como DECIMAL no lo acepta en el prototype y en su lugar REAL funciona, asumí un compatibilidad erronea. Gracias, aprendo y lo pruebo.
Tengo entendido que en el prototype "se aceptan" decimales pasados por referencia (*decimal), que es lo que justamente estás necesitando.