Source con retorno de más de un valor
- danielnelsonrivarola
- Novato
- Mensajes: 18
- Registrado: Mar Feb 08, 2011 12:11 am
- Contactar:
Source con retorno de más de un valor
Estimados, necesito retornar más de un valor en mi source, como se hace para recuperarlo
Retorno = SourceMio(Par1,Par2)
Desde ya muchas gracias
Retorno = SourceMio(Par1,Par2)
Desde ya muchas gracias
Desde ya muchas gracias!
Daniel Rivarola
Daniel Rivarola
-
- Ayudante de Santa
- Mensajes: 53
- Registrado: Lun Feb 07, 2011 10:50 pm
- Contactar:
Re: Source con retorno de más de un valor
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
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
Leo Palomares
-
- Ayudante de Santa
- Mensajes: 53
- Registrado: Lun Feb 07, 2011 10:50 pm
- Contactar:
Re: Source con retorno de más de un valor
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
Cómo hay que hacer para indentar y que lo respete? alguien sabe?
Saludos!!!
Leo Palomares
Saludos!!!
Leo Palomares
Leo Palomares
- Mauricio
- Desarrollador de Clarion
- Mensajes: 1125
- Registrado: Dom Feb 06, 2011 9:34 am
- Ubicación: España
- Contactar:
Re: Source con retorno de más de un valor
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.
Saludos.
Mauricio, básicamente usando Clarion 6.3
www.tdcsoftware.com y www.clarioneros.com/blog
www.tdcsoftware.com y www.clarioneros.com/blog
- danielnelsonrivarola
- Novato
- Mensajes: 18
- Registrado: Mar Feb 08, 2011 12:11 am
- Contactar:
Re: Source con retorno de más de un valor
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.
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
Daniel Rivarola
- Mauricio
- Desarrollador de Clarion
- Mensajes: 1125
- Registrado: Dom Feb 06, 2011 9:34 am
- Ubicación: España
- Contactar:
Re: Source con retorno de más de un valor
Las variables que estás pasando como parámetros son del mismo tipo?
Podés postear la función así la vemos?
Podés postear la función así la vemos?
Mauricio, básicamente usando Clarion 6.3
www.tdcsoftware.com y www.clarioneros.com/blog
www.tdcsoftware.com y www.clarioneros.com/blog
- danielnelsonrivarola
- Novato
- Mensajes: 18
- Registrado: Mar Feb 08, 2011 12:11 am
- Contactar:
Re: Source con retorno de más de un valor
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!
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
Daniel Rivarola
-
- Ayudante de Santa
- Mensajes: 53
- Registrado: Lun Feb 07, 2011 10:50 pm
- Contactar:
Re: Source con retorno de más de un valor
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
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
Leo Palomares
- danielnelsonrivarola
- Novato
- Mensajes: 18
- Registrado: Mar Feb 08, 2011 12:11 am
- Contactar:
Re: Source con retorno de más de un valor
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
Daniel Rivarola
-
- Mensajes: 8
- Registrado: Lun Feb 07, 2011 4:54 am
- Contactar:
Re: Source con retorno de más de un valor
Tengo entendido que en el prototype "se aceptan" decimales pasados por referencia (*decimal), que es lo que justamente estás necesitando.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.
---
Daniel C. López
Programación San Salvador
Entre Ríos - Argentina
Daniel C. López
Programación San Salvador
Entre Ríos - Argentina
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 13 invitados