fbernaus
28th June 2004, 18:59
Queremos automatizar mediante AFS la sesión de "Introducir entregas para órdenes de fabricación" (ticst01011m000). En esta sesión después de responder que los stock quieren entregarse inmediatamente, aparece y desaparece por sí sola una subsesión (tisfc0207s000). Y, a continuación, se muestra la pantalla de impresión.

Mi problema es que no se como tratar con los AFS esa subsesión, pues realmente, en el proceso manual, no se la invoca para nada (aparece y desaparece por sí sola). He probado a no tratar la subsesión, pero en este caso, al tratar de cerrar la sesión padre, no se cierra.
Así que señalo a la sesión que se ocupe de la subsesión (modo "add"), pero en este caso, no acierto a que el programa haga lo que quiero que haga (realmente no hace nada, se supone que tendría que imputar a una determinada linea de una orden de fabricación una cierta cantidad de artículo) Si habeis tratado con algún caso parecido os agradecería cómo puedo arreglarlo.

Muchas gracias por adelantado,
Un saludo a todos!

dorleta
29th June 2004, 11:17
Yo tuve que hacer algo parecido para deshacer unos movimientos realizados por error.

Automaticé la sesión de mantener entregas de material ( ticst0101m000 ) pero sin intentar entregarlo y una vez que terminaba las operaciones con esa orden es cuando lanzaba la tisfc0207m000 (tambien automatizada) que hace lo mismo ( mas que nada para ganar tiempo ) .

cuando automatices la tisfc0207m000 no olvides antes de llamar a la función de continuar proceso llamar a la de elegir listado

function extern stpapi.print.report(
const string session(),
ref string err.mesg() )
Es un error bastante habitual y que te deja la sesión colgada

fbernaus
29th June 2004, 11:48
Dorleta,

¿Como automatizaste la sesión ticst0101m000? No entiendo que utilidad te tenía automatizarla si finalmente no realizabas las entregas de stock.

El problema que tengo es que esa subsesión llama a una subsesión que aparece y desaparece por sí sola, sin la intervención del usuario. No se como tratar esa subsesión en el programa AFS.

Te paso el código para que veas como lo estamos intentando desarrollar:

Dim OF As String = "328385"
Dim linea As String = "170"


Dim articulo As String = "4600173"
Dim cantidad As String = "10"

Try

'Esta función realiza la asociación de un artículo con una OF en la cantidad especificada
'Devuelve 1 si todo correcto. -1 en caso de error

Dim baanobj As Object
baanobj = CreateObject("Baan4.Application.baanivc4") '501
baanobj.Timeout = 300
MsgBox("Creado AFS")

Dim sesion_baan As String = "ticst0101m000" 'Introducir entregas para órdenes de fabricación
Dim save As Long = 1 'commit=true.Si no,luego se haría un "save", si correspondiera
Dim resul_AFS As String

'===========================================================================================================================================================================================
'1.Localizar OF y linea de la OF
baanobj.ParseExecFunction("ottstpapihand", "stpapi.put.field(" & Chr(34) & sesion_baan & Chr(34) & "," & Chr(34) & "ticst001.pdno" & Chr(34) & "," & Chr(34) & OF & Chr(34) & ")")
baanobj.ParseExecFunction("ottstpapihand", "stpapi.put.field(" & Chr(34) & sesion_baan & Chr(34) & "," & Chr(34) & "ticst001.pono" & Chr(34) & "," & Chr(34) & linea & Chr(34) & ")")
baanobj.ParseExecFunction("ottstpapihand", "stpapi.find(" & Chr(34) & sesion_baan & Chr(34) & ")")

If baanobj.ReturnValue <> 1 Then 'será 1(si no encuentra ningún otra OF) o 2 (si encuentra otra OF, será la OF siguiente)
baanobj.ParseExecFunction("ottstpapihand", "stpapi.end.session(" & Chr(34) & sesion_baan & Chr(34) & ")")
baanobj.Quit()
baanobj = Nothing
MsgBox("OF inexistente")
Return
End If
'=================================================================================================================================================================================================
MsgBox("OF Y LINEA encontradaS")


'baanobj.ParseExecFunction("ottstpapihand", "stpapi.put.field(" & Chr(34) & sesion_baan & Chr(34) & "," & Chr(34) & "ticst001.pdno" & Chr(34) & "," & Chr(34) & OF & Chr(34) & ")")
'baanobj.ParseExecFunction("ottstpapihand", "stpapi.put.field(" & Chr(34) & sesion_baan & Chr(34) & "," & Chr(34) & "ticst001.pono" & Chr(34) & "," & Chr(34) & linea & Chr(34) & ")")
'MsgBox("linea puesta")

'baanobj.ParseExecFunction("ottstpapihand", "stpapi.put.field(" & Chr(34) & sesion_baan & Chr(34) & "," & Chr(34) & "ticst001.sitm" & Chr(34) & "," & Chr(34) & articulo & Chr(34) & ")")
baanobj.ParseExecFunction("ottstpapihand", "stpapi.put.field(" & Chr(34) & sesion_baan & Chr(34) & "," & Chr(34) & "issu.quan" & Chr(34) & "," & Chr(34) & cantidad & Chr(34) & ")")
MsgBox("cantidad puesta")

'Responder que Sí a "Entregar stocks inmediatamente?" Un 1 es que si; un 2, no.
baanobj.ParseExecFunction("ottstpapihand", "stpapi.enum.answer(" & Chr(34) & sesion_baan & Chr(34) & "," & Chr(34) & "ticst01011" & Chr(34) & "," & 1 & ")")
MsgBox("Contestado Que SI")

baanobj.ParseExecFunction("ottstpapihand", "stpapi.continue.process(" & Chr(34) & sesion_baan & Chr(34) & "," & Chr(34) & resul_AFS & Chr(34) & ")")
MsgBox("1 Continue process OK")

'=================================================================================================================================================================================
'A PARTIR DE AQUI .....

'baanobj.ParseExecFunction("ottstpapihand", "stpapi.change.view(" & Chr(34) & sesion_baan & Chr(34) & "," & Chr(34) & resul_AFS & Chr(34) & ")")

'baanobj.ParseExecFunction("ottstpapihand", "stpapi.put.field(" & Chr(34) & subsesion & Chr(34) & "," & Chr(34) & "pdno.f" & Chr(34) & "," & Chr(34) & OF & Chr(34) & ")")
'baanobj.ParseExecFunction("ottstpapihand", "stpapi.put.field(" & Chr(34) & subsesion & Chr(34) & "," & Chr(34) & "pdno.t" & Chr(34) & "," & Chr(34) & OF & Chr(34) & ")")
'baanobj.ParseExecFunction("ottstpapihand", "stpapi.put.field(" & Chr(34) & subsesion & Chr(34) & "," & Chr(34) & "opno.f" & Chr(34) & "," & Chr(34) & "0" & Chr(34) & ")")
'baanobj.ParseExecFunction("ottstpapihand", "stpapi.put.field(" & Chr(34) & subsesion & Chr(34) & "," & Chr(34) & "opno.t" & Chr(34) & "," & Chr(34) & "999" & Chr(34) & ")")
'MsgBox("Campos subsesion rellenos")

'baanobj.ParseExecFunction("ottstpapihand", "stpapi.continue.process(" & Chr(34) & subsesion & Chr(34) & "," & Chr(34) & resul_AFS & Chr(34) & ")")
'MsgBox("CP mandado a subsesion")

''Creo que no vale para nada
'baanobj.ParseExecFunction("ottstpapihand", "stpapi.set.report(" & Chr(34) & subsesion & Chr(34) & "," & Chr(34) & "rtisfc020701000" & Chr(34) & "," & Chr(34) & "D" & Chr(34) & "," & Chr(34) & resul_AFS & Chr(34) & ")")
'MsgBox("set report OK")
'baanobj.ParseExecFunction("ottstpapihand", "stpapi.continue.process(" & Chr(34) & subsesion & Chr(34) & "," & Chr(34) & resul_AFS & Chr(34) & ")")
'MsgBox("Continue process Subsesion OK")

'Especificar manejo de subsesiones
Dim subsesion As String = "tisfc0207s000"
baanobj.ParseExecFunction("ottstpapihand", "stpapi.handle.subproc(" & Chr(34) & sesion_baan & Chr(34) & "," & Chr(34) & subsesion & Chr(34) & "," & Chr(34) & "add" & Chr(34) & ")")
MsgBox("Gestion de sub.especificada")

'baanobj.ParseExecFunction("ottstpapihand", "stpapi.end.session(" & Chr(34) & subsesion & Chr(34) & ")")
'MsgBox("Subsesión finalizada")

baanobj.ParseExecFunction("ottstpapihand", "stpapi.end.session(" & Chr(34) & sesion_baan & Chr(34) & ")")
MsgBox("Sesión finalizada")

baanobj.Quit()
baanobj = Nothing

MsgBox("OK.Asociación hecha")
Catch
MsgBox(Err.Description)
End Try

fbernaus
29th June 2004, 11:57
Dorleta,

¿Como automatizaste la sesión ticst0101m000? No entiendo que utilidad te tenía automatizarla si finalmente no realizabas las entregas de stock.

El problema que tengo es que esa sesión llama a una subsesión que aparece y desaparece por sí sola, sin la intervención del usuario. No se como tratar esa subsesión en el programa AFS.

Te paso el código para que veas como lo estamos intentando desarrollar. Otra cosa, el listado de entregas resultante no nos interesa imprimirlo (ni por pantalla, ni por impresora). Muchas gracias por tu ayuda. Recibe un cordial saludo

Dim OF As String = "328385"
Dim linea As String = "170"
Dim cantidad As String = "10"

'Esta función realiza la asociación de un artículo con una OF en la cantidad especificada

Dim baanobj As Object
baanobj = CreateObject("Baan4.Application.baanivc4") '501
baanobj.Timeout = 300

Dim sesion_baan As String = "ticst0101m000" 'Introducir entregas para órdenes de fabricación
Dim save As Long = 1
Dim resul_AFS As String

'1.Localizar OF y linea de la OF
stpapi.put.field(" & Chr(34) & sesion_baan & Chr(34) & "," & Chr(34) & "ticst001.pdno" & Chr(34) & "," & Chr(34) & OF & Chr(34) & ")
stpapi.put.field(" & Chr(34) & sesion_baan & Chr(34) & "," & Chr(34) & "ticst001.pono" & Chr(34) & "," & Chr(34) & linea & Chr(34) & ")
stpapi.find(" & Chr(34) & sesion_baan & Chr(34) & ")

If baanobj.ReturnValue <> 1 Then 'será 1
stpapi.end.session(" & Chr(34) & sesion_baan & Chr(34) & ")")
baanobj.Quit()
baanobj = Nothing
MsgBox("OF inexistente")
Return
End If
MsgBox("OF Y LINEA encontradaS")

stpapi.put.field(" & Chr(34) & sesion_baan & Chr(34) & "," & Chr(34) & "issu.quan" & Chr(34) & "," & Chr(34) & cantidad & Chr(34) & ")

'Responder que Sí a "Entregar stocks inmediatamente?" Un 1 es que si; un 2, no.
stpapi.enum.answer(" & Chr(34) & sesion_baan & Chr(34) & "," & Chr(34) & "ticst01011" & Chr(34) & "," & 1 & ")

stpapi.continue.process(" & Chr(34) & sesion_baan & Chr(34) & "," & Chr(34) & resul_AFS & Chr(34) & ")

'En este momento, en la sesión manual, aparecería sin que el usuario haga nada, la subsesión tisfc0207s000, que es la subsesión propietaria del listado de la entrega realizada. Es a partir del código que viene donde no veo como gestionar la subsesión.
'===================================================

'Especificar manejo de subsesiones
Dim subsesion As String = "tisfc0207s000"
stpapi.handle.subproc(" & Chr(34) & sesion_baan & Chr(34) & "," & Chr(34) & subsesion & Chr(34) & "," & Chr(34) & "add" & Chr(34) & ")

'==========Ahora excepto las últimas instrucciones, todo el código aparece comentado==================='

'stpapi.change.view(" & Chr(34) & sesion_baan & Chr(34) & "," & Chr(34) & resul_AFS & Chr(34) & ")

'stpapi.put.field(" & Chr(34) & subsesion & Chr(34) & "," & Chr(34) & "pdno.f" & Chr(34) & "," & Chr(34) & OF & Chr(34) & ")
'stpapi.put.field(" & Chr(34) & subsesion & Chr(34) & "," & Chr(34) & "pdno.t" & Chr(34) & "," & Chr(34) & OF & Chr(34) & ")
'stpapi.put.field(" & Chr(34) & subsesion & Chr(34) & "," & Chr(34) & "opno.f" & Chr(34) & "," & Chr(34) & "0" & Chr(34) & ")
'stpapi.put.field(" & Chr(34) & subsesion & Chr(34) & "," & Chr(34) & "opno.t" & Chr(34) & "," & Chr(34) & "999" & Chr(34) & ")
'MsgBox("Campos subsesion rellenos")

'stpapi.continue.process(" & Chr(34) & subsesion & Chr(34) & "," & Chr(34) & resul_AFS & Chr(34) & ")")

'Creo que no vale para nada
'stpapi.set.report(" & Chr(34) & subsesion & Chr(34) & "," & Chr(34) & "rtisfc020701000" & Chr(34) & "," & Chr(34) & "D" & Chr(34) & "," & Chr(34) & resul_AFS & Chr(34) & ")
'MsgBox("set report OK")
'stpapi.continue.process(" & Chr(34) & subsesion & Chr(34) & "," & Chr(34) & resul_AFS & Chr(34) & ")")

'stpapi.end.session(" & Chr(34) & subsesion & Chr(34) & ")
'MsgBox("Subsesión finalizada")

baanobj.ParseExecFunction("ottstpapihand", "stpapi.end.session(" & Chr(34) & sesion_baan & Chr(34) & ")")
MsgBox("Sesión finalizada")

baanobj.Quit()
baanobj = Nothing
MsgBox("OK.Asociación hecha")

dorleta
29th June 2004, 18:34
Quizás no me he explicado bien.

En un principio respondía que no a las actualizaciones aunque después si actualizaba. te pongo el código.

function revertir.estandar()
{
db.retry.point()

select tdinv700.*
from tdinv700
where tdinv700.item between :item.f and :item.t
and tdinv700.trdt =:trdt.f
and tdinv700.orno between :orno.f and :orno.t
| and tdinv700.kost = tckost.prd.mat.issue
and tdinv700.kost = tckost.stc.transfer
and tdinv700.logn =:login
|order by tdinv700._index1
order by tdinv700.orno, tdinv700.pono
selectdo

resp = ""
resp = revertir.proceso2( tdinv700.orno, tdinv700.pono, tdinv700.quan)

if orden.tmp <> tdinv700.orno and orden.tmp > 0 then
proceso = wait.and.activate("tisfc0207snco")
endif

orden.tmp = tdinv700.orno
pono.tmp = tdinv700.pono

endselect

unction domain tcmcs.str80 revertir.proceso2( domain tcpdno pdno, domain tcpono pono, domain tcqiv1 cant)
{
table ttisfc001

domain tiqcp1 pdte
domain tcmcs.str80 ret
domain tcmcs.str80 ret2

ticst001.pdno = pdno
ticst001.pono = pono
tisfc001.pdno = pdno

orden = pdno
posicion = pono

opno.tmp = 1

select tisfc010.opno:opno.tmp
from tisfc010
where tisfc010._index1={:orden}
as set with 1 rows
selectdo
endselect

export("orden", orden)

revertir.find()

pdte = revertir.get.subsequent_delivery()
revertir.put.Issue( cant )
revertir.put.ticst001.opno(opno.tmp)
revertir.put.subsequent_delivery( pdte + cant * -1)

revertir.update( 1, ret)
if not isspace(ret) then
cadena = str$(pdno) & str$(pono) & str$(cant)
test = seq.puts(cadena, fp)
endif
revertir.save(ret2)
revertir.end()

return(ret)
}

Lo que hice en su momento ( hace un par de años y de manera un tanto cutre por las eternas prisas ) fue deshacer una serie de movimientos que alguien de mano ligera con los rangos realizó a través de la sesión tisfc0207m000. Como puedes ver deshace los movimientos pero no entrega y lanza la sesión tisfc0207mn00 cuando acaba de deshacer los mvtos de cada orden
Tuve que personalizar la tisfc0207mn00 para cuando es llamada desde esta que programé importe los valores de la OF y lanzara el listado de entregas contra un fichero de texto. Es fácil y funciona aunque no muy elegante. De todas formas creo que la solución a tu problema y el de Vanessa creo que será mas bien debido a no facilitarle el listado y el dispositivo a elegir con la función que en el "post" anterior os dejé. de todas formas podeis depurar y ver en que punto exacto y en cual de las dos sesiones se os cuelga.

Agur y suerte.