Mostrando postagens com marcador RM. Mostrar todas as postagens
Mostrando postagens com marcador RM. Mostrar todas as postagens

domingo, 6 de agosto de 2017

Totvs - RM - Usuários MSSQL - Versão 12.1 (RM)

/* 1º Parte */

 SP_DROPUSER SYSDBA
 GO
 EXEC SP_CHANGEDBOWNER sa
 GO

/* 2º Parte */

/* Criação dos usuários RM e SYSDBA */

IF NOT EXISTS(SELECT * FROM MASTER.DBO.SYSLOGINS WHERE NAME = 'rm')
   CREATE LOGIN rm WITH PASSWORD = 'rm',CHECK_POLICY=OFF
GO


EXEC SP_CHANGEDBOWNER rm
GO

IF NOT EXISTS(SELECT * FROM MASTER.DBO.SYSLOGINS WHERE NAME = 'sysdba')
   CREATE LOGIN sysdba WITH PASSWORD = 'masterkey',CHECK_POLICY=OFF
GO

sp_adduser sysdba,sysdba
GO

GRANT SELECT ON GPARAMS TO sysdba
GO
GRANT SELECT , UPDATE ON GUSUARIO TO sysdba
GO
GRANT SELECT ON GPERMIS  TO sysdba
GO
GRANT SELECT ON GACESSO  TO sysdba
GO
GRANT SELECT ON GSISTEMA  TO sysdba
GO
GRANT SELECT ON GCOLIGADA  TO sysdba
GO
GRANT SELECT ON GUSRPERFIL TO sysdba
GO
GRANT SELECT ON GSERVICO TO sysdba
GO
GRANT SELECT ON GPARAMETROSSISTEMA TO sysdba
GO
GRANT SELECT,INSERT ON GDATALOG TO sysdba
GO
GRANT SELECT ON GMAILPARAMS TO sysdba
GO
GRANT SELECT ON GUPGATUALIZACAO TO sysdba
GO
GRANT SELECT,INSERT,DELETE,UPDATE ON GSESSAOFLUIG TO sysdba
GO
GRANT SELECT,INSERT,DELETE,UPDATE ON GULTIMOCONTEXTOUSUARIO TO sysdba
GO

SP_DEFAULTLANGUAGE 'RM','ENGLISH'
GO
SP_DEFAULTLANGUAGE 'SYSDBA','ENGLISH'
GO

Totvs - RM - Usuários - MSSQL 2012

/* 1º Parte */

 SP_DROPUSER SYSDBA
 GO
 EXEC SP_CHANGEDBOWNER sa
 GO

/* 2º Parte */

/* Criação dos usuários RM e SYSDBA */

IF NOT EXISTS(SELECT * FROM MASTER.DBO.SYSLOGINS WHERE NAME = 'rm')
   CREATE LOGIN rm WITH PASSWORD = 'rm',CHECK_POLICY=OFF
GO


EXEC SP_CHANGEDBOWNER rm
GO

IF NOT EXISTS(SELECT * FROM MASTER.DBO.SYSLOGINS WHERE NAME = 'sysdba')
   CREATE LOGIN sysdba WITH PASSWORD = 'masterkey',CHECK_POLICY=OFF
GO

sp_adduser sysdba,sysdba
GO

GRANT SELECT ON GPARAMS TO sysdba
GO
GRANT SELECT , UPDATE ON GUSUARIO TO sysdba
GO
GRANT SELECT ON GPERMIS  TO sysdba
GO
GRANT SELECT ON GACESSO  TO sysdba
GO
GRANT SELECT ON GSISTEMA  TO sysdba
GO
GRANT SELECT ON GCOLIGADA  TO sysdba
GO
GRANT SELECT ON GUSRPERFIL TO sysdba
GO
GRANT SELECT ON GSERVICO TO sysdba
GO
GRANT SELECT ON GPARAMETROSSISTEMA TO sysdba
GO


segunda-feira, 7 de novembro de 2016

TOTVS RM - CONVERTENDO CAMPO HORA (PFFINANC) PARA FORMATO DE TELA


select   
        codcoligada,
        chapa,
        anocomp,
        mescomp,
        nroperiodo,
        ref,
        hora,
        valor,

        (hora/60.0) hora_base_calc,

        floor(hora/(60.0)) hora_oficial,

        (hora/60.0) - floor(hora/(60.0)) minutos_base_calc,

        (((hora/60.0) - floor(hora/(60.0))) * 60) minutos_base_calc2,

        round((((hora/60.0) - floor(hora/(60.0))) * 60),1) minutos_oficial,

        floor(hora/(60.0)) +
        (round((((hora/60.0) - floor(hora/(60.0))) * 60),1))/100 HORA_TELA

from pffinanc
where hora > 0

sexta-feira, 11 de março de 2016

TOTVS RM - Falha na verificação da base de dados! A base de dados está bloqueada para uso em razão de erros no processo de atualização das versões a seguir:...

 Falha na verificação da base de dados! A base de dados está bloqueada para uso em razão de erros no processo de atualização das versões a seguir:...

Causa: Este erro é apresentado no momento de acesso ao sistema, pois durante o processo de conversão de versão foram apresentados erros e não foram corrigidos.

Solução:

Não existe um processo de solução.

Para analisar o log da conversão:

Análise o log de erros normalmente encontrado no diretório \TOTVS\CORPORERM\RM.NET\ATUALIZADOR\LOG.
Este arquivo é criptografado, e você pode analisá-lo com o programa "RM.Atualizador.LogViewer.exe", localizado em \TOTVS\CORPORERM\RM.NET

Verifique o erro apresentado, corrija a base de dados, e refaça a conversão.

Tabela GUPGATUALIZACAO.

Esta tabela armazena os resultados dos logs de conversão e faz a restrição do acesso ao sistema.



sábado, 29 de agosto de 2015

RM - Dias Úteis

Dias Uteis (SQL)

-DROP FUNCTION DIASUTEISMES

--CREATE FUNCTION DIASUTEISMES (@MES INT, @ANO INT, @CODCOLIGADA DCODCOLIGADA, @CHAPA DCHAPA)
--RETURNS INT

--AS BEGIN

DECLARE @CODCOLIGADA DCODCOLIGADA
DECLARE @CHAPA DCHAPA
DECLARE @MES INT
DECLARE @ANO INT
DECLARE @MESPROX INT
DECLARE @ANOPROX INT
DECLARE @DIATEMP INT
DECLARE @DATATEMP DATETIME
DECLARE @STATUSDATA DATETIME
DECLARE @FERIADO INT
DECLARE @COMPDESC INT
DECLARE @DIASUTEIS INT
DECLARE @DATASTRING VARCHAR(10)

SET @MES = 10
SET @ANO = 2003
SET @CODCOLIGADA = 1
SET @CHAPA = '931.00595'

-----------------------------------------------------------------------------------------
-- PROXIMO MÊS E ANO
-----------------------------------------------------------------------------------------
IF @MES = 12
BEGIN
  SET @MESPROX = 1
  SET @ANOPROX = @ANO+1
END
ELSE
BEGIN
  SET @MESPROX = @MES+1
  SET @ANOPROX = @ANO 
END

PRINT 'MÊS E ANO PARA QUAL SERÁ COMPRADO O BENEFÍCIO'
PRINT 'PRÓXIMO MÊS: '+CAST(@MESPROX AS VARCHAR)
PRINT 'PRÓXIMO ANO: '+CAST(@ANOPROX AS VARCHAR)
PRINT '----------------------------------------'

-----------------------------------------------------------------------------------------
-- DIA COMPENSADO E DIA DE DESCANSO (SÁBADO E DOMINGO)
-----------------------------------------------------------------------------------------

-- ULTIMO DIA DO MES PROXIMO (SEJA 31, 30 OU 28)
SET @DATASTRING = (SELECT  CAST(@MESPROX AS VARCHAR) + '/1/'+ CAST(@ANOPROX AS VARCHAR))
SET @DATATEMP = (SELECT DATEADD(MONTH,1,(CAST(@DATASTRING AS DATETIME))))-1
PRINT 'DATA LIMITE DA COMPRA DO BENEFÍCIO : '+ CAST(@DATATEMP AS VARCHAR)
PRINT '----------------------------------------'

-- CÁLCULO DE SÁBADOS E DOMINGOS

SET @DIATEMP = 0
SET @COMPDESC = 0

WHILE @DIATEMP < DATEPART(DD, @DATATEMP)
BEGIN
  SET @DATASTRING = (SELECT CAST(@MESPROX AS VARCHAR) + '/'+ CAST(DATEPART(DD,@DIATEMP)AS VARCHAR) + '/'+CAST(@ANOPROX AS VARCHAR))
  --PRINT 'DATA STRING 2: ' + @DATASTRING
  SET @STATUSDATA = CAST(@DATASTRING AS DATETIME)
  --PRINT 'DATA DATETIME 2: ' + CAST(@STATUSDATA AS VARCHAR)
  --PRINT '----------------------------------------'
  IF (DATENAME(WEEKDAY,@STATUSDATA) = 'Saturday') OR (DATENAME(WEEKDAY,@STATUSDATA) = 'Sunday')
  BEGIN
    SET @COMPDESC = @COMPDESC+1
  END
  SET @DIATEMP = @DIATEMP+1
END

-----------------------------------------------------------------------------------------
-- FERIADOS
-----------------------------------------------------------------------------------------
SET @FERIADO = 0
SET @FERIADO = (SELECT COUNT(*)
                FROM GFERIADO
                WHERE CODCALENDARIO = (SELECT CODCALENDARIO
                                       FROM PSECAO
                                       WHERE CODCOLIGADA = @CODCOLIGADA
                                       AND CODIGO = (SELECT CODSECAO
                                                     FROM PFUNC
                                                     WHERE CODCOLIGADA = @CODCOLIGADA
                                                     AND CHAPA = @CHAPA))
                AND DATEPART(MM,DIAFERIADO) = @MESPROX
                AND DATEPART(YYYY,DIAFERIADO) = @ANOPROX)

-----------------------------------------------------------------------------------------
-- DIAS UTEIS
-----------------------------------------------------------------------------------------
SET @DIATEMP = 0
SET @DIATEMP = CAST(DATEPART(DD,@DATATEMP)AS INT)
PRINT 'QTD DE DIAS DO MES DE COMPRA BENEFICIO: ' + CAST(DATEPART(DD, @DATATEMP) AS VARCHAR)
PRINT 'QTD DE DIAS DE FERIADO DE COMPRA BENEFICIO: ' + CAST(@FERIADO AS VARCHAR)
PRINT 'QTD DE DIAS DE COMPENSADOS DE COMPRA DE BENEFICIO: ' + CAST(@COMPDESC AS VARCHAR)
SET @DIASUTEIS = (@DIATEMP - @FERIADO - @COMPDESC)
PRINT 'QTD DE DIAS UTEIS DO MES DE COMPRA DE BENEFICIO: ' + CAST(@DIASUTEIS AS VARCHAR)

--RETURN @DIASUTEIS

--END

RM - Coligada Corrente

select ultimacoligada as coligadacorrente
from gusuario
where codusuario = (select username
                    from glogin
                    where computername = (select distinct hostname
                                          from master..sysprocesses
                                          where spid = (select @@spid))
                    and datepart(yyyy,logintime) = (select distinct datepart(yyyy, getdate()) from gcoligada)
                    and datepart(mm,logintime) = (select distinct datepart(mm, getdate()) from gcoligada)
                    and datepart(dd,logintime) = (select distinct datepart(dd, getdate()) from gcoligada))

SQL / RM - Erros C#

-- Script para remoção dos erros do C# como por exemplo
-- Couldn't perform the edit because another user changed the record.

-- ATENÇÃO: ESTE NÃO DEVE SER EXECUTADO SE O BANCO FIZER BACKUP DE LOG

set nocount on
declare @comando varchar(255)
declare @comando1 varchar(255)
declare @comando2 varchar(255)
declare @comando3 varchar(255)
declare @comando4 varchar(255)
declare @database varchar(100)
declare @datab varchar(50)
set @datab = (select distinct table_catalog from information_schema.tables)
if (select count(*) from master.dbo.sysprocesses where dbid in ( select dbid from master.dbo.sysdatabases where name = @datab )) <= 1
begin
    print ' '
    print 'Acertando permissões do banco.'
    exec sp_dboption @datab, 'single', 'true'
    exec sp_dboption @datab, 'trunc. log on chkpt.', 'true'
    exec sp_dboption @datab, 'auto create statistics', 'false'
    exec sp_dboption @datab, 'auto update statistics', 'false'
    exec sp_dboption @datab, 'ansi null default', 'true'
    print ' '
    print 'Verificando base de dados.'
    set @comando1 ='dbcc checkdb ('+@datab+')'
    exec (@comando1)
    print ' '
    print 'Acertando fragmentação na base de dados.'
    set @comando3= 'dbcc newalloc ('+@datab+')'
    exec (@comando3)
    declare @tabela varchar (100)
    declare @comando5 varchar (255)
    declare tabela cursor for
        select name from sysobjects where type = 'u' order by name
    open tabela
    fetch next from tabela into @tabela
    while @@fetch_status = 0
    begin
        print ''
        print 'Verificando tabela '+@tabela
        print ''
        set @comando5 = 'dbcc checktable ('+@tabela +', repair_allow_data_loss)'
        exec (@comando5)
        set @comando = 'dbcc dbreindex ('+@tabela+')'
        exec (@comando5)
        set @comando5= 'dbcc checkconstraints ('+@tabela+')'
        exec (@comando5)
        fetch next from tabela into @tabela
    end
    close tabela
    deallocate tabela
    exec sp_dboption @datab, 'single', 'false'
    declare @tab_nome varchar(255)
    declare @tab_statistic varchar(255)
    declare @sql_str varchar(255)
    declare @db_nome varchar(255)
    select @db_nome=name from master..sysdatabases where dbid=(select dbid from master..sysprocesses where spid=@@spid)
    checkpoint
    declare cur cursor for
        select object_name(id),name from sysindexes where name like '_wa_sys%'
    set nocount on
    open cur
    fetch next from cur into @tab_nome,@tab_statistic
    while(@@fetch_status=0)
    begin
        set @sql_str='drop statistics ' + @tab_nome + '.' + @tab_statistic
        exec (@sql_str)
        fetch next from cur into @tab_nome,@tab_statistic
    end   
    close cur
    deallocate cur
    exec sp_updatestats
    print '*******************************************************************************************'
    print 'FINAL DA MANUNTENCAO'
    print '*******************************************************************************************'
end
else
    begin
    print '****** A T E N Ç Â O *******'
    print 'A BASE ESTÁ SENDO USADA. ESTE SCRIPT SÓ PODE SER EXECUTADO EM MONOUSUÁRIO !!!'
    print '***********************************************************************************************************************'
    print 'Seguintes estações/número de conexões estão acessado a base de dados:'
    declare @tab varchar(20)
    declare @num varchar(2)
    declare tabs cursor for select hostname,count(*) from master.dbo.sysprocesses where dbid in ( select dbid from master.dbo.sysdatabases where name = @datab ) group by hostname
    open tabs
    fetch next from tabs into @tab,@num
    while(@@fetch_status=0)
    begin
        print @tab +'/'+@num
        fetch next from tabs into @tab,@num
    end
    close tabs
    deallocate tabs
end

SQL / RM - Base Vazia

Prezados,
    Quando se for no cliente para criar uma base vazia, ou fazer manutenção no SGDB (Sistema Gerenciador de Banco de Dados) SQL 7.0 ou SQL 2000, não podemos esquecer que analisar e conferir todos os parâmetros de configuração.
Para criação de uma base de dados ou correção da mesma, sugerimos que realizem a seguinte conferência na base de dados do Corpore:
Verifique nas propriedades do banco de dados, na guia Data Files e Transaction Log se está parametrizado para crescer a base automaticamente sem limitação de tamanho;

Na guia options...

    SQL 7.0 - Marcar somente as opções Ansi Null Default, Truncate log on checkpoint, Auto Close e Auto Shirink;

    SQL 2000 - No Recovery/Model colocar como Simple (somente se não realiza backup de log); e marcar somente as opções Ansi Null Default, Auto Close e Auto Shrink;
Confira se existe espaço suficiente para o crescimento da base no drive em que a mesma está localizada;

SQL \ RM - Criptograma

Pessoal,

Conforme solicitado várias vezes a RM Sistemas, alguns clientes solicitam que informações importantes, tais como: valores e datas sejam mascaradas, ou seja, anuladas. O principal intuito é a  preservação e sigilo de informações cadastradas na base de dados. Sendo assim, criamos o procedimento abaixo que fará todo o processo, sendo que haverá necessidade apenas de pré-determinar quais tabelas e quais informações deverão ser anuladas.

veja exemplo abaixo:

Dentro do cursor criado na estrutura da procedure, filtrei as seguintes informações a serem anuladas:

P% => Limitei apenas nas tabelas que começam com a letra P, neste caso tabelas do RM-Labore
SALA% => Cujo campos começam com SALA ou
VALOR% => cujo campos começam com VALOR ou
DATA% => cujo campos começam com DATA

Obs.: Dentro deste cursor o usuário poderá definir vários filtros de acordo com a necessidade.

DECLARE @TABELA VARCHAR(20)
DECLARE @CAMPO  VARCHAR(20)
DECLARE @COMANDO VARCHAR(255)
DECLARE INFO CURSOR FOR
       SELECT T.NAME,C.NAME FROM SYSOBJECTS T, SYSCOLUMNS C
       WHERE T.ID=C.ID AND T.NAME LIKE 'P%' AND (C.NAME LIKE 'SALA%' OR C.NAME LIKE 'VALOR%'OR C.NAME LIKE 'DATA%')
OPEN INFO
 FETCH NEXT FROM INFO INTO @TABELA,@CAMPO
  WHILE @@FETCH_STATUS = 0
   BEGIN
      SET @COMANDO = 'UPDATE ' + @TABELA + ' SET ' + ''+@CAMPO+'' + ' = NULL '
      EXEC ( @COMANDO)
      PRINT 'O campo '+@campo+' da tabela '+@tabela +' foi anulado.'
   FETCH NEXT FROM INFO INTO @TABELA,@CAMPO
 END
CLOSE INFO
DEALLOCATE INFO

SQL - RM Chronus (Exemplo) - Arno

delete from funchor
declare @codcoligada int
declare @chapa       varchar(20)
declare @codsituacao       varchar(20)
--set @chapa ='0276626'
DECLARE CURSOR_CHAPA CURSOR FOR
    SELECT CODCOLIGADA,CHAPA,CODSITUACAO FROM PFUNC WHERE CODSITUACAO IN ('T','P','E','M','F','I')
and chapa ='0461376' --('0263186','0266619)
        OPEN CURSOR_CHAPA
            FETCH NEXT FROM CURSOR_CHAPA INTO @CODCOLIGADA,@CHAPA,@CODSITUACAO
                WHILE (@@FETCH_STATUS<>-1)
BEGIN

delete from calendario
declare @codhorario varchar(10)
declare @chapa2   varchar(20)
declare @contador int
declare @nrodiashor  int
declare @indiniciohorcont  int
declare @inicioindice int
    declare cursor_dias cursor for 
SELECT B.CODCOLIGADA,B.CHAPA,B.CODHORARIO,B.INDINICIOHOR,DATEDIFF(DD,d.iniciopermes,GETDATE())
FROM PFUNC B,AHORARIO C,aparam d
WHERE B.codcoligada=@CODCOLIGADA and B.CHAPA=@CHAPA
AND B.CODCOLIGADA=C.CODCOLIGADA
AND B.CODHORARIO=C.CODIGO
and b.codcoligada=d.codcoligada



open cursor_dias

fetch next from cursor_dias into @codcoligada,@chapa2,@codhorario,@inicioindice,@nrodiashor
    set @contador=@nrodiashor   
    select @indiniciohorcont=@inicioindice
    while @contador<>-1

begin
--drop table calendario
--create table calendario (codcoligada int,chapa varchar(20),data datetime,codhorario varchar(10),indice int,semana varchar(10), constraint pkcalendario primary key (codcoligada,data,codhorario,indice,semana))
insert into calendario
select     @codcoligada,@chapa2,
    convert(datetime,convert(varchar,datepart(yyyy,getdate()))+'/'+
    convert(varchar,datepart(mm,getdate()))+'/'+
    convert(varchar,datepart(dd,getdate())))-@contador,@codhorario,@indiniciohorcont,
    datename(dw,getdate()-@contador)



/*contadores*/

if @indiniciohorcont>=(SELECT MAX(INDICE) FROM ABATHOR WHERE CODHORARIO=@CODHORARIO)
begin
select @indiniciohorcont=(select distinct min(indice)
from abathor where codhorario=@codhorario)
end
else select @indiniciohorcont=@indiniciohorcont+1
select @contador=@contador-1

fetch next from cursor_dias into @codcoligada,@chapa2,@codhorario,@inicioindice,@nrodiashor
end
deallocate cursor_dias


IF @CODSITUACAO = 'F'
BEGIN

delete from func
declare @codcoligada2 int
declare @codhorario2 varchar(10)
declare @chapa3   varchar(20)
declare @contador2 int
declare @nrodiasaft1   int
declare @dtinicio1 datetime

declare cursor_comparacao1 cursor for 


SELECT A.CODCOLIGADA,A.CHAPA,B.CODHORARIO,case
    when dtfIMGOZO IS null
    then  datediff(dd,DTINIGOZO,getdate())
    else datediff(dd,dtiniGOZO,dtfiMGOZO)
    end ,dtiniGOZO
FROM PFHSTFER A,PFUNC B,AHORARIO C
WHERE A.codcoligada=@codcoligada and A.CHAPA=@chapa
AND A.CODCOLIGADA=B.CODCOLIGADA
AND A.CHAPA=B.CHAPA
AND B.CODCOLIGADA=C.CODCOLIGADA
AND B.CODHORARIO=C.CODIGO
AND A.DTINIGOZO=(SELECT MAX(DTINIGOZO) FROM PFHSTFER WHERE codcoligada=@codcoligada AND CHAPA=@chapa)


open cursor_comparacao1
fetch next from cursor_comparacao1 into @codcoligada2,@chapa3,@codhorario2,@nrodiasaft1,@dtinicio1
    set @contador2=@nrodiasaft1      
    while @contador2<>-1

begin
--drop table func
--create table func (codcoligada int,chapa varchar(20),codhorario varchar(10),data datetime, constraint pkfunc primary key  (codcoligada,chapa,codhorario,data))
--delete from func
insert into func
    select @codcoligada2,@chapa3,@codhorario2,@dtinicio1+@contador2



select @contador2=@contador2-1
fetch next from cursor_comparacao1 into @codcoligada2,@chapa3,@codhorario2,@nrodiasaft1,@dtinicio1
end
deallocate cursor_comparacao1
--drop table funchor
--CREATE TABLE FUNCHOR (CHAPA VARCHAR(20),CODHORARIO VARCHAR(10),DATA DATETIME, INDICE INT,SEMANA VARCHAR(10),BASE INT)
INSERT INTO FUNCHOR
select     a.chapa,b.codhorario,a.data,b.indice,b.semana,d.base
from func a,calendario b,abathor c,
(select codcoligada,chapa,base from aafhtfun 
where data = (select max(data) from aafhtfun where codcoligada=@codcoligada and chapa=@chapa)
and codcoligada=@codcoligada and chapa=@chapa)d
where     a.codcoligada=@codcoligada
and    a.codcoligada=b.codcoligada
and     a.chapa=b.chapa
and      a.codhorario=b.codhorario
and      a.data=b.data
and     c.codcoligada=b.codcoligada
and     c.codhorario=b.codhorario
and     c.indice=b.indice
and     a.codcoligada=d.codcoligada
and     a.chapa=d.chapa
and    c.tipo in (0)
and     b.semana <> 'Sunday'
and     b.data not in (select gferiado.diaferiado from gferiado)
and     b.data not in
(select data from aafhtfun,aparam where
aafhtfun.codcoligada=@codcoligada and aafhtfun.chapa=@chapa
and data between iniciopermes and getdate())
group by a.chapa,b.codhorario,a.data,b.indice,b.semana,d.base
order by a.data

END
ELSE
if @codsituacao in ('T','P','E','M')
/*SEGUNDA PARTE - COMPARACAO*/
begin
delete from func
declare @codcoligada1 int
declare @codhorario1 varchar(10)
declare @chapa1   varchar(20)
declare @contador1 int
declare @nrodiasaft   int
declare @dtinicio datetime

declare cursor_comparacao cursor for 
SELECT A.CODCOLIGADA,A.CHAPA,B.CODHORARIO,case
    when dtfinal IS null
    then  datediff(dd,DTINICIO,getdate())
    else datediff(dd,dtinicio,dtfinal)
    end ,dtinicio
FROM PFHSTAFT A,PFUNC B,AHORARIO C
WHERE A.codcoligada=@CODCOLIGADA and A.CHAPA=@CHAPA
AND A.CODCOLIGADA=B.CODCOLIGADA
AND A.CHAPA=B.CHAPA
AND B.CODCOLIGADA=C.CODCOLIGADA
AND B.CODHORARIO=C.CODIGO
AND A.DTINICIO=(SELECT MAX(DTINICIO) FROM PFHSTAFT WHERE CODCOLIGADA=@CODCOLIGADA AND CHAPA=@CHAPA)

open cursor_comparacao
fetch next from cursor_comparacao into @codcoligada1,@chapa1,@codhorario1,@nrodiasaft,@dtinicio
    set @contador1=@nrodiasaft      
    while @contador1<>-1

begin
--drop table func
--create table func (codcoligada int,chapa varchar(20),codhorario varchar(10),data datetime, constraint pkfunc primary key  (codcoligada,chapa,codhorario,data))
insert into func
    select @codcoligada1,@chapa1,@codhorario1,@dtinicio+@contador1



select @contador1=@contador1-1
fetch next from cursor_comparacao into @codcoligada1,@chapa1,@codhorario1,@nrodiasaft,@dtinicio
end
deallocate cursor_comparacao
--drop table funchor
--CREATE TABLE FUNCHOR (CHAPA VARCHAR(20),CODHORARIO VARCHAR(10),DATA DATETIME, INDICE INT,SEMANA VARCHAR(10),BASE INT)
INSERT INTO FUNCHOR
select     a.chapa,b.codhorario,a.data,b.indice,b.semana,d.base
from func a,calendario b,abathor c,
(select codcoligada,chapa,base from aafhtfun 
where data = (select max(data) from aafhtfun where codcoligada=@codcoligada and chapa=@chapa)
and codcoligada=@codcoligada and chapa=@chapa)d
where     a.codcoligada=@codcoligada
and    a.codcoligada=b.codcoligada
and     a.chapa=b.chapa
and      a.codhorario=b.codhorario
and      a.data=b.data
and     c.codcoligada=b.codcoligada
and     c.codhorario=b.codhorario
and     c.indice=b.indice
and     a.codcoligada=d.codcoligada
and     a.chapa=d.chapa
and     c.tipo in (0)--(c.tipo<>1 and c.tipo<>3)-- and c.tipo<>4)
and     b.semana <> 'Sunday'
and     b.data not in (select gferiado.diaferiado from gferiado)
group by a.chapa,b.codhorario,a.data,b.indice,b.semana,d.base
order by a.data
end



FETCH NEXT FROM CURSOR_CHAPA INTO @CODCOLIGADA,@CHAPA,@CODSITUACAO
END
DEALLOCATE CURSOR_CHAPA



/*select * from gferiado where diaferiado='2003-07-04'
select * from abathor where codhorario='20'*/
/*select *
from FUNCHOR where data between '2003-06-16' and '2003-07-15' order by chapa , data
*/
/*
select * from abatfunam WHERE CHAPA = '0334078'

select a.codcoligada,a.chapa from pfunc a where  exists
(select 1 from aafhtfun b where a.codcoligada=b.codcoligada and a.chapa=b.chapa)
and codsituacao = 'P'

select * from gferiado
order by diaferiado

select * from abathor where  CODHORARIO='30' order by INDICE


*/

Oracle - Dicas para Criação / Manutenção de uma instância Oracle



Dicas para Criação / Manutenção  de uma instância Oracle

(RM Sistemas)

O presente documento contém algumas dicas para DBAs manterem suas instâncias Oracle em perfeito estado de funcionamento.

As primeiras dicas referem-se a parâmetros encontrados no arquivo init.ora, encontrado no diretório de instalação da instância Oracle na máquina em questão.

Para alterar alguns deles (quando possível), basta editar o arquivo em questão, salvá-lo e restartar a instância.

Quaisquer dúvidas podem ser encaminhadas ao suporte da RM Sistemas através do mail (suporte@rm.com.br).

Tamanho  do bloco Oracle
                      
Este parâmetro deve ser configurado no momento da criação da base de dados. Sugerimos a utilização de blocos de 8k (DB_BLOCK_SIZE =  8192). 

OBS: Note que o tamanho do bloco deve ser informado em nº de bytes.

Caso a instância já esteja criada, pode-se verificar a configuração deste parâmetro, editando-se o arquivo  de parâmetros (init.ora)  do Oracle e verificando o valor da variável  DB_BLOCK_SIZE.

Uma outra alternativa para visualizar o valor do parâmetro seria a utilização da ferramenta Instance Manager. Aqui, o parâmetro pode ser visualizado através de:
            Initialization Parameters / Instance Specific

A alteração deste parâmetro só pode ser feita caso a instância seja recriada.

 Distribuição da memória  disponível para o Oracle


Depois de determinada a quantidade de memória que estará disponível para o Sistema Operacional e a quantidade que ficará disponível para o Oracle, deve-se fazer a distribuição da memória disponível para o Oracle.
           
o   SORT_AREA_SIZE 

Deve-se configurar este parâmetro com grande cautela, uma vez que ele reflete a quantidade de memória que cada conexão de usuário irá ter disponível para operações de SORT.
Devemos levar em consideração também a quantidade de memória fixa que cada conexão de usuário gasta (1,7 MB).

Sendo assim, o gasto de memória com conexões de usuários em uma aplicação onde estejam abertas 10 sessões e o SORT_AREA_SIZE esteja configurado com o valor de 1048576  (1MB)  é:
         
          10 * (1,7+1) =  27 MB.

OBS: Note que o valor do SORT_AREA_SIZE  deve ser informado em nº de bytes.

O valor a ser configurado para este parâmetro deve ser definido levando-se em consideração  o número de conexões  simultâneas no Oracle e a quantidade de memória disponínel para  mesmo.

o   DB_BLOCK_BUFFER

Este parâmetro irá refletir a quantidade de memória destinada ao Oracle que será utilizada para Cache de dados.

Este parâmetro deve ser configurado com o número de blocos do Oracle que será utilizado para este Cache.

Sugerido:

60% da memória restante destinada ao Oracle destinada ao Cache de dados.

Como calcular o valor do parâmetro:
          
DB_BLOCK_BUFFER =  (M * 1048576) / B

Onde:  M = É a quantidade de memória ( em Mega bytes ) que deve  ser destinada ao Buffer de Dados.
B= Tamanho do bloco de dados (em bytes) utilizado pelo Oracle.

o   SHARED POOL

Este parâmetro irá refletir a quantidade de memória destinada ao Oracle que será utilizada para o SHARED POOL.

Sugerido:

Restante da memória destinada ao Oracle (40%), destinada ao SHARED POOL.

O valor deste parâmetro deve ser determinado de Bytes.

SHARED_POOL_SIZE = M

Onde:  M= Memória destinada ao SHARED POOL em bytes.

Tablespaces


Deve-se criar pelo menos uma TableSpace distinta para cada finalidade: System, Dados,  Indices, Temp, Rollback, Redo.

É desejável também que os DataFiles destas TableSpaces sejam distribuídos em discos diferentes, de forma a minimizar a concorrência de acesso. Isto deve ser feito conforme a disponibilidade de discos. Exemplo:

           Cenário 1:

           Um disco:

System, Dados,  Iindices, Temp, Rollback , Redo no mesmo disco, mas em TableSpaces diferentes.

           Cenário 2:

           Dois discos:

                       1º disco:  Dados + Temp + Rollback
2º disco: System + Indices + Redo

CPU


Deve-se verificar costantemente a taxa de utilização da CPU, a mesma não deve estar com taxa de utilização muito alta durante a maior parte do período (90% de utilização).

Caso esteja utilizando mais de um processador deve-se verificar se a carga da CPU está balanceada.

Para estas medições, pode se utilizar a ferramenta Performance Monitor (no caso de servidores Windows NT/2000).

COALESCE


Deve-se verificar periodicamente (mensalmente) a fragmentação do espaço livre  alocado para cada TableSpace.

o   Pode-se verificar tal fragmentação utilizando:

SELECT TABLESPACE_NAME, TOTAL_EXTENTS , PERCENT_EXTENTS_COALESCED
FROM  DBA_FREE_SPACE_COALESCED
WHERE PERCENT_EXTENTS_COALESCED <> 100

o   Para efetuar a desfragmentação:

ALTER TABLESPACE tablespace COALESCE

Atualização de estatísticas


A rotina de atualização de estatísticas deve ser agendada para execução diária..

Sugere-se o utilizar o Package DBMS_UTILITY para fazer a atualização de estatísticas:

execute DBMS_UTILITY.analyze_schema('RM','COMPUTE')

Para agendar a execução diária de estatísticas em um servidor que esteja utilizando o  Windows NT ou Windows 2000:

1º) crie um arquivo TXT com o seguinte conteúdo:

execute DBMS_UTILITY.analyze_schema('RM','COMPUTE')

             2º)  Utilize o command prompt para agendar a tarefa :

at  22:00 every:M,T,W,Th,F,S,Su cmd /c "sqlplus rm/rm @d:\temp\script.txt"

O comando acima agenda a atualização de estatíscas para ocorrer todos os dias às 22:00 horas. Considera-se que o arquivo TXT criado no primeiro item é o d:\temp\script.txt

Indices

Os índices devem ser reconstruídos periodicamente (mensalmente) , ou após periodo de grande “deleção” dos mesmos.

Para a verificação do percentual de linhas deletadas em um determinado índice utilize:

1º)  Analyze :
               
     ANALYZE INDEX indice VALIDATE STRUCTURE;
    
2º)  Verificando o percetual de deleção:

SELECT LF_ROWS , DEL_LF_ROWS
FROM INDEX _STATS

OBS: Caso 30% das linhas em folhas (LF_ROWS) tenham sido deletados (DEL_LF_ROWS), o índice deve ser reconstruído.

    3º)             Reconstrução do índice:

          ALTER INDEX indice REBUILD tablespace.

Para reconstruir o índice, durante o REBUILD  deve haver espaço disponível para a coexistência dos dois índices (antigo e novo).

O comando abaixo gera um script para a reconstrução de todos os índices da base de dados:

SELECT 'ALTER INDEX  ' ||  INDEX_NAME || 
' REBUILD TABLESPACE RM_INDICES; '
FROM USER_INDEXES

Este script deve ser executado em um momento em que não haja acesso à base de dados.

Export / Import


O Export e Import da base de dados deve ser feito periodicamente com finalidade de reorganizar os dados dentro da base de dados, desfragmentar e resolver casos de linhas Migradas.

Sugere-se fazer a Exportação / Importação da base de dados de 2 em 2 meses.

Passos para a execução do Export / Import
                      
§  Export da base.
§  Backup físico da base
§  Drop do Schema
§  Import da base

OBS: Semanalmente sugere-se  verificar o número de linhas MIGRADAS na base de dados. Caso o número esteja muito alto, deve-se fazer o Export / Import da base.

Para verificar o número de linhas MIGRADAS utilize:

            SELECT TABLE_NAME, CHAIN_CNT
                        FROM USER_TABLES
ORDER BY CHAIN_CNT DESC

OBS:  A coluna CHAIN_CNT, reflete não apenas o número de linhas migradas, mas o processo de Export / Import irá atacar apenas este problema.

ALERT


O ALERT dever ser verificado diariamente . Deve-se verificar se existem mensagens de erro do tipo ORA-00600 e /ou ORA-01578 , que indicam erros internos do Oracle ou blocos corrompidos.

Caso a mensagem esteja acontecendo, o problema deve ser analisado e solucionado antes que se torne ma