Duvida programação prepare environment

Estou com duvida no uso da função PREPARE ENVIRONMENT, quando trocar de filial perderá o conteúdo e posicionamento da tabela temporária (cAlSC7)?

Adicionado ==> Então pessoal, a ideia dessa rotina é mudar a filial no sistema, para gravar o msexecauto do pedido de compras conforme a informação da tabela temporária (cAlSC7)->C7_FILIAL.

Qual seria a melhor maneira? Também tentei a função abaixo, mas parece que não muda a filial.

RpcSetEnv(SM0->M0_CODIGO,(cAlSC7)->C7_FILIAL))

Por favor veja código abaixo:


(cAlSC7)->(dbGotop())

Do While (cAlSC7)->(!EOF())

   nOpc:=3

   _cFilial:=(cAlSC7)->C7_FILIAL

   PREPARE ENVIRONMENT EMPRESA "01" FILIAL &_cFilial MODULO "COM"


   DbSelectArea("SC7")

   SC7->(DbSetOrder(1))

   _cNumPed  :=GETSXENUM("SC7","C7_NUM")

   CONFIRMSX8()

   aCab :={}

   aItem:={}

   lMsErroAuto := .F.

   aCab := {{"C7_NUM"   ,_cNumPed           ,Nil},; //Num. Pedido

            {"C7_EMISSAO" ,(cAlSC7)->C7_EMISSAO ,Nil},; // Data de Emissao

            {"C7_FORNECE" ,(cAlSC7)->C7_FORNECE ,Nil},; // Fornecedor

            {"C7_LOJA"    ,(cAlSC7)->C7_LOJA    ,Nil},; // Loja do Fornecedor

            {"C7_COND"    ,(cAlSC7)->C7_COND    ,Nil},; // Condicao de pagamento

            {"C7_CONTATO" ,(cAlSC7)->C7_CONTATO ,Nil},; // Contato

            {"C7_FILENT"  ,(cAlSC7)->C7_FILENT  ,Nil}} // Filial Entrega

   _cChave:=(cAlSC7)->C7_FILIAL+(cAlSC7)->C7_NUM

   Do While (cAlSC7)->(!Eof()) .AND. (cAlSC7)->C7_FILIAL+(cAlSC7)->C7_NUM==_cChave

      Aadd(aItem,;

      {{"C7_ITEM"   ,(cAlSC7)->C7_ITEM    ,Nil},; //Numero do Item

       {"C7_PRODUTO",(cAlSC7)->C7_PRODUTO ,Nil},;  //Produto

       {"C7_QUANT"  ,(cAlSC7)->C7_QUANT   ,Nil},; //Quantidade

       {"C7_PRECO"  ,(cAlSC7)->C7_PRECO   ,Nil},; //Preco

       {"C7_DATPRF" ,(cAlSC7)->C7_DATPRF  ,Nil},; //Data De Entrega

       {"C7_TES"    ,(cAlSC7)->C7_TES     ,Nil},; //Tes

       {"C7_FLUXO"  ,(cAlSC7)->C7_FLUXO   ,Nil},; //Fluxo de Caixa (S/N)

       {"C7_NUMSC"  ,(cAlSC7)->C7_NUMSC   ,Nil},; //SC

       {"C7_ITEMSC" ,(cAlSC7)->C7_ITEMSC  ,Nil},; //SC ITEM

       {"C7_CC"     ,(cAlSC7)->C7_CC      ,Nil},; //CC

       {"C7_CONTA"  ,(cAlSC7)->C7_CONTA   ,Nil},; //CONTA

       {"C7_CLVL"   ,(cAlSC7)->C7_CLVL    ,Nil},; //CLVL

       {"C7_ITEMCTA",(cAlSC7)->C7_ITEMCTA ,Nil},; //ITEMCTA

       {"C7_XPROC"  ,(cAlSC7)->C7_XPROC   ,Nil},; //XPROC

       {"C7_LOCAL"  ,(cAlSC7)->C7_LOCAL   ,Nil}}) //Localizacao

       (cAlSC7)->(dbSkip())

   Enddo

   MSExecAuto({|v,x,y,z| MATA120(v,x,y,z)},1,aCab,aItem,nOpc) //{aItem}

   If lMsErroAuto 

      mostraerro("C:\TEMP\",_cNumPed)

      lMsErroAuto:=.F.

      Msginfo("Pedido de compras ocorreu inconsistência! Pedido WBC:"+ALLTRIM(_cWBC))

   Endif

   SC7->(dbSkip())

Enddo

RESET ENVIRONMENT

(cAlSC7)->( Dbclosearea() )

Agradeço desde já.

Bom dia Rodrigo, rodando esse POC, o que acontece? Gera alguma exceção?

Daniel, Hum, Nesta situação ele vai inicializar um ambiente para cada prepare enviroment que ele passar já que o reset enviroment está fora do laço, ou vai “sobrescrever” o ambiente aberto inicialmente automaticamente? Caso tenha limite de conexões de usuário, pode acontecer dele parar o processo quando não conseguir abrir mais ambientes?

Bom dia,

Acredito que não ate porque a variável esta recebendo valor antes do PREPARE ENVIRONMENT, mas o que aconteceu ?

Olá Tiago, a ideia dessa rotina é mudar a filial no sistema, para gravar o msexecauto do pedido de compras conforme a informação da tabela temporária (cAlSC7)->C7_FILIAL.

Qual seria a melhor maneira? Também tentei a função abaixo, mas parece que não muda a filial.

RpcSetEnv(SM0->M0_CODIGO,(cAlSC7)->C7_FILIAL))
Obrigado pelo retorno.

Boa tarde Rodrigo,

Analisando o código, existem muitos pontos que podem gerar problemas.

Focando na sua pergunta, o PREPARE ENVIRONMENT é ignorado quando você já encontra-se com o ambiente aberto, logo esse comando não vai surtir efeito na segunda chamada em diante e não, ele não deve gerar qualquer influência na posição de sua tabela temporária, o que ele pode fazer é trocar a workarea (dbselectarea).


Existem outros pontos de atenção:

A filial é setada conforme a filial presente na tabela temporária _cFilial:=(cAlSC7)->C7_FILIAL, mas e se for gestão corporativa, e se a filial estiver compartilhada de alguma forma? Ela pode até mesmo vir em branco.

Quando você solicita a numeração, você confirma na linha seguinte, caso alguma exceção ocorra, você terá problemas na sequência da numeração automática, o ideal era confirmar somente após ter certeza que a sua inserção foi realizada com sucesso.

O comando RESET ENVIRONMENT finaliza o ambiente, com isso, todas as tabelas são fechadas, então a linha abaixo dele que fecha o alias cAlSC7 pode gerar exceção pois essa workarea já se encontrará fechada.

Também fique atento quanto a performance, se o PREPARE ENVIRONMENT não fosse ignorado caso já executado, você estaria abrindo praticamente todos os dicionários no Protheus e conectando ao banco de dados por registro presente em sua tabela temporária, isso teria um custo altíssimo tanto de processamento quanto de memória.

Olá Daniel, a ideia dessa rotina é mudar a filial no sistema, para gravar o msexecauto do pedido de compras conforme a informação da tabela temporária (cAlSC7)->C7_FILIAL.

Qual seria a melhor maneira? Também tentei a função abaixo, mas parece que não muda a filial.

RpcSetEnv(SM0->M0_CODIGO,(cAlSC7)->C7_FILIAL))
Obrigado pelo retorno.

Boa noite Rodrigo, PREPARE ENVIRONMENT e RpcSetEnv são a mesma coisa =D

Boa tarde !

Neste caso, eu acho interessante usar a função StartJob.

Faria um função passando as informações por parâmetro e nela usaria o PREPARE ENVIRONMENT e RESET ENVIRONMENT.

Como o StartJob roda em uma instância à parte, vc não perderia a posição do ponteiro no arquivo temporário.