Este documento não tem o objetivo de ensinar ao leitor a programação “ADVPL”, nem a lógica de programação, pois neste caso presumimos que o leitor já tenha este conhecimento.
Neste documento serão apresentadas todas as funções necessárias para a geração e impressão de etiquetas com ou sem código de barras para impressoras térmicas.
Atualmente as funções para impressão térmica englobam as linguagem DPL, EPL, IPL e ZPL, sendo estas linguagens totalmente transparentes para o programador. Sendo assim o programador em questão não precisa ser um conhecedor das linguagem de programação para impressoras térmicas descritas acima, desenvolvidas por seus fabricantes.
Onde:
DPL é a linguagem de programação datamax;
EPLé a linguagem de programação eltron;
IPLé a linguagem de programação intermec;
ZPLé a linguagem de programação zebra.
Sentido da Impressão
O sentido de impressão não é o mesmo para todas impressoras térmicas. Alguns fabricantes de impressoras diferem o sentido de impressão um do outro, tendo suas próprias justificativas, podendo elas ser desempenho, qualidade ou até facilidade para o desenvolvedor.
Quando falamos em sentido de impressão, também é importante falarmos do ponto de origem (0,0) no posicionamento do desenho de imagens, linhas e textos, pois isto também é definido pelo fabricante tendo as mesmas regra justificadas por ele.
Abaixo são apresentadas os sentidos de impressão e ponto de origem para os padrões de programação e impressoras homologadas.
Padrão Zebra e Eltron (Programação ZPL e EPL)
A figura 01 ilustra o eixo cartesiano de trabalho, o ponto de origem do eixo cartesiano e principalmente o ponto de origem para inicio do texto ou figura, a qual fica no canto superior esquerdo ( de cima para baixo) conforme figura 01.
OBS: Alguns modelos de impressoras ELTRON, possuem o alinhamento da folha de etiqueta centralizado, por isso deve-se considerar o ponto de impressão da posição+a margem.
2.2. Padrão Datamax (Programação DPL )
Note na figura 02 que o quadrante do eixo cartesiano do padrão datamax é diferente do quadrante do eixo cartesiano da intermec e zebra. Também é importante observar que o ponto de origem para o desenho do texto ou figura inicia no canto inferior esquerdo do texto ou figura (ou seja, de baixo para cima do texto ou figura), diferentemente do padrão zebra e intermec.
Figura 02 – Apresentação do sentido de impressão da imagem na etiqueta padrão datamax.
2.3. Padrão Intermec (Programação IPL)
Note que o quadrante do eixo cartesiano do padrão intermec é diferente do quadrante do eixo cartesiano da datamax e da zebra. Porém é importante observar que o ponto de origem para o desenho do texto ou figura inicia no canto superior esquerdo do texto ou figura ( ou seja, a impressão do texto ou figura se dá de cima para baixo, a partir de sua origem), igual o padrão zebra e diferente do padrão datamax.
Figura 03 – Apresentação do sentido de impressão da imagem na etiqueta padrão Intermec.
3. Funções
Nesta sessão serão descritos as funções necessárias para desenvolver imagens de etiqueta para impressoras térmicas.
Os parâmetros que estiverem entre [], significa que não são OBRIGATÓRIOS, os parâmetros que estiverem com (*), significa que é uso exclusivo ZPL.
3.1. MSCBPrinter
Objetivo:
Permite realizar as configurções da impressora, as quais permitirão ao programador determinar as caracteristicas de impressão, definidas pelos parâmetros abaixo.
String com o modelo de impressora:FabricanteImpressorasDatamaxALLEGRO, ALLEGRO 2, PRODIGY, DMX, DESTINY, URANO, DATAMAX, OS 214, OS 314, PRESTIGE, ARGOXEltronELTRON, TLP 2722, TLP 2742, TLP 2844, TLP 3742, C4-8IntermecINTERMEC, 3400-8, 3400-16, 3600-8, 4440-16, 7421C-8ZebraS300, S400, S500-6, S500-8, Z105S-6, Z105S-8, Z160S-6, Z160S-8, Z140XI, S600, Z4M, Z90XI, Z170XI, ZEBRA.
[cPorta]
String com a porta
[nDensidade]
Número com a densidade referente a quantidade de pixel por mm. Este parâmetro só deve ser informado quando o parâmetro cModelPrt não for informado, pois cModelPrt o atualizará automaticamente. A utilização deste parâmetro deverá ser usado quando não souber o modelo da impressora, a aplicação entendera que se trata de uma impressora Zebra. O tamanho da etiqueta será necessário quando a mesma não for continua.
[nTamanho]
Tamanho da etiqueta em Milímetros. Lembrando que este tamanho só deve ser passado se a etiqueta for continua.
[lSrv]
Se .t. imprime no server,.f. no client. O seu valor padrão é .f.
[nPorta]
Número da porta de outro server
[cServer]
endereço IP de outro server
[cEnv]
environment do outro server
[nMemoria]
Número com bloco de memória da impressora térmica. Caso seja enviada muita informação para a impressora, a fim que esta venha imprimir (sobrecarregando a memória), pode ocorrer perda de dados. Por outro lado, se for informado blocos muito pequenos de memória, implicará na diminuição da performance da impressora. Sendo assim o programador deverá fazer uma avaliação para ver o que melhor se adequa a sua situação.
[cFila]
Diretório onde será gravada as filas
[lDrvWin]
Indica se será utilizando os drivers do windows para impressão
[cPathSpool]
Caminho do diretório onde serão geradas as filas de impressão
Exemplo usando o padrão de programação Zebra (família ZPL)
String a ser impresso ou itens especificando uma variável “@”.(Ex: “@2”).Obs: quando for especificado uma variável, o seu conteúdo deverá ser apenas o caractere “@” seguido de um número, “@1” ou “@2” e assim por diante. Vide item 3.15.
cRotação
String com o tipo de Rotação (N,R,I,B):InstruçãoDescriçãoNNormalRCima para baixoIInvertidoBBaixo para cima
cFonte
String com os tipos de Fonte:PadrãoTiposZebra(A,B,C,D,E,F,G,H,0) 0(zero)- fonte escalarDatamax(0,1,2,3,4,5,6,7,8,9) 9 – fonte escalarEltron(0,1,2,3,4,5)Intermec(0,1,7,20,21,22,27)
cTam
String com o tamanho da Fonte
*[lReverso]
Imprime em reverso quando tiver sobre um box preto
[lSerial]
Serializa o código
[cIncr]
Incrementa quando for serial positivo ou negativo
*[lZerosL]
Coloca zeros a esquerda no numero serial
[lNoAlltrim]
Permite brancos a esquerda e direita
Exemplo usando o padrão de programação Zebra (família ZPL):
String a ser impressa especificando uma variável “@” ou array somente quando o parâmetro cTypePrt for igual á MB07.Definição do Array:cConteudo :={{“01″,”07893316010411”},;{“10”,”0000970100″+MSCB128B()+”1″+MSCB128C()},;{“37″,”0004”},;{“21″,”000494”}}A possição 1 do array (ex: “01”) informa o AI utilizadado (que será visto no item 3.6.1. “Utilização do código de barras 128”).Já a possição 2 do array (ex: “07893316010411”) é o conteúdo do AI.
cRotação
String com o tipo de Rotação:InstruçãoDescriçãoNNormalRCima para baixoIInvertidoBBaixo para cima
cTypePrt
String com o Modelo de Código de Barras:InstruçãoModelo de Código de BarrasMB01Interleaved 2 of 5MB02Code 39MB03EAN 8MB04EAN 13MB05UPC AMB06UPC EMB07CODE 128Obs: Caso o leitor queira utilizar o modelo do padrão de programação da impressora, o mesmo deverá consultar documentação do fabricante.
[nAltura]
Altura do código de Barras em Milímetros
*[ lDigver]
Imprime dígito de verificação
[lLinha]
Imprime a linha de código
*[lLinBaixo]
Imprime a linha de código acima das barras
[cSubSetIni]
Utilizado no code128
[nLargura]
Largura da barra mais fina em pontos default 3
[nRelacao]
Relação entre as barras finas e grossas em pontos default 2
[lCompacta]
Parâmetro fora de uso.
[lSerial]
Serializa o código
[cIncr]
Incrementa quando for serial positivo ou negativo
[lZerosL]
Coloca Zeros a esquerda do conteúdo. Este parâmetro só é valido quando lSerial estiver ativado (.t.).
Exemplo usando o padrão de programação Zebra (família ZPL):
O código 128, permite a impressão de todos os 128 caracteres ASCII, incluindo caracteres alfanuméricos maiúsculos e minúsculos, bem como os caracteres de controle. Além disso existem alguns caracteres especiais que são de uso instrínseco ao código 128.
O código 128 está dividio em três subconjuntos: A, B e C dos quais apenas um está ativo de cada vez. Cada um dos códigos tem um sentido diferente dependendo do subconjunto ativo.
No protheus os subconjuntos A, B e C, são representados pelas funções MSCB128A( ), MSCB128B( ) e MSCB128C( ) respectivamente.
O subconjunto A possibilita a impressão de todos os caracteres alfanuméricos maiúsculos, caracteres de controle e caracteres especiais.
O subconjunto B possibilita a impressão de todos os caracteres alfanuméricos maiúsculos, caracteres minúsculos, e caracteres especiais. Este subconjunto não possibilita a compactação, porém aceita quase todos os caracteres contidos na tabela ASCII.
O subconjunto C é utilizado para duplicar a densidade de códigos com conteúdo apenas NUMÉRICO e número PAR de dígitos. Este aumento de densidade é obtido pela impressão de um conjunto de 100 pares de dígitos de 00 a 99 inclusive. Além disto permite a impressão de caracteres especiais. Ou seja o subconjunto C é utilizado para compactar o código de barras.
Sendo assim as funções MSCB128A( ), MSCB128B( ) e MSCB128C( ) permitem efetuar uma mudança no conjunto dentro do símbolo (código de barras). Todos os caracteres que seguem o caractere de código (subconjuto A, B ou C) são codificados de acordo com o conjunto de caracteres correspondente, salvo quando se encontra um outro caracter do código do caracter shift, que é semelhante à tecla “shift lock” no teclado de uma máquina de escrever, porém isso é tratado internamente nas funções de geração de código de barras.
A função MSCB128A( ) modifica a codificação para o conjunto de caracteres A.
A função MSCB128B( ) modifica a codificação para o conjunto de caracteres B.
A função MSCB128C( ) modifica a codificação para o conjunto de caracteres C.
O caractere de mudança (shift) permite uma alterção no conjunto de caracteres para o caracter que o segue imediatamente no símbolo. Os caracteres subsequentes revertem para o conjunto de caracteres ativo anterior ao caracter de mudança. O carctere shift opera somente entre os subconjuntos A e B. Não é possível mudar para o subconjunto C, nem mudar a partir dele. O caractere shift é semelhante à tecla “shift” no teclado de uma máquina de escrever. A função no protheus para utilização do caractere de “shift” é MSCB128Shift( ).
Existe também, o caractere FNC 1, usado como separador quando estão concatenados vários AIs e seus campos de dados quando os AI´s são variáveis, é transmitido como caractere GS. O GS no protheus é representado pela função MsCB128GS( ). Os AI´s serão discutidos no item 3.6.2.
Lembrando ao leitor que o mesmo não deverá se preocupara com a função MSCB128Shift() e MSCB128GS(), pois as mesmas são tratadas internamente na geração do código de barras. O leitor deverá somente se preocupar em seguir alguns critérios apresentados no exemplo 02 do item 3.6.
3.6.2. IDENTIFICAÇÃO DE APLICAÇÃO (Ais)
O símbolo UCC/EAN-128 é uma simbologia extremamente flexível. Permite a representação de dados de comprimento variável e possibilita codificar várias informações em um símbolo do código de barras. Isso se denomina concatenação. Este tipo de código de barras é iniciado por um caractere “START” indicando a tabela – code “A”, “B” ou “C” vistos anteriormente e que permite a identificação de 128 caracteres ASCII, seguido do caractere “FNC1”, ex: “START” (Code C) “FNC1”. Este caractere duplo inicial não é visível para as pessoas, mas deve estar no início das barras para que seja possível o reconhecimento e tratamento da estrutura da simbologia: os Indicadores de Aplicação, caractere separador, Dígito Verificador e Stop.
Os Als são códigos que anunciam com exclusividade os dados que os sucedem, seu significado e seu comprimento. Os dados que aparecem após um AI podem abranger caracteres alfabéticos e/ou numéricos de qualquer comprimento, chegando em alguns formatos até trinta caracteres. Os campos de dados têm comprimento fixo ou variável, dependendo do AI.
Os atributos de dados relacionam-se com um item: um item comercial ou de transporte, e não possuem significado caso sejam isolados. Podem ser representados no UCC/EAN-128 usando-se AIs. Existe uma faixa de AIs para medidas de itens comerciais, nos quais o peso descrito é o peso líquido, e uma faixa de AIs para medidas de unidades de transportes, denominadas unidades logísticas, nas quais o peso descrito é o peso bruto.
A tabela a seguir foi extraída da lista completa como exemplo dos AIs. Observe que um deles representa um significado – “conteúdo” , uma senha – “título de dados” para sua identificação na aplicação; e um formato” para a representação dos dados n (numéricos) ou em an (alfanuméricos), fixos ou variáveis.
A representação de AIs numa mesma linha do código de barras é possível desde que respeitadas as regras de concatenação:
Máximo de 48 caracteres numa mesma seqüência de dados (incluindo os AIs e caracter(es) separador(es) se tiver(em), mas excluindo os caracteres auxiliares e o dígito verificador);
Máximo de 165mm do símbolo, incluindo as margens de silêncio (para uma mesma linha de código de barras);
Uso do caractere separador “FNC1” depois de um AI de dado variável, quando concatenado com outro AI. A tabela a seguir identifica todos os Ais reconhecidos como tendo formato de dados fixos.
Os Identificadores de Aplicação que não aparecem nesta tabela deverão receber caractere separador (FNC1), quando anteceder qualquer outro AI numa concatenação. O caractere separador de dados FNC1 não aparece na representação humano-legível, mas deverá estar contido nas barras, a menos que o AI variável for o ultimo representado no código, pois neste caso o caractere “STOP” determina o final de representação.
Tabela de AI´s disponibilizada pela EAN:
AI
Título Completo
Formato
00
Código de Série de Unidade Logística
n2 +n18
01
Número Global de item Comercial
n2+n14
02
GTIN de itens comerciais contidos em uma unidade logística
n2+n14
10
Número de Batch ou de lote
n2 + an..20
11¹
Data de Produção (AAMMDD)
n2+n6
12¹
Data de Vencimento/ Pagamento (AAMMDD)
n2+n6
13¹
Data de Embalagem (AAMMDD)
n2+n6
15¹
Data de Durabilidade Mínima (AAMMDD)
n2+n6
17¹
Data de Durabilidade Máxima (AAMMDD)
n2+n6
20
Variante do Produto
n2+n2
21
Número de Série
n2+an20
22
Dados Secundários para Produtos Específicos do Setor de Saúde
n2+an..29
23²
Número de lote (Uso Transitório)
n3+n..19
240
Identificação Adicional do Produto Atribuída pelo Fabricante
n3+an..30
241
Número de Cliente
n3+an..30
2504
Número de Série Secundário
n3+an..30
AI
Título Completo
Formato
2514
Referência da Entidade de Origem
n3+an..30
30
Contagem Variável
n2+n..8
31-36³
Medidas Comerciais e Logícas
n4+n6
337³
Quilos por metro quadrado
n4+n6
37
Contagem de itens Comerciais Contidos numa Unidade Logística
n2+n..8
390³
Valor a Pagar – área monetária isolada
n4+n..15
391³
Valor a Pagar – com o código ISO de moeda
n4+n3+n..15
392n
Valor a Pagar por um item de medida variável – área monetária isolada
n4+n..15
393n
Valor a Pagar por um item de medida variável – com o código ISO de moeda
n4+n3+n..15
400
Número de Ordem de Compra do Cliente
n3+an..30
401
Número de Consignação
n3+an..30
402
Número de Identificação do Despacho
n3+n17
403
Código de Rota
n3+an..30
410
Número de Localização Global EAN/UCC “Despachar para – Entregar para”– destino imediato
n3+n13
411
Número Global de Localização EAN/UCC “Faturar para” “ Cobrar de”
n3+n13
412
Número Global de Localização EAN/UCC “ Comprado de”
n3+n13
413
Número Global de Localização EAN/UCC “Despachar para – Entregar para “– destino final
n3+n13
414
Identificação de Local Físico Número Global EAN/UCC de Localização
n3+n13
415
Número Global de Localização EAN/UCC da Parte que fatura
n3 + n13
420
Código Postal dentro de uma única Autoridade Postal“Despachar para – Entregar para”
n3+an20
421
Código Postal com Código isso de País com 3 Dígitos“ Despachar” para – Entregar para “
n3+n3+an9
422
País de Origem de um Item Comercial – Padrão ISO 3166
n3+n3
8001
Produtos em Rolo – Largura, Comprimento, Diâmetro doCentro, Direção e Junções
n4+n14
8002
Identificador Eletrônico em Série para Telefones Celulares Móveis
n4+an..20
8003
Identificador Global de Ativo Retornável
n4+n14+an..16
8004
Identificador Global de Ativo Individual
n4+an..30
8005
Preço por Unidade de Medida
n4+n6
8006
Identificação do Componente de um Item Comercial
n4+n14+n2+n2
8007
Número de Conta de Banco Internacional
n4+an..30
8018
Número de Relação de Serviço Global
n4+n..18
8020
Número de Referência de Boleto de Pagamento
n4+an..25
8100
Código Estendido de Cupom – NSC+ Código de oferta (USA/Canadá)
n4+n1+n5
8101
Código Estendido de Cupom – NSC+ Código de oferta + final do código de oferta (USA/Canadá)
n4+n1+n5+n4
8102
Código Estendido de Cupom – NSC (USA/Canadá)
n4+n1+ n1
90***
Informação Combinada Mutuamente entre Parceiros Comerciais (Incluindo FACT DIs)
n2 +na..30
91-99
Informação interna de Empresa
n2+na..30
Tabela 01 – Tabela de AI´s
Onde:
Quando forem necessários apenas ano e mês, DD deve ser preenchido com “00”.
Mais um dígito para a indicação de comprimento.
Estes Als compreendem 4 dígitos. Os três primeiros dígitos identificam o objetivo do AI, e o quarto dígito indica a posição do
ponto decimal.
***. O título do dado “vigente “ deve ser especificado pelo emissor da informação.
Exemplo do código 128 usando o padrão de programação ZPL:
Local cPorta := “COM1:9600,N,8,1” MSCBPRINTER(“S500-8”,cPorta,,35)MSCBBEGIN(1,6)MSCBBOX(02,01,76,34,1)aConteudo :={{“01″,”07893316010411”},;{“10”,”0000970100″+MSCB128B()+”1″+MSCB128C()},;{“37″,”0004”},;{“21″,”000494”}}MSCBSAYBAR(08,10,aConteudo,”N”,”MB07″,10,.F.,.T.,.F.,”C”,2,1,.F.)MSCBEND()MSCBCLOSEPRINTER()
Exemplo usando o padrão de programação Zebra (família ZPL):
Local cPorta := “LPT1”MSCBPRINTER(“S500-8”,cPorta, , 40 ,.f.)MSCBBEGIN(1,6)MSCBBOX(02,01,76,35)MSCBEND()MSCBCLOSEPRINTER()
3.8. MSCBLineH
Objetivo:
Imprime uma linha horizontal.
Sintaxe:
MSCBLineH(nX1mm, nY1mm, nX2mm, nExpessura, cCor)
Parâmetro
Descrição
nX1mm
Posição X1 em Milímetros
nY1mm
Posição Y1 em Milímetros
nX2mm
Posição X2 em Milímetros
[nEspessura]
Numero com a espessura em pixel
*[cCor]
String com a Cor Branca ou Preta (“W” ou “B”)
Exemplo usando o padrão de programação Zebra (família ZPL):
Local cPorta := “LPT1” MSCBPRINTER(“S500-8”,cPorta, , 40 ,.f.)MSCBBEGIN(1,6)MSCBLineH(30,05,76,3)MSCBLineH(02,13,76,3,”B”)MSCBEND()MSCBCLOSEPRINTER()
3.9. MSCBLineV
Objetivo:
Imprime uma linha vertical.
Sintaxe:
MSCBLineV(nX1mm, nY1mm, nY2mm, nExpessura, cCor)
Parâmetro
Descrição
nX1mm
Posição X1 em Milímetros
nY1mm
Posição Y1 em Milímetros
nY2mm
Posição X2 em Milímetros
[nEspessura]
Numero com a espessura em pixel
*[cCor]
String com a Cor Branca ou Preta (“W” ou “B”)
Exemplo usando o padrão de programação Zebra (família ZPL):
Local cPorta := “LPT1” MSCBPRINTER(“S500-8”,cPorta, , 40 ,.f.)MSCBBEGIN(1,6)MSCBLineV(30,01,13)MSCBEND()MSCBCLOSEPRINTER()
3.10. MSCBLoadGraf
Objetivo:
Carrega uma imagem para memória da impressora.
Sintaxe:
MSCBLOADGRF(cImagem)
Parâmetro
Descrição
cImagem
Nome do arquivo que será carregado, inclusive o path + nome completo + extensão
Observações:
Para o padrão Zebra, o arquivo do gráfico (cImagem) tem que ser do tipo GRF, gerado através de um PCX ou TIF no software fornecido pelo fabricante da zebra.
Para o padrão Intermec, o arquivo do gráfico (cImagem) tem que ser do tipo UDC, gerado através de um BMP ou TIF(não compactado) no software fornecido pelo fabricante da intermec.
Para o padrão Datamax, o arquivo do gráfico pode ser do tipo BMP, PCX, não sendo necessário ser convertido.
Para o padrão Eltron, o arquivo do gráfico tem que ser do tipo PCX, não sendo necessário ser convertido.
Exemplo do código 128 usando o padrão de programação ZPL:
Local cPorta := “LPT1” MSCBPRINTER(“S500-8”,cPorta, , 40 ,.f.)MSCBLOADGRF(“SIGA.GRF”)MSCBBEGIN(1,6)MSCBGRAFIC(2,3,”SIGA”)MSCBEND()MSCBCLOSEPRINTER()
3.11. MSCBGraphic
Objetivo:
Imprime gráfico que está armazenado na memória da impressora.
Sintaxe:
MSCBGRAFIC(nXmm, nYmm, cArquivo, lReverso)
Parâmetro
Descrição
NXmm
Posição X em Milímetros
NYmm
Posição Y em Milímetros
cArquivo
Nome do gráfico que foi carregado na memória da impressora (não colocar a extensão do arquivo)
*[lReverso]
Imprime em reverso quando tiver sobre um box preto
Exemplo usando o padrão de programação ZPL:
Local cPorta := “LPT1”MSCBPRINTER(“S500-8”,cPorta, , 40 ,.f.)MSCBLOADGRF(“SIGA.GRF”)MSCBBEGIN(1,6)MSCBGRAFIC(2,3,”SIGA”) MSCBEND()MSCBCLOSEPRINTER()
3.12. MSCBChkStatus
Objetivo:
Seta ou visualiza o controle de status do sistema com a impressora.
Sintaxe:
MSCBCHKStatus(lStatus)
Parâmetro
Descrição
[lStatus]
Lógica ativa/desativa o controle. Seu valor default é .t.
Observações:
Com o status ativado, sempre que a aplicação enviar qualquer informação para a impressora, será analisado o status, caso esteja com o buffer cheio, sem papel ou sem ribbon, o sistema aguardara até que os itens anteriores estejam solucionados. Caso haja uma incompatibilidade com o sistema operacional ou uma configuração inadequada, o mesmo poderá travar por não conseguir efetuar uma comunicação correta, caso isto ocorra, desative esta opção.
Exemplo usando o padrão de programação Zebra (família ZPL):
Local cPorta := “LPT1” MSCBPRINTER(“S500-8”,cPorta, , 40 ,.f.)MSCBCHKSTATUS(.t.)MSCBBEGIN(1,6)MSCBLineV(30,01,13)MSCBEND()MSCBCLOSEPRINTER()
3.13. MSCBInfoEti
Objetivo:
Grava informações para gerenciamento do MSCBSpool.
Sintaxe:
MSCBInfoEti(cDescr,cFiltro)
Parâmetro
Descrição
cDescr
Descrição que gerará informação no MSCBSpool para identificar a etiqueta.
cFiltro
É utilizado para realizar filtros no MSCBSpool. Vide documentação MSCBSpool.
Exemplo usando o padrão de programação Zebra (família ZPL):
Local nXLocal cPorta := “LPT1” MSCBPRINTER(“S500-8”,cPorta, , 40 ,.f.)For nx:=1 to 3MSCBINFOETI(“Exemplo 1″,”MODELO 1”)MSCBBEGIN(1,6)MSCBSAY(05,05,”IMPRESSORA ZEBRA S500-8″,”N”, “0”, “020,030”)MSCBEND()NextMSCBCLOSEPRINTER()
3.14. MSCBWrite
Objetivo:
Permite enviar para porta uma linha de programação nativa da Impressora.
Sintaxe:
MSCBWrite(cConteudo)
Parâmetro
Descrição
cConteudo
Linha de programação nativa da impressora.
Exemplo usando o padrão de programação Zebra (família ZPL):
Local nXLocal cPorta := “COM1:9600,N,8,1” MSCBPRINTER(“S500-8”,cPorta, , 40 ,.f.)MSCBBEGIN(1,6)MSCBWrite(“^FXPARAMETROS GERAIS ^FS”)MSCBWrite(“^LL120”)MSCBWrite(“^LH30,30”)MSCBWrite(“^PRA”)MSCBWrite(“^PQ10,2,,N”)MSCBWrite(“^FXCONTEUDO DA ETIQUETA^FS”)MSCBWrite(“^F01,1^GB250,90,10^FS”)MSCBWrite(“^F035,40^ADN,18,10^FDMicrosiga Software S/A^FS”)MSCBEND()MSCBCLOSEPRINTER()
3.15. MSCBVar
Objetivo:
Cria variáveis para serem utilizadas nos form´s (imagem) da etiqueta. Sendo assim podemos criar para cada um dos campos (código de barras e textos) uma variável correspondente. Normalmente este recurso é utilizado somente em layout´s variáveis, ou seja, em campos que são alterados constatemente.
O uso de variáveis permite ao programador criar um layout padrão (form) o qual será enviado para a impressora térmica, e depois o mesmo somente enviará as alterações das variáveis, diminuindo a quantidade de dados que serão carregados na impressora. Isto fará com que a impressora use uma quantidade menor de memória, podendo com isto ter uma diminuição de erros provenientes do buffer de impressão e um aumento de performance (velocidade) na impressão.
Sintaxe:
MSCBVar(cVar,cDados)
Parâmetro
Descrição
cVar
Nome da variável. Lembrando que o mesmo deverá ser incremental e sempre inicializar com “@”.( Exemplo: “@1”)
cdados
Conteúdo da variável
Exemplo usando o padrão de programação Zebra (família ZPL):
Observação: Note no exemplo acima, que o primeiro bloco inicializado com MSCBBEGIN e finalizado com MSCBEND constroi o layout da etiqueta (form). Já o loop “For” imprime 3 etiquetas utilizando as variáveis que atualizam o código do produto e o código de barras, devinido com a variável “@1” e “@2” respectivamente.
4. Exemplos
4.1. Padrão Datamax
4.1.1. Exemplo 01
User Function ExDPL1()Local nXLocal cPorta := “COM1:9600,n,8,2” MSCBPRINTER(“ALLEGRO”,cPorta, , ,.f. )MSCBLOADGRF(“SIGA.BMP”)For nx:=1 to 3MSCBINFOETI(“Exemplo 1″,”MODELO 1″)MSCBBEGIN(1,4)MSCBBOX(02,01,76,34,1)MSCBLineH(30,30,76,1)MSCBLineH(02,23,76,1)MSCBLineH(02,15,76,1)MSCBLineV(30,23,34,1)MSCBGRAFIC(2,26,”SIGA”)MSCBSAY(33,31,’PRODUTO’,”N”,”2″,”01,01″)MSCBSAY(33,27,”CODIGO”,”N”,”2″,”01,01″)MSCBSAY(33,24, Strzero(nX,10), “N”, “2”, “01,01”)MSCBSAY(05,20,”DESCRICAO”,”N”,”2″,”01,01″)MSCBSAY(05,16,”IMPRESSORA ALLEGRO 2 BR”,”N”, “2”, “01,01”)MSCBSAYBAR(22,03,Strzero(nX,10), , ,8.36,.F.,.T.,.F.,,3,2)MSCBEND()NextMSCBCLOSEPRINTER()Return
4.1.2. Exemplo 02
User Function EXDPL2()Local cPortacPorta := “COM1:9600,N,8,2”MSCBPRINTER(“ALLEGRO”,cPorta, ,35 ,.f.)MSCBBEGIN()MSCBBOX(02,01,100,30)aConteudo :={{“01″,”07893316010411”},;{“10”,”0000970100″+MSCB128B()+”1″+MSCB128C()},;{“37″,”0004”},;{“21″,”000494″}}MSCBSAYBAR(08,10,aConteudo,”N”,”MB07″,10,.F.,.T.,nil,’C’,3,2,.f.)MSCBEND()MSCBCLOSEPRINTER()Return
4.1.3. Exemplo 03
User Function ExDPL3()Local nXLocal cPorta := “COM1:9600,n,8,2”MSCBPRINTER(“ALLEGRO”,cPorta, , ,.f. )MSCBLOADGRF(“SIGA.BMP”)MSCBBEGIN(1,4,,.t.)MSCBBOX(02,01,76,34,1)MSCBLineH(30,30,76,1)MSCBLineH(02,23,76,1)MSCBLineH(02,15,76,1)MSCBLineV(30,23,34,1)MSCBGRAFIC(2,26,”SIGA”)MSCBSAY(33,31,’PRODUTO’,”N”,”2″,”01,01″)MSCBSAY(33,27,”CODIGO”,”N”,”2″,”01,01″)MSCBSAY(33,24, “@1”, “N”, “2”, “01,01”)MSCBSAY(05,20,”DESCRICAO”,”N”,”2″,”01,01″)MSCBSAY(05,16,”IMPRESSORA ALLEGRO 2 BR”,”N”, “2”, “01,01”)MSCBSAYBAR(22,03,”@2″,”N”,”MB07″,8.36,.F.,.T.,.F.,,3,2,.F.)MSCBEND() For nx:=1 to 10MSCBINFOETI(“PRODUTO”,”MODELO 1″)MSCBBEGIN(10,,,.F.)MSCBVAR(“@1”,StrZero(nX,10))MSCBVAR(“@2″,StrZero(nX,10))MSCBEND()Next MSCBBEGIN(1,4,NIL,NIL)MSCBBOX(02,01,76,34,1)MSCBLineH(30,30,76,1)MSCBLineH(02,23,76,1)MSCBLineH(02,15,76,1)MSCBLineV(30,23,34,1)MSCBGRAFIC(2,26,”SIGA”)MSCBSAY(33,31,’TESTE FINAL’,”N”,”2″,”01,01″)MSCBSAY(33,27,”CODIGO”,”N”,”2″,”01,01″)MSCBSAY(33,24, “000001”, “N”, “2”, “01,01”)MSCBSAY(05,20,”DESCRICAO”,”N”,”2″,”01,01″)MSCBSAY(05,16,”IMPRESSORA ALLEGRO 2 BR”,”N”, “2”, “01,01”)MSCBSAYBAR(22,03,”000001″,”N”,”MB07″,8.36,.F.,.T.,.F.,,3,2,.F.)MSCBEND() MSCBCLOSEPRINTER()Return
4.2. Padrão Eltron
4.2.1. Exemplo 01
User Function EXEPL1()Local nXLocal cPorta:=”LPT1″MSCBPRINTER(“ELTRON”,cPorta,,,.F.)MSCBLOADGRF(“SIGA.PCX”)For nx:=1 to 3MSCBINFOETI(“Exemplo 1″,”MODELO 1″)MSCBBEGIN(1,6)MSCBGRAFIC(04,02,”SIGA”)MSCBBOX(05,01,76,30,2)MSCBLineH(30,06,71,2)MSCBLineH(05,12,71,2)MSCBLineH(05,18,71,2)MSCBLineV(30,1,12,2)MSCBSAY(33,02,’PRODUTO’,”N”,”2″,”1,2″)MSCBSAY(33,07,”CODIGO”, “N”, “1”, “1,1”)MSCBSAY(33,09,Strzero(nX,10), “N”,”1″,”1,2″)MSCBSAY(07,13,”DESCRICAO”,”N”,”1″,”1,1″)MSCBSAY(07,15,”IMPRESSORA ELTRON”,”N”,”1″,”1,2″)MSCBSAYBAR(28,19,Strzero(nX,10),’N’,’MB07′,06,.f.,.t.,,,2,2)MSCBEND()NextMSCBCLOSEPRINTER()Return
4.2.2. Exemplo 02
User Function EXEPL2()Local cPorta := “LPT1”MSCBPRINTER(“ELTRON”,cPorta,,,.F.)MSCBBEGIN(1,6)MSCBBOX(05,03,105,30,2)aConteudo :={{“01″,”07893316010411”},;{“10”,”0000970100″+MSCB128B()+”1″+MSCB128C()},;{“37″,”0004”},;{“21″,”000494″}}MSCBSAYBAR(08,08,aConteudo,’N’,’MB07′,08,,.T.,NIL,”C”,2,2,,,,)MSCBEND()MSCBCLOSEPRINTER()Return
4.2.3. Exemplo 03
User Function EXEPL3()Local cPorta := “LPT1”Local nX MSCBPRINTER(“ELTRON”,cPorta,,,.F.)MSCBLOADGRF(“SIGA.PCX”)For nx:=1 to 1MSCBINFOETI(“ETI TESTE”,”PEQ”)MSCBBEGIN(3,6,,.t.)MSCBGRAFIC(04,02,”SIGA”)MSCBBOX(05,01,76,30,2)MSCBLineH(30,06,71,2)MSCBLineH(05,12,71,2)MSCBLineH(05,18,71,2)MSCBLineV(30,1,12,2) //Monta Linha VerticalMSCBSAY(33,02,’PRODUTO’,”N”,”2″,”1,2″)MSCBSAY(33,07,”CODIGO”, “N”, “1”, “1,1”)MSCBSAY(33 ,09 ,”0000001″, “N” , “1” , “1,2”,.T. ,.t. ,’+4′)MSCBSAY(07,13,”@1″,”N”,”1″,”1,1″)MSCBSAY(07,15,”IMPRESSORA ELTRON TLP2742″,”N” ,”1″ , “1,2”)MSCBSAYBAR(28,19,”@2″ ,’N’ ,’MB07′ ,06 ,.f. ,.t. , , ,2 ,2)MSCBEND()NextFor nx:=1 to 4MSCBINFOETI(“ETI TESTE”,”PEQ”)MSCBBEGIN(10,,,.F.)MSCBVAR(“@1”,StrZero(nX,10))MSCBVAR(“@2”,StrZero(nX,10))MSCBEND()Next MSCBINFOETI(“ETI TESTE”,”PEQ”)MSCBBEGIN(3,6)MSCBGRAFIC(04,02,”SIGA”)MSCBBOX(05,01,76,30,2)MSCBLineH(30,06,71,2)MSCBLineH(05,12,71,2)MSCBLineH(05,18,71,2)MSCBLineV(30,1,12,2) //Monta Linha VerticalMSCBSAY(33,02,’PRODUTO’,”N”,”2″,”1,2″)MSCBSAY(33,07,”CODIGO”, “N”, “1”, “1,1”)MSCBSAY(33,09,”0000001″, “N” , “1” , “1,2”,.T. ,.F. ,’+4′)MSCBSAY(07,13,”teste da folha de rosto”,”N”,”1″,”1,1″)MSCBSAY(07,15,”IMPRESSORA ELTRON TLP2742″,”N” ,”1″ , “1,2”)MSCBSAYBAR(28,19,”0000001″ ,’N’ ,’MB07′,06 ,.f. ,.t. , ,”C” ,2 ,2 ,.t. )MSCBEND() MSCBCLOSEPRINTER()Return
4.3. Padrão Intermec
4.3.1. Exemplo 01
User Function ExIPL1()Local nXLocal cPorta := “COM1:19200,E,7,1” MSCBPRINTER(“3600-8”,cPorta,,40,.f. )MSCBLOADGRF(“SIGA.UDC”)For nx:=1 to 3MSCBINFOETI(“Exemplo 1″,”MODELO 1″)MSCBBEGIN(1,5,,NIL)MSCBBOX(01,02,34,76,1)MSCBLineV(30,30,76,1)MSCBLineV(23,02,76,1)MSCBLineV(15,02,76,1)MSCBLineH(23,30,34,1)MSCBGRAFIC(34,02,”SIGA”,.T.)MSCBSAY(32,33,’PRODUTO’,”R”,”2″,”01,01″)MSCBSAY(29,33,”CODIGO”,”R”,”2″,”01,01″)MSCBSAY(26 ,33,StrZero(nX,10), “R”, “2” ,”01,01″)MSCBSAY(22,05,”DESCRICAO”,”R”,”2″,”01,01″)MSCBSAY(19,05,”IMPRESSORA INTERMEC”,”R”, “2”, “01,01”)MSCBSAYBAR(12,22,StrZero(nX,10),”R”,”MB07″,8.36,.F.,.T.,.F.,,2,2)MSCBEND()NextMSCBCLOSEPRINTER()Return
4.3.2. Exemplo 02
User Function EXIPL2()Local cPorta := “COM1:19200,N,8,1”MSCBPRINTER(“3600-8”,cPorta, ,35 ,.f.)MSCBBEGIN()MSCBBOX(02,01,30,100,3)aConteudo :={{“01″,”07893316010411”},;{“10”,”0000970100″+MSCB128B()+”1″+MSCB128C()},;{“37″,”0004”},;{“21″,”000494″}}MSCBSAYBAR(20,08,aConteudo,”R”,”MB07″,10,.F.,.T.,nil,’C’,2,1,.f.)MSCBEND()MSCBCLOSEPRINTER()Return
4.3.3. Exemplo 03
User Function ExIPL3()Local nXLocal cPorta cPorta := “COM1:19200,E,7,1”MSCBPRINTER(“I3600”,cPorta,NIL ,40 ,.f. )MSCBLOADGRF(“SIGA.UDC”) MSCBBEGIN(1,5,,.T.)MSCBINFOETI(“PRODUTO”,”MODELO 1″)MSCBBOX(01,02,34,76,1)MSCBLineV(30,30,76,1)MSCBLineV(23,02,76,1)MSCBLineV(15,02,76,1)MSCBLineH(23,30,34,1)MSCBGRAFIC(34,02,”SIGA”)MSCBSAY(32,33,’PRODUTO’,”R”,”2″,”01,01″)MSCBSAY(29,33,”CODIGO”,”R”,”2″,”01,01″)MSCBSAY(26,33,”@1″, “R”, “2”, “01,01”)MSCBSAY(22,05,”DESCRICAO”,”R”,”2″,”01,01″)MSCBSAY(19,05,”PARAFUSO 1/4 POLEGADAS”,”R”, “2”, “01,01”)MSCBSAYBAR(12,22,”@2″,”R”,”MB07″,8.36,.F.,.T.,.F.,,2,2)MSCBEND() For nx:=1 to 10MSCBBEGIN(,,,.F.)MSCBINFOETI(“PRODUTO”,”MODELO 1″)MSCBVAR(“@1”,StrZero(nX,10))MSCBVAR(“@2”,”999″+StrZero(nX,7))MSCBEND()Next MSCBINFOETI(“PRODUTO”,”MODELO 1″)MSCBBEGIN(2,6,,NIL)MSCBBOX(01,02,34,76,1)MSCBLineV(30,30,76,1)MSCBLineV(23,02,76,1)MSCBLineV(15,02,76,1)MSCBLineH(23,30,34,1)MSCBGRAFIC(2,26,”SIGA”,.T.)MSCBSAY(32,33,’PRODUTO’,”R”,”2″,”01,01″)MSCBSAY(29,33,”CODIGO”,”R”,”2″,”01,01″)MSCBSAY(26,33,”000010″, “R” , “2” , “01,01”,,.t.,”2″)MSCBSAY(22,05,”DESCRICAO”,”R”,”2″,”01,01″)MSCBSAY(19,05,”PARAFUSO 1/4 POLEGADAS”,”R”, “2”, “01,01”)MSCBSAYBAR(12,22,”000010″,”R”,”MB07″,8.36,.F.,.T.,.F.,,2,2,.F.)MSCBEND()MSCBCLOSEPRINTER()Return
4.4. Padrão Zebra
4.4.1. Exemplo 01
User Function EXZPL1()Local nXLocal cPortacPorta := “COM1:9600,N,8,1”MSCBPRINTER(“S500-8”,cPorta, , 40 ,.f.)MSCBLOADGRF(“SIGA.GRF”)For nx:=1 to 3MSCBINFOETI(“Exemplo 1″,”MODELO 1″)MSCBBEGIN(1,6)MSCBBOX(02,01,76,35)MSCBLineH(30,05,76,3)MSCBLineH(02,13,76,3,”B”)MSCBLineH(02,20,76,3,”B”)MSCBLineV(30,01,13)MSCBGRAFIC(2,3,”SIGA”)MSCBSAY(33,02,’PRODUTO’,”N”,”0″,”025,035″)MSCBSAY(33,06,”CODIGO”,”N”,”A”,”015,008″)MSCBSAY(33,09, Strzero(nX,10), “N”, “0”, “032,035”)MSCBSAY(05,17,”IMPRESSORA ZEBRA S500-8″,”N”, “0”, “020,030”)MSCBSAYBAR(23,22,Strzero(nX,10),”MB07″,”C”,8.36,.F.,.T.,.F.,,2,1)MSCBEND()NextMSCBCLOSEPRINTER()Return
4.4.2. Exemplo 02
User Function EXZPL2()Local cPortacPorta := “COM1:9600,N,8,1”MSCBPRINTER(“S500-8”,cPorta,,35)MSCBBEGIN(1,6)MSCBBOX(02,01,76,34,1)aConteudo :={{“01″,”07893316010411”},;{“10”,”0000970100″+MSCB128B()+”1″+MSCB128C()},;{“37″,”0004”},;{“21″,”000494″}}MSCBSAYBAR(08,10,aConteudo,”N”,”MB07″,10,.F.,.T.,.F.,”C”,2,1,.F.)MSCBEND()MSCBCLOSEPRINTER()Return
O suporte ao MARS (Multiple Active Result Sets) está disponível a partir do SQL Native Client. Esse recurso é necessário para a redução da quantidade de novas conexões abertas a cada nova query submetida pela aplicação. Diante do exposto não utilize o SQL Server ODBC Driver. Utilize o SQL Native Client ao criar uma fonte de dados ODBC para acesso ao Microsoft SQL Server.
Lembrando que deve-se comparar a DBapi.DLL do Appserver / DBacess e replicar o mais atualizado e copiá-lo nas duas pastas.
Entrar no prompt do S.O. e digitar o comando: Telnet ipdoserver e irá acessar o módulo SIGAACD.
Obs: Isso é possivel pois a comunicação entre o ERP e o Coletor é feita através do protocolo VT100 que por sua vez é o protocolo do Telnet.
Exemplo de um fonte: #INCLUDE “sigaacd.ch” #include “protheus.ch” #include “apvt100.ch”
User Function ColetaLoja() Local aUser Local dGetData := MsDate() Local tRealIni := Time() Local aEmprx := {} Local aEmpChoice := Array(2) Local cTmp Local nPos Local cArqMenu Local nMaxRow := Val(GetPvProfString( “TELNET”, “MAXROW” , “8” , GetADV97())) Local nMaxCol := Val(GetPvProfString( “TELNET”, “MAXCOL” , “20”, GetADV97()))
P.E. CBRETEAN executado após o Enter na tela de conferencia física no coletor (ACDV120).
Entrada tipo: EAN via coletor
Retorno tipo: Array PARAMIXB
aRet “{código do produto,quantidade,lote,data de validade, numero de série}”
Para pegar os dados digitados e efetuar uma busca via Dbseek na SD1 e verificar se o produto tem lote e preencher o array de retorno, ele trás um array PARAMIXB
Local cIdEnt := ‘000003’ Local nIDJob := 4 //4 – e-Mail Local cWFModelo :=’55’ //’ALL’ local cLock := “_debug_job” local aLock := {} local aEntSkip := {}
//User Function usado para criar funções similres a sub Programas
User Function Exerc01()
Local aArray := {{“Maria”,10,7,15,31},;
{“Gisele”,26,26,26,26},;
{“Cleiton”,9,9,9,9},;
{“Jose”,15,16,21,33}}
Local nX := 0
Local cString:=””
for nX := 1 To Len (aArray)
Msginfo(Calcula (aArray[nX]))
Next
Static Function Calcula (aArray)
Local nMedia:=0
Local cStatus:=””
Local cString:=””
nMedia := (aArray[2]+aArray[3]+aArray[4]+aArray[5])/4
Do case
Case nMedia >=25
cStatus :=”Aprovado”
case nMedia <10
cStatus :=”Reprovado”
case nMedia>=10 .And. nMedia <25
cStatus:=”Exame”
#INCLUDE “rwmake.ch”
#INCLUDE “topconn.ch”
/*/
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³NOVO2 º Autor ³ AP6 IDE º Data ³ 03/03/12 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDescricao ³ Codigo gerado pelo AP6 IDE. º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ AP6 IDE º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
/*/
User Function RELPROQ
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Declaracao de Variaveis ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Local cDesc1 := “Este programa tem como objetivo imprimir relatorio ”
Local cDesc2 := “de acordo com os parametros informados pelo usuario.”
Local cDesc3 := “RELATORIO DE PRODUTO x QUANTIDADE”
Local cPict := “”
Local titulo := “RELATORIO DE PRODUTO x QUANTIDADE”
Local nLin := 80
Local Cabec1 := “PRODUTO: QTDE. SAIDA: QTDE. ENTRADA:”
Local Cabec2 := “”
Local imprime := .T.
Local aOrd := {}
Private lEnd := .F.
Private lAbortPrint := .F.
Private CbTxt := “”
Private limite := 80
Private tamanho := “P”
Private nomeprog := “NOME” // Coloque aqui o nome do programa para impressao no cabecalho
Private nTipo := 18
Private aReturn := { “Zebrado”, 1, “Administracao”, 2, 2, 1, “”, 1}
Private nLastKey := 0
Private cbtxt := Space(10)
Private cbcont := 00
Private CONTFL := 01
Private m_pag := 01
Private wnrel := “NOME” // Coloque aqui o nome do arquivo usado para impressao em disco
Private cString := “SB1”
dbSelectArea(“SB1″)
dbSetOrder(1)
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Monta a interface padrao com o usuario… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Processamento. RPTSTATUS monta janela com a regua de processamento. ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
/*/
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºFun‡„o ³RUNREPORT º Autor ³ AP6 IDE º Data ³ 03/03/12 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDescri‡„o ³ Funcao auxiliar chamada pela RPTSTATUS. A funcao RPTSTATUS º±±
±±º ³ monta a janela com a regua de processamento. º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ Programa principal º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
/*/
Static Function RunReport(Cabec1,Cabec2,Titulo,nLin)
Local nOrdem
Local nTotal :=0
Local cEst := “”
Local cQuery := “”
Local nSubTotal :=0
dbSelectArea(cString)
dbSetOrder(1)
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ SETREGUA -> Indica quantos registros serao processados para a regua ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
SetRegua(RecCount())
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Posicionamento do primeiro registro e loop principal. Pode-se criar ³
//³ a logica da seguinte maneira: Posiciona-se na filial corrente e pro ³
//³ cessa enquanto a filial do registro for a filial corrente. Por exem ³
//³ plo, substitua o dbGoTop() e o While !EOF() abaixo pela sintaxe: ³
//³ ³
//³ dbSeek(xFilial()) ³
//³ While !EOF() .And. xFilial() == A1_FILIAL ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
//Cria um indice temporario para o estado ao cria o indice ele é ordenado automaticamente
//IndRegua (“SA2″, cArqTemp,”A2_FILIAL+A2_EST”)
//FERASE (cArqTemp+OrdBagExt())
//=========================================================================
//==========================================================================
//QUERY
/*
cAlias := GetNextAlias()
cQuery := ‘ SELECT B1_COD,B1_DESC,SUM(D1_QUANT) ENTRADA, SUM(D2_QUANT) SAIDA ‘
cQuery += ” FROM SB1990 SB1, SD1990 SD1, SD2990 SD2 ”
cQuery += ” WHERE B1_COD = D1_COD AND B1_COD = D2_COD AND ”
cQuery += ” SB1.D_E_L_E_T_=” AND SD1.D_E_L_E_T_=” SD2.AND D_E_L_E_T_=” ”
cQuery += ” GROUP BY B1_COD,B1_DESC ”
cQuery += ” ORDER BY B1_COD ”
TCQUERY cQuery NEW ALIAS (cAlias)
*/
//=============================================================================
dbSelectArea(“SB1”)
dbGoTop()
cEst := B1_COD // Inicia a variavel que acumula o com o 1° estado vindo da tabela SA2
cCodProd := B1_COD
While !EOF()
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Verifica o cancelamento pelo usuario… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
If lAbortPrint
@nLin,00 PSAY “*** CANCELADO PELO OPERADOR ***”
Exit
Endif
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Impressao do cabecalho do relatorio. . . ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
If nLin > 55 // Salto de Página. Neste caso o formulario tem 55 linhas…
Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo)
nLin := 8
Endif
// Coloque aqui a logica da impressao do seu programa…
// Se o primeiro estado igual ao proximo imprime se não inicia contador de subtotal
/*
IF cEst B1_COD
nLin := nLin + 3
@ nLin, 00 PSAY “TOTAL : “+ cValToChar(nSubTotal)
nLin := nLin + 2
nSubTotal := 0
cEst := B1_COD
ENDIF
*/
// Utilize PSAY para saida na impressora. Por exemplo:
// @nLin,00 PSAY SA1->A1_COD
nLin := nLin + 1 // Avanca a linha de impressao
// nTotal := nTotal + 1 //Totalizador de registros
// nSubTotal := nSubTotal + 1 //Totalizador de subtotais de registros
dbSelectArea(“SB1”)
dbSkip() // Avanca o ponteiro do registro no arquivo
EndDo
@ nLin+3,00 PSAY “TOTAL : “+ cValToChar(nSubTotal)
@ nLin+4,00 PSAY “TOTAL GERAL : “+ cValToChar(nTotal)
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Finaliza a execucao do relatorio… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
SET DEVICE TO SCREEN
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Se impressao em disco, chama o gerenciador de impressao… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
If aReturn[5]==1
dbCommitAll()
SET PRINTER TO
OurSpool(wnrel)
Endif
MS_FLUSH()
Return
Static FUNCTION MySaldo(cCodProd)
Local cQuery := “”
Local aRetorno := {0,0}
Local cAliasD1 := GetNextAlias()
Local cAliasD2 := GetNextAlias()
cQuery := ” SELECT SUM(D1_QUANT) ENTRADA ”
cQuery += ” FROM “+RetSqlName(“SD1″) + ” ”
cQuery += ” WHERE D1_COD = ‘”+cCodProd+”‘ AND D_E_L_E_T_ = ” ”
TCQUERY cQuery NEW ALIAS (cAliasD1)
If !(cAliasD1)->(Eof())
aRetorno[1] := (cAliasD1)->Entrada
Endif
(cAliasD1)->(dbCloseArea())
cQuery := ” SELECT SUM(D2_QUANT) SAIDA ”
cQuery += ” FROM “+RetSqlName(“SD2″) + ” ”
cQuery += ” WHERE D2_COD = ‘”+cCodProd+”‘ AND D_E_L_E_T_ = ” ”
TCQUERY cQuery NEW ALIAS (cAliasD2)
If !(cAliasD2)->(Eof())
aRetorno[2] := (cAliasD2)->SAIDA
Endif
(cAliasD2)->(dbCloseArea())
////////////////////////////////////////////////////
/*
PONTO DE ENTRADA
RECLOCK(“SB5”,.T.) //INCLLUSÃO
RECLOCK(“SB5”,.F.) //EXCLUSÃO/ALTERAÇÃO
*/
////////////////////////////////////////////////////
user function MT010INC()
LOCAL aArea := GETAREA()
RECLOCK(“SB5”,.T.) //INCLLUSÃO
SB5->B5_FILIAL:= XFilial(“SB5”)
SB5->B5_COD:= SB1->B1_COD
SB5->B5_CEME:= SB1->B1_DESC
msginfo(“Voce acabou de incluir um produto”)
MSUNLOCK()
RestArea(aArea)
Return
#INCLUDE “rwmake.ch”
#INCLUDE “topconn.ch”
/*/
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³NOVO3 º Autor ³ AP6 IDE º Data ³ 03/03/12 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDescricao ³ Codigo gerado pelo AP6 IDE. º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ AP6 IDE º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
/*/
User Function RELFISCAL
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Declaracao de Variaveis ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Local cDesc1 := “Este programa tem como objetivo imprimir relatorio ”
Local cDesc2 := “de acordo com os parametros informados pelo usuario.”
Local cDesc3 := “RELETORIO DE NOTAS FISCAIS”
Local cPict := “”
Local titulo := “RELETORIO DE NOTAS FISCAIS”
Local nLin := 80
Local Cabec1 := “NF/SERIE: DT.EMISSAO: CLIENTE:”
Local Cabec2 := “ITEM PRODUTO QTDE. P.UNIT. P.TOTAL”
Local imprime := .T.
Local imprime := .T.
Local aOrd := {}
Private lEnd := .F.
Private lAbortPrint := .F.
Private CbTxt := “”
Private limite := 80
Private tamanho := “P”
Private nomeprog := “NOME” // Coloque aqui o nome do programa para impressao no cabecalho
Private nTipo := 18
Private aReturn := { “Zebrado”, 1, “Administracao”, 2, 2, 1, “”, 1}
Private nLastKey := 0
Private cbtxt := Space(10)
Private cbcont := 00
Private CONTFL := 01
Private m_pag := 01
Private wnrel := “NOME” // Coloque aqui o nome do arquivo usado para impressao em disco
Private cString := “SD2”
dbSelectArea(“SD2”)
dbSetOrder(1)
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Monta a interface padrao com o usuario… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
//PERGUNTE (“RELSD2″,.F.) // PERGUNTE
wnrel := SetPrint(cString,NomeProg,””,@titulo,cDesc1,cDesc2,cDesc3,.T.,aOrd,.T.,Tamanho,,.T.)
If nLastKey == 27
Return
Endif
SetDefault(aReturn,cString)
If nLastKey == 27
Return
Endif
nTipo := If(aReturn[4]==1,15,18)
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Processamento. RPTSTATUS monta janela com a regua de processamento. ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
/*/
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºFun‡„o ³RUNREPORT º Autor ³ AP6 IDE º Data ³ 03/03/12 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDescri‡„o ³ Funcao auxiliar chamada pela RPTSTATUS. A funcao RPTSTATUS º±±
±±º ³ monta a janela com a regua de processamento. º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ Programa principal º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
/*/
Static Function RunReport(Cabec1,Cabec2,Titulo,nLin)
Local nOrdem
Local nSubTotal :=0
Local nTotal :=0
Local cEst := “”
Local cQuery := “”
dbSelectArea(cString)
dbSetOrder(1)
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ SETREGUA -> Indica quantos registros serao processados para a regua ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
SetRegua(RecCount())
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Posicionamento do primeiro registro e loop principal. Pode-se criar ³
//³ a logica da seguinte maneira: Posiciona-se na filial corrente e pro ³
//³ cessa enquanto a filial do registro for a filial corrente. Por exem ³
//³ plo, substitua o dbGoTop() e o While !EOF() abaixo pela sintaxe: ³
//³ ³
//³ dbSeek(xFilial()) ³
//³ While !EOF() .And. xFilial() == A1_FILIAL ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
//Cria um indice temporario para o estado ao cria o indice ele é ordenado automaticamente
cArqTemp := CriaTrab(Nil,.F.)
//IndRegua (“SA2″, cArqTemp,”A2_FILIAL+A2_EST”)
//FERASE (cArqTemp+OrdBagExt())
//==========================================================================
//QUERY
cAlias := GetNextAlias() // Tabela temporaria para fazer o query
cQuery :=’ SELECT D2_ITEM,D2_DOC,D2_SERIE,D2_EMISSAO,D2_CLIENTE,D2_COD,D2_QUANT,D2_PRCVEN,D2_TOTAL,A1_NOME,B1_DESC ‘
cQuery +=” FROM ” + RetSqlName(“SD2″) + ” SD2, “+RetSqlName(“SA1″)+” SA1,”+RetSqlName(“SB1″)+” SB1″
cQuery +=” WHERE D2_CLIENTE = A1_COD AND D2_COD = B1_COD AND SD2.D_E_L_E_T_ = ” ”
TCQUERY cQuery NEW ALIAS (cAlias)
//=============================================================================
dbGoTop()
cEst := D2_CLIENTE // Inicia a variavel que acumula o com o 1° estado vindo da tabela SA2
While !EOF()
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Verifica o cancelamento pelo usuario… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
If lAbortPrint
@nLin,00 PSAY “*** CANCELADO PELO OPERADOR ***”
Exit
Endif
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Impressao do cabecalho do relatorio. . . ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
If nLin > 55 // Salto de Página. Neste caso o formulario tem 55 linhas…
Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo)
nLin := 8
Endif
// Coloque aqui a logica da impressao do seu programa…
// Se o primeiro estado igual ao proximo imprime se não inicia contador de subtotal
IF cEst D2_CLIENTE
nLin := nLin + 3
@ nLin, 00 PSAY “TOTAL : “+ cValToChar(nSubTotal)
nLin := nLin + 2
nSubTotal := 0
cEst := D2_CLIENTE
ENDIF
// Utilize PSAY para saida na impressora. Por exemplo:
// @nLin,00 PSAY SA1->A1_COD
nLin := nLin + 1 // Avanca a linha de impressao
nTotal := nTotal + 1 //Totalizador de registros
nSubTotal := nSubTotal + 1 //Totalizador de subtotais de registros
dbSkip() // Avanca o ponteiro do registro no arquivo
EndDo
@ nLin+3,00 PSAY “TOTAL : “+ cValToChar(nSubTotal)
@ nLin+4,00 PSAY “TOTAL GERAL : “+ cValToChar(nTotal)
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Finaliza a execucao do relatorio… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
SET DEVICE TO SCREEN
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Se impressao em disco, chama o gerenciador de impressao… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
If aReturn[5]==1
dbCommitAll()
SET PRINTER TO
OurSpool(wnrel)
Endif
select D2_ITEM,D2_DOC,D2_SERIE,D2_EMISSAO,D2_CLIENTE,D2_COD,D2_QUANT,D2_PRCVEN,D2_TOTAL,A1_NOME,B1_DESC
FROM SD2990,SA1990,SB1990
WHERE D2_CLIENTE = A1_COD AND D2_COD = B1_COD
AND SD2 D_E_L_E_T = ”
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³NOVO2 º Autor ³ AP6 IDE º Data ³ 25/02/12 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDescricao ³ Codigo gerado pelo AP6 IDE. º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ AP6 IDE º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function RELF
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Declaracao de Variaveis ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Local cDesc1 := “Este programa tem como objetivo imprimir relatorio ”
Local cDesc2 := “de acordo com os parametros informados pelo usuario.”
Local cDesc3 := “CADASTRO DE FORNECEDORES”
Local cPict := “”
Local titulo := “CADASTRO DE FORNECEDORES”
Local nLin := 80
Local Cabec1 := “CODIGO NOME UF”
Local Cabec2 := “”
Local imprime := .T.
Local aOrd := {}
Private lEnd := .F.
Private lAbortPrint := .F.
Private CbTxt := “”
Private limite := 80
Private tamanho := “P”
Private nomeprog := “NOME” // Coloque aqui o nome do programa para impressao no cabecalho
Private nTipo := 18
Private aReturn := { “Zebrado”, 1, “Administracao”, 2, 2, 1, “”, 1}
Private nLastKey := 0
Private cbtxt := Space(10)
Private cbcont := 00
Private CONTFL := 01
Private m_pag := 01
Private wnrel := “NOME” // Coloque aqui o nome do arquivo usado para impressao em disco
Private cString := “SA2”
dbSelectArea(“SA2”)
dbSetOrder(1)
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Monta a interface padrao com o usuario… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Processamento. RPTSTATUS monta janela com a regua de processamento. ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºFun‡„o ³RUNREPORT º Autor ³ AP6 IDE º Data ³ 25/02/12 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDescri‡„o ³ Funcao auxiliar chamada pela RPTSTATUS. A funcao RPTSTATUS º±±
±±º ³ monta a janela com a regua de processamento. º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ Programa principal º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
Static Function RunReport(Cabec1,Cabec2,Titulo,nLin)
Local nOrdem
Local nSubTotal :=0
Local nTotal :=0
Local cEst := “”
Local cQuery := “”
dbSelectArea(cString)
dbSetOrder(1)
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ SETREGUA -> Indica quantos registros serao processados para a regua ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
SetRegua(RecCount())
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Posicionamento do primeiro registro e loop principal. Pode-se criar ³
//³ a logica da seguinte maneira: Posiciona-se na filial corrente e pro ³
//³ cessa enquanto a filial do registro for a filial corrente. Por exem ³
//³ plo, substitua o dbGoTop() e o While !EOF() abaixo pela sintaxe: ³
//³ ³
//³ dbSeek(xFilial()) ³
//³ While !EOF() .And. xFilial() == A1_FILIAL ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
//=========================================================================
//Cria um indice temporario para o estado ao cria o indice ele é ordenado automaticamente
cArqTemp := CriaTrab(Nil,.F.)
//IndRegua (“SA2″, cArqTemp,”A2_FILIAL+A2_EST”)
//FERASE (cArqTemp+OrdBagExt())
//==========================================================================
/*
cAlias := GetNextAlias() // Tabela temporaria para fazer o query
cQuery := ” SELECT * FROM “+RetSqlName(“SA2″) // Seleciona qual empresa da query da tabela
cQuery += ” WHERE D_E_L_E_T_ = ” ”
cQuery += ” ORDER BY A2_FILIAL, A2_EST”
*/
cAlias := GetNextAlias() // Tabela temporaria para fazer o query
cQuery := ” SELECT * FROM “+RetSqlName(“SA2″) // Seleciona qual empresa da query da tabela
cQuery += ” WHERE A2_COD between ‘”+MV_PAR01+”‘ AND ‘”+MV_PAR02+”‘”
cQuery += ” ORDER BY A2_FILIAL, A2_COD”
TCQUERY cQuery NEW ALIAS (cAlias)
dbGoTop()
cEst := A2_EST // Inicia a variavel que acumula o estado com o 1° estado vindo da tabela SA2
While !EOF()
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Verifica o cancelamento pelo usuario… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
If lAbortPrint
@nLin,00 PSAY “*** CANCELADO PELO OPERADOR ***”
Exit
Endif
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Impressao do cabecalho do relatorio. . . ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
If nLin > 55 // Salto de Página. Neste caso o formulario tem 55 linhas…
Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo)
nLin := 8
Endif
// Coloque aqui a logica da impressao do seu programa…
// Se o primeiro estado igual ao proximo imprime se não inicia contador de subtotal
IF cEst A2_EST
nLin := nLin + 3
@ nLin, 00 PSAY “TOTAL : “+ cValToChar(nSubTotal)
nLin := nLin + 2
nSubTotal := 0
cEst := A2_EST
ENDIF
// Utilize PSAY para saida na impressora. Por exemplo:
// @nLin,00 PSAY SA1->A1_COD
nLin := nLin + 1 // Avanca a linha de impressao
nTotal := nTotal + 1 //Totalizador de registros
nSubTotal := nSubTotal + 1 //Totalizador de subtotais de registros
dbSkip() // Avanca o ponteiro do registro no arquivo
EndDo
@ nLin+3,00 PSAY “TOTAL : “+ cValToChar(nSubTotal)
@ nLin+4,00 PSAY “TOTAL GERAL : “+ cValToChar(nTotal)
//dbclosearea
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Finaliza a execucao do relatorio… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
SET DEVICE TO SCREEN
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Se impressao em disco, chama o gerenciador de impressao… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
If aReturn[5]==1
dbCommitAll()
SET PRINTER TO
OurSpool(wnrel)
Endif
/*/
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³NOVO3 º Autor ³ AP6 IDE º Data ³ 25/02/12 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDescricao ³ Codigo gerado pelo AP6 IDE. º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ AP6 IDE º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
/*/
User Function RELP
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Declaracao de Variaveis ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Local cDesc1 := “Este programa tem como objetivo imprimir relatorio ”
Local cDesc2 := “de acordo com os parametros informados pelo usuario.”
Local cDesc3 := “CADASTRO DE PRODUTOS”
Local cPict := “”
Local titulo := “CADASTRO DE PRODUTOS”
Local nLin := 80
Local Cabec1 := “CODIGO NOME TIPO”
Local Cabec2 := “”
Local imprime := .T.
Local aOrd := {}
Private lEnd := .F.
Private lAbortPrint := .F.
Private CbTxt := “”
Private limite := 80
Private tamanho := “P”
Private nomeprog := “NOME” // Coloque aqui o nome do programa para impressao no cabecalho
Private nTipo := 18
Private aReturn := { “Zebrado”, 1, “Administracao”, 2, 2, 1, “”, 1}
Private nLastKey := 0
Private cbtxt := Space(10)
Private cbcont := 00
Private CONTFL := 01
Private m_pag := 01
Private wnrel := “NOME” // Coloque aqui o nome do arquivo usado para impressao em disco
Private cString := “SB1”
dbSelectArea(“SB1”)
dbSetOrder(1)
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Monta a interface padrao com o usuario… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Processamento. RPTSTATUS monta janela com a regua de processamento. ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
/*/
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºFun‡„o ³RUNREPORT º Autor ³ AP6 IDE º Data ³ 25/02/12 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDescri‡„o ³ Funcao auxiliar chamada pela RPTSTATUS. A funcao RPTSTATUS º±±
±±º ³ monta a janela com a regua de processamento. º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ Programa principal º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
/*/
Static Function RunReport(Cabec1,Cabec2,Titulo,nLin)
Local nOrdem
Local nSubTotal :=0
Local nTotal :=0
Local cEst := “”
Local cQuery := “”
dbSelectArea(cString)
dbSetOrder(1)
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ SETREGUA -> Indica quantos registros serao processados para a regua ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
SetRegua(RecCount())
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Posicionamento do primeiro registro e loop principal. Pode-se criar ³
//³ a logica da seguinte maneira: Posiciona-se na filial corrente e pro ³
//³ cessa enquanto a filial do registro for a filial corrente. Por exem ³
//³ plo, substitua o dbGoTop() e o While !EOF() abaixo pela sintaxe: ³
//³ ³
//³ dbSeek(xFilial()) ³
//³ While !EOF() .And. xFilial() == A1_FILIAL ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
//=========================================================================
//Cria um indice temporario para o estado ao cria o indice ele é ordenado automaticamente
cArqTemp := CriaTrab(Nil,.F.)
//IndRegua (“SA2″, cArqTemp,”A2_FILIAL+A2_EST”)
//FERASE (cArqTemp+OrdBagExt())
//==========================================================================
/*
cAlias := GetNextAlias() // Tabela temporaria para fazer o query
cQuery := ” SELECT * FROM “+RetSqlName(“SA2″) // Seleciona qual empresa da query da tabela
cQuery += ” WHERE D_E_L_E_T_ = ” ”
cQuery += ” ORDER BY A2_FILIAL, A2_EST”
*/
cAlias := GetNextAlias() // Tabela temporaria para fazer o query
cQuery := ” SELECT * FROM “+RetSqlName(“SB1″) // Seleciona qual empresa da query da tabela
cQuery += ” WHERE B1_COD between ‘”+MV_PAR01+”‘ AND ‘”+MV_PAR02+”‘”
cQuery += ” ORDER BY B1_FILIAL, B1_COD”
TCQUERY cQuery NEW ALIAS (cAlias)
dbGoTop()
cEst := B1_TIPO // Inicia a variavel que acumula o estado com o 1° estado vindo da tabela SA2
While !EOF()
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Verifica o cancelamento pelo usuario… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
If lAbortPrint
@nLin,00 PSAY “*** CANCELADO PELO OPERADOR ***”
Exit
Endif
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Impressao do cabecalho do relatorio. . . ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
If nLin > 55 // Salto de Página. Neste caso o formulario tem 55 linhas…
Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo)
nLin := 8
Endif
// Coloque aqui a logica da impressao do seu programa…
// Se o primeiro estado igual ao proximo imprime se não inicia contador de subtotal
IF cEst B1_TIPO
nLin := nLin + 3
@ nLin, 00 PSAY “TOTAL : “+ cValToChar(nSubTotal)
nLin := nLin + 2
nSubTotal := 0
cEst := B1_TIPO
ENDIF
// Utilize PSAY para saida na impressora. Por exemplo:
// @nLin,00 PSAY SA1->A1_COD
nLin := nLin + 1 // Avanca a linha de impressao
nTotal := nTotal + 1 //Totalizador de registros
nSubTotal := nSubTotal + 1 //Totalizador de subtotais de registros
dbSkip() // Avanca o ponteiro do registro no arquivo
EndDo
@ nLin+3,00 PSAY “TOTAL : “+ cValToChar(nSubTotal)
@ nLin+4,00 PSAY “TOTAL GERAL : “+ cValToChar(nTotal)
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Finaliza a execucao do relatorio… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
SET DEVICE TO SCREEN
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Se impressao em disco, chama o gerenciador de impressao… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
If aReturn[5]==1
dbCommitAll()
SET PRINTER TO
OurSpool(wnrel)
Endif
#INCLUDE “protheus.ch” /*/ ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±± ±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±± ±±ºPrograma ³NOVO3 º Autor ³ AP6 IDE º Data ³ 11/02/12 º±± ±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±± ±±ºDescricao ³ Codigo gerado pelo AP6 IDE. º±± ±±º ³ º±± ±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±± ±±ºUso ³ AP6 IDE º±± ±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±± ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±± ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß /*/ User Function RELCLIENTES //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³ Declaracao de Variaveis ³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Local cDesc1 := “Este programa tem como objetivo imprimir relatorio ” Local cDesc2 := “de acordo com os parametros informados pelo usuario.” Local cDesc3 := “CADASTRO DE CLIENTES” Local cPict := “” Local titulo := “CADASTRO DE CLIENTES” Local nLin := 80 Local Cabec1 := “CODIGO NOME UF” Local Cabec2 := “” Local imprime := .T. Local aOrd := {} Private lEnd := .F. Private lAbortPrint := .F. Private CbTxt := “” Private limite := 80 Private tamanho := “P” Private nomeprog := “NOME” // Coloque aqui o nome do programa para impressao no cabecalho Private nTipo := 18 Private aReturn := { “Zebrado”, 1, “Administracao”, 2, 2, 1, “”, 1} Private nLastKey := 0 Private cbtxt := Space(10) Private cbcont := 00 Private CONTFL := 01 Private m_pag := 01 Private wnrel := “NOME” // Coloque aqui o nome do arquivo usado para impressao em disco Private cString := “SA1” dbSelectArea(“SA1″) dbSetOrder(1) //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³ Monta a interface padrao com o usuario… ³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ wnrel := SetPrint(cString,NomeProg,””,@titulo,cDesc1,cDesc2,cDesc3,.T.,aOrd,.T.,Tamanho,,.T.) If nLastKey == 27 Return Endif SetDefault(aReturn,cString) If nLastKey == 27 Return Endif nTipo := If(aReturn[4]==1,15,18) //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³ Processamento. RPTSTATUS monta janela com a regua de processamento. ³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ RptStatus({|| RunReport(Cabec1,Cabec2,Titulo,nLin) },Titulo) Return /*/ ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±± ±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±± ±±ºFun‡„o ³RUNREPORT º Autor ³ AP6 IDE º Data ³ 11/02/12 º±± ±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±± ±±ºDescri‡„o ³ Funcao auxiliar chamada pela RPTSTATUS. A funcao RPTSTATUS º±± ±±º ³ monta a janela com a regua de processamento. º±± ±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±± ±±ºUso ³ Programa principal º±± ±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±± ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±± ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß /*/ Static Function RunReport(Cabec1,Cabec2,Titulo,nLin) Local nOrdem Local nTReg :=0 dbSelectArea(cString) dbSetOrder(1) //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³ SETREGUA -> Indica quantos registros serao processados para a regua ³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ SetRegua(RecCount()) //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³ Posicionamento do primeiro registro e loop principal. Pode-se criar ³ //³ a logica da seguinte maneira: Posiciona-se na filial corrente e pro ³ //³ cessa enquanto a filial do registro for a filial corrente. Por exem ³ //³ plo, substitua o dbGoTop() e o While !EOF() abaixo pela sintaxe: ³ //³ ³ //³ dbSeek(xFilial()) ³ //³ While !EOF() .And. xFilial() == A1_FILIAL ³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ dbGoTop() While !EOF() //end of file //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³ Verifica o cancelamento pelo usuario… ³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ If lAbortPrint @nLin,00 PSAY “*** CANCELADO PELO OPERADOR ***” Exit Endif //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³ Impressao do cabecalho do relatorio. . . ³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ If nLin > 55 // Salto de Página. Neste caso o formulario tem 55 linhas… Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo) nLin := 8 Endif // Coloque aqui a logica da impressao do seu programa… // Utilize PSAY para saida na impressora. Por exemplo: @nLin,00 PSAY SA1->A1_COD // @ para imprimir @nLin,10 PSAY SA1->A1_NOME nLin := nLin + 1 // Avanca a linha de impressao nTReg := nTreg + 1 dbSkip() // Avanca o ponteiro do registro no arquivo EndDo @ nLin+3,00 PSAY “TOTAL “+ cValToChar(nTReg) //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³ Finaliza a execucao do relatorio… ³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ SET DEVICE TO SCREEN //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³ Se impressao em disco, chama o gerenciador de impressao… ³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ If aReturn[5]==1 dbCommitAll() SET PRINTER TO OurSpool(wnrel) Endif MS_FLUSH() Return
For nX := 1 To Len (aArray)
Msginfo(CalculaReajusteSalarial (aArray[nX])) //Passando a linha do Array para a função calcula data (aArray[nX]))
Next
Return
//====================================================================================================================================================================
Static Function CalculaReajusteSalarial (aArray)
Local cStatus :=”
Local cString :=”
Local nReajuste :=0
Local nSalario :=aArray[2]
Local nTempoCasa:=aArray[3]
Do Case
//——————————ate 660
Case nSalario < 660
nReajuste:= nSalario * 1.15
If nTempoCasa > 2
nReajuste:= nReajuste * 1.08
cStatus:=”C/ Bonus”
else
cStatus:=”S/ Bonus”
Endif
//——————————-ate 1.000
Case nSalario < 1000
nReajuste:= nSalario * 1.10
If nTempoCasa > 2
nReajuste:= nReajuste * 1.08
cStatus:=”C/ Bonus”
else
cStatus:=”S/ Bonus”
Endif
//——————————-mais de 1.000
Otherwise
nReajuste:= nSalario * 1.06
If nTempoCasa > 2
nReajuste:= nReajuste * 1.08
cStatus:=”C/ Bonus”
else
cStatus:=”S/ Bonus”
Endif
endcase
User Function Exerc02()
Local nX := 0
Local aArray := {{“Maria” ,”21/04/74″},;
{ “Joao” ,”18/01/91″},;
{ “Pedro” ,”03/01/69″},;
{ “Joana” ,”06/09/93″},;
{ “Karina”,”27/12/90″},;
{ “Manoel”,”21/06/77″},;
{ “Silvio”,”07/07/95″}}
SET DATE BRITISH
For nX := 1 To Len (aArray)
Msginfo(CalculaData (aArray[nX])) //Passando a linha do Array para a função calcula data (aArray[nX]))
Next
Return
//====================================================================================================================================================================
Static Function CalculaData (aArray)
// Como verificar se o Array possui uma multiplicação de numeros igual a Par ou Impar
User Function Exerc01()
Local aArray := {{2,5},{1,7},{3,3},{9,2}}
Local nX := 0
for nX := 1 To Len (aArray)
Msginfo(CalculaPar (aArray[nX])) // (aArray[nX]))
Next
Return
//====================================================================================================================================================================
Static Function CalculaPar (aArray)
Local nSoma:=0
Local nX:=0
Local cStatus:=””
Local cString:=””
nSoma := (aArray[1]*aArray[2])
If mod(nSoma,2)==0
cStatus:=”Par”
else
cstatus:=”Impar”
Endif
//User Function usado para criar funções similres a sub Programas
User Function Exerc01()
Local aArray := {{“Maria”,10,7,15,31},;
{“Gisele”,26,26,26,26},;
{“Cleiton”,9,9,9,9},;
{“Jose”,15,16,21,33}}
Local nX := 0
for nX := 1 To Len (aArray)
Msginfo(Calcula (aArray[nX]))
Next
Return
//====================================================================================================================================================================
Static Function Calcula (aArray)
Local nMedia:=0
Local cStatus:=””
Local cString:=””
nMedia := (aArray[2]+aArray[3]+aArray[4]+aArray[5])/4
Do case
Case nMedia >=25
cStatus :=”Aprovado”
case nMedia <10
cStatus :=”Reprovado”
case nMedia>=10 .And. nMedia <25
cStatus:=”Exame”