Source con retorno de más de un valor

Consultas, trucos, consejos. Todo sobre Clarion en todas sus versiones
Avatar de Usuario
danielnelsonrivarola
Novato
Mensajes: 18
Registrado: Mar Feb 08, 2011 12:11 am
Contactar:

Source con retorno de más de un valor

Mensaje por danielnelsonrivarola » Vie Feb 11, 2011 11:09 pm

Estimados, necesito retornar más de un valor en mi source, como se hace para recuperarlo

Retorno = SourceMio(Par1,Par2)

Desde ya muchas gracias
Desde ya muchas gracias!
Daniel Rivarola


LeoPalomares
Ayudante de Santa
Mensajes: 53
Registrado: Lun Feb 07, 2011 10:50 pm
Contactar:

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

Mensaje por LeoPalomares » Sab Feb 12, 2011 7:51 am

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
Saludos!!!

Leo Palomares

LeoPalomares
Ayudante de Santa
Mensajes: 53
Registrado: Lun Feb 07, 2011 10:50 pm
Contactar:

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

Mensaje por LeoPalomares » Sab Feb 12, 2011 7:52 am

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
Saludos!!!

Leo Palomares

Avatar de Usuario
Mauricio
Desarrollador de Clarion
Mensajes: 1044
Registrado: Dom Feb 06, 2011 9:34 am
Ubicación: España
Contactar:

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

Mensaje por Mauricio » Sab Feb 12, 2011 8:23 am

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.
Mauricio, básicamente usando Clarion 6.3
www.tdcsoftware.com y www.clarioneros.com/blog

Avatar de Usuario
danielnelsonrivarola
Novato
Mensajes: 18
Registrado: Mar Feb 08, 2011 12:11 am
Contactar:

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

Mensaje por danielnelsonrivarola » Sab Feb 12, 2011 11:58 pm

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.
Desde ya muchas gracias!
Daniel Rivarola

Avatar de Usuario
Mauricio
Desarrollador de Clarion
Mensajes: 1044
Registrado: Dom Feb 06, 2011 9:34 am
Ubicación: España
Contactar:

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

Mensaje por Mauricio » Dom Feb 13, 2011 8:40 am

Las variables que estás pasando como parámetros son del mismo tipo?
Podés postear la función así la vemos?
Mauricio, básicamente usando Clarion 6.3
www.tdcsoftware.com y www.clarioneros.com/blog

Avatar de Usuario
danielnelsonrivarola
Novato
Mensajes: 18
Registrado: Mar Feb 08, 2011 12:11 am
Contactar:

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

Mensaje por danielnelsonrivarola » Lun Feb 14, 2011 12:40 am

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!
No tiene los permisos requeridos para ver los archivos adjuntos a este mensaje.
Desde ya muchas gracias!
Daniel Rivarola

LeoPalomares
Ayudante de Santa
Mensajes: 53
Registrado: Lun Feb 07, 2011 10:50 pm
Contactar:

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

Mensaje por LeoPalomares » Lun Feb 14, 2011 6:51 am

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
Saludos!!!

Leo Palomares

Avatar de Usuario
danielnelsonrivarola
Novato
Mensajes: 18
Registrado: Mar Feb 08, 2011 12:11 am
Contactar:

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

Mensaje por danielnelsonrivarola » Lun Feb 14, 2011 4:23 pm

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.
Desde ya muchas gracias!
Daniel Rivarola

dlopez
Mensajes: 8
Registrado: Lun Feb 07, 2011 4:54 am
Contactar:

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

Mensaje por dlopez » Mar Feb 15, 2011 5:25 am

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.
---
Daniel C. López
Programación San Salvador
Entre Ríos - Argentina


Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado