|
Bem Vindo, Visitante
|
Todos os Fórums
ADVPL
|
Imprimir
Enviar Para um Amigo Precisa estar Logado
|
|
|
Assunto: |
Executar Procedure em ADVPL |
|
Versão: |
12.1.25 |
|
Plataforma: |
Microsoft |
Complemento: |
|
|
DB: |
Oracle |
Complemento: |
|
|
|
|
|
Mensagem do
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. |
|
|
Mensagem do
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?
|
|
|
Mensagem do
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
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.
|
|
|
Mensagem do
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
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. |
|
|
Mensagem do
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
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
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
|
|