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  Tema pentru acasa  5. Numarul de l...
 5. Numarul de luni
 
 7/18/2008 2:13:54 PM
User is offlineGrigore Dolghin
3521 posts
www.class-software.eu
1st






5. Numarul de luni
 (Romania) Modified By Grigore Dolghin  on 7/28/2008 1:33:03 PM)
Cum aflu numarul de luni intregi dintre doua date calendaristice oarecare?

Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 7/18/2008 2:55:47 PM
User is offlineoviciandrus
761 posts
www.comptech.ro
1st




Re: Numarul de luni
 (Romania)
CREATE CURSOR MyTest (D1 D, D2 D, Luni I)
tdStart = Date()
tdStop = Date()
DO WHILE tdStop <= {31.12.2008}
lnLuni = nMonthNumber(tdStart, tdStop)
tdStop = tdStop + 1
INSERT INTO MyTest VALUES (tdStart, tdStop, lnLuni)
ENDDO

FUNCTION nMonthNumber(tdData1, tdData2)
LOCAL lnRez, ldData
lnRez = 0
ldData = tdData1
DO WHILE GoMonth(ldData,1)-1 <= tdData2
lnRez = lnRez + 1
ldData = GoMonth(ldData,1)
ENDDO
RETURN lnRez
ENDFUNC
 7/18/2008 3:06:01 PM
User is offlineoviciandrus
761 posts
www.comptech.ro
1st




Re: Numarul de luni
 (Romania)
O varianta si mai rapida :

FUNCTION nMonthNumber(tdData1, tdData2)
LOCAL lnRez, ldData
lnRez = 0

&& mai intai merg din an in an

ldData = tdData1
DO WHILE GoMonth(ldData,12)-1 <= tdData2
lnRez = lnRez + 12
ldData = GoMonth(ldData,12)
ENDDO

&& apoi merg din zi in zi

DO WHILE GoMonth(ldData,1)-1 <= tdData2
lnRez = lnRez + 1
ldData = GoMonth(ldData,1)
ENDDO
RETURN lnRez
ENDFUNC
 7/18/2008 3:58:34 PM
User is offlineAdrian Gerlan
581 posts
1st




Re: Numarul de luni
 (Romania)
d1 = CTOD('01.05.2009')
d2 = CTOD('05.08.2009')
?luni(d2,d1)

FUNCTION luni
PARAMETERS pd1,pd2
d1 = MIN(pd1,pd2)
d2 = MAX(pd1,pd2)
lnNrAni = YEAR(d2) - YEAR(d1)
DO case
    CASE MONTH(d1) < MONTH(d2)
        lnNrLt1 = MONTH(d2) - MONTH(d1)
    CASE MONTH(d1) > MONTH(d2)
        lnNrLt1 = 12*(lnNrAni-1) - (MONTH(d1) - MONTH(d2))
ENDCASE
lnNrLt2 = 12 * (YEAR(d2) - YEAR(d1))
lnNrLf = lnNrLt1 + lnNrLt2
if DAY(d1) > DAY(d2)
    lnNrLf = lnNrLf - 1
ENDIF
RETURN lnNrLf


AdiG
 7/18/2008 4:23:08 PM
User is offlineAlex Dobrin
766 posts
www.algis.ro
1st






Re: Numarul de luni
 (N/A)
Depinde ce vrei sa spui cu numarul de luni intregi.
Daca data minima este 02.03.2008 si data maxima este 29.06.2008 se considera luni pline doar lunile aprilie si mai sau se mai adauga o luna pentru ca ai 29 de zile in martie + 29 de zile in iunie,  adica inca 58 de zile, deci mai mult de o luna?

Pentru primul caz solutia ar putea fi asta:

FUNCTION nrLuni(d1,d2)
d_min = MIN(d1,d2)
d_max = MAX(d1,d2)
d_temp = d_min
lnLuni = 0
DO WHILE d_temp < d_max
    lnLuni = lnLuni + 1
    d_temp = GOMONTH(d1, lnLuni)
ENDDO
IF MONTH(d_temp) = MONTH(d_max) AND YEAR(d_temp) = YEAR(d_max)
    lnLuni = lnLuni - 2
ELSE
    lnLuni = lnLuni - 3
ENDIF
RETURN lnLuni

Pentru al doilea caz se mai adauga randurile de mai jos inainte de "return lnLuni".

IF DAY(d1) <= DAY(d2)
    lnLuni = lnLuni + 1
ENDIF


Alex Dobrin
Algis Info
 7/18/2008 4:43:03 PM
User is offlineoviciandrus
761 posts
www.comptech.ro
1st




Re: Numarul de luni
 (Romania) Modified By oviciandrus  on 7/18/2008 3:47:34 PM)
// asta-i varianta finala :)

FUNCTION CateLuni(t1, t2) // t1= datainitiala, t2 = datafinala
LOCAL lnRez, lnAni

IF t2 <= GoMonth(t1,1)-1 && t2 mai aproape de o luna decat t1
lnRez = 0
ELSE
IF Year(t2) = Year(t1) && ani egali
IF Month(t2) < Month(t1) && luna din t2 < luna din t1
lnRez = 0
ELSE
lnRez = Month(t2) - Month(t1) - iif(Day(t2) ENDIF
ELSE
lnAni = Year(t2) - Year(t1) - iif(Right(Dtos(t2),4) < Right(Dtos(t1),4), 1, 0) && numar de ani impliniti; se scade 1 sau 0 dupa cum s-a implinit ziua din t1
IF lnAni > 0
lnRez = lnAni * 12 + CateLuni(t1, GoMonth(t2, - 12 * lnAni)) && autoapel recursiv; din t2 s-au scazut numarul de ani impliniti
ELSE
lnRez = 11 - CateLuni(t2,t1) && autoapel recursiv in cazul in care de la t1 la t2 este mai putin decat un an
ENDIF
ENDIF
ENDIF

RETURN lnRez
ENDFUNC
 7/18/2008 8:59:16 PM
User is offlinedni
420 posts
2nd


Re: Numarul de luni
 (N/A)

...parca-i mai scurt asa:

data1 && inceput interval

data2 && sfirsit interval


lunile = (YEAR(data2) - YEAR(data1)) * 12 + (MONTH(data2) - MONTH(data1)) - 1

 7/18/2008 9:55:20 PM
User is offlineAlex Dobrin
766 posts
www.algis.ro
1st






Re: Numarul de luni
 (N/A)
Parca. :)

Nu ma asteptam sa tina si la luna mai mica din data2 cu luna mai mare din data1. Dar testand varianta ta am gasit o problema si in rezolvarea mea.
Nu am tinut cont de numarul de zile. Daca data1 este 01.11.2008 si data2 este 31.03.2009 rezultatul corect ar trebui sa fie 5.

Deci probabil ca rezolvarea finala ar putea arata cam asa:

nrLuni = (YEAR(data2) - YEAR(data1)) * 12 + (MONTH(data2) - MONTH(data1)) - 1 + IIF(DAY(data1) = 1,1,0) + IIF(DAY(data2+1) = 1,1,0)


Alex Dobrin
Algis Info
 7/18/2008 10:54:48 PM
User is offlinedni
420 posts
2nd


Re: Numarul de luni
 (N/A)
...corect, incercasem doar sa evit "DAY" ca sa n-o lungesc ....
 7/18/2008 11:01:22 PM
User is offlinedni
420 posts
2nd


Re: Numarul de luni
 (N/A)
...adica puteam sa tin cont si eu de zile ....
 7/21/2008 12:05:34 PM
User is offlineGrigore Dolghin
3521 posts
www.class-software.eu
1st






Re: Numarul de luni
 (Romania)
 oviciandrus wrote
// asta-i varianta finala :)

FUNCTION CateLuni(t1, t2) // t1= datainitiala, t2 = datafinala
LOCAL lnRez, lnAni

IF t2 <= GoMonth(t1,1)-1 && t2 mai aproape de o luna decat t1
lnRez = 0
ELSE
IF Year(t2) = Year(t1) && ani egali
IF Month(t2) < Month(t1) && luna din t2 < luna din t1
lnRez = 0
ELSE
lnRez = Month(t2) - Month(t1) - iif(Day(t2)
ENDIF
ELSE
lnAni = Year(t2) - Year(t1) - iif(Right(Dtos(t2),4) < Right(Dtos(t1),4), 1, 0) && numar de ani impliniti; se scade 1 sau 0 dupa cum s-a implinit ziua din t1
IF lnAni > 0
lnRez = lnAni * 12 + CateLuni(t1, GoMonth(t2, - 12 * lnAni)) && autoapel recursiv; din t2 s-au scazut numarul de ani impliniti
ELSE
lnRez = 11 - CateLuni(t2,t1) && autoapel recursiv in cazul in care de la t1 la t2 este mai putin decat un an
ENDIF
ENDIF
ENDIF

RETURN lnRez
ENDFUNC


Codul tau da o eroare la "iif(Day(t2)", fiindca e incomplet. Poti, te rog, sa-l corectezi si sa il postezi? as vrea sa vad cum merge :)

Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 7/21/2008 12:07:00 PM
User is offlineGrigore Dolghin
3521 posts
www.class-software.eu
1st






Re: Numarul de luni
 (Romania)
 Alex Dobrin wrote
Depinde ce vrei sa spui cu numarul de luni intregi.
Daca data minima este 02.03.2008 si data maxima este 29.06.2008 se considera luni pline doar lunile aprilie si mai sau se mai adauga o luna pentru ca ai 29 de zile in martie + 29 de zile in iunie,  adica inca 58 de zile, deci mai mult de o luna?


De pe 2 martie pana pe 29 iunie sunt 3 luni intregi (care se incheie pe 2 iunie) si ceva zile. A 4 luna ar fi pe 2 iulie.

Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 7/21/2008 12:13:33 PM
User is offlineoviciandrus
761 posts
www.comptech.ro
1st




Re: Numarul de luni
 (Romania) Modified By oviciandrus  on 7/21/2008 11:14:22 AM)
Imi cer scuze. Cred ca la Copy-Paste a fost necazul ...


FUNCTION CateLuni(t1, t2)
 LOCAL lnRez, lnAni
 
 IF t2 <= GoMonth(t1,1)-1
  lnRez = 0
 ELSE
  IF Year(t2) = Year(t1)
   IF Month(t2) < Month(t1)
    lnRez = 0
   ELSE
    lnRez = Month(t2) - Month(t1) - iif(Day(t2)<Day(t1), 1, 0)
   ENDIF
  ELSE
   lnAni  = (Year(t2) - Year(t1) - iif(Right(Dtos(t2),4) < Right(Dtos(t1),4), 1, 0))
   IF lnAni > 0
    lnRez = lnAni * 12 + CateLuni(t1, GoMonth(t2, - 12 * lnAni))
   ELSE
    lnRez = 11 - CateLuni(t2,t1)
   ENDIF
  ENDIF
 ENDIF
 
 RETURN lnRez
ENDFUNC
 7/21/2008 12:17:39 PM
User is offlineGrigore Dolghin
3521 posts
www.class-software.eu
1st






Re: Numarul de luni
 (Romania)
Bingo :) We have a winner. Solutia lui Alex merge (ma refer la cea de-a doua) dar a fost prea tarziu, sorry :(

Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 7/21/2008 2:25:27 PM
User is offlineDorin Vasilescu
1366 posts
1st




Re: Numarul de luni
 (N/A)
Aici e si solutia oficiala :
http://support.microsoft.com/kb/130444
 7/21/2008 8:41:54 PM
User is offlineGrigore Dolghin
3521 posts
www.class-software.eu
1st






Re: Numarul de luni
 (Romania)
Da' ai cautat ceva, Dorin...

Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 7/21/2008 11:00:07 PM
User is offlineDorin Vasilescu
1366 posts
1st




Re: Numarul de luni
 (N/A)
Nuu
"months between two dates foxpro" in google, primul link pe prima pagina
 7/22/2008 5:02:59 PM
User is offlinedni
420 posts
2nd


Re: Numarul de luni
 (N/A)
...abia acum am avut timp sa ma uit; formula mea este foarte corecta; nu sunt 5 luni diferenta ci doar 3; probabil ca am inteles gresit despre ce este vorba: am considerat luna intreaga o luna calendaristica aprilie, mai iunie ....etc; deci daca ai "ciupit" din noiembrie nu mai e intreg....probabil ca trebuia sa inteleg prin luna intrega un interval de exemplu de la 1 noiembrie pina la 1 decembrie ....etc...etc ....
 7/22/2008 5:21:44 PM
User is offlineAlex Dobrin
766 posts
www.algis.ro
1st






Re: Numarul de luni
 (N/A)
Ai postat intradevar cea mai scurta formula, dar nu era corecta fara verificarea zilei. De la 1 ianuarie 2008 pana la 31 mai 2008 sunt exact 5 luni. Formula ta intoarce 3.
Oricum se ia in considerare primul raspuns corect. :)

Alex Dobrin
Algis Info
 7/22/2008 5:41:09 PM
User is offlinedni
420 posts
2nd


Re: Numarul de luni
 (N/A)

...asa cum am inteles eu problema gresit, sunt 3 luni nu 5 pentru ca ianuarie nu e intreaga si nici mai nu e....formula mea functioneaza corect in conformitate cum am considerat eu (probabil gresit) luna intreaga, nu revendic nimic, doar vreau sa spun ca formula mea este corecta si in conformitate cu ce am inteles eu prin "luna intreaga".

 7/22/2008 5:49:59 PM
User is offlineAlex Dobrin
766 posts
www.algis.ro
1st






Re: Numarul de luni
 (N/A)
Am inteles ce spui tu si chiar asta te contraziceam. Uite un exemplu mai clar : din 01.01.2008 pana in 31.01.2008 este o luna intreaga. Si eu am intrebat cum se considera o luna intreaga, dar indiferent cum raspunzi la intrebare, din 01 ianuarie (prima zi a lunii) pana in 31 ianuarie (ultima zi a lunii) este o luna intreaga.

Alex Dobrin
Algis Info
 7/22/2008 6:00:53 PM
User is offlinedni
420 posts
2nd


Re: Numarul de luni
 (N/A)

...exact. ai spus foarte bine numai ca eu am considerat ca de la 1 ianuarie pina in 31 ianuarie nu este o luna intraga....si gindindu-ma mai profund chiar nu este; o luna intrega este de la 1 ianuarie pina la 1 februarie (asa cum trebuia eu sa inteleg!!!)

 7/23/2008 4:24:18 PM
User is offlinedni
420 posts
2nd


Re: Numarul de luni
 (N/A)

...uite ca Alex si dorinta de a intelege exact ce inseamna numarul de luni intregi m-au facut sa sap
mai mult si deci sa pierd vreo 2 ore si am constatat ca nici un program candidat cistigator
din acest topic nu-i corect !!!!!......nu am avut timp si chef decit sa verific 3 din ele:

1. programul cistigator sau arta recursivitatii:
?CateLuni({^2007-11-9},{^2008-1-8}) && 11 luni
?CateLuni({^2006-11-9},{^2008-1-9}) && 23 luni
-returneaza 11 luni de cite ori luna de start este mai mare decit luna cealalta.

2. programul secund a lui Alex:
data2={^2008-9-13}
data1={^2008-6-8}
-returneaza 2 in loc de 3

3. programul de la m$
...WITH {^2007-2-13}, {^2007-5-12}
-greseste la numarul de zile

programul corect este  :

nrLuniIntregi = (YEAR(data2) - YEAR(data1)) * 12 + (MONTH(data2) - MONTH(data1)) + IIF(DAY(data2) < DAY(data1),-1,0)

PS: din pacate nu am avut timp sa-l fac la timp si nu am nici o pretentie de punct (chiar daca-l faceam la timp),
dar cred ca e bine sa fie un program corect acolo ...in sprijinul afirmatiilor mele, la cerere, pot arata codul "corectat"
la fiecare din programe ....

 7/23/2008 4:44:56 PM
User is offlineMarian Dobre
371 posts
3rd


Re: Numarul de luni
 (N/A)
Daca va mai aduceti aminte din anii de scoala, matematica definea notiunea de interval inchis si interval deschis. De exemplu intervalul (3,7) fata de [3,7] nu contine numerele 3 si 7. Probabil ca daca s-ar fi definit notiunea de luna intreaga ca fiind ceva de genul [{01/01/2008},{31/01/2008}] atunci nu s-ar mai fi ivit confuzia de mai sus. As mai face un comentariu referitor la data incetarii unui contract de munca. Sa spunem ca acesta este miercuri 23.07.2008. Atunci care este ultima zi de lucru a fostului salariat?
Orice putere omeneasca este un compus de rabdare si de timp. Balzac
 7/23/2008 5:18:25 PM
User is offlinedni
420 posts
2nd


Re: Numarul de luni
 (N/A)

...problema intervalului a fost depasita cu succes, problema este ca este cod gresit....

 7/23/2008 7:40:29 PM
User is offlineoviciandrus
761 posts
www.comptech.ro
1st




Re: Numarul de luni
 (N/A)

De acord, functia avea o scapare (partea marcata cu rosu) :

FUNCTION CateLuni(t1, t2)
 LOCAL lnRez, lnAni
 
 IF t2 <= GoMonth(t1,1)-1
  lnRez = 0
 ELSE
  IF Year(t2) = Year(t1)
   IF Month(t2) < Month(t1)
    lnRez = 0
   ELSE
    lnRez = Month(t2) - Month(t1) - iif(Day(t2)<Day(t1), 1, 0)
   ENDIF
  ELSE
   lnAni  = (Year(t2) - Year(t1) - iif(Right(Dtos(t2),4) < Right(Dtos(t1),4), 1, 0))
   IF lnAni > 0
    lnRez = lnAni * 12 + CateLuni(t1, GoMonth(t2, - 12 * lnAni))
   ELSE
    lnRez = 11 - CateLuni(t2,t1) - Month(t1) + Month(t2)
   ENDIF
  ENDIF
 ENDIF

 RETURN lnRez
ENDFUNC

 7/23/2008 8:07:35 PM
User is offlinedni
420 posts
2nd


Re: Numarul de luni
 (N/A)

...daca introduci ?CateLuni({^2007-11-9},{^2008-1-8}) rezultatul este 1 luna !!!....

deci daca vrei codul tau "corectat" spune doar ......

 7/23/2008 8:13:42 PM
User is offlineoviciandrus
761 posts
www.comptech.ro
1st




Re: Numarul de luni
 (N/A) Modified By oviciandrus  on 7/23/2008 7:16:47 PM)

Il vreau ca nu mai am rabdare

Nu o luna trebuie sa dea!!??? Parca si expresia ta da 1.

 7/23/2008 10:28:33 PM
User is offlinedni
420 posts
2nd


Re: Numarul de luni
 (N/A)

... e corect am facut si eu paste gresit , testeaza cu:
?CateLuni({^2007-12-9},{^2008-11-13}) 
 problema este acolo unde ai incercat sa corectezi:
 lnRez = 11 - CateLuni(t2,t1) - Month(t1) + Month(t2)
 situatia in care se intra aici este cand s-a ajuns la o diferenta de mai putin de 1 an (din start sau dupa celalalt apel recursiv)
apelul cateluni(t2,t1) va intoarce mereu 0 pt ca verifica conditia de aici mereu (cand data de sf. e mai mica ca cea de inceput, pt. ca inversezi datele cand apelezi functia):
IF t2 <= GoMonth(t1,1)-1
  lnRez = 0
 
o corectie poate fi:
lnRez = 12 +MONTH(t2)-MONTH(t1) +iif(Day(t2)<Day(t1), -1, 0)
 
dar atunci nu se mai justifica intreg programul si ideea de recursivitate

 7/24/2008 12:28:42 AM
User is offlineoviciandrus
761 posts
www.comptech.ro
1st




Re: Numarul de luni
 (N/A)
Da, prea complicat am privit treaba. Am renuntat la functia mea si am adoptat-o pe aceea cu expresia într-un singur rând. :)
 7/24/2008 6:11:04 PM
User is offlinedni
420 posts
2nd


Re: Numarul de luni
 (N/A)
oricum meriti punctul si mi se pare o chestie excelenta aceasta "tema pentru acasa" ...
 7/25/2008 10:53:22 AM
User is offlineGrigore Dolghin
3521 posts
www.class-software.eu
1st






Re: Numarul de luni
 (Romania)
Deci pot sa inchid threadul acum? :) Eu le inchid doar ca sa stea in ordine in lista, altfel orice reply intr-un thread mai vechi il aduce la inceputul listei...
Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 7/25/2008 4:04:46 PM
User is offlinedni
420 posts
2nd


Re: Numarul de luni
 (N/A)
din partea mea da ...
  Visual FoxPro  Tema pentru acasa  5. Numarul de l...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement