Escolar Documentos
Profissional Documentos
Cultura Documentos
Programao SQL Avancado
Programao SQL Avancado
Este material é de efeito didático/suporte e não pode ser reproduzido sem autorização da
MicroSiga.
Programação SQL com SIGA Advanced / AP5
Índice
1. Structure Query Language (SQL)
1.1. Introdução
1.2. SELECT
1.3. Clausula WHERE
1.4. INSERT
1.5. UPDATE
1.6. DELETE
1.7. Funções de Agregação
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. Função 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
Você vai perceber que a linguagem SQL é sempre em comandos textos que são
enviados ao servidor, este fará a compilação e execução da query. Este processo é feito a
cada requisição ao servidor. Você perceberá que quanto menos solicitações, melhor a
performance obtida.
Ferramentas de trabalho para os Banco de Dados mais comuns MSSQL Server (isql/w ,
Query Analyzer), Oracle (WorkSheet) e Informix (SQL Editor) . Estas ferramentas são
muito similares a editores de texto, ou seja, você deve digitar todo o comando, e o mesmo
será submetido imediatamente ao SGDB.
3.2. SELECT
Sintaxe:
<Nome da Coluna> => Informar o nome(s) da(s) coluna(s) da(s) tabela(s) que você
deseja apresentar/manipular em seu aplicativo. Se você informar o símbolo ‘*’ (Asterisco)
o comando assumirá todas as colunas da tabela.
<Nome de Retorno> => Será o nome da coluna apresentado para sua aplicação como o
nome original de resultado da query.
SELECT *
FROM SA1990
Para colunas do tipo numérico podemos fazer qualquer tipo de cálculo, lembrando
que para o cálculo seräo considerados os operadores que estiverem dentro de
parênteses para depois consideram os externos e assim por diante.
Vale a pena lembrar que no banco de dados os campos numéricos säo do tipo
float, portanto näo possuem limitaçäo de casas decimais. No momento de utilizar o
resultado devemos efetuar o arredondamento dos dados com a funçäo abaixo:
Sintaxe: ROUND(Coluna,Precisão)
Programação SQL com SIGA Advanced / AP5
SELECT round(round(C6_QTDVEN,4)*round(C6_PRCVEN,2),2)VALOR
FROM SC6990
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 referência na resposta da query.
Ex. Select com uso de múltiplas tabelas com seleção de todas as colunas
de uma tabela, e apenas algumas de outra tabela
Obs: Para Banco de dados Oracle e Informix utilize dois pipes ‘|’ no lugar de ‘+’.
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 função indregua(), em ADVPL.
Sintaxe:
<Condição de filtro> - informar uma expressão lógica que estará eliminando as linhas que
estiverem dentro do contexto informado.
Dentro da condição de filtro você pode utilizar os seguintes operadores :
Programação SQL com SIGA Advanced / AP5
= (igualdade)
> (maior que)
< (menor que)
>= (maior que ou igual a)
<= (menor que ou igual a)
<> (diferente)
!= (diferente) (não é SQL-92 padrão).
!< (Não menor a) (não é SQL-92 padrão).
!> (Não maior a) (não é SQL-92 padrão).
AND Verdadeiro se ambas expressões forem verdadeiras
OR Verdadeiro se qualquer expressão for verdadeira
BETWEEN Verdadeiro se a expressão esta dentro de um
determinado intervalo
EXISTS Verdadeiro se uma subquery contém alguma linha
IN Verdadeiro se o operando é igual a uma das
expressões da lista
NOT Inverte o valor de qualquer outra expressão boleana
LIKE ([ _ ],%) Verdadeiro se a expressão fixa for encontrada.
SELECT *
FROM SE1990
WHERE E1_FILIAL = '01'
AND E1_CLIENTE BETWEEN ' ' AND 'zzzzzz'
AND E1_LOJA BETWEEN ' ' AND 'zz'
AND E1_PREFIXO LIKE 'P%'
AND E1_NUM BETWEEN ' ' AND 'zzzzzz'
AND E1_VENCREA BETWEEN '20000225' AND '20001231'
AND E1_EMISSAO <= '20001231'
AND E1_TIPO IN ('DP ','NF ','AB-','NCC','NCD')
AND NOT E1_EMISSAO = '20000401'
AND D_E_L_E_T_ <> '*'
3.4. INSERT
Este comando insere uma linha em uma tabela ou visão. A inserção feita pelo
SigaAdvanced/AP5 se utiliza deste comando. Em um programa ADVPL não é necessário a
utilização deste comando, pois o TopConnect efetua uma série de controles na operação.
Sintaxe:
Nota: Recomendamos sempre informar o nome das colunas que estarão sendo inseridas,
pois se optar pela omissão dos nomes, os valores deverão ser informados na ordem de
criação da tabela.
Programação SQL com SIGA Advanced / AP5
3.5. UPDATE
Comando para fazer alterações nas informações gravadas. Estas alterações podem ser
processadas linha a linha ou em bloco, de acordo com a condição de filtro informada.
Sintaxe:
Lembre-se que o comando update faz controle transacional implícito, ou seja, enquanto o
comando não for executado até o seu final com sucesso o dado não estará confirmado
(Commit). Para a execução do comando o banco utilizará área de log, portanto se formos
executar um update cujo filtro atinja toda a tabela, será necessário espaço suficiente para
alocar a transação na área de log.
Neste exemplo será alterado apenas as linhas que tenham Recno igual a 10,
como o recno é chave única da tabela apenas um registro será alterado.
Neste caso a alteração será feita em todas as linhas que possuem a coluna
A4_COD = '000001' e a coluna D_E_L_E_T_ diferente de '*'.
Alerta: Nunca execute um comando update sem um condicional, desta forma você estará
alterando todos as linhas da tabela e também estará correndo o risco de estourar a área
de log do Banco de Dados. (Utilize ferramentas como SDU ou Configurador)
Programação SQL com SIGA Advanced / AP5
3.6. DELETE
Sintaxe:
Lembre-se que o comando delete faz controle transacional implícito, ou seja, enquanto o
comando não for executado até o seu final com sucesso o dado não estará confirmado
(Commit). Para a execução do comando o banco utilizará área de log, portanto se formos
executar um delete cujo filtro atinja toda a tabela, será necessário espaço suficiente para
alocar a transação na área de log.
DELETE SA4990
WHERE R_E_C_N_O_ = 10
Neste exemplo será excluído apenas as linhas que tenham Recno igual a 10,
como o recno é chave única da tabela apenas um registro será alterado.
DELETE SA4990
WHERE A4_COD = '000001'
AND D_E_L_E_T_ = '*'
Neste caso a exclusão será feita em todas as linhas que possuem a coluna
A4_COD = '000001' e a coluna D_E_L_E_T_ igual a '*'.
Note: Em alguns Bancos de Dados você pode utilizar o comando TRUNCATE TABLE,
que estará fazendo o mesmo que um comando ZAP em ADVPL. Só que esta operação é
extremamente rápida, para conhecedores de Cobol, esta operaçào é conhecida como
OPEN OUTPUT. Atenção depois desta operação não existe mais como recuperar as
linhas da tabela. (Esta operação não utiliza LOG).
Alerta: Nunca execute um comando delete sem um condicional, desta forma você estará
excluindo todos as linhas da tabela e também estará correndo o risco de estourar a área
de log do Banco de Dados.
Programação SQL com SIGA Advanced / AP5
3.7.1. SUM
SELECT SUM(A1_SALDUP)
FROM SA1990
WHERE D_E_L_E_T_ <> ‘*’
Este exemplo retorna o saldo total dos títulos em aberto eliminando os registros
excluídos da base de dados.
3.7.2. COUNT
Esta função totaliza o número de linhas na tabela, utlizando filtro para tal. Se for
informado o nome de uma coluna, a função contará apenas as linhas que não
estiverem com seu conteúdo nulo..
SELECT COUNT(*)
FROM SA1990
WHERE D_E_L_E_T_ <> ‘*’
SELECT COUNT(A1_FILIAL)
FROM SA1990
WHERE D_E_L_E_T_ <> ‘*’
Este exemplo retorna o total de linhas não excluídas. Se houver conteúdo nulo
em alguma linha, esta não será contada.
Programação SQL com SIGA Advanced / AP5
3.7.3. AVG
Esta função retorna a média aritmética da coluna informada, filtrando as linhas pela
clausula where ou having.
SELECT AVG(A1_SALDUP)
FROM SA1990
WHERE D_E_L_E_T_ <> ‘*’
3.7.4. MAX
SELECT MAX(R_E_C_N_O_)
FROM SA1990
Este exemplo retornará o maior valor da coluna, o mesmo é muito usado para
se saber qual a próxima seqüência disponível. Nunca despreze as linhas
excluídas, por que este número é sequencial e único na tabela.
3.7.5. MIN
SELECT MIN(C6_EMISSAO)
FROM SC6990
WHERE C6_CLI = ‘ 123456’
AND D_E_L_E_T_ <> ‘*’
3.7.6. GROUP BY
Ex. Select para obter valor total de pedidos por cliente e data
3.7.7. HAVING
Esta cláusula tem por finalidade filtrar os dados que estão numa condição de
agrupamento. Apesar de ser uma cláusula de filtro (semelhante à cláusula where),
ela é dependente da cláusula group by.
3.7.8. DISTINCT
Ex. Select para obter código das filiais com linhas existentes (válido para
tabela com X2_MODO = ‘E’)
Esta função é idêntica a função SUBSTR usada em ADVPL, e pode ser utilizada em
qualquer ponto do select onde informamos uma coluna.
3.9. ORDER BY
Esta cláusula ordena o resultado do select independente do índice utilizado para acessar
o dado. O resultado pode ser ordenado de forma crescente(ASC) ou decrescente (DESC).
Um detalhe importante para performance do comando é tentar utilizar na cláusua ORDER
BY as mesmas colunas que compõe um índice já existente no banco de dados, caso
contrário o banco terá que ordernar os dados na área temporária (TempDB) o que pode
prejudicar a performance do comando.
Sintaxe :
SELECT …
FROM …
ORDER BY <Coluna1> [ASC|DESC],…,<Coluna16> [ASC|DESC]
SELECT A1_NOME
FROM SA1990
WHERE D_E_L_E_T_ <> ‘*’
ORDER BY A1_NOME DESC
Ex. Select para apresentar os cliente por ordem de código e loja de forma
crescente.
Note que neste exemplo não é necessário informar a expressão ASC, para
obter o resultado de forma crescente.
Nota : Em alguns casos de query´s você irá perceber que o resultado já estará
apresentando as linhas por uma certa ordenação, isto que dizer que o banco
de dados utilizou um índice para resolver o problema, mas isto não indica que
sempre o dado será retornado nesta ordem, portanto se você precisar que o
dados retornados estejam ordenados você dever sempre informa o ORDER
BY.
3.10. JOINS
Esta operação é uma das mais poderosas expressões de um comando select, pois com
ela podemos relacionar tabelas obtendo informações cruzadas. Este comando pode ser
escrito de duas formas, porém alguns bancos suportam apenas uma delas. Estaremos
apresentando esta forma e comentaremos suas diferenças.
Como recomendação devemos sempre tentar relacionar no máximo quatro tabelas, lógico
que existe exceções, mas sempre que houver o relacionamento de muitas tabelas o
banco de dados precisará de mais tempo para conseguir resolver o problema e em alguns
casos não será viável. Existem várias situações que dependem de experiência e teste
para conseguirmos chegar na melhor solução possível.
Sempre que utilizarmos joins devemos sempre informar todas as tabelas que serão
relacionadas na clausula from e todos os seus relacionamentos na clausula where se por
acaso não for feito o relacionamento de uma destas tabelas o banco de dados estará
fazendo um produto cartesiano (CROSS JOIN) entre todas as linhas da tabela que não foi
relacionado com as demais tabelas.Se isto acontecer o servidor poderá ter sérios
problemas de uso excessivo de CPU.
O resultado de um left join inclui todas as linhas da tabela que foi específica a
esquerda da clausula LEFT OUTER , ou seja, independente de existir ou não um
dado relacionado na tabela informada mais a direita da tabela todas as linhas
referentes a tabela da esquerda serão retornadas. Nas linhas que não existe uma
linha de relação com a tabela há direita os campos desta tabela serão retornados
com valor nulo.
O símbolo (*=) representa um LEFT JOIN para o MSSQL Server, Sybase, o campo
indicado do lado do símbolo (*) será o da tabela que você deseja, que todas as
linhas sejam retornadas independentes da existência do dado da coluna mais a
direita, vamos ver exemplos de query’s para estes Bancos de Dados.
Nota: Não é possível fazer outer joins subsequentes, ou seja, se você fizer
outer join de uma tabela que logo em seguida tem um relacionamento com
outra tabela.
O resultado de um Right join inclui todas as linhas da tabela que foi específica a
direita da clausula RIGHT OUTER , ou seja, independente de existir ou não um
dado relacionado na tabela informada mais a esquerda da tabela todas as linhas
referentes a tabela da direita serão retornadas. Nas linhas que não existe uma
linha de relação com a tabela a direita os campos desta tabela serão retornados
com valor nulo.
Ex. Select para retornar todos os clientes mesmo que não exista pedidos
relacionados
Ex. Select para retornar todos os clientes mesmo que não exista pedidos
relacionados
Ex. Select para retornar todos os clientes mesmo que não exista pedidos
relacionados
Nota: Não é possível fazer outer joins subsequentes, ou seja, se você fizer outer
join de uma tabela que logo em seguida tem um relacionamento com outra tabela.
Um full outer join é o resultado de um inner join + right join + left join , desta forma
você terá o resultado com todas as linhas da primeira tabela mais o resultado com
todas as linhas da Segunda tabela e apresentará em mesma linha os itens que
forem possíveis de relacionamento.
Ex. Select para retornar todos os clientes e todos os pedidos mesmo que
não exista pedidos ou clientes relacionados
Nota: Nos demais Bancos de Dados não existem este tipo de join. Mas existem
outras formar de resolver este problema utilizando inner join + left join + right join +
unions , iremos ver a seguir como utilizar o union desta forma teremos a solução
também para os demais bancos de dados, e até mesmo os que tem a opção.
Ex. Select para retornar todos os clientes e todos os pedidos mesmo que
não exista pedidos ou clientes relacionados
Programação SQL com SIGA Advanced / AP5
3.11. UNIONS
A expressão UNION permite você combinar o resultado de dois ou mais SELECTs
em um único resultado. Uma das restrições para combinar o uso de UNION é que
devemos ter uma estrutura única em cada um dos SELECTs, ou seja, os mesmos
devem ter o mesmo número de colunas devem ter tipos de dados compatíveis.
Sub-Selects é utilizado na clausula where onde pode ser utilizado para fazer relação de
verificação de um determinado dado da tabela original com várias linhas de uma outra
tabela sem obrigatoriamente ser parte integrante de um join.
Ex. Select para retornar todos os clientes que compraram o produto ‘x’,
utilizando operador IN
Ex. Select para retornar todos os clientes que compraram o produto ‘x’,
utiliando operador EXISTS
3.13. TRIGGERS
Triggers são gatilhos do Banco de Dados, os quais são acionados por uma inclusão,
alteração ou exclusão de uma linha em uma determinada tabela. Cada Banco de Dados
trata as triggers de uma forma, hoje o SigaAdvanced/AP5 não utiliza estas triggers. As
triggers podem ser utilizadas pelos clientes, considerando o seguinte problema: Se houver
qualquer alteração na estrutura de uma tabela o sistema irá reconstruir a tabela mas com
sua nova estrutura, índices, defaults, ..., mas não irá recriar os triggers criados
associados a estas tabelas.
Programação SQL com SIGA Advanced / AP5
A Microsiga utiliza várias Storeds Procedures em processos críticos para clientes com
Base de Dados muito grande, em clientes pequenos este processo não se faz
necessário, além de que clientes menores utilizam servidores menores que nem sempre
tem capacidade suficiente para executar SP’s.
Como cada Banco de Dados possui Stored Procedures diferentes a Microsiga criou o seu
compilador que chamamos SQLParser e adotamos um dialeto único e um único fonte o
qual é convertido para cada tipo de Banco de Dados, evitando desta forma divergência
entre programas fontes.
3.15. CURSORES
Cursores são definições de conjunto de dados que serão manipulados linha a linha, ou
seja, da mesma forma que estamos acostumados a fazer uma linguagem posicional onde
os registros são tratados um a um.
Agora vamos ver um exemplo prático utilizando query diretamente no Banco de Dados
//³Funcao ³ FA130Imp
//³Descricao ³ Imprime relatorio dos Titulos a Receber
//³Sintaxe e ³ FA130Imp(lEnd,WnRel,cString)
Static Function FA130Imp(lEnd,WnRel,cString)
Local CbCont
Local CbTxt
Local limite := 220
Local nOrdem
Local lContinua := .T.
Local cCond1,cCond2,cCarAnt
Local nTit0:=0
Local nTit1:=0
Local nTit2:=0
Local nTit3:=0
Local nTit4:=0
Local nTit5:=0
Local nTotJ:=0
Local nTot0:=0
Local nTot1:=0
Local nTot2:=0
Local nTot3:=0
Local nTot4:=0
Local nTotTit:=0
Local nTotJur:=0
Local nTotFil0:=0
Local nTotFil1:=0
Programação SQL com SIGA Advanced / AP5
Local nTotFil2:=0
Local nTotFil3:=0
Local nTotFil4:=0
Local nTotFilTit:=0
Local nTotFilJ:=0
Local aCampos:={}
Local aTam:={}
Local nAtraso:=0
Local nTotAbat:=0
Local nSaldo:=0
Local dDataReaj
Local dDataAnt := dDataBase
Local lQuebra
Local nMesTit0 := 0
Local nMesTit1 := 0
Local nMesTit2 := 0
Local nMesTit3 := 0
Local nMesTit4 := 0
Local nMesTTit := 0
Local nMesTitj := 0
Local cIndexSe1
Local cChaveSe1
Local nIndexSE1
Local dDtContab
Local cTipos := ""
Local aStru := SE1->(dbStruct()), ni
Local nTotsRec := SE1->(RecCount())
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Ponto de entrada para Filtrar os tipos sem entrar na tela do ³
//³ FINRTIPOS(), localizacao Argentina. ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄJose Lucas, Localiza‡”es ArgentinaÄÙ
IF EXISTBLOCK("F130FILT")
cTipos := EXECBLOCK("F130FILT",.f.,.f.)
ENDIF
nOrdem:=aReturn[8]
cMoeda:=Str(mv_par15,1)
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Vari veis utilizadas para Impress„o do Cabe‡alho e Rodap‚ ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
cbtxt := "* indica titulo provisorio, P Indica Saldo Parcial"
cbcont := 1
li := 80
m_pag := 1
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ POR MAIS ESTRANHO QUE PARE€A, ESTA FUNCAO DEVE SER CHAMADA AQUI! ³
//³ ³
//³ A fun‡„o SomaAbat reabre o SE1 com outro nome pela ChkFile para ³
//³ efeito de performance. Se o alias auxiliar para a SumAbat() n„o ³
//³ 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
Programação SQL com SIGA Advanced / AP5
Endif
dbSelectArea("SM0")
dbSeek(cEmpAnt+cFilDe,.T.)
dbSelectArea("SE1")
cFilAnt := SM0->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) //" | Valor
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_par02"
cCond2 := "E1_CLIENTE + E1_LOJA"
titulo := titulo + OemToAnsi(STR0017) //" - Por Cliente"
Elseif nOrdem = 2
SE1->(dbSetOrder(1))
#IFNDEF TOP
dbSeek(cFilial+mv_par03+mv_par05)
#ELSE
if TcSrvType() == "AS/400"
dbSeek(cFilial+mv_par03+mv_par05)
else
cOrder := SqlOrder(IndexKey())
endif
#ENDIF
cCond1 := "E1_NUM <= mv_par06"
cCond2 := "E1_NUM"
titulo := titulo + OemToAnsi(STR0018) //" - Por Numero"
Elseif nOrdem = 3
Programação SQL com SIGA Advanced / AP5
SE1->(dbSetOrder(4))
#IFNDEF TOP
dbSeek(cFilial+mv_par07)
#ELSE
if TcSrvType() == "AS/400"
dbSeek(cFilial+mv_par07)
else
cOrder := SqlOrder(IndexKey())
endif
#ENDIF
cCond1 := "E1_PORTADO <= mv_par08"
cCond2 := "E1_PORTADO"
titulo := titulo + OemToAnsi(STR0019) //" - Por Banco"
Elseif nOrdem = 4
SE1->(dbSetOrder(7))
#IFNDEF TOP
dbSeek(cFilial+DTOS(mv_par09))
#ELSE
if TcSrvType() == "AS/400"
dbSeek(cFilial+DTOS(mv_par09))
else
cOrder := SqlOrder(IndexKey())
endif
#ENDIF
cCond1 := "E1_VENCREA <= mv_par10"
cCond2 := "E1_VENCREA"
titulo := titulo + OemToAnsi(STR0020) //" - Por Data de Vencimento"
Elseif nOrdem = 5
SE1->(dbSetOrder(3))
#IFNDEF TOP
dbSeek(cFilial+mv_par11)
#ELSE
if TcSrvType() == "AS/400"
dbSeek(cFilial+mv_par11)
else
cOrder := SqlOrder(IndexKey())
endif
#ENDIF
cCond1 := "E1_NATUREZ <= mv_par12"
cCond2 := "E1_NATUREZ"
titulo := titulo + OemToAnsi(STR0021) //" - Por Natureza"
Elseif nOrdem = 6
SE1->(dbSetOrder(6))
#IFNDEF TOP
dbSeek( cFilial+DTOS(mv_par13))
#ELSE
if TcSrvType() == "AS/400"
dbSeek( cFilial+DTOS(mv_par13))
else
cOrder := SqlOrder(IndexKey())
endif
#ENDIF
cCond1 := "E1_EMISSAO <= mv_par14"
cCond2 := "E1_EMISSAO"
titulo := titulo + OemToAnsi(STR0042) //" - Por Emissao"
Elseif nOrdem == 7
cChaveSe1 := "E1_FILIAL+DTOS(E1_VENCREA)
+E1_PORTADO+E1_PREFIXO+E1_NUM+E1_PARCELA+E1_TIPO"
#IFNDEF TOP
cIndexSe1 := CriaTrab(nil,.f.)
IndRegua("SE1",cIndexSe1,cChaveSe1,,Fr130Ind7(),"Selecionando Registros...")
nIndexSE1 := RetIndex("SE1")
dbSetIndex(cIndexSe1+OrdBagExt())
dbSetOrder(nIndexSe1+1)
dbSeek(xFilial("SE1"))
#ELSE
if TcSrvType() == "AS/400"
cIndexSe1 := CriaTrab(nil,.f.)
IndRegua("SE1",cIndexSe1,cChaveSe1,,Fr130Ind7(),"Selecionando Registros...")
nIndexSE1 := RetIndex("SE1")
Programação SQL com SIGA Advanced / AP5
dbSetOrder(nIndexSe1+1)
dbSeek(xFilial("SE1"))
else
cOrder := SqlOrder(cChaveSe1)
endif
#ENDIF
cCond1 := "E1_VENCREA <= mv_par10"
cCond2 := "DtoS(E1_VENCREA)+E1_PORTADO"
titulo := titulo + OemToAnsi(STR0023) //" - Por Vencto/Banco"
Elseif nOrdem = 8
SE1->(dbSetOrder(2))
#IFNDEF TOP
dbSeek(cFilial+mv_par01,.T.)
#ELSE
if TcSrvType() == "AS/400"
dbSeek(cFilial+mv_par01,.T.)
else
cOrder := SqlOrder(IndexKey())
endif
#ENDIF
cCond1 := "E1_CLIENTE <= mv_par02"
cCond2 := "E1_CLIENTE"
titulo := titulo + OemToAnsi(STR0024) //" - Por Cod.Cliente"
Elseif nOrdem = 9
cChave :=
"E1_FILIAL+E1_PORTADO+E1_SITUACA+E1_NOMCLI+E1_PREFIXO+E1_NUM+E1_PARCELA+E1_TIPO"
#IFNDEF TOP
dbSelectArea("SE1")
cIndex := CriaTrab(nil,.f.)
IndRegua("SE1",cIndex,cChave,,fr130cheq(),"Selecionando Registros...")
nIndex := RetIndex("SE1")
dbSetIndex(cIndex+OrdBagExt())
dbSetOrder(nIndex+1)
dbSeek(xFilial("SE1"))
#ELSE
if TcSrvType() == "AS/400"
dbSelectArea("SE1")
cIndex := CriaTrab(nil,.f.)
IndRegua("SE1",cIndex,cChave,,fr130cheq(),"Selecionando Registros...")
nIndex := RetIndex("SE1")
dbSetOrder(nIndex+1)
dbSeek(xFilial("SE1"))
else
cOrder := SqlOrder(cChave)
endif
#ENDIF
cCond1 := "E1_PORTADO <= mv_par08"
cCond2 := "E1_PORTADO+E1_SITUACA"
titulo := titulo + OemToAnsi(STR0025) //" - Por Banco e Situacao"
Endif
If mv_par19 == 1
titulo := titulo + OemToAnsi(STR0026) //" - Analitico"
Else
titulo := titulo + OemToAnsi(STR0027) //" - Sintetico"
cabec1 := OemToAnsi(STR0044) //"Nome do Cliente |
Titulos Vencidos | Titulos a Vencer | Vlr.juros ou (Vencidos+Vencer)"
cabec2 := OemToAnsi(STR0045) //" | Valor
Nominal Valor Corrigido | Valor Nominal | permanencia "
EndIf
cFilterUser:=aReturn[7]
Set Softseek Off
#IFDEF TOP
if TcSrvType() != "AS/400"
cQuery += " AND E1_CLIENTE between '" + mv_par01 + "' AND '" + mv_par02 + "'"
cQuery += " AND E1_PREFIXO between '" + mv_par03 + "' AND '" + mv_par04 + "'"
cQuery += " AND E1_NUM between '" + mv_par05 + "' AND '" + mv_par06 + "'"
cQuery += " AND E1_PORTADO between '" + mv_par07 + "' AND '" + mv_par08 + "'"
Programação SQL com SIGA Advanced / AP5
cQuery += " AND E1_VENCREA between '" + DTOS(mv_par09) + "' AND '" + DTOS(mv_par10) + "'"
cQuery += " AND E1_NATUREZ between '" + mv_par11 + "' AND '" + mv_par12 + "'"
cQuery += " AND E1_EMISSAO between '" + DTOS(mv_par13) + "' AND '" + DTOS(mv_par14) + "'"
cQuery += " AND E1_LOJA between '" + mv_par24 + "' AND '" + mv_par25 + "'"
cQuery += " AND E1_EMISSAO <= '" + DTOS(dDataBase) + "'"
If mv_par20 == 2
cQuery += ' AND E1_SALDO <> 0'
Endif
cQuery += " ORDER BY "+ cOrder
cQuery := ChangeQuery(cQuery)
dbSelectArea("SE1")
dbCloseArea()
dbSelectArea("SA1")
dbUseArea(.T., "TOPCONN", TCGenQry(,,cQuery), 'SE1', .F., .T.) //= O mesmo que TCQUERY
For ni := 1 to Len(aStru)
If aStru[ni,2] != 'C'
TCSetField('SE1', aStru[ni,1], aStru[ni,2],aStru[ni,3],aStru[ni,4])
Endif
Next
endif
#ENDIF
SetRegua(nTotsRec)
#IFNDEF WINDOWS
Inkey()
If LastKey() = K_ALT_A
lEnd := .t.
Endif
#ENDIF
IF lEnd
@PROW()+1,001 PSAY OemToAnsi(STR0028) //"CANCELADO PELO OPERADOR"
Exit
Endif
IncRegua()
Store 0 To nTit1,nTit2,nTit3,nTit4,nTit5
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Carrega data do registro para permitir ³
//³ posterior analise de quebra por mes. ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
dDataAnt := Iif(nOrdem == 6 , SE1->E1_EMISSAO, SE1->E1_VENCREA)
cCarAnt := &cCond2
#IFNDEF WINDOWS
Inkey()
If LastKey() = K_ALT_A
lEnd := .t.
Endif
#ENDIF
IF lEnd
@PROW()+1,001 PSAY OemToAnsi(STR0028) //"CANCELADO PELO OPERADOR"
lContinua := .F.
Exit
EndIF
IncRegua()
Programação SQL com SIGA Advanced / AP5
dbSelectArea("SE1")
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Filtrar com base no Pto de entrada do Usuario... ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄJose Lucas, Localiza‡”es ArgentinaÄÙ
If !Empty(cTipos)
If !(SE1->E1_TIPO $ cTipos)
dbSkip()
Loop
End
Endif
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Considera filtro do usuario ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
If !Empty(cFilterUser).and.!(&cFilterUser)
dbSkip()
Loop
Endif
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Nao ‚ retroativo, nem considera o titulo zerado ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
If mv_par20 == 2 .and. E1_SALDO = 0
dbSkip()
Loop
Endif
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Verifica se trata-se de abatimento ou somente titulos³
//³ at‚ a data base. ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
IF SubStr(SE1->E1_TIPO,3,1)=="-".Or. SE1->E1_EMISSAO>dDataBase .or.;
(!Empty(E1_FATURA).and.Substr(E1_FATURA,1,6)=="NOTFAT".and.SE1->E1_EMISSAO >
dDataBase)
dbSkip()
Loop
Endif
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Verifica se ser impresso titulos provis¢rios ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
IF E1_TIPO == "PR " .and. mv_par16 == 2
dbSkip()
Loop
Endif
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Verifica se ser impresso titulos de Adiantamento ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
IF SE1->E1_TIPO $ "RA /"+MV_CRNEG .and. mv_par26 == 2
dbSkip()
Loop
Endif
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Verifica se esta dentro dos parametros ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
dbSelectArea("SE1")
IF SE1->E1_CLIENTE < mv_par01 .OR. SE1->E1_CLIENTE > mv_par02 .OR. ;
SE1->E1_PREFIXO < mv_par03 .OR. SE1->E1_PREFIXO > mv_par04 .OR. ;
Programação SQL com SIGA Advanced / AP5
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Desconsidera caso saldo seja menor ou igual a zero ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
If nSaldo <= 0
dbSkip()
Loop
Endif
dbSelectArea("SA1")
MSSeek(cFilial+SE1->E1_CLIENTE+SE1->E1_LOJA)
dbSelectArea("SA6")
MSSeek(cFilial+SE1->E1_PORTADO)
dbSelectArea("SE1")
IF li > 58
cabec(titulo,cabec1,cabec2,nomeprog,tamanho,GetMv("MV_COMP"))
EndIF
If mv_par19 == 1
@li, 0 PSAY SE1->E1_CLIENTE
@li, 7 PSAY SubStr( SE1->E1_NOMCLI, 1, 20 )
@li, 28 PSAY SE1->E1_PREFIXO+"-"+SE1->E1_NUM+"-"+SE1->E1_PARCELA
@li, 47 PSAY SE1->E1_TIPO
@li, 51 PSAY SE1->E1_NATUREZ
@li, 62 PSAY SE1->E1_EMISSAO
@li, 73 PSAY SE1->E1_VENCTO
@li, 84 PSAY SE1->E1_VENCREA
@li, 95 PSAY SE1->E1_PORTADO+" "+SE1->E1_SITUACA
@li,101 PSAY xMoeda(SE1->E1_VALOR,SE1->E1_MOEDA,mv_par15,SE1->E1_EMISSAO)
Picture tm ( SE1->E1_VALOR, 14 )
Endif
If mv_par19 == 1
@li, 116 PSAY nSaldo Picture tm ( nSaldo, 14 )
EndIf
nJuros:=0
fa070Juros(mv_par15)
dbSelectArea("SE1")
If mv_par19 == 1
@li,133 PSAY nSaldo+nJuros Picture tm(nSaldo+nJuros,14)
EndIf
If SE1->E1_TIPO $ "RA /"+MV_CRNEG
nTit0 -= xMoeda(SE1->E1_VALOR,SE1->E1_MOEDA,mv_par15,SE1-
>E1_EMISSAO)
nTit1 -= (nSaldo)
nTit2 -= (nSaldo+nJuros)
nMesTit0 -= xMoeda(SE1->E1_VALOR,SE1->E1_MOEDA,mv_par15,SE1-
>E1_EMISSAO)
nMesTit1 -= (nSaldo)
nMesTit2 -= (nSaldo+nJuros)
Else
nTit0 += xMoeda(SE1->E1_VALOR,SE1->E1_MOEDA,mv_par15,SE1-
>E1_EMISSAO)
nTit1 += (nSaldo)
nTit2 += (nSaldo+nJuros)
nMesTit0 += xMoeda(SE1->E1_VALOR,SE1->E1_MOEDA,mv_par15,SE1-
>E1_EMISSAO)
nMesTit1 += (nSaldo)
nMesTit2 += (nSaldo+nJuros)
Endif
nTotJur += nJuros
nMesTitj += nJuros
nTotFilJ += nJuros
Else //a vencer
If mv_par19 == 1
@li,149 PSAY nSaldo Picture tm ( nSaldo, 14 )
EndIf
If ! ( SE1->E1_TIPO $ "RA /"+MV_CRNEG)
nTit0 += xMoeda(SE1->E1_VALOR,SE1->E1_MOEDA,mv_par15,SE1-
>E1_EMISSAO)
nTit3 += (nSaldo-nTotAbat)
nTit4 += (nSaldo-nTotAbat)
nMesTit0 += xMoeda(SE1->E1_VALOR,SE1->E1_MOEDA,mv_par15,SE1-
>E1_EMISSAO)
nMesTit3 += (nSaldo-nTotAbat)
nMesTit4 += (nSaldo-nTotAbat)
Else
nTit0 -= xMoeda(SE1->E1_VALOR,SE1->E1_MOEDA,mv_par15,SE1-
>E1_EMISSAO)
nTit3 -= (nSaldo-nTotAbat)
nTit4 -= (nSaldo-nTotAbat)
nMesTit0 -= xMoeda(SE1->E1_VALOR,SE1->E1_MOEDA,mv_par15,SE1-
>E1_EMISSAO)
nMesTit3 -= (nSaldo-nTotAbat)
nMesTit4 -= (nSaldo-nTotAbat)
Endif
Endif
If mv_par19 == 1
@ li, 166 PSAY SE1->E1_NUMBCO
EndIf
If nJuros > 0
If mv_par19 == 1
@ Li,177 PSAY nJuros Picture Tm(nJuros,12)
EndIf
nJuros := 0
Endif
nAtraso := 0
EndIF
EndIF
nAtraso:=IIF(nAtraso<0,0,nAtraso)
IF nAtraso>0
If mv_par19 == 1
@li ,193 PSAY nAtraso Picture "9999"
EndIf
EndIF
EndIF
If mv_par19 == 1
@li,198 PSAY SubStr(SE1->E1_HIST,1,20)+ ;
IIF(E1_TIPO=="PR ","*"," ")+ ;
Iif(nSaldo == xMoeda(E1_VALOR,E1_MOEDA,mv_par15,dDataReaj)," ","P")
EndIf
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Carrega data do registro para permitir ³
//³ posterior an lise de quebra por mes. ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
dDataAnt := Iif(nOrdem == 6, SE1->E1_EMISSAO, SE1->E1_VENCREA)
dbSkip()
nTotTit ++
nMesTTit ++
nTotFiltit++
nTit5 ++
If mv_par19 == 1
li++
EndIf
Enddo
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Verifica quebra por mˆs ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
lQuebra := .F.
If nOrdem == 4 .and. Month(SE1->E1_VENCREA) # Month(dDataAnt)
lQuebra := .T.
Elseif nOrdem == 6 .and. Month(SE1->E1_EMISSAO) # Month(dDataAnt)
lQuebra := .T.
Endif
If lQuebra .and. nMesTTit # 0
ImpMes130(nMesTit0,nMesTit1,nMesTit2,nMesTit3,nMesTit4,nMesTTit,nMesTitJ)
nMesTit1 := nMesTit2 := nMesTit3 := nMesTit4 := nMesTTit := nMesTitj := 0
Endif
nTot0+=nTit0
nTot1+=nTit1
nTot2+=nTit2
nTot3+=nTit3
nTot4+=nTit4
nTotJ+=nTotJur
nTotFil0+=nTit0
nTotFil1+=nTit1
nTotFil2+=nTit2
nTotFil3+=nTit3
nTotFil4+=nTit4
Store 0 To nTit0,nTit1,nTit2,nTit3,nTit4,nTit5,nTotJur,nTotAbat
Enddo
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Imprimir TOTAL por filial somente quan-³
Programação SQL com SIGA Advanced / AP5
#IFDEF TOP
if TcSrvType() != "AS/400"
dbSelectArea("SE1")
dbCloseArea()
ChKFile("SE1")
dbSelectArea("SE1")
dbSetOrder(1)
endif
#ENDIF
dbSelectArea("SM0")
dbSkip()
Enddo
IF li != 80
IF li > 58
cabec(titulo,cabec1,cabec2,nomeprog,tamanho,GetMv("MV_COMP"))
EndIF
TotGer130(nTot0,nTot1,nTot2,nTot3,nTot4,nTotTit,nTotJ)
Roda(cbcont,cbtxt,"G")
EndIF
#IFNDEF TOP
dbSelectArea("SE1")
dbClearFil(NIL)
RetIndex( "SE1" )
If !Empty(cIndexSE1)
FErase (cIndexSE1+OrdBagExt())
Endif
dbSetOrder(1)
#ELSE
if TcSrvType() != "AS/400"
dbSelectArea("SE1")
dbCloseArea()
ChKFile("SE1")
dbSelectArea("SE1")
dbSetOrder(1)
else
dbSelectArea("SE1")
dbClearFil(NIL)
RetIndex( "SE1" )
If !Empty(cIndexSE1)
FErase (cIndexSE1+OrdBagExt())
Endif
dbSetOrder(1)
endif
#ENDIF
If aReturn[5] = 1
Set Printer TO
dbCommitAll()
Ourspool(wnrel)
Endif
MS_FLUSH()
Return
Programação SQL com SIGA Advanced / AP5
//³Funcao ³ R170IMP
//³Descricao ³ Chamada do Relatorio
//³ Uso ³ MATR170
Function R170Imp
dbSelectArea("SE2")
dbSetOrder(8)
cQuery := "SELECT E2_NATUREZ, E2_VENCREA, E2_NOMFOR, E2_PREFIXO, "
cQuery := cQuery + " E2_NUM, E2_PARCELA, E2_VENCTO, E2_FORNECE, E2_LOJA,"
cQuery := cQuery + " E2_VALOR, E2_SALDO, E2_TIPO, E2_BAIXA, E2_EMISSAO"
cQuery := cQuery + ‘ FROM RetSqlName("SE1") ‘
cQuery := cQuery + " WHERE E2_FILIAL = '" + xFilial("SE2") + "'"
cQuery := cQuery + " AND D_E_L_E_T_ = ' ' "
cQuery := cQuery + " AND E2_NATUREZ >= '"+ MV_PAR01 +"' AND E2_NATUREZ <= '"+mv_par02+"'"
cQuery := cQuery + " AND E2_VENCREA >= '"+DTOS(mv_par03)+"' AND E2_VENCREA <= '"+DTOS(mv_par04)+"'"
cQuery := cQuery + " AND E2_FORNECE >= '"+mv_par07+"' And E2_FORNECE <= '"+mv_par08+"'"
cQuery := cQuery + " AND E2_EMISSAO >= '"+DTOS(mv_par09)+"' AND E2_EMISSAO <= '"+DTOS(mv_par10)+"'"
cQuery := cQuery + " AND E2_TIPO <> 'AB-'"
cQuery := cQuery + " ORDER BY E2_NATUREZ, E2_VENCREA, E2_NOMFOR"
cQuery := ChangeQuery(cQuery)
While !Eof()
IncRegua()
If li >56
cabec(titulo,cabec1,cabec2,nomeprog,tamanho,1)
End
_cNatur :=TRB->E2_NATUREZ
dbSelectArea("SED")
dbSetOrder(1)
dbSeek(xFilial() + _cNatur)
_cDescNat := SED->ED_DESCRIC
li := li + 1
@ li, 001 PSAY "Natureza..: "+AllTrim(_cNatur) + " - " + _cDescNat
li := li + 2
dbSelectArea("TRB")
_nTotNat := 0
nAbatimentos:= 0
_nTotAbat := 0
nSaldo := 0
_nSaldoT := 0
_nTotAbat:= nAbatimentos
// ------------------------ Calcula o Saldo ----------------------//
fSaldoTit()
_nSaldoT := nSaldo
_nValor := _nSaldoT - _nTotAbat
//----------------------------------------------------//
If _nValor <= 0
dbSelectArea("TRB")
dbSkip()
Loop
End
//--------------------------- Imprime ---------------------//
dbSelectArea("SA2")
dbSetOrder(1)
dbSeek(xFilial() + TRB->E2_FORNECE + TRB->E2_LOJA)
dbSelectArea("TRB")
@ li, 001 PSAY TRB->E2_FORNECE
@ li, 008 PSAY SUBSTR(SA2->A2_NOME,1,20)
@ li, 029 PSAY TRB->E2_PREFIXO
@ li, 033 PSAY TRB->E2_NUM
@ li, 040 PSAY TRB->E2_PARCELA
@ li, 042 PSAY TRB->E2_TIPO
@ li, 045 PSAY SUBST(TRB->E2_EMISSAO,7,2)+"/"+SUBST(TRB-
>E2_EMISSAO,5,2)+"/"+SUBST(TRB->E2_EMISSAO,3,2)
@ li, 055 PSAY SUBST(TRB->E2_VENCREA,7,2)+"/"+SUBST(TRB-
>E2_VENCREA,5,2)+"/"+SUBST(TRB->E2_VENCREA,3,2)
@ li, 064 PSAY _nValor Picture"@E 9,999,999.99"
@ li, 078 PSAY Iif((Val(Dtos(DDATABASE))-Val(TRB-
>E2_VENCREA))<=0,0,Val(Dtos(DDATABASE))-Val(TRB->E2_VENCREA)) Picture"@R 999"
_nTotDia := _nTotDia + _nValor
dbSkip()
li := li + 1
If li >56
cabec(titulo,cabec1,cabec2,nomeprog,tamanho,1)
li := li + 1
@ li, 001 PSAY "Natureza..: "+AllTrim(_cNatur) + " - " + SED->ED_DESCRIC + "
(continuacao)"
li := li + 2
End
End
If _nTotDia > 0
li := li + 1
@ li, 010 PSAY "Total do Dia.....: "
@ li, 064 PSAY _nTotDia Picture"@E 9,999,999.99"
li := li + 2
_nTotNat := _nTotNat + _nTotDia
Endif
End
li := li + 3
@ li, 010 PSAY "Tot.Natureza " + AllTrim(_cNatur) + " - " + AllTrim(_cDescNat)
@ li, 064 PSAY _nTotNat Picture"@E 9,999,999.99"
_nTotGer := _nTotGer + _nTotNat
li := 58
End
@ li, 010 PSAY "Total do Relatorio..:"
@ li, 062 PSAY _nTotGer Picture"@E 999,999,999.99"
Programação SQL com SIGA Advanced / AP5
EJECT
dbSelectArea("TRB")
dbCloseArea()
RetIndex("SE2")
dbSetOrder(1)
Set device to Screen
If aReturn[5] == 1
Set Printer TO
dbcommitAll()
ourspool(wnrel)
Endif
MS_FLUSH()
__Return()
Programação SQL com SIGA Advanced / AP5
A função Changequery deve sempre ser executada antes de enviar uma query ao
servidor, esta função tem como objetivo retornar a query modificada de acordo a melhorar
forma possível de escrita para cada banco de dados, portanto para ela ser utilizada você
deve utilizar o padrão ANSI de escrita, para depois a função ChangeQuery colocar o
código específico de cada Banco de Dados.
A Função SQLOrder tem o objetivo de retornar uma chave de índice de uma determinada
tabela no formato padrão para a utilização da clausula Order By, ou seja, o retorno da
função indexkey(), retorno um chave por exemplo igual a
(E1_FILIAL+E1_PREFIXO+E1_NUM+...), após execução desta função ele modifica para
(E1_FILIAL,E1_PREFIXO,E1_NUM,...) para campos que constituem funções DTOS e
STR também serão ajustados.
-- Declaracoes de variaveis
DECLARE @cCod VARCHAR( 15 )
DECLARE @cLocal VARCHAR( 02 )
DECLARE @nRecno INTEGER
DECLARE @nQSALDOATU FLOAT
DECLARE @nCUSTOATU FLOAT
DECLARE @nCUSTOATU2 FLOAT
DECLARE @nCUSTOATU3 FLOAT
DECLARE @nCUSTOATU4 FLOAT
DECLARE @nCUSTOATU5 FLOAT
DECLARE @nQTSEGUM FLOAT
DECLARE @cFil_SB2 VARCHAR( 02 )
DECLARE @cFil_SC2 VARCHAR( 02 )
DECLARE @nRec INTEGER
DECLARE @nRecAnt INTEGER
DECLARE @nMaxRecnoSC2 INTEGER
DECLARE @cFILAUX VARCHAR( 02 )
BEGIN
SELECT @OUT_RESULTADO = '0'
SELECT @cFILAUX = @IN_CFILAUX
IF @cFILAUX is null
BEGIN
SELECT @cFILAUX = ' '
END
IF SUBSTRING ( @IN_XFILIAL , 7 , 1 ) = 'C'
BEGIN
SELECT @cFil_SB2 = ' '
END
ELSE
BEGIN
SELECT @cFil_SB2 = @IN_FILIALCOR
END
IF SUBSTRING ( @IN_XFILIAL , 8 , 1 ) = 'C'
BEGIN
SELECT @cFil_SC2 = ' '
END
ELSE
BEGIN
SELECT @cFil_SC2 = @IN_FILIALCOR
END
WHERE R_E_C_N_O_ > @nRecAnt and R_E_C_N_O_ <= @nRec and C2_FILIAL = @cFil_SC2
END
SELECT @OUT_RESULTADO = '1'
END
GO
Programação SQL com SIGA Advanced / AP5
--------------------------------------
-- SQLParse - Microsiga Software SA
-- Processado em 19/4/2000 09:36:16
-- Dialeto: MSSql 7.0
--------------------------------------
-- Criacao de procedure
CREATE PROCEDURE A330INI_99 (
@IN_XFILIAL VarChar( 255 ) ,
@IN_DINICIO VarChar( 8 ) ,
@IN_CFILAUX VarChar( 02 ) ,
@IN_MV_LOCPROC VarChar( 02 ) ,
@IN_FILIALCOR VarChar( 02 ) ,
@IN_USER_LG VarChar( 17 ) ,
@IN_DATABASE VarChar( 08 ) ,
@OUT_RESULTADO VarChar( 1 ) output )
WITH ENCRYPTION AS
-- Declaracoes de variaveis
DECLARE @cCod VarChar( 15 )
DECLARE @cLocal VarChar( 02 )
DECLARE @nRecno Integer
DECLARE @nQSALDOATU Float
DECLARE @nCUSTOATU Float
DECLARE @nCUSTOATU2 Float
DECLARE @nCUSTOATU3 Float
DECLARE @nCUSTOATU4 Float
DECLARE @nCUSTOATU5 Float
DECLARE @nQTSEGUM Float
DECLARE @cFil_SB2 VarChar( 02 )
DECLARE @cFil_SC2 VarChar( 02 )
DECLARE @nRec Integer
DECLARE @nRecAnt Integer
DECLARE @nMaxRecnoSC2 Integer
DECLARE @cFILAUX VarChar( 02 )
BEGIN
SET @OUT_RESULTADO = '0'
SET @cFILAUX = @IN_CFILAUX
IF @cFILAUX is null
BEGIN
SET @cFILAUX = ' '
END
IF SUBSTRING ( @IN_XFILIAL , 7 , 1 ) = 'C'
BEGIN
SET @cFil_SB2 = ' '
END
ELSE
BEGIN
SET @cFil_SB2 = @IN_FILIALCOR
END
IF SUBSTRING ( @IN_XFILIAL , 8 , 1 ) = 'C'
BEGIN
SET @cFil_SC2 = ' '
END
ELSE
BEGIN
SET @cFil_SC2 = @IN_FILIALCOR
END
OPEN CUR_A330INI
FETCH CUR_A330INI
INTO @cCod , @cLocal , @nRecno
Programação SQL com SIGA Advanced / AP5
WHILE ( (@@fetch_status = 0 ) )
BEGIN
EXEC MTXFUN1_99 @IN_XFILIAL , @cCod , @cLocal , @IN_DINICIO , @cFILAUX , @IN_MV_LOCPROC ,
@IN_FILIALCOR , @IN_USER_LG ,
@IN_DATABASE , @nQSALDOATU output , @nCUSTOATU output , @nCUSTOATU2 output , @nCUSTOATU3 output ,
@nCUSTOATU4 output ,
@nCUSTOATU5 output , @nQTSEGUM output
IF @nQSALDOATU > 0
BEGIN
UPDATE SB2990
WITH (ROWLOCK)
SET B2_QFIM = @nQSALDOATU , B2_VFIM1 = @nCUSTOATU , B2_VFIM2 = @nCUSTOATU2 , B2_VFIM3 =
@nCUSTOATU3 , B2_VFIM4 = @nCUSTOATU4
, B2_VFIM5 = @nCUSTOATU5 , B2_CM1 = @nCUSTOATU / @nQSALDOATU , B2_CM2 = @nCUSTOATU2 /
@nQSALDOATU , B2_CM3 = @nCUSTOATU3 / @nQSALDOATU
, B2_CM4 = @nCUSTOATU4 / @nQSALDOATU , B2_CM5 = @nCUSTOATU5 / @nQSALDOATU
WHERE R_E_C_N_O_ = @nRecno
END
ELSE
BEGIN
UPDATE SB2990
WITH (ROWLOCK)
SET B2_QFIM = @nQSALDOATU , B2_VFIM1 = @nCUSTOATU , B2_VFIM2 = @nCUSTOATU2 , B2_VFIM3 =
@nCUSTOATU3 , B2_VFIM4 = @nCUSTOATU4
, B2_VFIM5 = @nCUSTOATU5
WHERE R_E_C_N_O_ = @nRecno
END
FETCH CUR_A330INI
INTO @cCod , @cLocal , @nRecno
END
CLOSE CUR_A330INI
DEALLOCATE CUR_A330INI
SELECT @nMaxRecnoSC2 = MAX ( R_E_C_N_O_ )
FROM SC2990
WHERE C2_FILIAL = @cFil_SC2
IF @nMaxRecnoSC2 is null
BEGIN
SET @nMaxRecnoSC2 = 0
END
SET @nRec = 0
WHILE (@nRec <= @nMaxRecnoSC2 )
BEGIN
SET @nRecAnt = @nRec
SET @nRec = @nRec + 1024
UPDATE SC2990
WITH (ROWLOCK)
SET C2_VFIM1 = C2_VINI1 , C2_VFIM2 = C2_VINI2 , C2_VFIM3 = C2_VINI3 , C2_VFIM4 = C2_VINI4 , C2_VFIM5 =
C2_VINI5
, C2_APRFIM1 = C2_APRINI1 , C2_APRFIM2 = C2_APRINI2 , C2_APRFIM3 = C2_APRINI3 , C2_APRFIM4 =
C2_APRINI4 , C2_APRFIM5 = C2_APRINI5
WHERE R_E_C_N_O_ > @nRecAnt and R_E_C_N_O_ <= @nRec and C2_FILIAL = @cFil_SC2
END
SET @OUT_RESULTADO = '1'
END
GO
Programação SQL com SIGA Advanced / AP5
--------------------------------------
-- SQLParse - Microsiga Software SA
-- Processado em 19/4/2000 09:36:16
-- Dialeto: Oracle
--------------------------------------
-- Criacao de procedure
CREATE OR REPLACE PROCEDURE A330INI_99 (
IN_XFILIAL in VARCHAR ,
IN_DINICIO in VARCHAR ,
IN_CFILAUX in VARCHAR ,
IN_MV_LOCPROC in VARCHAR ,
IN_FILIALCOR in VARCHAR ,
IN_USER_LG in VARCHAR ,
IN_DATABASE in VARCHAR ,
OUT_RESULTADO out VARCHAR ) IS
-- Declaracoes de variaveis
vcCod VARCHAR( 15 ) ;
vcLocal VARCHAR( 02 ) ;
vnRecno INTEGER ;
vnQSALDOATU FLOAT ;
vnCUSTOATU FLOAT ;
vnCUSTOATU2 FLOAT ;
vnCUSTOATU3 FLOAT ;
vnCUSTOATU4 FLOAT ;
vnCUSTOATU5 FLOAT ;
vnQTSEGUM FLOAT ;
vcFil_SB2 VARCHAR( 02 ) ;
vcFil_SC2 VARCHAR( 02 ) ;
vnRec INTEGER ;
vnRecAnt INTEGER ;
vnMaxRecnoSC2 INTEGER ;
vcFILAUX VARCHAR( 02 ) ;
BEGIN
OUT_RESULTADO := '0' ;
vcFILAUX := IN_CFILAUX ;
IF vcFILAUX is null THEN
vcFILAUX := ' ' ;
END IF;
IF SUBSTR ( IN_XFILIAL , 7 , 1 ) = 'C' THEN
vcFil_SB2 := ' ' ;
ELSE
vcFil_SB2 := IN_FILIALCOR ;
END IF;
IF SUBSTR ( IN_XFILIAL , 8 , 1 ) = 'C' THEN
vcFil_SC2 := ' ' ;
ELSE
vcFil_SC2 := IN_FILIALCOR ;
END IF;
OPEN CUR_A330INI;
FETCH CUR_A330INI
INTO vcCod , vcLocal , vnRecno ;
<<parse5>>
WHILE ( (CUR_A330INI%FOUND ) ) LOOP
MTXFUN1_99 (IN_XFILIAL , vcCod , vcLocal , IN_DINICIO , vcFILAUX , IN_MV_LOCPROC , IN_FILIALCOR , IN_USER_LG ,
IN_DATABASE ,
vnQSALDOATU , vnCUSTOATU , vnCUSTOATU2 , vnCUSTOATU3 , vnCUSTOATU4 , vnCUSTOATU5 , vnQTSEGUM );
IF vnQSALDOATU > 0 THEN
Programação SQL com SIGA Advanced / AP5
UPDATE SB2990
SET B2_QFIM = vnQSALDOATU , B2_VFIM1 = vnCUSTOATU , B2_VFIM2 = vnCUSTOATU2 , B2_VFIM3 =
vnCUSTOATU3 , B2_VFIM4 = vnCUSTOATU4
, B2_VFIM5 = vnCUSTOATU5 , B2_CM1 = vnCUSTOATU / vnQSALDOATU , B2_CM2 = vnCUSTOATU2 /
vnQSALDOATU ,
B2_CM3 = vnCUSTOATU3 / vnQSALDOATU , B2_CM4 = vnCUSTOATU4 / vnQSALDOATU , B2_CM5 =
vnCUSTOATU5 / vnQSALDOATU
--------------------------------------
-- SQLParse - Microsiga Software SA
-- Processado em 19/4/2000 09:36:16
-- Dialeto: Informix
--------------------------------------
-- Criacao de procedure
CREATE PROCEDURE A330INI_99 (
IN_XFILIAL VARCHAR( 255 ) ,
IN_DINICIO VARCHAR( 8 ) ,
IN_CFILAUX VARCHAR( 02 ) ,
IN_MV_LOCPROC VARCHAR( 02 ) ,
IN_FILIALCOR VARCHAR( 02 ) ,
IN_USER_LG VARCHAR( 17 ) ,
IN_DATABASE VARCHAR( 08 ) ,
OUT_RESULTADO VARCHAR( 1 ) )
Returning VARCHAR( 1 ) ;
-- Declaracoes de variaveis
vnCUSTOATU5 / vnQSALDOATU
São comandos do Administrador do Banco de dados, alguns destes comandos são muito
comuns no seu uso e são padronizados em todos os Bancos de Dados, em algum
momento eles serão muito úteis.
Comando para remover todos as linhas de uma tabela sem utilizar a opção
de log do banco de dados esta função é similar ao conhecido ZAP no
Clipper ou um Open output no Cobol.