... continuação...
Código: Selecionar todos
FUNCTION IMP_REL
LOCAL SAIDA := "S", LARGURA := 0, CONTAR, TAMANHO, TIPO, RESULTADO,;
MAS_CARA, POSICAO, CORINGA, DIFERENCA, LOCALIZA, ADD_MASCARA,;
FIL_TRA, CONTADOR, ACAO_MEMO := 1, INICIO, MAIOR_MEMO
PARA PROGRAMA, LINHA_PROG
TO_TALIZA := {}; CO_LUNAS := {}; RE_SUMO := {}; QUE_BRAS := {}
TOTALIZADOR := {}; CAMPOS_MEMO := {}; TAM_MEMO := {}; TOT_QUEBRA := {}
FOR CONTAR := 1 TO LEN( relatorio:QUEBRA )
AADD( TOT_QUEBRA, {} )
NEXT
IF relatorio:TIPO = COLUNAR
ASORT( relatorio:CONTEUDO,,, { | X, Y | X[ _COLUNA ] < Y[ _COLUNA ] } )
ENDIF
POSICAO := 01
relatorio:LINHA := relatorio:LIN_SUPERIOR
MAS_CARA := IIF( relatorio:TIPO = COLUNAR, 5, 4 )
FOR CONTAR := 1 TO LEN( relatorio:CONTEUDO )
IF relatorio:TIPO = COLUNAR
IF relatorio:CONTEUDO[ CONTAR ][ _COLUNA ] +;
LEN( relatorio:CONTEUDO[ CONTAR ][ _CABECALHO ] ) - 1 > LARGURA
LARGURA := relatorio:CONTEUDO[ CONTAR ][ _COLUNA ] +;
LEN( relatorio:CONTEUDO[ CONTAR ][ _CABECALHO ] ) - 1
ENDIF
ENDIF
IF NUM_RELATORIO = 0
MACRO := relatorio:CONTEUDO[ CONTAR ][ _DADOS ]
TIPO := VALTYPE( &MACRO )
ELSE
TIPO := VALTYPE( EVAL( relatorio:CONTEUDO[ CONTAR ][ _DADOS ] ) )
ENDIF
IF LEN( relatorio:CONTEUDO[ CONTAR ] ) = MAS_CARA
IF NUM_RELATORIO = 0
MACRO := relatorio:CONTEUDO[ CONTAR ][ _DADOS ]
TAMANHO := LEN( TRANS( &MACRO, relatorio:CONTEUDO[ CONTAR ][ MAS_CARA ] ) )
ELSE
TAMANHO := LEN( TRANS( EVAL( relatorio:CONTEUDO[ CONTAR ][ _DADOS ] ),;
relatorio:CONTEUDO[ CONTAR ][ MAS_CARA ] ) )
ENDIF
ELSE
IF TIPO = "N"
TAMANHO := 10
ELSEIF TIPO = "D"
TAMANHO := 8
ELSEIF TIPO = "L"
TAMANHO := 3
ELSEIF TIPO = "M"
TAMANHO := relatorio:MEMO_LARGURA
ELSE
IF NUM_RELATORIO = 0
MACRO := relatorio:CONTEUDO[ CONTAR ][ _DADOS ]
TAMANHO := LEN( &MACRO )
ELSE
TAMANHO := LEN( EVAL( relatorio:CONTEUDO[ CONTAR ][ _DADOS ] ) )
ENDIF
ENDIF
ENDIF
IF relatorio:TIPO = COLUNAR
IF relatorio:CONTEUDO[ CONTAR ][ _COLUNA ] + TAMANHO - 1 > LARGURA
LARGURA := relatorio:CONTEUDO[ CONTAR ][ _COLUNA ] + TAMANHO - 1
ENDIF
AADD( CO_LUNAS, relatorio:CONTEUDO[ CONTAR ][ _COLUNA ] )
ELSE
IF TAMANHO < LEN( relatorio:CONTEUDO[ CONTAR ][ _CABECALHO ] )
TAMANHO := LEN( relatorio:CONTEUDO[ CONTAR ][ _CABECALHO ] )
ENDIF
LARGURA += TAMANHO
AADD( CO_LUNAS, POSICAO )
POSICAO += relatorio:SEPARADOR + TAMANHO
ENDIF
IF relatorio:RESUMO != NIL .AND. TIPO = "N"
DIFERENCA := 0
CORINGA := NIL
IF LEN( relatorio:CONTEUDO[ CONTAR ] ) = MAS_CARA
CORINGA := relatorio:CONTEUDO[ CONTAR ][ MAS_CARA ]
CORINGA := STRTRAN( CORINGA, "#", "9" )
LOCALIZA := AT( "9", CORINGA )
IF LOCALIZA != 0
IF AT( ",", CORINGA ) != 0
ADD_MASCARA := SUBS( CORINGA, LOCALIZA, AT( ",",;
CORINGA ) - LOCALIZA )
IF LEN( ADD_MASCARA ) = 1
ADD_MASCARA := "99"; DIFERENCA := 2
ELSEIF LEN( ADD_MASCARA ) = 2 .OR.;
LEN( ADD_MASCARA ) = 3
ADD_MASCARA := "9,9"; DIFERENCA := 3
ENDIF
IF DIFERENCA != 0
CORINGA := STUFF( CORINGA, LOCALIZA, 0, ADD_MASCARA )
ENDIF
ELSE
IF LOCALIZA != 0
CORINGA := STUFF( CORINGA, LOCALIZA, 0, "99" )
DIFERENCA := 2
ENDIF
ENDIF
ENDIF
ENDIF
CO_LUNAS[ CONTAR ] -= DIFERENCA
IF CORINGA != NIL
relatorio:CONTEUDO[ CONTAR ][ MAS_CARA ] := CORINGA
ENDIF
IF relatorio:CONTEUDO[ CONTAR ][ _CABECALHO ] != NIL
relatorio:CONTEUDO[ CONTAR ][ _CABECALHO ] :=;
SPACE( DIFERENCA ) + relatorio:CONTEUDO[ CONTAR ][ _CABECALHO ]
ENDIF
AADD( RE_SUMO, { relatorio:CONTEUDO[ CONTAR ][ _DADOS ], 0 } )
ENDIF
NEXT
IF relatorio:TIPO = COLUNAR_AUTOMATICO
LARGURA += ( LEN( relatorio:CONTEUDO ) - 1 ) * relatorio:SEPARADOR
ENDIF
IF LEN( relatorio:TITULOS ) > 1
IF NUM_RELATORIO = 0
IF LEN( relatorio:TITULOS[ 1 ] ) > LEN( relatorio:TITULOS[ 2 ] )
TAMANHO := LEN( relatorio:TITULOS[ 1 ] )
ELSE
TAMANHO := LEN( relatorio:TITULOS[ 2 ] )
ENDIF
ELSE
IF LEN( EVAL( relatorio:TITULOS[ 1 ] ) ) > LEN( EVAL( relatorio:TITULOS[ 2 ] ) )
TAMANHO := LEN( EVAL( relatorio:TITULOS[ 1 ] ) )
ELSE
TAMANHO := LEN( EVAL( relatorio:TITULOS[ 2 ] ) )
ENDIF
ENDIF
ELSEIF LEN( relatorio:TITULOS ) = 1
IF NUM_RELATORIO = 0
TAMANHO := LEN( relatorio:TITULOS[ 1 ] )
ELSE
TAMANHO := LEN( EVAL( relatorio:TITULOS[ 1 ] ) )
ENDIF
ELSE
TAMANHO := 18
ENDIF
IF TAMANHO + 17 > LARGURA; LARGURA := TAMANHO + 17; ENDIF
relatorio:LARGURA := LARGURA
FOR CONTAR := 1 TO LEN( relatorio:CONTEUDO )
IF NUM_RELATORIO = 0
MACRO := relatorio:CONTEUDO[ CONTAR ][ _DADOS ]
TIPO := VALTYPE( &MACRO )
ELSE
TIPO := VALTYPE( EVAL( relatorio:CONTEUDO[ CONTAR ][ _DADOS ] ) )
ENDIF
IF TIPO = "M"
AADD( CAMPOS_MEMO,;
{ relatorio:CONTEUDO[ CONTAR ][ _DADOS ], CO_LUNAS[ CONTAR ] } )
ENDIF
NEXT
IF LEN( relatorio:TOTALIZA ) = 0
FOR CONTAR := 1 TO LEN( relatorio:CONTEUDO )
IF NUM_RELATORIO = 0
MACRO := relatorio:CONTEUDO[ CONTAR ][ _DADOS ]
TIPO := VALTYPE( &MACRO )
ELSE
TIPO := VALTYPE( EVAL( relatorio:CONTEUDO[ CONTAR ][ _DADOS ] ) )
ENDIF
IF TIPO = "N"
CORINGA := {}
AADD( CORINGA, relatorio:CONTEUDO[ CONTAR ][ _DADOS ] )
AADD( CORINGA, relatorio:CONTEUDO[ CONTAR ][ _DADOS + 1 ] )
AADD( CORINGA, CO_LUNAS[ CONTAR ] )
IF LEN( relatorio:CONTEUDO[ CONTAR ] ) = MAS_CARA
AADD( CORINGA, relatorio:CONTEUDO[ CONTAR ][ MAS_CARA ] )
ENDIF
AADD( TOTALIZADOR, CORINGA )
ENDIF
NEXT
ELSE
TOTALIZADOR := relatorio:TOTALIZA
ENDIF
FOR CONTAR := 1 TO LEN( TOTALIZADOR )
IF NUM_RELATORIO = 0
MACRO := TOTALIZADOR[ CONTAR ][ 1 ]
TIPO := VALTYPE( &MACRO )
ELSE
TIPO := VALTYPE( EVAL( TOTALIZADOR[ CONTAR ][ 1 ] ) )
ENDIF
IF TIPO != "N"
SETCOLOR( "W" )
CLS
?
? "Tentativa de totalizar campo nao numerico"
?
? "Rotina -> " + PROGRAMA
? "Linha --> " + ALLTRIM( STR( LINHA_PROG ) )
?
QUIT
ENDIF
IF relatorio:TIPO = COLUNAR_AUTOMATICO
POSICAO := ASCAN( relatorio:CONTEUDO, { | X | UPPER( X[ 3 ] ) ==;
UPPER( TOTALIZADOR[ CONTAR ][ 2 ] ) } )
IF POSICAO = 0
SETCOLOR( "W" )
CLS
?
? "Tentativa de totalizar campo nao posicionado para impressao"
?
? "Rotina -> " + PROGRAMA
? "Linha --> " + ALLTRIM( STR( LINHA_PROG ) )
?
QUIT
ENDIF
DIFERENCA := 0; CORINGA := NIL
IF LEN( relatorio:CONTEUDO[ POSICAO ] ) = MAS_CARA
CORINGA := relatorio:CONTEUDO[ POSICAO ][ MAS_CARA ]
CORINGA := STRTRAN( CORINGA, "#", "9" )
LOCALIZA := AT( "9", CORINGA )
IF LOCALIZA != 0
IF AT( ",", CORINGA ) != 0
ADD_MASCARA := SUBS( CORINGA, LOCALIZA, AT( ",",;
CORINGA ) - LOCALIZA )
IF LEN( ADD_MASCARA ) = 1
ADD_MASCARA := "99"; DIFERENCA := 2
ELSEIF LEN( ADD_MASCARA ) = 2 .OR.;
LEN( ADD_MASCARA ) = 3
ADD_MASCARA := "9,9"; DIFERENCA := 3
ENDIF
IF DIFERENCA != 0
CORINGA := STUFF( CORINGA, LOCALIZA, 0, ADD_MASCARA )
ENDIF
ELSE
IF LOCALIZA != 0
CORINGA := STUFF( CORINGA, LOCALIZA, 0, "99" )
DIFERENCA := 2
ENDIF
ENDIF
ENDIF
ENDIF
AADD( TOTALIZADOR[ CONTAR ], CO_LUNAS[ POSICAO ] - DIFERENCA )
IF CORINGA != NIL
AADD( TOTALIZADOR[ CONTAR ], CORINGA )
ENDIF
ENDIF
AADD( TO_TALIZA, 0 )
FOR CONTADOR := 1 TO LEN( relatorio:QUEBRA )
AADD( TOT_QUEBRA[ CONTADOR ], 0 )
NEXT
NEXT
IF LEN( TOTALIZADOR ) > 0
relatorio:LIN_INFERIOR -= 3
ENDIF
FOR CONTAR := 1 TO LEN( relatorio:QUEBRA )
IF NUM_RELATORIO = 0
MACRO := relatorio:QUEBRA[ CONTAR ][ 1 ]
AADD( QUE_BRAS, &MACRO )
ELSE
AADD( QUE_BRAS, EVAL( relatorio:QUEBRA[ CONTAR ][ 1 ] ) )
ENDIF
NEXT
relatorio:SAIDA := MENU_PRN()
IF relatorio:SAIDA = NIL
RESTSCREEN( LIN_MENU + 1, 00, 23, 79, TELA_PRI )
relatorio:LIMPA()
RETURN
ENDIF
SET DEVI TO PRINT
WHILE !EOF()
IF INKEY() = T_ESC
SET DEVI TO SCREEN
SAIDA := PERG( "Continua a impress„o ?" )
MENSAGEM( "Tecle <ESC> para pausa ou interrup‡„o" )
SET DEVI TO PRINT
IF SAIDA = "N"; EXIT; ENDIF
ENDIF
IF relatorio:FILTRO != NIL
IF NUM_RELATORIO = 0
MACRO := relatorio:FILTRO
IF !( &MACRO )
TOTALIZE( .T. )
EXIT
ENDIF
ELSE
IF !( EVAL( relatorio:FILTRO ) )
TOTALIZE( .T. )
EXIT
ENDIF
ENDIF
ENDIF
IF relatorio:LINHA = relatorio:LIN_SUPERIOR
IF relatorio:BLOCO_CABECALHO != NIL
EVAL( relatorio:BLOCO_CABECALHO )
ELSE
IF relatorio:SAIDA != "T"
IF relatorio:REDUCAO != NIL
@ 00, 01 SAY relatorio:REDUCAO
ENDIF
AJUSTE( relatorio:LARGURA, IIF( TIPO_FORMULARIO = "0", "80", "132" ) )
ENDIF
IF LEN( relatorio:TITULOS ) > 0
IF NUM_RELATORIO = 0
@ relatorio:LINHA, 01 SAY relatorio:TITULOS[ 1 ]
ELSE
@ relatorio:LINHA, 01 SAY EVAL( relatorio:TITULOS[ 1 ] )
ENDIF
ENDIF
@ relatorio:LINHA, relatorio:LARGURA - 13 SAY;
"Pagina: " + STRZERO( relatorio:PAGINA, 4 )
relatorio:PAGINA++
IF LEN( relatorio:TITULOS ) > 1
IF NUM_RELATORIO = 0
@ ++relatorio:LINHA, 01 SAY relatorio:TITULOS[ 2 ]
ELSE
@ ++relatorio:LINHA, 01 SAY EVAL( relatorio:TITULOS[ 2 ] )
ENDIF
ENDIF
@ relatorio:LINHA, relatorio:LARGURA - 15 SAY;
"Data: " + DTOC( DAT_HOJE )
FOR CONTAR := 3 TO LEN( relatorio:TITULOS )
IF NUM_RELATORIO = 0
IF VALTYPE( relatorio:TITULOS[ CONTAR ] ) = "A"
MACRO := relatorio:TITULOS[ CONTAR ][ 2 ]
@ ++relatorio:LINHA, 01 SAY relatorio:TITULOS[ CONTAR ][ 1 ]
@ relatorio:LINHA, LEN( relatorio:TITULOS[ CONTAR ][ 1 ] ) +;
2 SAY &MACRO
ELSE
@ ++relatorio:LINHA, 01 SAY relatorio:TITULOS[ CONTAR ]
ENDIF
ELSE
@ ++relatorio:LINHA, 01 SAY EVAL( relatorio:TITULOS[ CONTAR ] )
ENDIF
NEXT
relatorio:LINHA++
@ ++relatorio:LINHA, 01 SAY;
REPL( relatorio:SEP_CABECALHO, relatorio:LARGURA )
relatorio:LINHA++
FOR CONTAR := 1 TO LEN( relatorio:CONTEUDO )
IF relatorio:CONTEUDO[ CONTAR ][ _CABECALHO ] != NIL
@ relatorio:LINHA, CO_LUNAS[ CONTAR ] SAY;
relatorio:CONTEUDO[ CONTAR ][ _CABECALHO ]
ENDIF
NEXT
@ ++relatorio:LINHA, 01 SAY;
REPL( relatorio:SEP_CABECALHO, relatorio:LARGURA )
relatorio:LINHA++
CORINGA := .F.
IF LEN( relatorio:QUEBRA ) > 0
FOR CONTAR := 1 TO LEN( relatorio:QUEBRA )
IF LEN( relatorio:QUEBRA[ CONTAR ] ) > 2
IF VALTYPE( relatorio:QUEBRA[ CONTAR ][ 3 ] ) = "C"
@ ++relatorio:LINHA, 01 SAY;
relatorio:QUEBRA[ CONTAR ][ 3 ]
@ relatorio:LINHA, LEN( relatorio:QUEBRA[ CONTAR ][ 3 ] ) + 2 SAY;
QUE_BRAS[ CONTAR ]
CORINGA := .T.
ENDIF
ENDIF
NEXT
IF CORINGA; relatorio:LINHA += 2; ENDIF
ENDIF
ENDIF
ENDIF
IF ACAO_MEMO = 1
TAM_MEMO := {}
IF relatorio:RESUMO != NIL
IF NUM_RELATORIO = 0
MACRO := relatorio:RESUMO
FIL_TRA := &MACRO
ELSE
FIL_TRA := EVAL( relatorio:RESUMO )
ENDIF
FOR CONTAR := 1 TO LEN( RE_SUMO )
RE_SUMO[ CONTAR ][ 2 ] := 0
NEXT
MACRO := relatorio:RESUMO
WHILE FIL_TRA = IIF( NUM_RELATORIO > 0, EVAL( relatorio:RESUMO ),;
&MACRO ) .AND. !EOF()
FOR CONTAR := 1 TO LEN( relatorio:PRE_CONTEUDO )
EVAL( relatorio:PRE_CONTEUDO[ CONTAR ] )
NEXT
FOR CONTAR := 1 TO LEN( RE_SUMO )
IF NUM_RELATORIO = 0
MACRO := RE_SUMO[ CONTAR ][ 1 ]
RE_SUMO[ CONTAR ][ 2 ] += &MACRO
ELSE
RE_SUMO[ CONTAR ][ 2 ] += EVAL( RE_SUMO[ CONTAR ][ 1 ] )
ENDIF
NEXT
FOR CONTAR := 1 TO LEN( TOTALIZADOR )
IF NUM_RELATORIO = 0
MACRO := TOTALIZADOR[ CONTAR ][ _DADOS -1 ]
TO_TALIZA[ CONTAR ] += &MACRO
ELSE
TO_TALIZA[ CONTAR ] += EVAL( TOTALIZADOR[ CONTAR ][ _DADOS -1 ] )
ENDIF
FOR CONTADOR := 1 TO LEN( relatorio:QUEBRA )
IF NUM_RELATORIO = 0
MACRO := TOTALIZADOR[ CONTAR ][ _DADOS -1 ]
TOT_QUEBRA[ CONTADOR ][ CONTAR ] += &MACRO
ELSE
TOT_QUEBRA[ CONTADOR ][ CONTAR ] +=;
EVAL( TOTALIZADOR[ CONTAR ][ _DADOS -1 ] )
ENDIF
NEXT
NEXT
IF NUM_RELATORIO = 0
MACRO := relatorio:RESUMO
FIL_TRA := &MACRO
ENDIF
SKIP
ENDDO
SKIP -1
POSICAO := 1
FOR CONTAR := 1 TO LEN( relatorio:CONTEUDO )
IF NUM_RELATORIO = 0
MACRO := relatorio:CONTEUDO[ CONTAR ][ _DADOS ]
RESULTADO := &MACRO
TIPO := VALTYPE( &MACRO )
ELSE
RESULTADO := EVAL( relatorio:CONTEUDO[ CONTAR ][ _DADOS ] )
TIPO := VALTYPE( EVAL( relatorio:CONTEUDO[ CONTAR ][ _DADOS ] ) )
ENDIF
IF TIPO = "N"
RESULTADO := RE_SUMO[ POSICAO ][ 2 ]
POSICAO++
ENDIF
IF TIPO = "M"
AADD( TAM_MEMO, MLCOUNT( RESULTADO, relatorio:MEMO_LARGURA ) )
@ relatorio:LINHA, CO_LUNAS[ CONTAR ] SAY;
MEMOLINE( RESULTADO, relatorio:MEMO_LARGURA, 1 )
ELSE
IF LEN( relatorio:CONTEUDO[ CONTAR ] ) = MAS_CARA
@ relatorio:LINHA, CO_LUNAS[ CONTAR ] SAY;
RESULTADO PICT relatorio:CONTEUDO[ CONTAR ][ MAS_CARA ]
ELSE
@ relatorio:LINHA, CO_LUNAS[ CONTAR ] SAY RESULTADO
ENDIF
ENDIF
NEXT
ELSE
FOR CONTAR := 1 TO LEN( relatorio:PRE_CONTEUDO )
EVAL( relatorio:PRE_CONTEUDO[ CONTAR ] )
NEXT
FOR CONTAR := 1 TO LEN( relatorio:CONTEUDO )
IF NUM_RELATORIO = 0
MACRO := relatorio:CONTEUDO[ CONTAR ][ _DADOS ]
RESULTADO := &MACRO
TIPO := VALTYPE( &MACRO )
ELSE
RESULTADO := EVAL( relatorio:CONTEUDO[ CONTAR ][ _DADOS ] )
TIPO := VALTYPE( EVAL( relatorio:CONTEUDO[ CONTAR ][ _DADOS ] ) )
ENDIF
IF TIPO = "M"
AADD( TAM_MEMO, MLCOUNT( RESULTADO, relatorio:MEMO_LARGURA ) )
@ relatorio:LINHA, CO_LUNAS[ CONTAR ] SAY;
MEMOLINE( RESULTADO, relatorio:MEMO_LARGURA, 1 )
ELSE
IF LEN( relatorio:CONTEUDO[ CONTAR ] ) = MAS_CARA
@ relatorio:LINHA, CO_LUNAS[ CONTAR ] SAY;
RESULTADO PICT relatorio:CONTEUDO[ CONTAR ][ MAS_CARA ]
ELSE
@ relatorio:LINHA, CO_LUNAS[ CONTAR ] SAY;
RESULTADO
ENDIF
ENDIF
NEXT
ENDIF
IF LEN( CAMPOS_MEMO ) != 0
ACAO_MEMO++; INICIO := 2
ENDIF
ENDIF
IF ACAO_MEMO = 2
MAIOR_MEMO := 0
FOR CONTAR := 1 TO LEN( TAM_MEMO )
IF TAM_MEMO[ CONTAR ] > MAIOR_MEMO
MAIOR_MEMO := TAM_MEMO[ CONTAR ]
ENDIF
NEXT
FOR CONTADOR := INICIO TO MAIOR_MEMO
relatorio:LINHA++
FOR CONTAR := 1 TO LEN( CAMPOS_MEMO )
IF NUM_RELATORIO = 0
MACRO := CAMPOS_MEMO[ CONTAR ][ 1 ]
RESULTADO := &MACRO
ELSE
RESULTADO := EVAL( CAMPOS_MEMO[ CONTAR ][ 1 ] )
ENDIF
@ relatorio:LINHA, CAMPOS_MEMO[ CONTAR ][ 2 ] SAY;
MEMOLINE( RESULTADO, relatorio:MEMO_LARGURA, CONTADOR )
NEXT
IF relatorio:LINHA > relatorio:LIN_INFERIOR
EXIT
ENDIF
NEXT
IF CONTADOR < MAIOR_MEMO
INICIO := CONTADOR + 1
ELSE
ACAO_MEMO := 3
ENDIF
ENDIF
IF relatorio:RESUMO = NIL
FOR CONTAR := 1 TO LEN( TOTALIZADOR )
IF NUM_RELATORIO = 0
MACRO := TOTALIZADOR[ CONTAR ][ _DADOS - 1 ]
TO_TALIZA[ CONTAR ] += &MACRO
ELSE
TO_TALIZA[ CONTAR ] += EVAL( TOTALIZADOR[ CONTAR ][ _DADOS - 1 ] )
ENDIF
FOR CONTADOR := 1 TO LEN( relatorio:QUEBRA )
IF NUM_RELATORIO = 0
MACRO := TOTALIZADOR[ CONTAR ][ _DADOS - 1 ]
TOT_QUEBRA[ CONTADOR ][ CONTAR ] += &MACRO
ELSE
TOT_QUEBRA[ CONTADOR ][ CONTAR ] +=;
EVAL( TOTALIZADOR[ CONTAR ][ _DADOS - 1 ] )
ENDIF
NEXT
NEXT
ENDIF
IF LEN( CAMPOS_MEMO ) = 0
relatorio:LINHA++
SKIP
ELSE
IF ACAO_MEMO = 3
relatorio:LINHA++
SKIP
ACAO_MEMO := 1
ENDIF
ENDIF
FOR CONTAR := LEN( relatorio:QUEBRA ) TO 1 STEP -1
IF NUM_RELATORIO = 0
MACRO := relatorio:QUEBRA[ CONTAR ][ 1 ]
ENDIF
IF QUE_BRAS[ CONTAR ] != IIF( NUM_RELATORIO = 0, &MACRO,;
EVAL( relatorio:QUEBRA[ CONTAR ][ 1 ] ) )
CORINGA := .F.
RESULTADO := ""
IF LEN( relatorio:QUEBRA[ CONTAR ] ) = 4
CORINGA := .T.
RESULTADO := relatorio:QUEBRA[ CONTAR ][ 3 ]
ELSEIF LEN( relatorio:QUEBRA[ CONTAR ] ) = 3
IF NUM_RELATORIO = 0
MACRO := relatorio:QUEBRA[ CONTAR ][ 1 ]
TIPO := VALTYPE( &MACRO )
ELSE
TIPO := VALTYPE( EVAL( relatorio:QUEBRA[ CONTAR ][ 1 ] ) )
ENDIF
IF TIPO = "L"
CORINGA := .T.
ELSE
RESULTADO := relatorio:QUEBRA[ CONTAR ][ 3 ]
ENDIF
ENDIF
IF CORINGA = .T.
@ relatorio:LINHA, 01 SAY REPL( relatorio:SEP_CABECALHO, relatorio:LARGURA )
@ ++relatorio:LINHA, 01 SAY relatorio:TIT_SUBTOTAL_QUEBRA
FOR CONTADOR := 1 TO LEN( TOTALIZADOR )
IF LEN( TOTALIZADOR[ CONTADOR ] ) = 4
@ relatorio:LINHA, TOTALIZADOR[ CONTADOR ][ _COLUNA - 1 ] SAY;
TOT_QUEBRA[ CONTAR ][ CONTADOR ];
PICT TOTALIZADOR[ CONTADOR ][ 4 ]
ELSE
@ relatorio:LINHA, TOTALIZADOR[ CONTADOR ][ _COLUNA - 1 ] SAY;
TOT_QUEBRA[ CONTAR ][ CONTADOR ]
ENDIF
TOT_QUEBRA[ CONTAR ][ CONTADOR ] := 0
NEXT
ENDIF
IF relatorio:QUEBRA[ CONTAR ][ 2 ] = SALTA_PAGINA
relatorio:LINHA := relatorio:LIN_INFERIOR + 1
ELSE
relatorio:LINHA += relatorio:QUEBRA[ CONTAR ][ 2 ]
IF LEN( TRIM( RESULTADO ) ) > 0 .AND. !EOF()
@ ++relatorio:LINHA, 01 SAY RESULTADO
IF NUM_RELATORIO = 0
MACRO := relatorio:QUEBRA[ CONTAR ][ 1 ]
@ relatorio:LINHA, LEN( RESULTADO ) + 2 SAY &MACRO
ELSE
@ relatorio:LINHA, LEN( RESULTADO ) + 2;
SAY EVAL( relatorio:QUEBRA[ CONTAR ][ 1 ] )
ENDIF
relatorio:LINHA += 2
ENDIF
ENDIF
FOR CONTADOR := CONTAR TO LEN( relatorio:QUEBRA )
IF NUM_RELATORIO = 0
MACRO := relatorio:QUEBRA[ CONTADOR ][ 1 ]
QUE_BRAS[ CONTADOR ] = &MACRO
ELSE
QUE_BRAS[ CONTADOR ] = EVAL( relatorio:QUEBRA[ CONTADOR ][ 1 ] )
ENDIF
AFILL( TOT_QUEBRA[ CONTADOR ], 0 )
NEXT
ENDIF
NEXT
IF relatorio:LINHA > relatorio:LIN_INFERIOR .OR. EOF()
TOTALIZE()
relatorio:LINHA := relatorio:LIN_SUPERIOR
ENDIF
ENDDO
EJECT
SET DEVI TO SCREEN
IF relatorio:SAIDA = "A"
SET PRINTER TO
ELSEIF relatorio:SAIDA = "T" .AND. SAIDA = "S"
SET PRINTER TO
IMP_TELA( relatorio:LARGURA + 1 )
ENDIF
relatorio:LIMPA()
RETURN NIL
FUNCTION TOTALIZE( TOT_OU_SUB )
IF LEN( relatorio:TOTALIZA ) = 0; RETURN NIL; ENDIF
IF TOT_OU_SUB = NIL; TOT_OU_SUB := EOF(); ENDIF
IF !TOT_OU_SUB .AND. relatorio:SUB_TOTALIZACAO = NAO
RETURN NIL
ENDIF
IF TOT_OU_SUB .AND. relatorio:LINHA < relatorio:LIN_INFERIOR + 1
relatorio:LINHA := relatorio:LIN_INFERIOR + 1
ENDIF
@ relatorio:LINHA, 01 SAY;
REPL( relatorio:SEP_CABECALHO, relatorio:LARGURA )
relatorio:LINHA++
IF TOT_OU_SUB
@ relatorio:LINHA, 01 SAY relatorio:TITULO_TOTAL
ELSE
@ relatorio:LINHA, 01 SAY relatorio:TITULO_SUB_TOTAL
ENDIF
FOR CONTAR := 1 TO LEN( TOTALIZADOR )
IF LEN( TOTALIZADOR[ CONTAR ] ) = 4
@ relatorio:LINHA, TOTALIZADOR[ CONTAR ][ _COLUNA - 1 ] SAY;
TO_TALIZA[ CONTAR ] PICT TOTALIZADOR[ CONTAR ][ 4 ]
ELSE
@ relatorio:LINHA, TOTALIZADOR[ CONTAR ][ _COLUNA - 1 ] SAY;
TO_TALIZA[ CONTAR ]
ENDIF
NEXT
@ ++relatorio:LINHA, 01 SAY;
REPL( relatorio:SEP_CABECALHO, relatorio:LARGURA )
RETURN NIL
FUNCTION IMP_FICHA
LOCAL SAIDA := "S", LARGURA := 0, CONTAR, TAMANHO, TIPO, RESULTADO,;
MAS_CARA, DIFERENCA, LOCALIZA, ADD_MASCARA, FIL_TRA, CONTADOR,;
TAM_CAB, TAM_SALTO := 0, TAM_MEMO
PARA PROGRAMA, LINHA_PROG
CO_LUNAS := {}; LI_NHAS := {}
relatorio:LINHA := relatorio:LIN_SUPERIOR
MAS_CARA := 6
FOR CONTAR := 1 TO LEN( relatorio:CONTEUDO )
TAM_CAB := LEN( TRIM( relatorio:CONTEUDO[ CONTAR ][ _CABECALHO ] ) )
IF TAM_CAB = 0; TAM_CAB--; ENDIF
TIPO := VALTYPE( EVAL( relatorio:CONTEUDO[ CONTAR ][ _DADOS ] ) )
IF LEN( relatorio:CONTEUDO[ CONTAR ] ) = MAS_CARA
TAMANHO := LEN( TRANS( EVAL( relatorio:CONTEUDO[ CONTAR ][ _DADOS ] ),;
relatorio:CONTEUDO[ CONTAR ][ MAS_CARA ] ) )
ELSE
IF TIPO = "N"
TAMANHO := 10
ELSEIF TIPO = "D"
TAMANHO := 8
ELSEIF TIPO = "L"
TAMANHO := 3
ELSEIF TIPO = "M"
TAMANHO := relatorio:MEMO_LARGURA
ELSE
TAMANHO := LEN( EVAL( relatorio:CONTEUDO[ CONTAR ][ _DADOS ] ) )
ENDIF
ENDIF
IF relatorio:CONTEUDO[ CONTAR ][ _COLUNA + 1 ] + TAMANHO + TAM_CAB > LARGURA
LARGURA := relatorio:CONTEUDO[ CONTAR ][ _COLUNA + 1 ] + TAMANHO + TAM_CAB
ENDIF
AADD( CO_LUNAS, relatorio:CONTEUDO[ CONTAR ][ _COLUNA + 1 ] )
AADD( LI_NHAS, relatorio:CONTEUDO[ CONTAR ][ _COLUNA ] )
NEXT
FOR CONTAR := 1 TO LEN( LI_NHAS )
IF LI_NHAS[ CONTAR ] > TAM_SALTO
TAM_SALTO := LI_NHAS[ CONTAR ]
ENDIF
NEXT
IF LEN( relatorio:TITULOS ) > 1
IF LEN( EVAL( relatorio:TITULOS[ 1 ] ) ) > LEN( EVAL( relatorio:TITULOS[ 2 ] ) )
TAMANHO := LEN( EVAL( relatorio:TITULOS[ 1 ] ) )
ELSE
TAMANHO := LEN( EVAL( relatorio:TITULOS[ 2 ] ) )
ENDIF
ELSEIF LEN( relatorio:TITULOS ) = 1
TAMANHO := LEN( EVAL( relatorio:TITULOS[ 1 ] ) )
ELSE
TAMANHO := 18
ENDIF
IF TAMANHO + 17 > LARGURA; LARGURA := TAMANHO + 17; ENDIF
relatorio:LARGURA := LARGURA
relatorio:SAIDA := MENU_PRN()
IF relatorio:SAIDA = NIL
RESTSCREEN( LIN_MENU + 1, 00, 23, 79, TELA_PRI )
relatorio:LIMPA()
RETURN
ENDIF
SET DEVI TO PRINT
WHILE !EOF()
IF INKEY() = T_ESC
SET DEVI TO SCREEN
SAIDA := PERG( "Continua a impress„o ?" )
MENSAGEM( "Tecle <ESC> para pausa ou interrup‡„o" )
SET DEVI TO PRINT
IF SAIDA = "N"; EXIT; ENDIF
ENDIF
IF relatorio:FILTRO != NIL
IF !( EVAL( relatorio:FILTRO ) )
EXIT
ENDIF
ENDIF
IF relatorio:LINHA = relatorio:LIN_SUPERIOR
IF relatorio:BLOCO_CABECALHO != NIL
EVAL( relatorio:BLOCO_CABECALHO )
ELSE
CAB_FICHA()
ENDIF
ENDIF
FOR CONTAR := 1 TO LEN( relatorio:PRE_CONTEUDO )
EVAL( relatorio:PRE_CONTEUDO[ CONTAR ] )
NEXT
FOR CONTAR := 1 TO LEN( relatorio:CONTEUDO )
RESULTADO := EVAL( relatorio:CONTEUDO[ CONTAR ][ _DADOS ] )
TIPO := VALTYPE( EVAL( relatorio:CONTEUDO[ CONTAR ][ _DADOS ] ) )
TAM_CAB := LEN( TRIM( relatorio:CONTEUDO[ CONTAR ][ _CABECALHO ] ) )
IF TAM_CAB > 0
TAM_CAB++
@ relatorio:LINHA + LI_NHAS[ CONTAR ], CO_LUNAS[ CONTAR ] SAY;
TRIM( relatorio:CONTEUDO[ CONTAR ][ _CABECALHO ] )
ENDIF
IF TIPO = "M"
TAM_MEMO := MLCOUNT( RESULTADO, relatorio:MEMO_LARGURA )
FOR CONTADOR := 1 TO TAM_MEMO
@ relatorio:LINHA + LI_NHAS[ CONTAR ], CO_LUNAS[ CONTAR ] + TAM_CAB;
SAY MEMOLINE( RESULTADO, relatorio:MEMO_LARGURA, CONTADOR )
relatorio:LINHA++
IF relatorio:LINHA + LI_NHAS[ CONTAR ] > relatorio:LIN_INFERIOR
relatorio:LINHA := relatorio:LIN_SUPERIOR
IF relatorio:BLOCO_CABECALHO != NIL
EVAL( relatorio:BLOCO_CABECALHO )
ELSE
CAB_FICHA()
ENDIF
ENDIF
NEXT
IF TAM_MEMO > 0; relatorio:LINHA--; ENDIF
ELSE
IF LEN( relatorio:CONTEUDO[ CONTAR ] ) = MAS_CARA
@ relatorio:LINHA + LI_NHAS[ CONTAR ], CO_LUNAS[ CONTAR ] +;
TAM_CAB SAY RESULTADO PICT relatorio:CONTEUDO[ CONTAR ][ MAS_CARA ]
ELSE
@ relatorio:LINHA + LI_NHAS[ CONTAR ], CO_LUNAS[ CONTAR ] +;
TAM_CAB SAY RESULTADO
ENDIF
ENDIF
NEXT
relatorio:LINHA += TAM_SALTO
@ ++relatorio:LINHA, 01 SAY;
REPL( relatorio:SEP_CABECALHO, relatorio:LARGURA )
SKIP
IF relatorio:LINHA + TAM_SALTO > relatorio:LIN_INFERIOR
relatorio:LINHA := relatorio:LIN_SUPERIOR
ENDIF
ENDDO
EJECT
SET DEVI TO SCREEN
IF relatorio:SAIDA = "A"
SET PRINTER TO
ELSEIF relatorio:SAIDA = "T" .AND. SAIDA = "S"
SET PRINTER TO
IMP_TELA( relatorio:LARGURA + 1 )
ENDIF
relatorio:LIMPA()
RETURN NIL
FUNCTION CAB_FICHA
IF relatorio:SAIDA != "T"
IF relatorio:REDUCAO != NIL
@ 00, 01 SAY relatorio:REDUCAO
ENDIF
AJUSTE( relatorio:LARGURA, IIF( TIPO_FORMULARIO = "0", "80", "132" ) )
ENDIF
IF LEN( relatorio:TITULOS ) > 0
@ relatorio:LINHA, 01 SAY EVAL( relatorio:TITULOS[ 1 ] )
ENDIF
@ relatorio:LINHA, relatorio:LARGURA - 13 SAY;
"Pagina: " + STRZERO( relatorio:PAGINA, 4 )
relatorio:PAGINA++
IF LEN( relatorio:TITULOS ) > 1
@ ++relatorio:LINHA, 01 SAY EVAL( relatorio:TITULOS[ 2 ] )
ENDIF
@ relatorio:LINHA, relatorio:LARGURA - 15 SAY;
"Data: " + DTOC( DAT_HOJE )
FOR CONTAR := 3 TO LEN( relatorio:TITULOS )
@ ++relatorio:LINHA, 01 SAY EVAL( relatorio:TITULOS[ CONTAR ] )
NEXT
relatorio:LINHA++
@ ++relatorio:LINHA, 01 SAY;
REPL( relatorio:SEP_CABECALHO, relatorio:LARGURA )
RETURN NIL
FUNCTION MENSAGEM( TEXTO, PAUSA ) // função de exibição de msgs.
STATIC ULT_MENSAGEM := ""
LOCAL ULT_CURSOR := SETCURSOR()
IF TEXTO = NIL; TEXTO := ""; ENDIF
CURSOR( DESLIGA )
@ MAXROW(), 11 SAY PADC( TEXTO, 58 ) COLOR CONTECOR[ 2 ]
IF PAUSA = NIL
ULT_MENSAGEM := TEXTO
ELSE
INKEY( PAUSA )
@ MAXROW(), 11 SAY PADC( ULT_MENSAGEM, 58 ) COLOR CONTECOR[ 2 ]
ENDIF
SETCURSOR( ULT_CURSOR )
RETURN NIL
FUNCTION PERGUNTA( TEX_TO, RES_POSTA ) // função de pergunta pop-up
IF RES_POSTA = NIL; RES_POSTA="S"; ENDIF
PER_COR := SETCOLOR()
CURSOR( DESLIGA )
SAVE SCREEN TO PER_TELA
M->SIM_NAO := IIF( RES_POSTA ="N", 2, 1 )
M->LAR_G := LEN( TEX_TO )
IF M->LAR_G < 37
M->LAR_G := 51
ELSE
M->LAR_G += 14
ENDIF
COL_SUP := INT( ( 80 - M->LAR_G ) / 2 )
COL_INF := COL_SUP + LAR_G - 1
JANELA( 08, COL_SUP, 16, COL_INF )
COR( "JANELA DE DIALOGO" )
@ 11, ( 80 - LEN( TEX_TO ) ) / 2 SAY TEX_TO
botao:ADD( 13, 25, "Sim " )
botao:ADD( 13, 42, "N„o " )
SIM_NAO := botao:RODA()
RESTORE SCREEN FROM PER_TELA
SETCOLOR( PER_COR )
RETURN IIF( M->SIM_NAO = 1, "S", "N" )
FUNCTION BOTAO( LINHA_SUPERIOR, COLUNA_ESQUERDA, NOME_BOTAO ) // botões para operar os menus
LOCAL TIPO_OPERACAO, LARGURA_BOTAO, CONTAR, TECLA, PONTEIRO := 1
IF PCOUNT() = 0
TIPO_OPERACAO := EDITA_BOTOES
ELSEIF PCOUNT() = 1
TIPO_OPERACAO := EDITA_BOTOES
PONTEIRO := LINHA_SUPERIOR
ELSEIF PCOUNT() = 2
TIPO_OPERACAO := MOSTRA_BOTOES
ELSEIF PCOUNT() = 3
TIPO_OPERACAO := MOVIMENTA_BOTAO
ENDIF
IF TIPO_OPERACAO = MOVIMENTA_BOTAO
LARGURA_BOTAO := LEN( NOME_BOTAO ) + 2
COR( "JANELA DE DIALOGO" )
@ LINHA_SUPERIOR, COLUNA_ESQUERDA SAY " "
@ LINHA_SUPERIOR + 1, COLUNA_ESQUERDA - 1 SAY SPACE( LARGURA_BOTAO )
@ LINHA_SUPERIOR, COLUNA_ESQUERDA + LARGURA_BOTAO - 1 SAY " "
COR( "BOTAO EM DESTAQUE" )
@ LINHA_SUPERIOR, COLUNA_ESQUERDA - 1 SAY " " + NOME_BOTAO + " "
INKEY( .2 )
COR( "BOTOES" )
@ LINHA_SUPERIOR, COLUNA_ESQUERDA SAY " " + NOME_BOTAO + " "
SETCOLOR( "N/" + ALLTRIM( SUBS( CONTECOR[ 4 ], 4 ) ) )
@ LINHA_SUPERIOR, COLUNA_ESQUERDA - 1 SAY "Ü"
@ LINHA_SUPERIOR + 1, COLUNA_ESQUERDA - 1 SAY REPL( "ß", LARGURA_BOTAO ) + " "
INKEY( .2 )
ENDIF
IF TIPO_OPERACAO = EDITA_BOTOES .OR. TIPO_OPERACAO = MOSTRA_BOTOES
FOR CONTAR := 1 TO LEN( ObjBotao )
LARGURA_BOTAO := LEN( ObjBotao[ CONTAR ][ 3 ] ) + 2
COR( "BOTOES" )
@ ObjBotao[ CONTAR ][ 1 ], ObjBotao[ CONTAR ][ 2 ] SAY " " + ;
ObjBotao[ CONTAR ][ 3 ] + " "
SETCOLOR( "N/" + ALLTRIM( SUBS( CONTECOR[ 4 ], 4 ) ) )
@ ObjBotao[ CONTAR ][ 1 ], ObjBotao[ CONTAR ][ 2 ] - 1 SAY "Ü"
@ ObjBotao[ CONTAR ][ 1 ] + 1, ObjBotao[ CONTAR ][ 2 ] - 1 SAY;
REPL( "ß", LARGURA_BOTAO ) + " "
NEXT
ENDIF
IF TIPO_OPERACAO = EDITA_BOTOES
TECLA := 0
WHILE .T.
LARGURA_BOTAO := LEN( ObjBotao[ PONTEIRO ][ 3 ] ) + 2
COR( "BOTAO EM DESTAQUE" )
@ ObjBotao[ PONTEIRO ][ 1 ], ObjBotao[ PONTEIRO ][ 2 ] SAY;
" " + ObjBotao[ PONTEIRO ][ 3 ] + " "
SETCOLOR( "N/" + ALLTRIM( SUBS( CONTECOR[ 4 ], 4 ) ) )
@ ObjBotao[ PONTEIRO ][ 1 ], ObjBotao[ PONTEIRO ][ 2 ] - 1 SAY "Ü"
@ ObjBotao[ PONTEIRO ][ 1 ] + 1, ObjBotao[ PONTEIRO ][ 2 ] - 1 SAY;
REPL( "ß", LARGURA_BOTAO ) + " "
IF TECLA = T_ENTER
INKEY( .2 )
botao:LIMPA()
RETURN PONTEIRO
ENDIF
TECLA := INKEY( 0 )
IF TECLA = T_ESC
botao:LIMPA()
RETURN 0
ENDIF
IF TECLA = T_F1
HELP( "CALENDARIO", 1, "" )
ENDIF
COR( "BOTOES" )
@ ObjBotao[ PONTEIRO ][ 1 ], ObjBotao[ PONTEIRO ][ 2 ] + 1 SAY;
ObjBotao[ PONTEIRO ][ 3 ]
FOR CONTAR = 1 TO LEN( ObjBotao )
IF SUBS( ObjBotao[ CONTAR ][ 3 ], 1, 1 ) = UPPER( CHR( TECLA ) )
PONTEIRO := CONTAR
TECLA := T_ENTER
EXIT
ENDIF
NEXT
IF TECLA = T_ENTER
LARGURA_BOTAO := LEN( ObjBotao[ PONTEIRO ][ 3 ] ) + 2
COR( "JANELA DE DIALOGO" )
@ ObjBotao[ PONTEIRO ][ 1 ], ObjBotao[ PONTEIRO ][ 2 ] SAY " "
@ ObjBotao[ PONTEIRO ][ 1 ] + 1, ObjBotao[ PONTEIRO ][ 2 ] - 1 SAY;
SPACE( LARGURA_BOTAO )
@ ObjBotao[ PONTEIRO ][ 1 ], ObjBotao[ PONTEIRO ][ 2 ] +;
LARGURA_BOTAO - 1 SAY " "
COR( "BOTAO EM DESTAQUE" )
@ ObjBotao[ PONTEIRO ][ 1 ], ObjBotao[ PONTEIRO ][ 2 ] - 1 SAY ;
" " + ObjBotao[ PONTEIRO ][ 3 ] + " "
INKEY( .2 )
LOOP
ENDIF
IF TECLA = T_ESQUERDA .OR. TECLA = T_CIMA
PONTEIRO--
ELSEIF TECLA = T_DIREITA .OR. TECLA = T_BAIXO
PONTEIRO++
ENDIF
PONTEIRO := IIF( PONTEIRO < 1, LEN( ObjBotao ),;
IIF( PONTEIRO > LEN( ObjBotao ), 1, PONTEIRO ) )
ENDDO
ENDIF
botao:LIMPA()
RETURN NIL
FUNCTION PERG( TEX_TO, RES_POSTA ) // mensagem em forma de pergunta
LOCAL LI, SIM_NAO, CUR_PERG := SETCURSOR()
COR( "MENU" )
CURSOR( DESLIGA )
IF PCOUNT() = 1; RES_POSTA := "S"; ENDIF
SIM_NAO := IIF( RES_POSTA = "N", 2, 1 )
@ 24, 11 SAY SPACE( 58 )
LI := ( 80 - ( LEN( TEX_TO ) + 11 ) ) / 2
@ 24, LI SAY TEX_TO
LI += LEN( TEX_TO ) + 2
WHILE .T.
@ 24, LI PROMPT "Sim"
@ 24, LI + 6 PROMPT "N„o"
@ 24, LI + 4 SAY "-"
MENU TO SIM_NAO
IF SIM_NAO != 0
EXIT
ENDIF
ENDDO
SETCURSOR( CUR_PERG )
RETURN IIF( SIM_NAO = 1, "S", "N" )
FUNCTION JANELA( PJAN1, PJAN2, PJAN3, PJAN4, PJAN5 ) // desenha janelas
IF PCOUNT() != 5
PJAN5 := ""
ENDIF
SOMBRA( PJAN1, PJAN2, PJAN3, PJAN4 )
SETCOLOR( CONTECOR[ 4 ] )
@ PJAN1, PJAN2 CLEAR TO PJAN3, PJAN4
SETCOLOR( CONTECOR[ 5 ] )
@ PJAN1, PJAN2, PJAN3, PJAN4 BOX " "
@ PJAN1, PJAN2 SAY "þ"
IF LEN( TRIM( PJAN5 ) ) > 0
@ PJAN1, PJAN2 + ( ( ( PJAN4 + 1 - PJAN2 ) - LEN( PJAN5 ) ) / 2 ) SAY PJAN5
ENDIF
FUNCTION SOMBRA( LIN_SUP, COL_SUP, LIN_INF, COL_INF ) // gera sombras
IF PCOUNT() = 2 .OR. PCOUNT() = 3
C_SOM := COL_SUP; L_SOM := LIN_SUP
LIN_SUP := VAL( SUBS( C_SOM, 1, 2 ) )
COL_SUP := VAL( SUBS( C_SOM, 3, 2 ) )
LIN_INF := VAL( SUBS( C_SOM, 5, 2 ) )
COL_INF := VAL( SUBS( C_SOM, 7, 2 ) )
COL_SOM := SUBS( C_SOM, 9 )
LIN_SOM := L_SOM
ENDIF
IF COL_SUP < 2 .OR. LIN_INF > 22
C_SOM := ""; L_SOM := ""
RETURN .F.
ENDIF
IF PCOUNT() = 3
RESTSCREEN( LIN_SUP + 1, COL_SUP - 2, LIN_INF + 1, COL_SUP - 1, COL_SOM )
RESTSCREEN( LIN_INF + 1, COL_SUP - 2, LIN_INF + 2, COL_INF - 2, LIN_SOM )
RETURN .F.
ENDIF
IF PCOUNT() != 2
COL_SOM := SAVESCREEN( LIN_SUP + 1, COL_SUP - 2, LIN_INF + 1, COL_SUP - 1 )
LIN_SOM := SAVESCREEN( LIN_INF + 1, COL_SUP - 2, LIN_INF + 2, COL_INF - 2 )
ENDIF
IF SUBS( COL_SOM, 2, 1 ) != CHR( 8 )
C_SOM := STR( LIN_SUP, 2 ) + STR( COL_SUP, 2 ) + STR( LIN_INF, 2 ) +;
STR( COL_INF, 2 ) + COL_SOM
L_SOM := LIN_SOM
ENDIF
FOR I = 2 TO LEN( COL_SOM ) STEP 2
COL_SOM := STUFF( COL_SOM, I, 1, CHR( 8 ) )
NEXT
FOR I = 2 TO LEN( LIN_SOM ) / 2 STEP 2
LIN_SOM := STUFF( LIN_SOM, I, 1, CHR( 8 ) )
NEXT
RESTSCREEN( LIN_SUP + 1, COL_SUP - 2, LIN_INF + 1, COL_SUP - 1, COL_SOM )
RESTSCREEN( LIN_INF + 1, COL_SUP - 2, LIN_INF + 2, COL_INF - 2, LIN_SOM )
RETURN .T.