Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
Je suis à la recherche d'un algorithme qui calcul une date d'échéance à partir d'une date et d'une condition de paiement (du type 15 février + 30 jours fin de mois = 31 mars )
Et la nouveauté, cet algorithme doit également fonctionner avec la condition de paiement 45 jours fin de mois
Merci
Hors ligne
Bonjour,
je n'y connais pas grand chose en condition de paiement mais un truc comme ça peut-il marcher?
datetime ldt_date, ldt_date_expiration, ldt_date_calculer ldt_date = datetime("19/01/2009") ldt_date_calculer = datetime(RelativeDate (date(ldt_date) , 30)) //mois à 31 jours ldt_date_expiration = datetime("31"+string(ldt_date_calculer,"/mm/yy")) If string(ldt_date_expiration,"yyyy-mm-dd") = '1900-01-01' or isnull(ldt_date_expiration) then //mois à 30 jours ldt_date_expiration = datetime("30"+string(ldt_date_calculer,"/mm/yy")) If string(ldt_date_expiration,"dd/mm/yyyy") = '01/01/1900' or isnull(ldt_date_expiration) then //mois à 29 jours ldt_date_expiration = datetime("29"+string(ldt_date_calculer,"/mm/yy")) If string(ldt_date_expiration,"dd/mm/yyyy") = '01/01/1900' or isnull(ldt_date_expiration) then //mois à 28 jours ldt_date_expiration = datetime("28"+string(ldt_date_calculer,"/mm/yy")) End if End if End if
Hors ligne
pour trouver le dernier jour d'un mois M, il suffit de prendre le 1er du mois M+1 et d'enlever un jour
Hors ligne
Pô bête
Hors ligne
Aide de PowerBuilder a écrit:
RelativeDate PowerScript function
Description
Obtains the date that occurs a specified number of days after or before another date.
Syntax
RelativeDate ( date, n )
Argument Description
date A value of type date
n An integer indicating a number of days
Return value
Date. Returns the date that occurs n days after date if n is greater than 0. Returns the date that occurs n days before date if n is less than 0. If any argument's value is null, RelativeDate returns null.
Je sais qu'elle existe à partir de l'édition 10.5 ... je ne connais pas les autres !
Dernière modification par BRWA (23-06-2009 05:44:26)
Hors ligne
Function uf_date_d_echeance(al_echeance long, ab_month_end boolean)
Date ld_echeance Integer li_bisextile = 28 ld_echance = RelativeDate(today(),al_echeance) if ab_month_end then Choose Case MONTH(ld_echance) Case 1 if DAY(ld_echeance) <> 31 then ld_echeance = Date(String(Month(ld_echeance) + "-31-" + String(Year(ld_echeance))) end if Case 3 if DAY(ld_echeance) <> 31 then ld_echeance = Date(String(Month(ld_echeance) + "-31-" + String(Year(ld_echeance))) end if Case 4 if DAY(ld_echeance) <> 30 then ld_echeance = Date(String(Month(ld_echeance) + "-30-" + String(Year(ld_echeance))) end if Case 5 if DAY(ld_echeance) <> 31 then ld_echeance = Date(String(Month(ld_echeance) + "-31-" + String(Year(ld_echeance))) end if Case 6 if DAY(ld_echeance) <> 30 then ld_echeance = Date(String(Month(ld_echeance) + "-30-" + String(Year(ld_echeance))) end if Case 7 if DAY(ld_echeance) <> 31 then ld_echeance = Date(String(Month(ld_echeance) + "-31-" + String(Year(ld_echeance))) end if Case 8 if DAY(ld_echeance) <> 31 then ld_echeance = Date(String(Month(ld_echeance) + "-31-" + String(Year(ld_echeance))) end if Case 9 if DAY(ld_echeance) <> 30 then ld_echeance = Date(String(Month(ld_echeance) + "-30-" + String(Year(ld_echeance))) end if Case 10 if DAY(ld_echeance) <> 31 then ld_echeance = Date(String(Month(ld_echeance) + "-31-" + String(Year(ld_echeance))) end if Case 11 if DAY(ld_echeance) <> 30 then ld_echeance = Date(String(Month(ld_echeance) + "-30-" + String(Year(ld_echeance))) end if Case 12 if DAY(ld_echeance) <> 31 then ld_echeance = Date(String(Month(ld_echeance) + "-31-" + String(Year(ld_echeance))) end if Case 2 if MOD(Year(ld_echeance),4) = 0 then li_bisextile = li_bisextile + 1 if DAY(ld_echeance) <> li_bisextile then ld_echeance = Date(String(Month(ld_echeance) + "-" + String(li_bisextile) + "-" + String(Year(ld_echeance))) end if End Choose
Hors ligne
code qui posera problème en 2100 puisque 2100 ne sera pas bisextile ... mais bon, il y a de la marge ...
Hors ligne
Merci pour ces nombreuses réponses, mais pour l'instant cela ne répond pas à la question de savoir ce que va donner par exemple le 23/06/09 avec une condition de paiement de 45 jours fin de mois, en sachant que 45 et fin de mois sont stockés dans la base de données. (la réponse est le 31/08/09).
Merci d'avance,
Hors ligne
RelativeDate("06-23-09",45) = "08-07-09" = ld_echeance
Choose case MONTH(ld_echeance)
Case 8
Day(ld_echeance) = 07 then Day(ld_echeance) = 31
End Choose
ld_echeance = "08-31-09"
... Moi, il me semble que ça colle ... Je me trompe ?
Hors ligne
Bonjour,
Il me semble que la fonction ci-dessous devrait fonctionner sans problème, en ne s'occupant pas de savoir s'il s'agit d'une année bissextile et le nombre de jours que comporte le mois :
$PBExportHeader$f_dateech.srf global type f_dateech from function_object end type forward prototypes global function date f_dateech (date ad_dateref, integer ai_ech) end prototypes global function date f_dateech (date ad_dateref, integer ai_ech);// Function : calcul de la date d'échéance à n jours fin de mois // Arguments : // ad_dateref : date de référence // ai_ech : nombre de jours pour l'échéance integer li_month, li_year date ld_dateech, ld_lastdayofmonth ld_dateech = RelativeDate(ad_dateref, ai_ech) li_month = Month(ld_dateech) li_year = Year(ld_dateech) li_month++ IF li_month > 12 THEN li_month = 1 li_year++ END IF ld_lastdayofmonth = RelativeDate( date(string(li_year) + "-" + string(li_month) + "-01"), -1) RETURN ld_lastdayofmonth end function
Hors ligne
oui, de fait, elle est plus élégante que la mienne
Dernière modification par BRWA (23-06-2009 12:10:11)
Hors ligne
Effectivement, cela fonctionne très bien.
Merci à tous
Hors ligne
Je dois faire un truc similaire mais dans une DataWindow Expression, pour changer la couleur du champs en focntion de la date du jour, de la date de la commande et du nombre de jours entre la date de commande et la date d'échéance (et éventuellement du fait que celà soit fin du mois ou pas). J'arrive à faire la fonction en PowerScript (celà fonctionne bien, que ce soit celle de Buck ou la mienne), mais je n'arrive pas à la faire en DataWindow Expression. Quelqu'un pourrait-il m'aider ?
Merci.
Hors ligne
tu peux appeler une fonction globale dans une DW expression
Hors ligne
Merci ! J'apprends quelque chose !
Merci beaucoup !
Hors ligne