PERGUNTAS E RESPOSTAS
 
Bem Vindo, Visitante  Todos os Fórums
  ADVPL
Enviar para a impressoraImprimir  Enviar e-mail para um amigoEnviar Para um Amigo
Precisa estar Logado

Subject Assunto:
Executar Procedure em ADVPL
Versão:
12.1.25
Plataforma:
Microsoft
Complemento:
DB:
Oracle
Complemento:
LinkedIn
Mensagem do Enviar e-mail Abrir o Perfil do usuário EMSANTOS16 EMSANTOS16 em 02/06/2020, 21:43 h
Local: SP  Registro: 08/11/2016  Postagens: 11
Boa noite,

Preciso executar uma procedure (que executa um select simples em uma tabela) dentro de uma rotina customizada, antes de realizar os tratamentos seguintes nas funções.
Minhas dúvidas:
1 - Há uma forma de executá-la e trazer as informações para que eu possa utilizar já na mesma rotina?
2 - Caso não haja, apenas executando ela antes já me ajudaria. Tentei pela função TCSPExec, mas acredito que não esteja passando os parâmetros corretos, pois o array não traz informações.

Usei como exemplo: https://tdn.totvs.com/display/tec/TCSPExec

Se alguém tiver algum outro exemplo, eu agradeço.

Obrigado.

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário EMERSON.EN EMERSON.EN em 03/06/2020, 15:10 h
Local: SP  Registro: 20/08/2010  Postagens: 670
se você seguiu o exemplo deveria funcionar.

você pode publicar o cabeçalho da tua sp e também o código advpl que implementou pra executá-la?


Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário LEOGR85 LEOGR85 em 03/06/2020, 15:46 h
Local: ES  Registro: 05/11/2012  Postagens: 16
Boa tarde,

EMSANTOS16, eu ja usei dessa forma que vc citou, mas determinados casos eu utilizo da seguinte forma:


Local cAliasAUX := GetNextAlias()     
     
BeginSql alias cAliasAUX
     %NoParser%

     exec SP_SALDO_ATUAL
          @GRUPO = ‘013C‘
          ,@GRAU = -7
          ,@CODCLIENTE = ‘004949‘
          ,@LOJACLIENTE = ‘01‘

EndSql

While ( cAliasAUX->(!Eof()))     

     cAliasAUX->(dbSkip())
EndDo

cAliasAUX->(dbCloseArea())     

Mensagem do Enviar e-mail Abrir o Perfil do usuário EMSANTOS16 EMSANTOS16 em 04/06/2020, 08:54 h
Local: SP  Registro: 08/11/2016  Postagens: 11
Obrigado pela ajuda pessoal.

Tivemos algumas mudanças nos processos internos, então agora, preciso apenas executar a procedure via código.
Testei algumas formas, mas ainda sem sucesso, mas acho que posso não estar entendendo a sintaxe de como executa-la em ADVPL. Os exemplos que estou usando como teste:

Procedure simples:



CREATE OR REPLACE PROCEDURE "EXECTESTE" (
vFILIAL     in   CHAR,
vCOD_CIDADE in VARCHAR2,
vUFP        in CHAR,
vRecno      in CHAR,
vOPR        in CHAR)
IS
    
    vFilia CHAR( 4 );
    vCodcidade VARCHAR2( 40 );
    vEstado CHAR( 2 );
    vRecnum INTEGER;
    vValor CHAR( 1 );
    vEXCEPTION EXCEPTION;
BEGIN   
IF (vOPR = ‘I‘) THEN
    INSERT INTO ZA3010( ZA3_FILIAL, ZA3_NOME, ZA3_UF, R_E_C_N_O_) VALUES (vFILIAL, vCOD_CIDADE, vUFP,vRecno);
    COMMIT;
ELSE
    RAISE vEXCEPTION;
END IF;
EXCEPTION
    WHEN vEXCEPTION THEN NULL;
END EXECTESTE;

No fonte, também bem simples, estou tentando executar:

User Function ExepPROD()

Local cFilIni := ‘0101‘
Local cNomec := ‘BUENOS AIRES‘
Local cEstado := ‘AR‘
Local nRecno := 10
Local cOpcao := "I"


     If TCSPExist("EXECTESTE")
          TCSPEXEC("EXECTESTE",cFilIni,cNomec,cEstado,nRecno,cOpcao)
               alert("OK")
          else
               alert(‘Erro na execução da Stored Procedure : ‘+TcSqlError())
     ENDIF

Return

Desde já gradeço pela ajuda.


Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário EMERSON.EN EMERSON.EN em 04/06/2020, 13:13 h
Local: SP  Registro: 20/08/2010  Postagens: 670
mas a SP está sendo encontrada?
If TCSPExist("EXECTESTE") // isto é verdadeiro?

aliás, qual o banco de dados utilizado?

Mensagem do Enviar e-mail Abrir o Perfil do usuário EMSANTOS16 EMSANTOS16 em 05/06/2020, 11:55 h
Local: SP  Registro: 08/11/2016  Postagens: 11
Emerson o nosso banco aqui é Oracle.

Sim. Tive alguns avanços. Já consigo executar a procedure executando esse código:

If TCSPExist("EXECTESTE") // SIM, AQUI ELE RETORNA .T.
aResult := TCSPEXEC( "AAAA", cFilIni, cNomec, cEstado, cRecno, cOpcao) //AQUI EXECUTA NORMAL, CONSIGO CONFIRMAR VIA BANCO.
   If Empty( aResult ) // MAS AQUI ELE CONTINUA MOSTRANDO NULL
     alert(‘Erro na execução da Stored Procedure : ‘ + TcSqlError() )
   Else
     VarInfo( ‘aResult‘, aResult )
   Endif
Endif

Return( Nil )

Já aproveitando o ensejo, tentei usar o exemplo do LEOGR85 para já usar o retorno da procedure no mesmo fonte, mas sem sucesso. Existe alguma outra forma?

Obrigado.

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário LEOGR85 LEOGR85 em 05/06/2020, 13:40 h
Local: ES  Registro: 05/11/2012  Postagens: 16
Ah sim EMSANTOS16, utilizo da forma que descrevi em MSSQL, e funciona perfeitamente. Eu Souber aqui de algo, informarei.

Mensagem do Enviar e-mail Abrir o Perfil do usuário DON.JUNIOR DON.JUNIOR em 05/06/2020, 13:47 h
Local: RJ  Registro: 24/01/2016  Postagens: 152
EMSANTOS, não tem mistério, a documentação Totvs é bem clara.

https://tdn.totvs.com/display/tec/TCSPExec

Se sua procedure retorna dados corretamente, a variável aResult deve estar populada com o retorno da procedure.

Para varrer esse "array" (aResult), terá que usar um FOR ou WHILE.

Uma alternativa é não receber retorno da procedure, gravando dados em uma tabela fora do Protheus, e depois com TcLink ler os dados dessa tabela; mas neste caso teria que avaliar sua necessidade.

No seu caso, eu colocaria um ponto de parada na chamada da procedure do seu fonte, pegaria os parâmentros passados e executaria ela "por fora" para ver se realmente ela é executada perfeitamente.


Att.
Don Junior

Mensagem do Enviar e-mail Abrir o Perfil do usuário EMSANTOS16 EMSANTOS16 em 09/06/2020, 11:03 h
Local: SP  Registro: 08/11/2016  Postagens: 11
Obrigado pessoal.

Estou validando todas as sugestões passadas. Conseguindo, volto aqui para informar como fiz.

Para postar no Fórum você precisa efetuar o seu login ou se registrar

 Mudar para Fórum

 

 

 
 
   
Pagina Principal Shopping PROTHEUS Tire suas duvidas Vagas Microsiga em todo Brasil Aprofunde seus conhecimentos Noticias Online Fale Conosco Pagina Principal