sql protheus

Download SQL Protheus

Post on 30-Oct-2014

239 views

Category:

Documents

15 download

Embed Size (px)

DESCRIPTION

SQL Avançado para Protheus.

TRANSCRIPT

Programao SQL com SIGA Advanced / AP5

Programao SQL (Avanado)

Com SigaAdvanced/ AP5

Banco de Dados Oracle a marca registrada da Oracle Corporation. Banco de Dados MSSQL Server a marca registrada da Microsoft. 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 didtico/suporte e no pode ser reproduzido sem autorizao da MicroSiga.

Programao SQL com SIGA Advanced / AP5 CopyRight 2000 Microsiga Software S.A.

ndice1. Structure Query Language (SQL) 1.1. Introduo 1.2. SELECT 1.3. Clausula WHERE 1.4. INSERT 1.5. UPDATE 1.6. DELETE 1.7. Funes de Agregao 1.7.1. SUM 1.7.2. COUNT 1.7.3. AVG 1.7.4. MAX 1.7.5. MIN 1.7.6. Group By 1.7.7. Clausula HAVING 1.7.8. Clausula DISTINCT 1.8. Funo de String ( SUBSTRING/SUBSTR ) 1.9. ORDER BY 1.10. JOINS 1.10.1. INNER JOIN 1.10.2. LEFT JOIN ou LEFT OUTER JOIN 1.10.3. RIGHT JOIN ou RIGHT OUTER JOIN 1.10.4. FULL JOIN ou FULL OUTER JOIN 1.10.5. CROSS JOIN 1.11. UNIONS 1.12. SUB SELECTS 1.13. TRIGGERS 1.14. STORED PROCEDURES 1.15. CURSORES 2. Programando SQL em RDMAKES 2.1. Querys 2.2. Funo ChangeQuery 2.3. Stored Procedures 2.4. Comandos DDL 2.4.1. Truncate Table 2.4.2. Drop Table

Programao SQL com SIGA Advanced / AP5

3. Structure Query Language (SQL) 3.1. Introduo Neste captulo iremos estudar as sintaxes bsicas da linguagem SQL, mostraremos exemplos e executando exerccios prticos. Voc vai perceber que a linguagem SQL sempre em comandos textos que so enviados ao servidor, este far a compilao e execuo da query. Este processo feito a cada requisio ao servidor. Voc perceber que quanto menos solicitaes melhor a performance obtida. Existem vrios comandos de manipulao do banco de dados como criao de tabela, ndices, constraints, defaults, etc. Neste curso no estaremos comentando estes comandos, pois os mesmos dependem exclusivamente da plataforma e so de responsabilidade e conhecimento de um DBA. Indiretamente estas operaes so executadas pelo TopConnect em comandos TCs. Querendo utilizar uma destas funes, consulte o manual do banco de dados ou procure a orientao de um DBA. Ferramentas de trabalho para os Banco de Dados mais comuns MSSQL Server (isql/w , Query Analyzer), Oracle (WorkSheet) e Informix (SQL Editor) . Estas ferramentas so muito similares a editores de texto, ou seja, voc deve digitar todo o comando, e o mesmo ser submetido imediatamente ao SGDB.

A seguir estaremos apresentando a sintaxe da linguagem SQL.

Programao SQL com SIGA Advanced / AP5 3.2. SELECT Este comando recupera informaes gravadas no banco de dados. A diferena bsica de um select para um programa orientado a registros que em um select voc pode recuperar vrias linhas para uma determinada condio, ao contrrio do programa que teria que efetuar vrios acessos para obter o mesmo resultado. Ex. se voc escrever um programa padro ADVPL voc ter que posicionar o registro, fazer um lao at o final do arquivo, lendo o prximo registro, etc. Veja agora como fazer em linguagem SQL. Sintaxe: SELECT [.] [], n... FROM [], n ... => Informar o nome(s) da(s) coluna(s) da(s) tabela(s) que voc deseja apresentar/manipular em seu aplicativo. Se voc informar o smbolo * (Asterisco) o comando assumir todas as colunas da tabela. => Informar o nome de todas as tabelas associadas ao resultado esperado. Se existirem colunas com mesmo nome em tabelas diferentes, voc dever associar o nome da tabela junto ao nome da coluna (SA1010.A1_NOME). => sinnimo utilizado para referenciar uma tabela correspondente. => Ser o nome da coluna apresentado para sua aplicao como o nome original de resultado da query. Ex. Select simples

SELECT * FROM SA1990 SELECT A1_COD, A1_NOME FROM SA1990 Quando utilizamos * o SGDB estar retornando todas as colunas da tabela, recomendamos sempre informar as colunas que realmente voc estar utilizando, por que, se a tabela possuir muitas colunas o tempo de resposta do seu select pode ser mais demorado. Ex. Select com colunas compostas [ +, -, *, /, (, ) ]

SELECT C6_QTDVEN * C6_PRCVEN VALOR FROM SC6990 Para colunas do tipo numrico podemos fazer qualquer tipo de clculo, lembrando que para o clculo sero considerados os operadores que estiverem dentro de parnteses para depois consideram os externos e assim por diante. Vale a pena lembrar que no banco de dados os campos numricos so do tipo float, portanto no possuem limitao de casas decimais. No momento de utilizar o resultado devemos efetuar o arredondamento dos dados com a funo abaixo: Sintaxe: ROUND(Coluna,Preciso)

Programao SQL com SIGA Advanced / AP5 SELECT round(round(C6_QTDVEN,4)*round(C6_PRCVEN,2),2)VALOR FROM SC6990 Ex. Select com uso de apelido nas colunas

SELECT A1_COD CODIGO, A1_NOME NOME, R_E_C_N_O_ RECNO FROM SA1990 Neste caso percebemos que na frente de cada nome de coluna existe um outro nome referenciando a respectiva tabela que chamamos de apelido. Este nome ser utilizado como referncia na resposta da query. Ex. Select com uso de apelido nas tabelas

SELECT SA1.A1_COD, SA1.A1_NOME FROM SA1990 SA1 SELECT SA1.A1_COD CODIGO, SA1.A1_NOME NOME, SC5.C5_NUM NUM FROM SA1990 SA1, SC5990 SC5 Agora temos um exemplo de utilizao de mais de uma tabela, para referenciarmos a vrios campos Ex. Select com uso de mltiplas tabelas com seleo de todas as colunas de uma tabela, e apenas algumas de outra tabela SELECT SA1.*, SC5.C5_NUM NUM FROM SA1990 SA1, SC5990 SC5 Ex. Select com concatenao de colunas

SELECT A1_COD + A1_LOJA CODIGO FROM SA1990 Obs: Para Banco de dados Oracle e Informix utilize dois pipes | no lugar de +. 3.3. Clausula WHERE Esta clausula uma das mais importantes do comando SELECT, pois a partir dela que filtramos os dados da query. O filtro que estaremos informando muito parecido com a que utilizamos em uma funo indregua(), em ADVPL. Sintaxe: SELECT [.] [], n... FROM [], n ... WHERE - informar uma expresso lgica que estar eliminando as linhas que estiverem dentro do contexto informado. Dentro da condio de filtro voc pode utilizar os seguintes operadores :

Programao SQL com SIGA Advanced / AP5 = > < >= AND OR BETWEEN (igualdade) (maior que) (menor que) (maior que ou igual a) (menor que ou igual a) (diferente) (diferente) (no SQL-92 padro). (No menor a) (no SQL-92 padro). (No maior a) (no SQL-92 padro). Verdadeiro se ambas expresses forem verdadeiras Verdadeiro se qualquer expresso for verdadeira Verdadeiro se a expresso esta dentro de um determinado intervalo EXISTS Verdadeiro se uma subquery contm alguma linha IN Verdadeiro se o operando igual a uma das expresses da lista NOT Inverte o valor de qualquer outra expresso boleana LIKE ([ _ ],%) Verdadeiro se a expresso fixa for encontrada. Ex. Select utilizando alguns dos operadores * SE1990 E1_FILIAL = '01' E1_CLIENTE BETWEEN ' ' AND 'zzzzzz' E1_LOJA BETWEEN ' ' AND 'zz' E1_PREFIXO LIKE 'P%' E1_NUM BETWEEN ' ' AND 'zzzzzz' E1_VENCREA BETWEEN '20000225' AND '20001231' E1_EMISSAO 1

SELECT FROM WHERE GROUP HAVING

Este exemplo faz a contagem do nmero de ocorrncias de cdigo e loja em duplicidade. A clausula having elimina as ocorrncias no duplicadas, ou seja count(*) (dbStruct()), ni Local nTotsRec := SE1->(RecCount()) // // Ponto de entrada para Filtrar os tipos sem entrar na tela do // FINRTIPOS(), localizacao Argentina. //Jose Lucas, Localizaes Argentina IF EXISTBLOCK("F130FILT") cTipos := EXECBLOCK("F130FILT",.f.,.f.) ENDIF nOrdem:=aReturn[8] cMoeda:=Str(mv_par15,1) PRIVATE dBaixa := dDataBase PRIVATE cFilDe,cFilAte // // Vari veis utilizadas para Impresso do Cabealho e Rodap // cbtxt := "* indica titulo provisorio, P Indica Saldo Parcial" cbcont := 1 li := 80 m_pag := 1 // // POR MAIS ESTRANHO QUE PAREA, ESTA FUNCAO DEVE SER CHAMADA AQUI! // // A funo SomaAbat reabre o SE1 com outro nome pela ChkFile para // efeito de performance. Se o alias auxiliar para a SumAbat() no // estiver aberto antes da IndRegua, ocorre Erro de & na ChkFile, // pois o Filtro do SE1 uptrapassa 255 Caracteres. // SomaAbat("","","","R") // // Atribui valores as variaveis ref a filiais // If mv_par21 == 2 cFilDe := cFilAnt cFilAte:= cFilAnt ELSE cFilDe := mv_par22 // Todas as filiais cFilAte:= mv_par23

Programao SQL com SIGA Advanced / AP5Endif dbSelectArea("SM0") dbSeek(cEmpAnt+cFilDe,.T.) While !Eof() .and. M0_CODIGO == cEmpAnt .and. M0_CODFIL M0_CODFIL Set Softseek On If mv_par19 == 1 titulo := titulo + OemToAnsi(STR0026) //" - Analitico" Else titulo := titulo + OemToAnsi(STR0027) //" - Sintetico" cabec1 := OemToAnsi(STR0044) //" Titulos Vencidos | Titulos a Vencer | Vlr.juros ou (Vencidos+Vencer)" cabec2 := OemToAnsi(STR0045) //" Nominal Valor Corrigido | Valor Nominal | permanencia " EndIf #IFDEF TOP if TcSrvType() != "AS/400" cQuery := "SELECT * " cQuery += " FROM "+ RetSqlName("SE1") cQuery += " WHERE E1_FILIAL Between '" + cFilDe + "' AND '"+ cFilAte + "'" cQuery += " AND D_E_L_E_T_ '*' " endif #ENDIF IF nOrdem = 1 cChaveSe1 := "E1_FILIAL+E1_NOMCLI+E1_CLIENTE+E1_LOJA+E1_PREFIXO+E1_NUM+E1_PARCELA+E1_TIPO" #IFDEF TOP if TcSrvType() == "AS/400" cIndexSe1 := CriaTrab(nil,.f.) IndRegua("SE1",cIndexSe1,cChaveSe1,,Fr130IndR(),"Selecionando Registros...") nIndexSE1 := RetIndex("SE1") dbSetOrder(nIndexSe1+1) dbSeek(xFilial("SE1")) else cOrder := SqlOrder(cChaveSe1) endif #ELSE cIndexSe1 := CriaTrab(nil,.f.) IndRegua("SE1",cIndexSe1,cChaveSe1,,Fr130IndR(),"Selecionando Registros...") nIndexSE1 := RetIndex("SE1") dbSetIndex(cIndexSe1+OrdBagExt()) dbSetOrder(nIndexSe1+1) dbSeek(xFilial("SE1")) #ENDIF cCond1 := "E1_CLIENTE = '"+ MV_PAR01 +"' AND E2_NATUREZ = '"+DTOS(mv_par03)+"' AND E2_VENCREA = '"+mv_par07+"' And E2_FORNECE = '"+DTOS(mv_par09)+"' AND E2_EMISSAO