Algumas novidades do firebird 3.0 RC2

  • arquivo de configuração passa a ser   databases.conf  (antes aliases.conf);
  • quando operando como SuperServer, usa multiplos CPU / Cores;
  • a segurança passa a ser por banco de dados   (SecurityDatabase in databases.conf);
  • novo tipo de dados   BOOLEAN  aceita (True/False/Unknown);

                  CREATE TABLE TBOOL (ID INT, BVAL BOOLEAN); 
                  COMMIT;
                  INSERT INTO TBOOL VALUES (1, TRUE); 
                  INSERT INTO TBOOL VALUES (2, 2 = 4); 
                  INSERT INTO TBOOL VALUES (3, NULL = 1); 
                  COMMIT;

  • tipo IDENTITY para gerar auto-incremento internamente;
               create table objects ( 
                      id integer generated by default as identity primary key,  
                      name varchar(15) );
    
  • suporte à “Packages”;
  • suporte a “Scrollable Cursors” permitindo navegar em PSQL para frente e para traz.
  • suporte a IPV6 no servidor e no cliente;
  • validação on-line;
  • número máximo de conexões passou de 1024 para 2048;
  • toda tabela passa a ter uma coluna  RDB$RECORD_VERSION  que indica o número da transação que criou a versão do registro   (  select  RDB$RECORD_VERSION from clientes );
  • suporte a funções criadas utilizáveis em   Selects, Procedures, Trigger, Packages;

Quantas vezes precisamos fazer uma lista de notas fiscais para imprimir em um documento – ou uma lista de vencimentos…

Desejamos uma lista de notas assim:  1,2,3,4,5,10,….

O problema esta ligado  a forma como as tabelas geralmente se apresentam, assim:

NotasFiscais
-------------------------
notafiscal        valor .....
   1                x
   2                y
   ..
   10               k

No Firebird isto é simples:

Select LIST(notafiscal) from NotasFiscais where….

Outro dia precisava montar um RANK de produtos, ou seja, precisava saber qual a classificação no RANK de cada produto com possibilidade de apresentar somente os primeiros 100 produtos.
Fazer RANK de dados não é um recurso disponível até o firebird 2.5 – o que irá ocorrer somente no firebird 3.0 – como ainda não é uma versão de produção, então o caminho ainda é resolver com o 2.5;Captura de tela 2016-03-02 21.13.57

Depois de ler muitas sugestões de como fazer, conclui que tinha que montar uma própria – eram todas confusas e levavam a resultados com muito tempo de respostas.

Estratégia:
Montar um select que ordene em ordem crescente os valores de venda em ordem decrescente de cada um dos produtos, depois criar um loop que marque com uma coluna na resposta com a posição do produto (o RANK);

Código Delphi:

      
       query1 := TFDQuery.create(nil);
       try
           with query1 do
           begin
              connection := xxx;
              sql.text := '....'
              open;  
           end;
           ....
       finally
          query1.free;
       end;

Select no Firebird:

execute block 
returns (codigo varchar(18),
         valor double precision,
         conta integer, 
         rank integer, 
         acumulado double precision)
as
declare variable n integer;
begin
   n = 0;
   acumulado = 0;

   for select codigo,sum(valor) valor, count(*) ct from sigcaut2
       where valor>0 and 
             data between '01/01/2015' and '12/31/2015'
       group by codigo
       order by valor desc
       rows 100
       into :codigo,:valor,:conta
   do
     begin
       n = n +1;
       rank = n;
       acumulado = acumulado + valor;
       suspend;
   end
end