#Include "FiveWin.ch"
#Include "xBrowse.ch"
STATIC oDlg,oFont1, oFont
Static S05,S08, S10, S13 // Alias de base de datos
STATIC lSelSeg,NivBal
STATIC cCta,cCtaIni,cRefere,SdoMesAnt,SdoIni,Cta1,Cta2,Cta3,Cta4,nReg,nCol,aSum, aTot //
STATIC nMA_Ini, nMA_Fin, n
STATIC aGradBarSelFocus := {{ 1, RGB(252,232,171) , RGB(248,195,34) }} ,;
aGradBarSel := {{ 1, RGB(252,235, 184), RGB(251,222,88) }}
Static cID_AMMov
MemVar oWnd, oMOpc, nNumEmp, cDescrEmp, Mes_Per, Ano_Per, nStation,EjeMAIn
//------------------------------------------------------------------------------
FUNCTION C_PROVCLIE()
LOCAL oItem:=oMOpc,oWChld, nW, nH,xEmp
LOCAL aDatos1, aDatos2, oBrw1, oBrw2,lSalir
xEmp := nNumEmp
lSelSeg := .F.
NivBal := 4
aTot := {{ 0,0,0,0,0,0,0 }}
nReg := 0
cID_AMMov:= TSTR(VAL(SUBS(STR(Ano_Per,4),3,2))) + TSTR(Mes_Per)
aDatos1:= {{ "","","","","","","" }}
aDatos2:= {{ "","","","","","","","" }}
*DEFINE FONT oFont1 NAME "TAHOMA" SIZE 0,-10 ITALIC BOLD
DEFINE FONT oFont1 NAME "TAHOMA" SIZE 0,-12 // Fuentes y Dialogos
DEFINE FONT oFont NAME "ARIAL" SIZE 0,-12 BOLD
DEFINE WINDOW oWChld MDIChild FROM 1,2 TO 2,2 OF oWnd TITLE 'Consulta estado de cuenta de CxP Proveedores ' NOZOOM // ICON oIcon
DEFINE DIALOG oDlg RESOURCE "C_CXPPROVE" OF oWChld FONT oFont1 COLOR CLR_BLUE
// Consulta Balanza cuentas acumulados \\
REDEFINE XBROWSE oBrw1 ID 101 OF oDlg ;
HEADERS 'Cuentas','Descripción','Sdo Ant','Cargo','Abono','Sdo Act','TipNat' ;
COLSIZES 130,260,85,85,85,85,20 ;
PICTURES "@!" ,;
"@!" ,;
"999,999,999.99" ,;
"999,999,999.99" ,;
"999,999,999.99" ,;
"999,999,999.99" ,;
"@!" ;
ARRAY aDatos1 FOOTERS AUTOCOLS
For n := 1 to len( oBrw1:aCols ) //Font segun lineas condicionadas // Como puedo leer el valor ...
*oBrw1:aCols[n]:oDataFont := {|| IF( !EMPTY(oBrw1:aCols[2]:Value), IF( !substr(oBrw1:aCols[2]:Value,1,3) = " ", oFont, oWnd:oFont) ,) }
oBrw1:aCols[n]:oDataFont := {|| if( !empty(oBrw1:aCols[2]:Value), if( oBrw1:aCols[7]:Value = "A", oFont, oWnd:oFont) ,) }
Next
WITH OBJECT oBrw1
//ESTILOS DE LINEAS
:nMarqueeStyle := MARQSTYLE_HIGHLROW //barra selectora
:lColDividerComplete:= .T. //completa pintado hasta el footer cuando lineas no llenan todo el browse
:nColDividerStyle := LINESTYLE_BLACK
:bClrSel := { || { nRGB( 0, 0,255), aGradBarSel } } // para barra de linea selecc cuando el control no tiene el foco
:bClrSelFocus := { || { CLR_BLACK, aGradBarSelFocus } } // para barra de linea selecc cuando el control tiene el foco
:lKinetic := .F.
:lContrastClr := .F. //para que no cambie color de texto automaticamente segun intensidad del fondo
:bChange := { || MovEdoCta(oBrw1,@aDatos2,oBrw2), oBrw2:Refresh() }
:aCols[7]:lHide = .T.
END
//Siguiendo tu estilo, para poner en negrita las acumulativas, pueder hacer asi:
*For n := 1 to len( oBrw1:aCols ) //Font segun lineas condicionadas
* oBrw1:aCols[n]:oDataFont := {|| IF( !SUBS(oBrw1:aCols[2]:Value,1,3) = " ", oFont, oWnd:oFont) }
*Next
// Consulta Estados de cuentas a detalle \\
REDEFINE XBROWSE oBrw2 ID 102 OF oDlg ;
HEADERS 'Tipo','Num','Fecha','Referencia','Concepto','Cargo','Abono','Sdo Act' ;
COLSIZES 28,30,52,80,180,85,85,85 ;
PICTURES "@!" ,;
"@9999" ,;
"@D" ,;
"@!" ,;
"@!" ,;
"999,999,999.99" ,;
"999,999,999.99" ,;
"999,999,999.99" ;
ARRAY aDatos2 FOOTERS CELL AUTOCOLS
WITH OBJECT oBrw2
//ESTILOS DE LINEAS
:nMarqueeStyle := MARQSTYLE_HIGHLROW //barra selectora
:lColDividerComplete:= .T. //completa pintado hasta el footer cuando lineas no llenan todo el browse
:nColDividerStyle := LINESTYLE_BLACK
:lFooter := .T.
:bClrSel := {|| { nRGB( 0, 0,255), aGradBarSel } } // para barra de linea selecc cuando el control no tiene el foco
:bClrSelFocus := {|| { CLR_BLACK, aGradBarSelFocus } } // para barra de linea selecc cuando el control tiene el foco
:lKinetic := .F.
:lContrastClr := .F. //para que no cambie color de texto automaticamente segun intensidad del fondo
:nStretchCol := STRETCHCOL_LAST
:aCols[4]:nEdittype := EDIT_BUTTON
:aCols[4]:nBtnBmp := 1
*:aCols[4]:nWidth := 50
:aCols[4]:AddResource( "DETFACT" ) // tu ícono p/el boton
:aCols[4]:bEditBlock := {|| MovDetFac(oBrw1,oBrw2) } // llama a una funcion que abre un Dlg y muestra el Detalle
*:aCols[4]:bEditBlock := {|| IF( SUBS(oBrw1:aCols[2]:Value,1,3) = " ", MovDetFac(oBrw1,oBrw2),) } // llama a una funcion que abre un Dlg y muestra el Detalle
:aCols[6]:nFootStrAlign:= 1 // AL_LEFT - AL_RIGHT - AL_CENTER - 0 - 1 - 2
:aCols[6]:oFooterFont := oFont
:aCols[7]:nFootStrAlign:= 1 // AL_LEFT - AL_RIGHT - AL_CENTER - 0 - 1 - 2
:aCols[7]:oFooterFont := oFont
:aCols[8]:nFootStrAlign:= 1 // AL_LEFT - AL_RIGHT - AL_CENTER - 0 - 1 - 2
:aCols[8]:oFooterFont := oFont
END
oWChld:bGotFocus := {|| oBrw1:SetFocus() }
CargaDatos(oBrw1,@aDatos1)
MovEdoCta(oBrw1,@aDatos2,oBrw2)
nW:= IF(GetVersion()[1]>5,15, 8)
nH:= IF(IsWinNT(),33,25)
ACTIVATE DIALOG oDlg NOWAIT VALID ( oWChld:End() ) // IT HAS TO BE NONMODAL -->NOWAIT CLAUSE
ACTIVATE WINDOW oWChld ON INIT oDlg:Move(0,0) ON RESIZE oWChld:SetSize(oDlg:nWidth+nW,oDlg:nHeight+nH,.T.) ;
VALID Finaliza(oItem)
RETURN NIL
* CARGA DATOS Y MOVIMIENTOS AUXILIARES TEMPORALES EXCEPTO LA FUNCION CargaDatos, que es una rutina para agregar AADD()*
//------------------------------------------------------------------------------
STATIC FUNCTION CargaDatos(oBrw1,aDatos1)
LOCAL cCtas
aDatos1 := {}
S08 := Abre_Dbf(8,8) // ABRE CATCTAxA.DBF // Catalogo de cuentas INDEX ON "CUENTAS"
S13 := Abre_Dbf(13,13) // Abre: MOVTxMxA.DBF // Movimientos INDEX ON "MV_NCTA+MV_REFE"
(S08)->(DbGoTop())
SdoMesAnt:= ("SALD"+TSTR(Mes_Per - 1))
cCtas := SUBS((S08)->ID_CUENTA,1,4)
IF (S08)->( !BOF() )
DO WHILE (S08)->(!EOF())
IF cCtas <> SUBS((S08)->ID_CUENTA,1,4)
AADD( aDatos1, { "","","","","","","" } )
ENDIF
(S08)->(DbSetOrder(1))
(S08)->(DbSeek((S08)->ID_CUENTA))
SdoIni := (S08)->(&SdoMesAnt)
(S13)->( DbSetOrder(7) ) // Asi funciona mejor
(S13)->( SetSeek(cID_AMMov+(S08)->ID_CUENTA) ) // Asi funciona mejor
nCol:= NivCol(nCol)
aSum := {{0,0,0}}
DO WHILE FUNNIV(lSelSeg,S08,S10,S13,Cta1,Cta2,Cta3,Cta4) .AND. (S13)->(!EOF())
aSum[1,1] := aSum[1,1] + (S13)->CARGO // Suma CARGOS
aSum[1,2] := aSum[1,2] + (S13)->ABONO // Suma ABONOS
(S13)->(DbSkip())
ENDDO
aSum[1,3] := (SdoIni + aSum[1,1]) - aSum[1,2]
IF ( (S08)->TIPONAT = 'D' )
aTot[1,1] := aTot[1,1] + SdoIni // Total Saldos iniciales
aTot[1,2] := aTot[1,2] + aSum[1,1] // Total de Cargos
aTot[1,3] := aTot[1,3] + aSum[1,2] // Total DE Abonos
ENDIF
IF ( (S08)->NIVSUM <= NivBal )
IF SdoIni <> 0 .OR. aSum[1,1] <> 0 .OR. aSum[1,2] <> 0
AADD( aDatos1, { Ext_xNiv(LTRIM((S08)->ID_CUENTA)), ; // Llena datos de ARRAY
nCol+(S08)->NOMBCTA , ;
SdoIni , ;
aSum[1,1] , ;
aSum[1,2] , ;
aSum[1,3] , ;
(S08)->TIPONAT } )
ENDIF
ENDIF
cCtas := SUBS((S08)->ID_CUENTA,1,4)
(S08)->(DbSkip())
ENDDO
ELSE
MsgInfo("que hace aqui...")
aDatos1 := {{ "","","","","","","" }}
ENDIF
oBrw1:SetArray(aDatos1)
RETURN NIL
//------------------------------------------------------------------------------
STATIC FUNCTION MovEdoCta(oBrw1,aDatos2,oBrw2)
LOCAL aDat[9],aSum[8], aSub[8], aTot[8]
cCta := oBrw1:aArrayData[oBrw1:nArrayAt,1]
aDatos2 := {}
*IF ( oBrw1:aCols[6]:Value ) <> 0
* MsgInfo(oBrw1:aCols[6]:Value)
*ENDIF
AFill(aDat,"")
AFill(aSum,0)
AFill(aSub,0)
AFill(aTot,0)
IF !cCta == "" // Condicion "" que si encuentra separacion que es "",no busque en el DbSeek por ser nulo
*IF ( oBrw1:aCols[6]:Value ) <> 0
* MsgInfo("Pasa aqui...")
cCtaIni:= SUBS(cCta,1,4)+SUBS(cCta,6,4)+SUBS(cCta,11,4)+SUBS(cCta,16,4)
(S13)->( DbSetOrder(5) )
*(S13)->( DbGoTop() )
IF (S13)->( DbSeek(cCtaIni) )
aDat[2]:= (S13)->ID_REFERE // ID Principal de referencias folios o facturas
DO WHILE (S13)->(!EOF())
IF (S13)->ID_AMMOV <= cID_AMMov
IF (S13)->ID_REFERE <> aDat[2] // ID Referencia
IF ( ROUND(aSum[3],2) <> 0.00 )
aTot[1] += aSum[1] // Total Cargos
aTot[2] += aSum[2] // Total Abonos
aTot[3] += aSum[3] // Total Dif Sdos
AADD( aDatos2, { aDat[3] , ; // (S13)->ID_TIPOPL
aDat[4] , ; // (S13)->ID_NUMPOL
aDat[5] , ; // (S13)->FECMOV
aDat[2] , ; // (S13)->ID_REFERE
aDat[6] , ; // (S13)->CONCEPMOV
aSum[1] , ; // (S13)->CARGO
aSum[2] , ; // (S13)->ABONO
aSum[3] } ) // Dif Sdo
ENDIF
AFill(aSum,0)
ENDIF
IF (S13)->ID_CUENTA > cCtaIni
EXIT
ENDIF
aDat[1]:= (S13)->ID_CUENTA // ID Principal de cuentas contables
aDat[2]:= (S13)->ID_REFERE // ID Principal de referencias folios o facturas
aDat[3]:= (S13)->ID_TIPOPL
aDat[4]:= (S13)->ID_NUMPOL
aDat[5]:= (S13)->FECMOV
aDat[6]:= (S13)->CONCEPMOV
aSum[1] += (S13)->CARGO // Suma Cargos
aSum[2] += (S13)->ABONO // Suma Abonos
aSum[3] := aSum[1] - aSum[2] // Suma Dif de saldos
ENDIF
(S13)->( DbSkip() )
ENDDO
ENDIF
ENDIF
*oBrw2:SetArray(aDatos2) // Este No funciona ...
oBrw2:aArrayData := aDatos2 // Este Si funciona ...
oBrw2:aCols[6]:nTotal= Trans( aTot[1],"999,999,999.99") // Total cargos
oBrw2:aCols[7]:nTotal= Trans( aTot[2],"999,999,999.99") // Total Abonos
oBrw2:aCols[8]:nTotal= Trans( aTot[3],"999,999,999.99") // Total Dif Sdos
*ENDIF
oBrw2:Refresh()
RETURN NIL
//------------------------------------------------------------------------------
STATIC FUNCTION MovDetFac(oBrw1,oBrw2)
LOCAL oDlg2, oFnt1, oS_Obs := ARRAY(2), oBrw
LOCAL cObserva:=""
cCta := oBrw1:aArrayData[oBrw1:nArrayAt,1]
cCtaIni := SUBS(cCta,1,4)+SUBS(cCta,6,4)+SUBS(cCta,11,4)+SUBS(cCta,16,4)
cRefere := oBrw2:aArrayData[oBrw2:nArrayAt,4]
IF !EMPTY(cRefere) // Condicion Nil que la referencia esta vacia
*Refr_MovFact(cCtaIni,cRefere,oBrw)
(S13)->( OrdScope(0,cCtaIni+cRefere) )
(S13)->( OrdScope(1,cCtaIni+cRefere) )
(S13)->( DbGoTop() )
DEFINE FONT oFnt1 NAME "Arial" SIZE 0,-14 BOLD
DEFINE DIALOG oDlg2 RESOURCE "C_MOVDETFAC" FONT oFont1 COLOR CLR_BLUE
REDEFINE XBROWSE oBrw ID 101 OF oDlg2 ;
HEADERS 'Tipo' ,'Num' ,'Fecha' ,'Referencia','Concepto' ,'Cargo','Abono',"Dif Sdo" ;
COLUMNS 'ID_TIPOPL','ID_NUMPOL','FECMOV','ID_REFERE' ,'CONCEPMOV','CARGO','ABONO','00.00' ;
SIZES 28,30,52,80,180,85,85,85 ;
PICTURES "","","","","","999,999,999.99","999,999,999.99","999,999,999.99" ;
ALIAS (S13)->( ALIAS() ) FOOTERS LINES CELL
AEval( oBrw:aCols, { |o| o:nEditType := 0 ,; //No editables
o:nHeadStrAlign:= 2 } ) //texto encab/col centrado
Refr_MovFact(oBrw)
WITH OBJECT oBrw
:nMarqueeStyle := MARQSTYLE_HIGHLROW //_HIGHLROWMS
:nColDividerStyle:=LINESTYLE_LIGHTGRAY
:nRowDividerStyle:=LINESTYLE_LIGHTGRAY
//:bClrStd := {|| { nRGB( 0, 0, 0), nRGB(255,248,220) } } // colores para lineas normales
:bClrSel := {|| { nRGB( 0, 0,255), aGradBarSel } } // para barra de linea selecc cuando el control no tiene el foco
:bClrSelFocus := { || { CLR_BLACK, aGradBarSelFocus } } // para barra de linea selecc cuando el control tiene el foco
:lKinetic := .f.
:lContrastClr := .f. //para que no cambie color de texto automaticamente segun intensidad del fondo
:bChange := { || S_Observac(@oS_Obs,@cObserva) }
:aCols[6]:nFootStrAlign:= 1 // AL_LEFT - AL_RIGHT - AL_CENTER - 0 - 1 - 2
* :aCols[6]:oFooterFont := oFont
* oBrw:aCols[6]:nTotal= Trans( aSum[1],"999,999,999.99") // Total cargos
:aCols[7]:nFootStrAlign:= 1 // AL_LEFT - AL_RIGHT - AL_CENTER - 0 - 1 - 2
* :aCols[7]:oFooterFont := oFont
* oBrw:aCols[7]:nTotal= Trans( aSum[2],"999,999,999.99") // Total cargos
:aCols[8]:nFootStrAlign:= 1 // AL_LEFT - AL_RIGHT - AL_CENTER - 0 - 1 - 2
:aCols[8]:oFooterFont := oFont
END
REDEFINE SAY oS_Obs[01] PROMPT "Observación:" ID 151 OF oDlg2 COLOR CLR_BLACK Font oFnt1
REDEFINE SAY oS_Obs[02] PROMPT cObserva ID 152 OF oDlg2 COLOR CLR_BLUE Font oFnt1
ACTIVATE DIALOG oDlg2 CENTERED
ENDIF
(S13)->( OrdScope(0,Nil) )
(S13)->( OrdScope(1,Nil) )
(S13)->( DbSeek(cCtaIni) )
(S13)->( DbGoTop() )
RELEASE oBrw
RETURN NIL
//------------------------------------------------------------------------------
STATIC FUNCTION Refr_MovFact(oBrw)
LOCAL aSum[3]
AFILL(aSum,0)
(S13)->( DbSeek(cCtaIni+cRefere) )
(S13)->( DbGoTop() )
DO WHILE (S13)->ID_CUENTA = cCtaIni .AND. (S13)->ID_REFERE = cRefere .AND. (S13)->( !EOF() )
aSum[1] += (S13)->CARGO
aSum[2] += (S13)->ABONO
aSum[3] := aSum[1] - aSum[2]
(S13)->( DbSkip() )
ENDDO
oBrw:aCols[6]:bFooter := {|| TRANS(aSum[1],"99,999,999,999.99") }
oBrw:aCols[7]:bFooter := {|| TRANS(aSum[2],"99,999,999,999.99") }
oBrw:aCols[8]:bFooter := {|| TRANS(aSum[3],"99,999,999,999.99") }
oBrw:Refresh()
(S13)->( OrdScope(0,cCtaIni+cRefere) )
(S13)->( OrdScope(1,cCtaIni+cRefere) )
(S13)->( DbGoTop() )
RETURN NIL
//------------------------------------------------------------------------------
STATIC FUNCTION S_Observac(oS_Obs,cObserva)
cObserva:= (S13)->REFEREAMP // Referencia ampliada u observacion
oS_Obs[02]:Refresh()
RETURN NIL
** Funcion para espaciar niveles de cuentas Ok salio como yo deseaba...!
//------------------------------------------------------------------------------
STATIC FUNCTION NivCol(nCol)
DO CASE
CASE (S08)->NIVSUM = 1
nCol := ""
CASE (S08)->NIVSUM = 2
nCol = " "
CASE (S08)->NIVSUM = 3
nCol = " "
CASE (S08)->NIVSUM = 4
nCol = " "
ENDCASE
RETURN(nCol)
//------------------------------------------------------------------------------
STATIC FUNCTION Finaliza(oItem)
LOCAL lRet := .F.
IF MsgNoYes("¿ Salir consulta estado de cuenta ?","Confirme")
Close_Dbf(5,S05)
Close_Dbf(8,S08)
Close_Dbf(10,S10)
Close_Dbf(13,S13)
(S13)->(DbCloseArea())
oFont:End()
oItem:Enable() // Cerramos
lRet:= .T.
ENDIF
Release lRet
RETURN (lRet)