FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour gesti贸n de tarifas (de agua) [Solucionado]
Posts: 2064
Joined: Fri Jan 06, 2006 09:28 PM
Re: gesti贸n de tarifas (de agua)
Posted: Sun Mar 16, 2014 03: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 (fw): Select all Collapse
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... :-)
Dios no est谩 muerto...



Gracias a mi Dios ante todo!
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: gesti贸n de tarifas (de agua)
Posted: Sun Mar 16, 2014 03:47 AM
Aqui otro ejemplo autocontenido y "mas completo".
Code (fw): Select all Collapse
//-----------------------------------------
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
Posts: 109
Joined: Mon Apr 30, 2012 09:10 AM
Re: gesti贸n de tarifas (de agua) [Solucionado]
Posted: Sun Mar 16, 2014 05: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-&gt;hasta - FIELD-&gt;de

 // Saber los nLitrosaFacturar
 IF nLitrosPendientes &gt;= nLitrosTramo
    nLitrosaFacturar  := nLitrosTramo
    nLitrosPendientes := nLitrosPendientes-nLitrosaFacturar


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

 ENDIF

 nPrecioTramo := nLitrosaFacturar*FIELD-&gt;TARIFA
 nTotal        := nTotal + nPrecioTramo


 if nLitrosPendientes = 0
    nTotal2 := nTotal
 endif

endif

DbSkip()

enddo

Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: gesti贸n de tarifas (de agua) [Solucionado]
Posted: Sun Mar 16, 2014 05:43 PM
Amigos:

Una vuelta m谩s al rizo

Code (fw): Select all Collapse
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
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
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: gesti贸n de tarifas (de agua) [Solucionado]
Posted: Sun Mar 16, 2014 06:15 PM
El mismo ejemplo autocontenido, con algunas mejoras:
Code (fw): Select all Collapse
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
Posts: 2064
Joined: Fri Jan 06, 2006 09:28 PM
Re: gesti贸n de tarifas (de agua) [Solucionado]
Posted: Sun Mar 16, 2014 09:58 PM
Armando wrote:Amigos:

Una vuelta m谩s al rizo

Code (fw): Select all Collapse
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... :-)
Dios no est谩 muerto...



Gracias a mi Dios ante todo!

Continue the discussion