Você está na página 1de 71

Documentao SACI V7

Query SQL

EAC SOFTWARE
GERNCIA DE SERVIOS E COORDENAO DE TREINAMENTOS

QuerySQL

BELO HORIZONTE

Convenes Tipogrficas

Negrito: Palavras em negrito sero usadas para destacar os menus, opes e


mdulos do SACI, alm dos nomes EAC e SACI.

Itlico: Palavras em itlico sero usadas para nomes de arquivos ou diretrios.

-> : Este smbolo ser usado para comandos a serem executados no prompt do
Linux ou opes de configuraes (comandos do .bash_profile por exemplo).

As tabelas apresentadas so compostas de duas colunas: Parmetros e Opes /


Descrio. A coluna Parmetros define o item apresentado no menu do mdulo.
Pode ser um item de configurao ou uma opo de seleo, como na gerao de
um relatrio. A coluna Opes / Descrio apresenta as opes disponveis para
escolha em casos de seleo ou ento a explicao do item a ser configurado.

Crditos
A reproduo ou transmisso por qualquer meio, seja este eletrnico, mecnico,
fotocpia, gravao ou outros, s ser permitido com prvia autorizao por escrito da
EAC Software.
Copyright 2008 da EAC - Engenharia Automao e Controle
Produzido por EAC Software

Sumrio
1. Como comear a montar um relatrio no SACI.................................................................6
1.2 Definir o objetivo do relatrio.......................................................................................6
1.3 Filtro.............................................................................................................................6
1.4 Colunas a serem impressas........................................................................................7
1.5 Exerccio 1...................................................................................................................8
2. Introduo a Banco de Dados...........................................................................................9
2.1 Definies....................................................................................................................9
2.1.1 Dados...................................................................................................................9
2.1.2 Tabela...................................................................................................................9
2.1.3 S.G.B.D. (Sistema Gerenciador de Banco de Dados).......................................10
2.1.4 Chave .................................................................................................................11
2.2 Relacionamento entre Tabelas..................................................................................12
2.3 Tipos de Relacionamento..........................................................................................13
2.3.1 Um-para-Um.......................................................................................................13
2.3.2 Um-para-Muitos..................................................................................................13
2.3.3 Muitos-para-Muitos.............................................................................................13
3. Onde Buscar a informao?............................................................................................14
3.1 Definir a tabela Mestre...............................................................................................15
3.2 Quais as chaves podero ser utilizadas?..................................................................15
3.3 Conhecendo as tabelas do SACI atravs do Query Gerenciador............................15
3.4 Exerccio 2.................................................................................................................16
3.5 Exerccio 3.................................................................................................................17
4. Conceitos Bsicos de SQL..............................................................................................17
4.1 O cliente MySQL........................................................................................................17
4.2 Modos de Logar no banco MySQL............................................................................18
4.3 Comandos..................................................................................................................18
5. Comando SELECT...........................................................................................................19
5.1 Sintaxe.......................................................................................................................19
5.2 Exemplos simples......................................................................................................19
5.3 O QuerySQL - Editar e Executar SELECTS..............................................................20
5.4 Criar uma nova QuerySQL........................................................................................20
5.5 Exerccio 4.................................................................................................................21
5.6 Padronizao.............................................................................................................21

5.7 Uso do WHERE.........................................................................................................22


5.8 Funes SQL.............................................................................................................23
5.8.1 Funes de agregao, soma e contagem........................................................23
5.8.2 Funes Diversas...............................................................................................24
5.9 Exerccio 5.................................................................................................................27
6. Relacionando Tabelas......................................................................................................28
6.1 LEFT JOIN.................................................................................................................28
6.2 Exerccio 6.................................................................................................................29
6.3 Verificando consistncia em tabelas - Pais sem filhos e filhos sem pai...................29
6.4 Exerccio 7.................................................................................................................30
7. O QuerySQL....................................................................................................................30
7.1 Configuraes............................................................................................................31
7.2 Passos para a configurao......................................................................................31
7.3 Controle de Acesso por Relatrio..............................................................................32
7.4 Funes do Menu - QuerySQL .................................................................................32
7.5 Criar uma nova QuerySQL........................................................................................33
7.6 Variveis de Contedo...............................................................................................37
7.7 Variveis de Interface................................................................................................38
7.8 Comando Select_List.................................................................................................40
7.9 Seo de Variveis....................................................................................................42
7.10 SELECT_VARS - (Criao de Variveis Genricas)...............................................44
7.10.1 Ttulos de colunas com ms/ano calculados automaticamente .....................44
7.10.2 Frmulas grandes ou complexas que precisem ser utilizadas vrias vezes em
uma ou mais SELECTs ...............................................................................................45
7.11 Tabelas Temporrias................................................................................................46
7.12 Gerar Relatrios em Formato .pdf...........................................................................48
7.13 Gerao de Etiquetas..............................................................................................49
7.14 Exerccio 8...............................................................................................................51
8. Dicas................................................................................................................................51
8.1 Contador de Registros...............................................................................................51
8.2 Seleo de registros do tipo ''bit''..............................................................................52
8.3 Estatsticas de uso de Relatrios..............................................................................54
8.3.1 Passos para implantao deste recurso............................................................55
9. Otimizao de SELECTS.................................................................................................56
9.1 Resumo......................................................................................................................60

9.2 Exerccio 9.................................................................................................................61


10. Anexo - FAQs.................................................................................................................62
11. Anexo - Respostas dos exerccios propostos................................................................65
11.1 Exerccio 1...............................................................................................................65
11.2 Exerccio 2...............................................................................................................65
11.3 Exerccio 3...............................................................................................................65
11.4 Exerccio 4...............................................................................................................65
11.5 Desafio.....................................................................................................................65
11.6 Exerccio 5...............................................................................................................66
11.7 Exerccio 6...............................................................................................................67
11.8 Exerccio 7...............................................................................................................68
11.9 Exerccio 8...............................................................................................................68

1. Como comear a montar um relatrio no SACI

1. Como comear a montar um relatrio no SACI


1.2 Definir o objetivo do relatrio
Antes de mais nada necessrio entender qual o objetivo do relatrio. Desta
maneira no corremos o risco de exibir informaes que no sejam pertinentes a ele.
Por exemplo, ao se criar um relatrio de comisses sobre vendas por vendedor,
no faz sentido listar tambm o nome do cliente que efetuou a compra, nem to pouco
qual o produto que ele adquiriu.
Se o objetivo listar os valores de comisses, bastam o nome e nmero do
vendedor, o total em vendas e o valor da comisso.
Geralmente, o objetivo do relatrio est definido em seu ttulo. Por exemplo:

Ttulo do Relatrio

Objetivo

Comisses sobre vendas por vendedor

Listar valores de comisso sobre vendas


para cada vendedor

Total em vendas por loja

Listar valores totais de venda por loja

Endereos de Clientes

Listar para cada cliente os dados de seu


endereo

Despesas por Perodo/Conta Razo

Listar valores de despesas para o perodo e


conta razo

1.3 Filtro
Na maioria dos relatrios necessrio que sejam informados alguns parmetros de
seleo ou filtragem. Assim, no exemplo acima, no relatrio de Despesas por
Perodo/Conta Razo o usurio poder informar qual o perodo e at mesmo qual a conta
razo para gerao do relatrio.
Sendo assim, antes de comear a fazer o seu relatrio, tenha em mente como
sero os parmetros de seleo ou filtragem dos dados.
Exemplos de parmetros de filtragem aplicados ao SACI (em todos os casos a
seleo pode ser feita informado-se o parmetro inicial e final, todos ou apenas um).
MN SACI 035

1.3 Filtro

Perodo
Centro de Lucro
Loja
Conta Razo
Cliente
Produto
Fornecedor
Funcionrio

1.4 Colunas a serem impressas


Uma vez definidos o objetivo e os parmetros de seleo do relatrio, devemos
agora definir quais as colunas devero ser impressas.
Por coluna, podemos entender cada informao ou cada campo disponvel na fonte
de pesquisa.
Por exemplo, em um relatrio de clientes correntistas, podemos imprimir as
seguintes informaes ou colunas:
Nome do cliente
Endereo do cliente
Cidade do cliente
MN SACI 035

1.4 Colunas a serem impressas

Telefone do cliente
Data da ltima Compra
importante tambm observar se as colunas escolhidas para a impresso do
relatrio so coerentes com o seu objetivo.

1.5 Exerccio 1
Pense em um relatrio que seja necessrio em sua empresa e nos espaos abaixo,
escreva sua anlise, baseado nos conceitos vistos.
Ttulo do Relatrio

Objetivo do Relatrio:

Filtro:

Colunas:

MN SACI 035

2. Introduo a Banco de Dados

2. Introduo a Banco de Dados


A utilizao de bancos de dados em nosso dia--dia prtica cada vez mais
comum. Por exemplo, quando realizamos uma transao no caixa do banco, quando
compramos passagens ou fazemos compras em um supermercado. Em todos os casos
haver uma consulta ou gravao de um registro em um banco de dados.
Para o Administrador de SACI, conhecer sobre esta tecnologia pr-requisito e
fator bsico para uma boa administrao de sistemas de gesto e utilizao das
ferramentas de pesquisa de dados disponveis como o QuerySQL e WebControl.

2.1 Definies
2.1.1 Dados
So fatos que podem ser armazenados. Por exemplo, nomes, endereos e
telefones, ou seja, um pedao da informao, que, solto no tem sentido. Ex.: CPF. De
quem este CPF?
Banco de Dados - Como banco de dados podemos entender uma coleo de
dados inter-relacionados, representando informaes sobre um domnio especfico. Por
exemplo uma lista telefnica. De maneira mais simples dizemos que um conjunto de
tabelas.

2.1.2 Tabela
Uma tabela composta por registros (linhas) e (colunas).
As colunas so nomeadas e definidos para guardar cada um dos dados
organizadamente. Assim, em uma tabela de lista de telefones temos os campos de nome,
endereo e telefone basicamente.
Os Registros so os dados gravados em uma tabela. No exemplo, ao gravar na
tabela o nome do instrutor deste curso, o seu endereo e o seu telefone, temos inserido
na tabela um registro.
MN SACI 035

2.1 Definies
2.1.3 S.G.B.D. (Sistema Gerenciador de Banco de Dados)
o software responsvel pelo gerenciamento (armazenamento e recuperao) dos
dados no Banco de Dados.
Este software pode trabalhar sozinho ou associado a algum outro tipo de software.
Tem basicamente cinco funes, sendo:
1. Manipulao dos dados (escrever, consultar e retirar)
2. Restrio de integridade (no permitir dados inconsistentes)
3. Segurana dos dados (controle de acessos)
4. Controle de Concorrncia (vrios acessos ao mesmo dado no mesmo tempo)
5. Independncia dos dados (modificaes no esquema de gerenciamento dos
dados sem comprometer a aplicao que os utiliza)

MN SACI 035

10

2.1 Definies
2.1.4 Chave
Cada tabela possui uma ou mais ordenaes diferentes. Ordenao, como o
prprio nome j diz, a ordem dos campos dentro da tabela. Esta ordenao tambm
chamada de chave e serve para que as buscas na tabela sejam feitas de maneira
inteligente e fcil.
Em uma analogia mais simples, podemos dizer que as chaves so para a tabela o
que o ndice para um livro. muito mais fcil buscar uma informao em um livro lendo
o seu ndice do que lendo todas as suas pginas.
Uma chave formada por um ou mais campos que nos permitem identificar
unicamente um registro em uma tabela.
As Chaves Primrias so, obrigatoriamente, unique (nica). Chaves uniques so
aquelas que no podero ser repetidas dentro da tabela, ou seja, chaves que no
armazenam um mesmo valor mais de uma vez. Exemplo: Em uma tabela de clientes, o
nmero do CPF no pode ser repetido. No existem duas pessoas com um mesmo
nmero de CPF.
Chaves Secundrias ou estrangeiras so outra forma de restrio, ou seja, de
acesso rpido s informaes da tabela. Estas chaves podem, opcionalmente, ser unique
(nica) ou no. Exemplo:
Chave secundria no unique: Em uma tabela de clientes, a cidade pode ser
uma chave secundria, pois vrios clientes pertencem a uma mesma cidade.
Chave secundria unique: Em uma tabela de clientes no podem existir dois
clientes com um mesmo nmero de carteira de identidade.

MN SACI 035

11

2.1 Definies

2.2 Relacionamento entre Tabelas


Relacionar tabelas significa associar duas ou mais tabelas atravs de campos
comuns, visando obter resultados de uma pesquisa especfica.
Por exemplo, se quisermos pesquisar clientes por estado, devemos associar a
tabela de clientes com a tabela de cidades, agrupando-as por Unidades da Federao.
Neste caso, estaremos relacionando estas tabelas para obter o resultado final.
O relacionamento de tabelas deve obedecer a uma regra bsica: Deve haver pelo
menos um campo comum em ambas. No exemplo, a tabela de clientes seria relacionada
com a tabela de cidades pelo nmero da cidade.

MN SACI 035

12

2.3 Tipos de Relacionamento


2.3 Tipos de Relacionamento
Existem vrios tipos de relacionamento entre tabelas, a seguir:

2.3.1 Um-para-Um
Quando um campo em uma tabela A est associada com no mximo um campo em
uma tabela B, e um campo na tabela B est ligado com no mximo um campo na tabela
A.
Por exemplo, as tabelas de produtos do SACI (prd) e centro de lucro (cl) so
relacionadas do tipo um-para-um, pois para cada produto existe apenas um nico centro
de lucro

2.3.2 Um-para-Muitos
Quando um campo em uma tabela A est associado a qualquer nmero de campos
em uma tabela B. Entretanto, um campo da tabela B pode estar associado a no mximo
um campo na tabela A.
Por exemplo, a relao entre a tabela de pedidos de clientes (eord) e os produtos
de pedidos de clientes (eoprd)

2.3.3 Muitos-para-Muitos
Quando um ou mais campos de uma tabela A est associado a qualquer nmero
de campos em uma tabela B, e um ou mais campos da tabela B esto associados a um
ou mais campos da tabela A.
Como exemplo podemos citar a relao entre as tabelas de notas fiscais de sada
(nf) e a tabela de duplicatas (dup). Podem haver uma ou mais duplicatas para uma
mesma nota fiscal. Tambm podem existir vrias notas fiscais para uma mesma duplicata.
Neste exemplo especfico, existe uma terceira tabela intermediria, que relaciona
duplicatas e notas fiscais (nfdup).

MN SACI 035

13

3. Onde Buscar a informao?

3. Onde Buscar a informao?


O SACI possui hoje algo em torno de 400 tabelas em seu banco de dados. Em face
disto necessrio que o usurio tenha um certo grau de conhecimento deste sistema.
Porm, uma maneira bem simples de saber onde esto as informaes observar
no canto inferior direito das telas do SACI o nome da tabela utilizada.
Por exemplo, dentro do Editor de Clientes, o nome apresentado na posio
indicada custp.
Sendo assim, fica fcil deduzir que , pelo menos as informaes bsicas relativas a
clientes fica nesta tabela. As demais informaes estaro em tabelas relacionais, ou
tabelas-filho.
Estas tabelas geralmente so nomeadas com as letras iniciais da tabela-pai, ou
seja, os nomes destas tabelas so semelhantes. Obviamente isto no uma regra,
apenas uma dica de como procurar.
Exemplos de tabelas-pai e tabelas-filho:

Tabelas-pai

Tabelas-filho

prd

prdalq, prdapl, prdbar, prddun, prdkit

eord

eoprd, eoprdf, eoprdg, eoprdk, eoprdt

inv

invxa, iprd, invalq, invcp


Outra maneira bem interessante para esta consulta utilizada o Help on-line do

SACI. Teclando F1 duas vezes seguidas e depois a letra " q ", o sistema de busca do help
posiciona em " Query - ....... Diagrama de Relacionamentos .......". Tecle <enter> para
confirmar esta opo.
So exibidos para cada tabela-pai, as tabelas-filhos relacionadas ela

3.1 Definir a tabela Mestre


Nem sempre a tabela que contem a maioria das informaes a melhor para ser
escolhida como a tabela mestre.
MN SACI 035

14

3.1 Definir a tabela Mestre


Esta escolha requer uma profunda anlise do relatrio, seu objetivo e quais as
tabelas e campos envolvidos para o seu desenvolvimento, alm dos parmetros para
filtragem.
Por exemplo, em um relatrio de vendas por loja/perodo, talvez a melhor escolha
seja a tabela que tenha informaes sobre as lojas (store) ao invs de optar diretamente
como mestre a tabela xalog2.

3.2 Quais as chaves podero ser utilizadas?


Esta escolha est diretamente ligada escolha da tabela mestre. Dever ser
observada sempre qual a maneira mais rpida de se fazer a leitura dos dados, de acordo
com o objetivo, parmetros de filtragem e colunas a serem impressas do relatrio.

Em qualquer editor do SACI, a opo ordenar apresenta sempre as


chaves existentes na tabela.

3.3 Conhecendo as tabelas do SACI atravs do Query Gerenciador


Conhecer as tabelas do SACI no to complicado como parece ser. Uma maneira
fcil de conhecer uma tabela atravs do Query. Siga os passos:
1. Em Arquivo, escolha Abrir Mestre. Escolha uma tabela
2. Ainda em Arquivo, escolha Informao. O sistema gera um relatrio com toda a
estrutura da tabela, nome dos campos, tamanho e tipo e as chaves existentes

MN SACI 035

15

3.4 Exerccio 2
3.4 Exerccio 2
Qual o nome dos bancos de dados utilizados pelo SACI?

Qual o nome da tabela de histrico de vendas do SACI?

Como chamado o SGBD utilizado pelo SACI em sua empresa?

Cite dois exemplos de colunas da tabela de produtos do SACI:

Defina valores para a questo anterior:

3.5 Exerccio 3
Baseado no que j foi visto at agora, responda as informaes complementares
ao exerccio 1:
* Onde est a informao:

MN SACI 035

16

3.5 Exerccio 3

* Tabela Mestre:

* Chaves possveis:

4. Conceitos Bsicos de SQL


SQL significa Structured Query Language ou Linguagem Estruturada de Pesquisa.
uma linguagem padro e diversos SGBD a utilizam, com algumas variaes
especficas.

4.1 O cliente MySQL


Um cliente qualquer ferramenta que possibilite interagir com o SGBD. Existem
diversos clientes para o MySQL, incluindo o seu prprio.
Para acessar este cliente, basta digitar na linha de comando:
-> $ mysql <enter>
O sistema exibe uma mensagem semelhante a abaixo, indicando que ele est ok e
esperando por comandos.

Your MySQL connection id is 1 to server version: 4.0.18-standard


Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>

4.2 Modos de Logar no banco MySQL


-> mysql <enter> - Loga diretamente no banco MySQL

MN SACI 035

17

4.2 Modos de Logar no banco MySQL


-> mysql -A [banco de dados] - Loga no banco utilizando somente tabelas do banco
de dados informado
-> mysql -A [banco de dados] --pager=more - Loga no banco permitindo que os
resultados das selects sejam apresentados na tela com opo de paginamento (similar ao
comando |more no linux)
->mysql < arquivo.sql - Executa instrues MySQL contidas no arquivo arquivo.sql

4.3 Comandos
Todo comando digitado no cliente MySQL deve ser terminado pelo sinal '' ; '' (ponto
e vrgula)
-> show databases; - Exibe os bancos de dados existentes
-> show tables from [database]; Exibe as tabelas existentes para o banco de dados
informado
-> show columns from [tabela]; Exibe as colunas da tabela informada
-> create database [nome_banco]; Cria um novo banco com o nome informado
-> drop database [nome_banco]; Deleta o banco de dados informado
-> auto rirash (auto complementar)
-> parametro -A (mysql -A)
-> desc [nome tabela];
-> explain [nome tabela];
-> pager less -S (exibe paginado)
-> show index [tabela]; (exibe as chances da tabela)

5. Comando SELECT
Se fosse em Portugus este comando seria algo como:
SELECIONE
O QU (colunas)
DE QUEM (tabelas)
NA CONDIO (seleo)
MN SACI 035

18

5. Comando SELECT
INCLUINDO OUTROS (outras tabelas)
AGRUPADO POR (agrupamento)
INCLUI SE TIVER (filtro)
ORDENADO POR (ordenao)

5.1 Sintaxe
SELECT
coluna1, coluna2, ...
FROM tabela1, tabela2 [JOIN]
WHERE condio
GROUP BY (coluna1, ...)
HAVING (...)
ORDER BY (coluna3, coluna4, ...)

5.2 Exemplos simples


Logar no cliente MySLQ com a opo -A sqldados ( mysql -A sqldados <enter>)
SELECT''seu nome''; <enter>
SELECTno, name FROM custp; <enter>
SELECTno, name FROM custpORDER BY name; <enter>
SELECTno AS Codigo,name AS DescricaoFROM custpWHERE name LIKE 'a
%'ORDER BY nameLIMIT 20; <enter>

MN SACI 035

19

5.3 O QuerySQL - Editar e Executar SELECTS


5.3 O QuerySQL - Editar e Executar SELECTS
Esta ferramenta foi criada para permitir aos usurios do EAC-SACI for MySQL
elaborar relatrios diversos, aliando a velocidade do MySQL com recursos de formatao
do SACI.
Alm das ferramentas prprias do MySQL, foram desenvolvidas vrias outras
exclusivas para este mdulo, facilitando a elaborao de SELECTS pelo usurio.
Neste momento do curso estaremos utilizando apenas a facilidade de se editar e
executar SELECTS atravs do QuerySQL. Suas opes exclusivas sero detalhadas
mais frente.

5.4 Criar uma nova QuerySQL


Para criar uma nova query, basta teclar I (Inserir). Basicamente, os primeiros
campos a serem preechidos sero:
Ttulo - Informe o nome do novo relatrio.
Mdulo- Informe de qual mdulo o relatrio ser acessado via <CtrlA >
Arquivo SQL - Informe o endereo e o nome do arquivo para a criao da select.
Recomendamos que seja padronizado o diretrio /u/saci/sql como default para arquivar as
selects.
Aps criada uma nova query, posicione a barra reversa sobre ela. No menu de
rodap da pgina esto disponveis as opes
Editor - Permite editar o arquivo da select, informado na criao da query. Os
comando utilizados so os do editor de textos padro do SACI, o emax
Executar - Executa a select criada

MN SACI 035

20

5.5 Exerccio 4
5.5 Exerccio 4
Insira uma nova query e, utilizando os recursos de editor e executar, crie as selects
dos exemplos vistos anteriormente

5.6 Padronizao
importante que o usurio tenha o cuidado de padronizar a SELECT, mantendo o
arquivo com as instrues de maneira que possa ser facilmente entendido.
Uma boa maneira de se comear optar pela letra maiscula para os comandos
SELECT. Exemplo:
SELECT
no, name FROM custp
Outra forma interessante a identao. Cada comando em uma linha. Exemplo:
SELECT
no AS Codigo,
name AS Descrio
FROM
custp
WHERE
name LIKE 'a%'
ORDER BY
name
LIMIT 20
Nomear as colunas e tabelas tambm fundamental. Isso feito atravs da
declarao AS. Exemplo:

MN SACI 035

21

5.6 Padronizao
no AS Codigo,
name AS Descrio

5.7 Uso do WHERE


Pode ser usado com vrios parmetros de comparao, a seguir:

Parmetros

Opes/ Descrio

Igual a

!=

Diferente de

>

Maior que

<

Menor que

>=

Maior igual

<=

Menor que

BETWEEN

Entre

LIKE

Usado para campos tipo texto

IN

Otimizao

AND/OR

E / OU

Exemplos:
WHERE clno = 010101
WHERE empno != 3
WHERE date >= 20040101 AND <= 20040131
WHERE storeno = 1 OR storeno = 2 OR storeno = 3
WHERE storeno IN(1,2,3,5)

MN SACI 035

22

5.7 Uso do WHERE


WHERE name LIKE 'maurilio'
Observaes para o WHERE
Use parnteses para clarear os comandos
Evite contas ou converses
O IN funciona melhor que o OR em muitos casos (ex: select - list)

5.8 Funes SQL


5.8.1 Funes de agregao, soma e contagem
SUM(expr) - Retorna a soma de expr para valores no-NULL nas linhas
selecionadas.
Exemplo:
SELECT
SUM(qtty) FROM xalog2
WHERE ...
COUNT(*) - Retorna o nmero de valores no-NULL nas linhas retornadas pelo
comando
SELECT.
Exemplo:
SELECT
COUNT(no)
FROM prd

MN SACI 035

23

5.8 Funes SQL


5.8.2 Funes Diversas
CONCAT(str1,str2...) - Retorna o string resultante da concatenao dos strings
especificados. Retornar NULL se qualquer um dos argumentos for NULL.
Exemplo:
SELECT
CONCAT(no, name)
FROM custp
LTRIM(str) - Retorna o string str sem os espaos em branco iniciais. A funo
RTRIM(str) retorna o string sem os espaos em branco finais.
Exemplo:
SELECTLTRIM(name)
FROM prd
LEFT(str,tam) - Retorna tam caracteres iniciais do string str. A funo
RIGHT(str,tam) retorna tam caracteres finais do string.
Exemplo:
SELECT
LEFT(name,10)
FROM custp
LPAD(str,tam,padstr) - Retorna um string consistindo do valor do string str,
preenchido esquerda com o string padstr at o tamanho tam. A funo
RPAD(str,tam,padstr) faz a mesma coisa, porm o preenchimento direita.

MN SACI 035

24

5.8 Funes SQL


Exemplo:
SELECT
LPAD(name,40,''=>'')
FROM custp
MID(str,pos,tam) - Retorna um substring do string str, a partir da posio pos e
tamanho tam.
Exemplo:
SELECTMID(name,5,10)
FROM custp
REPLACE(str, de_str, para_str) - Retorna um string consistindo do string str com
todas as ocorrncias do string de_str substitudas pelo string para_str.
Exemplo:
SELEC
TREPLACE(name, 'A', 'xxx')
FROM custp
FORMAT(x,d) - Retorna o nmero x formatado ('#,###,###.##'), arredondado para
d casas decimais.

MN SACI 035

25

5.8 Funes SQL

Faa uma select buscando o cdigo, descrio e o preo de


venda dos produtos, exibindo o preo em formato de moeda
corrente (em Reais), configurado no painel de criao do relatrio

ROUND(x,d) - Retorna o valor de x arredondado para um nmero com d casas


decimais. Se d=0, o resultado no ter ponto decimal ou parte fracionria.
Exemplo:
SELECT
ROUND(cm_varejo/10000,4)
FROM stk
DATE_FORMAT(data, formato) - Retorna uma data formatada. Os seguintes
especificadores podem ser utilizados no string de formatao:
Exemplo:
SELECTDATE_FORMAT(date, '%d/%m/%y')
FROM xalog2
IF(expr1, expr2, expr3) - Retornar expr2 se expr1 for Verdadeiro (no 0 ou
NULL); Caso contrrio, retornar expr3.

MN SACI 035

26

5.8 Funes SQL


Exemplo:
SELECT
IF(type = 1, amtdue, 'Recibo')
FROM dup
CASE valor
WHEN [condio] THEN resultado
WHEN [condio] THEN resultado
ELSE resultado
END
Este comando avalia uma srie de condies para determinar o resultado. Muito
utilizado para campos onde no existem descries gravadas em tabelas no SACI, como
por exemplo os tipos de pagamento utilizados nos PDVS (dinheiro, cheque, carto, etc).
Exemplo:
SELECT
CASE xalog2.xatype
WHEN 0
THEN ''Dinheiro''
WHEN 5
THEN ''Crediario''
ELSE ''Outros''
END AS ''Tipo Pagamento''
FROMsqldados.xalog2

5.9 Exerccio 5
Monte uma select buscando todos os clientes do SACI que possuam ''silva'' no
nome
Monte uma select buscando todos os produtos que estejam cadastrados com o
MN SACI 035

27

5.9 Exerccio 5
centro de lucro 010101
Liste o total de vendas da loja 1 para o ms de janeiro de 2002
Liste os valores totais em aberto para duplicatas e recibos para a loja 2 e emitidos
no ano de 2001

6. Relacionando Tabelas
Na maioria dos casos, para que se obtenha o resultado desejado em uma SELECT,
necessrio que a consulta seja feita em mais de uma tabela. Nestes casos, as tabelas
devem ser relacionadas.
Relacionar tabelas significa un-las atravs de um ou mais campos em comum.
Nestas situaes, o usurio dever sempre observar as chaves das tabelas,
visando a melhor forma de relacion-las.
Por exemplo, imagine uma SELECT simples onde devem ser listados o nome do
produto e o nome do centro de lucro a que o produto pertence.
Os dados do produto esto na tabela prd, inclusive qual o nmero do centro de
lucro cadastrado para ele. Porm a descrio deste centro de lucro est na tabela onde
so cadastrados os centros de lucro, a tabela cl. A SELECT ficaria ento:
SELECT
prd.no AS Codigo,
prd.name AS Descrio,
cl.name AS 'Centro Lucro'
FROM
sqldados.prd, sqldados.cl
WHERE
prd.clno = cl.no
A este tipo de relacionamento chamamos de join plena.

MN SACI 035

28

6. Relacionando Tabelas
importante ficar atento em relao as joins. Conforme a maneira que uma
SELECT feita, a join pode resultar em um produto cartesiano entre as tabelas
relacionadas, ou seja, para cada registro lido da tabela mestre, sero lidos todos os
registros da tabela relacionada. Imagine esta situao entre duas tabelas grandes, como
por exemplo xalog2 e custp....

6.1 LEFT JOIN


Uma LEFT JOIN retorna todas as linhas da tabela esquerda em um
relacionamento, independente de haver ou no relacionamento com a tabela da direita.
Por exemplo, em uma relao entre a tabela de clientes e cheques pr-datados. O
objetivo listar todos os clientes e, se houver, o total de cheques pr-datados
cadastrados com seu nome.
SELECT
custp.name AS Cliente,
SUM(cpdue.amt) AS Cheque
FROM
sqldados.custp
LEFT JOIN
sqldados.cpdue ON
custp.no = cpdue.custno
GROUP BY
custp.no

6.2 Exerccio 6
Monte um relatrio com cdigo do vendedor, nome do vendedor e valor total de
vendas para loja 1 e ano de 2002

MN SACI 035

29

6.3 Verificando consistncia em tabelas - Pais sem filhos e filhos


sem pai
6.3 Verificando consistncia em tabelas - Pais sem filhos e filhos sem
pai
Em algumas situaes podem ocorrer inconsistncias entre as tabelas do SACI,
onde os registros da tabela pai so retirados mas os registros da tabela filho no
(registros retirados via Query por exemplo). Atravs de SELECTS possvel identificar
facilmente estes registros. Por exemplo, imagine uma pesquisa onde vamos identificar
quais registros da tabela eoprd (tabela filho) no possuem relacionais na tabela eord
(tabela pai).
SELECT
IFNULL(eord.storeno,0) AS Loja_pedido,
eord.ordno AS Pedido_pedido,
eoprd.storeno AS Loja_produto,
eoprd.ordno AS Pedido_produto
FROM
sqldados.eoprd
LEFT JOIN
sqldados.eord ON
eord.storeno = eoprd.storeno AND
eord.ordno = eoprd.ordno
WHERE
eord.storeno IS NULL

6.4 Exerccio 7
Monte uma SELECT para identificar se existe inconsistncia entre contratos e
parcelas do credirio.

MN SACI 035

30

7. O QuerySQL

7. O QuerySQL
Esta ferramenta foi criada para permitir aos usurios do EAC-SACI for MySQL
elaborar relatrios diversos, aliando a velocidade do MySQL com recursos de formatao
do SACI. Assim, de qualquer mdulo do sistema ser possvel executar estes relatrios
atravs da tecla de atalho < Ctrl A >, ou ento diretamente no mdulo QuerySQL Biblioteca. O acesso ser configurado para cada usurio, semelhante as outras opes do
SACI.
Alm das ferramentas prprias do MySQL, foram desenvolvidas vrias outras
exclusivas para este mdulo, facilitando a elaborao de '' selects '' pelo usurio.

7.1 Configuraes
O arquivo executvel para o QuerySQL o qsql e a tabela correspondente a
sqlexe. Cada query criado ter um arquivo-texto correspondente, onde ser digitada a "
select " correspondente a ele. A sugesto da EAC que seja criado o diretrio /u/saci/sql
para armazenamento dos arquivos de " selects ".
Tambm, a fim de manter um certo padro e organizao, todo arquivo de " select "
dever ter a extenso .sql

7.2 Passos para a configurao


1. Criar o diretrio /u/saci/sql ( logado como eacadm )
->(eacadm) > mkdir /u/saci/sql <Enter>
2. Acerto de varivel de ambiente:Edite o arquivo /home/usuario/.bash_profile e
acrescente a varivel de ambiente:
-> export SACI_QUERYSQL=/u/saci/sql/ Desta forma, o campo Arquivo SQL nos
parmetros de configurao de cada query ser preenchido automaticamente com o
caminho do diretrio onde ficam as sqls (/u/saci/sql/)

MN SACI 035

31

7.2 Passos para a configurao


3. Configuraes de Acesso:
O acesso se d por meio de tecla de atalho < Ctrl A > ou diretamente pelo Menu
Principal do SACI. Para tecla de atalho, configurar no Editor de Usurios, Acessos Gerais.
No menu, atravs da opo de Acesso. Segue o mesmo padro do Query convencional,
conforme abaixo:
Menu QuerySQL - Gerenciador - Elaborao de novos relatrios.
Menu QuerySQL - Biblioteca - Executa relatrios prontos
Tecla de atalho < Ctrl A > - Executa relatrios prontos

7.3 Controle de Acesso por Relatrio


possvel definir controle de execuo de relatrios para um ou mais usurios, ou
seja, para cada relatrio so informados quais os usurios que podero execut-lo. Este
controle no ser verificado para o usurio nmero 1 (Administrador do SACI).
Para utilizar este recurso ele deve ser antes habilitado na Configurao Geral do
Sistema, Informaes Gerais, Utiliza Controle de Usurios no QuerySQL.
Aps inserir ou modificar um relatrio ser exibida a interface para que sejam
informados quais usurios podero execut-lo.
Estas informaes so armazenadas na tabela sqluser.
O controle poder ser feito tambm via tecla U - Usurios com acessos ao relatrio,
disponvel no menu de rodap da pgina.

7.4 Funes do Menu - QuerySQL


As funes bsicas so praticamente as mesmas usadas nos outros editores do
SACI, sendo funes exclusivas Editar e Executar, detalhadas abaixo:
Inserir - Insere nova query
MN SACI 035

32

7.4 Funes do Menu - QuerySQL

Modificar - Modifica parmetros de configuraes da query


Retirar - Retira uma query
Editar - Edita o arquivo onde esta a query
Executar - Executa a query selecionada pela barra reversa
Esc - Sai do mdulo

7.5 Criar uma nova QuerySQL


Para criar uma nova query, basta teclar I (Inserir). Basicamente, os primeiros
campos a serem preechidos sero:
Ttulo - Informe o nome do novo relatrio.
Mdulo-Informe de qual mdulo o relatrio ser acessado via <Ctrl A>
Arquivo SQL - Informe o endereo e o nome do arquivo para a criao da "
select ". Recomendamos que seja padronizado o diretrio /u/saci/sql como default para
arquivar as " selects ".
Imprime Cabealho - Define se o cabealho padro do SACI ser impresso ou
no. Caso faa a opo por no imprimir o cabealho, o QuerySQL exibe somente o
resultado da " select ", sem os nomes das colunas. Ideal para exportar o resultado para
outros programas, como planilhas eletrnicas.
Nmero de Colunas - Escolha entre 80 ou 132 colunas.

MN SACI 035

33

7.5 Criar uma nova QuerySQL


Condensado - Define se o relatrio ser impresso com fonte condensada ou
normal.
Relatrio possui Sub_Ttulo - Geralmente so usados neste campo alguns
parmetros de seleo para o relatrio, como perodo, loja, etc. Observe que estes
campos so as '' variveis de interface'' da " select ". Para que sejam impressos, informe
estas variveis na mesma ordem em que aparecem na " select ", seguindo uma
numerao sequencial entre chaves. Veja o exemplo abaixo:Considere a " select ":

SELECT SUM(amt - discount) AS Total_Vendas FROM sqlpdv.pxa


WHERE date >= {:d:Data Inicial} AND date <= {:d:Data Final} AND storeno =
{:store:Informe a Loja}
Informe o Sub Ttulo com o formato:

Perodo: {0} At {1} - Loja {2}


Relatrio tipo Mestre/Detalhe - Similar ao recurso de usar dois lay-outs no
Query convencional, possibilita formatar o relatrio de maneira que a informao "mestre"
fique separada das informaes "detalhe". Ao selecionar Sim para esta opo, uma nova
interface exibida, onde devero ser informadas as colunas que definem o mestre
(separadas por vrgula). Em seguida, informe o tipo de impresso, se os detalhes sero
na mesma linha ou abaixo das informaes do mestre. Veja abaixo exemplos de acordo
com cada configurao:
Considere uma " select " que liste duplicatas por vendedor:
Opo 1:
Relatrio tipo Mestre/Detalhe > N
O resultado seria algo como:

MN SACI 035

34

7.5 Criar uma nova QuerySQL


No Vend

Nome Vendedor

Duplicatas

Valor

Data

Roberto Carlos

234/1

3.514,00

31/01/2002

Roberto Carlos

152/1

1.135,00

31/01/2002

Roberto Carlos

831/6

1.453,15

15/02/2002

Opo 2:
Relatrio tipo Mestre/Detalhe > S
Colunas que definem o Mestre > 1, 2
Formato de Impresso > 0 - Detalhes na mesma linha
O resultado seria:

No Vend
1

Nome Vendedor
Roberto Carlos

Duplicatas

Valor

Data

234/1

3.514,00

31/01/2002

152/1

1.135,00

31/01/2002

831/6

1.453,15

15/02/2002

Opo 3:
Relatrio tipo Mestre/Detalhe > S
Colunas que definem o Mestre > 1, 2 Formato de Impresso > 1 - Detalhes abaixo
O resultado seria:

No Vend

Nome Vendedor

Duplicatas

Valor

Data

Roberto Carlos
234/1

3.514,00

31/01/2002

152/1

1.135,00

31/01/2002

831/6

1.453,15

15/02/2002

Colunas que definem Quebras: Similar ao "quebra" do Query convencional.


Informe em qual coluna ser feita a quebra. No exemplo acima, ser pela coluna 1 (No

MN SACI 035

35

7.5 Criar uma nova QuerySQL


Vend).
Relatrio possui Sub Quebra: Possibilita uma nova quebra dentro de uma j
existente. Neste caso ser gerado um sub-total automaticamente em cada sub-quebra.
Informe em qual coluna ser feita a sub quebra e se os subtotais sero com linhas
separadoras. No exemplo acima, caso a sub quebra fosse feita na coluna '' Data '', o
resultado seria:

No Vend

Nome Vendedor

Duplicatas

Valor

Data

Roberto Carlos
234/1

3.514,00

31/01/2002

152/1

1.135,00

31/01/2002

Sub-Total

4.649,00

831/6

1.453,15

Sub-Total

1.453,15

Total

6.102,15

15/02/2002

Colunas em Formato Dinheiro: Para colunas do tipo '' dinheiro '', no


necessrio que a formatao seja feita pela " select " (diviso da string por 100 a fim de
acertar a preciso de casas decimais). Basta informar neste campo quais as colunas e o
QuerySQL faz a formatao correta. Somente em casos de frmulas do tipo '' quantidade
X preo '' (tabela xalog2 por exemplo), dever ser usada a diviso por 1000 no campo ''
quantidade ''.
Colunas em Formato Quantidade: Para colunas do tipo '' quantidade '', no
necessrio que a formatao seja feita pela " select ". Basta informar neste campo quais
as colunas e o QuerySQL faz a formatao correta.

MN SACI 035

36

7.5 Criar uma nova QuerySQL


Colunas em Formato Hora: Para colunas do tipo '' hora '', no necessrio que
a formatao seja feita pela " select ". Basta informar neste campo quais as colunas e o
QuerySQL faz a formatao correta.
Colunas com Totalizao: Neste campo informe quais as colunas devem ser
totalizadas pelo QuerySQL. Se for informado "quebra", as colunas sero totalizadas a
cada quebra.
Colunas com Clculo de Mdia: Este campo faz a mdia simples da coluna
indicada, dividindo o valor total da coluna peno nmero de linhas de cada quebra.
Totais com Linhas Separadoras: Define se imprime ou no uma linha
separadora aps cada subtotal.
Totalizao Geral dos Campos: Define se imprime o total geral para colunas de
valores e quantidades.

7.6 Variveis de Contedo


Uma srie de recursos extras foram implementados neste mdulo, visando facilitar
a elaborao das queries. Entre estes recursos esto as Variveis de Contedo, que so
variveis de datas e horas, geralmente usadas nas condies "WHERE". So elas:
[ONTEM] - Retorna a data de ONTEM no formato yyyymmdd
[HOJE] - Retorna a data de HOJE no formato yyyymmdd
[AMANHA] - Retorna a data de AMANHA no formato yyyymmdd
[HORA] - Retorna a HORA atual n (n segundos aps 00:00)

MN SACI 035

37

7.6 Variveis de Contedo


[ANOMES] - Retorna o ANO/MS atual no formato yyyymm
[INICIOMES] - Retorna o primeiro dia do ms atual no formato yyyymmdd
[FIMMES] - Retorna o ltimo dia do ms atual no formato yyyymmdd
[INICIOANO] - Retorna o primeiro dia do ano atual no formato yyyymmdd
[FIMANO] - Retorna o ltimo dia do ano atual no formato yyyymmdd
[TABELA] - Usado para tabelas temporrias
[LISTA1] - Usado para comandos Select_List

7.7 Variveis de Interface


Usadas quando se quer informar uma condio para a execuo da query, por
exemplo um perodo determinado, ou uma loja especfica, etc. Para as variveis que so
chave nas tabelas, existe ainda o recurso das teclas F2 (consulta pela descrio) ou F3
(acessa o Editor). So elas:
{:s} - Edio de um campo numrico (short, 5 posies)
{:l} - Edio de um campo numrico (long, 10 posies)
{:d} - Edio de um campo tipo Data
{:$} - Edio de um campo numrico (money, 15/2)
{:h} - Edio de um campo tipo Hora

MN SACI 035

38

7.7 Variveis de Interface


{:f} - Edio de um campo tipo Float (ponto flutuante)
{:y} - Edio de um campo tipo Ms/Ano
{:x} - Varivel do Tipo Senha
{:prd} - Edio de um Produto
{:custp} - Edio de um Cliente
{:vend} - Edio de um Fornecedor
{:bank} - Edio de um Banco
{:cl} - Edio de um Centro de Lucro
{:emp} - Edio de um Funcionrio / Vendedor
{:store} - Edio de uma Loja
{:type} - Edio de um Tipo
{:acc} - Edio de uma Conta-Razo
{:fxatp} - Edio de um Tipo de Transacao Financeira
{:corp} - Edio de uma empresa (grupo de lojas)
{:empSenha} - Edio do campo senha do cadastro de funcionrios

MN SACI 035

39

7.7 Variveis de Interface


{Informe_o_Texto} - Edio de um campo alfanumrico. Nestes casos dever ser
usado o comando LIKE na " select ".
{:page:} - O objetivo desta varivel informar ao QuerySQL qual o nmero da
primeira pgina a ser impressa, sendo incrementado normalmente a partir das pginas
seguintes. Muito til para as empresas que utlizam o QuerySQL para imprimir algum livro
fiscal, por exemplo, cuja numerao de pgina deva iniciar a partir de um valor especfico.
Exemplos de uso:-> $pagina = {:page} - Ser aberto para edio um campo com o Texto
"Pagina Inicial"-> $pagina = {:page:Informe a Pagina} - Ser aberto para edio um
campo com o Texto "Informe a Pagina"
Textos personalizados podem ser includos nas variveis de interface. Exemplos:
{:d:Data Inicial} {:prd:Nome do Primeiro Produto}.
Tambm possvel se definir valores '' default '' para as variveis de interface, e se
o campo ser de preenchimento obrigatrio ou no. Este recurso opcional mas se
utilizado, deve ser informado em conjunto (valor default e obrigatoriedade do campo).
Esses valores so informados separados por um ponto-e-virgula ( ; ). Exemplos:
$loja = {:store:No. da Loja;17;S}Edio do No. da Loja, valor default = 17, campo
obrigatrio
$periodoI = {:d:De;20020901;S}Edio de uma data Inicial, valor default =
01/09/2002, campo obrigatrio
$nome = {Nome do Cliente,20;EAC;N} Edio de um campo alfa-numrico de
tamanho 20, valor default = EAC, no-obrigatrio
$empno = {:emp;0;S}Edio de um nmero de Vendedor, com mensagem padro
definida pelo prprio QuerySQL, sem valor default (0) mas com preenchimento obrigatrio

MN SACI 035

40

7.7 Variveis de Interface

* {:empSenha} - Objetivo: algumas empresas desejam disponibilizar no PDV, por


exemplo, um relatorio de Vendas por Vendedor. Mas cada vendedor somente pode ter
acesso `as vendas efetuadas por ele proprio. O uso da variavel acima {:empSenha}
resolve essa questao, pois, ao se informar o No. do Vendedor para o qual as vendas
serao listadas, sera' necessario digitar a senha desse vendedor/funcionario, informada no
Editor de Funcionarios. Com isso, cada vendedor ou funcionario somente conseguira'
listar as proprias vendas.
Exemplo de uso:
--------------%vars
$dataI = {:d:Data Inicial}
$dataF = {:d:Data Final}
$empno = {:empSenha:No. Vendedor}
%

7.8 Comando Select_List


At a verso atual (4.0.6) o MySQL no possui SUB-SELECTs. Com isso, torna-se
necessrio efetuar 2 " selects " separadas para se obter o resultado desejado em alguns
casos. Ainda assim, pode se tornar muito complicado elaborar uma " select " otimizada a
partir de uma " select " original.
O comando SELECT_LIST foi criado para resolver esses casos. Funcionando
dentro de um comando temporrio, o SELECT_LIST prepara uma lista de valores para ser
usado em conjunto com o comando IN da linguagem SQL, cujo uso bastante otimizado
pelo MySQL.
Veja o exemplo abaixo:
Objetivo do Relatrio:
Listar os clientes somente das lojas ativas informadas no cadastro de Lojas.
MN SACI 035

41

7.8 Comando Select_List

#
SELECT_LIST no
FROM sqldados.store
WHERE active = 1
ORDER BY no
#
SELECT no, name
FROM sqldados.custp
WHERE storeno IN ([LISTA1])
ORDER BY storeno,name
Explicando o relatrio acima:
A primeira " select " temporria (o comando est entre '' # '') e uma " select "
especial: SELECT_LIST. Isso sinaliza para o QuerySQL que dever ser gerada uma lista
com valores para serem usados em conjunto com o comando IN. Observaes:
O comando SELECT_LIST no existe na linguagem SQL - apenas o QuerySQL
entende esse comando.
No comando SELECT_LIST, apenas a primeira coluna ser considerada para se
criar a lista. Se no exemplo acima fosse usado "SELECT_LIST name, no" seria criada
uma lista com os nomes das lojas, e no o nmero. Portanto, os comandos do tipo
"SELECT_LIST" devem listar apenas um campo, e esse campo que ser usado para
compor a lista.

MN SACI 035

42

7.8 Comando Select_List

A segunda " select " faz uso da lista criada na primeira " select ", atravs da
varivel [LISTA1]. Como podem existir at 8 " selects " temporrias, ser possvel criar
uma lista para cada " select ". Logo, a varivel [LISTA] pode variar de [LISTA1] at
[LISTA8]. No exemplo acima, se as lojas ativas forem as de nmero 1, 2, 4, 5, 10 e 12, a
varivel [LISTA1] ter o seguinte contedo: 1, 2, 4, 5, 10, 12. Para o QuerySQL portanto, a
" select " final ser executada da seguinte forma:

SELECT no, name


FROM sqldados.custp
WHERE storeno IN (1,2,4,5,10,12)
ORDER BY storeno, name
Como o comando IN otimizado no MySQL, pode-se obter um efeito bastante
positivo em termos de performance preparando-se primeiro uma lista de valores atravs
do comando SELECT_LIST.

7.9 Seo de Variveis


Tambm possvel definir uma seo de variveis dentro da " select ". A idia
permitir que as variveis de interface possam ser usadas dentro do comando SQL
repetidas vezes, mas que na interface sejam informadas uma nica vez. A definio das
variveis segue um lay-out especifico, demonstrado no exemplo de " select " abaixo:

%vars
$dataI = {:d:Data Inicial}
$dataF = {:d:Data Final}
MN SACI 035

43

7.9 Seo de Variveis

%
SELECT
dup.dupno AS Numero,
dup.issuedate AS Emissao,
dup.duedate AS Vencimento
FROM sqldados.dup
WHERE (dup.issuedate >= [$dataI] AND dup.issuedate <= [$dataF])
OR (dup.duedate >= [$dataI] AND dup.duedate <= [$dataF])
No exemplo acima, sero listadas todas as duplicatas cujas datas de emisso ou
datas de vencimento estejam dentro do perodo informado. Perceba que as variveis ''
Data Inicial'' e ''Data Final'' foram utilizadas dentro do comando SQL mais de uma vez,
mas no momento da execuo do relatrio ser necessrio inform-las apenas uma nica
vez.

Observaes:
A seo de variveis deve comear obrigatoriamente com a palavra '' %vars ''
(sem as aspas) e essa palavra deve estar sempre na primeira linha do arquivo
Toda varivel deve ser declarada com o sinal '' $ '' na frente, seguido do nome da
varivel, do sinal de igualdade (com ou sem espaos) e da definio da varivel
O QuerySQL far a distino de variveis maisculas e minsculas. Isso significa
que $DataI e $dataI so 2 variveis diferentes

MN SACI 035

44

7.9 Seo de Variveis


A seo de variveis deve obrigatoriamente terminar com o sinal '' % '' (sem as
aspas)
A varivel deve ser utilizada dentro do comando SQL envolvida em colchetes
( [$dataI] por exemplo). Isso indica para o QuerySQL que estaremos tratando de variveis
de interface definidas na seo de variveis

7.10 SELECT_VARS - (Criao de Variveis Genricas)


Atravs desse novo comando possvel a criao de variveis genricas que
podem ser usadas em qualquer lugar dentro de outras SELECTs. Exemplos de uso desse
novo recurso:

7.10.1 Ttulos de colunas com ms/ano calculados automaticamente


Suponha um relatrio que mostre as vendas dos ltimos 3 meses. Atravs do
SELECT_VARS pode-se fazer com que os ttulos das colunas sejam calculados e
mostrados automaticamente de acordo com o dia da emisso do relatrio. O arquivo para
o QuerySQL ficaria da seguinte forma:
#
SELECT_VARS
DATE_FORMAT(NOW(), "%m/%Y") as Mes1,
DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 MONTH), "%m/%Y") as Mes2,
DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 2 MONTH), "%m/%Y") as Mes3;
#
SELECT
... as '[VAR1]',
... as '[VAR2]',
... as '[VAR3]'
FROM ...
MN SACI 035

45

7.10 SELECT_VARS - (Criao de Variveis Genricas)


WHERE ...;
Explicando o exemplo acima:
A funo NOW() retorna a data e a hora atual;
A funo DATE_FORMAT usada com "%m/%Y" retorna o ms/ano no formato
mm/aaaa (exemplo: 03/2005);
A funo DATE_SUB efetua uma conta entre datas - no exemplo acima foram
calculados os 2 ltimos meses (INTERVAL 1 MONTH e INTERVAL 2 MONTH);
Para cada coluna existente no comando SELECT_VARS ser criada uma varivel
correspondente, que pode ser acessada atravs do campo [VARx], onde x a coluna da
varivel.
No exemplo acima, os ttulos das 3 colunas seriam impressos da seguinte forma
(considerando ''hoje'' o dia 01/03/2005):

03/2005

02/2005

01/2005

7.10.2 Frmulas grandes ou complexas que precisem ser utilizadas vrias


vezes em uma ou mais SELECTs
Suponha um relatrio que mostre as vendas de produtos e o Lucro Bruto (Venda CMV), tudo baseado na tabela xalog2. O clculo da venda por produto baseada na
seguinte formula:
(((xalog2.qtty/1000)*ABS(xalog2.price))-xalog2.discount)
Atravs do SELECT_VARS pode-se fazer com que essa frmula seja associada
em uma varivel e essa varivel pode ser facilmente utilizada por todas as SELECTs,
aumentando a clareza e a documentao da SELECT.
MN SACI 035

46

7.10 SELECT_VARS - (Criao de Variveis Genricas)


Detalhe importante: para o caso de frmulas, devem existir aspas simples no incio
e no final da frmula. Isso porque na verdade a varivel criada pelo SELECT_VARS ir
guardar o texto da frmula e no o resultado.
A SELECT ficaria da seguinte forma:
%vars
$loja = {:store:No.da Loja;1;S}
$dataInicial = {:d:Data Inicial}
$dataFinal = {:d:Data Final} %
#
SELECT_VARS '(((xalog2.qtty/1000)*xalog2.price) - xalog2.discount)'
#
SELECT
xalog2.prdno as Codigo,
SUM(xalog2.qtty) as Quantidade,
SUM([VAR1]) as Venda,
SUM([VAR1]) - SUM((xalog2.qtty)*xalog2.cost_cm)/100000 as LucroBruto
FROM
sqldados.xalog2
WHERE
xalog2.storeno = [$loja] AND
xalog2.date BETWEEN [$dataInicial] AND [$dataFinal]
GROUP BY
xalog2.prdno;

7.11 Tabelas Temporrias


Tambm possvel o uso de tabelas temporrias, para casos em que o resultado
no pode ser obtido em apenas uma " select ". Nestes casos, a primeira " select " dever
ser iniciada e terminada com o sinal '' # '' (cerquilha). Abaixo, exemplo de uma " select "
usando tabela temporria: Totaliza quantidades em estoque por loja. Observe o sinal '' # ''
MN SACI 035

47

7.11 Tabelas Temporrias


antes e depois da primeira " select ", e a varivel [tabela] usada no join com a tabela
store.

# SELECT
store.no AS loja,
stk.prdno AS cod,
sum(stk.qtty_atacado) AS total
FROM sqldados.store
LEFT JOIN sqldados.stk
ON (store.no=stk.storeno)
GROUP BY stk.storeno,stk.prdno
HAVING total > 0
#
SELECT
store.no AS Loja,
SUM([tabela].total) AS Total
FROM sqldados.store
LEFT JOIN [tabela]
ON (store.no = [tabela].loja)
GROUP BY store.no

7.12 Gerar Relatrios em Formato .pdf


Os relatrios gerados pelo QuerySQL podem ser salvos em formato .pdf. Para

MN SACI 035

48

7.12 Gerar Relatrios em Formato .pdf


utilizar este recurso observe as seguintes condies:
Verificar a existncia da tabela prntr2, onde ficam armazenados os relatrios
gerados neste formato. Caso no possua esta tabela em seu banco de dados, entre em
contato com a EAC para obt-la ou ento faa o download diretamente em
http://www.eacnet.com.br/download
Habilite esta opo na Configurao Geral do Sistema, Gera Formato PDF
Relatrios QuerySQL
Com esta opo habilitada, verifique em cada impressora cadastrada no SACI, na
ltima tela de informaes, abaixo da edio das escape sequences, a opo Imprime
formato PDF. Respondendo Sim esta pergunta ser possvel informar os seguintes
parmetros para a impresso em PDF: - Tipo de Fonte (Ttulo) - Define a fonte para a
impresso do ttulo do relatrio - Tamanho da Fonte (Ttulo) - Define o tamanho da fonte
para a impresso do ttulo do relatrio - Tipo da Fonte (Corpo) - Define a fonte para a
impresso das linhas do relatrio- Tamanho da Fonte (Corpo) - Define o tamanho da fonte
das linhas do relatrio- Tamanho da Pgina - A4, Legal ou Carta- Orientao da Pgina Retrato ou Paisagem - Espaamento entre Linhas - Define o espaamento entre linhas
(em pixels). Valor dafault = 7 - Margem Horizontal e Margem Vertical - Define as margens
horizontal e vertical (em pixels). Valor default = 20- Arquivo de logotipo - Define a imagem
que poder ser impressa no canto superior esquerdo da pgina. A imagem deve ser
quadrada, para que a impresso possa sair correta. Se a empresa no deseja imprimir
nenhuma imagem, basta informar um nome invlido nesse campo (a palavra ''nada'' por
exemplo).
No final da gerao de cada relatrio gerado pelo QuerySQL ser exibida a opo
pdf no menu de rodap, junto com imprime, consulta, etc. Esta opo que efetivamente
far a gerao do relatrio em formato .pdf.
O diretrio default para a gerao dos arquivos .pdf pode ser definida via
configurao de varivel de ambiente. Caso no seja definida esta varivel, os arquivos

MN SACI 035

49

7.12 Gerar Relatrios em Formato .pdf


sero gerados no mesmo diretrio para impresso de arquivos comuns (/print).
A linha para definio desta varivel de ambiente :
-> SACI_PDF=/u/saci/pdf
Neste caso a sugesto criar um diretrio chamado pdf para este fim.

7.13 Gerao de Etiquetas


Tambm possvel gerar etiquetas pelo QuerySQL. Para definir que a impresso
ser neste formato, responda Sim a opo Impresso em formato Etiqueta.
Aps informar Sim, sero apresentadas 4 opes que definem o tamanho da
etiqueta, sendo:
No. de Colunas de Etiquetas - Define em quantas colunas sero impressas as
etiquetas.
Tamanho da Etiqueta (caracteres) - Define o tamanho horizontal de cada
etiqueta em nmero de caracteres. Os espaos em branco tambm devem ser contados.
Se o campo impresso for menor que o tamanho informado, o restante ser preenchido
com espaos. Se o campo for maior, o campo ser truncado no tamanho da etiqueta.
No de Espaos entre Etiquetas - No caso de impresso em duas ou mais
colunas, este parmetro define quantos espaos em caracteres sero ''pulados'' at que
seja iniciada a impresso da prxima etiqueta. a distncia horizontal entre etiquetas.
No de Linhas entre Etiquetas - Neste caso so o nmero de linhas que devem
ser ''puladas'' para iniciar a impresso da prxima etiqueta. a distncia vertical entre
etiquetas.
O lay-out da etiqueta definido pela prpria SELECT e para um nico registro,
independentemente do nmero de colunas definido na configurao acima. Alm disso,
preciso especial ateno ao campo de separao de linhas, pois ele define o que ser
MN SACI 035

50

7.13 Gerao de Etiquetas


impresso em cada linha. Exemplo de SELECT:
SELECT
no, name, "\n" as "\n",
add1, "\n" as "\n",
CONCAT(city1,'/', state1), "\n" as "\n"
FROM
sqldados.custp
ORDER BY
name
A SELECT acima imprime uma etiqueta de clientes no seguinte formato (supondo 2
colunas):

1234 CLIENTE EXEMPLO A

1235 CLIENTE EXEMPLO B

RUA A, 1234

AV. B, 5678

BELO HORIZONTE/MG

SAO PAULO/SP

O campo de separao de linha definido pela expresso "\n" as "\n"


Esse campo indica um fim-de-linha para a etiqueta, informando que os prximos
campos devero ser impressos na linha abaixo. No exemplo acima, o cdigo do cliente e
o nome devem ficar na mesma linha, logo, o fim-de-linha foi includo logo aps o nome.
Ao mesmo tempo, o comando CONCAT pode ser usado para juntar 2 ou mais
campos na mesma linha, no mesmo formato que foi feito para a cidade e o estado no
exemplo acima:
CONCAT(city1, '/', state1) SAO PAULO/SP

7.14 Exerccio 8
Crie um relatrio com as seguintes colunas: Cdigo do Produto, Descrio do
Produto, Nmero do Centro de Lucro, Total em Vendas e Estoque Atual. Os filtros so:
MN SACI 035

51

7.14 Exerccio 8
Produtos do Centro de Lucro 010101, Vendas para a loja 1 e perodo de vendas entre
01/01/2002 at 31/12/2002. Obs. Os produtos devem ser listados, independentemente se
houver vendas ou estoques.

8. Dicas
Nesta parte esto algumas dicas para a elaborao de " selects " , aliando recursos
do QuerySQL e do MySQL.

8.1 Contador de Registros


Em alguns casos pode existir a necessidade de se criar contadores de registros em
" selects" . Para este tipo de recurso, a " select " dever ter uma tabela temporria para
definio do contador e na " select " seguinte, o incremento deste contador, de acordo
com possveis quebras. Veja o exemplo simplificado abaixo:

#
SELECT @linha:=0 AS linha
#
SELECT
@linha:=linha+1 AS linha,
(restante da select ....)

8.2 Seleo de registros do tipo ''bit''


Vrias definies do tipo '' Sim ou No '' no SACI so feitas atravs de bits. o
caso por exemplo de produtos fora de linha. No campo dereg, um determinado bit quem
define se o produto est ou no fora de linha, de acordo com a escolha feita editando-se o
MN SACI 035

52

8.2 Seleo de registros do tipo ''bit''


registro no Cadastro de Produtos.
Um campo do tipo bit composto de 16 zeros ou uns, sendo que cada um deles
define uma particularidade para o registro. A identificao deles se d fazendo a leitura da
direita para a esquerda, comeando do zero at o quinze. No caso do produto fora de
linha, o bit responsvel por esta definio o bit 2 (contando da direita para a esquerda,
comeando do zero).
O zero( 0 ) significa '' desligado ou no '' e o um ( 1 ) significa '' ligado ou sim'' .
Abaixo, modelo de um campo do tipo bits do cadastro de produtos ( campo dereg ).
Observe que o segundo bit est ligado ( 1 ), portanto o produto est fora de linha.

0000000000000101
Existem vrias alternativas para a montagem de selects com este tipo de campo,
como nos exemplos abaixo, todos objetivando produtos fora de linha.
Caso o usurio queira especificar apenas 1 dentre os 16 bits basta informar a sua
posio, de 0 a 15, elevando-a ao quadrado. (bit que define se o produto est fora de
linha = 2 -> 22 -> 4 ). Neste exemplo sero listados somente produtos fora de linha.

SELECT
prd.no, prd.name
FROM sqldados.prd
WHERE (prd.dereg & 4)
O mesmo exemplo acima, porm excluindo-se produtos fora de linha.

SELECT
prd.no, prd.name
FROM sqldados.prd
MN SACI 035

53

8.2 Seleo de registros do tipo ''bit''

WHERE NOT (prd.dereg & 4)


Ainda no mesmo exemplo, caso o usurio no queira fazer a conta '' posio do
bit ao quadrado'' , poder fazer uso do recurso pow, como no exemplo abaixo.

SELECT
prd.no, prd.name
FROM sqldados.prd
WHERE NOT (prd.dereg & POW(2, x)) - Onde x
igual a posio do bit
Caso o usurio queira especificar vrios dentre os 16 bits. O underline funciona
como meta-caractere no ''LIKE'' do MySQL. Neste exemplo sero listados somente
produtos que no esto fora de linha.

SELECT
prd.no, prd.name
FROM sqldados.prd
WHERE LPAD(bin(dereg),16,"0") like "_____________0_"
O usurio poder usar o underscore como meta-caractere ao informar o valor da
varivel {Bits} .Neste exemplo tambm est sendo utilizado a seo de variveis, com
definio do valor default e obrigatoriedade do campo (Varivel Bits, tamanho = 16, Valor
default = ________________; Preenchimento Obrigatrio = Sim).

%vars
$Bits = {Bits,16;________________;S}

MN SACI 035

54

8.2 Seleo de registros do tipo ''bit''


%
SELECT
prd.no, prd.name
FROM sqldados.prd
WHERE lpad(bin(dereg),16,"0") like "[Bits,16]"

8.3 Estatsticas de uso de Relatrios


O varejo muito dinmico em suas necessidades. Sendo assim, a elaborao de
relatrios especficos uma tarefa quase que diria.
Com o tempo a tendncia natural que o nmero de relatrios v aumentando,
sendo que muitos deles perdem a funo. Por exemplo, uma determinada campanha de
vendas foi criada, e junto os relatrios especficos de acompanhamento. Quando esta
campanha termina, os relatrios continuam disponveis, porm sem utilizao prtica.
O resultado disto que a visualizao dos relatrios disponveis e sua conseqente
procura se tornam mais lentos, trazendo transtornos para os usurios.
O Administrador do SACI pode ento, atravs do prprio QuerySQL verificar quais
relatrios esto sendo utilizados e por quais usurios, permitindo que aqueles no
utilizados possam ser retirados do editor.
Na tabela sqluser, temos uma relao entre o nmero do relatrio e o nmero do
usurio com acesso a ele. No campo auxShort1 sero acumulados o nmero de vezes
em que o relatrio foi executado pelo usurio correspondente. Assim, o Administrador
poder verificar este nmero atravs de relatrios desenvolvidos pelo prprio QuerySQL.

8.3.1 Passos para implantao deste recurso


A primeira condio que o SACI esteja configurado para utilizar o Controle de
Usurios no QuerySQL. Fica em Configurao Geral do Sistema, Informaes Gerais,
Utiliza Controle de Usurios no QuerySQL . Marque Sim nesta opo.

MN SACI 035

55

8.3 Estatsticas de uso de Relatrios


O controle feito por usurio do SACI, sendo assim, importante que este
controle esteja sendo realizado corretamente no sistema, ou seja, para cada colaborador
da empresa com acesso ao SACI deve existir um usurio correspondente.
Para o usurio nmero 1 - Administrador do Sistema no haver estatstica de
utilizao.
Exemplo de Select para verificar a estatstica de uso de um relatrio. Ao executar,
informe o nmero do relatrio a ser pesquisado.

%vars
$rl = {:s:No Relatrio}
%
SELECT
sqluser.userno AS Cod,
users.name AS Nome,
sqluser.auxShort1 AS Execucoes
FROM
sqldados.sqluser, sqldados.users
WHERE
sqlexeno = [$rl] AND
sqluser.userno = users.no

9. Otimizao de SELECTS
O MySQL possui um otimizador interno. Em alguns casos ele executa a SELECT
de maneira totalmente diferente da que achamos que ele faz.
MN SACI 035

56

9. Otimizao de SELECTS
Uma boa maneira de estudar as opes de otimizao a utilizao do comando
explain. De uma maneira resumida, este comando explica o caminho que o MySQL far
para executar a SELECT.
Sintaxe:
EXPLAIN SELECT ....
Resultados (do melhor para o pior)

Parmetros

Opes/ Descrio

system

Uma nica linha ser lida

const

No mximo 1 linha

eq_ref

Relao 1/1, ideal para JOIN

ref

Muitas linhas podem ser lidas

range

Linhas na faixa selecionada

index

Toda a chave ser lida

ALL

Toda a tabela ser lida


O otimizador do MySQL tentar usar sempre as chaves das tabelas, porm, se

voc j conhece as tabelas e tem exata noo do qu deve ser pesquisado, pode ganhar
algum tempo na execuo dizendo ao MySQL como dever ser a pesquisa, ou quais
chaves devero ser utilizadas.
O uso do comando explain antes do comando SELECT retorna a anlise feita pelo
otimizador MySQL. Exemplos:
EXPLAIN SELECT * FROM xalog2 WHERE date > 0;

MN SACI 035

57

9. Otimizao de SELECTS
Este resultado informa que todas as linhas da tabela esto sendo lidas (type = ALL)
e no existem opes de utilizao de chaves (possible_keys = NULL), isto porque no
existe uma chave date na tabela
EXPLAIN SELECT * FROM xalog2 WHERE storeno > 0;

Neste caso, o otimizador do MySQL est nos informando que, apesar de ler a
tabela toda (type = ALL), seria possvel a leitura partir das chaves primria, i2, i5, i10, i11
e i12 (estas chaves possuem o campo date). A leitura feita na tabela toda porque a
condio informada na clusula WHERE condiciona o nmero da loja seja maior que 0
(zero)
EXPLAIN SELECT * FROM xalog2 WHERE storeno > 2;

Agora o otimizador est utilizando a chave primria da tabela (key = Primary). A


SELECT j est mais rpida e a leitura das linhas feita apenas na faixa selecionada
(type = Range)
EXPLAIN SELECT * FROM xalog2 WHERE storeno = 2;

MN SACI 035

58

9. Otimizao de SELECTS

Esta SELECT est mais otimizada ainda, pois a leitura est sendo feita atravs do
uso da chave i10 (key = i10) e somente quando a chave for igual a 2 (condio WHERE).
Observe o campo type = ref
EXPLAIN SELECT storeno, date, prd.name FROM xalog2 left join prd on
xalog2.prdno = prd.no where storeno = 2;

Nesta SELECT estamos informando ao MySQL que a tabela mestre a xalog2 e


no definimos nenhuma condio para a leitura da tabela prd. A otimizao para a xalog2
est boa (type = ref) e para a prd est muito boa (type = eq_ref), indicando que sero
lidos somente registros com relao na tabela xalog2. Utiliza a chave i10 para a xalog2 e
a chave primria para a prd.
Se esta mesma SELECT fosse executada sem utilizao do LEFT JOIN o resultado
seria o mesmo, porm seria um pouco mais demorada, pois o otimizador do MySQL que
teria o trabalho de fazer a join usando o LEFT
EXPLAIN SELECT storeno, date, prd.name FROM xalog2, prd WHERE
xalog2.prdno = prd.no AND storeno = 1 AND prd.typeno = 1;

MN SACI 035

59

9. Otimizao de SELECTS

Nesta SELECT colocamos uma condio para a tabela prd. Note que o otimizador
utilizou ento a prd como mestre e a leitura ficou do tipo ref para ambas as tabelas.
Experimente agora executar esta mesma SELECT para a loja 2.

EXPLAIN SELECT storeno, date, prd.name FROM xalog2, prd WHERE


xalog2.prdno = prd.no AND storeno = 2 AND prd.typeno = 1;

Observe que o otimizador mudou totalmente a ordem de execuo da SELECT. A


tabela xalog2 foi usada como mestre e a relao com a prd ficou muito otimizada (type =
eq_ref). Isto porque o nmero de registros selecionados da tabela xalog2 menor que o
nmero de registros da tabela prd
EXPLAIN SELECT storeno, date, prd.name FROM xalog2, prd WHERE
xalog2.prdno = prd.no AND storeno IN(1,2) AND prd.typeno =1;

MN SACI 035

60

9. Otimizao de SELECTS
Esta SELECT um exemplo da utilizao do IN. Faa a mesma SELECT porm
para a condio da loja coloque a seguinte sintaxe: ... AND storeno = 1 OR storeno = 2
AND ...
SELECT storeno, prd.name, COUNT(*) AS counter FROM xalog2, prd WHERE
xalog2.prdno = prd.no AND storeno IN(1,2) GROUP BY prdno HAVING counter > 5;
Esta SELECT exemplifica o uso da clusula HAVING. Ela utilizada quando se
quer uma seleo em cima do resultado da SELECT. No exemplo estamos buscando
produtos que tiveram mais de cinco vendas por loja, independente do perodo.
Apesar de no ser uma opo otimizada, em alguns casos seu uso inevitvel

9.1 Resumo
LEFT JOIN sempre mais rpido
A funo IN MUITO otimizada
No use HAVING se voc pode usar WHERE
Simplifique as expresses, sempre que possvel

9.2 Exerccio 9
Monte o relatrio referente a anlise dos exerccios 1 e 3

MN SACI 035

61

10. Anexo - FAQs

10. Anexo - FAQs


O que o QuerySQL?
um Gerador de Relatrios baseado na linguagem SQL.
Para que serve o QuerySQL?
Para permitir que os clientes do SACI for Mysql elaborem relatrios aliando a
velocidade do Mysql com os recursos de formatao do SACI.
Assim como o Query comum, possvel executar o QuerySQL de qualquer
mdulo do SACI?
Sim, basta digitar Ctrl-A para ter acesso aos relatrios gravados e direcionados
para o mdulo em uso.
Assim como o Query comum, possvel executar o QuerySQL de qualquer
mdulo do SACI?
Sim, basta digitar Ctrl-A para ter acesso aos relatrios gravados e direcionados
para o mdulo em uso.
possvel informar um diretrio padro para salvar os arquivos de SELECTS?
Sim, basta inserir a seguinte linha no arquivo .bash_profile do usurio que far as
SELECTS: export SACI_QUERYSQL=/u/saci/sql/ .
O QuerySQL funciona com distribuies SCO Unix? - No, este um recurso
exclusivo para distribuies Linux/MySQL.
O que preciso fazer para definir uma lista de variveis em uma SELECT?
Antes de iniciar a SELECT, faa a insero das variveis desejadas seguinta o
exemplo abaixo: %vars &dataI = {:d:Data Inicial} &dataF = {:d:Data Final} %

MN SACI 035

62

10. Anexo - FAQs


O sistema mostra valores para quantidades e dinheiro com menos casas
decimais. Por qu?
O QuerySQL j trata de maneira diferente os campos com formato de dinheiro ou
quantidade, bastando apenas informar na configurao qual a posio do campo. No
necessrio nenhuma formatao dentro da SELECT.
Quais so os tipos de variveis existentes no QuerySQL?
Existem dois tipos, as variveis do tipo "interface" que so aquelas que o usurio
informa o valor no ato da impresso e a varivel do tipo "contedo", que so valores
trocados automaticamente no ato da impresso do relatrio relativas a datas como por
exemplo a varivel [hoje].
Quando digito Ctrl-A de algum mdulo, o sistema no permite ver a SELECT.
Est correto. A SELECT s pode ser visualizada ou editada atravs do
Gerenciador de QuerySQL.
Qual o executvel do QuerySQL?
o executvel qsql.
O Suporte EAC desenvolveu e me enviou um relatrio do QuerySQL. Como fao
para salv-lo no meu SACI?
Quando esses arquivos partem da EAC, os mesmos se encontram compactados
com 'tar', o que definido pela extenso (.tar). Esse arquivo deve ser copiado para o
diretrio /u/saci/sql e, a partir desse diretrio, devemos descompacta-lo usando o
comando abaixo:-> # tar xvf arquivo.tar <enter> Aps a descompactao, sero criados
dois novos arquivos no diretrio corrente. Um desses arquivos o relatrio propriamente
dito. nele que est gravada a sentena SQL que ir gerar os dados para a listagem. O
nome desse arquivo normalmente se refere ao objetivo geral do relatrio, e o mesmo
possui uma extenso .sql (ex.: um relatrio de produtos normalmente seria enviado como
produtos.sql).O segundo arquivo contm os dados com o layout do relatrio e esse deve

MN SACI 035

63

10. Anexo - FAQs


ser copiado para o banco de dados. Esse arquivo normalmente vai com o nome
layout.sql. Para efetuar a cpia do arquivo para o banco voc dever executar a linha de
comando abaixo ainda dentro do diretrio /u/saci/sql, onde os arquivos foram extrados:->
# mysql sqldados < layout.sql <enter>Feito isso, o relatrio j foi automaticamente
includo na lista do Query SQL e pode ser visualizado pelo Editor de Relatrios SQL.
importante acertar as permisses do arquivo com a sentena SQL antes de tentar
execut-lo. Para isso, como root, execute os comandos abaixo:-> # chmod 664
arquivo.sql <enter>-> # chown eacadm.saciuser arquivo.sql <enter>

MN SACI 035

64

11. Anexo - Respostas dos exerccios propostos

11. Anexo - Respostas dos exerccios propostos


11.1 Exerccio 1
Correo em sala com instrutor

11.2 Exerccio 2
sqldados e sqlpdv
xalog2
MySQL
Cdigo e Descrio
001 - Guitarra Tagima tsb 206

11.3 Exerccio 3
Correo em sala com o instrutor

11.4 Exerccio 4
Inserir e editar SELECTS no QuerySQL

11.5 Desafio
SELECT
no AS Cdigo,
name AS Descrio,
REPLACE(REPLACE(REPLACE(FORMAT(sp/100,2),'.','?'),',','.'),'?',',')
MN SACI 035

65

11.5 Desafio
AS Preco
FROM
sqldados.prd

11.6 Exerccio 5
SELECT
name AS Nome
FROM
sqldados.custp
WHERE
name LIKE "%SILVA%"
SELECT
prd.no AS Codigo,
prd.name AS Descrio,
prd.clno AS 'Centro Lucro'
FROM sqldados.prd
WHERE prd.clno = 010101
SELECT
storeno AS Loja, REPLACE(REPLACE(REPLACE(FORMAT(SUM(ABS(qtty/1000)
* price/100 - discount/100),2

),'.','?'),',','.'),'?',',') AS Venda

FROM
sqldados.xalog2
WHERE
storeno = 1 AND
date BETWEEN 20020101 AND 20020131
GROUP BY
storeno

MN SACI 035

66

11.6 Exerccio 5
SELECT
DATE_FORMAT(issuedate, '%m/%Y') AS Data,
SUM(IF(type = 0, amtdue, NULL)) AS 'Recibo_____',
SUM(IF(type = 1, amtdue, NULL)) AS 'Duplicata__'
FROM
sqldados.dup
WHERE
storeno = 2 AND
dup.issuedate BETWEEN 20010101 AND 20011231 AND
dup.status != 2
GROUP BY
Data

11.7 Exerccio 6
SELECT
xalog2.empno AS cod,
emp.name AS vendedor,
SUM(ABS(qtty/1000) * price) - discount AS venda
FROM
sqldados.xalog2
LEFT JOIN
sqldados.emp ON
xalog2.empno = emp.no
WHERE
xalog2.storeno = 1 AND
xalog2.date BETWEEN 20020101 AND 20021231
GROUP BY
cod

MN SACI 035

67

11.8 Exerccio 7
11.8 Exerccio 7
SELECT
IFNULL(inst.contrno, 'Inconsistencia') AS contrato_loja,
itxa.storeno AS loja_itxa,
itxa.contrno AS contrato_itxa
FROM
sqldados.itxa
LEFT JOIN
sqldados.inst ON
inst.storeno = itxa.storeno AND
inst.contrno = itxa.contrno
WHERE
inst.contrno IS NULL

11.9 Exerccio 8
%
vars$cl = {:cl:Centro Lucro;010101;S}
$lj = {:store:Loja;1;S}
$di = {:d:Data Inicial;20020101;S}
$df = {:d:Data Final;20021231;S}
%
#
SELECT
xalog2.prdno AS prd,
SUM(ABS(qtty/1000) * xalog2.price) - xalog2.discount AS vendas
FROM
sqldados.xalog2
WHERE
xalog2.clno = [$cl] AND
MN SACI 035

68

11.9 Exerccio 8
xalog2.storeno = [$lj] AND
xalog2.date BETWEEN [$di] AND [$df]
GROUP BY
xalog2.prdno
#
#
SELECT
stk.prdno AS prd,
stk.qtty_varejo + stk.qtty_atacado AS estoque
FROM
sqldados.stk
WHERE
stk.storeno = [$lj]
GROUP BY
stk.storeno, stk.prdno
#
SELECT
prd.no AS Codigo,
prd.name AS Descrio,
prd.clno AS "Centro Lucro",
[tabela].vendas AS "Vendas__________",
[tabela2].estoque AS Estoque
FROM
sqldados.prd
LEFT JOIN
[tabela] ON
prd.no = [tabela].prd
LEFT JOIN
[tabela2] ON
prd.no = [tabela2].prd

MN SACI 035

69

11.9 Exerccio 8
WHERE
prd.clno = [$cl]

MN SACI 035

70