Select com campo quot;calculadoquot;

Delphi

07/05/2008

Pessoal, meu caso é o seguinte:

Tenho um cadastro de apartamentos e outro cadastro das garagens. Um apartamento pode ter quantas garagens quiser e, eu preciso de uma listagem, que me informe em apenas uma linha, o número de todas as vagas.



[b:2a3b9852ec]TABELA APARTAMENTO[/b:2a3b9852ec] ----------------------------- CODAPT - I NUMAPT - Var(20) [b:2a3b9852ec]TABELA GARAGEM[/b:2a3b9852ec] ----------------------------- CODGAR - I CODAPT - I NUMVAG - I


Então preciso que meu relatório fique assim:

[b:2a3b9852ec]APT 101 - [/b:2a3b9852ec] Vaga 15, 32, 47 [b:2a3b9852ec]APT 102 - [/b:2a3b9852ec] Vaga 14 [b:2a3b9852ec]APT 103 - [/b:2a3b9852ec] Vaga 16, 18


Alguma luz sobre como montar essa select ????


Powerlog Tecnologia

Powerlog Tecnologia

Curtidas 0

Respostas

Dbergkamps10

Dbergkamps10

07/05/2008

Olá,
Tente assim:
select * from vagas
where vagas.apto = Apto
group by Apto


Espero ter ajudado.

Att
Dalton


GOSTEI 0
Powerlog Tecnologia

Powerlog Tecnologia

07/05/2008

Colega dbergkamps10 ,

desse jeito eu teria que fazer 1 select para cada linha do meu relatório de apartamentos... fica inviável; seria uma resolução ´na mão´

Ainda continuo no aguardo !!!

Valeu ...


GOSTEI 0
Webjoel

Webjoel

07/05/2008

Olá!

Se as tabelas estiverem relacionadas com o CODAPT, você pode fazer um inner join, ex:

SELECT A.CODAPT, G.NUMVAG FROM GARAGEM 
INNER JOIN APARTAMENTO A ON (A.CODAPT = G.CODAPT);


Só que ele não mostrará como você precisa, isso você só pode fazer na impressão/visualização deste relatório, vocÇe pode fazer um gbfirst para mostrar desse modo que você quer!

Qualquer duvida post.


GOSTEI 0
Mazzi

Mazzi

07/05/2008

Ola amigo, mas o que vc esta usando entao para fazer a impressao?

Pois q SQL do amigo (up) agrupando por Apto, teria q dar certo em qq Layout de Impressao do tipo QuickReport (coloando os dataSources) e FortesReport , ambos usando agrupamentos.

No Rave tbm.

Qual ferramenta de relatorio vc esta usando?
Pois um SQL , advindo de um componente Dataset, vc nao precisaria informar um pra cada linha nao....


GOSTEI 0
Powerlog Tecnologia

Powerlog Tecnologia

07/05/2008

Estou usando o Report Builder.

Mas dessa forma o relatório ficaria assim:

[b:c65ed2b503]Atp 101[/b:c65ed2b503] Vaga 01 Vaga 02 Vaga 03 [b:c65ed2b503]Apt 102[/b:c65ed2b503] Vaga 04 etc...


Não quero que fique uma vaga por linha e sim todas as vagas na linha do apartamento ...


GOSTEI 0
Webjoel

Webjoel

07/05/2008

Pois é,

neste caso tem cuidar disso na hora da impressao, usando o gbFirst, onde atraves de indices e quebras no ClientDataSet você controla os registros de forma que, o indice será o apartamento, entao no laço do ClientDataSet ele confere qual apartamento, se é o mesmo, ele concatena numa variavel e pois mostra, é a única forma que vejo para fazer numa mesma linha.

Dé uma olhada na net sobre o gbFirst na net, é um pouco complicado para se explicar aqui no fórum.


GOSTEI 0
Catunda

Catunda

07/05/2008

Experimente criar uma StoredProcedure como abaixo:


CREATE PROCEDURE RELAT_VAGAS
RETURNS (
XVAGAS VARCHAR(100),
XAPT INTEGER,
XNAPT VARCHAR(20))
AS
DECLARE VARIABLE Y INTEGER;
begin
for select codapt,numapt from apartamento into :xapt,:xnapt do
begin
xvagas=´vagas: ´;
for select numvaga from garagem where codapt=:xapt into :y do
begin
xvagas=(:xvagas||:y||´, ´);
end
suspend;
end
suspend;
end


GOSTEI 0
Powerlog Tecnologia

Powerlog Tecnologia

07/05/2008

Já tinha pensado em fazer stored_procedure mas não tinha o caminho !!! Valeu a dica, vou implementar e assim que tiver uma resposta coloco aqui como ficou ...

VALEU !!!!!!!!!!!


GOSTEI 0
Powerlog Tecnologia

Powerlog Tecnologia

07/05/2008

SOLUÇÃO:

create or alter procedure SAREL_LISTABOXE_UNID (
    PCODEMP integer,
    PORDEM varchar(100))
returns (
    CODBOX integer,
    CODUNI integer,
    NUMUNI varchar(20),
    CODBLOXUNI integer,
    DESEBLUNI varchar(20),
    DESEPVUNI varchar(20),
    ORDENAUNI integer,
    CODEMPX integer,
    DESEMP varchar(100),
    NUMBOX varchar(500),
    CON_CODIGO integer,
    CON_NOMRAZ varchar(100),
    QTDCON integer,
    DATAATUAL date)
AS
declare variable SQLTEXT varchar(8192);
declare variable xCODBOX INTEGER;
declare variable xCODUNI INTEGER;
declare variable xNUMUNI VARCHAR(20);
declare variable xCODBLOXUNI INTEGER;
declare variable xDESEBLUNI VARCHAR(20);
declare variable xDESEPVUNI VARCHAR(20);
declare variable xORDENAUNI INTEGER;
declare variable xCODEMPX INTEGER;
declare variable xDESEMP VARCHAR(100);
declare variable xNUMBOX VARCHAR(20);
declare variable xCON_CODIGO INTEGER;
declare variable xCON_NOMRAZ VARCHAR(100);
declare variable xQTDCON INTEGER;
declare variable xcoduniant integer;

begin
  xcoduniant = 0;
  CODBOX = 0;
  CODUNI = 0;
  NUMUNI = '';
  CODBLOXUNI = 0;
  DESEBLUNI = '';
  DESEPVUNI = '';
  ORDENAUNI = 0;
  CODEMPX = 0;
  DESEMP = '';
  NUMBOX = '';
  con_codigo = 0;
  con_nomraz = '';
  qtdcon = 0;
  SQLTEXT = ' select b.codbox, b.coduni, u.numuni, u.codblox as codbloxuni, ebu.desebl as desebluni,
               epu.desepv as desepvuni, epu.ordena as ordenauni, b.codempx, e.desemp,
               b.numbox, c.con_codigo, c.con_nomraz, b.qtdcon
             from emprboxe b
             inner join empreend e on e.codemp = b.codempx
             left join emprunid u on u.coduni = b.coduni
             left join emprbloc ebu on ebu.codebl = u.codblox
             left join emprpavi epu on epu.codepv = u.codepv
             left join contatos c on c.con_codigo = b.codco1
             where 1 = 1 and b.coduni > 0';
  IF ((:pcodemp IS NOT NULL) AND (:pcodemp > 0)) THEN
    sqltext = sqltext || ' and b.codempx = '|| :pcodemp;
  sqltext = sqltext || ' order by b.codempx, ebu.codebl, epu.ordena, u.numuni, b.codblox, b.numbox';

  FOR EXECUTE STATEMENT sqltext
    INTO xCODBOX,
         xCODUNI,
         xNUMUNI,
         xCODBLOXUNI,
         xDESEBLUNI,
         xDESEPVUNI,
         xORDENAUNI,
         xCODEMPX,
         xDESEMP,
         xNUMBOX,
         xcon_codigo,
         xcon_nomraz,
         xqtdcon
  DO
  BEGIN
    if (xcoduniant = 0) then
      xcoduniant = xcoduni;
    if (xcoduni <> xcoduniant) then
    begin
      SUSPEND;
      CODBOX = 0;
      CODUNI = 0;
      NUMUNI = '';
      CODBLOXUNI = 0;
      DESEBLUNI = '';
      DESEPVUNI = '';
      ORDENAUNI = 0;
      CODEMPX = 0;
      DESEMP = '';
      NUMBOX = '';
      con_codigo = 0;
      con_nomraz = '';
      qtdcon = 0;
    end
    if (xqtdcon is null) then
      xqtdcon = 0;
    CODBOX = xCODBOX;
    CODUNI = xCODUNI;
    NUMUNI = xNUMUNI;
    CODBLOXUNI = xCODBLOXUNI;
    DESEBLUNI = xDESEBLUNI;
    DESEPVUNI = xDESEPVUNI;
    ORDENAUNI = xORDENAUNI;
    CODEMPX = xCODEMPX;
    DESEMP = xDESEMP;
    if (NUMBOX = '') then
      NUMBOX = xNUMBOX;
    else
      NUMBOX = NUMBOX||', '||xNUMBOX;
    CON_CODIGO = xCON_CODIGO;
    CON_NOMRAZ = xCON_NOMRAZ;
    QTDCON = QTDCON+xQTDCON;
    DATAATUAL = current_date;
    xcoduniant = xcoduni;
  END
end

GOSTEI 0
POSTAR