Mostra o que pode ser feito com FOR/EACH, sem precisar de macro, e facilita muito.
Eu tinha feito assim:
IF Len( mlcLicList ) > 0
@ Row() + 1, 1 SAY Pad( "Lic.01", LIC_TAMANHODESC, "." ) + ".:" GET mlcLicList[ 1, LIC_DATA ]
IF AddMonth( mlcLicList[ 1, LIC_DATA ], mlcLicList[ 1, LIC_VALIDADE ] ) - mlcLicList[ 1, LIC_PRAZO ] < Date()
@ Row(), Col() + 2 SAY Padc( "VENCIDA", 40 ) COLOR SetColorAlerta()
ENDIF
Encontra( AUX_LICTIP + mlcLicList[ 1, LIC_CODIGO ], "jptabel", "numlan" )
@ Row(), 1 SAY Pad( Trim( jptabel->axDescri ), LIC_TAMANHODESC, "." )
ENDIF
IF Len( mlcLicList ) > 1
@ Row() + 1, 1 SAY Pad( "Lic.02", LIC_TAMANHODESC, "." ) + ".:" GET mlcLicList[ 2, LIC_DATA ]
IF AddMonth( mlcLicList[ 2, LIC_DATA ], mlcLicList[ 2, LIC_VALIDADE ] ) - mlcLicList[ 2, LIC_PRAZO ] < Date()
@ Row(), Col() + 2 SAY Padc( "VENCIDA", 40 ) COLOR SetColorAlerta()
ENDIF
Encontra( AUX_LICTIP + mlcLicList[ 2, LIC_CODIGO ], "jptabel", "numlan" )
@ Row(), 1 SAY Pad( Trim( jptabel->axDescri ), LIC_TAMANHODESC, "." )
ENDIF
IF Len( mlcLicList ) > 2
@ Row() + 1, 1 SAY Pad( "Lic.03", LIC_TAMANHODESC, "." ) + ".:" GET mlcLicList[ 3, LIC_DATA ]
IF AddMonth( mlcLicList[ 3, LIC_DATA ], mlcLicList[ 3, LIC_VALIDADE ]) - mlcLicList[ 3, LIC_PRAZO ] < Date()
@ Row(), Col() + 2 SAY Padc( "VENCIDA", 40 ) COLOR SetColorAlerta()
ENDIF
Encontra( AUX_LICTIP + mlcLicList[ 3, LIC_CODIGO ], "jptabel", "numlan" )
@ Row(), 1 SAY Pad( Trim( jptabel->axDescri ), LIC_TAMANHODESC, "." )
ENDIF
IF Len( mlcLicList ) > 3
@ Row() + 1, 1 SAY Pad( "Lic.04", LIC_TAMANHODESC, "." ) + ".:" GET mlcLicList[ 4, LIC_DATA ]
IF AddMonth( mlcLicList[ 4, LIC_DATA ], mlcLicList[ 4, LIC_VALIDADE ] ) - mlcLicList[ 4, LIC_PRAZO ] < Date()
@ Row(), Col() + 2 SAY Padc( "VENCIDA", 40 ) COLOR SetColorAlerta()
ENDIF
Encontra( AUX_LICTIP + mlcLicList[ 4, LIC_CODIGO ], "jptabel", "numlan" )
@ Row(), 1 SAY Pad( Trim( jptabel->axDescri ), LIC_TAMANHODESC, "." )
ENDIF
IF Len( mlcLicList ) > 4
@ Row() + 1, 1 SAY Pad( "Lic.05", LIC_TAMANHODESC, "." ) + ".:" GET mlcLicList[ 5, LIC_DATA ]
IF AddMonth( mlcLicList[ 5, LIC_DATA ], mlcLicList[ 5, LIC_VALIDADE ] ) - mlcLicList[ 5, LIC_PRAZO ] < Date()
@ Row(), Col() + 2 SAY Padc( "VENCIDA", 40 ) COLOR SetColorAlerta()
ENDIF
Encontra( AUX_LICTIP + mlcLicList[ 5, LIC_CODIGO ], "jptabel", "numlan" )
@ Row(), 1 SAY Pad( Trim( jptabel->axDescri ), LIC_TAMANHODESC, "." )
ENDIF
IF Len( mlcLicList ) > 5
@ Row() + 1, 1 SAY Pad( "Lic.06", LIC_TAMANHODESC, "." ) + ".:" GET mlcLicList[ 6, LIC_DATA ]
IF AddMonth( mlcLicList[ 6, LIC_DATA ], mlcLicList[ 6, LIC_VALIDADE ] ) - mlcLicList[ 6, LIC_PRAZO ] < Date()
@ Row(), Col() + 2 SAY Padc( "VENCIDA", 40 ) COLOR SetColorAlerta()
ENDIF
Encontra( AUX_LICTIP + mlcLicList[ 6, LIC_CODIGO ], "jptabel", "numlan" )
@ Row(), 1 SAY Pad( Trim( jptabel->axDescri ), LIC_TAMANHODESC, "." )
ENDIF
IF Len( mlcLicList ) > 6
@ Row() + 1, 1 SAY Pad( "Lic.07", LIC_TAMANHODESC, "." ) + ".:" GET mlcLicList[ 7, LIC_DATA ]
IF AddMonth( mlcLicList[ 7, LIC_DATA ], mlcLicList[ 7, LIC_VALIDADE ] ) - mlcLicList[ 7, LIC_PRAZO ] < Date()
@ Row(), Col() + 2 SAY Padc( "VENCIDA", 40 ) COLOR SetColorAlerta()
ENDIF
Encontra( AUX_LICTIP + mlcLicList[ 7, LIC_CODIGO ], "jptabel", "numlan" )
@ Row(), 1 SAY Pad( Trim( jptabel->axDescri ), LIC_TAMANHODESC, "." )
ENDIF
IF Len( mlcLicList ) > 7
@ Row() + 1, 1 SAY Pad( "Lic.08", LIC_TAMANHODESC, "." ) + ".:" GET mlcLicList[ 8, LIC_DATA ]
IF AddMonth( mlcLicList[ 8, LIC_DATA ], mlcLicList[ 8, LIC_VALIDADE ] ) - mlcLicList[ 8, LIC_PRAZO ] < Date()
@ Row(), Col() + 2 SAY Padc( "VENCIDA", 40 ) COLOR SetColorAlerta()
ENDIF
Encontra( AUX_LICTIP + mlcLicList[ 8, LIC_CODIGO ], "jptabel", "numlan" )
@ Row(), 1 SAY Pad( Trim( jptabel->axDescri ), LIC_TAMANHODESC, "." )
ENDIF
IF Len( mlcLicList ) > 8
@ Row() + 1, 1 SAY Pad( "Lic.09", LIC_TAMANHODESC, "." ) + ".:" GET mlcLicList[ 9, LIC_DATA ]
IF AddMonth( mlcLicList[ 9, LIC_DATA ], mlcLicList[ 9, LIC_VALIDADE ] ) - mlcLicList[ 9, LIC_PRAZO ] < Date()
@ Row(), Col() + 2 SAY Padc( "VENCIDA", 40 ) COLOR SetColorAlerta()
ENDIF
Encontra( AUX_LICTIP + mlcLicList[ 9, LIC_CODIGO ], "jptabel", "numlan" )
@ Row(), 1 SAY Pad( Trim( jptabel->axDescri ), LIC_TAMANHODESC, "." )
ENDIF
IF Len( mlcLicList ) > 9
@ Row() + 1, 1 SAY Pad( "Lic.10", LIC_TAMANHODESC, "." ) + ".:" GET mlcLicList[ 10, LIC_DATA ]
IF AddMonth( mlcLicList[ 10, LIC_DATA ], mlcLicList[ 10, LIC_VALIDADE ] ) - mlcLicList[ 10, LIC_PRAZO ] < Date()
@ Row(), Col() + 2 SAY Padc( "VENCIDA", 40 ) COLOR SetColorAlerta()
ENDIF
Encontra( AUX_LICTIP + mlcLicList[ 10, LIC_CODIGO ], "jptabel", "numlan" )
@ Row(), 1 SAY Pad( Trim( jptabel->axDescri ), LIC_TAMANHODESC, "." )
ENDIF
IF Len( mlcLicList ) > 10
@ Row() + 1, 1 SAY Pad( "Lic.11", LIC_TAMANHODESC, "." ) + ".:" GET mlcLicList[ 11, LIC_DATA ]
IF AddMonth( mlcLicList[ 11, LIC_DATA ], mlcLicList[ 11, LIC_VALIDADE ] ) - mlcLicList[ 11, LIC_PRAZO ] < Date()
@ Row(), Col() + 2 SAY Padc( "VENCIDA", 40 ) COLOR SetColorAlerta()
ENDIF
Encontra( AUX_LICTIP + mlcLicList[ 11, LIC_CODIGO ], "jptabel", "numlan" )
@ Row(), 1 SAY Pad( Trim( jptabel->axDescri ), LIC_TAMANHODESC, "." )
ENDIF
IF Len( mlcLicList ) > 11
@ Row() + 1, 1 SAY Pad( "Lic.12", LIC_TAMANHODESC, "." ) + ".:" GET mlcLicList[ 12, LIC_DATA ]
IF AddMonth( mlcLicList[ 12, LIC_DATA ], mlcLicList[ 12, LIC_VALIDADE ] ) - mlcLicList[ 12, LIC_PRAZO ] < Date()
@ Row(), Col() + 2 SAY Padc( "VENCIDA", 40 ) COLOR SetColorAlerta()
ENDIF
Encontra( AUX_LICTIP + mlcLicList[ 12, LIC_CODIGO ], "jptabel", "numlan" )
@ Row(), 1 SAY Pad( Trim( jptabel->axDescri ), LIC_TAMANHODESC, "." )
ENDIF
agora mudei pra isto:
FOR EACH oLicenca IN mlcLicList
IF Val( oLicenca[ LIC_CODIGO ] ) != 0
Encontra( AUX_LICTIP + oLicenca[ LIC_CODIGO ], "jptabel", "numlan" )
@ Row() + 1, 1 SAY Pad( Trim( jptabel->axDescri ), LIC_TAMANHODESC, "." )
@ Row(), Col() SAY ":" GET oLicenca[ LIC_DATA ] VALID oLicenca[ LIC_DATA ] <= Date()
@ Row(), Col() + 2 SAY Str( oLicenca[ LIC_VALIDADE ], 3 ) + "m"
@ Row(), Col() + 2 SAY Dtoc( AddMonth( oLicenca[ LIC_DATA ], oLicenca[ LIC_VALIDADE ] ) )
@ Row(), Col() + 2 SAY Str( oLicenca[ LIC_PRAZO ], 3 ) + "d"
IF AddMonth( oLicenca[ LIC_DATA ], oLicenca[ LIC_VALIDADE ] ) - oLicenca[ LIC_PRAZO ] < Date() ;
.OR. ( oLicenca[ LIC_DATA ] > Date() .AND. oLicenca[ LIC_DATA ] - oLicenca[ LIC_PRAZO ] < Date() )
@ Row(), Col() + 2 SAY Padc( "VENCIDA", 20 ) COLOR SetColorAlerta()
ELSEIF oLicenca[ LIC_DATA ] > Date()
@ Row(), Col() + 2 SAY Padc( "DATA ERRADA", 20 ) COLOR SetColorAlerta()
ENDIF
ENDIF
NEXT
Antes era um texto, e a data pra ser digitada, pra cada um dos Ãtens da lista.
Agora tem texto, data, meses, data vencto, dias pra aviso, pra cada um dos Ãtens da lista
Pois é.... dobrou a quantidade de informação, e ficou mais simples que antes, graças ao uso do FOR/EACH