Page 1 of 1

un Campo en un Listbox pero FIELDS

Posted: Thu Dec 08, 2005 8:01 pm
by felipe
Hola amigos del foro quiero poder poner en FIELD un campo q' cambie por ejemplo:

en una bodega si tengo el FIELD q' detecte o si hay 2 o 3 o nn bodegas
desde ya gracias

Posted: Fri Dec 09, 2005 12:45 am
by Antonio Linares
Felipe,

Usa FIELD->bodegas

te refieres a eso ?

La Idea del Listbox es esta

Posted: Fri Dec 09, 2005 2:07 am
by felipe
Bueno la idea que quiero es la siguiente:

Tengo una Tabla : Bodegas (3Bodegas)
Tabla : Stock
Tabla : Articulos

en el Listbox deberia quedar asi

REDEFINE LISTBOX oLbx FELDS;
(cArticulos)->Detalle,CargaStock((cArticulo)->Codigo,Bodega1),;
CargaStock((cArticulo)->Codigo,Bodega2),;
CargaStock((cArticulo)->Codigo,Bodega3);

Esto si hay 3 no Hay problema pero si hay 20 tendria que poner 20 veces pero la idea no esa, la idea es carga todo en uana variable y que pueda servir para una como para n bodegas

dbGoTop()
DO WHILE !Eof()
//Los N ombres de Bodega
cTitulo :=cTitulo + '"'+Alltrim((cBodega)->Ma_Corta)+'",'

bodega :=(cBodega)->Ma_Codi //capturo el codigo

cCampo :=cCampo + "CargaStock((cArticulo)->Codigo,bodega,"
bodega)," // La Funcion

cSize :=cSize + "50," //aqui le asigno el Size
DBSKIP()
EndDo

oLbx:aheaders := &cTitulo
oLbx:acolsizes := &cSize
Los aheaders y acolsizes funcionan bien pero Field no

REDEFINE LISTBOX oLbx fIELDS cCampo

PERO DE ESTA FORMA me funciona Bien:
cCampo :={ || { (cArticulo)->Detalle,CargaStock((cArticulo)->Codigo,"1 ") } }

REDEFINE LISTBOX oLbx fIELDS ""
oLbx:bLine := (cCampo)
PERO SI TENGO 2 0 3 O NNN BODEGAS
bueno espero que entienda
Saludos

Posted: Fri Dec 09, 2005 11:42 am
by cmsoft
Y si cambias esta funcion
cCampo :={ || { (cArticulo)->Detalle,CargaStock((cArticulo)->Codigo) } }

REDEFINE LISTBOX oLbx fIELDS ""
oLbx:bLine := (cCampo)

y en la funcion CargaStock(nCodArt) le haces que recorra toda la base en busca de las N bodegas y te devuelva una cadena con el texto de todas las existencias en la bodegas??
Espero te sirva...

PERO QUE MUESTRE EL STOCK POR BODEGA

Posted: Fri Dec 09, 2005 6:02 pm
by felipe
Bueno lo quero es que me muestre el Stock por bodega como este ejemplo:


Detalle Bodega 1 Bodega 2 Bodega 3 Bodega 4 nnnnnn Bodegas

Posted: Sun Dec 11, 2005 5:02 am
by DanielPuente
Felipe:

Usa vectores para la definicion del browse:

Local VEC_FIELD1 := { {|| ART->COD} ,;
{ || ART->CLAVE } ,;
VEC_ENC1 := { OEMTOANSI("C¢d."),;
" Clave",;
VEC_SIZE1 := {70,109,226,77,77,64,109,73,40,110,52,52,52,90,90},;
VEC_JUSTIF := {2,2,0,2,2,2,0,0,0,0,0,2,2,0,0},;

Solo que en tu caso haces las evaluaciones necesarias y vas añadiendo posiciones a los vectores segun las bodegas que necesites, y despues en la definicion del browse usas esos vectores:

REDEFINE LISTBOX oBrw fields ID 999 OF oDlg ;

oBrw:SetCols( vec_field1, vec_enc1, vec_size1 )
oBrw:aJustify :=vec_justif

Saludos,

Posted: Tue Dec 13, 2005 12:26 pm
by MarioG
Me uno al hilo para exponer mi caso. El que Daniel hace un tiempo me orientó y, en su propuesta me sugería la siguiente alternativa (tambien intento generar un browse de campos dinámicos):

Code: Select all

   DO CASE
   CASE oPJA:nLenAlter == 2
      aO[_LstAlt]:bLine:= {|nAt| nAt:= aO[_LstAlt]:nAt, ;
                                 { oPJA:aAlternativas[nAt,1], ;
                                   Trans( oPJA:aAlternativas[nAt,2], PIC_SEIS ), ;
                                   Trans( oPJA:aAlternativas[nAt,3], PIC_SEIS )  ;
                                   } }

   CASE oPJA:nLenAlter == 3
      aO[_LstAlt]:bLine:= {|nAt| nAt:= aO[_LstAlt]:nAt, ;
                                 { oPJA:aAlternativas[nAt,1], ;
                                   Trans( oPJA:aAlternativas[nAt,2], PIC_SEIS ), ;
                                   Trans( oPJA:aAlternativas[nAt,3], PIC_SEIS ), ;
                                   Trans( oPJA:aAlternativas[nAt,2], PIC_SEIS )  ;
                                   } }
Esto funciona correctamente, aunque, leyendo la propuesa de cmsfot, me percato que me ahorraría mucho código a la par de que puedo elever el límite superior de campos. Por lo que lo implementé así:

Code: Select all

   for each arr in oPJA:aAlternativas
       if HB_EnumIndex()==1
          cBLine:= "{|nAt| nAt:= aO[_LstAlt]:nAt, { oPJA:aAlternativas[nAt,1], "
       else
          cBLine+= "Trans( oPJA:aAlternativas[nAt,2], PIC_SEIS ), "
       end
   next
?   cBLine:= Left( cBLine, Len( cBLine ) -2) +" } }"

   aO[_LstAlt]:bLine:= ( cBLine )
   aO[_LstAlt]:SetArray( oPJA:aAlternativas )
Ahora bien, al ejecutar la app me arroja el siguiente error:

Application
===========
Path and name: D:\FUEN32\PRU32\MGPJA.EXE (32 bits)
Size: 1,362,944 bytes
Time from start: 0 hours 2 mins 37 secs
Error occurred at: 13/12/2005, 09:05:40
Error description: Error BASE/1005 Class: 'CHARACTER' has no property: _EVAL
Args:

Stack Calls
===========
Called from __EVAL(0)
Called from WBRWPANE(0)
Called from TWBROWSE:PAINT(1103)
Called from TWBROWSE:DISPLAY(2892)
Called from TWBROWSE:HANDLEEVENT(0)
Called from _FWH(0)
Called from WINRUN(0)
Called from TMDIFRAME:ACTIVATE(0)
Called from MAIN(46)

Que es lo que no puede resolver?, cual es el problema?

Posted: Wed Dec 14, 2005 1:08 am
by felipe
Antonio gracias por ayudarme, mira el LIstbox lo tengo asi:

REDEFINE LISTBOX oLbx fIELDS GenColumns(); ID 102 OF oDlg;

oLbx:aheaders := {"Descripcion","Stock"}
oLbx:acolsizes := {400,100}

STATIC function GenColumns()

local bLine:=""


bLine:={ || { (cExi_Suc)->Ma_Des1,cExi_Suc)->Bod_001i } }

return(bLine)

Lo tengo asi y igual no me muestra nada pero igual como te desia me puedo mover para arriba y abajo


desde ya gracias

Posted: Wed Dec 14, 2005 1:30 am
by DanielPuente
Felipe:

Enviame el pedazo de codigo en un prg que yo pueda compilar y probar aca con las dbf involucradas a danielpuente@speedy.com.ar y te lo miro. Despues publicamos aca la solucion definitiva si queres.

Saludos,