Erro ao executar

Erro que aparece na tela :

THREAD ERROR ([5228], agnes.santos, 01TI011) 06/12/2023 16:44:14 argument #0 error, expected D->C, function dtoc on FTITULOS(SRFAT004.PRW) 06/12/2023 16:39:15 line : 23



static function fTitulos(cCodCli,cLjCli)

    Local aArea        :=    GetArea()
    Local aRet        :=    {}
    Local cAlias    :=    GetNextAlias()
    Local cStat        :=    ""
    Local cStat1    :=    ""

    BeginSql Alias cAlias

        SELECT     E1_PREFIXO, 
                E1_NUM, 
                E1_VENCREA, 
                E1_SALDO
        FROM     %TABLE:SE1%
        WHERE     %NOTDEL% AND
                E1_CLIENTE = E1_CLIENTE AND
                E1_LOJA = %EXP:cLjCli% AND
                E1_SALDO > 0

    EndSql

    dbSelectArea(cAlias)
    (cAlias)->(dbGoTop())
    While (cAlias)->(!eof())

        If (cAlias)->E1_VENCREA <= dtoc(ddatabase)
            cStat    :=    "Sim"
        Else
            cStat    :=    "Não"
        EndIf
            cStat1    +=    (cAlias)->E1_PREFIXO +"/"+ (cAlias)->E1_NUM +"/"+ dToc((cAlias)->E1_VENCREA) + "/" + Transform(E1_SALDO,"@E 999,999,999.99")
        (cAlias)-> (DBSKIP( ))
    EndDo    
    aAdd(aRet,{cStat,cStat1})
    RestArea(aArea) 
return aRet

Olá,

Agnes as datas do Protheus são salvas por padrão como varchar no banco de dados, basicamente é tudo string.

Quando a tabela é criada, ela cria um metadado que o DBAccess faz uso para saber que o campo X apesar de ser um varchar, trata-se de uma data e faz essa conversão pra gente de forma automática.

Porém quando você abre uma query, você é responsável por fazer essa transformação.

Aí fica conforme sua lógica, você pode enviar ao Embedded SQL a definição dos campos, pode utilizar a TCSetField após abrir a query para fazer essa conversão e caso você pretenda já trabalhar com a data como string, basta não tentar utilizar funções de conversão como DtoC ou DtoS.

Dentre essas possíveis correções, segue um exemplo de como corrigir via Embedded SQL para que seu campo seja de fato uma data:


BeginSql Alias cAlias
    column E1_VENCREA as Date

    SELECT E1_PREFIXO, 
           E1_NUM, 
           E1_VENCREA, 
           E1_SALDO
      FROM %TABLE:SE1%
     WHERE %NOTDEL% AND
           E1_CLIENTE = E1_CLIENTE AND
           E1_LOJA = %EXP:cLjCli% AND
           E1_SALDO > 0
EndSql

Documentações:

https://tdn.totvs.com.br/display/tec/TCSetField

https://tdn.totvs.com.br/display/public/framework/Embedded+SQL

Muito obrigada Daniel!