Dos Browses en ARRAYS...

Dos Browses en ARRAYS...

Postby ACC69 » Sat Mar 22, 2014 7:50 pm

Hola amigos buenas tardes ,esperando que se encuentren bien les envio cordial saludos.

He estado batallando mucho y navegue por casi todo el foro pero no vi nada parecido a una rutina de dos browses en ARRAY, solo veo uno, de eso no tengo ningun problema, pero...en segundo browse oBrw2, no me muestra nada ....solo la primera columna de datos y tampoco me refresca datos cada que selecciono con la flecha de cada cuenta,y no se que estare haciendo mal, pero hice la prueba con el primer browse obrw1 que al dejar unicamente la variable aDato1 := {}, no me muestra todos los encabezados del Header, solo la cuenta y si le pongo la funcion aDato1 := CargaDatos() , si me los carga todos, entonces como le hare cuando una array es vacio me muestre los encabezados,esa pregunta es para el segundo browse oBr2,para que cuando seleccione equis linea,me muestre los detalles el segundo browses, pero no consigo hacerlo, solo muestra la primera columna pero sin refrescarme los detalles,que me va agregando toda la fila de la columna datos, adjunto imagen y codigo...no quiero tirar la toalla, pero ya batalle mucho por el array que son arreglos que quiero cargar en el browse,en dbfs no tengo problemas ,pero en ARRAYS es donde batallo mucho

Cualquier ayuda o ejemplo les estare agradecido amigos.

Code: Select all  Expand view
#Include "FiveWin.ch"
#Include "xBrowse.ch"

STATIC oDlg
Static S08, S09, S10,S12, S13 // Alias de base de datos
STATIC nTCarg,nTCred
STATIC lSelSeg,NivBal
STATIC SdoMesAnt,SdoIni,Cta1,Cta2,Cta3,Cta4,nReg,nCol,aSum, aTot // Reportes
STATIC aDato1,aDato2,aClrRowBack
STATIC nMA_Ini, nMA_Fin

MemVar oWnd, oMOpc, nNumEmp, cDescrEmp, Mes_Per, Ano_Per, nStation,EjeMAIn

//------------------------------------------------------------------------------
FUNCTION MOD_PBAS()
 LOCAL oItem:=oMOpc,oBrw1,oBrw2,oBrw3

 lSelSeg:= .F.
 NivBal := 4
 aTot   := {{0,0,0,0}}
 nReg   := 0
 aDato1 := {}
 aDato2 := {}
 aDato1 := CargaDatos() // Aqui si lo quito NO ME MUESTRA TODOS LOS HEADERS, aunque le ponga oBrw1:lColDividerComplete := .T.

 DEFINE DIALOG oDlg RESOURCE "CONSBALANZ" TITLE 'Listado de Pólizas y Movimientos'
  // Consulta Balanza cuentas acumulados \\
  REDEFINE XBROWSE oBrw1 ID 101 ;
           HEADERS 'Cuentas','Descripción','Sdo Ant','Cargo','Abono','Sdo Act' ;
           COLSIZES 112,260,85,85,85,85;
           PICTURES "@!","@!","999,999,999.99","999,999,999.99","999,999,999.99","999,999,999.99";
           OF oDlg ARRAY aDato1 FOOTERS AUTOCOLS LINES CELL

  oBrw1:lColDividerComplete := .F.
  oBrw1:bChange             := { || MovEdoCta(oBrw1,@aDato2),oBrw2:Refresh() } [b]// Aqui llamo segundo browse y refresh()[/b]


  // Consulta Estados de cuentas a detalle \\   Aqui solo muestra primera columna pero sin refrescar datos que selecciono con la flecha
  REDEFINE XBROWSE oBrw2 ID 102 ;
           HEADERS 'Tipo','Num','Fecha','Referencia','Concepto','Cargo','Abono','Sdo Act' ;
           COLSIZES 28,30,50,80,180,85,85,85;
           PICTURES "@!","@9999","@D","@!","@!","999,999,999.99","999,999,999.99","999,999,999.99" ;
           OF oDlg ARRAY aDato2 FOOTERS AUTOCOLS LINES CELL

  oBrw2:lColDividerComplete := .T.
 * oBrw2:bChange             := { || MovDetFact(oBrw2),oBrw2:Refresh() } // Despues....para futuro tercer browse ...

 ACTIVATE DIALOG oDlg CENTERED // ON INIT Refresca(oBrw,oBrw2)

 oItem:Enable() // Cerramos
RETURN NIL

//------------------------------------------------------------------------------
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 MovEdoCta(oBrw1,aDato2)
 LOCAL xEmp,S91,Ind1Tmp1,cCta,cCtaIni,PasaCta := .T.

 cCta    := aDato1[oBrw1:nArrayAt, 1 ]

 IF !cCta == Nil
     cCtaIni := SUBS(cCta,1,4)+SUBS(cCta,6,4)+SUBS(cCta,11,4)+SUBS(cCta,16,4)

     xEmp    := nNumEmp
     S91     := "EMP"+TSTR(xEmp)+TRIM("\R_INTS"+nStation)+".DBF"
     Ind1Tmp1:= "R_INTS"+nStation

     (S08)->( DbSeek(cCtaIni) )

     IF (S08)->TIPONAT = 'D'
         USE (S91) ALIAS S91 EXCLUSIVE // NEW SHARED

         S91->(DbSetIndex(Ind1Tmp1))
         S91->(OrdSetFocus(1))

         S91->(DbGoTop())

         S91->( DbSeek(cCtaIni) )

         xEmp    := nNumEmp
         S91     := "EMP"+TSTR(xEmp)+TRIM("\R_INTS"+nStation)+".DBF"
         Ind1Tmp1:= "R_INTS"+nStation

         USE (S91) ALIAS S91 EXCLUSIVE // NEW SHARED

         S91->(DbSetIndex(Ind1Tmp1))
         S91->(OrdSetFocus(1))

         S91->(DbGoTop())

         S91->( DbSeek(cCtaIni) )

         aSum := {{0,0,0,0,0,0,0}}
         aTot := {{0,0,0,0,0,0,0}}

         DO WHILE S91->(!EOF())
             IF S91->SALDOS <> 0 .AND. aSum[1,3] <> 0
                 IF S91->CUENTAS > cCtaIni
                     EXIT
                 ENDIF
             ENDIF

             IF S91->SALDOS <> 0
                 aSum[1,1] := aSum[1,1] + S91->SALCARG // Suma Cargos
                 aSum[1,2] := aSum[1,2] + S91->SALCRED // Suma Abonos
                 aSum[1,3] := aSum[1,3] + S91->SALDOS  // Suma Dif de saldos
                 aSum[1,4] += (S91->SALCARG - S91->SALCRED)

                 aTot[1,1] := aTot[1,1] + S91->SALCARG // Totaliza Cargos
                 aTot[1,2] := aTot[1,2] + S91->SALCRED // Totaliza Abonos
                 aTot[1,3] := aTot[1,3] + S91->SALDOS  // Totaliza Dif Sdos
                 aTot[1,4] += (S91->SALCARG - S91->SALCRED)

                 AADD( aDato2, { S91->TIPO   , ;  [b]// Este es el Arreglo que no muestra nada en segundo browse oBrw2[/b]
                                 S91->NUMPOL , ;
                                 S91->FHAMOV , ;
                                 S91->REFERE , ;
                                 S91->CONCEP , ;
                                 S91->SALCARG, ;
                                 S91->SALCRED, ;
                                 S91->SALDOS , ;
                                 aSum[1,4]       } )

             ENDIF

             S91->(DbSkip())
         ENDDO

         S91->(DbCloseArea())
     ENDIF
 ENDIF
RETURN (aDato2)


Image
https://imageshack.com/i/n753r9j
Image

Saludos de antemano.
Atte: Adrian C. C.
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Re: Dos Browses en ARRAYS...

Postby cnavarro » Sat Mar 22, 2014 9:07 pm

Quizas ademas de:
oBrw1:bChange := { || MovEdoCta(oBrw1,@aDato2), oBrw2:SetArray( aDato2), oBrw2:Refresh() }

Por "mejorar el efecto visual" deberías inicializar el array aDato2 asi:
aDato2 := { { space(2),0.00 , , , , , , , } } // Es un ejemplo
con tipos de datos iguales a los que cargarás con los datos del Dbf
FUNCTION MOD_PBAS()
LOCAL oItem:=oMOpc,oBrw1,oBrw2,oBrw3

lSelSeg:= .F.
NivBal := 4
aTot := {{0,0,0,0}}
nReg := 0
aDato1 := {}
aDato2 := { { space(2),0.00 , , , , , , , } } // Es un ejemplo
aDato1 := CargaDatos() // Aq


Además deberías llevarte esta inicialización a la funcion de "carga" del oBrw2 por si no encuentra el dato y no tiene datos a devolver (es una idea) y de paso servirá para "inicializar" el array y no te pueda confundir con los datos de la búsqueda anterior.

STATIC FUNCTION MovEdoCta(oBrw1,aDato2)
LOCAL xEmp,S91,Ind1Tmp1,cCta,cCtaIni,PasaCta := .T.

aDato2 := { { space(2),0.00 , , , , , , , } } // Es un ejemplo

cCta := aDato1[oBrw1:nArrayAt, 1 ]

IF !cCta == Nil



Prueba y vas contando
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6500
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Dos Browses en ARRAYS...

Postby cnavarro » Sat Mar 22, 2014 9:23 pm

Por cierto, ya que tienes definidas aDato1 y aDato2 como estáticas por y para qué las pasas como parámetro?
Te lo digo sobre todo porque el parámetro lo defines igual que la variable estática
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6500
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Dos Browses en ARRAYS...

Postby ACC69 » Sat Mar 22, 2014 11:35 pm

cnavarro wrote:Quizas ademas de:
oBrw1:bChange := { || MovEdoCta(oBrw1,@aDato2), oBrw2:SetArray( aDato2), oBrw2:Refresh() }

Por "mejorar el efecto visual" deberías inicializar el array aDato2 asi:
aDato2 := { { space(2),0.00 , , , , , , , } } // Es un ejemplo
con tipos de datos iguales a los que cargarás con los datos del Dbf
FUNCTION MOD_PBAS()
LOCAL oItem:=oMOpc,oBrw1,oBrw2,oBrw3

lSelSeg:= .F.
NivBal := 4
aTot := {{0,0,0,0}}
nReg := 0
aDato1 := {}
aDato2 := { { space(2),0.00 , , , , , , , } } // Es un ejemplo
aDato1 := CargaDatos() // Aq


Además deberías llevarte esta inicialización a la funcion de "carga" del oBrw2 por si no encuentra el dato y no tiene datos a devolver (es una idea) y de paso servirá para "inicializar" el array y no te pueda confundir con los datos de la búsqueda anterior.

STATIC FUNCTION MovEdoCta(oBrw1,aDato2)
LOCAL xEmp,S91,Ind1Tmp1,cCta,cCtaIni,PasaCta := .T.

aDato2 := { { space(2),0.00 , , , , , , , } } // Es un ejemplo

cCta := aDato1[oBrw1:nArrayAt, 1 ]

IF !cCta == Nil



Prueba y vas contando



Hola Cristobal gracias por responder y si tienes razon con el paso de los parametros de aDato1 y aDato2 que ya la habia definido como estatica, es que me trae de cabeza esa pequeña rutina del segundo browse que no logro dar con el resultado,y ya investigue en el foro y no encuentro nada parecido de dos browses con ARRAYS de datos e hice el ejemplo que me mencionaste, pero nada, no hace el efecto de mostrarme los demas headers,solo me muestra primer header "Tipo" ya que cada que selecciono con la flecha de cada cuenta, me debe desplegar la informacion como estado de cuenta de cada cuenta de proveedor acumulado y a su vez en el tercer browse las facturas provisionadas y pagadas con o sin parcialidad para la informacion del usuario.

Pero espero poder dar con el resultado o que alguien mas me eche una ayudadita con lo que quiero hacer..!,ya que quiero pasar mis aplicaciones a la clase TXBrowse nativa,ya q actualmente uso TWBrowse de Hernan, pero nunca lo he hecho con esa forma que quiero implementar con TXBrowse.



Saludos Cristobal.
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Re: Dos Browses en ARRAYS...

Postby cnavarro » Sat Mar 22, 2014 11:51 pm

Has probado las modificaciones que te he propuesto?
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6500
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Dos Browses en ARRAYS...

Postby ACC69 » Sun Mar 23, 2014 12:24 am

cnavarro wrote:Has probado las modificaciones que te he propuesto?


Si Cristobal, hice el ejemplo que me indicas y este es el resultado, que la primera linea me deja espacios en blanco.

Image
Image
Image

Saludos
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Re: Dos Browses en ARRAYS...

Postby cnavarro » Sun Mar 23, 2014 12:41 am

Adrian

Al terminar cada XBROWSE te falta la instruccion

oBrw1:CreateFromResource()

y en el otro igual, al finalizar la definicion:

oBrw2:CreateFromResource()
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6500
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Dos Browses en ARRAYS...

Postby ACC69 » Sun Mar 23, 2014 12:53 am

cnavarro wrote:Adrian

Al terminar cada XBROWSE te falta la instruccion

oBrw1:CreateFromResource()

y en el otro igual, al finalizar la definicion:

oBrw2:CreateFromResource()


Image
https://imageshack.com/i/go65vfj
Image

Esta instruccion no la puse Cristobal, porque la tengo definido en recursos con su ID y si le pongo me marca error de ID 105,ahora se me presenta otra duda,como elimino los elementos del arreglo

Code: Select all  Expand view
AADD( aDato2, { S91->TIPO   , ;
                                 S91->NUMPOL , ;
                                 S91->FHAMOV , ;
                                 S91->REFERE , ;
                                 S91->CONCEP , ;
                                 S91->SALCARG, ;
                                 S91->SALCRED, ;
                                 S91->SALDOS , ;
                                 aSum[1,4]       } )

y aun seguire investigando mas y haciendo pruebas, se que si se puede, ya que una vez que resuelva del segundo browse, ya sabre que me sera facil crear el tercer browse, pero necesito que alguien me de una luz ,no quiero tirar la toalla aun... :( :cry: ,ya tengo dias con esto pequeño problema...

Saludos Cristobal
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Re: Dos Browses en ARRAYS...

Postby cnavarro » Sun Mar 23, 2014 1:03 am

Adrian, te pongo el ejemplo que tu has puesto pero realizado con código (no debe haber ninguna diferencia)
Están comentadas algunas lineas y me he fabricado la funcion Cargadatos()
Si la funcion de carga de aDato2 está bien (no tengo los datos para comprobarlo), deberia funcionar perfectamente
Por cierto, te falta en la definicion de oBrw2 la columna que calculas de suma creo (fijate que defines 8 y devuelves 9 columnas)
A ver si sales del tema
Por cierto, yo tenia entendido que el CreateFromResource() habia que ponerlo cuando se utilizaba con recursos y CreateFromCode() cuando se definia desde codigo
Bueno, te adjunto el ejemplo
Code: Select all  Expand view

#Include "FiveWin.ch"
#Include "xBrowse.ch"

STATIC oDlg
Static S08, S09, S10,S12, S13 // Alias de base de datos
STATIC nTCarg,nTCred
STATIC lSelSeg,NivBal
STATIC SdoMesAnt,SdoIni,Cta1,Cta2,Cta3,Cta4,nReg,nCol,aSum, aTot // Reportes
STATIC aDato1,aDato2,aClrRowBack
STATIC nMA_Ini, nMA_Fin

MemVar oWnd, oMOpc, nNumEmp, cDescrEmp, Mes_Per, Ano_Per, nStation,EjeMAIn

//------------------------------------------------------------------------------
FUNCTION MOD_PBAS()
 LOCAL oItem //:=oMOpc
Local oBrw1,oBrw2,oBrw3

 lSelSeg:= .F.
 NivBal := 4
 aTot   := {{0,0,0,0}}
 nReg   := 0
 aDato1 := {}
 aDato2 := {{0,0,Ctod("  /  /  "),space(10),space(10),0.00,0.00,0.00,0.00}}

 //OJO con lo que devuelves en la function Cargadatos
 /*aDato1 :=*/ CargaDatos() // Aqui si lo quito NO ME MUESTRA TODOS LOS HEADERS, aunque le ponga oBrw1:lColDividerComplete := .T.


 DEFINE DIALOG oDlg TITLE 'Listado de Pólizas y Movimientos' SIZE 1100,600 PIXEL
  // Consulta Balanza cuentas acumulados \\
 @ 1,1 XBROWSE oBrw1 ;
           HEADERS 'Cuentas','Descripción','Sdo Ant','Cargo','Abono','Sdo Act' ;
           COLSIZES 112,260,85,85,85,85;
           PICTURES "@!","@!","999,999,999.99","999,999,999.99","999,999,999.99","999,999,999.99";
           OF oDlg ;
           ARRAY aDato1 ;
           SIZE 550, 150 PIXEL ;
           FOOTERS AUTOCOLS LINES CELL

//  oBrw1:lColDividerComplete := .F.
 
  oBrw1:bChange             := { || MovEdoCta(oBrw1),oBrw2:SetArray( aDato2 ) } //,oBrw2:Refresh() }

oBrw1:CreateFromCode()

  // Consulta Estados de cuentas a detalle \\   Aqui solo muestra primera columna pero sin refrescar datos que selecciono con la flecha
  @ 151, 1 XBROWSE oBrw2 ;
           HEADERS 'Tipo','Num','Fecha','Referencia','Concepto','Cargo','Abono','Sdo Act' ;
           COLSIZES 28,30,50,80,180,85,85,85;
           PICTURES "@!","@9999","@D","@!","@!","999,999,999.99","999,999,999.99","999,999,999.99" ;
           OF oDlg ;
           ARRAY aDato2 ;
           SIZE 550, 150 PIXEL ;
           FOOTERS AUTOCOLS LINES CELL

  oBrw2:lColDividerComplete := .T.
 // oBrw2:bChange             := { || MovDetFact(oBrw2),oBrw2:Refresh() } // Despues....para futuro tercer browse ...
oBrw2:CreateFromCode()

 ACTIVATE DIALOG oDlg  //CENTERED // ON INIT Refresca(oBrw,oBrw2)

 //oItem:Enable() // Cerramos
RETURN NIL


Function Cargadatos()
AAdd( aDato1, { 1,"Cuenta 1",10,15,0,25} )
AAdd( aDato1, { 2,"Cuenta 2",10,15,0,25} )
AAdd( aDato1, { 3,"Cuenta 3",10,15,0,25} )
AAdd( aDato1, { 4,"Cuenta 4",10,15,0,25} )
AAdd( aDato1, { 5,"Cuenta 5",10,15,0,25} )
Return nil
//------------------------------------------------------------------------------
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 MovEdoCta( oBrw1 )   //,aDato2)
 LOCAL xEmp,S91,Ind1Tmp1,cCta,cCtaIni,PasaCta := .T.
 aDato2 := {}
 cCta    := aDato1[oBrw1:nArrayAt, 1 ]
/*
 IF !cCta == Nil
     cCtaIni := SUBS(cCta,1,4)+SUBS(cCta,6,4)+SUBS(cCta,11,4)+SUBS(cCta,16,4)

     xEmp    := nNumEmp
     S91     := "EMP"+TSTR(xEmp)+TRIM("\R_INTS"+nStation)+".DBF"
     Ind1Tmp1:= "R_INTS"+nStation

     (S08)->( DbSeek(cCtaIni) )

     IF (S08)->TIPONAT = 'D'
         USE (S91) ALIAS S91 EXCLUSIVE // NEW SHARED

         S91->(DbSetIndex(Ind1Tmp1))
         S91->(OrdSetFocus(1))

         S91->(DbGoTop())

         S91->( DbSeek(cCtaIni) )

         xEmp    := nNumEmp
         S91     := "EMP"+TSTR(xEmp)+TRIM("\R_INTS"+nStation)+".DBF"
         Ind1Tmp1:= "R_INTS"+nStation

         USE (S91) ALIAS S91 EXCLUSIVE // NEW SHARED

         S91->(DbSetIndex(Ind1Tmp1))
         S91->(OrdSetFocus(1))

         S91->(DbGoTop())

         S91->( DbSeek(cCtaIni) )

         aSum := {{0,0,0,0,0,0,0}}
         aTot := {{0,0,0,0,0,0,0}}

         DO WHILE S91->(!EOF())
             IF S91->SALDOS <> 0 .AND. aSum[1,3] <> 0
                 IF S91->CUENTAS > cCtaIni
                     EXIT
                 ENDIF
             ENDIF

             IF S91->SALDOS <> 0
                 aSum[1,1] := aSum[1,1] + S91->SALCARG // Suma Cargos
                 aSum[1,2] := aSum[1,2] + S91->SALCRED // Suma Abonos
                 aSum[1,3] := aSum[1,3] + S91->SALDOS  // Suma Dif de saldos
                 aSum[1,4] += (S91->SALCARG - S91->SALCRED)

                 aTot[1,1] := aTot[1,1] + S91->SALCARG // Totaliza Cargos
                 aTot[1,2] := aTot[1,2] + S91->SALCRED // Totaliza Abonos
                 aTot[1,3] := aTot[1,3] + S91->SALDOS  // Totaliza Dif Sdos
                 aTot[1,4] += (S91->SALCARG - S91->SALCRED)

                 AADD( aDato2, { S91->TIPO   , ;  // Este es el Arreglo que no muestra nada en segundo browse oBrw2
                                 S91->NUMPOL , ;
                                 S91->FHAMOV , ;
                                 S91->REFERE , ;
                                 S91->CONCEP , ;
                                 S91->SALCARG, ;
                                 S91->SALCRED, ;
                                 S91->SALDOS , ;
                                 aSum[1,4]       } )

             ENDIF

             S91->(DbSkip())
         ENDDO

         S91->(DbCloseArea())
     ENDIF
 ENDIF
*/

 if empty( aDato2 )
 aDato2 := {{cCta,0,Ctod("  /  /  "),space(10),space(10),0.00,0.00,0.00,0.00}}   // Prueba mia
// aDato2 := {{ 0,0,Ctod("  /  /  "),space(10),space(10),0.00,0.00,0.00,0.00}}   // Esta seria la tuya
 endif
RETURN (aDato2)

 


https://www.dropbox.com/s/x2flw365mmvttlz/Title58.png
Last edited by cnavarro on Sun Mar 23, 2014 1:12 am, edited 2 times in total.
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6500
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Dos Browses en ARRAYS...

Postby cnavarro » Sun Mar 23, 2014 1:04 am

Si lo pruebas verás que funciona y actualiza perfectamente el oBrw2
Incluso sobra el Refresh del bChange, basta con el SetArray
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6500
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Dos Browses en ARRAYS...

Postby cnavarro » Sun Mar 23, 2014 1:14 am

ACC69 wrote:
cnavarro wrote:Has probado las modificaciones que te he propuesto?


Si Cristobal, hice el ejemplo que me indicas y este es el resultado, que la primera linea me deja espacios en blanco.

Saludos


Has de inicializar el array aDato2 en la function de carga
Fijate en mi ejemplo
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6500
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Dos Browses en ARRAYS...

Postby cnavarro » Sun Mar 23, 2014 1:18 am

ACC69 wrote:
cnavarro wrote:Adrian

Al terminar cada XBROWSE te falta la instruccion

oBrw1:CreateFromResource()

y en el otro igual, al finalizar la definicion:

oBrw2:CreateFromResource()


Image
https://imageshack.com/i/go65vfj
Image

Esta instruccion no la puse Cristobal, porque la tengo definido en recursos con su ID y si le pongo me marca error de ID 105,ahora se me presenta otra duda,como elimino los elementos del arreglo

Code: Select all  Expand view
AADD( aDato2, { S91->TIPO   , ;
                                 S91->NUMPOL , ;
                                 S91->FHAMOV , ;
                                 S91->REFERE , ;
                                 S91->CONCEP , ;
                                 S91->SALCARG, ;
                                 S91->SALCRED, ;
                                 S91->SALDOS , ;
                                 aSum[1,4]       } )

y aun seguire investigando mas y haciendo pruebas, se que si se puede, ya que una vez que resuelva del segundo browse, ya sabre que me sera facil crear el tercer browse, pero necesito que alguien me de una luz ,no quiero tirar la toalla aun... :( :cry: ,ya tengo dias con esto pequeño problema...

Saludos Cristobal


Disculpa Adrian
El CreateFromResource funciona poniendo el id dentro de la llamada a la function CreateFromResource( nID ), pero en la definicion entonces no se usa el Redefine
El XBrowse se define igual que si lo definieras por codigo y al final se pondria oBrw1:CreateFromResource( 105 )

Fijate en este enlace
viewtopic.php?f=3&t=28117&p=157120&hilit=CreateFromResource#p157120
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6500
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Dos Browses en ARRAYS...

Postby ACC69 » Sun Mar 23, 2014 1:37 am

cnavarro wrote:
ACC69 wrote:
cnavarro wrote:Adrian

Al terminar cada XBROWSE te falta la instruccion

oBrw1:CreateFromResource()

y en el otro igual, al finalizar la definicion:

oBrw2:CreateFromResource()


Image
https://imageshack.com/i/go65vfj
Image

Esta instruccion no la puse Cristobal, porque la tengo definido en recursos con su ID y si le pongo me marca error de ID 105,ahora se me presenta otra duda,como elimino los elementos del arreglo

Code: Select all  Expand view
AADD( aDato2, { S91->TIPO   , ;
                                 S91->NUMPOL , ;
                                 S91->FHAMOV , ;
                                 S91->REFERE , ;
                                 S91->CONCEP , ;
                                 S91->SALCARG, ;
                                 S91->SALCRED, ;
                                 S91->SALDOS , ;
                                 aSum[1,4]       } )

y aun seguire investigando mas y haciendo pruebas, se que si se puede, ya que una vez que resuelva del segundo browse, ya sabre que me sera facil crear el tercer browse, pero necesito que alguien me de una luz ,no quiero tirar la toalla aun... :( :cry: ,ya tengo dias con esto pequeño problema...

Saludos Cristobal


Disculpa Adrian
El CreateFromResource funciona poniendo el id dentro de la llamada a la function CreateFromResource( nID ), pero en la definicion entonces no se usa el Redefine
El XBrowse se define igual que si lo definieras por codigo y al final se pondria oBrw1:CreateFromResource( 105 )

Fijate en este enlace
viewtopic.php?f=3&t=28117&p=157120&hilit=CreateFromResource#p157120



Si funciona con tu ejemplo de array vacio cristobal en blanco, pero no es editable, peroooo...el chiste es rellenar el segundo browse de cada cuenta seleccionada con bChange y la instruccion de DbSeek() buscando en la segunda base de datos, son dos bases de datos uno como encabezado que es el primer browse que me carga sin problemas desde inicio con las cuentas acumuladas , y segundo son bases de movimientos a detalles, que el chiste es mostrar al usuario las facturas pendientes a pagar como un estado de cuenta. por ejemplo:

1020-0001-0001-0005 Administracion y Asesoria 5,000.00 es el primer browse

Aqui en segundo browse que me rellene los datos con la clave seleccionada con flecha la cuenta 1020-0001-0001-0005 y me rellene los datos aDato2 esto asi:

1020-0001-0001 Fact 1 1,500.00
1020-0001-0001 Fact 2 1,500.00
1020-0001-0001 Fact 3 2,000.00
-------------
5,000.00 Total en Footer que eso no habra problema

Ese segundo browse funciona para el usuario como estado de cuenta de las facturas pendientes a pagar ya que las otras de la misma cuenta ya estan pagadas, esas no las mostrara!

Code: Select all  Expand view
        S91->( DbSeek(cCtaIni) ) // Aqui el DbSeek() a buscar la clave condicionada 1020-1-1-5

         S91->(DbGoTop())

         aSum := {{0,0,0,0,0,0,0}}
         aTot := {{0,0,0,0,0,0,0}}

         DO WHILE S91->(!EOF())
             IF S91->SALDOS <> 0 .AND. aSum[1,3] <> 0
                 IF S91->CUENTAS > cCtaIni

                     EXIT
                 ENDIF
             ENDIF

             IF S91->SALDOS <> 0
                 aSum[1,1] := aSum[1,1] + S91->SALCARG // Suma Cargos
                 aSum[1,2] := aSum[1,2] + S91->SALCRED // Suma Abonos
                 aSum[1,3] := aSum[1,3] + S91->SALDOS  // Suma Dif de saldos
                 aSum[1,4] += (S91->SALCARG - S91->SALCRED)

                 aTot[1,1] := aTot[1,1] + S91->SALCARG // Totaliza Cargos
                 aTot[1,2] := aTot[1,2] + S91->SALCRED // Totaliza Abonos
                 aTot[1,3] := aTot[1,3] + S91->SALDOS  // Totaliza Dif Sdos
                 aTot[1,4] += (S91->SALCARG - S91->SALCRED)

                 AADD( aDato2, { S91->TIPO   , ;
                                 S91->NUMPOL , ;
                                 S91->FHAMOV , ;
                                 S91->REFERE , ;
                                 S91->CONCEP , ;
                                 S91->SALCARG, ;
                                 S91->SALCRED, ;
                                 S91->SALDOS     } )  // Aqui el elemento que me rellene a detalle de la cuenta seleccionada

             S91->(DbSkip())
         ENDDO

         S91->(DbCloseArea())
     ENDIF
 ENDIF
RETURN (aDato2)
 


Es por eso que no he encontrado en el foro algo parecido de dos browse con ARRAYS, con dbfs no hay problema, porque pero es sencillo,que solo carga encabezado y todos los detalles,este es porque le condiciono que me cargue unicamente las facturas pendientes de pago con el saldo acumulado.

Saludos.!
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Re: Dos Browses en ARRAYS...

Postby FranciscoA » Sun Mar 23, 2014 4:09 am

Hola, aqui tienes un ejemplo, probado en mi sistema Financiero. Puedes adaptarlo a tus necesidades.
Code: Select all  Expand view
//-------------------------------------
Function ClteCredito(cCodigo,cCredNum,cCliente,cMoneda)
local oDlg, oBigFont, oBrw1, oBrw2
local cOldSele:=Select(), cOrdAntCred:= Creditos->(OrdSetFocus())
local aDatos1:={{"","","",""}}, aDatos2:={{"","",""}}

local aGradBarSelFocus:= { { 1, RGB(252,232,171)   , RGB(248,195, 34) } }
local aGradBarSel:= {{1, RGB(252,235, 184), RGB(251,222,88)}}

DEFINE FONT oBigFont NAME "TAHOMA" SIZE 0,-22 ITALIC BOLD

DEFINE DIALOG oDlg RESOURCE "CLTEPTMO" TRANSPARENT

REDEFINE SAY ID 4001 OF oDlg FONT oBigFont
REDEFINE SAY ID 4002 OF oDlg
REDEFINE BITMAP RESOURCE "LUPA" ID 500 OF oDlg

   XbrNumFormat( 'A', .t. )

//PRIMER BROWSE
REDEFINE XBROWSE oBrw1 ID 118 OF oDlg ;  //         COLUMNS "Codigo", "Nombre", "Apellido","CedulaIde" ;
         HEADERS "Codigo", "Nombre", "Apellido","CedulaIde" ;
         SIZES 60,170,170,170 ;
         ARRAY aDatos1 FOOTERS LINES CELL AUTOCOLS

   WITH OBJECT oBrw1
      :nMarqueeStyle    := MARQSTYLE_HIGHLROW  //_HIGHLROWMS
      :nColDividerStyle:=LINESTYLE_LIGHTGRAY
      :nRowDividerStyle:=LINESTYLE_LIGHTGRAY
      :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 := {|| Cargadatos2(oBrw1,@aDatos2,oBrw2) }
   END


//SEGUNDO BROWSE
REDEFINE XBROWSE oBrw2 ID 119 OF oDlg ; //         COLUMNS "Ptmo","Moneda","MontoPtmo" ;  
         HEADERS "Prestamo","Moneda","Principal" ;
         SIZES 54,80,100;
         ARRAY aDatos2 FOOTERS LINES CELL AUTOCOLS

   WITH OBJECT oBrw2
      :nMarqueeStyle    :=  MARQSTYLE_HIGHLROW  //_HIGHLROWMS
      :nColDividerStyle:=LINESTYLE_LIGHTGRAY
      :nRowDividerStyle:=LINESTYLE_LIGHTGRAY
      :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
   END

   CargaDatos1(@aDatos1,oBrw1)
   Cargadatos2(oBrw1,@aDatos2,oBrw2)

   ACTIVATE DIALOG oDlg CENTERED

   dbSelectArea(cOldSele)
   CREDITOS->(ORDSETFOCUS(cOrdAntCred))

   oBigfont:End()
return nil
//---------------------------------
Function CargaDatos1(aDatos1,oBrw1)

aDatos1:={}

DbSelectArea("CLIENTES")
dbgoTop()
if !Bof()
   While !eof()
      aadd(aDatos1, {Field->Codigo,field->nombre,field->apellido,field->cedulaIde} )
      dbskip()
   Enddo
else
   aDatos1:={{"","","",""}}
endif

  oBrw1:SetArray(aDatos1)
RETURN nil

//---------------------------------
Function Cargadatos2(oBrw1,aDatos2,oBrw2)
local cCodCte := oBrw1:aArrayData[oBrw1:nArrayAt,1]

aDatos2 := {}

DbSelectArea("CREDITOS")
ORDSETFOCUS("CODCLTE")

if dbSeek(cCodCte,.t.)
   While Field->CodClte = cCodCte
      aadd(aDatos2, {Field->Ptmo,field->Moneda,field->MontoPtmo} )
      dbskip()
   Enddo
else
   aDatos2:={{"","",""}}
endif

  oBrw2:SetArray(aDatos2)
RETURN nil
 

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

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

Re: Dos Browses en ARRAYS...

Postby ACC69 » Sun Mar 23, 2014 10:49 pm

FranciscoA wrote:Hola, aqui tienes un ejemplo, probado en mi sistema Financiero. Puedes adaptarlo a tus necesidades.
Code: Select all  Expand view
//-------------------------------------
Function ClteCredito(cCodigo,cCredNum,cCliente,cMoneda)
local oDlg, oBigFont, oBrw1, oBrw2
local cOldSele:=Select(), cOrdAntCred:= Creditos->(OrdSetFocus())
local aDatos1:={{"","","",""}}, aDatos2:={{"","",""}}

local aGradBarSelFocus:= { { 1, RGB(252,232,171)   , RGB(248,195, 34) } }
local aGradBarSel:= {{1, RGB(252,235, 184), RGB(251,222,88)}}

DEFINE FONT oBigFont NAME "TAHOMA" SIZE 0,-22 ITALIC BOLD

DEFINE DIALOG oDlg RESOURCE "CLTEPTMO" TRANSPARENT

REDEFINE SAY ID 4001 OF oDlg FONT oBigFont
REDEFINE SAY ID 4002 OF oDlg
REDEFINE BITMAP RESOURCE "LUPA" ID 500 OF oDlg

   XbrNumFormat( 'A', .t. )

//PRIMER BROWSE
REDEFINE XBROWSE oBrw1 ID 118 OF oDlg ;  //         COLUMNS "Codigo", "Nombre", "Apellido","CedulaIde" ;
         HEADERS "Codigo", "Nombre", "Apellido","CedulaIde" ;
         SIZES 60,170,170,170 ;
         ARRAY aDatos1 FOOTERS LINES CELL AUTOCOLS

   WITH OBJECT oBrw1
      :nMarqueeStyle    := MARQSTYLE_HIGHLROW  //_HIGHLROWMS
      :nColDividerStyle:=LINESTYLE_LIGHTGRAY
      :nRowDividerStyle:=LINESTYLE_LIGHTGRAY
      :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 := {|| Cargadatos2(oBrw1,@aDatos2,oBrw2) }
   END


//SEGUNDO BROWSE
REDEFINE XBROWSE oBrw2 ID 119 OF oDlg ; //         COLUMNS "Ptmo","Moneda","MontoPtmo" ;  
         HEADERS "Prestamo","Moneda","Principal" ;
         SIZES 54,80,100;
         ARRAY aDatos2 FOOTERS LINES CELL AUTOCOLS

   WITH OBJECT oBrw2
      :nMarqueeStyle    :=  MARQSTYLE_HIGHLROW  //_HIGHLROWMS
      :nColDividerStyle:=LINESTYLE_LIGHTGRAY
      :nRowDividerStyle:=LINESTYLE_LIGHTGRAY
      :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
   END

   CargaDatos1(@aDatos1,oBrw1)
   Cargadatos2(oBrw1,@aDatos2,oBrw2)

   ACTIVATE DIALOG oDlg CENTERED

   dbSelectArea(cOldSele)
   CREDITOS->(ORDSETFOCUS(cOrdAntCred))

   oBigfont:End()
return nil
//---------------------------------
Function CargaDatos1(aDatos1,oBrw1)

aDatos1:={}

DbSelectArea("CLIENTES")
dbgoTop()
if !Bof()
   While !eof()
      aadd(aDatos1, {Field->Codigo,field->nombre,field->apellido,field->cedulaIde} )
      dbskip()
   Enddo
else
   aDatos1:={{"","","",""}}
endif

  oBrw1:SetArray(aDatos1)
RETURN nil

//---------------------------------
Function Cargadatos2(oBrw1,aDatos2,oBrw2)
local cCodCte := oBrw1:aArrayData[oBrw1:nArrayAt,1]

aDatos2 := {}

DbSelectArea("CREDITOS")
ORDSETFOCUS("CODCLTE")

if dbSeek(cCodCte,.t.)
   While Field->CodClte = cCodCte
      aadd(aDatos2, {Field->Ptmo,field->Moneda,field->MontoPtmo} )
      dbskip()
   Enddo
else
   aDatos2:={{"","",""}}
endif

  oBrw2:SetArray(aDatos2)
RETURN nil
 

Saludos.


Hola buenas tardes gracias Francisco por contestar, y por postear tu ejemplo que adaptare a mi sistema, por lo que veo, es muy diferente tu codigo a lo que yo tome del ejemplo \samples\testmerg.prg, y se supone que deberia dar mismo resultado, pero con solo ver tu codigo es muy diferente con la instruccion "WITH OBJECT oBrw2" y dentro del dialogo las funciones que Cargadato1 y CargaDato2,cuando del ejemplo que yo tome, es desde al inicio antes del dialogo, y entonces cual es la diferencia entre uno y otro....necesitare estudiar mas la clase de TXBrowse...pero en fin,espero que me de resultado que adaptare a mi sistema.

Gracias y luego le comento .

Saludos Francisco.

Atte: Adriano C. C.
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 30 guests