Documente Academic
Documente Profesional
Documente Cultură
Windows NT Server , Windows Workstation, Windows 95/98 e SQL Server são marcas
registradas da Microsoft Corporation.
Banco de Dados Oracle é a marca registrada da Oracle Corporation.
Banco de Dados Informix é a marca registrada da Informix Corporation.
Banco de Dados Sybase é a marca registrada da Sybase Corporation.
Banco de Dados UDB é a marca registrada da IBM.
Este material é de efeito didático/suporte e não pode ser reproduzido sem autorização da
MicroSiga.
CopyRight © 2000 Microsiga Software S.A.
Programação SQL com SIGA Advanced / AP5
Índice
1. Introdução ao ambiente Relacional
1.1. Objetivos
1.2. Conceitos Básicos de Banco de Dados
1.3. Conhecendo a estrutura de Armazenamento dos dados
1.3.1. LOG do Banco de dados
1.3.1.1. Controle Transacional
1.3.1.2. Segurança e Backup
1.3.1.3. Construindo Query’s evitando problemas com estouro da Área de
LOG
1.3.2. Área temporária do Banco de Dados
1.4. Normalização de Base de Dados
1.5. MER (Modelo Entidade Relacionamento)
1.6. Diferenças cruciais entre ambientes DBF e SQL
1.6.1. DBF – Trabalha de forma posicional com acesso compartilhado
1.6.2. SQL – Trabalha de forma relacional (Teoria dos conjuntos) e o acesso é de
forma centralizada
2. TopConnect
2.1. Informações gerais
2.2. Controle de tipo de dados ( Tabela TOP_FIELD )
2.3. Opções de Visualizar os Eventos (Mensagens de Erros)
2.4. Sistema de controle de Registros
2.4.1. Portabilidade
2.4.2. Função da coluna R_E_C_N_O_
2.4.2.1. Limite de registros
2.4.2.2. Renumeração da coluna RECNO
2.4.3. Controle dos registros deletados (Coluna D_E_L_E_T_)
2.5. Constraints do Banco de dados que são criados automaticamente
2.5.1. Criação da Estrutura de tabelas
2.5.2. Índices
2.5.3. Defaults
2.5.4. Problemas com conteúdo Nulo
2.6. Manutenção do Banco de dados
2.6.1. Aumentando a performance executando a operação de PACK
2.7. DBFNTX x TopConnect
2.7.1. Índices de produção
2.7.2. Funções em chaves de índices
2.7.3. Índices condicionais
2.7.4. Chaves numéricas compostas
2.7.5. Expressões de filtro com funções e variáveis
2.8. Comandos
2.8.1. APPEND FROM
2.8.2. COPY TO
2.8.3. USE
2.8.4. BEGIN, COMMIT, ROLLBACK TRANSACTION
Programação SQL com SIGA Advanced / AP5
2.9. Funções
2.9.1. TCCANOPEN
2.9.2. TCCONTYPE
2.9.3. TCDELFILE
2.9.4. TCGETDB
2.9.5. TCLINK
2.9.6. TCQUERY
2.9.7. TCQUIT
2.9.8. TCSETCONN
2.9.9. TCSETFIELD
2.9.10. TCSPEXEC
2.9.11. TCSPEXIST
2.9.12. TCSQLERROR
2.9.13. TCSQLEXEC
2.9.14. TCSRVTYPE
2.9.15. TCUNLINK
2.9.16. TCCHKOBJ*
2.9.17. TCEXEERROR*
2.9.18. TCPGMEXE*
2.9.19. TCSYSEXE*
( * )Funções apenas para o TOPConnect rodando em servidores AS/400.
2.10. Performance
2.10.1. Otimizando seu código
2.10.2. Leitura Sequencial
2.10.3. O uso de filtros
2.10.4. Stored Procedures
2.11. Integração com outros aplicativos
2.11.1. Incluindo registros nas tabelas do SigaAdvanced / AP5
2.11.2. Excluindo registros ( Sempre Marcar )
2.11.3. Vantagens e Desvantagens
3. Utilitário importante
3.1. Instalador de Stored Procedures no Banco de Dados
Programação SQL com SIGA Advanced / AP5
Este curso tem como objetivo treinar e aperfeiçoar nossos analistas e parceiros quanto à
confecção de programas específicos, em ambiente de trabalho com Base de Dados SQL
desta forma pretendemos aumentar a facilidade de manuseio dos componentes
envolvidos tanto na análise e detecção de erros, e quais possíveis ações para saná-los,
antes de recorrer ao suporte interno. Demonstraremos também como otimizar programas
através da linguagem SQL em seus RDMAKES e futuras implementações para as
próximas versões.
Todos os tópicos mencionados poderão servir como base de consulta, para escrita de
programas e resolução de problemas.
Os conceitos básicos dos Bancos de Dados relacionais são bem diferenciados dos
conhecidos DBF´s. Estes conceitos básicos são úteis principalmente para saber
responder eventuais perguntas que nossos clientes poderão efetuar sobre nosso
sistema.
SQL quer dizer : Structured Query Language , que foi desenvolvido inicialmente pela
IBM Corporation.
A primeira diferença entre o ambiente SQL e o DBF é o fato de criarmos uma área no
disco (DATABASE) que o próprio banco se encarregara de administrar, no sentido de
criar tabelas, índices, e todos os objetos envolvidos no sistema. A nomenclatura muda
um pouco: ao invés de CAMPOS temos COLUNAS e ao invés de REGISTROS temos
LINHAS.
Uma Trigger funciona como um gatilho, só que este é disparado não a cada campo
alterado, e sim a cada Inclusão, Alteração ou Exclusão de uma linha da tabela. Os
Triggers também são escritos como as Stored Procedures, ou seja, como um
programa qualquer, que pode efetuar qualquer tipo de validação, atualização em
outras tabelas, etc...
Hoje não utilizamos no Siga Advanced nenhuma Trigger. Em alguns casos específicos
em clientes, as mesmas poderão ser utilizadas.
Programação SQL com SIGA Advanced / AP5
Uma Foreign Key ( Chave Estrangeira ) é uma ligação entre tabelas que são criadas
nas mesmas. São estas que garantem que nunca o Cliente “X” será excluído se o
mesmo tiver movimentos ( Pedidos, Notas , Duplicatas Etc. ), também será garantido
que nunca será incluído um Pedido de Vendas do Cliente “Y”, se o mesmo não existir.
Este tratamento é feito diretamente pelo Banco de Dados, não necessitando qualquer
codificação para isto.
O uso de um Banco de Dados SQL se faz necessário pela segurança dos dados e pela
fácil recuperação dos mesmos por vários aplicativos como Siga Advanced / AP5
(TopConnect), Crystal Reports (ODBC), SigaEIS (BDE), Excel, etc.
Para empresas que fazem uma grande utilização de banco de dados normalmente
encontramos um profissional chamado DBA (Data Base Administrator), que tem a
função de administrar o banco de dados, quanto a otimização, configuração, backups e
segurança. Sabemos que na prática isto só funciona para empresas grandes, portanto
temos que saber o mínimo possível de cada banco de dados para podermos identificar
problemas e soluções que se adequam melhor à instalação do cliente.
Programação SQL com SIGA Advanced / AP5
Depois que uma transação é concluída com sucesso, não indica que a mesma
estará sendo transferida para a área real dos dados. Este tramite de
transferência é chamado de CheckPoint , este ponto é configuravél de acordo o
SGDB utilizado. Para bancos de dados de maior escala, o processo de check
point só é realizado após o Backup da área de LOG.
tempo. Em clientes com base de dados pequenas, não utilizamos este tipo de
recurso.
Com a pratica vamos perceber que a normalização é muito boa, mas o seu excesso gera
problemas na programação, portanto temos sempre que fazer o máximo de normalização
mas devemos estar consciente de quanto conseguiremos de vantagem com isto.
Existe casos que a desnormalização é uma das melhores soluções, para facilitar o
desenvolvimento da aplicação ou para ganharmos performance.
A primeira forma normal diz que devemos definir a entidade e seus atributos, e destes
atributos devemos definir um atributo chave de relação.
Neste caso criaremos um campo código que define a sua chave principal de
relacionamento, criaremos o Código. Nunca utilize mais de um coluna agregada com
campo chave.(Este tipo de campo gera vários problemas na programação SQL)
A segunda forma normal diz que devemos subdividir os atributos que ocorrem mais de
que uma vez, em uma outra entidade.(Esta entidade deve ter um campo chave,
atendendo a primeira forma normal).
A terceira forma normal diz que devemos eliminar colunas que são concebidas por
calculo de outras colunas de mesma entidade.
2. TopConnect
Alguns comandos e funções avançadas são disponibilizadas para que seu aplicativo
possa usufruir de todos os benefícios da plataforma cliente servidor, que são
apresentados logo em seguida.
Programação SQL com SIGA Advanced / AP5
Em um banco existem vários tipos de dados (CHAR, VARCHAR, FLOAT, NUMBER, etc.)
porem para existir uma unicidade no código do Topconnect alguns dados são
armazenados de forma diferente da definida na tabela SX3, porem a aplicação recebe o
dado da forma como definido.
A1_FILIAL C 2
A1_COD C 6
A1_LOJA C 2
A1_DESC C 1
A1_EMISSAO C 8
A1_VEND1 C 6
...
Ex.: Tabela TOP_FIELD
Alerta! : Se você for utilizar diretamente o Banco de dados você precisa estar ciente que
um campo numérico é armazenado como um tipo float(MSSQL Server),
Number(Oracle), etc. Por exemplo o valor 40,40 no banco pode estar
armazenado como 40,39999999. Quando formos utilizar query’s você deve
utilizar a função TCSETFIELD para resolver esta situação.(Veja função
TCSETFIELD).
Importante também salientar que qualquer modificação efetuada em arquivo
SX3 diretamente, ou seja, sem utilizar o configurador, você pode Ter problemas
com inconsistência de estrutura da tabela do Banco de Dados e TOP_FIELD
contra o dicionário de dados. Para resolver este problema você deverá remover
os dados da Tabela do Banco de dados, eliminar a tabela e deixa-la criar
novamente e depois importar os dados via APPEND(Utilize SDU/CFG-AP5), ou
você pode ajustar o dicionário de dados manualmente conforme estrutura no
Banco de Dados.
Programação SQL com SIGA Advanced / AP5
Na maioria dos problemas este logo de erros é o ponto principal para descobrir o que
esta acontecendo, entre o Topconnect e o Banco de dados. Você só estará recebendo
mensagens se o link entre o Banco de dados e o Topconnect estiver funcionando.
Esta coluna não possui repetição, ela é sempre preenchida com o valor máximo da
coluna R_E_C_N_O_ + 1 nas próximas inserções. Esta operação é feita pelo
TopConnect , se você utiliza outros produtos que fazem inserção na Base de Dados
do Sigaadvanced / AP5 você deve seguir as orientações do Capítulo Integrações
com outros aplicativos.
Alerta! : Quando você utiliza o comando Set Delet on/off, o TopConnect estará
tratando o dado para você, mas se você utiliza query’s para recuperação de dados
você deverá tratar este coluna (Mais informações sobre o tratamento da coluna
D_E_L_E_T_ será apresentado em exemplos de query’s em RDMAKES.
Programação SQL com SIGA Advanced / AP5
2.5.2. Índices
2.5.3. Defaults
São constraints de validação de campos que não são informados, nos comandos
de inserção e alteração, ou seja, se você não possui os defaults criados o Banco
de Dados estará deixando estes campos com valor nulo. Os defaults são criados
no momento da criação das tabelas.
Alerta!: Se você fizer qualquer operação de transferência via Banco de Dados que
não transfira os Defaults, e logo em seguida você utilizar o sistema , estará
correndo risco de inserir nulos na Base de Dados. Se isto acontecer você poderá
Ter problemas com o TopConnect Server, ele poderá travar ou derrubar conexões
com dados indevidos. A solução neste caso é utilizar o utilitário DEFAULT que
esta disponível no site da Microsiga.
Programação SQL com SIGA Advanced / AP5
Os Bancos de dados possuem o conteúdo nulo para todos os tipo de campos, mas
o nosso sistema não os utiliza, se por ventura qualquer tabela tenha algumas
linhas com alguma coluna com o valor nulo, isto pode provocar problemas que
aparentam ser erro de índice, como ex. Você tem a tabela de pedidos que com os
pedidos 000001,000002 e sua tabela por qualquer motivo não tem os contraints de
defaults na coluna filial, agora você faz a inserção do pedido 0000003 o sistema
irá apresentar um Browse ordenado por pedido da seguinte forma:
Filial Pedido
--------- ------------
Null 000003
000001
000002
Neste exemplo você percebe que o pedido 000003 aparece em primeira ordem,
sendo o índice filial+pedido, ou seja, o valor nulo na tabela ASCII(Binary Order)
aparece antes do caracter espaço em branco.
Este problema muitas vezes causa a impressão que o índice esta com
problemas, por que a tela de Browse do Sigaadvanced / AP5 não apresenta a
coluna filial.
Alerta!: Se você tiver este problema, utilize a operação de Pack do utilitário SDU
na tabela que possui registros excluídos , ou utilize o programa fonte PACK para
fazer esta operação em todas as tabelas.
Function OkProc
Close(oDlg5)
Processa( {|| Execute(RunProc) } )
Return
/*
Funcao ³RunProc
Descrição ³Executa o Processamento
*/
Function RunProc
DbSelectArea("SX2")
NrecnoSX2 := SX2->(Recno())
DbGoTop()
ProcRegua(reccount())
While !Eof()
If Select(SX2->X2_CHAVE) > 0
cQuery := 'SELECT MAX(R_E_C_N_O_) RECNO FROM ' + SX2->X2_ARQUIVO
dbUseArea(.T., "TOPCONN", TCGenQry(,,cQuery), 'CONT', .F., .T.)
nCont := 1
While nCont <= CONT->RECNO
cQuery := "DELETE FROM "+SX2->X2_ARQUIVO
cQuery := cQuery + " WHERE D_E_L_E_T_ = '*'"
cQuery := cQuery + " AND R_E_C_N_O_ between "+Str(nCont)+" AND
"+Str(nCont+1024)
nCont := nCont + 1024
TCSQLEXEC(cQuery)
Enddo
DbSelectArea("CONT")
DbCloseArea()
Endif
DbSelectArea("SX2")
dbSkip()
incproc()
Enddo
return
Programação SQL com SIGA Advanced / AP5
Exemplo:
Em um arquivo com a seguinte estrutura:
Para se criar um índice que ordene o arquivo por CAMPO1 + CAMPO2 deverá o
seguinte comando ser utilizado:
Nos gerenciadores de banco de dados não existe a figura dos índices condicionais.
Para se obter resultados semelhantes aos índices condicionais o TOPConnect
agregou nova funcionalidade ao filtro do SigaAdvanced / AP5.
dbSetOrder(0)
O TOPConnect permite o uso da função OrderBy nos filtros o que reproduz o mesmo
efeito de um índice filtrado.
Os SGDB's não suportam índices que contenham expressões ADVPL onde dois
campos numéricos são somados na chave.
Exemplo:
INDEX ON CPOVAL1 + CPOVAL2 TO ARQIND
Uma vez que o TOPConnect utiliza a arquitetura Cliente/Servidor o servidor não tem
como avaliar o conteúdo de uma variável de memória ou o retorno de uma função do
cliente.
Este filtro contem apenas campos e constantes o que permite que sua avaliação seja
feita no servidor e que apenas os registros que obedeçam ao filtro venha para o
cliente.
Agora este:
SET FILTER TO CODIGO > RetornaCodigo()
Pôr exemplo:
SET FILTER TO ESTADO = 'SP' .AND. SALDO > 10000 .AND. CODIGO >
RetornaCodigo()
Nesta expressão somente virão para o cliente os registros onde os campos ESTADO
e SALDO obedeçam ao filtro e então o campo CODIGO será avaliado no cliente.
Programação SQL com SIGA Advanced / AP5
2.8. Comandos
Neste capítulo mencionaremos apenas os comandos da linguagem ADVPL que tem a sua
funcionalidade alterada ou complementada e os novos comandos implementados pelo
TOPConnect via RDD.
#INCLUDE "TOPCONN.CH"
Exemplo
SELECT CLIENTES
//Importa registros de um DBF
APPEND FROM c:\temp\newcli.dbf
Ou
SELECT CLIENTES
//Importa registros da tabela NEWCLI
APPEND FROM NEWCLI VIA "TOPCONN"
2.8.2. COPY TO
2.8.3. USE
USE [<xcTable>
Exemplo
//Abre a tabela de Clientes em uma nova Work Area
USE clientes SHARED NEW VIA "TOPCONN"
//Adiciona um pedido
Programação SQL com SIGA Advanced / AP5
SELECT PEDIDOS
APPEND BLANK
SELECT ITEMS
APPEND BLANK
.....
APPEND BLANK
.....
COMMIT TRANSACTION
Programação SQL com SIGA Advanced / AP5
2.9. Funções
2.9.1. TCCANOPEN
Exemplo
//Testa a existência da tabela customer
IF !TCCanOpen("CUSTOMER")
dbCreate("CUSTOMER", aStru, "TOPCONN")
ENDIF
USE CUSTOMER SHARED NEW VIA "TOPCONN"
//Testa a existência do índice
IF !TCCanOpen("CUSTOMER","CUSTCOD")
INDEX ON CODIGO TO CUSTCOD
ELSE
SET INDEX TO CUSTCOD
ENDIF
...
2.9.2. TCCONTYPE
TCConType(<cType>)
2.9.3. TCDELFILE
TCDelFile(<cTable>)
2.9.4. TCGETDB
cDataBase := TCGETDB()
2.9.5. TCLINK
nCon := TCLink(<cConectString>,<cServer>)
Exemplo
nCon := TCLink("MSSQL/SIGAADV","TOPSRV")
if nCon < 0 //Conexões com retorno < 0 significam erro
Alert("Falha de conexão com o TOPConnect")
endif
//Protocolo TCP/IP
TCConType("TCPIP")
//Conecta-se ao Oracle – no ambiente TESTES
nCon := TCLink("ORACLE/TESTES",172.16.1.2)
//Protocolo APPC
//Conecta-se ao AS/400 no ambiente PRODUCAO
nCon := TCLink("PRODUCAO","TOP400")
Programação SQL com SIGA Advanced / AP5
2.9.6. TCQUERY
TCQUERY [<cSQLExpr>
[ALIAS <xcAlias>]
[NEW]
VIA "TOPCONN"
Obs: Ao executar uma Query que retorne um ou mais valores calculados, o nome
dos campos da WorkArea serão COLUMN1, COLUMN2... COLUMNn.
Exemplo
2.9.7. TCQUIT
2.9.8. TCSETCONN
Sintaxe
TCSETCONN(<nConn>)
Onde <nConn> é o número da conexão.
Exemplo
// Abre conexão com o ambiente de Produção
nCon1 := TCLink("MSSQL/PRODUCAO")
if nCon1 < 0
Alert("Falha conectando ambiente de Produção")
QUIT
endif
TCSetConn(nCon1)
TCSetConn(nCon2)
2.9.9. TCSETFIELD
Sintaxe
TCSetField(<cAlias>, <cField> ,<cType>, [<Prec.Inteira>,<Prec.Decimal>] )
Exemplo
Programação SQL com SIGA Advanced / AP5
TCSetField("QUERY","DATA","D")
TCSetField("QUERY","VALOR","N",12,2)
2.9.10. TCSPEXEC
Sintaxe
<aRet> := TCSPExec(<cSPName>,[<xParam1>,<xParam2>...<xParamN>])
Exemplo
//Verifica se a Stored Procedure Teste existe no Servidor
If TCSPExist("TESTE")
//Executa a Stored Procedure Teste
aRet := TCSPExec("TESTE","JOSE",1000)
if aRet <> nil
2.9.11. TCSPEXIST
Exemplo
If SPExist("CALCCUSTO")
TCSPExec("CALCCUSTO")
Endif
2.9.12. TCSQLERROR
Sintaxe
<cError> := TCSQLError()
2.9.13. TCSQLEXEC
<nRet> := TCSQLExec(<cCommand>)
2.9.14. TCSRVTYPE
<cType> := TCSrvType()
Onde <cType> é o tipo do servidor podendo Ter seu conteúdo igual a "WinNT" ou
"AS/400".
Exemplo
TCLink("MSSQL/TESTE","TOPSRV")
?TCSrvtype()
2.9.15. TCUNLINK
TCUnlink(<nConn>)
2.9.16. TCCHKOBJ*
<nError> := TCChkObj(<cObj>,<cLibrary>,<cType>)
Onde:
<nError> é 0 quando o objeto existe ou o número do erro no AS/400.
<cLibrary> é o nome da biblioteca que deve conter o objeto.
<cType> é o tipo de objeto AS/400. Ex: *FILE, *PGM, etc.
Exemplo
nError := TCChkObj("CALCCUST","PRODUCAO","*PGM")
ESTA FUNÇÃO SE APLICA APENAS PARA O TOPCONNECT AS/400
2.9.17. TCEXEERROR*
Retorna uma string com a mensagem de erro retornada pela execução das
funções TCPGMEXE() e TCSYSEXE().
Sintaxe
<cError> := TCExeError()
2.9.18. TCPGMEXE*
2.9.19. TCSYSEXE*
TCSysExe( cCommand )
2.10. Performance
2.10.1. Otimizando seu código
O código acima fará com que todas as linhas(registros) da tabela venham para o
Client, o que irá gerar um número de Queries no servidor igual ao número de linhas
da tabela e cada uma delas irá recuperar apenas uma linha, subtilizando a
capacidade de processamento do servidor.
O mesmo não ocorre utilizando o TOPConnect, pois o filtro é avaliado pelo próprio
servidor vindo para a estação apenas os registros que respeitem a condição do
filtro.
Para que um filtro tenha uma boa performance é necessário que a expressão do
filtro corresponda a um índice no servidor, caso contrário, para poder avaliar o filtro
o servidor SQL terá que ler linha a linha da tabela.
As desvantagens deste processo, são que você deve estar ciente de todas
atualizações que são feitas na base de dados no sistema, já que o sistema esta
desta forma vulnerável a problemas inesperados.
3. Ferramenta importante
3.1. Instalador de Stored Procedures no Banco de Dados
Alguns clientes utilizam rotinas como Stored Procedures para agilizar alguns processos
críticos do sistema, para instalação destas Storeds Procedures você devem possuir o
arquivo com o nome de SIGAXXX.SPS, onde o XXX é o tipo de Banco de Dados que o
Cliente estará utilizando ex: SIGASQ7 (MSSQL 7.0), SIGAIFX (INFORMIX), SIGAORA
(ORACLE)
Após a confirmação desta operação todas as Procedures que estiverem disponíveis neste
arquivo serão compiladas para a empresa em questão, se o cliente tiver mais do que uma
empresa e ele deseja instalar as procedures em todas as empresas ele precisa entrar
em cada empresa.