on 09-17-2014 4:00 PM
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
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...
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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
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
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.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
107 | |
12 | |
11 | |
6 | |
6 | |
4 | |
4 | |
3 | |
3 | |
3 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.