Perguntas chamada de função SQL 2008 utilizando DBO em minúsculo

Mais
7 anos 10 meses atrás - 7 anos 10 meses atrás #30775 por roberto.junior@maxgear.com.br
Bom dia, Srs!

Amigos, preciso de uma ajuda, se possível:

Utilizo como banco de dados aqui na empresa o SQL 2008, funciona muito bem. O schema padrão é o dbo (minusculo) como de padrão, porém, precisei criar uma função scalar dentro do banco para acionamento juntos de outras querys, jóia, dentro do SQL funciona muito bem e de forma bem prática, porémmmmmm, quando eu informo a chamada da função dentro de uma rotina ADVPL, o dbo (minusculo) vira DBO (maiusculo) e o SQL retorna falso pois não encontra o nome da função em maiusculo, o bendito é case sensitive.

Já tentei chamar a função dentro das rotinas com o ChangeQuery e com BeginSql padrão e os dois retornam o DBO em maiusculo, vejam o fonte:

função:
ALTER FUNCTION FN_GET_SUM_ZZA(	@NUM CHAR(6),
										@ITEM CHAR(4),
										@PROD CHAR(15))
RETURNS FLOAT AS 
BEGIN
	declare @retval float;
	
	SET @retval = (
		SELECT SUM(ZAA_.ZAA_QTDE).....

Chamada da função:
Select A1_RESPMAX                                 A1_RESPMAX, 
             SUM(CASE WHEN SB1.B1_GRUPO = '0603' THEN (C6_QTDVEN-IsNull(dbo.FN_GET_SUM_ZZA(SC6.C6_NUM,SC6.C6_ITEM,SC6.C6_PRODUTO),0))  ELSE 0 END )    AS  QRY_GRP1....

Reparem que o dbo chamado na função é minusculo, conforme padrão do dbo do SQL, porém, no momento do processamento, o sistema (totvs) parece dar um UPPER na string passada e deixa o dbo como DBO (maiusculo), fazendo então o SQL devolver com erro.

Criei também um novo schema com DBO maiusculo, ai funciona tudo ok, o problema é o tempo de processamento que em algumas querys vai de 30 segundos de antes pra 5 minutos com schema diferente do dbo padrão (minusculo).

Alguém já passou por isso ? Conseguiria por favor me direcionar a alguma saída ?

Muito Obrigado!!!
Abraços
Roberto
Ultima edição: 7 anos 10 meses atrás por roberto.junior@maxgear.com.br.

Por favor Acessar ou Registrar para participar da conversa.

Mais
7 anos 10 meses atrás #30777 por angeloprotti1
Boa tarde Roberto
Mostra como voce faz dentro do advpl esta chamada
Abraço

Por favor Acessar ou Registrar para participar da conversa.

Mais
7 anos 10 meses atrás #30778 por kanaamlrr
Se você estiver utilizando o comando ChangeQuery, remova-o do código, ele pode estar fazendo sua string ficar toda maiúscula.
Caso não esteja usando, poste o trecho do seu código da chamada da query.
Abraço!

Por favor Acessar ou Registrar para participar da conversa.

Mais
7 anos 10 meses atrás #30779 por roberto.junior@maxgear.com.br
Olá Srs!

Exatamente Kanaãm! Removendo a ChangeQuery o dbo se mantem em minusculo, como já passado na query. O problema continua acontecendo com o begin sql, por algum motivo ele da UPPER na string toda e manda em maiusculo pro SQL, que retorna erro.

A chamada da ChangeQuuery está assim:
cQuery := "Select SUM(SC6.C6_QTDVEN-IsNull(dbo.FN_GET_SUM_ZZA(SC6.C6_NUM,SC6.C6_ITEM,SC6.C6_PRODUTO),0)-SC6.C6_QTDENT)   AS QRY_CARTEIRA..."
A chamada do BeginSQL está assim:
BeginSql Alias cAliasQ
      
       Select A1_RESPMAX                                A1_RESPMAX, 
              ZCB_CODIGO                                ZCB_CODIGO,
              ZCB_MERC                                  ZCB_MERC,
             //PEDIDOS NO MES            
             (SELECT 
                   SUM( CASE WHEN SC5.C5_MOEDA = 1 THEN ((C6_QTDVEN-IsNull(dbo.FN_GET_SUM_ZZA(SC6.C6_NUM,SC6.C6_ITEM,SC6.C6_PRODUTO),0))*C6_PRCVEN  )....

Reparem que em ambos os casos, o dbo se mantem minusculo, porém, no beginSQL é que acontece o problema.

Uma outra coisa que percebi também foi o tempo de processamento, quando utilizo a função na chamada da query, o tempo é muito maior sem eu a chamar. O conteúdo da função é o abaixo, se eu o insiro no query o processamento é de imediato, se eu chamo a função na query o processamento demora minutos a mais...

Existe alguma coisa errada na minha função? Ela retorna apenas um número que é calculado.
USE [EMPRESA_Desenvolvimento]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER FUNCTION [dbo].[FN_GET_SUM_ZZA](@NUM CHAR(6), @ITEM CHAR(4), @PROD CHAR(15))
RETURNS FLOAT AS 
BEGIN
	declare @retval float;
	SET @retval = (
		SELECT SUM(ZAA_.ZAA_QTDE)
		FROM ZAA010 ZAA_ , ZA9010 ZA9_
		WHERE  
			ZA9_.ZA9_CONSID = 'S' 
			AND ZAA_.ZAA_MOTIVO = ZA9_.ZA9_MOTIVO 
			AND ZAA_.ZAA_NUM	= @NUM
			AND ZAA_.ZAA_ITEM	= @ITEM
			AND ZAA_.ZAA_COD	= @PROD
			AND ZAA_.D_E_L_E_T_	= ' ' 
			AND ZA9_.D_E_L_E_T_	= ' ' )
							
	RETURN @retval;
END

Agradeço mais uma vez a ajuda de todos os amigos.
Um abraço.
Roberto.

Por favor Acessar ou Registrar para participar da conversa.

Mais
7 anos 10 meses atrás #30780 por kanaamlrr
Roberto,
Utilizando o BeginSql, internamente ele faz a conversão do changequery, ou seja, deixa tudo maiúsculo.
Para o teu caso o ideal seria não utilizar essa ferramenta.

Considerando a questão da função, acho que você poderia resolver com a query abaixo:
Select SUM(SC6.C6_QTDVEN-IsNull((SELECT SUM(ZAA_.ZAA_QTDE)
		FROM ZAA010 ZAA_ , ZA9010 ZA9_
		WHERE  
			ZA9_.ZA9_CONSID = 'S' 
			AND ZAA_.ZAA_MOTIVO = ZA9_.ZA9_MOTIVO 
			AND ZAA_.ZAA_NUM	= SC6.C6_NUM
			AND ZAA_.ZAA_ITEM	= SC6.C6_ITEM
			AND ZAA_.ZAA_COD	= SC6.C6_PRODUTO
			AND ZAA_.D_E_L_E_T_	= ' ' 
			AND ZA9_.D_E_L_E_T_	= ' ' ),0)-SC6.C6_QTDENT)   AS QRY_CARTEIRA...

Acho que vai melhorar teu desempenho e evitar os problemas na chamada da função.
Apesar que para melhor performance da query é recomendável não se utilizar de sub-querys.

Caso queira, poste sua query e vemos se é possível otimizá-la.
Abraço!

Por favor Acessar ou Registrar para participar da conversa.

Mais
7 anos 10 meses atrás #30781 por roberto.junior@maxgear.com.br
Kanaãm,

Agradeço mais uma vez o retorno.

Já tentei da forma que citou, porém o SQL retorna um erro na subselect aonde está o SUM, indicando "Cannot perform an aggregate function on an expression containing an aggregate or a subquery."

A query é essa:
Select SUM(SC6.C6_QTDVEN-IsNull((SELECT SUM(ZAA_.ZAA_QTDE) FROM ZAA010 ZAA_ , ZA9010 ZA9_ WHERE ZA9_.ZA9_CONSID = 'S' AND ZAA_.ZAA_MOTIVO = ZA9_.ZA9_MOTIVO AND ZAA_.ZAA_NUM	= SC6.C6_NUM AND ZAA_.ZAA_ITEM	= SC6.C6_ITEM AND ZAA_.D_E_L_E_T_ = ' ' AND ZA9_.D_E_L_E_T_	= ' '),0)-SC6.C6_QTDENT)   AS QRY_CARTEIRA,
         SB1.B1_COD                                                 AS QRY_PRODUTO
   From  SC6010  SC6
   INNER JOIN SB1010 SB1
   ON    SB1.B1_COD = SC6.C6_PRODUTO
     AND SB1.B1_TIPO = 'PA'
     AND SB1.B1_MSBLQL  <> '1'
     AND SB1.D_E_L_E_T_    <> '*'
   INNER JOIN  SC5010 SC5
   ON    SC5.C5_TIPO    =  'N'
     AND SC5.C5_NUM     = '076264'
     AND SC5.C5_NUM     = SC6.C6_NUM 
     AND SC5.C5_EMISSAO >= '20160301'
     AND SC5.C5_EMISSAO <= '20160331'
     AND SC5.D_E_L_E_T_    <> '*'
   INNER JOIN  SF4010 SF4  
   ON    SF4.F4_CODIGO  =  SC6.C6_TES
     AND SF4.F4_TESVEN  = 'S'
     AND SF4.D_E_L_E_T_  <> '*'
     WHERE SC6.D_E_L_E_T_    <> '*'
     GROUP BY SB1.B1_COD
     ORDER BY QRY_PRODUTO

Anteriormente era a abaixo, porém, precisei modifica-la pois o retorno da tabela ZAA não é mais único conforme a comparação do subselect, agora o retorno é multiplo, o que 'crasha' a execução da query:
Select SUM(SC6.C6_QTDVEN-IsNull(ZAA1.ZAA_QTDE,0)-SC6.C6_QTDENT)   AS QRY_CARTEIRA,
         SB1.B1_COD                                                 AS QRY_PRODUTO
   From  SC6010 SC6
   INNER JOIN  SB1010 SB1
   ON    SB1.B1_COD = SC6.C6_PRODUTO
     AND SB1.B1_TIPO = 'PA'
     AND SB1.B1_MSBLQL  <> '1'
     AND SB1.D_E_L_E_T_    <> '*'
   INNER JOIN  SC5010 SC5 
   ON    SC5.C5_TIPO    =  'N'
     AND SC5.C5_NUM     = '076264'
     AND SC5.C5_NUM     = SC6.C6_NUM 
     AND SC5.C5_EMISSAO >= '20160301'
     AND SC5.C5_EMISSAO <= '20160331'
     AND SC5.D_E_L_E_T_    <> '*'
   INNER JOIN  SF4010 SF4
   ON    SF4.F4_CODIGO  =  SC6.C6_TES
     AND SF4.F4_TESVEN  = 'S'
     AND SF4.D_E_L_E_T_  <> '*'
   LEFT JOIN ZAA010 ZAA1
   ON  ZAA1.ZAA_NUM  = SC6.C6_NUM 
     AND ZAA1.ZAA_ITEM = SC6.C6_ITEM 
     AND ZAA1.D_E_L_E_T_    <> '*'
     AND ZAA1.ZAA_NUM + ZAA1.ZAA_ITEM = ( SELECT  ZAA_.ZAA_NUM + ZAA_.ZAA_ITEM
                                                         FROM ZAA010 ZAA_, ZA9010 ZA9_ 
                                                         WHERE  ZA9_.ZA9_CONSID = 'S'
                                                            AND ZAA_.ZAA_MOTIVO = ZA9_.ZA9_MOTIVO 
                                                            AND ZAA_.ZAA_MOTIVO = ZA9_.ZA9_MOTIVO
                                                            AND ZAA_.ZAA_NUM    = SC6.C6_NUM 
                                                            AND ZAA_.ZAA_ITEM   = SC6.C6_ITEM 
                                                            AND ZAA_.ZAA_COD    = SC6.C6_PRODUTO 
                                                            AND ZAA_.D_E_L_E_T_    <> '*'
                                                            AND ZA9_.D_E_L_E_T_    <> '*')
   WHERE SC6.D_E_L_E_T_    <> '*'
   GROUP BY SB1.B1_COD
   ORDER BY QRY_PRODUTO

A utilização da função na chamada do sum do subselect resolveu o meu problema, porém, o tempo ficou muito maior na execução, em uma consulta de 30 segundos eu perco quase 5 minutos hoje, não sei se algo implica em relação a performance quando a função é chamada trocentas vezes, talvez sim.

A função substitui o ZAA_QTDE no subselect, devolvendo a soma já calculada.

Obrigado pela ajuda amigo!
Abraço.

Por favor Acessar ou Registrar para participar da conversa.

Tempo para a criação da página:0.106 segundos
Joomla templates by a4joomla