Search  
Friday, February 10, 2012 ..:: Forum ::.. Register  Login
 Forum Minimize
Pentru a putea posta mesaje trebuie să vă înregistraţi.
Notă: Mesajele cu conţinut jignitor sau ilegal (inclusiv cereri de soft piratat) nu sunt acceptate şi vor fi şterse imediat .

Pentru a primi raspunsuri rapide si corecte, scrieti in mesaj ce intentionati sa faceti, ce mesaj de eroare primiti, in ce context si in urma caror actiuni. De asemenea, mentionati versiunea de FoxPro in care lucrati!
Dacă nu specificați versiunea, se consideră VFP 9.0 SP2.

SearchForum Home
  Visual FoxPro  Cod, sintaxa si comenzi  datetime...
 datetime
 
 9/3/2010 1:41:14 AM
User is offlinedarky85
113 posts
5th


datetime
 (N/A)
Am un textbox in care trec orele de ex : 12 , 24, 48 de ore

Cum fac sa imi afiseze data dupa acele ore ? , sper ca m-am facut inteles eu am incercat ceva cu :

DATETIME(YEAR(DATE()),MONTH(date()),DAY(DATE()),HOUR(DATETIME())+thisform.text12.value,MINUTE(datetime()))

dar problema este atunci cand se schimba ziua ca imi da eroare

singura varianta la are m-am mai gandit este sa fac cu if-uri dar ar fi aiurea asa ca daca aveti idei mai bune ajutati-ma

multumesc
 9/3/2010 3:27:23 AM
User is offlineDaniel Buduru
2141 posts
1st




Re: datetime
 (N/A)
Daca am inteles eu bine, vrei sa iti arate data si ora curente+numarul de ore din textbox.

DATETIME()+ thisform.text12.value*3600

Daca iti da vreo eroare "Type mismatch", inseamna ca Text12.value nu e de tip numeric.
In acest caz, poti face conversia la integer cu functia cast

DATETIME()+cast(thisform.text12.value as int) *3600



Daniel Buduru
 9/3/2010 11:16:20 AM
User is offlinedarky85
113 posts
5th


Re: datetime
 (N/A)
A mers :) multumesc
 9/4/2010 4:32:46 PM
User is offlinedarky85
113 posts
5th


Re: datetime
 (N/A)
cum pot sa verific daca o ora de ex 12:30 este inclusa intre 7:30 si 17:00 ?? si sa fac un textbox sa imi primeasca doar ora
multumesc
 9/4/2010 9:15:19 PM
User is offlineDaniel Buduru
2141 posts
1st




Re: datetime
 (N/A)
Ar fi mai simplu sa lucrezi peste tot cu datetime, si sa nu desfaci valoare in zi, luna, an, ora, minut ...
Un textbox poate fi setat pe datetime, si va afisa formatul corespunzator.

Daca vrei sa compari valori de timp, fie le convertesti la datetime, fie la secunde, apoi compari.
De ex:
? between(datetime(2000,1,1,12,30), datetime(2000,1,1,7,30), datetime(200,1,1,17))
? between (12*3600+30*60, 7*3600+30*60, 17*3600)

Cat despre textboxul care sa primeasca doar ora, trebuie sa-l construiesti. Poti folosi pentru asta si un ActiveX, Datetime Picker, care este distribuit cu VFP.
Vezi in FFC o clasa bazate pe el. Poate fi setat sa afiseze doar ora.
Daca vrei sa tii ora separat, tine-o intr-un camp numeric, preferabil in secunde, sau in ore cu zecimale, si va fi mai usor de lucrat cu ea, decat sa o tii sub forma '12:30'.

Daniel Buduru
 9/5/2010 12:18:30 AM
User is offlinedarky85
113 posts
5th


Re: datetime
 (N/A)
Ideea ar fi ca sa aflu numarul de ore suplimentare /luna / angajat si din cauza asta m-am gandit sa sparg datatime in 2 daca ai avea o idee despre cum as putea face asta altfel ti-as ramane recunoscator

ore suplimentare se calculeaza si daca respectivul vine la ora 7:00 tinand cont ca programul incepe la 7:30
 9/5/2010 12:32:14 AM
User is offlineDaniel Buduru
2141 posts
1st




Re: datetime
 (N/A)
Corect ar fi sa calculezi numarul de ore lucrate/zi, indiferent care e programul. Ore suplimentare sunt cele prestate peste norma zilnica, nu inainte sau dupa o anumiat ora.
In acest caz, (pontaj_iesire-pontaj_intrare)/3600 iti da numarul de ore pontate pe zi, daca pontai_intrare si pontaj_iesire sunt de tip datetime.


Daniel Buduru
 9/5/2010 12:57:55 AM
User is offlinedarky85
113 posts
5th


Re: datetime
 (N/A)
pai toti au aceleasi ore lucrate/zi din cauza ca se face service si se pleaca pe teren si se calculeaza ca ore lucrate si drumul , durata serviceare etc deci asta nu ar conta prea mult
eu am gandit ceva de genu
secunde=Val(Right(thisform.text1.value,2))
minute_c=Val(SubStr(thisform.text1.Value,4,2))
ore=Val(Left(thisform.text1.value,2))

WAIT WINDOW between(datetime(2010,9,4,ore,minute_c), datetime(YEAR(DATE()),MONTH(DATE()),DAY(DATE()),8,30),datetime(YEAR(DATE()),MONTH(DATE()),DAY(DATE()),17,00))
raspuns=between (ore*3600+minute_c*60, 8*3600+30*60, 17*3600)

IF raspuns=.T. then
ore_suplimentare=0
ELSE
IF ore*3600+minute_c*60<8*3600+30*60 then
ore_suplimentare=(8*3600)-(ore*3600)
minute_suplimentare=ABS(30*60-minute_c*60)
ELSE

ENDIF
ENDIF

?ore_suplimentare/3600
?minute_suplimentare/60

dar nu inteleg de ce nu imi calculeaza corect minuntele adica
daca ii dau 7:20 imi da rezultat 10
daca ii dau 7:40 imi da tot 10
 9/5/2010 1:20:10 AM
User is offlineDaniel Buduru
2141 posts
1st




Re: datetime
 (N/A)
Daca programul este 7:30-16, si un angajat vine la 8:30 si lucreaza pana la 17, inseamna ca are 1 ora suplimentara?
Nu cred ca legislatia in vigoare zice asa.

N-am idee ce ai in text1 si in ce format este. 
Care sunt datele tale de intrare si in ce format?
Daca in text1 ai ceva de forma '11:20', atunci poti folosi CTOT() pentru conversie

Nu lucra cu toate expresiile  alea in between si if, pune-le in niste variabile si va fi mai clar.
t1=ctot(thisform.text1.value)
ti=ctot('07:30')
tf=ctot('16:00')
? between(t1, ti, tf)
? (t1-ti)/3600

Nu inteleg ce calcule faci, asa ca nu stiu ce nu-ti iese. Ce introduci, orele lucrate in fiecare zi si vrei sa vezi cate ore sunt suplimentare, sau ora de intrare si ora de iesire, si vrei sa calculezi cate ore lucrate din care cate sunt suplimentare?


Daniel Buduru
 9/5/2010 1:32:49 AM
User is offlinedarky85
113 posts
5th


Re: datetime
 (N/A)
asta era :
IF ore*3600+minute_c*60<8*3600+30*60 then
IF minute_c>=30 then
ore_suplimentare=0
minute_suplimentare=60*60-(minute_c*60-30*60)
else
ore_suplimentare=(8*3600)-(ore*3600)
minute_suplimentare=30*60-minute_c*60
ENDIF

nu lucrez cu toate betweenurlie doar cu unu :)

exact , ultima parte
"sau ora de intrare si ora de iesire, si vrei sa calculezi cate ore lucrate din care cate sunt suplimentare?"
 9/5/2010 1:52:14 AM
User is offlineDaniel Buduru
2141 posts
1st




Re: datetime
 (N/A) Modified By Daniel Buduru  on 9/5/2010 1:11:03 AM)
Deci in text1 si text2 ai ceva de forma 'hh:mm'
Atunci ti e ora de inceput, tf e ora de sfarsit
ti=ctot(text1.value)
tf=ctot(text2.value)
tn=8 &&timpul normat, in ore

nore_lucrate=(tf-ti)/3600
nore suplimentare=max(0,nore_lucrate-tn)

Tii orele suplimentare in zecimal, adica 1,5 in loc de 1 ora 30 min
Daca vrei sa rotunjesti la zeci de minute, poti folosi ceva de genul asta:
ns=1,236
? (ns-floor(ns))*60 && minutele suplimentare
? round((ns-floor(ns))*60, -1) &&minutele suplimentare rotunjite la 10'

Va trebui insa sa tii cont de numarul total de ore lucrate in luna cand calculezi numarul de ore suplimentare, respectiv sa tii evidenta orelor suplimentare recompensate prin timp liber.

Daniel Buduru
 9/5/2010 2:03:18 AM
User is offlinedarky85
113 posts
5th


Re: datetime
 (N/A)
ms de sfat ff bun :)
as mai vrea sa te rog ceva sa imi zici cum pot introduce ceva de genu :
a=ore+":"+min , nu de alta dar sunt ff curios ca m-am tot chinuit si tot eroare am primit
 9/5/2010 2:12:32 AM
User is offlineDaniel Buduru
2141 posts
1st




Re: datetime
 (N/A) Modified By Daniel Buduru  on 9/5/2010 1:16:13 AM)
 darky85 wrote
ms de sfat ff bun :)
as mai vrea sa te rog ceva sa imi zici cum pot introduce ceva de genu :
a=ore+":"+min , nu de alta dar sunt ff curios ca m-am tot chinuit si tot eroare am primit


Daca spui si ce eroare, e mai simplu.
Banuiesc ca una de tip, ore si min sunt numerice, trebuie aduse la string.
a=TRAN(ore)+':'+TRAN(min)

Dar, la fel de bine poti folosi datetime
Daca lucrezi cu o baza de date, stochezi ti si tf ca datetime, format din data zilei si orele preluate din textbox
ex
ddata=date(2010,08,12)
ora=7
min=30
tdata=cast(ddata as datetime)+ora*3600+minute*60
apoi restul de operatii le faci cu cele doua valori datetime.

Cand treci o valoare datetime in data si ora:min, faci astfel:
tdata=datetime(2010,8,12,7,25)
ddata=TTOD(tdata)
ore=hour(tdata)
min=minute(tdata)

Am corectat formula pentru numarul de ore suplimentare in postul anterior, uita-te acolo.



Daniel Buduru
 9/5/2010 2:21:11 AM
User is offlinedarky85
113 posts
5th


Re: datetime
 (N/A)
multumesc mult de tot raman dator :">
 9/5/2010 3:11:56 AM
User is offlinedarky85
113 posts
5th


Re: datetime
 (N/A)
mai spune-mi ceva

cum transform dupa numarul de ore in ceva gen HH;MM
adik 1,5 in 1:30
 9/5/2010 3:25:26 AM
User is offlineDaniel Buduru
2141 posts
1st




Re: datetime
 (N/A)
nh=1.5
? tran(floor(nh))+':'+tran((nh-floor(nh))*60)
? tran(floor(nh),'@L 99')+':'+tran((nh-floor(nh))*60,'@L 99')
? TTOC(CAST(DATE() as datetime)+nh*3600,2)


Daniel Buduru
 9/5/2010 3:34:03 AM
User is offlinedarky85
113 posts
5th


Re: datetime
 (N/A)
multumesc :)
 9/5/2010 1:49:55 PM
User is offlinedarky85
113 posts
5th


Re: datetime
 (N/A) Modified By darky85  on 9/5/2010 12:53:58 PM)
as mai avea o mica problema :) la care ma toot chinui
cum pot transfera ora adik din 1,5 = 1:30 intr-un raport

p.s am descoperit intre timp :)
 9/6/2010 1:00:19 AM
User is offlinedarky85
113 posts
5th


Re: datetime
 (N/A) Modified By darky85  on 9/6/2010 1:29:45 AM)
a=CTOT(thisform.text2.Value)

ao=a/3600


imi zice Data type mismatch la a doua linie

sau daca nu cer prea mult o idee ca sa pot sa scad orele recuperate

ore recuperate pe care pe introduc de la tast intr-un textbox
 9/6/2010 3:29:06 AM
User is offlinedarky85
113 posts
5th


Re: datetime
 (N/A) Modified By darky85  on 9/6/2010 2:31:01 AM)
 darky85 wrote
a=CTOT(thisform.text2.Value)

ao=a/3600


imi zice Data type mismatch la a doua linie

sau daca nu cer prea mult o idee ca sa pot sa scad orele recuperate

ore recuperate pe care pe introduc de la tast intr-un textbox


si am mai descoperit o problema mare :((
cum pot sa inroduc datele in tabele daca nu trec direct ora de inceput si ora de sfarsi si inroduc ceva de genu 7:30->12:00, de la 12:00->15:00 si tot asa ca nu stiu ce aveam in cap aseara cred ca nimik :(( help pls
ca eu m-am gandit sa fac un locate si daca gaseste numele si data atunci sa imi calculeze in plus ..... si am incercat sa adun sa scad si ori imi aduna prea mult ori ..... chiar nu stiu ce sa ii mai fac
 9/6/2010 10:47:01 AM
User is offlineDaniel Buduru
2141 posts
1st




Re: datetime
 (N/A)
d1-date(2010,9,1)
? date()-d1 &&rezultatul este in zile
t1=dtot(date())
? datetime()-t1 && rezultatul este in secunde.

Deci,poti calcula numarul de zile dintre doua date sau numarul de secunde dintre doua expresii datetime.

CTOT() face conversia de la string la datetime
datetime/3600 nu se poate face, datetime nu este de tip numeric.

In bazele de date, excel, etc, data este tinuta ca numarul de zile scurs de la o anumita date (ex, 1753-01-01) iar timpul ca numarul de secunde de la miezul noptii. Un camp datatime contine atat numarul de zile cat si nuamrul de secunde, fiecare pe un anumit numar de biti. In acest mod se pot face calcule cu date si cu timp.

Cred ca ti-am spus de la inceput, lucrezi in ore cu minute centesimale (sau in secunde, dar nu se pot citi direct), e singurul mod in care poti face calcule cu orele lucrate.
Daca nu treci direct ora de intrare si ora de iesire, te complici mult mai mult.
Tabela de pontaj trebuie sa arate astfel:

idsalariat, ora_venire T, ora_plecare T
sau
idsalariat, data D, ora_venire N(5,2), ora_plecare N(5,2)

Chiar daca varianta a doua ti se pare mai convenabila, va necesita operatii in plus atunci cand programul incepe, sa zicem, la ora 22:00 si se termina a doua zi la ora 06:00.

Orele lucrate, orele suplimentare si restul le calculezi cu rutine care lucreaza pe aceasta tabela. Rezultatul il poti tine intr-o tabela separata, dar nu in cea cu date primare.

Indiferent in ce format prezinti datele utilizatorului, in baza de date folosesti campuri de tip datetime pentru ora de intrare si ce ade iesire, si camp numeric pentru numarul de ore lucrate. Nu tii nimic de forma 12:30 sau 11:15.

Poti face o tabela separata cu programul de lucru al unitatii, ceva cam asa:
data_aplicarii D, data_incetarii D, schimbul I, ora_incepere N(4,2), ora_sfarsit N(4,2)
In data_aplicarii se tine data de la care intra in vigoare programul, data_incetarii = data de la care acest program nu se mai foloseste, schimul 1, 2 ,3, ora de incepere 7.5 (7:30), ora de sfarsit 15.5 (15:30).

Ce incereci sa faci cu intervalele orare nu are sens. Orele suplimentare sunt orele lucrate peste timpul normat (de obicei, 8 ore), nu inainte de ora de incepere sau dupa ora de sfarsit a programului.
Cel mai sigur este sa calculezi orele lucrate intr-o luna. Ce depaseste numarul de zile lucratoare*norma, sunt ore suplimentare. In acest mod, tii se si de recuperari.

Nu inteleg ce vrei sa faci cu acele intervale orare.
Daca cumva vrei sa tii evidenta interventiilor, se tine la fel cu pontajul: id, ora de incepere, ora de terminare.

Orice altceva incerci, tinand orele in format 12:30, e mult prea laborios. Desigur, decizi iti apartine. Daca vrei sa lucrezi asa, ar fi util sa consulti helpul pentru toate functiile legate de data - datetime, data, ttoc, dtod, ctod, dtoc, ttoc, dtoc, si ce iti mai apare in josul pagii de help.


Daniel Buduru
  Visual FoxPro  Cod, sintaxa si comenzi  datetime...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement