- Fórum
- Protheus/Microsiga/Totvs
- Instalação e Configuração Protheus
- Banco de Dados
- chamada de função SQL 2008 utilizando DBO em minúsculo
Perguntas chamada de função SQL 2008 utilizando DBO em minúsculo
- roberto.junior@maxgear.com.br
- Autor do Tópico
- Desconectado
- Membro Iniciado
Menos
Mais
- Postagens: 11
- Obrigados Recebidos: 0
8 anos 4 meses atrás - 8 anos 4 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:
Chamada da função:
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
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: 8 anos 4 meses atrás por roberto.junior@maxgear.com.br.
Por favor Acessar ou Registrar para participar da conversa.
- angeloprotti1
- Desconectado
- Membro Júnior
Menos
Mais
- Postagens: 28
- Obrigados Recebidos: 0
8 anos 4 meses atrás #30777
por angeloprotti1
Respondido por angeloprotti1 no tópico chamada de função SQL 2008 utilizando DBO em minúsculo
Boa tarde Roberto
Mostra como voce faz dentro do advpl esta chamada
Abraço
Mostra como voce faz dentro do advpl esta chamada
Abraço
Por favor Acessar ou Registrar para participar da conversa.
- kanaamlrr
- Desconectado
- Membro Platina
Menos
Mais
- Postagens: 1576
- Obrigados Recebidos: 4
8 anos 4 meses atrás #30778
por kanaamlrr
Respondido por kanaamlrr no tópico chamada de função SQL 2008 utilizando DBO em minúsculo
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!
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.
- roberto.junior@maxgear.com.br
- Autor do Tópico
- Desconectado
- Membro Iniciado
Menos
Mais
- Postagens: 11
- Obrigados Recebidos: 0
8 anos 4 meses atrás #30779
por roberto.junior@maxgear.com.br
Respondido por roberto.junior@maxgear.com.br no tópico chamada de função SQL 2008 utilizando DBO em minúsculo
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:A chamada do BeginSQL está assim:
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.
Agradeço mais uma vez a ajuda de todos os amigos.
Um abraço.
Roberto.
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..."
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.
- kanaamlrr
- Desconectado
- Membro Platina
Menos
Mais
- Postagens: 1576
- Obrigados Recebidos: 4
8 anos 4 meses atrás #30780
por kanaamlrr
Respondido por kanaamlrr no tópico chamada de função SQL 2008 utilizando DBO em minúsculo
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:
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!
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.
- roberto.junior@maxgear.com.br
- Autor do Tópico
- Desconectado
- Membro Iniciado
Menos
Mais
- Postagens: 11
- Obrigados Recebidos: 0
8 anos 4 meses atrás #30781
por roberto.junior@maxgear.com.br
Respondido por roberto.junior@maxgear.com.br no tópico chamada de função SQL 2008 utilizando DBO em minúsculo
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:
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:
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.
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.
- Fórum
- Protheus/Microsiga/Totvs
- Instalação e Configuração Protheus
- Banco de Dados
- chamada de função SQL 2008 utilizando DBO em minúsculo
Tempo para a criação da página:0.126 segundos