Página 1 de 1

Programando para Clipper e Fivewin num mesmo .PRG

Enviado: 30 Set 2004 02:30
por rochinha
Amiguinhos

A tempos uso uma técnica para compilação de um mesmo .PRG contendo definições variadas para clientes diferentes.

Exemplo:

Tenho um .PRG em meus sistemas que imprime notas fiscais e suas rotinas são básicas, como:

- pegar dados do cliente
- pegar dados da transportadora
- pegar dados de produtos como ICMS, IPI, REDUCAO, etc
- pegar dados de fiscalização com natureza de operação, situação tributária, etc
- calcular os impostos.

Mas o problema é o posicionamento dos itens sendo impressos no corpo da nota, pois os mesmos tem posições variadas de coluna.

Então saquei a técnica usada nos .CH e do pré-processamento e posso compilar o mesmo .PRG para vários clientes tendo resultados diferentes, exemplo de um trecho:

Código: Selecionar todos

// Este arquivo esta no diretorio de fontes do cliente e contem uma linha
// que define o seu nome, ex: #DEFINE CLIENTEa
#include "NOTA.CH" 

//Nas linhas abaixo, conforme a definição contida dentro do NOTA.CH eu
//compilo o .PRG obtendo o resultado esperado.
#ifdef CLIENTEa
          ...
          @ 10,10 say NOME
          ...
#endif
#ifdef CLIENTEb
          ...
          @ 12,25 say NOME
          ...
#endif
Isto quer dizer, existe a possibilidade de compilar para duas plataformas diferentes num mesmo .PRG usado este método, ex:

Código: Selecionar todos

#DEFINE MsDOS
#ifdef MsDOS
          ...
          @ 10,10 say NOME
          ...
#else
          ...
          REDEFINE say NOME
          ...
#endif
O que se deve levar em consideração é o uso de funções particulares, as UDFs( User Defined Functions ), funções feitas pelo usuário.

Estas muitas vezes possuem apresentação de mensagens na tela do DOS usando @...SAY, então todas funções e procedures que emitem texto no DOS devem ser modificadas para entenderem estar sendo usadas no Fivewin, assim:

Código: Selecionar todos

...
FUNCTION mensagem( texto, tempo )
    #ifdef MsDOS
              @ 24,0 say texto
              inkey( tempo )
    #else
              if tempo <> NIL
                 MsgStop( OemToAnsi( texto ) )
              else
                 oWnd:SetMsg( OemToAnsi( texto ) )
              endif
    #endif
A variavel oWnd deve ser STATIC ou PUBLIC para ser carregada por todo o .PRG, exemplo:

Código: Selecionar todos

#ifdef MsDOS
#else
          #DEFINE "fivewin.ch
          Static oWnd
#endif

@braços :?)