Erro Validador de Data

Estou com esse seguinte problema neste validador de datas.

ele dá erro na linha : aDate := {|Val(cData[1, 2]), Val(cData[4, 2]), Val(cData[7, 4])}

entao encontrei o erro, e estou chamando ele assim:

dDat_DE := FwInputBox("Digite a data inicial",dDat_DE) If IsValidDate(dDat_DE) = .F. MsgStop("Data inicial inválida") Return lValido Else dDat_ATE := FwInputBox("Digite a data final", dDat_ATE) If IsValidDate(dDat_ATE) = .F. MsgStop("Data final inválida") Return lValido Else dDat_DE := cToD(dDat_DE) dDat_ATE := cToD(dDat_ATE) Endif Endif

:warning: Atenção: Esta publicação foi transferida automaticamente do fórum antigo, mas os anexos não foram incluídos.

A atribuição do Array está incorreta, possui um Pipe "|" onde não deveria existir.

Acredito que dessa forma funcionará corretamente:


aDate := {Val(cData[1, 2]), Val(cData[4, 2]), Val(cData[7, 4])}

Observação: Necessário avaliar o retorno da função Val nessa situação, pois será retornado um valor numérico e que pode ocasionar problemas em comparações com outras datas.


Para a sua necessidade, acredito que o uso da função ParamBox irá atender e facilitar o seu trabalho.

Ela cria uma tela de parâmetros de acordo com as perguntas passadas, e já possui alguns controles próprios como validação de datas, parâmetros obrigatórios, etc.


User Function XTESTE

    If(fGetParams())

        // se entrar, é porque os parâmetros digitados obedeceram as regras configuradas
        Alert('Data inicial: ' + dToC(MV_PAR01))
        Alert('Data final: ' + dToC(MV_PAR02))

    Else

        // se não, ou o usuário cancelou a tela ou informou parâmetros inválidos

    EndIf

Return

Static Function fGetParams
Local aPergs        as Array
Local lRet            as Logical

    aPergs        := {}
    lRet        := .F.
    MV_PAR01    := cToD(Space(8))
    MV_PAR02    := cToD(Space(8))

    aAdd(aPergs, { 1, 'Data inicial de cancelamento'     , MV_PAR01, ''  , 'NaoVazio()'    , ''    , '.T.'                , 050, .T.})
    aAdd(aPergs, { 1, 'Data final de cancelamento'        , MV_PAR02, ''     , 'NaoVazio()'    , ''      , '.T.'                , 050, .T.})

    If(ParamBox(aPergs, 'Parâmetros'))

        lRet := .T.

    EndIf

Return(lRet)

exemplo_parambox.jpg

No exemplo a seguir, a função estática fGetParams possui um retorno lógico, e sempre irá retornar verdadeiro caso o usuário tenha preenchido os dados corretamente.

Usamos as variáveis públicas MV_PAR para preenchimento dos parâmetros que o usuário digitar, e através do array aPergs você consegue adicionar e configurar as perguntas, como nome, tipo, qual variável será preenchida por qual pergunta, validações e obrigatoriedade. Como eu iniciei minhas duas variáveis MV_PAR como Date e em branco, a função ParamBox irá criar dois campos do tipo data que já estarão avaliando se a data que o usuário digitou é válida (impedindo inclusive que ele digite datas que não existam, como 31/02/2023 por exemplo) além de criar um calendário ao lado do campo.

Para maiores informações sobre a função ParamBox: https://terminaldeinformacao.com/knowledgebase/parambox/

:warning: Atenção: Esta publicação foi transferida automaticamente do fórum antigo, mas os anexos não foram incluídos.

Agora o erro é no Try
dDate := CtoD(aDate)
Catch
Return .F.
EndTry

Você precisa especificar qual posição do array deve ser convertida para data com a função cToD. Seguindo o exemplo acima, o seu Array terá 3 posições. Dessa forma, ficará cou cToD(aDate[1]) ou cToD(aDate[1] + aDate[2] + aDate[3]), etc. Mas atente-se porque a função cToD converte de caractere para date, então podem ser gerados erros caso o valor repassado for numérico.

Entao nao resolveu, respondendo: o usuario é obrigado a digitar o / junto com a data , isso já obriga o campo a ser caractere né ?

Agora o erro está na linha do catch.
Após o Catch pode ficar vazio(como um Else) ou tenho que colocar algo ali, como se esse catch precisasse selecionar algo exemplo (Catch oError)

Se precisar segue o prw abaixo

:warning: Atenção: Esta publicação foi transferida automaticamente do fórum antigo, mas os anexos não foram incluídos.

Atualizei minha resposta, dê uma olhada.

Muito obrigado Giordano, vou testar agora , mas vejo que vai dar certinho , Valeu mesmo

deu certo, valeu