Has de comprobar que el intervalo que defines no se superpone ni por la izda, ni por la derecha, ni interiormente con ninguno de los que ya hay grabados
//----------------//BUSCAR UN RANGO ENTRE DOS VALORES
Function DeHasta()
local cAlias, oDlg, oBrw, nConsumo:=0, oConsumo
local nWd := GetSysMetrics(0) * .90 // .75
local nHt := GetSysMetrics(1) / 1.20 // 2
dbCreate("C:\DeHasta",{{"DE", "N", 10,0},;
{"HASTA", "N", 10,0},;
{"TARIFA","N", 10,2}})
dbusearea(.t.,,"C:\DeHasta","DeHasta",.t.)
cAlias:=Alias()
(cAlias)->(dbappend())
(cAlias)->de := 0 ; (cAlias)->hasta := 100 ; (cAlias)->tarifa := 0.1
(cAlias)->(dbappend())
(cAlias)->de := 101 ; (cAlias)->hasta := 200 ; (cAlias)->tarifa := 0.2
(cAlias)->(dbappend())
(cAlias)->de := 201 ; (cAlias)->hasta := 300 ; (cAlias)->tarifa := 0.3
(cAlias)->(dbappend())
(cAlias)->de := 301 ; (cAlias)->hasta := 400 ; (cAlias)->tarifa := 0.4
(cAlias)->(dbappend())
(cAlias)->de := 401 ; (cAlias)->hasta := 500 ; (cAlias)->tarifa := 0.5
DEFINE DIALOG oDlg SIZE nWd,nHt PIXEL TITLE "RANGOS DE CONSUMO"
nWd /= 2
nHt /= 2
@1,1 XBROWSE oBrw OF oDlg ;
COLUMNS "DE","HASTA","TARIFA";
ALIAS cAlias
WITH OBJECT oBrw
:nTop := 25
:nLeft := 10
:nBottom := :nTop + nHt - 45
:nRight := :nLeft + nWd - 20
:nMarqueeStyle := MARQSTYLE_HIGHLROW
:lColDividerComplete := .t.
:nStyle := nAnd( :nStyle, nNot( WS_BORDER ) )
:nColDividerStyle:=LINESTYLE_LIGHTGRAY
:nRowDividerStyle:=LINESTYLE_LIGHTGRAY
:nHeaderHeight := 30 //altura del header
:nHeadStrAligns := AL_CENTER //texto cabeceras de cols centrado
END
WITH OBJECT oBrw:aCols[1]
:nWidth := 60
:nEditType := 1
END
WITH OBJECT oBrw:aCols[2]
:nWidth := 60
:nEditType := 1
END
WITH OBJECT oBrw:aCols[3]
:nWidth := 60
:nEditType := 1
END
oBrw:CreateFromCode()
@ nHt-135, 10 SAY "Consumo: " SIZE 50,8 PIXEL OF oDlg
@ nHt-135, 50 GET oConsumo VAR nConsumo SIZE 54,10 PIXEL OF oDlg PICTURE "99,999";
VALID ( BuscRango(nConsumo,oBrw,cAlias), .T. )
@ nHt-15, 124 BUTTON 'Salir' SIZE 35,11 PIXEL OF oDlg ACTION ( oDlg:End() ) CANCEL
ACTIVATE DIALOG oDlg CENTERED ;
ON INIT ( FitSizes( oBrw, ), oConsumo:SetFocus() )
(cAlias)->(DBCLOSEAREA())
Ferase("C:\"+(cAlias)+".dbf")
RETURN nil
//----------------------------
Function BuscRango(nConsumo,oBrw,cAlias)
local nTarifa:=0
(cAlias)->(dbgotop())
While (cAlias)->(!eof())
if (cAlias)->hasta >= nConsumo
nTarifa:= (cAlias)->Tarifa
Exit
endif
(cAlias)->(dbskip())
enddo
MsgInfo("Tarifa es: "+Transform(nTarifa,"9,999.99"))
oBrw:Refresh()
oBrw:SetFocus()
return nTarifa
#include 'fivewin.ch'
Function Main()
Local i
Local nMin
Local nMax
Local nSubTotal := 0
Local nTotalPesos := 0
Local aTotalAgua := {}
Local nTotalAgua := 303
Local aTarifas := { { '0-100', '0.1' }, { '101-200', '0.3' }, { '201-300', '0.4' }, { '301-400', '0.5' } }
For i := 1 To Len( aTarifas )
nMin := Val( SubStr( aTarifas[ i ][ 1 ], 1, At( '-', aTarifas[ i ][ 1 ] ) - 1 ) )
nMax := Val( SubStr( aTarifas[ i ][ 1 ], At( '-', aTarifas[ i ][ 1 ] ) + 1, 3 ) )
If( nTotalAgua > nMax )
Aadd( aTotalAgua, nMax - nMin )
Else
AEval( aTotalAgua, { | x | nSubTotal += x } )
Aadd( aTotalAgua, nTotalAgua - nSubTotal )
End
Next i
For i := 1 To Len( aTotalAgua )
? aTotalAgua[ i ]
Next i
Return 0
joseluispalma wrote:Hola compañeros,
Muchísimas gracias a todos por la ayuda prestada. Ya prácticamente está.
El problema es que las tarifas deben ser acumulativas. Me explico, si tengo 303 m3 de agua:
- Los primeros 100 litros van a la primera tarifa, de 0,2/m3
- Los 99 siguientes van a la segunda tarifa, de 0,3/m3
- Los 99 siguientes van a la tercera tarifa, de 0,4/m3
- Los 5 últimos litros van a la cuarta tarifa, de 0,5/m3
Tal que así para 303 m3 de agua:
De 0 a 100 m3->: 0,2 x 100 m3 =20 euros
De 101 a 200->: 0,3 x 99 m3 =29,7 euros
De 201 a 300->: 0,4 x 99 m3 = 39,6 euros
De 301 a 303->: 0,5 x 5 m3 = 2,5 euros
Total: 91,8 euros
Esto de tener que aplicar varios tramos a la vez es lo que me estoy volviendo loco.
Disculparme el no haberme explicado bien.
Muchísimas gracias de verdad. Un saludo,
joseluispalma wrote:Disculparme el no haberme explicado bien.
FranciscoA wrote:joseluispalma wrote:Disculparme el no haberme explicado bien.
Todo está claro ahora.
La única observación, es que considero que el intervalo o rango es de 100 y no de 99. (según consumo final en cada item)
y se deberia iniciar en 1 y no es cero(0)
nSaldo := nConsumo (303)
nImporte := 0.00
Ir al Pincipio de la tabla
DBGOTOP()
DO WHILE ! EOF()
IF nSaldo >= nTramo
nImporte := ROUND(nImporte + nTramo * nCosto,2)
nSaldo := nSaldo - nTramo
ENDIF
SKIP()
ENDDO
IF nSaldo > 0
DBGOBOTTOM()
nImporte := ROUND(nImporte + nTramo * nCosto,2)
ENDIF
Return to FiveWin para Harbour/xHarbour
Users browsing this forum: Google [Bot] and 41 guests