Identificar un browse de Multiples Browse (Resuelto)

Identificar un browse de Multiples Browse (Resuelto)

Postby cmsoft » Tue Aug 17, 2021 4:12 pm

Estimados:
Genero varios xbrowse en un panel, y los voy creando con una iteración.
Luego quiero que al hacer doble click en uno de las columnas de cualquiera de esos browses, me llame a una funcion.
El problema es que no puedo hacer referencia a que Query y a que Browse hago referencia, porque el indice que voy creando toma el ultimo valor.
Como debería hacerlo?
Code: Select all  Expand view

function PlaceControls( oPanel,oQryOpc,oPadre )
   LOCAL nRow  := 5,i,oBrwDet:=ARRAY(oQryOpc:RecCount()),oQryDet:=ARRAY(oQryOpc:RecCount()),oFont1
   DEFINE FONT oFont1 NAME "TAHOMA" SIZE 0,-10

   oQryOpc:GoTop()
   i:=1
   DO WHILE !oQryOpc:eof()
        oQryDet[i]:= oApp:oServer:Query("SELECT * FROM opcionales_det_tempD WHERE idgrupo = "+ClipValue2Sql(oQryOpc:id))
        @ nRow,  10 SAY oQryOpc:nombre SIZE 120,24 PIXEL OF oPanel TRANSPARENT
        @ nRow+5, 255 SAY IF(oQryOpc:obligatorio,"Obligatorio","Opcional") SIZE 70,24 PIXEL OF oPanel RIGHT TRANSPARENT FONT oFont1
        @ nRow+5, 330 SAY "Minimo: "+ALLTRIM(STR(oQryOpc:minimo)) SIZE 60,24 PIXEL OF oPanel RIGHT TRANSPARENT FONT oFont1
        @ nRow+5, 390 SAY "Maximo: "+ALLTRIM(STR(oQryOpc:maximo)) SIZE 60,24 PIXEL OF oPanel RIGHT TRANSPARENT FONT oFont1
        @ nRow+20,10 XBROWSE oBrwDet[i] DATASOURCE oQryDet[i];
                 COLUMNS "nombre","precio",IF(oQryOpc:por_cantidad,"cantidad","tilde"),"agotado","minimo","maximo";    
                 HEADERS "Nombre","Precio",IF(oQryOpc:por_cantidad,"Cantidad","Incluir"),"Agotado","Minimo","Maximo";
                 SIZES 285,50,70,80,80,80;
         OF oPanel SIZE 450,190 PIXEL
        IF !oQryOpc:por_cantidad
            oBrwDet[i]:aCols[3]:SetCheck(nil,.f.)  
            oBrwDet[i]:aCols[3]:bLDClickData := {|| CambiaChek(oQryDet[I],oBrwDet[I])} //Esto no funciona
            oBrwDet[i]:aCols[3]:bKeyDown := {|nKey, nFlags| IF(nKey==13,nil,CambiaChek(oQryDet[i],oBrwDet[i]))} // Esto no funciona
            oBrwDet[i]:aCols[3]:nEditType := 1
            oBrwDet[i]:aCols[3]:bEditValue:= {|| IF(oQryDet[i]:tilde,.t.,.f.) }
        ENDIF
        PintaBrw(oBrwDet[i],0)
        oBrwDet[i]:CreateFromcode()
               
        nRow  += 220
        i ++
      oQryOpc:Skip()
   ENDDO
   oPanel:SetRange()
   @ nRow,380 BUTTON "ACEPTAR"  SIZE 80,40 PIXEL OF oPanel ACTION oPadre:End()
   @ nRow, 05 BUTTON "CANCELAR" SIZE 80,40 PIXEL OF oPanel ACTION oPadre:End()
return nil
 

Agradezco de ante mano cualquier ayuda
Last edited by cmsoft on Thu Aug 26, 2021 1:24 pm, edited 1 time in total.
User avatar
cmsoft
 
Posts: 1202
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: Identificar un browse de Multiples Browse

Postby Enrico Maria Giordano » Wed Aug 18, 2021 10:12 am

If I understood your sample correctly, you have to use "detached local" technique. Look around for a sample.

EMG
User avatar
Enrico Maria Giordano
 
Posts: 8356
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia

Re: Identificar un browse de Multiples Browse

Postby cmsoft » Wed Aug 18, 2021 2:16 pm

Perfecto Enrico, muchas gracias.
Así quedo el codigo por si a alguien le llega a interesar
Code: Select all  Expand view

function PlaceControls( oPanel,oQryOpc,oPadre )

   local nRow  := 5,i,oBrwDet:=ARRAY(oQryOpc:RecCount()),oQryDet:=ARRAY(oQryOpc:RecCount()),oFont1,oFontTit,oQryVer
   DEFINE FONT oFont1 NAME "TAHOMA" SIZE 0,-10

   oQryOpc:GoTop()
   i:=1
   DO WHILE !oQryOpc:eof()
        oQryDet[i]:= oApp:oServer:Query("SELECT * FROM opcionales_det_tempD WHERE idgrupo = "+ClipValue2Sql(oQryOpc:id))
        CrearBrw(oQryDet[i],oBrwDet[i],oQryOpc,nRow,oPanel,oFont1)
        nRow  += 220
        i ++
      oQryOpc:Skip()
   ENDDO
   oPanel:SetRange()
   @ nRow,380 BUTTON "ACEPTAR"  SIZE 80,40 PIXEL OF oPanel ACTION oPadre:End()
   @ nRow, 05 BUTTON "CANCELAR" SIZE 80,40 PIXEL OF oPanel ACTION oPadre:End()

   

 @ nRow,200 BUTTON "VER"  SIZE 80,40 PIXEL OF oPanel ACTION (oQryVer:= oApp:oServer:Query("SELECT * FROM opcionales_det_tempD"),xbrowse(oQryVer))

return nil

************************************
**** FUNCION PARA DEFINIR CADA BROWSE DE OPCIONALES
STATIC FUNCTION CrearBrw(oQryDet,oBrwDet,oQryOpc,nRow,oPanel,oFont1)
LOCAL oBotMas,oBotMen
        @ nRow,  10 SAY oQryOpc:nombre SIZE 120,24 PIXEL OF oPanel TRANSPARENT
        @ nRow+5, 255 SAY IF(oQryOpc:obligatorio,"Obligatorio","Opcional") SIZE 70,24 PIXEL OF oPanel RIGHT TRANSPARENT FONT oFont1
        @ nRow+5, 330 SAY "Minimo: "+ALLTRIM(STR(oQryOpc:minimo)) SIZE 60,24 PIXEL OF oPanel RIGHT TRANSPARENT FONT oFont1
        @ nRow+5, 390 SAY "Maximo: "+ALLTRIM(STR(oQryOpc:maximo)) SIZE 60,24 PIXEL OF oPanel RIGHT TRANSPARENT FONT oFont1
        @ nRow+20,10 XBROWSE oBrwDet DATASOURCE oQryDet;
                 COLUMNS "nombre","precio",IF(oQryOpc:por_cantidad,"cantidad","tilde"),"agotado","minimo","maximo";    
                 HEADERS "Nombre","Precio",IF(oQryOpc:por_cantidad,"Cantidad","Incluir"),"Agotado","Minimo","Maximo";
                 FOOTERS ;
                 SIZES 285,50,70,80,80,80;
         OF oPanel SIZE 450,190 PIXEL
        IF !oQryOpc:por_cantidad
            oBrwDet:aCols[3]:SetCheck(nil,.f.)  
            oBrwDet:aCols[3]:bLDClickData := {|| CambiaChek(oQryDet,oBrwDet)}
            oBrwDet:aCols[3]:bKeyDown := {|nKey, nFlags| IF(nKey==13,nil,CambiaChek(oQryDet,oBrwDet))}
            oBrwDet:aCols[3]:nEditType := 1
            oBrwDet:aCols[3]:bEditValue:= {|| IF(oQryDet:tilde,.t.,.f.) }
        ENDIF
        PintaBrw(oBrwDet,0)
        oBrwDet:CreateFromcode()
RETURN nil
 
User avatar
cmsoft
 
Posts: 1202
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: Identificar un browse de Multiples Browse

Postby nageswaragunupudi » Mon Aug 23, 2021 10:56 pm

Yes. This is the best and the recommended way as Mr. Enrico suggested.

At the same time it may help to know that the above codeblocks can be written like this also.

Code: Select all  Expand view

oBrwDet[i]:aCols[3]:bLDClickData := {|| CambiaChek(oQryDet[I],oBrwDet[I])} //Esto no funciona
 

revise as:
Code: Select all  Expand view

oBrwDet[i]:aCols[3]:bLDClickData := {|r,c,f,oCol| CambiaChek(oCol:oBrw:uDataSource,oCol:oBrw)}
 


Code: Select all  Expand view

oBrwDet[i]:aCols[3]:bEditValue:= {|| IF(oQryDet[i]:tilde,.t.,.f.) }
 

revise as
Code: Select all  Expand view

oBrwDet[i]:aCols[3]:bEditValue:= {|x,oCol| IF(oCol:oBrw:uDataSource:tilde,.t.,.f.) }
 


Code: Select all  Expand view

oBrwDet[i]:aCols[3]:bKeyDown := {|nKey, nFlags| IF(nKey==13,nil,CambiaChek(oQryDet[i],oBrwDet[i]))} // Esto no funciona
 

revise as
Code: Select all  Expand view

oBrwDet[i]:aCols[3]:bKeyDown := {|nKey, nFlags,oBrw,oCol| IF(nKey==13,nil,CambiaChek(oBrw:uDataSource,oBrw))}
 


This way we are not using the index variable.
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
 
Posts: 10295
Joined: Sun Nov 19, 2006 5:22 am
Location: India

Re: Identificar un browse de Multiples Browse

Postby cmsoft » Thu Aug 26, 2021 1:24 pm

Excelente Mr Rao!!!
Muchas gracias!
User avatar
cmsoft
 
Posts: 1202
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 26 guests