Boa noite!
Caro luiz os cálculos que eu faço são baseados que os meses só tenham 30 dias, mesmo no mês de fevereiro. Por acaso você tem uma solução para a meu problema?
[]'s
Paulo - Jacareí/SP
Moderador: Moderadores
#include "minigui.ch"
func main()
public alterar:=0
set date brit
set century on
set epoch to 1960
DEFINE WINDOW form_1 AT 206 , 290 WIDTH 375 HEIGHT 460 main
DEFINE FRAME Frame_1
ROW 10
COL 10
WIDTH 161
HEIGHT 50
CAPTION "Data Inicial (dd/mm/aaaa)"
OPAQUE .T.
END FRAME
DEFINE TEXTBOX data_ini
ROW 30
COL 30
WIDTH 120
HEIGHT 24
DATE .T.
on enter form_1.data_fim.setfocus
END TEXTBOX
DEFINE FRAME Frame_2
ROW 10
COL 190
WIDTH 161
HEIGHT 50
CAPTION "Data Final (dd/mm/aaaa)"
OPAQUE .T.
END FRAME
DEFINE TEXTBOX data_fim
ROW 30
COL 210
WIDTH 120
HEIGHT 24
DATE .T.
on enter calcula(form_1.data_ini.value,form_1.data_fim.value)
END TEXTBOX
DEFINE FRAME Frame_3
ROW 70
COL 10
WIDTH 341
HEIGHT 48
CAPTION "Tempo Acumulado"
OPAQUE .T.
END FRAME
DEFINE LABEL acumulado
ROW 90
COL 20
WIDTH 320
HEIGHT 22
VALUE ""
FONTBOLD .T.
CENTERALIGN .T.
END LABEL
DEFINE GRID Grid_1
ROW 130
COL 10
WIDTH 340
HEIGHT 223
ITEMS {}
WIDTHS {95,95,50,50,50}
HEADERS {'Dt ini','Dt final','Ano','Mes','Dia'}
COLUMNCONTROLS { {'TEXTBOX','DATE'} , {'TEXTBOX','DATE'} , {'TEXTBOX','NUMERIC','999'} , {'TEXTBOX','NUMERIC','999'} , {'TEXTBOX','NUMERIC','999'} }
JUSTIFY {BROWSE_JTFY_CENTER,BROWSE_JTFY_CENTER,BROWSE_JTFY_CENTER,BROWSE_JTFY_CENTER,BROWSE_JTFY_CENTER}
on dblclick (FORM_1.GRID_1.DELETEITEM(FORM_1.GRID_1.VALUE),ACUMULAR())
END GRID
DEFINE BUTTON bt_altera
ROW 360
COL 10
WIDTH 100
HEIGHT 28
CAPTION "&Alterar"
action alterar_dados()
END BUTTON
DEFINE BUTTON bt_sair
ROW 360
COL 250
WIDTH 100
HEIGHT 28
CAPTION "&Sair"
action form_1.release
END BUTTON
END WINDOW
form_1.data_ini.setfocus
activate window form_1
retu
func calcula(dDataInicial,dDataFinal)
v_dia:=v_mes:=v_ano:=0
v_anof=YEAR(dDataFinal)
v_mesf=MONTH(dDataFinal)
v_diaf=DAY(dDataFinal)
v_anoi=YEAR(dDataInicial)
v_mesi=MONTH(dDataInicial)
v_diai=DAY(dDataInicial)
IF v_diaf < v_diai
v_diaf+=30
v_mesf-=1
ENDIF
v_dia=v_diaf - v_diai
IF v_mesf < v_mesi
v_mesf+=12
v_anof-=1
ENDIF
v_mes=v_mesf - v_mesi
v_ano=v_anof - v_anoi
v_ret=''
IF v_ano>0
v_ret=STRZERO(v_ano,2)+IF(v_ano=1,' ano',' anos')+IF(v_mes>0,IF(v_dia>0,',',' e '),IF(v_dia>0,' e ',''))
ENDIF
IF v_mes>0
v_ret+=STRZERO(v_mes,2)+IF(v_mes=1,' mes ',' meses ')+IF(v_dia>0,'e ','')
ENDIF
IF v_dia>0
v_ret+=STRZERO(v_dia,2)+IF(v_dia=1,' dia',' dias')
ENDIF
if alterar=1
form_1.grid_1.cell(form_1.grid_1.value,1):=form_1.data_ini.value
form_1.grid_1.cell(form_1.grid_1.value,2):=form_1.data_fim.value
form_1.grid_1.cell(form_1.grid_1.value,3):=v_ano
form_1.grid_1.cell(form_1.grid_1.value,4):=v_mes
form_1.grid_1.cell(form_1.grid_1.value,5):=v_dia
else
add item { form_1.data_ini.value, form_1.data_fim.value,v_ano,v_mes,v_dia} to grid_1 of form_1
endif
acumular()
alterar:=0
form_1.data_ini.value:=""
form_1.data_fim.value:=""
form_1.data_ini.setfocus
Return (v_ret)
retu
func alterar_dados()
alterar:=1
form_1.data_ini.value:=form_1.grid_1.cell(form_1.grid_1.value,1)
form_1.data_fim.value:=form_1.grid_1.cell(form_1.grid_1.value,2)
form_1.data_ini.setfocus
retu
func acumular()
_dia:=_mes:=_ano:=0
for x=1 to form_1.grid_1.itemcount
_dia:=_dia+form_1.grid_1.cell(x,5)
_mes:=_mes+form_1.grid_1.cell(x,4)
_ano:=_ano+form_1.grid_1.cell(x,3)
if _dia>30
_dia:=0
_mes:=_mes+1
endif
if _mes>12
_mes:=0
_ano:=_ano+1
endif
next x
if _dia>1; f_dia:="dias"; else; f_dia:="dia"; endif
if _mes>1; f_mes:="meses"; else; f_mes:="mes"; endif
if _ano>1; f_ano:="anos"; else; f_ano:="ano"; endif
form_1.acumulado.value:=alltrim(str(int(_ano)))+" "+f_ano+", "+;
alltrim(str(int(_mes)))+" "+f_mes+", e "+;
alltrim(str(int(_dia)))+" "+f_dia
form_1.acumulado.refresh
form_1.grid_1.value:=form_1.grid_1.itemcount
retu
func acumular()
_dia:=_mes:=_ano:=0
for x=1 to form_1.grid_1.itemcount
_dia:=_dia+form_1.grid_1.cell(x,5)
_mes:=_mes+form_1.grid_1.cell(x,4)
_ano:=_ano+form_1.grid_1.cell(x,3)
while .t.
if _dia>=30
_dia:=_dia-30
_mes:=_mes+1
else
exit
endif
enddo
while .t.
if _mes>=12
_mes:=_mes-12
_ano:=_ano+1
else
exit
endif
enddo
next x
if _dia>1; f_dia:="dias"; else; f_dia:="dia"; endif
if _mes>1; f_mes:="meses"; else; f_mes:="mes"; endif
if _ano>1; f_ano:="anos"; else; f_ano:="ano"; endif
form_1.acumulado.value:=alltrim(str(int(_ano)))+" "+f_ano+", "+;
alltrim(str(int(_mes)))+" "+f_mes+", e "+;
alltrim(str(int(_dia)))+" "+f_dia
form_1.acumulado.refresh
form_1.grid_1.value:=form_1.grid_1.itemcount
retu
#include "hmg.ch"Ainda tinha um erro ao zerar o textbox. Sugiro o uso de DatePicker em lugar de TextBoxes, fica mais prático e tem melhor estética. Adicionei o botão de Adicionar e modifiquei o botão alterar para que exclua e o dobleclick do grid servirá para alterar. Acho que ficou mais intuitivo, espero que gostem !
Function Main()
// Public alterar:=0
set date brit
set century on
// set epoch to 1960
DEFINE WINDOW form_1 AT 206 , 290 WIDTH 375 HEIGHT 460 main
DEFINE FRAME Frame_1
ROW 10
COL 10
WIDTH 161
HEIGHT 50
CAPTION "Data Inicial (dd/mm/aaaa)"
OPAQUE .T.
END FRAME
/*
DEFINE TEXTBOX data_ini
ROW 30
COL 30
WIDTH 120
HEIGHT 24
DATE .T.
on enter form_1.data_fim.setfocus
END TEXTBOX
*/
DEFINE DATEPICKER data_ini
ROW 30
COL 30
WIDTH 110
HEIGHT 24
VALUE CTOD(" / / ")
FONTNAME "Arial"
FONTSIZE 10
TOOLTIP ""
ONCHANGE Nil
ONGOTFOCUS Nil
ONLOSTFOCUS Nil
FONTBOLD .T.
FONTITALIC .F.
FONTUNDERLINE .F.
FONTSTRIKEOUT .F.
ONENTER form_1.data_fim.setfocus
HELPID Nil
TABSTOP .T.
VISIBLE .T.
SHOWNONE .F.
UPDOWN .F.
RIGHTALIGN .T.
END DATEPICKER
DEFINE FRAME Frame_2
ROW 10
COL 190
WIDTH 161
HEIGHT 50
CAPTION "Data Final (dd/mm/aaaa)"
OPAQUE .T.
END FRAME
/*
DEFINE TEXTBOX data_fim
ROW 30
COL 210
WIDTH 120
HEIGHT 24
DATE .T.
on enter calcula(form_1.data_ini.value,form_1.data_fim.value)
END TEXTBOX
*/
DEFINE DATEPICKER data_fim
ROW 30
COL 210
WIDTH 110
HEIGHT 24
VALUE CTOD(" / / ")
FONTNAME "Arial"
FONTSIZE 10
TOOLTIP ""
ONCHANGE Nil
ONGOTFOCUS Nil
ONLOSTFOCUS Nil
FONTBOLD .T.
FONTITALIC .F.
FONTUNDERLINE .F.
FONTSTRIKEOUT .F.
ONENTER Nil
HELPID Nil
TABSTOP .T.
VISIBLE .T.
SHOWNONE .F.
UPDOWN .F.
RIGHTALIGN .T.
END DATEPICKER
DEFINE FRAME Frame_3
ROW 70
COL 10
WIDTH 341
HEIGHT 48
CAPTION "Tempo Acumulado"
OPAQUE .T.
END FRAME
DEFINE LABEL acumulado
ROW 90
COL 20
WIDTH 320
HEIGHT 22
VALUE ""
FONTBOLD .T.
CENTERALIGN .T.
END LABEL
DEFINE GRID Grid_1
ROW 130
COL 10
WIDTH 340
HEIGHT 223
ITEMS {}
WIDTHS {95,95,50,50,50}
HEADERS {'Dt ini','Dt final','Ano','Mes','Dia'}
ALLOWEDIT .T.
COLUMNCONTROLS { {'TEXTBOX','DATE'} , {'TEXTBOX','DATE'} , {'TEXTBOX','NUMERIC','999'} , {'TEXTBOX','NUMERIC','999'} , {'TEXTBOX','NUMERIC','999'} }
JUSTIFY {BROWSE_JTFY_CENTER,BROWSE_JTFY_CENTER,BROWSE_JTFY_CENTER,BROWSE_JTFY_CENTER,BROWSE_JTFY_CENTER}
COLUMNWHEN { { || .T. },{ || .T. },{ || .F. },{ || .F. },{ || .F. } }
COLUMNVALID { { || Calcula(This.CellValue,form_1.grid_1.cell(form_1.grid_1.value,2),.f.) } , ;
{ || Calcula(form_1.grid_1.cell(form_1.grid_1.value,1),This.CellValue,.f.) },;
{ || Nil },;
{ || Nil },;
{ || Nil } }
END GRID
DEFINE BUTTON bt_inclui
ROW 360
COL 10
WIDTH 100
HEIGHT 28
CAPTION "&Incluir"
action calcula(form_1.data_ini.value,form_1.data_fim.value,.t.)
END BUTTON
DEFINE BUTTON bt_exclui
ROW 360
COL 130
WIDTH 100
HEIGHT 28
CAPTION "&Excluir"
action (FORM_1.GRID_1.DELETEITEM(FORM_1.GRID_1.VALUE),ACUMULAR())
END BUTTON
DEFINE BUTTON bt_sair
ROW 360
COL 250
WIDTH 100
HEIGHT 28
CAPTION "&Sair"
action form_1.release
END BUTTON
END WINDOW
form_1.data_ini.setfocus
activate window form_1
Return Nil
Function calcula(dDataInicial,dDataFinal,lAdd)
v_dia:=v_mes:=v_ano:=0
v_anof=YEAR(dDataFinal)
v_mesf=MONTH(dDataFinal)
v_diaf=DAY(dDataFinal)
v_anoi=YEAR(dDataInicial)
v_mesi=MONTH(dDataInicial)
v_diai=DAY(dDataInicial)
IF v_diaf < v_diai
v_diaf+=30
v_mesf-=1
ENDIF
v_dia=v_diaf - v_diai
IF v_mesf < v_mesi
v_mesf+=12
v_anof-=1
ENDIF
v_mes=v_mesf - v_mesi
v_ano=v_anof - v_anoi
v_ret=''
IF v_ano>0
v_ret=STRZERO(v_ano,2)+IF(v_ano=1,' ano',' anos')+IF(v_mes>0,IF(v_dia>0,',',' e '),IF(v_dia>0,' e ',''))
ENDIF
IF v_mes>0
v_ret+=STRZERO(v_mes,2)+IF(v_mes=1,' mes ',' meses ')+IF(v_dia>0,'e ','')
ENDIF
IF v_dia>0
v_ret+=STRZERO(v_dia,2)+IF(v_dia=1,' dia',' dias')
ENDIF
if lAdd
add item { form_1.data_ini.value, form_1.data_fim.value,v_ano,v_mes,v_dia} to grid_1 of form_1
Else
form_1.grid_1.cell(form_1.grid_1.value,1):=form_1.data_ini.value
form_1.grid_1.cell(form_1.grid_1.value,2):=form_1.data_fim.value
form_1.grid_1.cell(form_1.grid_1.value,3):=v_ano
form_1.grid_1.cell(form_1.grid_1.value,4):=v_mes
form_1.grid_1.cell(form_1.grid_1.value,5):=v_dia
endif
acumular()
//alterar:=0
form_1.data_ini.value:=CtoD("")
form_1.data_fim.value:=CtoD("")
form_1.data_ini.setfocus
// Return (v_ret)
Return .T.
Function alterar_dados()
// alterar:=1
form_1.data_ini.value:=form_1.grid_1.cell(form_1.grid_1.value,1)
form_1.data_fim.value:=form_1.grid_1.cell(form_1.grid_1.value,2)
form_1.data_ini.setfocus
Return Nil
Function acumular()
_dia:=_mes:=_ano:=0
for x=1 to form_1.grid_1.itemcount
_dia:=_dia+form_1.grid_1.cell(x,5)
_mes:=_mes+form_1.grid_1.cell(x,4)
_ano:=_ano+form_1.grid_1.cell(x,3)
while .t.
if _dia>=30
_dia:=_dia-30
_mes:=_mes+1
else
exit
endif
enddo
while .t.
if _mes>=12
_mes:=_mes-12
_ano:=_ano+1
else
exit
endif
enddo
next x
if _dia>1; f_dia:="dias"; else; f_dia:="dia"; endif
if _mes>1; f_mes:="meses"; else; f_mes:="mes"; endif
if _ano>1; f_ano:="anos"; else; f_ano:="ano"; endif
form_1.acumulado.value:=alltrim(str(int(_ano)))+" "+f_ano+", "+;
alltrim(str(int(_mes)))+" "+f_mes+", e "+;
alltrim(str(int(_dia)))+" "+f_dia
form_1.acumulado.refresh
form_1.grid_1.value:=form_1.grid_1.itemcount
Return Nil
Os tópicos foram juntados, mas por favor Paulo, não abra novos tópicos se o assunto for o mesmo.Jairo Maia escreveu:Olá Paulo,
O problema é que você tem mais 2 tópicos além deste sobre o mesmo assunto, a saber:
Em 01/04/12 - Ajuda sobre rotina de alteração
Em 04/04/12 - Alteração dados na Grid
Neste último (04/04/12), você tentou as alterações sugeridas pelo colega Daniel? Se sim, também não funcionou?Paulo_CPV escreveu:já fiz o teste com o que o Daniel me passou e também não deu certo. Estou fazendo de tudo, mas não funciona de geito nenhum.
Usuários vendo este fórum: Nenhum usuário registrado online e 4 visitantes