Percebe como a comunicação errada gera uma perda de tempo desnecessária? O problema deste tópico não precisaria de 40 posts até agora...
Veja se a solução abaixo resolve o caso.
Código: Selecionar todos
// Compilar: hbmk2 teste hbmemio.hbc
// Economizando variáveis locais...
// CRT VC MD
#define CRT1 { "I...", 1, 23 }
#define CRT2 { "O...", 5, 28 }
#define CRT3 { "B...", 8, 24 }
#define CRT4 { "V...", 12, 2 }
#define CRT5 { "N...", 18, 11 }
#define CRT6 { "C...", 20, 10 }
#define CRT7 { "S...", 22, 10 }
#define CRT8 { "R...", 25, 11 }
#define CRT9 { "X...", 28, 18 }
// Posições em aArray
#define A_DESCRICAO 1
#define A_VENCIMENTO 2
#define A_MELHOR_DIA 3
#include "box.ch"
#include "inkey.ch"
REQUEST HB_MEMIO
REQUEST DBFCDX
REQUEST HB_LANG_PT
REQUEST HB_CODEPAGE_PTISO
FUNCTION CrtMelhor()
LOCAL aArray, aList
LOCAL aSelecionados, aSelecionado
LOCAL nDay
Hb_LangSelect( 'PT' )
Hb_CdpSelect( "PTISO" )
SetBlink( .F. )
SetColor( "N/W,W+/N" )
SetMode( 45, 100 )
CLS
aArray := {}
AAdd( aArray, CRT1 )
AAdd( aArray, CRT2 )
AAdd( aArray, CRT3 )
AAdd( aArray, CRT4 )
AAdd( aArray, CRT5 )
AAdd( aArray, CRT6 )
AAdd( aArray, CRT7 )
AAdd( aArray, CRT8 )
AAdd( aArray, CRT9 )
DbCreate("mem:Teste", { { "Dia", "N", 2, 0 }, ;
{ "Cartao", "C", 4, 0 }, ;
{ "Vencimento", "N", 2, 0 }, ;
{ "MelhorDia", "N", 2, 0 } } ,"DBFCDX", .T., "Teste")
For nDay := 1 To 31
aSelecionados := DefineCrt( nDay, AClone( aArray ) )
If Empty( aSelecionados )
// Nenhum cartão encontrato... cria um registro "fake"
aSelecionados := { { "NULL", 0, 0 } }
Endif
For Each aSelecionado In aSelecionados
Teste->( DbAppend() )
Teste->Dia := nDay
Teste->Cartao := aSelecionado[ A_DESCRICAO ]
Teste->Vencimento := aSelecionado[ A_VENCIMENTO ]
Teste->MelhorDia := aSelecionado[ A_MELHOR_DIA ]
Next
Next
DispBox( 2, 53, 15, 85, B_SINGLE + " " )
DispOutAt( 3, 55, "Dia Cart Venc Melhor dia", "B+/GR*" )
For Each aSelecionado In aArray
DispOutAt( aSelecionado:__enumIndex() + 3, 55, ;
PadC( aSelecionado[ A_DESCRICAO ], 6 ) + ;
PadC( Transform( aSelecionado[ A_VENCIMENTO ], "99" ), 14 ) + ;
PadC( Transform( aSelecionado[ A_MELHOR_DIA ], "99" ), 10 ) )
Next
DispOutAt( maxRow() - 3, 2, PadC( "Use " + Chr(27) + Chr(24) + Chr(25) + Chr(26) + ;
" Ctrl[PgUp/PgDn] [ESC]...", 50 ) )
Teste->( DbGoTop(), Browse( 2, 2, MaxRow()-5, 50 ) )
DbCloseArea( "Teste" )
DbDrop("mem:Teste",,"DBFCDX")
CLS
RETURN NIL
//---------------------------------------------------------------------------------
STATIC FUNCTION DefineCrt( nDay, aCartoes )
LOCAL aSelecionados := {}, aCartao, nLoop, nPos
LOCAL aTemp
For nLoop := 1 To 4
nPos := 0
// Para cada elemento e no aArray...
For Each aCartao In aCartoes
// Cada elemento aCartao também é um array...
// Se o dia atual em nDay for maior ou igual
// à terceira posição do aCartao (MELHOR DIA) ...
If nDay >= aCartao[ A_MELHOR_DIA ]
// Se primeira vez ou se a segunda posição do aCartao (VENCIMENTO)
// for maior que o anterior, guarda o aCartao atual
If Empty( aTemp ) .Or. ;
aCartao[ A_VENCIMENTO ] > aTemp[ A_VENCIMENTO ]
aTemp := aCartao
nPos := aCartao:__enumIndex()
Endif
Endif
Next
If nPos > 0
// Se encontrou, acumula
AAdd( aSelecionados, aTemp )
ADel( aCartoes, nPos )
ASize( aCartoes, Len( aCartoes ) - 1 )
aTemp := {}
Else
// não encontrou nenhum cartão para o dia atual
Exit
Endif
Next
// Ordena os cartões encontrados para o dia por vencimento e retorna
RETURN ASort( aSelecionados,,, { |x,y| x[ A_VENCIMENTO ] > y[ A_VENCIMENTO ] } )
//---------------------------------------------------------------------------------