Select for no Firebird

14/01/2020

8

Sempre trabalhei com muitos bancos, mas confesso que me sinto limitado no Firebird. Estou na seguinte situação: preciso pegar a descrição de todas as etiquetas atreladas a um determinado cliente, e não estou conseguindo.
Desenvolvi o seguinte proc

SET TERM ^ ;

CREATE PROCEDURE OBTER_CLIENTES_FACCAO(
P_CODCLI VARCHAR(10) CHARACTER SET NONE)
RETURNS(
CLIENTES_FACCAO VARCHAR(10) CHARACTER SET NONE)
AS
DECLARE VARIABLE DESC_ETQ VARCHAR(50);
DECLARE VARIABLE texto_etiquetas VARCHAR(2000);
BEGIN
/* Procedure body */
FOR select epr.DESCRICAO
from ETQ_CLIENTE_001 etq
inner join FAC_MAQUINAS_001 Fma on (ETq.CODCLI = fma.CODCLI)
inner join ETQ_PROD_001 epr on (epr.CODIGO = ETQ.CODETQ)
where fma.CODCLI = :p_CODCLI
INTO DESC_ETQ
DO
BEGIN
TEXTO_ETIQUETAS = TEXTO_ETIQUETAS || DESC_ETQ || ', ';
SUSPEND;
END
CLIENTES_FACCAO = TEXTO_ETIQUETAS;
END^

SET TERM ; ^

Ele rodou sem erros, mas da erro ao executar dizendo que há um problema nos parametros de entrada já.
Responder

Post mais votado

15/01/2020

Fala parceiro, seu problema é só uma questão de adaptação com o banco de dados.

https://andersonworkinfo.wordpress.com/2014/09/15/duvida-filtrar-palavras-em-uma-lista/

vê se isso te ajuda, coloca só o inner join para buscar as tabelas juntas como você está fazendo.

OBS: percebi que no seu código acima você declara um PARAMETRO mas não passa para a query em momento nenhum.


Essa aqui
:p_CODCLI

Em algum momento você não deveria passar a informação ao parametro?

Parameters.ParamByName('p_CODCLI').value := Informação;

Da uma olhada no link lá e vê se te ajuda.

Espero ter ajudado.
Responder

Mais Posts

Olha esse aqui também, pode ajudar.
https://andersonworkinfo.wordpress.com/2014/01/29/trabalhando-com-checklistbox-delphi/
Responder
Oi Anderson, blz cara.

Então, eu não entendi muito bem a questao do inner que vc falou. Já estou usando.
E o parâmetro eu estou usando na cláusula WHERE do sql:

where fma.CODCLI = :p_CODCLI

como acima.
Responder
Oi Anderson, blz cara.

Então, eu não entendi muito bem a questao do inner que vc falou. Já estou usando.
E o parâmetro eu estou usando na cláusula WHERE do sql:

where fma.CODCLI = :p_CODCLI

como acima.



Assim boy:

Temos as tabelas

Tabela de Cliente (tbcliente)
clicodigo int not null -pk
clinome varchar(50) not null

Tabela de Documentos (tbdocumento)
doccodigo int not null - pk
docdescricao varchar(50) not null

tabela de ligação (tbcliente_documento)
clidoccodigo int not null - pk
clicodigo int not null - fk
doccodigo int not null - fk


Levando em consideração que você tem essas tabelas o INNER JOIN vai trazer dados relacionados entre elas quando você selecionar dessa maneira.
Obs: Usando Componente ADO (ADOQuery);

With ADOQuery1 do
begin
close;
sql.clear;
sql.add('select * from tbcliente_documento clidoc0');
sql.add('inner join tbcliente cli0 on cli0.clicodigo = clidoc0.clicodigo');
sql.add('inner join tbdocumento doc0 on doc0.doccodigo = clidoc0.doccodigo');
// aqui vem o seu comparativo.
sql.add('where cli0.clicodigo = :parametro');
parameters.parambyname('parametro').value := edit_codigo_cliente.text;
open;
end;

Vai que é tua tafarel, adapta para a tua situação.

Espero ter ajudado novamente.

Abraço.

OBS: se der BO me chama no skype: anderson@case13.com.br
Responder