gestión de tarifas (de agua) [Solucionado]

Re: gestión de tarifas (de agua)

Postby joseluisysturiz » Sun Mar 16, 2014 3:30 am

Armando wrote:Amigos:

Como decía el master, para rizar el rizo, yo lo haría así:

Crear mi tabla con los campos siguientes

nLinea nTramo nCosto Index por nLinea
1 100 ,20
2 99 ,30
3 99 ,40
5 99 ,50

Y el código sería así:
Code: Select all  Expand view  RUN

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
 


Saludos



Armando, estoy 99% de acuerdo contigo en como lo harias, pero solo no haria el dbgottom, ya que como son varias tarifas y el nConsumo no es mayor igual a nTramo y se acaba en el 2do u otra anterior posicion, entonce el restante se debe calcular en base a ese tramo que hace la ruptura de control del do while, no en el ultimo, bueno, eso lo determine haciendo una corrida en frio a tu manera de hacerlo, a lo mejor estoy equivocado, pero como lo dices, seria una manera sencilla y rapida de resolver el problema del colega y tocayo, saludos... :shock:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: gestión de tarifas (de agua)

Postby FranciscoA » Sun Mar 16, 2014 3:47 am

Aqui otro ejemplo autocontenido y "mas completo".
Code: Select all  Expand view  RUN
//-----------------------------------------
Function TarifaIncrem()
local cAlias, oDlg, oBrw, nConsumo:=0, oConsumo
local nWd := GetSysMetrics(0) *  .90  // .75
local nHt := GetSysMetrics(1) / 1.20   // 2
local aGradBarSel:= { { 1, RGB(252,232,171)   , RGB(248,195, 34) } }
local aGradRowSel:= {{1, RGB(108,125, 184), RGB(241,222,088)}}
local nDe,nHasta,nTar

dbCreate("C:\Tarifa",{{"DE",     "N", 10,0},;
                      {"HASTA",  "N", 10,0},;
                      {"TARIFA", "N", 10,2},;
                      {"CONSUMO","N", 10,2},;
                      {"VALOR",  "N", 10,2}})

dbusearea(.t.,,"C:\Tarifa","Tarifa",.f.)
cAlias:=Alias()

nDe:=1
nHasta:=100
nTar:=0.10
While nHasta <= 1500
  (cAlias)->(dbappend())
  (cAlias)->de := nDe  ;  (cAlias)->hasta := nHasta  ; (cAlias)->tarifa := nTar
   nDe:=nHasta+1
   nHasta += 100
   nTar += 0.10
Enddo


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","CONSUMO","VALOR";
     ALIAS cAlias

   WITH OBJECT oBrw
      :nTop                   := 10  
      :nLeft                  := 10
      :nBottom                := :nTop + nHt - 30
      :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
      :bClrSel       := {|| { nRGB(  0,  0,  0), aGradRowSel } }  // para barra de linea selecc cuando el control no tiene el foco
      :bClrSelFocus  := { || { CLR_BLACK, aGradBarSel } }     // para barra de linea selecc cuando el control tiene el foco
      :lFooter := .t.
   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  

   WITH OBJECT oBrw:aCols[4]
      :nWidth := 60
      :nEditType := 0
      :cEditPicture := "99,999,999.99"
      :lTotal := .t.
      :nTotal := 0
      :nFooterType := AGGR_TOTAL
   END  

   WITH OBJECT oBrw:aCols[5]
      :nWidth := 60
      :nEditType := 0
      :cEditPicture := "99,999,999.99"
      :lTotal := .t.
      :nTotal := 0
      :nFooterType := AGGR_TOTAL
   END  

   oBrw:CreateFromCode()
   oBrw:MakeTotals()

   @ nHt-15, 10  SAY "Consumo: " SIZE 50,8 PIXEL OF oDlg
   @ nHt-15, 50  GET oConsumo VAR nConsumo SIZE 54,10 PIXEL OF oDlg PICTURE "99,999,999.99" RIGHT;
         VALID ( LiqConsumo(nConsumo,oBrw,cAlias), oBrw:MakeTotals(), .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 LiqConsumo(nConsumoTot,oBrw,cAlias)
local nConsuParc:=0, nSaldo:=nConsumoTot

(cAlias)->(dbgotop())  //limpiamos por si calc mas de 1 vez
While (cAlias)->(!eof())
   (cAlias)->Consumo := 0
   (cAlias)->Valor   := 0
   (cAlias)->(dbskip())
enddo

(cAlias)->(dbgotop())
While nSaldo > 0  
   if nConsumoTot > (cAlias)->Hasta
      nConsuParc := ( (cAlias)->Hasta - (cAlias)->De )+1
   else
      nConsuParc := nSaldo
   endif

   (cAlias)->Consumo := nConsuParc
   (cAlias)->Valor   := Round( nConsuParc * (cAlias)->Tarifa, 2)
 
   nSaldo -= nConsuParc

   (cAlias)->(dbskip())
enddo

   (cAlias)->(dbSkip(-1))
   oBrw:Refresh()
   oBrw:SetFocus()
return nil

Por supuesto que el ejemplo esta basado en cifras enteras. Si se utilizaran decimales, lo mejor sería extraer los consumos segun diferencia entre cada registro y de la columna HASTA, en este ejemplo.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2159
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: gestión de tarifas (de agua) [Solucionado]

Postby joseluispalma » Sun Mar 16, 2014 5:03 pm

Amigos,

Muchas gracias por todas vuestras indicaciones. Al final, la función será algo así aproximadamente:

do While !eof()

if nConsumo >= field->de


nLitrosTramo := FIELD->hasta - FIELD->de

// Saber los nLitrosaFacturar
IF nLitrosPendientes >= nLitrosTramo
nLitrosaFacturar := nLitrosTramo
nLitrosPendientes := nLitrosPendientes-nLitrosaFacturar


ELSE // Último tramo
nLitrosaFacturar := nLitrosPendientes
nLitrosPendientes := 0

ENDIF

nPrecioTramo := nLitrosaFacturar*FIELD->TARIFA
nTotal := nTotal + nPrecioTramo


if nLitrosPendientes = 0
nTotal2 := nTotal
endif



endif

DbSkip()

enddo
joseluispalma
 
Posts: 109
Joined: Mon Apr 30, 2012 9:10 am

Re: gestión de tarifas (de agua) [Solucionado]

Postby Armando » Sun Mar 16, 2014 5:43 pm

Amigos:

Una vuelta más al rizo

Code: Select all  Expand view  RUN
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
     ELSE
          nImporte := ROUND(nImporte + nSaldo * nCosto,2)
          nSaldo := 0
     ENDIF
     SKIP()
ENDDO

IF nSaldo > 0
     DBGOBOTTOM()
     nImporte := ROUND(nImporte + nTramo * nCosto,2)
ENDIF


joseluisysturiz:

Me parece que con el ELSE queda solucionado y es un código reducido,
desde luego lo estoy haciendo al vuelo no he probado mi código, el código
con DBGOBOTTOM() es para cuando se haya recorrido toda la tabla y aún
queden metros (nSaldo > 0) por valuar.

Saludos a todos los foreros
Last edited by Armando on Sun Mar 16, 2014 6:20 pm, edited 1 time in total.
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
Armando
 
Posts: 3229
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: gestión de tarifas (de agua) [Solucionado]

Postby FranciscoA » Sun Mar 16, 2014 6:15 pm

El mismo ejemplo autocontenido, con algunas mejoras:
Code: Select all  Expand view  RUN
Function TarifaIncrem()
local cAlias, oDlg, oBrw, nConsumo:=0, oConsumo
local nWd := GetSysMetrics(0) *  .90  // .75
local nHt := GetSysMetrics(1) / 1.20   // 2
local aGradBarSel:= { { 1, RGB(252,232,171)   , RGB(248,195, 34) } }
local aGradRowSel:= {{1, RGB(108,125, 184), RGB(241,222,088)}}
local nDe,nHasta,nTar

dbCreate("C:\Tarifa",{{"DE",     "N", 12,2},;
                      {"HASTA",  "N", 12,2},;
                      {"TARIFA", "N", 10,2},;
                      {"CONSUMO","N", 12,2},;
                      {"VALOR",  "N", 12,2}})

dbusearea(.t.,,"C:\Tarifa","Tarifa",.f.)
cAlias:=Alias()

nDe:=1
nHasta:=100
nTar:=0.10
While nHasta <= 1500
  (cAlias)->(dbappend())
  (cAlias)->de := nDe  ;  (cAlias)->hasta := nHasta  ; (cAlias)->tarifa := nTar
   nDe:=nHasta+1
   nHasta += 100
   nTar += 0.10
Enddo
  (cAlias)->(dbappend())  // para poder calcular cuando consumo es mayor a 1500
  (cAlias)->de := nDe  ;  (cAlias)->hasta := 99000000.00  ; (cAlias)->tarifa := nTar


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","CONSUMO","VALOR";
     ALIAS cAlias

   WITH OBJECT oBrw
      :nTop                   := 10  
      :nLeft                  := 10
      :nBottom                := :nTop + nHt - 30
      :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
      :bClrSel       := {|| { nRGB(  0,  0,  0), aGradRowSel } }  // para barra de linea selecc cuando el control no tiene el foco
      :bClrSelFocus  := { || { CLR_BLACK, aGradBarSel } }     // para barra de linea selecc cuando el control tiene el foco
      :bClrStd       := {|| IF( (cAlias)->Consumo >0, {CLR_BLACK, RGB(238, 238, 238)}, {RGB(120, 120, 120), CLR_WHITE} ) }  
      :lFooter := .t.
   END

   WITH OBJECT oBrw:aCols[1]
      :nWidth := 80
      :nEditType := 1
      :cEditPicture := "99,999,999.99"
   END  

   WITH OBJECT oBrw:aCols[2]
      :nWidth := 80
      :nEditType := 1
      :cEditPicture := "99,999,999.99"
   END  

   WITH OBJECT oBrw:aCols[3]
      :nWidth := 80
      :nEditType := 1
      :cEditPicture := "99,999,999.99"
   END  

   WITH OBJECT oBrw:aCols[4]
      :nWidth := 80
      :nEditType := 0
      :cEditPicture := "99,999,999.99"
      :lTotal := .t.
      :nTotal := 0
      :nFooterType := AGGR_TOTAL
   END  

   WITH OBJECT oBrw:aCols[5]
      :nWidth := 80
      :nEditType := 0
      :cEditPicture := "99,999,999.99"
      :lTotal := .t.
      :nTotal := 0
      :nFooterType := AGGR_TOTAL
   END  

   oBrw:CreateFromCode()
   oBrw:MakeTotals()

   @ nHt-15, 10  SAY "Consumo: " SIZE 50,8 PIXEL OF oDlg
   @ nHt-15, 50  GET oConsumo VAR nConsumo SIZE 54,10 PIXEL OF oDlg PICTURE "99,999,999.99" RIGHT;
         VALID ( if(ConsumoOK(nConsumo,cAlias), (LiqConsumo(nConsumo,oBrw,cAlias), oBrw:MakeTotals(), .T.) ,.f.) )

   @ 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 ConsumoOK(nConsumo,cAlias)
(cAlias)->(dbGoBottom())
if nConsumo > (cAlias)->hasta
   MsgStop("
Consumo digitado sobrepasa al maximo de la tabla.","Alto")
   return .f.
endif
Return .t.

//----------------------------
Function LiqConsumo(nConsumoTot,oBrw,cAlias)
local nConsuParc:=0, nSaldo:=nConsumoTot, nHastaAnt:=0

(cAlias)->(DbEval( {|| (cAlias)->Consumo:=0,(cAlias)->Valor:=0} ))  //limpiamos por si calc mas de 1 vez

(cAlias)->(dbgotop())
While nSaldo > 0  
   if nConsumoTot > (cAlias)->Hasta
      nConsuParc := (cAlias)->Hasta - nHastaAnt
   else
      nConsuParc := nSaldo
   endif

   (cAlias)->Consumo := nConsuParc
   (cAlias)->Valor   := Round( nConsuParc * (cAlias)->Tarifa, 2)

   nHastaAnt:= (cAlias)->Hasta
   nSaldo -= nConsuParc

   (cAlias)->(dbskip())
enddo

   (cAlias)->(dbSkip(-1))
   oBrw:Refresh()
   oBrw:SetFocus()
return nil

Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2159
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: gestión de tarifas (de agua) [Solucionado]

Postby joseluisysturiz » Sun Mar 16, 2014 9:58 pm

Armando wrote:Amigos:

Una vuelta más al rizo

Code: Select all  Expand view  RUN
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
     ELSE
          nImporte := ROUND(nImporte + nSaldo * nCosto,2)
          nSaldo := 0
     ENDIF
     SKIP()
ENDDO

IF nSaldo > 0
     DBGOBOTTOM()
     nImporte := ROUND(nImporte + nTramo * nCosto,2)
ENDIF


joseluisysturiz:

Me parece que con el ELSE queda solucionado y es un código reducido,
desde luego lo estoy haciendo al vuelo no he probado mi código, el código
con DBGOBOTTOM() es para cuando se haya recorrido toda la tabla y aún
queden metros (nSaldo > 0) por valuar.

Saludos a todos los foreros


Ok, te insisto en lo del DBGOTTOM, ya que el saldo que quede sobrando que no sea mayor igual a nTramo, se debe calcular en base al nCosto de ese tramos que hizo saliera del DO WHILE, bueno, asi lo veo, igual, el colega que lo termine de pulir y lo prueb con data de su cliente y nos comente luego cuando lo tenga listo, saludos... :shock:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Previous

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 42 guests