Página 1 de 1

Vetor condicional. Tem como fazer isso?

Enviado: 03 Out 2007 15:33
por miracle
Tenho em um de meus sistemas um DBEdit que mostra o cartão de ponto dos funcionários. A declaração dos vetores que preenchem esse DBEdit é mais ou menos assim:

Código: Selecionar todos

PUBLIC vCAMPOS[12],vTITULOS[12],vMASCARAS[12]
//(...)
vCAMPOS[09] = "ATRASOS"
vCAMPOS[10] = "SAIDAS"
//(...)
vTITULOS[09] = "ATRASOS"
vTITULOS[10] = "SAIDAS"
//(...)
vMASCARAS[09] = "ATRASOS"
vMASCARAS[10] = "SAIDAS"
Funciona perfeitamente. Só que os campos referidos armazenam, no DBF, valores como "00:00". E esses valores são mostrados no DBEdit.
Para que o usuário visualize melhor o cartão na tela, sem esse monte de zeros que embaralham a visão, gostaria de colocar uma cláusula If dentro do vetor da seguinte forma:

Código: Selecionar todos

vCAMPOS[09] = IF(ATRASOS = "00:00",SPACE(05),"ATRASOS")
Isso não deu certo. Tem alguma outra forma?[/code]

Enviado: 03 Out 2007 15:46
por Pablo César
Caro colega, como você pode ter notado, você sem querer postou duas mensagens iguais. Você ainda tem tempo (porque ninguém respondeu a ultima) para apagar-la.

Respondendo a sua questão, eu não utilizo o DBEDIT (aghhh) procure utilizar TBROWSE seja de vetores ou direto no seu BD. Com certeza isso é normal fazer no TBROWSE. Na verdade essa condição você irá fazer na "hora" da exibição dessa coluna onde contém a hora "00:00". Eu por exemplo faço um TBROWSE de vetores para o usuário visualizar seus horários e armazeno em forma de SEGUNDO no BD. Eu acho que é mais correto computa valor numérico do que horas. Mas enfim isso é apenas meu ponto de vista e não quer dizer que estaria errado.

Enviado: 03 Out 2007 15:56
por DMR
Amigo Miracle, tem como sim fazer isso. Aliás, eu uso isso e muito. Altere da seguinte forma, colocando aspas simples antes do IF e no final e tirando as aspas duplas do campo ATRASOS:


vCAMPOS[09]=´IF(ATRASOS = "00:00",SPACE(05),ATRASOS)´

Enviado: 03 Out 2007 16:02
por DMR
Vc pode usar o vetor condicional por exemplo:

Vamos supor que vc tem um campo SEXO onde registra 1 para masculino e 2 para feminino. Só que na Dbedit vc nao quer mostrar 1 ou 2 e sim MASC ou FEMI. Para fazer isso basta:

vcampos[1]=´if(sexo=1,"MASC",if(sexo=2,"FEMI",spac(4)))´

Enviado: 04 Out 2007 09:03
por miracle
Valeu, gente! Valeu mesmo! :))

Pablo Cézar, você poderia postar um exemplo de como fazer isso de TBrowse com Vetor com Transformação de Segundos para Horas, se não for pedir demais? :D

Enviado: 04 Out 2007 09:32
por Pablo César
Exemplo de TBROWSE com vetores você pode achar em
https://pctoledo.org/forum/viewto ... ores#25389

E o exemplo de apresentação de segundos/horas e horas "00:00" como em branco, veja a seguir:

Código: Selecionar todos

..\\..
   coluna := TBColumnNew("Funcionario",{||SUBSTR(ar[02,aindex],1,11)})
   ab:addcolumn(coluna)

   coluna := TBColumnNew(PADC("Entrada",5),{|| MASCARA(ar[03,aindex]) })
   ab:addcolumn(coluna)
..\\..

FUNCTION MASCARA(VHOR)
VHOR:=SUBSTR(SECTOTIME(VHOR),1,5) // função SECTOTIME da CT.LIB
DO CASE
   CASE SUBSTR(VHOR,1,5)="     "
        VRET:="     "
   CASE SUBSTR(VHOR,1,5)="  :  "
        VRET:="Falta"
   OTHERWISE
        VRET:=TRANSFORM(VHOR,"99:99")
ENDCASE
RETURN VRET
Antes de tudo, gostaria de ratificar o que eu disse. Eu disse que seria melhor guardar em segundos em lugar de horas. Pois eu disse isso porque não lembrava do que eu tinha feito. Realmente eu estive a ponto de guardar em segundos (o qual não seria problema) mas preferí guardar no padrão HORAS porque seria mais fácil a edição do BD e poder fazer ajustes apenas editando o DBF pelo DBU.

De todas as formas adaptei o meu exemplo. Observe aqui na função MASCARA, que é aqui onde transformo SEGUNDOS em HORAS e onde exibo conforme marcação.

Fiquei curioso em saber se a dica dada pelo colega DMR de assignar vCAMPOS[09]=´IF(ATRASOS = "00:00",SPACE(05),ATRASOS)´ ao vetor (com aspas simples) no DBEDIT, funcionou para você Miracles ?. Pois não conseguí testar essa dica.

Obs.: Você poderia fazer a gentileza de eliminar a sua segunda mensagem (postagem repetida) ?

Enviado: 04 Out 2007 10:32
por miracle
Funcionou maravilhosamente bem, Pablo Cézar! :)Pos

Daí, para não exibir " : " por causa da máscara, no vetor que definia as máscaras eu coloquei mais ou menos assim: vMASCARAS[09] = "@!". Daí ficou um xuxu! Olha só o código:

Código: Selecionar todos

PUBLIC CAMPOS[12], TITULOS[12], MASCARAS[12]
CAMPOS[01] = "DATA"
CAMPOS[02] = "DIA"
CAMPOS[03] = "VISTO"
CAMPOS[04] = 'IF(EFETENTR1 = "00:00",SPACE(05),EFETENTR1)'
CAMPOS[05] = 'IF(EFETSAID1 = "00:00",SPACE(05),EFETSAID1)'
CAMPOS[06] = 'IF(EFETENTR2 = "00:00",SPACE(05),EFETENTR2)'
CAMPOS[07] = 'IF(EFETSAID2 = "00:00",SPACE(05),EFETSAID2)'
CAMPOS[08] = "EFETTOTAL"
CAMPOS[09] = 'IF(DSR = "00:00",SPACE(05),DSR)'
CAMPOS[10] = "ATRADES"
CAMPOS[11] = "SAIDASDES"
CAMPOS[12] = "MENSAGEM"
TITULOS[01] = "DATA"
TITULOS[02] = "SEM"
TITULOS[03] = "OK"
TITULOS[04] = "ENTR."
TITULOS[05] = "SAIDA"
TITULOS[06] = "ENTR."
TITULOS[07] = "SAIDA"
TITULOS[08] = "TOTAL"
TITULOS[09] = "DSR"
TITULOS[10] = "ATRASOS"
TITULOS[11] = "SAIDAS"
TITULOS[12] = "MENSAGEM"
MASCARAS[01] = "99/99/9999"
MASCARAS[02] = "@!"
MASCARAS[03] = "@!"
MASCARAS[04] = "@!"
MASCARAS[05] = "@!"
MASCARAS[06] = "@!"
MASCARAS[07] = "@!"
MASCARAS[08] = "99:99"
MASCARAS[09] = "@!"
MASCARAS[10] = "99:99"
MASCARAS[11] = "99:99"
MASCARAS[12] = "@!"
//(...)
DBEDIT(05,01,22,78,CAMPOS,"CARTTECL",MASCARAS,TITULOS)

Enviado: 04 Out 2007 10:33
por miracle
:?

Enviado: 04 Out 2007 10:35
por miracle
Porcaria! Toda vez que minha internet trava eu acabo postando duas vezes a mesma mensagem! :?