cancel
Showing results for 
Search instead for 
Did you mean: 

Consulta Formatada - Procedimento de Aprovação

former_member209021
Active Participant
0 Kudos

Olá Experts,

Estou batendo cabeça com um procedimento de autorização baseado em uma consulta formatada e preciso da ajuda dos companheiros.

Até onde entendo, para se usar uma consulta formatada em Procedimento de Autorização, é necessário retornar "TRUE" no código sql da consulta, e isso as minhas consultas, fazem de acordo com o contexto. Porem, quando coloco em pratica na rotina de aprovação, nada acontece...

A razao da consulta é checar se o somatorio das quantidades no Pedido de Venda é maior que o somotario das quantidades na Cotação de Venda... quando rodo a consulta a partir do documento de marketing destino (pedido de venda) vejo que o retorno atende aos criterios que estou passando (print anexo), mas o pedido nao cai para a aprovação...

Tenho dividas se o problema está na sintaxe da consulta.

Ja fiz varias alterando a sintaxe e em todas chego no resultado desejado... (ver abaixo):

Onde está o numero "10 " uso uma variável que é o numero do documento base (numero da cotação): $[Rdr1.BaseEntry]

Sintaxe 1 (mais simples)

-------------------------------------------------

Declare

@qtCota Numeric(10,4),

@qtPed Numeric(10,4)

Set @qtCota = (select SUM(Quantity) from qut1 where DocEntry = 10 and unitMsr = 'M2'

group by DocEntry)

Set @qtPed = (select SUM(Quantity) from rdr1 where BaseEntry = 10 and unitMsr = 'M2'

group by BaseEntry)

If @qtPed > @qtCota

  Begin

  select 'True', @qtPed as Ped, @qtCota as Cota

  End

Else

  Begin

  select 'false'

  End

----------------------------------------------------------------------------

Sintaxe 2 (um pouco mais complexa para aprofundar o resultado)

--------------------------

Declare

@qtCota Numeric(10,4),

@numCota Numeric,

@qtPed Numeric(10,4)

Set @numCota = (Select distinct rdr1.BaseEntry from Rdr1 inner join Ordr on Rdr1.DocEntry = 10)

Select 'true',

(select SUM(Quantity) from rdr1 where BaseEntry = @numCota and unitMsr = 'M2' group by BaseEntry) as Ped ,

(select SUM(Quantity) from qut1 where DocEntry = @numCota and unitMsr = 'M2' group by DocEntry) as Cota

from ORDR a

     inner join RDR1 b on a.DocEntry = b.DocEntry

     inner join QUT1 c on b.BaseEntry = c.DocEntry

     where b.BaseEntry = @numCota

     Group by

     c.DocEntry,

     b.BaseEntry

     Having (select SUM(Quantity) from rdr1 where BaseEntry = @numCota and unitMsr = 'M2'

  group by BaseEntry) >

  (select SUM(Quantity) from qut1 where DocEntry = @numCota and unitMsr = 'M2'

  group by DocEntry)

-------------------------------------------------------------------

Sintaxe 3

------------------------

Declare

@qtCota Numeric(10,4),

@numCota Numeric,

@qtPed Numeric(10,4)

Set @numCota = (Select distinct rdr1.BaseEntry from Rdr1 inner join Ordr on Rdr1.DocEntry = 10)

Select

case when

(select SUM(Quantity) from rdr1 where BaseEntry = @numCota and unitMsr = 'M2'  group by BaseEntry) >

(select SUM(Quantity) from qut1 where DocEntry = @numCota and unitMsr = 'M2'  group by DocEntry)

Then 'true'

else 'false'

End

Alguem consegue me dar uma dica que ajude a resolver essa bronca?

Saudações

Wagner Bezerra

Accepted Solutions (0)

Answers (4)

Answers (4)

former_member209021
Active Participant
0 Kudos

Boa tarde amigos,

Consegui resolver a situação.

Definitivamente, para o meu caso não tinha como realizar o teste direto via consulta formatada, antes do documento inserido, visto que os testes no nivel de linhas não me retornam os valores a serem comparados. O que funcionou então:

Criei um pequeno codigo na Transaction Notification onde consigo testar minha condição na Inclusao ou Update...

Criei um campo de usuario para o pedido de venda "U_Aprovacao" que recebe 'NAO' por default e se a minha condição for atendida ele é atualizado para 'SIM'...

Desta forma, criei uma consulta formatada retornando 'True' se o campo "U_Aprovacao" = 'SIM'...

Pela hierarquia do SAP, os codigos da Transaction vem antes dos testes dos Procedimentos de Autorização...

Linhas da Transacation:

  if @object_type in ('17')  --Pedido de Venda

  and @transaction_type in ('A','U')  --Inserir ou atualizar

 

  Begin

  Declare

     @BaseEntry int

         

         if @object_type = '17'

            begin

             Set @BaseEntry = (Select rdr1.BaseRef from RDR1 left join ORDR on ORDR.DocEntry = RDR1.DocEntry

    Where ORDR.DocEntry = @list_of_cols_val_tab_del )

            end

  if (select SUM(Quantity) from qut1 where DocEntry =  @BaseEntry and unitMsr = 'M2' group by DocEntry) <

  (select SUM(Quantity) from rdr1 where BaseEntry = @BaseEntry and unitMsr = 'M2' group by BaseEntry)

  Begin

  Update ORDR set Ordr.U_Aprovacao = 'SIM' Where DocEntry = @list_of_cols_val_tab_del

  End

    

      End --<Fim>

Obs.: ainda estou fazendo em ambiente de testes pois as NOTAS SAP estao me deixando confuso. Umas dizem ser permitido o update em campos de usuario, outras dizem que nao... algumas sugerem a atualização via consulta formatada, outras sugerem a transaction... entao na duvida, ambiente de testes...

Former Member
0 Kudos

Olá Wagner Valerio Bezerra.

Tentei efetuar o procedimento que você passou em ambiente de teste e não funcionou para mim.

Poderia passar uma exemplo da consulta na transaction e a consulta da alçada de aprovação para eu poder testar aqui?

Att

Everton Silva

Former Member
0 Kudos

Boa tarde Wagner.

Testei aqui criar na PostTransactionNotice um UPDATE que muda o conteúdo de um campo de usuário dependendo da situação.

Mas não funcionou, porque o processo de Autorização acontece antes da execução da Transaction.

Att.

Augustus

former_member186712
Active Contributor
0 Kudos

Bom dia Wagner,

Só se pode fazer PA com as variabeis dos cabecalhos dos docs.

Não podes fazer Procedimentos de Aprovação (PA) utilizando as linhas dos documentos.

Nos pedidos, se não queres que o utilizador aceite quantidades superiores às qtds das cotações,a minha sugestão é que faças um Pesquisa formata na quantidade do pedido e se o utilizador digitar uma qtd superior à qtd da cotação, re-escreves a qtd do cotação na qtd.

Tens sempre a possibilidades de criar um Add'On para esta funcionalidade.

Abraço do outro lado do Atlantico


Former Member
0 Kudos

Bom dia

   Só para informar Augusto que o SAP funciona com Autorizações a nível de linhas dos documentos sim, tenho funcionando uma que conseguir rodar com a ajuda dos usuários deste fórum que testa se a quantidade de uma linha da nota fiscal é igual a do pedido.

former_member209021
Active Participant
0 Kudos

bom dia Leila...

Se há a possibilidade de elaborar um PA com base em linhas de documento, qual a sugestao que voce me daria para este caso?

Preciso testar se o somatorio das quantidades das linhas do pedido são maiores que as quantidades das linhas da cotacao de origem...

Grato

former_member186712
Active Contributor
0 Kudos

Bom dia Leila e Wagner,

Leila se tiver um exemplo de uma Perquisa Formatada (PF) ou PA com um somatório das qtds do documento onde queremos a PF ou PA, neste caso Pedido de Venda, por favor disponibilize um exemplo porque eu já perdi muitas dias adicionando código nos meus Add-ons para resolver esta mesma necessidade.

Na minha opinião modesta opinião não funciona.

Com o mesmo exemplo fiz uma PA que em vez de retornar True faz uma update num UDF com o resultado.

update ordr set U_Sremarks = ' is ' + CAST(@qtCota as nvarchar(20)) + IsNull(CAST(@qtPed as nvarchar(20)), 0)
where docentry = 1

O que verifico é que a @qtPed não tem valor. A minha conclusão é que quando o PA dispara ainda não temos nada no RDR1 porque o B1 ainda não sabe se grava o documento no ORDR ou no ODRF (drafts)

Solução para este problema, como anteriormente eu escrevi, criar um Add-on, uma PF que se o utilizador digitar uma qtd superior automaticamente a PF regrave a qtd que está na Cotação.

Outra solução pode ser um query assim:

SELECT Distinct 'TRUE' FROM QUT1 T0 WHERE t0.docentry = $[$38.45.number] and  T0.[LineNum]  = $[$38.46.0] and T0.Quantity <> $[$38.11.number]

Este compara linha a linha se as qtds sao iguais mas não compara o Somatório dos documentos.

Wagner,

Depois diz-me o te feedback em relação à minha proposta

Abraços

Former Member
0 Kudos

Bom dia

SELECT

  DISTINCT

  'TRUE'

FROM

  POR1 T0

WHERE

  T0.DocEntry = $[$38.45.number] AND

  T0.ItemCode = $[$38.1.text] AND

  T0.[PriceAfVAT] <> $[$38.20.number]

Esta Consulta Formatada testa se meu Preço Bruto do Item da Nota Fiscal é igual ao do Pedido se for diferente ele pede Autorização.

È Só mudar os campos que que testar.

Espero ter Ajudado

former_member209021
Active Participant
0 Kudos

Bom dia Leila,

Seu codigo é perfeito, mas no meu caso, por algum motivo os codigos que tenho testato nao retornam o valor que estou recuperar em tempo de execução...

Ou seja, para o meu caso, nao tem jeito mesmo!

Obrigado pela ajuda!

former_member209021
Active Participant
0 Kudos

boa noite Rodrigo...

Pois é cara, ja até fiz esse teste também ($[$38.45.0]) que me retorna o rdr1.baseentry,  e mesmo assim não funciona...

Se tiver alguma outra dica, por favor, manda ai!

Abraço.

0 Kudos

Caro Wagner,

     você precisa utilizar as variáveis de tela do SAP, como é um pedido de venda que ainda não foi inserido, as informações estão na tela e não no banco. Tenta a variável de tela que você vai conseguir.