Tendo a necessidade para um maior controle das ligações que são feitas e dividir os custos por setor da empresa, iremos integrar o LOG que o software remora cria a cada ligação que é feita.
O PABX intelbras permite controlar as ligações atráves de usuário e senha, os usuário vão de 00 a 99, o pabx está conectado no servidor atraves da porta serial.
O remora gera 2 tipos de LOG, sendo um por ramal onde originou as ligações e outro por codigo de usuário que fez as ligações. Este logs ficam dentro na pasta(INTEGRA) onde o remora foi instalado.

Esta integração será feita usando um script PHP que ficara como uma tarefa agendada(CRON), para ser executada 2 vezes por dia, as 12h e 24h.

arquivos de log
Por código sendo os 2 ultimos caracteres no nome do arquivo o codigo de usuário.
CODIGO00.TXT, CODIGO01.TXT, CODIGO02.TXT, CODIGO03.TXT, CODIGO04.TXT…

CONTEUDO DO ARQUIVO CODIGO00.TXT

1
2
3
4
Hora     T OP TR RRRRR NNNNNNNNNNNNNNNNNNNN HH:MM:SS HH:MM:SS DD/MM/AAAA CL 99999,99 CP DDDDDDDDDDDDDDDDDDDDDDDDD
15:55:43 S 12 32   304 99999999             15:36:35 00:00:18 20/10/2011  5     0,28 00 CELULAR DDD 016
15:55:45 S 12 04   304 99999999             15:37:24 00:00:14 20/10/2011  7     0,13 00 FRANCA
16:00:06 S 12 31   304 99999999             15:59:41 00:00:23 20/10/2011  5     0,00 00 Fabiano celular

CONTEUDO DO ARQUIVO RMO00300.TXT
Por ramal sendo os 5 ultimos caracteres no nome do arquivo o numero do ramal.
RMO00300.TXT

1
2
3
03   300 99999999         10:30:54 00:00:07 20110627         0,15 12
32   300 99999999         10:41:51 00:02:46 20110627         2,10 12
01   300 99999999         10:50:51 00:00:07 20110627         0,15 12

Obs.: não esqueça de configurar o PHP para conectar ao oracle

Caso seu servidor web esteja em um ambiente separado do servidor com o remora instalado, você poderá criar scripts em shell para transferir os arquivos ou compartilhar a pasta, enfim faça da maneira que irá te atender.

Vamos ao que interessa;
O codigo está comentado, por isso não vou explicar passo a passo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
set_time_limit(0); //definiar tempo para execução do script caso o arquivo tenha muitas linhas
ob_start();
 
require_once('conecta_oracle.php');
//configure conforme o seu ambiente.
// "\ip_servidorpasta_compartilhadaarquivos do LOG"
$diretorio_data = "C:\intranet\www\data_txt\";
 
//listar arquivos do diretorio.
$$dir = @opendir($diretorio_data);
$i=0;
while (false !== ($file = readdir($$dir))) {// while pastas
	if ($file != "." && $file != ".." && $file != "Thumbs.db" && $file != $dir) { // if pastas
		$i++;
		$indice[$i] = "$file";
		$nm_arquivo 	= $indice[$i] = "$file";
		$tipo		= substr($indice[$i], 0, 6);
		$codigo_ramal	= substr($indice[$i], 6, 2);
 
 
// recebe parametros
	if($tipo == 'CODIGO'){
		//imprimi o nome do arquivo
		echo $nm_arquivo;
		echo ' -- '.$i.'<br />';
 
		$arquivo = $diretorio_data.$nm_arquivo;
 
			if (file_exists($arquivo)) {
 
			$ponteiro = fopen ("$arquivo", "r");
 
			$num_linhas = 0;
			$caracteres = 0;
 
				while (!feof ($ponteiro)) {
					if ($linha = fgets($ponteiro, 4096)){
						$num_linhas++;
						$caracteres += strlen($linha);
 
						if ($num_linhas != "1"){ // ignorar a primeira linha do arquivo cabeçalho.
							$DATA_IMPORTACAO = date('d/m/Y');//;
							$DS_USUARIO = 'import';
							$CD_PABX = $codigo_ramal;
 
							$HR_LEITURA			= substr($linha, 0, 9);
							$DS_TIPO			= substr($linha, 9, 1);
							$DS_OP 				= substr($linha, 11, 2);
							$DS_TR 				= substr($linha, 14, 2);
							$NR_RAMAL 			= substr($linha, 17, 5);
							$NR_LIGACAO 		= substr($linha, 23, 20);
							$HR_LIGACAO			= substr($linha, 44, 8);
							$DS_DURACAO 		= substr($linha, 53, 8);
							$DT_LIGACAO			= substr($linha, 62, 10);
							$DS_CL 				= substr($linha, 73, 2);
							$VL_LIGACAO			= substr($linha, 76, 8);
							$DS_CP 				= substr($linha, 85, 2);
							$DS_DESTINO 		= substr($linha, 88, 25);
 
							$consulta = "INSERT INTO hak_pabx_registro_codigo_tb (
							NR_SEQUENCIA, DATA_IMPORTACAO, DS_USUARIO, CD_PABX, HR_LEITURA, DS_TIPO, DS_OP, DS_TR,
							NR_RAMAL, NR_LIGACAO, HR_LIGACAO, DS_DURACAO, DT_LIGACAO, DS_CL, VL_LIGACAO, DS_CP, DS_DESTINO
							)
							VALUES (
							HAK_TELEFONIA_SEQ.Nextval, '$DATA_IMPORTACAO', '$DS_USUARIO', '$CD_PABX', '$HR_LEITURA', '$DS_TIPO', '$DS_OP', '$DS_TR',
							'$NR_RAMAL', '$NR_LIGACAO',	'$HR_LIGACAO', '$DS_DURACAO', '$DT_LIGACAO', '$DS_CL', '$VL_LIGACAO', '$DS_CP', '$DS_DESTINO'
							)";
 
								$stid = oci_parse( $conexao, "".$consulta."" ) or die ( " erro " . oci_error() );
 
								oci_execute ( $stid );
									//$exec = oci_execute( $stid , OCI_DEFAULT);
								oci_commit( $conexao );  // commits all new values: 1, 2, 3, 4, 5
 
						}//if ignora primeira linha
					}//if
				}//while
				echo 'total de importações: ' . $num_linhas_total  = $num_linhas_total + $num_linhas;
				fclose ($ponteiro);//FECHA O PONTEIRO DO ARQUIVO
				// você poderá apagar o arquivo para não importar o mesmo arquivo 2 vezes, ou renomear
//unlink("$arquivo");
				//rename($arquivo, "importado".$arquivo."000");//
			}//exists
			else { // FILE EXISTS
				echo "O arquivo $arquivo não FOI FOI ENCONTRADO";
				}
	}//tipo
 
	}
} // fecha while
 
oci_free_statement($stid);
oci_close($conexao);//fecha a conexão atual

Read More →

Oracle/PLSQL: Criando Sequence (CREATE SEQUENCE)

Uma sequence é um gerador de numeros sequenciais, e pode ser parametrizada conforme sua necessidade.

Comando para criar a sequence
Sintaxe

create sequence TESTE_SEQ
minvalue 1
maxvalue 9999999999
start with 1
increment by 1
nocache
cycle;

minvalue = Valor minimo
max value = valor máximo que poderá chegar
start with = valor inicial
increment by 1 = (incremento), se este valor for 2, a sequence será incrementada como; 1,3,5,7,…
CYCLE = Sequencia será recomeçada ao atingir o valor maximo
NO CYCLE = default
OWNED BY table.col = Associa a uma coluna
OWNED BY NONE = sem associação

para testar a sequence

Read More →

Downloads, tutoriais de instalação e muito mais, confira.

Site Oficial do PostgreeSQL
http://www.postgresql.org/

Site Brasileiro sobre PostgreSQL
http://www.postgresql.org.br/

Site oficial do PHP com instruções de configuração e uso das funções do PostgreeSQL.

http://br2.php.net/manual/pt_BR/book.pgsql.php

Abrindo uma conexão com o banco

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$bdcon = pg_connect("dbname=flavia");
//conecta a um banco de dados chamado "flavia"
 
$bdcon2 = pg_connect("host=localhost port=5432 dbname=flavia");
// conecta a um banco de dados chamado "flavia" em "localhost" na porta "5432"
 
$bdcon3 = pg_connect("host=ovelha port=5432 dbname=flavia user=ze password=buu");
//conecta a um banco de dados chamado "flavia" na máquina "ovelha" com um usuário e senha
 
$con_string = "host=ovelha port=5432 dbname=flavia user=ze password=buu";
$bdcon4 = pg_connect($con_string);
//coneta a um banco de dados chamado "flavia" na máquina "ovelha" com um usuário e senha
?>

Fechando a conexão com o banco

1
2
3
4
5
6
<?php
      $dbconn = pg_connect("host=localhost port=5432 dbname=mary")
          or die("Não foi possível conectar");
      print("Conexão bem sucedida");
      pg_close($dbconn);
  ?>

Projeto Service manager

01 Introdução – http://blog.fabianobento.com.br/2011/09/projeto-service-manager/
02 Padrões para o projeto e especificações – http://blog.fabianobento.com.br/2011/09/projeto-service-manager-padroes-para-projeto-especificacoes/

Padrões para Nomenclatura em um banco de dados
1. INTRODUÇÃO

O objetivo deste documento é prover informações para formalizar a nomenclatura dos objetos de banco de dados, bem como apresentar regras para sua utilização evitando assim o hábito de existir diferentes nomenclaturas dentro da aplicação.
O documento apresenta os objetos de banco de dados com três itens:
Sintaxe, regras e exemplo. Isto para facilitar o entendimento do desenvolvedor.

2. BANCO DE DADOS

O nome do banco de dados deverá identificar o negócio que está sendo automatizado ou deverá refletir a sigla da aplicação.

Sintaxe:

{[a.. z]} _ xxxxxx , onde:

xxxxxx – indica o nome da aplicação que o banco de dados irá atender.
Para o nome da aplicação utilizar tudo em minúsculo com no máximo 25 caracteres de ‘a’ a ‘z’.

3. TABELAS

Exemplos:

tb_ordem_servico – Tabela de ordens de serviços
tb_pessoa – Tabela de pessoa física
tb_cliente – Tabela de clientes.

4. NOME DAS COLUNAS

Identificação Descrição do atributo Tipo de dado utilizado
NM Nome de coluna que irá armazenar valores “string”, ou seja, caracteres.(utilizar para nome próprio) String
NR Nome de coluna que irá armazenar valores numéricos inteiros, para conteúdos significativos. Numérico
IE INDICAR SITUAÇÕES ESPECIAIS, 

Nome de coluna que irá armazenar valores numéricos inteiros, utilizado em um dicionário de dados (Domínio)

Ex. 0 Aberto, 1 Fechado, 3 Cancelado

Numérico/String
DS Nome de coluna que irá armazenar valores “string”, ou seja, caracteres que são descritivos. String (caracteres)
DT Nome de coluna que irá armazenar valores do tipo data Data
HR Nome da coluna que irá armazenar valores do tipo hora Hora
VL Nome de coluna que irá armazenar valores numéricos, ou seja, números que podem possuir casas decimais Numérico
CD Nome de coluna que irá armazenar valores numéricos inteiros, utilizado em atributos falsos. Numérico
ST Nome de coluna que irá armazenar valores do tipo caracteres com conteúdo pré-estabelecido. Ex. Coluna ST_Cliente pode ter seu conteúdo como sendo “A” ou “I” e nenhum outro valor a não ser esses estipulados String
SG Nome de coluna que irá armazenar siglas, EX. Coluna SG_ESTADO pode ter seu conteúdo como sendo as siglas de estados, SP, MG, GO, SC. String

Regras:

– Para siglas utilizar todas as letras em maiúsculo;
– Usar palavras no singular e sem acentuação;
– Usar nome que identifique e individualize o dado dentro da tabela;
– Dar nomes distintos para dados distintos;
– Utilizar o nome sempre no singular;
– Sempre acrescentar comentário sobre a informação da coluna

Exemplos:

Cd_pessoa – código da pessoa
nm_pessoa – nome da pessoa
dt_nascimento – data de nascimento
vl_salario – valor do salário

As informações da padronizção do banco de dados foram criadas a partir de estudos e pesquisas em outros sistemas e na internet.

Navegando na internet encontrei este artigo que mostra como otimizar o armazenamento do IP como inteiro, e alertar para o uso inadequado de tipos de dados.
O artigo é bem simples e fácil de entender.

====== post original ======
Neste artigo explicarei qual a principal vantagem de armazenarmos endereços IP com o tipo de dados “inteiro” ao invés do tradicional “char/varchar”. E isto pode servir de exemplo para outros campos/colunas. Para que você possa entender melhor vamos criar uma tabela simples de forma que possamos armazenar algum endereço IP utilizando o tipo CHAR.

mysql&gt; CREATE DATABASE exemplo;
mysql&gt; USE exemplo;
 
mysql&gt; CREATE TABLE log
           (
            id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
            usuario CHAR(30),
            visitas INT,
            ip CHAR(15)
           );

Vamos inserir alguns registros nesta tabela.

mysql&gt; INSERT INTO log VALUES(null, 'douglas', 10, '192.168.10.10');
mysql&gt; INSERT INTO log VALUES(null, 'luciana', 10, '200.213.162.161');
mysql&gt; INSERT INTO log VALUES(null, 'alberto', 10, '213.187.0.1');

Bem, por enquanto temos três registros em nossa tabela, começaremos nossa primeira análise.

[Leia Mais]

Read More →

MariaDB é um servidor de banco de dados que oferece a funcionalidade de substituição drop-in para o MySQL. MariaDB é construído por alguns dos autores originais do MySQL, com a ajuda da grande comunidade de desenvolvedores de software livre e open source. Além das funcionalidades básicas do MySQL, MariaDB oferece um rico conjunto de aprimoramentos de recursos, incluindo mecanismos de armazenamento alternativo, otimizações de servidores e patches.

MariaDB é impulsionada principalmente pelos desenvolvedores de Monty Program, uma empresa fundada por Michael “Monty” Widenius, o autor original do MySQL, mas isso não é toda a história sobre MariaDB. Em “Sobre MariaDB” página você vai encontrar mais informações sobre todos os participantes da comunidade MariaDB, incluindo o armazenamento e motores XtraDB PBXT.

MariaDB.com é organizado pela Open Database Alliance, um consórcio independente de fornecedor de desenvolvedores de código aberto do banco de dados e provedores de solução. O Open Database Alliance garante que você vai encontrar produtos, suporte e serviços para MariaDB que são os melhores da indústria do software tem para oferecer.

Obrigado pelo seu interesse em MariaDB. Estamos ansiosos para fornecê-lo com um produto e projeto que se adapte às suas necessidades, seja na implantação de um blog ou um hobby datacenter da empresa-classe!

Tradução Google,  http://mariadb.org/

Continuação do artigo Funções básicas do MySQL – Iniciantes

Hoje vou falar um pouco sobre funções lógicas e strings.

Funções Lógicas

Podemos usar algumas funções logicas dentro do MySQL, como exemplo a comparação entre duas colunas COL1, COL2; se col1 for maior que col2, enfim vamos ao que interessa.

SSELECT IF (COL1 > COL2, )

http://dev.mysql.com/doc/refman/4.1/pt/logical-operators.html

Funções de String

As funções de string server para manipulação de texto, como remoção de espaços em branco, maiusculas e minusculas entre outros recursos, que ajuda no desenvolvimento de sites e sistemas

Antes de começarmos crie uma tabela chamada clientes conforme abaixo;

MySQL Trigger(Gatilho)

O que é um trigger ?

Trigger ou gatilho é uma função implementada a partir da versão 5.0.2 do MySQL.
Ele funciona associado a um evento do banco de dados, sempre que for executado uma instrução SQL, insert, delete ou update em determinada tabela o gatilho é disparado.

Criando um trigger

Sintaxe para criação de um trigger

CREATE TRIGGER nome_gatilho
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE }
ON tabela
FOR EACH ROW
triggered_statement

Tradução da sintaxe

Criar um gatilho com_esse_nome
BEFORE (antes) ou AFTER (depois) da ação na tabela
INSERT(sempre que uma nova linha é inserida) ou UPDATE (sempre que uma nova linha é atualizada) ou DELETE(sempre que uma linha é deletada)
ON tabela
FOR EACH ROW
INSERT tabela_arquivo (ID, data) VALUES (tab.ID, tab.DATA);

Observações:
Se você usar multiplas instrução dentro do seu trigger é necessário usar BEGIN e END para indicar o inicio e fim da instrução do trigger.
Lembrando que é necessário alterar o delimitador antes da execução do trigger pelo comando DELIMITER || e voltando para ;(ponto e virgula) usando DELIMITER ;

Para visualizar os triggers use o comando.

mysql> SHOW TRIGGERS;

Este post é um resumo sobre trigger, para saber mais visite a documentção oficial no link(inglês): http://dev.mysql.com/doc/refman/5.0/en/triggers.html

As funções do MySQL podem ser divididas nos seguintes tipos: numericas, lógica, manipulação string, e funções de data e hora.

Funções numéricas

Iniciando hoje vou falar sobre funções numéricas que são compostas de operações matemáticas, e deve chamar a função dentro da instrução SQL.

Estou acrescentando esta parte da criação da tabela pela dica do meu xará.. crie uma tabela com o nome precos e insira as linhas conforme SQL abaixo.

CREATE TABLE `precos` (
`col1` INT( 3 ) NOT NULL ,
`col2` INT( 3 ) NOT NULL
) ENGINE =  MYISAM;

INSERT INTO `precos` (`col1` ,`col2`)
VALUES ('2', '4'), ('4', '6'),('5', '9');

Adição

SELECT(col1 + col2) as Resultado FROM precos

Suponhamos que na tabela precos você tenha 3 linhas, conforme abaixo;

col1 col2
2 4
4 6
5 9

Apos fazer a consulta o resultado seria:

Resultado
6
10
14

A consulta somou as linhas separadas, para somar o total das colunas em cada linha, ficaria assim:

SELECT (SUM(col1) + SUM(col2)) as Resultado FROM precos
Resultado
30

Subtração

SELECT(col1 - col2) as Resultado FROM precos

Resultado
-2
-2
-4

Multiplicação


O operador utilizado para mutiplicação é o ( * asterisco).

SELECT(col1 * col2) as Resultado FROM precos

Resultado
8
24
45

Divisão


O operador utilizado para divisão é a ( / barra).

SELECT(col1 / col2) as Resultado FROM precos

Resultado
0.5000
0.6667
0.5556

Se tentar dividir por zero será retornado o valor NULL

Multiplicação


O operador utilizado para mutiplicação é o ( * asterisco).

SELECT(col1 * col2) as Resultado FROM precos

Resultado
8
24
45

Módulo ou MOD


Esta função retorna o restante de dois numeros. Exemplo: 21 / 5 (vinte e um dividido por 5), o resto seria 1

SELECT MOD(21, 5) AS Resultado

Resultado
1