segunda-feira, 18 de novembro de 2024

Postgres no docker

 -- Criar compose


nano docker-compose.yml


version: '3.7'


###


services:

  db:

    image: postgres

    volumes:

      - postgres_data:/var/lib/postgresql/data

    environment:

      POSTGRES_PASSWORD: seu_password

      POSTGRES_DB: FastEPI

      POSTGRES_USER: intelisys

      POSTGRES_INITDB_OPTIONS: --encoding=UTF8 --locale=C --lc-collate=C --lc-ctype=C

    ports:

      - "5432:5432"


volumes:

  postgres_data:


###


docker-compose up -d


-- Configurando Firewall


# Verificar o status do firewall

sudo ufw status


# Permitir o tráfego na porta 5432

sudo ufw allow 5432/tcp


# Aplicar as regras

sudo ufw enable



-- Entrar no bash do container

Docker ps -- saber nome

docker exec -it root-db-1 bash



-- Conectar ao servidor PostgreSQL

psql -U postgres


-- Criar um banco de dados

CREATE DATABASE FastEPI;


-- Criar um usuário 

CREATE USER intelisys WITH PASSWORD 'seu_password';


-- Conceder todas as permissões no banco de dados

GRANT ALL PRIVILEGES ON DATABASE FastEPI TO intelisys;

segunda-feira, 1 de agosto de 2022

Oracle - Listar datas do mês

 select TRUNC(SYSDATE)  + level - 1 dt

from   dual

connect by level <= (

  LAST_DAY(SYSDATE) - TRUNC(SYSDATE) + 1

)




sábado, 8 de janeiro de 2022

Cursor com Oracle

 BEGIN

-- Create cursor and start loop

FOR C_PAR in (SELECT * FROM TGFPAR WHERE CODPARC < 100) LOOP

-- run commands for each item here

DBMS_OUTPUT.PUT_LINE(C_PAR.CODPARC || ' - ' || C_PAR.RAZAOSOCIAL);

END LOOP;

END;


Resultado:




domingo, 24 de outubro de 2021

Creating user to acess SQL databases on Azure

 

Open Azure Data Studio and execute these commands:

-- create login credentials on the server
USE master;
CREATE LOGIN user_name WITH password='p455w0rd';
GO

-- create user on the database
USE DATABASE_NAME;
CREATE USER user_name FROM LOGIN user_name;
GO

-- grant permission for user
USE DATABASE_NAME;
EXEC sp_addrolemember 'db_datareader''user_name';
EXEC sp_addrolemember 'db_datawriter''user_name';
EXEC sp_addrolemember 'db_backupoperator''user_name';
GO

sábado, 7 de agosto de 2021

SQL Backup Docker container

Create account in https://sqlbak.com/ and copy the key (You will need after)


Download sqlBak:

Run: docker run --name sqlbak_container -d -v sqlbak_volume:/opt/sqlbak pranasnet/sqlbak


Run the container with your key

Run: docker exec sqlbak_container sqlbak --register --key=YOUR_KEY_HERE -n sqlbak


Now you need to add a connection to DBMS (MySQL, PostgreSQL, MSSQL Server). 

Run: docker exec 9d8a0302a4a3 sqlbak -ac -dt <dbms_type> -h <host> -u <user_name> -p <password>



terça-feira, 3 de agosto de 2021

SQL Server on Docker Container

After instal Docker run following commands (depends on your main OS, maybe you need add "sudo" on begin for each command): 


// install SQL Server

docker pull mcr.microsoft.com/mssql/server:2017-latest


// run container

docker run --name sqlserver --hostname sqlserver -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=YourPasswordHere" -p 1433:1433 -d mcr.microsoft.com/mssql/server:2017-latest 


// run container with autorun on restart (add --restart always)

docker run -- restart always --name sqlserver --hostname sqlserver -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=YourPasswordHere" -p 1433:1433 -d mcr.microsoft.com/mssql/server:2017-latest 


// list services

docker ps -a


// open bash terminal inside into container

docker exec -it sqlserver "bash"


// run sqlcmd tool

/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "YourPasswordHere"


// stop container

docker stop sqlserver


// remove 

docker rm sqlserver


quarta-feira, 30 de junho de 2021

Oracle - Week number per day

 Query:

SELECT TODAY, 

TO_CHAR(TODAY,'IW') "WEEK_NUM"

from (select (TO_DATE('01/01/'||TO_CHAR(2021), 'DD/MM/YYYY') - 1) + level TODAY 

from DUAL 

connect by LEVEL <= 366)

Result:











Oracle - Query retuning start and end date per week number and year

 Query:

SELECT * FROM (SELECT WEEK_YEAR, WEEK_NUM, MIN(TODAY) START_DATE, MIN(TODAY) + 6 END_DATE

FROM (SELECT EXTRACT(YEAR FROM TODAY) WEEK_YEAR, TODAY, 

TO_CHAR(TODAY,'IW') "WEEK_NUM"

from (select (TO_DATE('01/01/'||TO_CHAR(2021), 'DD/MM/YYYY') - 1) + level TODAY 

from DUAL 

connect by LEVEL <= 368))

GROUP BY WEEK_YEAR, WEEK_NUM

ORDER BY START_DATE)

WHERE WEEK_YEAR = 2021

AND NOT (EXTRACT(MONTH FROM START_DATE) = 1 AND WEEK_NUM > 10)

Result:





domingo, 14 de março de 2021

Recuperando banco de dados Firebird

1 - Para facilitar, copiar da pasta firebird/bin os arquivos gfix.exe, gbak.exe e fbclient.dll na pasta C:\TEMP\BANCO (se não exitir, criar);

2 - Copie o banco corrompido na pasta C:\TEMP\BANCO e renomeie de *.fdb para BANCO.FDB;

3 - Execute todos os comandos abaixo. Eles devem ser executados com o prompt de comando executado como adminsitrador. Para isso, clicar no botão iniciar, pesquisar por "CMD", clicar com botão direito e escolher "Executar como Administrador").

  • gfix -v -full C:\TEMP\BANCO\BANCO.FDB -USER SYSDBA -pass masterkey
  • gfix -mend C:\TEMP\BANCO\BANCO.FDB -USER SYSDBA -pass masterkey
  • GBAK -backup -V -ignore -garbage -limbo C:\TEMP\BANCO\BANCO.FDB C:\TEMP\BANCO\BANCO.gBK -USER SYSDBA -pass masterkey
  • GBAK  -c -v -z C:\TEMP\BANCO\BANCO.gbk C:\TEMP\BANCO\BANCO_RECUPERADO.fdb -USER SYSDBA -pass masterkey

Pronto! Seu banco recuperado estará na pasta como BANCO_RECUPERADO.fdb.

SE HOUVER ERROS

Se aparecer um erro: "Can't format message nn:mmm -- message text not found" se referenciando ao arquivo (diretório)\firebird.msg, copie-o da instalação do Firebird (geralmente C:\Fortes\Firebird\Firebird_2_5), cole no diretório indicado na mensagem de erro e repita o procedimento.

Em alguns casos pode haver conflito com o Interbase ou outra instância do Firebird. Assim será necessário desinstalar o Firebird e instalar novamente ou fazer todo esse procedimento numa máquina virtual limpa bastando instalar a versão do Firebird antes.

quinta-feira, 14 de janeiro de 2021

ORACLE - Listar meses com data inicial e final de cada mês

Segue queries para gerar lista de meses com data inicial e final de cada mês:


SELECT
TO_CHAR(TRUNC (ANOBASE, 'YEAR'), 'YYYY') ANO,
TO_CHAR(LEVEL, '00') MES,
((SELECT ADD_MONTHS (TRUNC (ANOBASE, 'YEAR'), -1) FROM DUAL) + numtoyminterval(level,'month')) as DTINI, 
LAST_DAY ((SELECT ADD_MONTHS (TRUNC (ANOBASE, 'YEAR'), -1) FROM DUAL) + numtoyminterval(level,'month')) as DTFIN 
from (SELECT TO_DATE('01/01/2022') ANOBASE from dual)
connect by level <= 12


Exemplo de saída:






Depois disso basta dar um join em outra tabela que desejar e usar as datas geradas para subconsultas.




domingo, 16 de outubro de 2016

Delphi caro - preço do RAD Studio / Delphi 10 / 10.1 Seattle / Berlim

Gostaria de falar sobre o aumento nos preços das uma licenças do RAD Studio / Delphi em todas as versões.

Nos últimos anos, por muitas vezes, li na web e ouvi de amigos que o Delphi não vale mais a pena, que está sendo abandonado por muitos que migram para outras ferramentas e que há ótimas alternativas opensouces.

Confirmamos uma forte queda nos rankings de ferramentas mais usadas (veja abaixo ou em http://www.tiobe.com/tiobe-index:


Mesmo assim, acredito na ferramenta e estava na iminência de comprar uma licença do mesmo quando fui surpreendido pelo valor da licença da versão Enterprise que foi de R$ 5.172,41 para R$ 18.097,10. Enterprise é a versão (mínima para mim) pra se trabalhar com banco de dados, mas a situação é mais berrante ainda com a versão Architect (ideal para mim) que custava menos de 7 mil reais e aumentou para uma realidade remota de 29 mil reais.

Vejam dois orçamentos que pedi:

Delphi XE3

DELPHI 10.1 BERLIM

No novo formato ainda hã um pequeno detalhe que me dá medo em relação à atualização de 12 meses. O desenvolvimento para Android e IOS está em constante atualização, onde novos recursos surgem e outros se tornam obsoletos com alta frequência. Desta forma fica a pergunta: E após os 12 meses, vou tem que ficar comprando a atualização que também é um absurdo? Complicado.

Acredito que a Embarcadero do Brasil está no mundo da lua, pois não consideram que os desenvolvedores já desanimados com a ferramenta, que há uma forte crise, clientes que não investem nessa área e não estão dispostos a pagar por um sistema, nós desenvolvedores, principalmente os que trabalham por conta própria estão vendo seus clientes falirem e fechar o negócio, enquanto a venda de novos sistemas simplesmente parou,

Isso me fez tomar novos rumos e abrir meus olhos e ver que há ótimas alternativas de sair da zona de conforto. Ainda não decidi totalmente, mas estou indo no caminho de que R$ 29.000,00 dá pra se comprar um carro ou um terreno e que vale apena SIM economizar esse valor e ir pro opensource onde não há surpresas desse tipo.

No momento estou indo na seguinte trilha:

  • Windows/Linux: Java;
  • Android: Android Studio (excelente e sempre atualizado);
  • IOS: Swift (excelente e sempre atualizado);
  • Web: HTML5, CSS3, PHP e JavaScript;

domingo, 7 de agosto de 2016

SQL Server Azure - Query retornando data e hora ajustada com o fuso horário

Para quem está usando SQL Server Azure (funciona também com instância local), segue dica de um query que retorna o horário ajustado de acordo com a timezone informada no formato float.

No exemplo ultilizaremos a timezone -3:

declare @HorDif float = -3
select DATEADD(HH, @HorDif, GETUTCDATE ()) as Resultado




SQL Server - Controlar ID de autoincremento (Alternativa ao autoinc do SQL)

Se você precisa controlar suas IDs (identidade, identity, autoinc), segue uma dica de como fazer isso sem dar locks em tabelas, o que seria um grande problema de desempenho.

1 - Crie a tabela que armazenará os últimos IDs usados:

CREATE TABLE [dbo].[IDs]
(
    IDNom nvarchar(255) NOT NULL,
    IDUlt int NULL,
    CONSTRAINT [PK_tblIDs] PRIMARY KEY CLUSTERED
    (
        [IDNom] ASC
    ) WITH
    (
        PAD_INDEX = OFF
        , STATISTICS_NORECOMPUTE = OFF
        , IGNORE_DUP_KEY = OFF
        , ALLOW_ROW_LOCKS = ON
        , ALLOW_PAGE_LOCKS = ON
        , FILLFACTOR = 100
    )
);
GO

2 Crie a StoredProcedure que vai retornar o novo ID a cada solicitação e registrar seu uso na tabela anterior (SP criada por Max Vernon e Mike Defehr e fiz algumas alterações):

CREATE PROCEDURE [dbo].[ProxID](
    @IDName nvarchar(255)
)
AS
BEGIN

    DECLARE @Retry int;
    DECLARE @EN int, @ES int, @ET int;
    SET @Retry = 5;
    DECLARE @NewID int;
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    SET NOCOUNT ON;
    WHILE @Retry > 0
    BEGIN
        BEGIN TRY
            UPDATE dbo.IDs
            SET @NewID = IDUlt = IDUlt + 1
            WHERE IDNom = @IDName;

            IF @NewID IS NULL
            BEGIN
                SET @NewID = 1;
                INSERT INTO IDs (IDNom, IDUlt) VALUES (@IDName, @NewID);
            END
            SET @Retry = -2; /* no need to retry since the operation completed */
        END TRY
        BEGIN CATCH
            IF (ERROR_NUMBER() = 1205) /* DEADLOCK */
                SET @Retry = @Retry - 1;
            ELSE
                BEGIN
                SET @Retry = -1;
                SET @EN = ERROR_NUMBER();
                SET @ES = ERROR_SEVERITY();
                SET @ET = ERROR_STATE()
                RAISERROR (@EN,@ES,@ET);
                END
        END CATCH
    END
    IF @Retry = 0 /* must have deadlock'd 5 times. */
    BEGIN
        SET @EN = 1205;
        SET @ES = 13;
        SET @ET = 1
        RAISERROR (@EN,@ES,@ET);
    END
    ELSE
        SELECT @NewID AS NovoID;
END
GO

Pronto!

Agora é só usar a SP passando como parâmetro um nome qualquer (no meu caso uso o nome da tabela).
Se não existir, a SP cria automaticamente e retorna o valor 1.
Se já existir ela retorna o novo valor na sequencia.

Exemplo:

quarta-feira, 8 de junho de 2016

Função para formatar números de telefone com ou sem DDD e com ou sem nono dígito

Função Delphi para formatar números de telefone com ou sem DDD e com ou sem nono dígito:

function FormataFone(sTelefone: String): String;
var
  s: string;
  tam: Integer;
begin
  s  := FilterChars(sTelefone, ['0'..'9']);

  // Retira zero inicial se houver
  if Copy(s,1,1) = '0' then
  begin
    s := Copy(s,2,Length(s)-1);
  end;

  case Length(s) of
    8: // 4455-6677
      begin
        Result:= Copy(s,1,4)+'-'+Copy(s,5,4);
      end;
    9: / / 9 8877-6655
      begin
        Result:= Copy(s,1,1) + ' ' + Copy(s,2,4)+'-'+Copy(s,6,4);
      end;
    10: // (85) 8877-6655
      begin
        Result:= '('+Copy(s,1,2)+') '+Copy(s,3,4)+'-'+Copy(s,7,4);
      end;
    11: // (85) 9 8877-6655
      begin
        Result:= '('+Copy(s,1,2)+') ' + Copy(s,3,1) + ' ' +Copy(s,4,4)+'-'+Copy(s,8,4);
      end;
    else
      Result:= s;
  end;

terça-feira, 26 de abril de 2016

FastReport - Imprimir ReportSummary no rodapé da página (bottom)

Para imprimir o ReportSummary basta usar o seguinte comando no evento OnBeforePrint:

procedure ReportSummary1OnBeforePrint(Sender: TfrxComponent);
begin
  Engine.CurY := Engine.CurY + Engine.FreeSpace - ReportSummary1.Height - 1;  
end;

Resultado:



Esta dica serve para qualquer tipo de banda. A propriedade Engine.CurY na verdade é a altura que de deve ser utilizada para a impressão do próximo componente.

sexta-feira, 22 de abril de 2016

Delphi - Arredondamento de valores

Essa função de arredondamento de valor monetário tem opcão de arredondar para mais ou para menos:

function ArredDinheiro(Fracao: Double; Cima : Boolean): Double;
var
  Sinal : integer;
begin
  Fracao := Fracao * 100;
  // Sng
  if Frac(Fracao) < 0 then
    Sinal := -1
  else if Frac(Fracao) = 0 then
    Sinal := 0
  else
    Sinal := 1;
  if Cima then
  begin
    Result := (Int(Fracao) + (Sinal));
  end
  else
  begin
    Result := Int(Fracao);
  end;
  Result := result / 100;
end;

Outras funções de arredondamento que podem ser úteis:

function Sgn(X: Extended): Integer;
{ Retorna -1, 0 or 1 de acordo com o sinal do argumento }
begin
  if X < 0 then
    Result := -1
  else
    if X = 0 then
      Result := 0
    else
      Result := 1;
end;
function RoundUp(X: Extended): Extended;
{ Retorna o primeiro inteiro maior que ou igual a um
  dado número em valor absoluto (o sinal e preservado).
  RoundUp(3,3) = 4    RoundUp(-3,3) = -4 }
begin
  Result := Int(X) + Sgn(Frac(X));
end;
function RoundDn(X: Extended): Extended;
{ Retorna o primeiro inteiro menor que ou
  igual a um dado número em  valor absoluto (o sinal é preservado).
  RoundDn(3,7) = 3    RoundDn(-3,7) = -3
begin
  Result := Int(X);
end;
function RoundN(X: Extended): Extended;
{ Arredonda um número "normalmente": caso a parte de fração
  seja >= 0,5 o número será arredondado “para cima” (ver RoundUp)
  caso contrário, se a parte de fração for < 0,5, o
  número será arredondado “para baixo” (ver RoundDn).
  RoundN(3,5) = 4     RoundN(-3,5) = -4
  RoundN(3,1) = 3     RoundN(-3,1) = -3 }
begin
  (*
  if Abs(Frac(X)) >= 0.5 then
    Result := RoundUp(X)
  else
    Result := RoundDn(X);
  *)
    Result := Int(X) + Int(Frac(X) * 2);
end;
function Fix(X: Extended): Extended;
{ Retorna o primeiro inteiro menor que ou
  igual a um dado número.
  Int(3,7) = 3          Int(-3,7) = -3
  Fix(3,7) = 3          Fix(-3,1) = -4 }
begin
  if (X >= 0) or (Frac(X) = 0) then
    Result := Int(X)
  else
    Result := Int(X) - 1;
end;
function RoundDnX(X: Extended): Extended;
{ Retorna o primeiro inteiro menor que ou
  igual a um dado número.
  RoundDnX(3,7) = 3     RoundDnX(-3,7) = -3
  RoundDnX(3,7) = 3     RoundDnX(-3,1) = -4 }
begin
  Result := Fix(X);
end;


function RoundUpX(X: Extended): Extended;
{ Retorna o primeiro inteiro maior que ou
  igual a um dado número.
  RoundUpX(3,1) = 4     RoundUpX(-3,7) = -3 }
begin
  Result := Fix(X) + Abs(Sgn(Frac(X)))
end;
function RoundX(X: Extended): Extended;
{ Arredonda o número "normalmente", porém levando em conta o sinal:
  se a parte de fração for >= 0,5, o número
  será arredondado “para cima” (ver RoundUpX)
  caso contrario, se a parte de fração for < 0,5,

  o número será arredondado “para baixo” (ver RoundDnX).
  RoundX(3,5) = 4     RoundX(-3,5) = -3 }
begin
  (*
  if Abs(Frac(X)) >= 0,5 then
    Result := RoundUpX(X)
  else
    Result := RoundDnX(X);
  *)
    Result := Fix(X + 0.5);
end;

SQL Server - Comparar dois bancos e listar diferenças

Para quem tem dificuldades em manter atualizadas as estruturas de seus clientes, vou postar uma query que compara dois Bancos de Dados. Vejam a query e observem os comentários:

-- BANCO A
use Quantum
SELECT CONCAT(t.name, '.', c.name, ' (', tp.name, ', ', c.length, ', ', c.isnullable, ')') TabelaCampoTipoTamanhoNull, t.name Tabela, c.name Campo, tp.name Tipo, c.length Tamanho, c.isnullable PerniteNull 
into #EstruturaA
FROM SYSCOLUMNS c
inner join SYSOBJECTS t on t.id = c.id
inner join SYSTYPES tp on tp.xtype = c.xtype
where t.xtype = 'U'
go

-- BANCO B
use QuantumNovo
SELECT CONCAT(t.name, '.', c.name, ' (', tp.name, ', ', c.length, ', ', c.isnullable, ')') TabelaCampoTipoTamanhoNull, t.name Tabela, c.name Campo, tp.name Tipo, c.length Tamanho, c.isnullable PerniteNull
into #EstruturaB
FROM SYSCOLUMNS c
inner join SYSOBJECTS t on t.id = c.id
inner join SYSTYPES tp on tp.xtype = c.xtype
where t.xtype = 'U'
go

-- Lista as Tabelas e Campos que só existem no A, e logicamente não existem no B 
SELECT TabelaCampoTipoTamanhoNull ExisteSomenteNoBancoB, Tabela, Campo, Tipo, Tamanho, PerniteNull
FROM #EstruturaB
where TabelaCampoTipoTamanhoNull
not in (SELECT TabelaCampoTipoTamanhoNull
FROM #EstruturaA)

-- Lista as Tabelas e Campos que só existem no B, e logicamente não existem no A 
SELECT TabelaCampoTipoTamanhoNull ExisteSomenteNoBancoA, Tabela, Campo, Tipo, Tamanho, PerniteNull
FROM #EstruturaA
where TabelaCampoTipoTamanhoNull
not in (SELECT TabelaCampoTipoTamanhoNull
FROM #EstruturaB)

SQL Server 2012 e 2014 - Pulando (saltando) sequencia de autoincremento (identity)


A partir do SQL Server 2012 notei existe um bug na sequencia de autoincremrnto dos campos IDENTITY. Notei isso em 25/03/2012, ou seja, logo que lançaram o 2012. Postei no MSDN a questão e mesmo a confirmação do bug por parte de usuários experientes e certificados, pediram pra aguardar que muito possivelmente viria uma correção (ver post).

Mas veio o 2012 SP1 e o 2014 e o problema continua. Exemplo de um caso já no MSSQL 2014, onde o identity salta do 9 para o 1009:

Com o intuito de ajudar os que passam pelo mesmo problema e ainda aguardam uma solução por parte da Microsoft, vou postar uma solução paliativa (gambiarra) para evitar que o salto aconteça.

Basta executar a query abaixo e não haverá mais saltos do identity em todo o servidor (todos os bancos e tabelas, mesmo os criados depois).

Caso prefira troque o nome da Stored Procedure de sp_FixSeeds2012 para sp_FixSeeds[e o numero da sua versao], mas não interfere no funcionamento. Portanto aconselho não perder tempo com isso.

USE master; 
GO
CREATE PROCEDURE sp_FixSeeds2012
AS
BEGIN

    --foreach database
    DECLARE @DatabaseName varchar(255)
    
    DECLARE DatabasesCursor CURSOR READ_ONLY
    FOR
        SELECT name
        FROM sys.databases
        where name not in ('master','tempdb','model','msdb') and sys.databases.state_desc = 'online'

    OPEN DatabasesCursor

    FETCH NEXT FROM DatabasesCursor
    INTO @DatabaseName

    WHILE @@FETCH_STATUS = 0
    BEGIN
    
        EXEC ('USE '+@DatabaseName + '

        --foreach identity column
        DECLARE @tableName varchar(255)
        DECLARE @columnName varchar(255)
        DECLARE @schemaName varchar(255)
    
        DECLARE IdentityColumnCursor CURSOR READ_ONLY
        FOR
        
            select TABLE_NAME , COLUMN_NAME, TABLE_SCHEMA 
            from INFORMATION_SCHEMA.COLUMNS 
            where COLUMNPROPERTY(object_id(TABLE_NAME), COLUMN_NAME, ''IsIdentity'') = 1 
        

        OPEN IdentityColumnCursor

        FETCH NEXT FROM IdentityColumnCursor
        INTO @tableName, @columnName, @schemaName

        WHILE @@FETCH_STATUS = 0
        BEGIN
        
            print ''['+@DatabaseName+'].[''+@tableName+''].[''+@schemaName+''].[''+@columnName+'']'' 
            EXEC (''declare @MAX int = 0
                    select @MAX = max(''+@columnName+'') from ['+@DatabaseName+'].[''+@schemaName+''].[''+@tableName+'']
                    if (@MAX IS NULL)
                    BEGIN
                        SET @MAX = 0
                    END
                    DBCC CHECKIDENT(['+@DatabaseName+'.''+@schemaName+''.''+@tableName+''],RESEED,@MAX)'')

            FETCH NEXT FROM IdentityColumnCursor
            INTO @tableName, @columnName, @schemaName

        END

        CLOSE IdentityColumnCursor
        DEALLOCATE IdentityColumnCursor')



        FETCH NEXT FROM DatabasesCursor
        INTO @DatabaseName

    END

    CLOSE DatabasesCursor
    DEALLOCATE DatabasesCursor
END
GO

EXEC sp_configure 'show advanced options', 1 ;
GO
RECONFIGURE
GO
EXEC sp_configure 'scan for startup procs', 1 ;
GO
RECONFIGURE
GO



EXEC sp_procoption @ProcName = 'sp_FixSeeds2012' 
    , @OptionName = 'startup' 
    , @OptionValue = 'true' 
GO

quinta-feira, 21 de abril de 2016

Tutorial de instalação do FastReport FullSource no Delphi

Aqui partimos do presuposto que você já tem os fontes do FastReport. Segue tutorial de instalação:

  • Desinstale qualquer versão anterior em Components > Install Packages  e exclua a pasta do FastReport de Arquivos de Programas;
  • Feche o Delphi;
  • Na pasta do FastReport, execute o recompile.exe como Administrador;
  • Confira a versão do Delphi;
  • Marque a opção Recompile All Packages;
  • Compile para gerar a pasta Lib23 (onde 23 é a versão do Delphi, observe a mudança se necessário);
  • no recompile.exe marque Change language to e escolha no combobox à direita a opção Brazil (caso não dê certo execute os bats de trabução na pasta RES\Brazil mk.bat e mkall.bat);
  • Abra o Delphi e em Tool > Options > LibraryPath adicione a pasta gerada e traduzida Lib23;
  • Copie todos os arquivos *.BPL e copie em C:\Windows\System32 e C:\Windows\SysWOW64;
  • Em Components > Install Packages adcione os arquivos BPL da pasta Lib23 que começam com dcl*.


Obs.: Caso ocorra algum erro ou aviso, feche o Delphi e abra-o novamente.

FastReport 5 - Erro de violação de acesso ao exportar para PDF pelo componente

Para resolver o erro de Access Violation ao exportar para PDF:

  1. Na Unit onde estiver o compenente de exportação para PDF vá em USES e clique segurando CTRL sobre frxExportPDF (isso abrirá a unit de exportação);
  2. Comente a linha 721  > //CompressedCB.Checked := FCompressed; 
  3. Pressionar [F9] para dar erro;
  4. Confirma a remoção da declaração;
  5. Descomentar a linha 721;
  6. Após isso pressione F12 para apresentar o form e crie um CheckBox com o nome CompressedCB e alinhá-lo em qualquer lugar do form:

Compile novamente. Pronto, o FastReport atribuirá o caption do combobox criado de acordo com o idioma, em tempo de execução.

Postgres no docker

 -- Criar compose nano docker-compose.yml version: '3.7' ### services:   db:     image: postgres     volumes:       - postgres_data:...