| |
Oct 16
Assim como hoje não é mais necessário você desenvolver um Blog por causa do WordPress acredito que criar um Chat de suporte para seu site também esta deixando de ser graças ao LiveZilla.
Neste tutorial vou mostrar como instalar o LiveZilla usando MySQL, PHP e WinXP.
O processo é rápido é vai deixar seu chefe e cliente contentes.
O primeiro passo é baixar o LiveZilla aqui (http://livehelp.livezilla.net/downloads/en/).
Tenha o MySql e PHP instalado recomendo usar o Wamp para efetuar o teste (http://www.wampserver.com/en/).
Para instalar não tem segredo é next, next finish.
Depois de instalar ele vai criar dois atalhos na área de trabalho o LiveZilla Client e o LiveZilla Server Admin.
Vamos abrir o LiveZilla Server Admin para configurar nosso Chat.
Selecione “Create new LiveZilla Server” e clique no botão Next.

Vai surgir uma tela para você criar uma conta Admin no sistema.
Preencha os campos como no exemplo e clique no botão Next.

Na próxima tela mostra um formulário para criar o primeiro grupo de suporte para o Chat. Depois é possível criar mais grupos de suporte.
Preencha os campos como no exemplo e clique no botão Next.

Agora chegou a hora de gerar os arquivo PHP do Chat.
Você tem a opção de enviar via FTP ou extrair localmente.
Eu no exemplo uso o Wamp então enviei direto para meu dir www/livezilla.
Escolha sua opção e clique em Next.

Apos enviar o arquivo surge a tela para testar a instalação do LiveZilla.
Basta informar o nome da conexão com o server e sua URL.
Clique no botão Server Test se estiver ok

Agora clique no botão test e digite o nome de usuário e senha que foi criado para o Admin e clique no botão Ok para iniciar o teste.

Se o teste ocorreu com sucesso clique no botão Serverpage e você verá esta pagina.

Feche a janela de Test e clique em Next para configurar o MySQL.
Preencha os campos como no exemplo e clique no botão Create Tables.
Caso tenha algum ao criar as tabelas clique no link Show SQL Dump e execute direto no seu BD.

Se a conexão estiver correta clique em Next e para finalizar a configuração.

Agora vamos clicar no atalho LiveZilla Client para iniciar o atendimento do Chat.
Entre com o nome de usuário e senha criados para o Admin e seu Chat já esta funcionando.

Abra o navegador e digite a URL do ser LiveZilla no meu caso http://localhost/livezilla/
Clique no link Start Demo Chat.
Preencha os campos como no exemplo e clique em iniciar Chat.

Agora no LiveZilla Client vai surgir uma solicitação para iniciar o Chat.
Clique em Accept Request e iniciar.

A instalação esta feita agora basta explorar o LiveZilla pois existem muitas opções para facilitar o trabalho do pessoal do suporte.
Em um post futuro irei comentar estas funções.
Caso tenha alguma duvida ou sugestão deixe um comentário que terei prazer em ajudar.
Comentários são bem vindos assim posso melhorar a qualidade dos tutoriais aqui apresentados.
É isso pessoal uma ótimo final de semana e até o próximo post.
Tags: Chat, LiveZilla, MySQL, Suporte
Sep 17
Hoje estava precisando concatenar dados de um campo e descobri que no PostgreSQL não existe uma função equivalente ao group_concat do MySQL.
Exemplo do MySQL
select GROUP_CONCAT(nome ORDER BY nome DESC SEPARATOR ',') as nomes from usuarios
Então procurando na web encontrei esta função.
MS SQL to Postgre SQL
create aggregate array_accum (
sfunc = array_append,
basetype = anyelement,
stype = anyarray,
initcond = '{}'
);
CREATE OR REPLACE FUNCTION _group_concat(text, text)
RETURNS text AS $$
SELECT CASE
WHEN $2 IS NULL THEN $1
WHEN $1 IS NULL THEN $2
ELSE $1 operator(pg_catalog.||) ',' operator(pg_catalog.||) $2
END
$$ IMMUTABLE LANGUAGE SQL;
CREATE AGGREGATE group_concat (
BASETYPE = text,
SFUNC = _group_concat,
STYPE = text
);
Para executar a função basta usar.
select group_concat(distinct nome) as nomes from usuarios
Caso tenha alguma duvida ou sugestão deixe um comentário que terei prazer em ajudar.
Comentários são bem vindos assim posso melhorar a qualidade dos tutoriais aqui apresentados.
É isso pessoal uma ótima semana e até o próximo post.
Aug 25
Seguindo outros tutoriais sobre como importar dados, desta vez vamos fazer um script para capturar dados de uma pagina HTML e gerar um SQL de insert. Nesta pesquisa estou procurando por links dentro de uma determinada Tag. Estou usando o ID dos elementos como referência. Veja a importância de não repetir os IDs dos elementos. Chega de conversa e vamos direto ao ponto.
<?php
header("Content-Type: text/html; charset=UTF-8");
// URL que irei pegar os links
$url = "http://pt.wikipedia.org/wiki/Categoria:Especialidades_m%C3%A9dicas";
$conteudo = null;
// Abro conexão de leitura.
$conecurl = @fopen("$url","r") or die ('<center>erro na conexão<br><b>informe o administrador erro 15 </b></center>');
while(!feof($conecurl)) {
$conteudo .= fgets($conecurl,4096);
}
// Fecho conexão.
fclose($conecurl);
// Aqui vou informar a primeira tag para o filtro do HTML eu peguei um elemento com id por ser unico no HTML.
$inicio = strpos($conteudo,'<div id="mw-subcategories">');
// Pego outro elemento com id para finalizar o range de busca.
$fim = strpos($conteudo,'<div id="mw-pages">');
// Pegamos a posição final menos a inicial para ver quanto iremos pular.
$quantopula = $fim - $inicio ;
$conteudo = substr($conteudo, $inicio ,$quantopula);
function pegaLink($html){
// ER para pegar todas as tags de links.
$er = "/<a.*?href=(\".*?\"|[A-Za-z0-9_]*?).*?>.*?<\/a>/";
preg_match_all($er,$html,$links);
$link = $links[0];
return $link;
}
function pegaNomeLink($url){
// ER para pegar o nome da tag de link.
$label = str_replace("</a>","",preg_replace("/^<a.*?>/","",$url));
return $label;
}
// Pego um array com todos os links
$links = pegaLink($conteudo);
$query = NULL;
// Inicio da query.
$query .= "insert into especialidades (nome) values ";
// Faço um loop para fazer o insert de cada item.
foreach ($links as $value) {
$item = '(';
// Removo o link e pego apenas o nome.
$item .= "'".pegaNomeLink($value)."'";
$item .= ')';
$values[] = $item;
}
// Transformo o Array em uma String.
$query .= implode(',', $values);
echo $query;
?>
Caso tenha alguma duvida deixe um comentário que terei prazer em ajudar.
Comentários são bem vindos assim posso melhorar a qualidade dos tutoriais aqui apresentados.
É isso pessoal tenham uma ótima semana e até o próximo post.
Jul 28
Comecei a me aventurar no mundo do Visual C++ semana passada e de cara tive dificuldade para fazer uma conexão com o querido MySQL por este motivo criei este
rápido tutorial.
O primeiro passo é baixar e instalar MySQL .NET e ODBC Connectors para conexão com .NET
ODBC Driver
.NET Data Provider Driver
Depois crie um banco e uma tabela no MySQL para fazer um teste.
Crie um novo projeto no Visual C++ -> CLR -> Windows Forms Application e coloque um nome.
Com o projeto criado vamos adicionar uma referencia.
Vá no Solution Explorer clique com o botão direito em cima do nome do projeto e vá em References…
Agora em Common Properties -> References clique no botão Add New Reference…
Clique na aba Browse e vá no diretorio onde foi instalado o MySQL Connector .Net e Add a MySql.Data.dll
O caminho padrão é “C:\Arquivos de programas\MySQL\MySQL Connector Net 6.1.0\Assemblies”
Com a Reference MySql.Data adicionada basta usar ela no projeto.
No projeto padrão irá ter um arquivo Form1.h vá no modo Form1.h[Design] e abra Toolbox adicione um button e um DataGrid
O DataGrid não vai esta ativado por padrão para adicionar ele no Toolbox clique com o botão direito em cima de um componente e vá em Choose Items…
Agora marque o componente da coluna Name DataGrid com namespace System.Windows.Forms.
Dê um duplo clique no button e vai abrir o Form1.h com uma função para o button.
Adicione o código abaixo e configure conforme seu servidor esta setado.
String^ strcon = "database = test; data source = localhost; user id = root; password =";
MySqlConnection^ mycon = gcnew MySqlConnection(strcon);
String^ sqlquery = "select * from tb_imagem";
MySqlDataAdapter^ myadp = gcnew MySqlDataAdapter(sqlquery, mycon);
DataSet^ myds = gcnew DataSet();
myadp->Fill(myds,"tb_imagem");
dataGrid1->DataSource = myds->Tables["tb_imagem"]->DefaultView;
dataGrid1->SetDataBinding(myds, "tb_imagem");
No inicio do arquivo Form1.h você encontrara varios namespaces adicionados inclua agora o namespace do MySql
using namespace MySql::Data::MySqlClient;
Agora aperte F5 para iniciar o Debug. Se não tiver erro vai compilar e executar.
Estou começando no C++ então se encontrar alguma dificuldade para fazer algo vou esta postando aqui.
Jul 14
É possivel definir TRIGGERS para serem disparados antes (BEFORE) ou depois (AFTER)
de um evento DML(Data Manipulation Language) INSERT, UPDATE, DELETE ou REPLACE.
Para pegar os valores dos campos nas Triggers usamos OLD.nome_do_campo e NEW.nome_do_campo.
Quando excluimos o registro pegamos o valor usando OLD.nome_do_campo e quando vamos adicionar
um registro usamos NEW.nome_do_campo.
Abaixo regra do uso de OLD e NEW:
Delete usamos somente OLD.nome_do_campo.
Insert somente NEW.nome_do_campo
UPDATE podemos usar OLD.nome_do_campo e NEW.nome_do_campo.
Vou criar duas tabelas para migrar os dados de uma tabela para outro usando TRIGGERS.
GO
CREATE TABLE IF NOT EXISTS tb_comentario (
pk_comentario int(11) AUTO_INCREMENT NOT NULL,
tx_comentario text NULL,
PRIMARY KEY(pk_comentario)
)
GO
CREATE TABLE IF NOT EXISTS tb_comentario_historico (
pk_comentario_historico int(11) AUTO_INCREMENT NOT NULL,
fk_comentario int(11) NOT NULL,
tx_comentario text NULL,
PRIMARY KEY(pk_comentario_historico)
Vamos criar a primeira Trigger para disparar apos fazer o Insert na tabela tb_comentario.
go
DROP TRIGGER IF EXISTS trigger_insert_comentario_historico
go
CREATE TRIGGER trigger_insert_comentario_historico AFTER INSERT ON tb_comentario
FOR EACH ROW
BEGIN
INSERT INTO tb_comentario_historico SET fk_comentario = NEW.pk_comentario, tx_comentario = NEW.tx_comentario;
END
go
insert into tb_comentario set tx_comentario = 'insert trigger'
go
select * from tb_comentario
go
select * from tb_comentario_historico
Agora vamos criar uma Trigger para deletar o registro da tb_comentario_historio caso seja deletado o registro na tb_comentario.
go
DROP TRIGGER IF EXISTS trigger_delete_comentario_historico
go
CREATE TRIGGER trigger_delete_comentario_historico BEFORE DELETE ON tb_comentario
FOR EACH ROW
BEGIN
DELETE FROM tb_comentario_historico WHERE fk_comentario = OLD.pk_comentario;
END
go
delete from tb_comentario where pk_comentario = 21
go
select * from tb_comentario
go
select * from tb_comentario_historico
A ultima Trigger será para fazer o Update na tb_comentario_historio caso seja feita alguma mudança na tb_comentario.
go
DROP TRIGGER IF EXISTS trigger_update_comentario_historico
go
CREATE TRIGGER trigger_update_comentario_historico BEFORE UPDATE ON tb_comentario
FOR EACH ROW
BEGIN
UPDATE tb_comentario_historico SET tx_comentario = NEW.tx_comentario WHERE fk_comentario = NEW.pk_comentario;
END
go
update tb_comentario set tx_comentario = 'teste trigger update 2' where pk_comentario= 22
go
select * from tb_comentario
go
select * from tb_comentario_historico
Caso tenha alguma duvida deixe um comentário que terei prazer em ajudar.
Comentários são bem vindos assim posso melhorar a qualidade dos tutoriais aqui apresentados.
Jul 02
Dando continuidade ao ultimo post Pegar dados via POST e inserir no banco de dados MySQL com PHP.
Agora vamos mostrar os dados inseridos. Desta vez usei CSS para que o resultado fique um pouco melhor para visualizar.
Crie um arquivo com o nome listar.php e insira o código abaixo.
<?php
// Fazendo a conexão com o servidor MySQL
// mysql_pconnect("server", "login", "senha")
$conexao = mysql_pconnect("localhost","root","root") or die('falha ao conectar');
// Seleciona o banco de dados.
mysql_select_db("test",$conexao) or die('falha ao selecionar db');
// Executa Query.
$sql = 'SELECT codigo, nome, preco, quantidade FROM tb_produtos';
$result = mysql_query($sql);
?>
<html>
<head>
<title>Formulario de Produtos</title>
<style type="text/css">
table caption {
color:#1E398D;
padding:5px 0;
text-align:left;
text-transform:uppercase;
}
table thead {
border:1px solid #D2D2D2;
}
table tbody {
border:1px solid #D2D2D2;
}
table thead th {
background:#EEECCC;
border-left:1px solid #F0F0F0;
height:45px;
padding:5px;
text-transform:uppercase;
}
table tbody td, table tbody th {
font-family:Verdana,Arial,Helvetica,sans-serif;
font-size:10px;
padding:5px;
text-transform:uppercase;
}
</style>
</head>
<body>
<table cellspacing="0" summary="Resultados da lista de produtos." >
<caption>Produtos</caption>
<thead>
<tr>
<th>Código</th>
<th>Nome</th>
<th>Preço</th>
<th>Quantidade</th>
</tr>
</thead>
<tbody>
<?php // Verifico se existe registros no banco.
if(mysql_num_rows($result) > 0) {
// Aqui é feita a busca de cada registro encontrado jogando o resultado em um array por nome de campo da tabela.
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
// É possivel verificar todos os valores do usando a função var_dump($row);
// Basta tirar o comentario # para debugar.
// a tag pre serve para pre formatar o texto - irá manter a quebra de linha e espaços. Facilita na hora de debugar.
#echo '<pre>';
#var_dump($row);
#echo '</pre>';
?>
<tr>
<td><?php echo $row['codigo']; ?></td>
<td><?php echo $row['nome']; ?></td>
<td><?php echo $row['preco']; ?></td>
<td><?php echo $row['quantidade']; ?></td>
</tr>
<?php
}
} else { ?>
<tr>
<td colspan="4"><p>Nenhum registro encontrado.</p></td>
</tr>
<?php
}
// Libera toda a memória associada ao result.
mysql_free_result($result);
?>
</tbody>
</table>
</body>
</html>
Caso tenha alguma duvida deixe um comentário que terei prazer em ajudar.
Comentários são bem vindos assim posso melhorar a qualidade dos tutoriais aqui apresentados.
Jul 01
Exemplo básico para pegar valores via POST de um formulário HTML e inserir no banco de dados MySQL.
<?php
// Verifica se foi postado algo para inserir dados no banco.
if($_POST) {
// Fazendo a conexão com o servidor MySQL
// mysql_pconnect("server", "login", "senha")
$conexao = mysql_pconnect("localhost","root","root") or die('falha ao conectar');
// Verifica se o banco de dados existe antes de criar.
$query = 'CREATE DATABASE IF NOT EXISTS test';
if(!mysql_query($query,$conexao)) {
echo 'falha ao criar banco<br />';
die; // Com o die eu já paro de executar o script caso ocorra erro.
}
mysql_select_db("test",$conexao) or die('falha ao selecionar db');
// Verifica se a tabela existe antes de criar.
$query = "CREATE TABLE IF NOT EXISTS tb_produtos (
pk_produtos int not null auto_increment primary key,
codigo varchar(255),
nome varchar(255),
preco decimal(12,2),
quantidade int(11))";
if(!mysql_query($query,$conexao)) {
echo 'falha ao criar tabela<br />';
die; // Com o die eu já paro de executar o script caso ocorra erro.
}
// É possivel verificar todos os valores do POST usando a função var_dump($_POST);
// Basta tirar o comentario # para debugar.
// a tag pre serve para pre formatar o texto - irá manter a quebra de linha e espaços. Facilita na hora de debugar.
#echo '<pre>';
#var_dump($_POST); die;
#echo '</pre>';
/*Pego os valores do POST do formulario HTML e seto nas variaveis.
É necessario fazer a validação dos dados para evitar ataques SQL Injection ou HTML Injection quando estiver
em ambiente de produção.
Neste exemplo estou fazendo sem qualquer tipo de validação para simplificar o entendimento.*/
$codigo = $_POST['codigo'];
$nome = $_POST['nome'];
$preco = $_POST['preco'];
$quantidade = $_POST['quantidade'];
$query_insert = "INSERT INTO tb_produtos (codigo,nome,preco,quantidade) VALUES
('$codigo','$nome',$preco,$quantidade)";
if(mysql_query($query_insert,$conexao)) {
echo 'Dados inseridos com sucesso<br />';
} else {
echo 'falha ao inserir dados<br />';
}
// Caso POST false mostra HTML
} else {
?>
<html>
<head>
<title>Formulário de Produtos</title>
</head>
<body>
<form action="cadastrar.php" method="post">
<label for="codigo">
<span >Código</span>
<input id="codigo" class="text" type="text" value="" maxlength="255" title="Código" name="codigo" tabindex="1"/>
</label><br />
<label for="nome">
<span >Nome</span>
<input id="nome" class="text" type="text" value="" maxlength="255" title="Nome" name="nome" tabindex="2"/>
</label><br />
<label for="preco">
<span class="nameField">Preço</span>
<input id="preco" class="text" type="text" value="" maxlength="12" title="Preço" name="preco" tabindex="3"/>
</label><br />
<label for="quantidade">
<span class="nameField">Quantidade</span>
<input id="quantidade" class="text" type="text" value="" maxlength="11" title="Quantidade" name="quantidade" tabindex="4"/>
</label><br />
<label for="cadastrar">
<input type="submit" id="cadastrar" name="cadastrar" tabindex="5" value="cadastrar" />
</label>
</form>
</body>
</html>
<?php
}
?>
Caso tenha alguma duvida deixe um comentário que terei prazer em ajudar.
Comentários são bem vindos assim posso melhorar a qualidade dos tutorias aqui apresentados.
Jun 10
Hoje estou postando uma procedure que consulta uma View e faz um insert.
A View criada é para simular a movimentação do caixa do dia atual.
A Procedure ira fazer a consulta da movimentação do caixa através da View.
Caso a movimentação seja positiva e não conste registro de fechamento do caixa no dia atual um Insert com o valor da movimentação será executado.
No script abaixo será criado 3 tabelas (tb_cliente, tb_movimentacao e tb_caixa),
1 View (viewMovimentacao) e uma procedure(sp_fecha_caixa).
Na tabela tb_cliente consta os clientes que poderão efetuar a movimentação do caixa.
Na tabela tb_movimentacao consta os movimentos realizados pelos clientes.
Na tabela tb_caixa consta os registros de caixas fechados.
A View viewMovimentacao ira retornar todos os registros de movimentação do dia atual.
A Procedure sp_fecha_caixa ira executar a View pegar o valor da movimentação de hoje e irá
inserir este valor na tabela tb_caixa.
// Verifica se tabela existe. Caso Exista ele remove.
GO
DROP TABLE IF EXISTS tb_cliente;
// Caso a tabela não exista ele cria uma tabela.
GO
CREATE TABLE IF NOT EXISTS tb_cliente (
pk_cliente int(10) AUTO_INCREMENT NOT NULL PRIMARY KEY,
nome varchar(60) not null,
cpf varchar(20) not null unique
) Engine =InnoDB;
//------------------------------------------------------------
// Insere os dados na tabela
GO
INSERT INTO tb_cliente (nome, cpf)
VALUES
('Joao', '12345678910'),
('Paulo', '12345678911'),
('Marcelo', '12345678912'),
('Gabriel', '12345678913'),
('Julio', '12345678914')
//------------------------------------------------------------
// Caso a tabela não exista ele cria uma tabela.
GO
DROP TABLE IF EXISTS tb_movimentacao;
// Caso a tabela não exista ele cria uma tabela.
GO
CREATE TABLE IF NOT EXISTS tb_movimentacao (
pk_saldo int(10) AUTO_INCREMENT NOT NULL PRIMARY KEY,
fk_cliente int(10) NOT NULL,
saldo decimal(10,2),
dt_cadastro timestamp default current_timestamp,
CONSTRAINT fk_cliente FOREIGN KEY (fk_cliente) REFERENCES tb_cliente (pk_cliente)
)
//------------------------------------------------------------
// Insere os dados na tabela tb_movimentacao para simular movimentação do caixa.
GO
INSERT INTO tb_movimentacao (fk_cliente,saldo,dt_cadastro)
VALUES
(1,42, ADDDATE( CURDATE(), INTERVAL 1 DAY)),
(1,51, ADDDATE( CURDATE(), INTERVAL 0 DAY)),
(2,23, ADDDATE( CURDATE(), INTERVAL 0 DAY)),
(3,52, ADDDATE( CURDATE(), INTERVAL 1 DAY)),
(3,68, ADDDATE( CURDATE(), INTERVAL 0 DAY)),
(3,85, ADDDATE( CURDATE(), INTERVAL 0 DAY)),
(4,82, ADDDATE( CURDATE(), INTERVAL 0 DAY)),
(5,110,ADDDATE( CURDATE(), INTERVAL 0 DAY)),
(5,109,ADDDATE( CURDATE(), INTERVAL 2 DAY)),
(5,116,ADDDATE( CURDATE(), INTERVAL 0 DAY)),
(5,129,ADDDATE( CURDATE(), INTERVAL 4 DAY))
//------------------------------------------------------------
// Caso a tabela não exista ele cria uma tabela.
GO
DROP TABLE IF EXISTS tb_caixa;
// Caso a tabela não exista ele cria uma tabela.
GO
CREATE TABLE IF NOT EXISTS tb_caixa (
pk_caixa int(10) AUTO_INCREMENT NOT NULL PRIMARY KEY,
saldo decimal(10,2),
dt_caixa timestamp default current_timestamp
)
//------------------------------------------------------------
// Caso a VIEW não exista ele cria uma tabela.
GO
DROP VIEW IF EXISTS viewMovimentacao;
// Agora é criada a VIEW que ira fazer a consulta das movimentações do dia.
GO
CREATE VIEW viewMovimentacao AS
SELECT
tb_cliente.pk_cliente AS fk_cliente,
tb_cliente.nome AS nome,
tb_cliente.cpf AS cpf,
tb_movimentacao.saldo AS saldo,
tb_movimentacao.dt_cadastro AS dt_cadastro
FROM tb_cliente
INNER JOIN tb_movimentacao ON (pk_cliente = fk_cliente)
WHERE dt_cadastro = CURDATE();
Agora vamos criar nossa Procedure para fechar o caixa do dia.
// Dropa a procedure se já existir.
GO
DROP PROCEDURE IF EXISTS sp_fecha_caixa;
// Cria procedure.
GO
CREATE PROCEDURE sp_fecha_caixa()
BEGIN
DECLARE var_temp_saldo_dia decimal(10,2);
DECLARE var_temp_registro decimal(10,2);
//Pega o saldo da movimentacao de hoje.
DECLARE cursorViewMovimentacao CURSOR FOR SELECT sum(saldo) as saldo_dia FROM viewMovimentacao;
DECLARE cursorTabelaCaixa CURSOR FOR SELECT count(dt_caixa) as registro FROM tb_caixa WHERE dt_caixa = CURDATE();
OPEN cursorViewMovimentacao;
FETCH cursorViewMovimentacao INTO var_temp_saldo_dia;
CLOSE cursorViewMovimentacao;
//Pega os registros do caixa de hoje.
OPEN cursorTabelaCaixa;
FETCH cursorTabelaCaixa INTO var_temp_registro;
CLOSE cursorTabelaCaixa;
// Verifica se teve movimentacao no dia e se caixa já foi fechado.
IF (var_temp_saldo_dia > 0 AND var_temp_registro = 0 ) THEN
INSERT INTO tb_caixa(saldo,dt_caixa)
VALUES (var_temp_saldo_dia, CURDATE());
ELSEIF (var_temp_registro > 0 ) THEN
SELECT 'Caixa já foi fechado' AS Msg;
ELSEIF (var_temp_saldo_dia <= 0 ) THEN
SELECT 'Caixa com valor negativo' AS Msg;
ELSE
SELECT 'Erro ao executar' AS Msg;
END IF;
END;
GO
call sp_fecha_caixa();
Agora vamos fazer um select para verificar se o valor foi inserido.
select * from tb_caixa
Caso tenha alguma duvida deixe um comentário que terei prazer em ajudar.
Comentários são bem vindos assim posso melhorar a qualidade dos tutoriais aqui apresentados.
Jun 08
Neste Post irei mostrar como criar uma View para agilizar sua vida na hora de liberar consultar especificas sem ter medo dos usuários matem o banco na hora de criar uma consulta já conhecida.
Alguns benefícios das Views são:
Segurança no acesso de dados das tabalas.
Otimização das consultas.
A sintaxe basica para criar uma VIEW:
CREATE VIEW view_name AS select_statement
Para efetuar a consulta da VIEW é semelhande a consulta de uma TABLE:
SELECT fields FROM view_name
Neste exemplo vamos criar duas tabelas para executar nossa VIEW.
Uma tabela com clientes e outra com a movimentação de caixa deste cliente.
Copie o código abaixo e execute no banco de dados.
// Verifica se tabela existe. Caso Exista ele remove.
GO
DROP TABLE IF EXISTS tb_cliente;
// Caso a tabela não exista ele cria uma tabela.
GO
CREATE TABLE IF NOT EXISTS tb_cliente (
pk_cliente int(10) AUTO_INCREMENT NOT NULL PRIMARY KEY,
nome varchar(60) not null,
cpf varchar(20) not null unique
) Engine =InnoDB;
//------------------------------------------------------------
// Insere os dados na tabela
GO
INSERT INTO tb_cliente (nome, cpf)
VALUES
('Joao', '12345678910'),
('Paulo', '12345678911'),
('Marcelo', '12345678912'),
('Gabriel', '12345678913'),
('Julio', '12345678914')
//------------------------------------------------------------
// Caso a tabela não exista ele cria uma tabela.
GO
DROP TABLE IF EXISTS tb_movimentacao;
// Caso a tabela não exista ele cria uma tabela.
GO
CREATE TABLE IF NOT EXISTS tb_movimentacao (
pk_saldo int(10) AUTO_INCREMENT NOT NULL PRIMARY KEY,
fk_cliente int(10) NOT NULL,
saldo decimal(10,2),
dt_cadastro timestamp default current_timestamp,
CONSTRAINT fk_cliente FOREIGN KEY (fk_cliente) REFERENCES produtos (pk_cliente)
)
//------------------------------------------------------------
// Insere os dados na tabela
GO
INSERT INTO tb_movimentacao (fk_cliente,saldo,dt_cadastro)
VALUES
(1,42, ADDDATE( CURDATE(), INTERVAL 1 DAY)),
(1,51, ADDDATE( CURDATE(), INTERVAL 2 DAY)),
(2,23, ADDDATE( CURDATE(), INTERVAL 1 DAY)),
(3,52, ADDDATE( CURDATE(), INTERVAL 1 DAY)),
(3,68, ADDDATE( CURDATE(), INTERVAL 2 DAY)),
(3,85, ADDDATE( CURDATE(), INTERVAL 3 DAY)),
(4,82, ADDDATE( CURDATE(), INTERVAL 1 DAY)),
(5,110,ADDDATE( CURDATE(), INTERVAL 1 DAY)),
(5,109,ADDDATE( CURDATE(), INTERVAL 2 DAY)),
(5,116,ADDDATE( CURDATE(), INTERVAL 3 DAY)),
(5,129,ADDDATE( CURDATE(), INTERVAL 4 DAY))
Agora vamos criar uma VIEW para efetuar a consulta de movimentação do cliente.
Para isso vamos usar as duas tabelas para a consulta da VIEW.
// Caso a VIEW não exista ele cria uma tabela.
GO
DROP VIEW IF EXISTS viewMovimentacao;
GO
CREATE VIEW viewMovimentacao AS
SELECT
tb_cliente.pk_cliente AS fk_cliente,
tb_cliente.nome AS nome,
tb_cliente.cpf AS cpf,
tb_movimentacao.saldo AS saldo,
tb_movimentacao.dt_cadastro AS dt_cadastro
FROM tb_cliente
INNER JOIN tb_movimentacao ON (pk_cliente = fk_cliente)
Executa a View.
// Efetua consulta View
GO
SELECT fk_cliente,nome,cpf,saldo,dt_cadastro FROM viewMovimentacao
Caso tenha alguma duvida deixe um comentário que terei prazer em ajudar.
Comentários são bem vindos assim posso melhorar a qualidade dos tutoriais aqui apresentados.
May 23
No código a seguir segue um exemplo de como ler um arquivo XML e gravar os dados no banco de dados MySQLe gerar um log da query executada.
Neste exemplo costa apenas as funções de INSERT, DELETE, UPDATE e SELECT.
Para facilitar a vida eu já deixei no código as query para criar o banco e as tabelas utilizadas para executar o código. Eu deixei os valores default de conexão com o MySQL altere os dados da conexão caso esteja usando outra configuração.
A idéia de criar um log das querys executadas no sistema servem para detectar erros e também como um registro caso alguem valor tenha sito movimentado de forma errada.
<?php
// Fazendo a conexão com o servidor MySQL
//Caso queira apenas criar o arquivo XML mude valor para false.
$ativar_conexao = true;
if ($ativar_conexao == true) {
// mysql_pconnect("server", "login", "senha")
$conexao = mysql_pconnect("192.168.1.210","root","dj@jdl#.") or die('falha ao conectar');
// Verifica se o banco de dados existe antes de criar.
$query = 'CREATE DATABASE IF NOT EXISTS test';
if(!mysql_query($query,$conexao)) {
echo 'falha ao criar banco<br />';
}
mysql_select_db("test",$conexao) or die('falha ao selecionar db');
// Verifica se a tabela existe antes de criar.
$query = "CREATE TABLE IF NOT EXISTS tb_produtos (
pk_produtos int not null auto_increment primary key,
codigo varchar(255),
nome varchar(255),
preco decimal(12,2),
quantidade int(11))";
if(!mysql_query($query,$conexao)) {
echo 'falha ao criar tabela<br />';
}
}
// Fim comentario
$doc = new DomDocument;
// Carrega o arquivo XML com um arquivo DOMDocument
$doc->Load('produtos.xml');
$items = $doc->getElementsByTagName('produto');
// Defino o nome tags no arquivo XML que eu desejo.
$campos = array('nome','preco','quantidade');
$query = NULL;
$query .= "insert into tb_produtos (codigo,nome,preco,quantidade) values ";
for ($i=0; $i < $items->length; $i++) {
$value = NULL;
$value .= " (";
$codigo = $items->item($i)->getAttribute('id');
$value .= "'$codigo',";
echo $items->item($i)->getAttribute('id') , '<br />';
// Busca por elementos definidos no array
$valor = array();
foreach ($campos as $campo) {
$dado = "'" . $items->item($i)->getElementsByTagName($campo)->item(0)->nodeValue . "'";
// Verifico se o campo é preco pq no arquivo xml o preço esta com virgula e para inserir no banco é necessario ponto
if($campo == 'preco') {
// Faz a troca de virgula por ponto.
$dado = str_replace(',','.',$dado);
}
// pego o valor de cada tag e adiciono em um array para fazer o insert no banco.
$valor[] = $dado;
echo $items->item($i)->getElementsByTagName($campo)->item(0)->tagName , ': ';
echo $items->item($i)->getElementsByTagName($campo)->item(0)->nodeValue , '<br />';
}
// uso o implode para criar uma string com os valores separados por vírgula.
$value .= implode(',', $valor);
$value .= ') ';
// Adiciono os dados do valores do insert em array.
$values[] = $value;
echo '<hr>';
}
// uso o implode para criar uma string com os valores separados por vírgula.
$query .= implode(',', $values);
// mostra a query criada na tela.
echo $query;
if ($ativar_conexao == true) {
// GRAVA LOG do arquivo executado mesmo se query estiver errada.
if((stristr($query, 'DELETE') || stristr($query, 'UPDATE') || stristr($query, 'INSERT') || stristr($query, 'SELECT'))) {
// Verifica se a tabela existe antes de criar.
$query_log = "CREATE TABLE IF NOT EXISTS tb_log (
pk_log int not null auto_increment primary key,
tx_sql text,
acao ENUM('DELETE', 'UPDATE', 'INSERT','SELECT')
);";
if(!mysql_query($query_log,$conexao)) {
echo 'falha ao criar tabela<br />';
}
if(stristr($query, 'DELETE')) {
$acao = 1;
} elseif(stristr($query, 'UPDATE')) {
$acao = 2;
} elseif(stristr($query, 'INSERT')) {
$acao = 3;
} elseif(stristr($query, 'SELECT')) {
$acao = 4;
}
$query_log = "INSERT INTO tb_log (tx_sql,acao) VALUES
(\"$query\",$acao)";
if(!mysql_query($query_log,$conexao)) {
echo 'falha ao inserir dados de log<br />';
}
}
if(!mysql_query($query,$conexao)) {
echo 'falha ao inserir dados<br />';
}
}
Crie um arquivo produtos.xml em um editor de texto e coloque o código abaixo.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<catalogo>
<produto id='p1'>
<nome>Caderno</nome>
<preco>2,00</preco>
<quantidade>100</quantidade>
</produto>
<produto id='p2'>
<nome>Caneta</nome>
<preco>1,00</preco>
<quantidade>200</quantidade>
</produto>
<produto id='p3'>
<nome>Lapis</nome>
<preco>0,50</preco>
<quantidade>50</quantidade>
</produto>
<produto id='p4'>
<nome>Livro Matematica</nome>
<preco>11,00</preco>
<quantidade>10</quantidade>
</produto>
<produto id='p5'>
<nome>Apontador</nome>
<preco>1,00</preco>
<quantidade>20</quantidade>
</produto>
</catalogo>
Caso tenha alguma duvida deixe um comentário que terei prazer em ajudar.
Comentários são bem vindos assim posso melhorar a qualidade dos tutoriais aqui apresentados.
|
|
Comentários Recentes