 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Seg Fev 06, 2017 10:41 am Assunto: Usar o comando count no select? |
|
|
Tem como usar o count neste select?
| Código: | -- Para incluir na tela inicial dos produtos
SELECT
p.id,
g.id_grade,
CASE WHEN g.codigo_barra_pai = g.codigo_barra THEN
CAST(p.descricao || '(Principal)' AS VARCHAR(255))
ELSE
CAST(p.descricao || ' - ' || fn_get_descricao_grade(g.id_produto,
g.id_grade_atributo_valor) AS VARCHAR(255))
END AS descrição,
g.codigo_barra,
CAST(CAST(g.qtd_atual as integer) || '|' || u.sigla as varchar(20)) as quantidade_no_estoque,
c.descricao as classificação,
CAST(TO_CHAR(g.valor_varejo_aprazo, 'L9G999G990D99') as varchar(20)) as Valor_venda,
CAST(TO_CHAR(g.valor_atacado_aprazo, 'L9G999G990D99') as varchar(20)) as Valor_Atacado,
CAST('L' as varchar(10)) as visualizar,
CAST('''' as varchar(7)) as excluir,
CASE WHEN ((g.codigo_barra_pai = g.codigo_barra)
AND (COUNT(p.id) > 1)
) THEN
CAST('o' as varchar(10))
END AS grade,
p.prod_serv
FROM grade g
LEFT JOIN produto p ON p.id_cadastro = g.id_cadastro
AND p.id = g.id_produto
AND g.codigo_barra_pai = p.codigo_barra
LEFT JOIN classificacao c on p.id_classificacao = c.id
LEFT JOIN unidade u on p.id_unidade = u.id
WHERE p.prod_serv = 'P'
AND g.ativo = 1
AND p.ativo <> 'E'
--AND ((upper(p.descricao) LIKE '%MANIV%') or (g.codigo_barra LIKE ''))
GROUP BY 1,2,3,4,5,6,7,8,9,10
ORDER BY 1, 3 DESC
LIMIT 20
|
Quero mostrar a letra 'o' se o count for maior que 1
| Código: | CASE WHEN ((g.codigo_barra_pai = g.codigo_barra)
AND (COUNT(p.id) > 1)
) THEN
CAST('o' as varchar(10))
END AS grade, |
Olha a imagem contendo o ID com mais de um
 _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Fev 07, 2017 9:22 am Assunto: |
|
|
Bom dia,
Não sei se entendi corretamente a questão, mas experimente fazer uns testes dessa forma:
| Código: | with CTE_Count as
(
SELECT
p.id,
g.id_grade,
CASE WHEN g.codigo_barra_pai = g.codigo_barra THEN
CAST(p.descricao || '(Principal)' AS VARCHAR(255))
ELSE
CAST(p.descricao || ' - ' || fn_get_descricao_grade(g.id_produto,
g.id_grade_atributo_valor) AS VARCHAR(255))
END AS descrição,
g.codigo_barra,
CAST(CAST(g.qtd_atual as integer) || '|' || u.sigla as varchar(20)) as quantidade_no_estoque,
c.descricao as classificação,
CAST(TO_CHAR(g.valor_varejo_aprazo, 'L9G999G990D99') as varchar(20)) as Valor_venda,
CAST(TO_CHAR(g.valor_atacado_aprazo, 'L9G999G990D99') as varchar(20)) as Valor_Atacado,
CAST('L' as varchar(10)) as visualizar,
CAST('''' as varchar(7)) as excluir,
g.codigo_barra_pai,
COUNT(p.id) OVER(PARTITION BY g.codigo_barra_pai) as Quantidade_Itens,
p.prod_serv
FROM grade g
LEFT JOIN produto p ON p.id_cadastro = g.id_cadastro
AND p.id = g.id_produto
AND g.codigo_barra_pai = p.codigo_barra
LEFT JOIN classificacao c on p.id_classificacao = c.id
LEFT JOIN unidade u on p.id_unidade = u.id
WHERE p.prod_serv = 'P'
AND g.ativo = 1
AND p.ativo <> 'E'
--AND ((upper(p.descricao) LIKE '%MANIV%') or (g.codigo_barra LIKE ''))
LIMIT 20
)
SELECT
*,
CAST(CASE WHEN codigo_barra_pai = codigo_barra AND Quantidade_Itens > 1
then 'o' else '' end
as varchar(10)) AS grade
FROM CTE_Count
ORDER BY 1, 3 DESC |
Espero que ajude
_________________
Assinatura: http://www.imoveisemexposicao.com.br/imoveis-alugar-guarulhos-comercial_ou_industrial-galpão |
|
| Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Ter Fev 07, 2017 10:07 am Assunto: |
|
|
| imex escreveu: | Bom dia,
Não sei se entendi corretamente a questão, mas experimente fazer uns testes dessa forma:
| Código: | with CTE_Count as
(
SELECT
p.id,
g.id_grade,
CASE WHEN g.codigo_barra_pai = g.codigo_barra THEN
CAST(p.descricao || '(Principal)' AS VARCHAR(255))
ELSE
CAST(p.descricao || ' - ' || fn_get_descricao_grade(g.id_produto,
g.id_grade_atributo_valor) AS VARCHAR(255))
END AS descrição,
g.codigo_barra,
CAST(CAST(g.qtd_atual as integer) || '|' || u.sigla as varchar(20)) as quantidade_no_estoque,
c.descricao as classificação,
CAST(TO_CHAR(g.valor_varejo_aprazo, 'L9G999G990D99') as varchar(20)) as Valor_venda,
CAST(TO_CHAR(g.valor_atacado_aprazo, 'L9G999G990D99') as varchar(20)) as Valor_Atacado,
CAST('L' as varchar(10)) as visualizar,
CAST('''' as varchar(7)) as excluir,
g.codigo_barra_pai,
COUNT(p.id) OVER(PARTITION BY g.codigo_barra_pai) as Quantidade_Itens,
p.prod_serv
FROM grade g
LEFT JOIN produto p ON p.id_cadastro = g.id_cadastro
AND p.id = g.id_produto
AND g.codigo_barra_pai = p.codigo_barra
LEFT JOIN classificacao c on p.id_classificacao = c.id
LEFT JOIN unidade u on p.id_unidade = u.id
WHERE p.prod_serv = 'P'
AND g.ativo = 1
AND p.ativo <> 'E'
--AND ((upper(p.descricao) LIKE '%MANIV%') or (g.codigo_barra LIKE ''))
LIMIT 20
)
SELECT
*,
CAST(CASE WHEN codigo_barra_pai = codigo_barra AND Quantidade_Itens > 1
then 'o' else '' end
as varchar(10)) AS grade
FROM CTE_Count
ORDER BY 1, 3 DESC |
Espero que ajude
_________________
Assinatura: http://www.imoveisemexposicao.com.br/imoveis-alugar-guarulhos-comercial_ou_industrial-galpão | Isso mesmo Imex,
Obrigado mais uma vez por ajudar amigo. _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
| Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Seg Jul 31, 2017 2:44 pm Assunto: |
|
|
sobre o select acima tenho um grande problema.
Aqui nesta parte do case
| Código: | CASE WHEN g.codigo_barra_pai = g.codigo_barra THEN
CAST(p.descricao || '(Principal)' AS VARCHAR(255))
ELSE
CAST(p.descricao || ' - ' || fn_get_descricao_grade(g.id_produto,
g.id_grade_atributo_valor) AS VARCHAR(255))
END AS descrição, |
No else preciso concatenar
p.descricao com os valores. Vou tentar explicar em imagens
O select esta retornando assim
Se repararem a partir da segunda linha ja preciso concatenar com ostros campos.
Na linha 2 da grid esta trazendo apenas o id ai 100000068
já na linha 3 da grid que tenho dois id_grade_atributo_valor não esta retornando nada na célula NOME DO PRODUTO da grade.
Deveria ficar assim a grade ja com o select
Este model ai de grade é do sistema que temos na web, estou tentando fazer igual em delphi, mais como mostrei esta errado a grid em delphi.
As tabelas envolvidas são estas
Se repararem na tabela GRADE tenho o campo ID_GRADE_ATRIBUTO_VALOR com os dois ID envolvidos separado por virgula.
Tenho esta função que a principio era para retornar isso
| Código: | CREATE OR REPLACE FUNCTION public.fn_get_descricao_grade(
v_id_produto integer,
v_id_atributo_valor character varying)
RETURNS character varying AS
$BODY$
declare qtdReg integer;
declare i integer;
declare texto varchar(255);
declare textoAux varchar(255);
declare str_id varchar(255);
declare pos integer;
declare id_filtro integer;
begin
IF (v_id_atributo_valor IS NULL) or (v_id_atributo_valor = '') THEN
RETURN ' ';
ELSE
texto := '';
qtdReg := CHAR_LENGTH(v_id_atributo_valor);
raise notice 'Qtd registros: %', qtdReg;
for i in 1..qtdReg loop
/*Pego o id da String de IDs*/
raise notice '1ª v_id_atributo_valor: %', v_id_atributo_valor;
pos := STRPOS(v_id_atributo_valor, ',');
raise notice '1ª Pos: %', pos;
if v_id_atributo_valor <> '' then
if (pos = 0) then
str_id := v_id_atributo_valor;
else
str_id := SUBSTR(v_id_atributo_valor, 1, pos-1);
end if;
raise notice 'StrId: %', str_id;
id_filtro := cast(str_id as integer);
/*Elimina os caracteres já recortados para as variáveis*/
v_id_atributo_valor := SUBSTR(v_id_atributo_valor, pos+1, 5);
raise notice '2ª v_id_atributo_valor: %', v_id_atributo_valor;
/*Faz a verificação*/
if str_id = ',' then
texto := texto;
else
/*Monto o select com atributo e valor. EX: COR-PRETO*/
select into textoAux gav.id_grade_atributo_valor, ga.atributo || '-' || gav.valor
from grade_atributo_valor gav
inner join grade_atributo ga on gav.id_atributo = ga.id_grade_atributo
--Mgs Adriano Inclui mais este comando por causa do sincronismo Web Local
or gav.id_atributo = ga.id_web
where ga.ativo = 1 and gav.ativo = 1
and (gav.id_grade_atributo_valor = id_filtro or gav.id_web = id_filtro);
texto := texto || textoAux || ',';
end if;
end if;
end loop;
raise notice 'sub de retorno: %', SUBSTR(texto, 1, CHAR_LENGTH(texto)-1);
return SUBSTR(texto, 1, CHAR_LENGTH(texto)-1);
END IF;
end
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION public.fn_get_descricao_grade(integer, character varying)
OWNER TO postgres;
|
Inclusive esta sendo chamado na select acima, mais não ta dando certo.
Preciso de ajuda. _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Seg Jul 31, 2017 8:31 pm Assunto: |
|
|
| Você está utilizando PostgreSQL né? Não tenho certeza mas também acho que o problema deve estar nessa função. Só que não tenho nenhuma experiência com o PostgreSQL, então fica complicado analisar essa função para postar alguma sugestão. |
|
| Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Ter Ago 01, 2017 10:52 am Assunto: |
|
|
| imex escreveu: | | Você está utilizando PostgreSQL né? Não tenho certeza mas também acho que o problema deve estar nessa função. Só que não tenho nenhuma experiência com o PostgreSQL, então fica complicado analisar essa função para postar alguma sugestão. | Sim postgres eu não consigo debugar esta função pra ver o problema
Será que não tem outra forma de fazer isso?
A função em MySQL que me passaram é esta aqui que faz isso segundo eles
| Código: | CREATE DEFINER=`csinform`@`%` FUNCTION `fn_get_descricao_grade`(v_id_grade_atributo_valor VARCHAR(200)) RETURNS VARCHAR(255) CHARSET latin1
BEGIN
IF v_id_grade_atributo_valor IS NULL THEN
RETURN ' ';
ELSE
RETURN IFNULL(CONCAT(' ',(
SELECT
GROUP_CONCAT(p.atributo, '-', vpg.valor ORDER BY p.atributo ASC)
FROM base_web_control.grade_atributo_valor vpg
INNER JOIN base_web_control.grade_atributo p
ON p.id_grade_atributo = vpg.id_atributo
WHERE FIND_IN_SET(vpg.id_grade_atributo_valor,v_id_grade_atributo_valor)
ORDER BY p.atributo ASC
)),'');
END IF;
END$$ |
_________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Ago 01, 2017 11:01 am Assunto: |
|
|
| Desculpe mas esse caso é complicado para mim porque não tenho experiência nem com o PostgreSQL nem com o MySQL. |
|
| Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
| Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Ter Ago 01, 2017 2:25 pm Assunto: |
|
|
Mudei a função mais ainda não ta certo
Agora se tem um codigo na table grade no campo id_grade_atributo_valor esta mostrando como preciso
Mais se eu colocar mais de um ID ali neste campo separado por virgula não mostra nada no campo DESCRICAO daquela linha.
A função
| Código: | CREATE OR REPLACE FUNCTION public.fn_get_descricao_grade_adr(v_id_grade_atributo_valor character varying DEFAULT 255) RETURNS character varying AS
$BODY$--//funcao array
declare qtdReg integer;
declare i integer;
declare texto varchar(255);
declare textoAux varchar(255);
declare str_id varchar(255);
declare pos integer;
declare id_filtro integer;
begin
IF (v_id_grade_atributo_valor IS NULL) or (v_id_grade_atributo_valor = '') THEN
RETURN ' ';
ELSE
texto := '';
qtdReg := CHAR_LENGTH(v_id_grade_atributo_valor);
raise notice 'Qtd registros: %', qtdReg;
for i in 1..qtdReg loop
/*Pego o id da String de IDs*/
raise notice '1ª v_id_atributo_valor: %', v_id_grade_atributo_valor;
pos := STRPOS(v_id_grade_atributo_valor, ',');
raise notice '1ª Pos: %', pos;
if v_id_grade_atributo_valor <> '' then
if (pos = 0) then
str_id := v_id_grade_atributo_valor;
else
str_id := SUBSTR(v_id_grade_atributo_valor, 1, pos-1);
end if;
raise notice 'StrId: %', str_id;
id_filtro := cast(str_id as integer);
/*Elimina os caracteres já recortados para as variáveis*/
v_id_grade_atributo_valor := SUBSTR(v_id_grade_atributo_valor, pos+1, 5);
raise notice '2ª v_id_atributo_valor: %', v_id_grade_atributo_valor;
/*Faz a verificação*/
if str_id = ',' then
texto := texto;
else
/*Monto o select com atributo e valor. EX: COR-PRETO*/
select into textoAux p.atributo || ' - ' || vpg.valor
from grade_atributo_valor vpg
inner join grade_atributo p
on p.id_grade_atributo = vpg.id_atributo
--Mgs Adriano Inclui mais este comando por causa do sincronismo Web Local
or p.id_web = vpg.id_atributo
where vpg.ativo = 1 and p.ativo = 1
and (vpg.id_grade_atributo_valor = id_filtro or vpg.id_web = id_filtro);
texto := texto || textoAux || ',';
end if;
end if;
end loop;
raise notice 'sub de retorno: %', SUBSTR(texto, 1, CHAR_LENGTH(texto)-1);
return SUBSTR(texto, 1, CHAR_LENGTH(texto)-1);
END IF;
end
$BODY$
LANGUAGE plpgsql VOLATILE NOT LEAKPROOF
COST 255;
|
O select que uso para popular a dbGrid
| Código: | with CTE_Count as
(
SELECT
p.id,
g.id_grade,
CASE WHEN g.codigo_barra_pai = g.codigo_barra THEN
CAST(p.descricao || '(Principal)' AS VARCHAR(255))
ELSE
CAST(p.descricao || ' - ' || fn_get_descricao_grade_adr(
g.id_grade_atributo_valor) AS VARCHAR(255))
END AS descrição,
g.codigo_barra,
CAST(CAST(g.qtd_atual as integer) || '|' || u.sigla as varchar(20)) as quantidade_no_estoque,
c.descricao as classificação,
CAST(TO_CHAR(g.valor_varejo_aprazo, 'L9G999G990D99') as varchar(20)) as Valor_venda,
CAST(TO_CHAR(g.valor_atacado_aprazo, 'L9G999G990D99') as varchar(20)) as Valor_Atacado,
CAST('L' as varchar(10)) as visualizar,
CAST('''' as varchar(7)) as excluir,
g.codigo_barra_pai,
COUNT(p.id) OVER(PARTITION BY g.codigo_barra_pai) as Quantidade_Itens,
p.prod_serv
FROM grade g
LEFT JOIN produto p ON p.id_cadastro = g.id_cadastro
AND p.id = g.id_produto
AND g.codigo_barra_pai = p.codigo_barra
LEFT JOIN classificacao c on p.id_classificacao = c.id
LEFT JOIN unidade u on p.id_unidade = u.id
WHERE p.prod_serv = 'P'
AND g.ativo = 1
AND p.ativo <> 'E'
--AND ((upper(p.descricao) LIKE '%MANIV%') or (g.codigo_barra LIKE ''))
LIMIT 20
)
SELECT
*,
CAST(CASE WHEN codigo_barra_pai = codigo_barra AND Quantidade_Itens > 1
then 'o' else '' end
as varchar(10)) AS grade
FROM CTE_Count
ORDER BY grade DESC |
_________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
| Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Ter Ago 01, 2017 3:21 pm Assunto: |
|
|
Descobri o problema da função, quanto maior o tamanho do retorno maior tenho que calcular
| Código: | CREATE OR REPLACE FUNCTION public.fn_get_descricao_grade_adr(v_id_grade_atributo_valor character varying DEFAULT 1500) RETURNS character varying AS
$BODY$--//funcao array tamanho
declare qtdReg integer;
declare i integer;
declare texto varchar(1500);
declare textoAux varchar(1500);
declare str_id varchar(1500);
declare pos integer;
declare id_filtro integer;
begin
IF (v_id_grade_atributo_valor IS NULL) or (v_id_grade_atributo_valor = '') THEN
RETURN ' ';
ELSE
texto := '';
qtdReg := CHAR_LENGTH(v_id_grade_atributo_valor);
raise notice 'Qtd registros: %', qtdReg;
for i in 1..qtdReg loop
/*Pego o id da String de IDs*/
raise notice '1ª v_id_atributo_valor: %', v_id_grade_atributo_valor;
pos := STRPOS(v_id_grade_atributo_valor, ',');
raise notice '1ª Pos: %', pos;
if v_id_grade_atributo_valor <> '' then
if (pos = 0) then
str_id := v_id_grade_atributo_valor;
else
str_id := SUBSTR(v_id_grade_atributo_valor, 1, pos-1);
end if;
raise notice 'StrId: %', str_id;
id_filtro := cast(str_id as integer);
/*Elimina os caracteres já recortados para as variáveis*/
v_id_grade_atributo_valor := SUBSTR(v_id_grade_atributo_valor, pos+1, 22);
raise notice '2ª v_id_atributo_valor: %', v_id_grade_atributo_valor;
/*Faz a verificação*/
if str_id = ',' then
texto := texto;
else
/*Monto o select com atributo e valor. EX: COR-PRETO*/
select into textoAux p.atributo || ' - ' || vpg.valor
from grade_atributo_valor vpg
inner join grade_atributo p
on (p.id_grade_atributo = vpg.id_atributo
--Mgs Adriano Inclui mais este comando por causa do sincronismo Web Local
or p.id_web = vpg.id_atributo)
where vpg.ativo = 1 and p.ativo = 1 and
(vpg.id_grade_atributo_valor = id_filtro or vpg.id_web = id_filtro);
texto := texto || textoAux || ',';
end if;
end if;
end loop;
raise notice 'sub de retorno: %', SUBSTR(texto, 1, CHAR_LENGTH(texto)-1);
return SUBSTR(texto, 1, CHAR_LENGTH(texto)-1);
END IF;
end
$BODY$
LANGUAGE plpgsql VOLATILE NOT LEAKPROOF
COST 1500; |
Primeiro aumentei este tamanho aqui de 255 para 1500, mais pelo visto o | Citação: | negocio vai aumentando se tiver muito
declare texto varchar(1500);
declare textoAux varchar(1500);
declare str_id varchar(1500); |
Depois descobri outro problema aqui
v_id_grade_atributo_valor := SUBSTR(v_id_grade_atributo_valor, pos+1, 5);
Tava no final 5 por isso não mostrava o que tinha mais char na linha, ai subi para 11 seu tamanho
v_id_grade_atributo_valor := SUBSTR(v_id_grade_atributo_valor, pos+1, 11);
Ai apareceu o valor dos dois campos cfe a id_grade_atributo_valor, mais ai coloquei mais um novo codigo la 1000000071,1000000068,1000000070,
ai precisei aumentar de novo lá seu tamanho.
v_id_grade_atributo_valor := SUBSTR(v_id_grade_atributo_valor, pos+1, 22);
E ai como vou saber o tamanho final?
Funcionar, funciona, mais não sei o resultado final.
Resolvi colocar mais um codigo la, ai pra mostrar tudo tie que aumentar para 33 no final
| Código: | | v_id_grade_atributo_valor := SUBSTR(v_id_grade_atributo_valor, pos+1, 33); |
Parece que tenho que aumentar 11 cada vez
 _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
| Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
| Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|