Teria um jeito melhor de fazer isto? Talvez a tal variável hash?
Como o filtro precisaria de variáveis private, procurei reduzir pra uma única.
Um array com a estrutura, e elementos adicionais pra extras
Cada elemento contém nome, Sim/Não se filtro está ativado, campo inicial e campo final (mesmo se só usar um deles)
1) Esta função é a que gerencia os elementos, permitindo criar/salvar/recuperar informação
Código: Selecionar todos
#define FILTRO_CAMPO 1
#define FILTRO_ATIVADO 2
#define FILTRO_INI 3
#define FILTRO_FIM 4
STATIC FUNCTION osFiltroByName( cCampo, cFiltraSN, xValueIni, xValueFim )
LOCAL nCont, acStru, xValue
MEMVAR mFiltroOs
IF cCampo == "INICIALIZA"
acStru := dbStruct()
FOR nCont = 1 TO Len( acStru )
xValue := FieldGet( nCont )
DO CASE
CASE ValType( xValue ) == "C"
xValue := Space( Len( xValue ) )
CASE ValType( xValue ) == "D"
xValue := Ctod("")
CASE ValType( xValue ) == "N"
xValue := 0
ENDCASE
Aadd( mFiltroOs, { acStru[ nCont, 1 ], "N", xValue, xValue } )
NEXT
Aadd( mFiltroOs, { "DTOCO", "N", Ctod(""), Ctod("") } )
Aadd( mFiltroOs, { "DEMCLI", "N", "N", "N" } )
Aadd( mFiltroOs, { "DEMFOR", "N", "N", "N" } )
Aadd( mFiltroOs, { "PEDIDO", "N", "N", "N" } )
Aadd( mFiltroOs, { "CODBAR", "N", Space( Len( jpordser->osCodBar1 ) ), Space( Len( jpordser->osCodBar1 ) ) } )
RETURN NIL
ENDIF
FOR nCont = 1 TO Len( mFiltroOs )
IF mFiltroOs[ nCont, FILTRO_CAMPO ] == cCampo
IF cFiltraSN == NIL
RETURN mFiltroOs[ nCont ]
ENDIF
mFiltroOs[ nCont, FILTRO_ATIVADO ] := cFiltraSN
mFiltroOs[ nCont, FILTRO_INI ] := xValueIni
mFiltroOs[ nCont, FILTRO_FIM ] := xValueFim
EXIT
ENDIF
NEXT
RETURN NIL
Código: Selecionar todos
FUNCTION FiltroOs()
LOCAL nCont
MEMVAR mFiltroOs, m_Prog
IF .NOT. jpordser->osRecarga == iif( m_Prog == "PSER0010", "S", "N" )
RETURN .f.
ENDIF
IF Len( mFiltroOs ) == 0
RETURN .t.
ENDIF
FOR nCont = 1 TO FCount()
IF mFiltroOs[ nCont, FILTRO_ATIVADO ] == "S"
IF .NOT. Empty( mFiltroOs[ nCont, FILTRO_INI ] )
IF FieldGet( nCont ) < mFiltroOs[ nCont, FILTRO_INI ]
RETURN .f.
ENDIF
ENDIF
IF .NOT. Empty( mFiltroOs[ nCont, FILTRO_FIM ] )
IF FieldGet( nCont ) > mFiltroOs[ nCont, FILTRO_FIM ]
RETURN .f.
ENDIF
ENDIF
ENDIF
NEXT
IF osFiltroByName( "DTOCO" )[ FILTRO_ATIVADO ] == "S"
SELECT jpreguso
SEEK Pad( "JPORDSER", 8 ) + jpordser->osNumLan
DO WHILE jpreguso->ruArquivo == Pad( "JPORDSER", 8 ) .AND. jpreguso->ruCodigo == jpordser->osNumLan .AND. .NOT. Eof()
IF .NOT. Empty( osFiltroByName( "DTOCO" )[ FILTRO_INI ] )
IF Left( jpreguso->ruInfInc, 4 ) < Left( Dtos( osFiltroByName( "DTOCO" )[ FILTRO_INI ] ), 4 )
RETURN .f.
ENDIF
ENDIF
IF .NOT. Empty( osFiltroByName( "DTOCO" )[ FILTRO_FIM ] )
IF Left( jpreguso->ruInfInc, 4 ) > Left( Dtos( osFiltroByName( "DTOCO" )[ FILTRO_FIM ] ), 4 )
RETURN .f.
ENDIF
ENDIF
SKIP
ENDDO
SELECT jpordser
ENDIF
IF osFiltroByName( "DEMCLI" )[ FILTRO_ATIVADO ] == "S"
IF osFiltroByName( "DEMCLI" )[ FILTRO_INI ] == "S"
IF Val( jpordser->osDemFin ) == 0
RETURN .f.
ENDIF
ELSE
IF Val( jpordser->osDemFin ) != 0
RETURN .f.
ENDIF
ENDIF
ENDIF
IF osFiltroByName( "DEMFOR" )[ FILTRO_ATIVADO ] == "S"
IF osFiltroByName( "DEMFOR" )[ FILTRO_INI ] == "S"
IF Val( jpordser->osDemPag ) == 0
RETURN .f.
ENDIF
ELSE
IF Val( jpordser->osDemPag ) != 0
RETURN .f.
ENDIF
ENDIF
ENDIF
IF osFiltroByName( "PEDIDO" )[ FILTRO_ATIVADO ] == "S"
IF osFiltroByName( "PEDIDO" )[ FILTRO_INI ] == "S"
IF Val( jpordser->osPedido1 ) == 0 .AND. Val( jpordser->osPedido2 ) == 0 .AND. Val( jpordser->osPedido3 ) == 0
RETURN .f.
ENDIF
ELSE
IF Val( jpordser->osPedido1 ) != 0 .OR. Val( jpordser->osPedido2 ) != 0 .OR. Val( Jpordser->osPedido3 ) != 0
RETURN .f.
ENDIF
ENDIF
ENDIF
IF osFiltroByName( "CODBAR" )[ FILTRO_ATIVADO ] == "S"
IF jpordser->osCodBar1 == osFiltroByName( "CODBAR" )[ FILTRO_INI ]
RETURN .t.
ENDIF
IF jpordser->osCodBar2 == osFiltroByName( "CODBAR" )[ FILTRO_INI ]
RETURN .t.
ENDIF
IF Encontra( jpordser->osNumLan + osFiltroByName( "CODBAR" )[ FILTRO_INI ], "jpordbar", "osbar" )
RETURN .t.
ENDIF
RETURN .f.
ENDIF
RETURN .t.
Código: Selecionar todos
STATIC FUNCTION TelaFiltroOs()
LOCAL GetList := {}, nCont, mCancelaFiltro := "N"
LOCAL mFiltroDatPrc, mosDatPrci, mosDatPrcf
LOCAL mFiltroDatPrf, mosDatPrfi, mosDatPrff
LOCAL mFiltroRecarga, mosRecargai
LOCAL mFiltroAparelho, mosAparelhoi
LOCAL mFiltroStatus, mosStatusi, mosStatusf
LOCAL mFiltroStatec, mosStateci, mosStaTecf
LOCAL mFiltroStaCli, mosStaClii
LOCAL mFiltroUrgente, mosUrgentei
LOCAL mFiltroIntExt, mosIntExti
LOCAL mFiltroNumDep, mosNumDepi
LOCAL mFiltroDatEmi, mosDatEmii, mosDatEmif
LOCAL mFiltroSosDat, mosSosDati, mosSosDatf
LOCAL mFiltroSosHor, mosSosHori, mosSosHorf
LOCAL mFiltroDtOco, mDtOcoi, mDtOcof
LOCAL mFiltroDemCli, mDemCliSN
LOCAL mFiltroDemFor, mDemForSN
LOCAL mFiltroPedido, mPedidoSN
LOCAL mFiltroCodBar, mCodBarI
MEMVAR mFiltroOs
mFiltroDatPrc := osFiltroByName( "OSDATPRC" )[ FILTRO_ATIVADO ]
mosDatPrci := osFiltroByName( "OSDATPRC" )[ FILTRO_INI ]
mosDatPrcf := osFiltroByName( "OSDATPRC" )[ FILTRO_FIM ]
mFiltroDatPrf := osFiltroByName( "OSDATPRF" )[ FILTRO_ATIVADO ]
mosDatPrfi := osFiltroByName( "OSDATPRF" )[ FILTRO_INI ]
mosDatPrff := osFiltroByName( "OSDATPRF" )[ FILTRO_FIM ]
mFiltroRecarga := osFiltroByName( "OSRECARGA" )[ FILTRO_ATIVADO ]
mosRecargai := osFiltroByName( "OSRECARGA" )[ FILTRO_INI ]
mFiltroAparelho := osFiltroByName( "OSAPARELHO" )[ FILTRO_ATIVADO ]
mosAparelhoi := osFiltroByName( "OSAPARELHO" )[ FILTRO_INI ]
mFiltroStatus := osFiltroByName( "OSSTATUS" )[ FILTRO_ATIVADO ]
mosStatusi := osFiltroByName( "OSSTATUS" )[ FILTRO_INI ]
mosStatusf := osFiltroByName( "OSSTATUS" )[ FILTRO_FIM ]
mFiltroStaTec := osFiltroByName( "OSSTATEC" )[ FILTRO_ATIVADO ]
mosStaTeci := osFiltroByName( "OSSTATEC" )[ FILTRO_INI ]
mosStaTecf := osFiltroByName( "OSSTATEC" )[ FILTRO_FIM ]
mFiltroStaCli := osFiltroByName( "OSSTACLI" )[ FILTRO_ATIVADO ]
mosStaClii := osFiltroByName( "OSSTACLI" )[ FILTRO_INI ]
mFiltroNumDep := osFiltroByName( "OSNUMDEP" )[ FILTRO_ATIVADO ]
mosNumDepi := osFiltroByName( "OSNUMDEP" )[ FILTRO_INI ]
mFiltroUrgente := osFiltroByName( "OSURGENTE" )[ FILTRO_ATIVADO ]
mosUrgentei := osFiltroByName( "OSURGENTE" )[ FILTRO_INI ]
mFiltroIntExt := osFiltroByName( "OSINTEXT" )[ FILTRO_ATIVADO ]
mosIntExti := osFiltroByName( "OSINTEXT" )[ FILTRO_INI ]
mFiltroDatEmi := osFiltroByName( "OSDATEMI" )[ FILTRO_ATIVADO ]
mosDatEmii := osFiltroByName( "OSDATEMI" )[ FILTRO_INI ]
mosDatEmif := osFiltroByName( "OSDATEMI" )[ FILTRO_FIM ]
mFiltroSosDat := osFiltroByName( "OSSOSDAT" )[ FILTRO_ATIVADO ]
mosSosDati := osFiltroByName( "OSSOSDAT" )[ FILTRO_INI ]
mosSosDatf := osFiltroByName( "OSSOSDAT" )[ FILTRO_FIM ]
mFiltroSosHor := osFiltroByName( "OSSOSHOR" )[ FILTRO_ATIVADO ]
mosSosHori := osFiltroByName( "OSSOSHOR" )[ FILTRO_INI ]
mosSosHorf := osFiltroByName( "OSSOSHOR" )[ FILTRO_FIM ]
mFiltroDtOco := osFiltroByName( "DTOCO" )[ FILTRO_ATIVADO ]
mDtOcoi := osFiltroByName( "DTOCO" )[ FILTRO_INI ]
mDtOcof := osFiltroByName( "DTOCO" )[ FILTRO_FIM ]
mFiltroDemCli := osFiltroByName( "DEMCLI" )[ FILTRO_ATIVADO ]
mDemCliSN := osFiltroByName( "DEMCLI" )[ FILTRO_ATIVADO ]
mFiltroDemFor := osFiltroByName( "DEMFOR" )[ FILTRO_ATIVADO ]
mDemForSN := osFiltroByName( "DEMFOR" )[ FILTRO_INI ]
mFiltroPedido := osFiltroByName( "PEDIDO" )[ FILTRO_ATIVADO ]
mPedidoSN := osFiltroByName( "PEDIDO" )[ FILTRO_INI ]
mFiltroCodBar := osFiltroByName( "CODBAR" )[ FILTRO_ATIVADO ]
mCodBarI := osFiltroByName( "CODBAR" )[ FILTRO_INI ]
WOpen( 7, 5, 30, 90, "Filtro de OS" )
@ 9, 7 SAY "Elimina filtro" GET mCancelaFiltro PICTURE "!A" VALID mCancelaFiltro $ "SN"
@ Row()+2, 7 SAY "Previsao Cliente de/ate:" GET mFiltroDatPrc PICTURE "!A" VALID mFiltroDatPrc $ "SN" WHEN mCancelaFiltro != "S"
@ Row(), Col()+2 GET mosDatPrci WHEN mFiltroDatPrc == "S" .AND. mCancelaFiltro != "S"
@ Row(), Col()+2 GET mosDatPrcf WHEN mFiltroDatPrc == "S" .AND. mCancelaFiltro != "S"
@ Row()+1, 7 SAY "Previsao Fornecedor de/ate:" GET mFiltroDatPrf PICTURE "!A" VALID mFiltroDatPrf $ "SN" WHEN mCancelaFiltro != "S"
@ Row(), Col()+2 GET mosDatPrfi WHEN mFiltroDatPrf == "S" .AND. mCancelaFiltro != "S"
@ Row(), Col()+2 GET mosDatPrff WHEN mFiltroDatPrf == "S" .AND. mCancelaFiltro != "S"
@ Row()+1, 7 SAY "Recarga:" GET mFiltroRecarga PICTURE "!A" VALID mFiltroRecarga $ "SN" WHEN mCancelaFiltro != "S"
@ Row(), Col()+2 SAY "Recarga (S/N):" GET mosRecargai PICTURE "!A" VALID mosRecargai $ "SN" WHEN mFiltroRecarga == "S" .AND. mCancelaFiltro != "S"
@ Row()+1, 7 SAY "Aparelho:" GET mFiltroAparelho PICTURE "!A" VALID mFiltroAparelho $ "SN" WHEN mCancelaFiltro != "S"
@ Row(), Col()+2 GET mosAparelhoi PICTURE "@!" VALID Valida():Auxiliar( mosAparelhoi, 97 ) WHEN mFiltroAparelho == "S" .AND. mCancelaFiltro != "S"
@ Row()+1, 7 SAY "Status Tecnico de/ate:" GET mFiltroStaTec PICTURE "!A" VALID mFiltroStaTec $ "SN" WHEN mCancelaFiltro != "S"
@ Row(), Col()+2 GET mosStaTeci PICTURE "@K 999999" WHEN mFiltroStaTec == "S" .AND. mCancelaFiltro != "S" VALID AuxOrdTecClass():Valida( @mosStaTeci )
@ Row(), Col()+2 GET mosStaTecf PICTURE "@K 999999" WHEN mFiltroStaTec == "S" .AND. mCancelaFiltro != "S" VALID AuxOrdTecClass():Valida( @mosStaTecf )
@ Row()+1, 7 SAY "Status de/ate:" GET mFiltroStatus PICTURE "!A" VALID mFiltroStatus $ "SN" WHEN mCancelaFiltro != "S"
@ Row(), Col()+2 GET mosStatusi PICTURE "@K 999999" WHEN mFiltroStatus == "S" .AND. mCancelaFiltro != "S" VALID AuxOrdStaClass():Valida( @mosStatusi )
@ Row(), Col()+2 GET mosStatusf PICTURE "@K 999999" WHEN mFiltroStatus == "S" .AND. mCancelaFiltro != "S" VALID AuxOrdStaClass():Valida( @mosStatusf )
@ Row()+1, 7 SAY "Status Cliente:" GET mFiltroStaCli PICTURE "!A" VALID mFiltroStaCli $ "SN" WHEN mCancelaFiltro != "S"
@ Row(), Col()+2 GET mosStaClii PICTURE "@K 999999" WHEN mFiltroStaCli == "S" .AND. mCancelaFiltro != "S" VALID AuxOrdCliClass():Valida( @mosStaClii )
@ Row()+1, 7 SAY "Localizacao:" GET mFiltroNumDep PICTURE "!A" VALID mFiltroNumDep $ "SN" WHEN mCancelaFiltro != "S"
@ Row(), Col()+2 GET mosNumDepi PICTURE "9" WHEN mFiltroNumDep == "S" .AND. mCancelaFiltro != "S"
@ Row()+1, 7 SAY "Urgente:" GET mFiltroUrgente PICTURE "!A" VALID mFiltroUrgente $ "SN" WHEN mCancelaFiltro != "S"
@ Row(), Col()+2 GET mosUrgentei PICTURE "!A" WHEN mFiltroUrgente == "S" .AND. mCancelaFiltro != "S"
@ Row()+1, 7 SAY "Int/Ext:" GET mFiltroIntExt PICTURE "!A" VALID mFiltroIntExt $ "SN" WHEN mCancelaFiltro != "S"
@ Row(), Col()+2 GET mosIntExti PICTURE "!A" WHEN mFiltroIntExt == "S" .AND. mCancelaFiltro != "S"
@ Row()+1, 7 SAY "Emissao de/ate:" GET mFiltroDatEmi PICTURE "!A" VALID mFiltroDatEmi $ "SN" WHEN mCancelaFiltro != "S"
@ Row(), Col()+2 GET mosDatEmii WHEN mFiltroDatEmi == "S" .AND. mCancelaFiltro != "S"
@ Row(), Col()+2 GET mosDatEmif WHEN mFiltroDatEmi == "S" .AND. mCancelaFiltro != "S"
@ Row()+1, 7 SAY "Lembrete Data de/ate:" GET mFiltroSosDat PICTURE "!A" VALID mFiltroSosDat $ "SN" WHEN mCancelaFiltro != "S"
@ Row(), Col()+2 GET mosSosDati WHEN mFiltroSosDat == "S" .AND. mCancelaFiltro != "S"
@ Row(), Col()+2 GET mosSosDatf WHEN mFiltroSosDat == "S" .AND. mCancelaFiltro != "S"
@ Row()+1, 7 SAY "Lembrete Hora de/ate:" GET mFiltroSosHor PICTURE "!A" VALID mFiltroSosHor $ "SN" WHEN mCancelaFiltro != "S"
@ Row(), Col()+2 GET mosSosHori WHEN mFiltroSosHor == "S" .AND. mCancelaFiltro != "S"
@ Row(), Col()+2 GET mosSosHorf WHEN mFiltroSosHor == "S" .AND. mCancelaFiltro != "S"
@ Row()+1, 7 SAY "Ocorrencias de/ate:" GET mFiltroDtOco PICTURE "!A" VALID mFiltroDtOco $ "SN" WHEN mCancelaFiltro != "S"
@ Row(), Col()+2 GET mDtOcoi WHEN mFiltroDtOco == "S" .AND. mCancelaFiltro != "S"
@ Row(), Col()+2 GET mDtOcof WHEN mFiltroDtOco == "S" .AND. mCancelaFiltro != "S"
@ Row()+1, 7 SAY "Dem.Cliente:" GET mFiltroDemCli PICTURE "!A" VALID mFiltroDemCli $ "SN" WHEN mCancelaFiltro != "S"
@ Row(), Col()+2 SAY "Com Demonstrativo (S/N):" GET mDemCliSN PICTURE "!A" VALID mDemCliSN $ "SN" WHEN mFiltroDemCli == "S" .AND. mCancelaFiltro != "S"
@ Row()+1, 7 SAY "Dem.Fornec:" GET mFiltroDemFor PICTURE "!A" VALID mFiltroDemFor $ "SN" WHEN mCancelaFiltro != "S"
@ Row(), Col()+2 SAY "Com Demonstrativo (S/N):" GET mDemForSN PICTURE "!A" VALID mDemForSN $ "SN" WHEN mFiltroDemFor == "S" .AND. mCancelaFiltro != "S"
@ Row()+1, 7 SAY "Pedido:" GET mFiltroPedido PICTURE "!A" VALID mFiltroPedido $ "SN" WHEN mCancelaFiltro != "S"
@ Row(), Col()+2 SAY "Com Pedido (S/N):" GET mPedidoSN PICTURE "!A" VALID mPedidoSN $ "SN" WHEN mFiltroPedido == "S" .AND. mCancelaFiltro != "S"
@ Row()+1, 7 SAY "Cod.Barras:" GET mFiltroCodBar PICTURE "!A" VALID mFiltroCodBar $ "SN" WHEN mCancelaFiltro != "S"
@ Row(), Col()+2 GET mCodBarI PICTURE "@!" WHEN mFiltroCodBar == "S" .AND. mCancelaFiltro != "S"
Mensagem( "Selecione filtros, ESC mantem filtro existente" )
READ
Mensagem()
IF LastKey() != K_ESC
IF mCancelaFiltro == "S"
FOR nCont = 1 TO Len( mFiltroOs )
mFiltroOs[ nCont, FILTRO_ATIVADO ] := "N"
NEXT
ELSE
osFiltroByName( "OSDATPRC", mFiltroDatPrc, mosDatPrci, mosDatPrcf )
osFiltroByName( "OSDATPRF", mFiltroDatPrf, mosDatPrfi, mosDatPrff )
osFiltroByName( "OSRECARGA", mFiltroRecarga, mosRecargai, mosRecargai )
osFiltroByName( "OSAPARELHO", mFiltroAparelho, mosAparelhoi, mosAparelhoi )
osFiltroByName( "OSSTATUS", mFiltroStatus, mosStatusi, mosStatusf )
osFiltroByName( "OSSTATEC", mFiltroStaTec, mosStaTeci, mosStaTecf )
osFiltroByName( "OSSTACLI", mFiltroStaCli, mosStaClii, mosStaClii )
osFiltroByName( "OSNUMDEP", mFiltroNumDep, mosNumDepi, mosNumDepi )
osFiltroByName( "OSURGENTE", mFiltroUrgente, mosUrgentei, mosUrgentei )
osFiltroByName( "OSINTEXT", mFiltroIntExt, mosIntExti, mosIntExti )
osFiltroByName( "OSDATEMI", mFiltroDatEmi, mosDatEmii, mosDatEmif )
osFiltroByName( "OSSOSDAT", mFiltroSosDat, mosSosDati, mosSosDatf )
osFiltroByName( "OSSOSHOR", mFiltroSosHor, mosSosHori, mosSosHorf )
osFiltroByName( "DTOCO", mFiltroDtOco, mDtOcoi, mDtOcof )
osFiltroByName( "DEMCLI", mFiltroDemCli, mDemCliSN, mDemCliSN )
osFiltroByName( "DEMFOR", mFiltroDemFor, mDemForSN, mDemForSN )
osFiltroByName( "PEDIDO", mFiltroPedido, mPedidoSN, mPedidoSN )
osFiltroByName( "CODBAR", mFiltroCodBar, mCodBarI, mCodBarI )
ENDIF
ENDIF
SET FILTER TO FiltroOs()
GOTO TOP
WClose()
RETURN NIL
Agora que percebi alguns erros no filtroOs(), de retornar em área errada. Vou corrigir acrescentando SELECT (nSelect) mas não vou postar novamente.
Só queria saber se tem como simplificar, mantendo os nomes de varíaveis nos GETS, ou de alguma forma que eu consiga ter estes nomes com identificação exclusiva (saber exatamente quem é quem num ReadVar() )
Ou usar as variáveis hash, ou algum jeito diferente pra simplificar/agilizar o resto.

